SlideShare a Scribd company logo
1 of 41
Download to read offline
PROGRAMMING LANGUAGES LANDSCAPE
OLD & NEW IDEAS
Ruslan Shevchenko
VertaMedia/ Researcher
ruslan@shevchenko.kiev.ua
https://github.com/rssh
@rssh1
PROGRAMMING LANGUAGES LANDSCAPE: OLD & NEW IDEAS
What tomorrow programming will be like.
Languages
Complexity
Hardware
Worlds
Learning Curve
Expressibility
Layers
ASM
PASCAL
BASIC
JAVASCRIPT
ASM
C/C++
TCL
JAVA
C
RUST
SCALA (?)
JS;JULIA(?)
CREOL ENGLISH ?
???
QUANTUM ???
2000 - 2020
80 - 2000
2020 - 20XX
J* ??
20XX - YYYY
COBOL
Hardware
1 Processor Unit
1 Memory Unit
1 Machine
N Different Processors (CPU, GPU, NTU, QTU)
N Different Storage Systems (Cache, Mem, SSD, ..)
N Different Machines
PL: Main Language Constructs:
still execution flows
Memory Access Evolution:
Fortran 57 : static memory allocation
Algol 60 : Stack
Lisp 58: Garbage Collection
BCPL, C [70] - manual
ObjectiveC [88] — reference counting
Java [95] — Garbage collection become mainstream.
Rust [2010-15] — compile-time analysis become mainstream
C++ [..88] — manual + destructors
Algol 68: - Stack + manual + GC
Smalltalk [72-80] — GC (RC as GC optimization)
Objective C++
ML [70] - compile time analysis
Simula 67
// not all, not main
Memory Access Evolution:
Manual allocation: Risky, low-level
Garbage Collection: Generally Ok, but pauses:
not for Real-time systems
not for System-level programming
Type analysis [RUST]
subculture of sun.misc.Unsafe
in java
RUST: ownership & lifecycle
T - object of type T (owned by code in scope)
&T - borrowed reference to type T (owned not by us)
&’L T - reference to type T with Lifetime L
mut T - mutable object of type T
* T - row unsafe pointer
let y: & str
{
let email = retrieve_email(….. )
let domain = first_entry(email,”@“)
y = domain
}
// not compiled, lifetime of y is in outer scope.
fn first_entry(value: &’a str, pattern: &’b str) -> &’a str
RUST: general
Next step in low-level system languages.
Zero-cost abstraction + safety
more difficult to write in comparison with GC lang.
fast and easy in Comparison with C [may-be C++]
Alternatives:
advanced GC [go, D, Nim ]
Concurrency Models Evolution:
Fortran 57 : one execution flow
PL/1 64 : Multitasking API
1972: Actor Model
1988: Erlang [ Actor Model implementation]
1978: CSP Model
1983: Occam [1-st CSP Model Implementation]
1980: Implicit parallelism in functional languages (80-1)
1977. Future [MultiLisp]
2007: Go (CSP become mainstream)
2010: Akka in Scala (Actor Model become mainstream)
2015: Pony [actors + ownership]
// not all, not main
Concurrency Models:
Callbacks: [manual], Futures [Semi-manual]
hard to maintain
Actor-Model (Active Object)
CSP Channels; Generators
Async methods.
lightweight threads [coroutines, fibers .. ]
execution flow ‘breaks’ thread boundaries.
Implicit parallelism
hard to implement, not yet in mainstream
Actor Model:
// skip on demand
CSP Model:
// skip on demand
Async/Transform (by compiler/interpreter):
def method():Future[Int] = async {
val x = retrieveX()
val y = retrieveY()
x+y
}
def method():Future[Int] = async {
val x = await(retrieveX())
val y = await(retrieveY())
x+y
}
class methodAsync {
var state: Int
val promise: Promise[Int]
var x, y
def m():Unit =
{
state match {
case 0 => x = retrieveX onSuccess{ state=1; m() }
case 1 => y = retrieveY on Success { state = 2; m() }
case 2 => promise.set(x+y)
}
}
Concurrency Models / current state
Problems:
Data Races. Possible solutions:
immutability (functional programming)
copy/move semantics [Go, Rust]
static alias analysis [Rust, Pony]
Async IO interfaces.
Future:
Heterogenous/Distributed case
Implicit parallelism
RUST: race control
T <: std::marker::Send
— it is safe to send object to other thread
— otherThread(t) is safe
T <: std::marker::Sync
— it is safe to share object between threads
— share = send reference
—- otherThread(&t) is safe
{
let x = 1
thread::spawn {||
do_something(x)
}
}
// error - lifetime of x
{
let x = 1
thread::spawn {move||
do_something(x)
}
}
copy of original
Pony:
Actors
Type Analysis for data sharing.
Pony Type - type + capability
— T iso - isolated
— T val - value
—- T ref - reference
—- T box - rdonly
—- T trn - transition (write part of the box)
—- T tag — identity only
Destructive read/write
fut test(T iso a) {
var ref x = a
}
// error -
fun test(T iso a){
var iso x = consume a // ok
var iso y = a
// error - a is consumed
}
Distributed computations:
Thread boundaries + Network boundaries
Locality hierarchy
Failures
val lines = load(uri)
val count = lines.flatMap(_.split(“ “))
.map(word => (word, 1))
.reduceByKey(_ + _)
Scala, count words:
// Same code, different execution
val lines = load(uri)
val count = lines.flatMap(_.split(“ “))
.map(word => (word, 1))
.reduceByKey(_ + _)
Java, count words:
// Same code, different execution
@Override
public void map(Object key, Text value, Context context
) throws IOException, InterruptedException {
String line = (caseSensitive) ?
value.toString() : value.toString().toLowerCase();
for (String pattern : patternsToSkip) {
line = line.replaceAll(pattern, "");
}
StringTokenizer itr = new StringTokenizer(line);
while (itr.hasMoreTokens()) {
word.set(itr.nextToken());
context.write(word, one);
Counter counter = context.getCounter(CountersEnum.class.getName(), CountersEnum.INPUT_WORDS.toString());
counter.increment(1);
}
}
}
public static class IntSumReducer
extends Reducer<Text,IntWritable,Text,IntWritable> {
private IntWritable result = new IntWritable();
public void reduce(Text key, Iterable<IntWritable> values,
Context context
) throws IOException, InterruptedException {
int sum = 0;
for (IntWritable val : values) {
sum += val.get();
}
result.set(sum);
context.write(key, result);
}
}
@Override
public void map(Object key, Text value, Context context
) throws IOException, InterruptedException {
String line = (caseSensitive) ?
value.toString() : value.toString().toLowerCase();
for (String pattern : patternsToSkip) {
line = line.replaceAll(pattern, "");
}
StringTokenizer itr = new StringTokenizer(line);
while (itr.hasMoreTokens()) {
word.set(itr.nextToken());
context.write(word, one);
Counter counter = context.getCounter(CountersEnum.class.getName(), CountersEnum.INPUT_WORDS.toString());
counter.increment(1);
}
}
}
public static class IntSumReducer
extends Reducer<Text,IntWritable,Text,IntWritable> {
private IntWritable result = new IntWritable();
public void reduce(Text key, Iterable<IntWritable> values,
Java, count words:
// Same code, different execution
Can we do better (?) - Yes [but not for free]
- retargeting stream API (impl.effort)
- via annotation processor
- use byte-code rewriting (low-level)
Java, count words(2):
// Near same code, different execution
List{???}<String> lines = load(uri)
int count = lines.toStream.map(x ->x.split(“ “))
.collect(Collectors.group{Concurrent,Distributed}By(w->w,
Collectors.mapping(w->1
Collectors.reducing(Integer::Sum)))
[distributed version is theoretically possible]
Ideas
Language Extensibility: F: A=>B F: Expr[A] => Expr[B]
• Functional interpreters: Expr[A] build on top of L
• well-known functional programming pattern
• Macros: Expr[A] == {program in A}
• Lisp macroses [1960 … ]
• Compiler plugins [X10],
• Non-standard interpretation of arguments [R]
Reach enough type system, to express Expr[A] (inside language)
Language Extensibility: F: A=>B F: Expr[A] => Expr[B]
Small example (functional compiler)
trait GE[T]
Code(
val fundefs: Map[String, String]
val expr: String,
)
trait GERunner
{
def loadValues(Map[String,Array[Double]])
def loadCode(GE[_])
def run()
def retrieveValues(name:String):Array[Double]
}
// GPU contains OpenCL or CUDA compiler
// available via system API
case class GEArray(name:String) extends GE[Array[Double]]
{
def apply(i:GE[Int]): GE[Double] = GEArrayIndex(this,i)
def update(i:GE[Int],x:GE[Double]): GE[Unit] = GEUpdate(this,i,x)
def index = new {
def map(f: GE[Int] => GE[Double]):GE[Array[Double]] = GEMap(this,f)
def foreach[T](f:GE[Int] => GE[T]):GE[Unit] = GEForeach(this,f)
}
}
case class GEPlus(x: GE[Double], y: GE[Double])
extends GE[Double]
implicit class CEPlusSyntax(x:CE[Double]) extends AnyVal
{
def + (y:CE[Double]) = CEPlus(x,y)
}
case class GEMap(a:GE[Array[Double]],f:GE[Int]=>GE[Double])
case class GEArrayIndex(a: GE[Array[Double]],i:GE[Int])
extends GE[Double]
case class GEConstant(x:T):GE[T]
case class GEVar[T](name:String):GE[T]
val a = GEArray[Double](“a”)
val b = GEArray[Double](“b”)
val c = GEArray[Double](“c”)
for( i<- a.index) {
c(i) = a(i) + b(i)
}
a.index.foreach(i => c(i) = a(i)+b(i) )
a.index(i => GEArrayIndex(c,i).update(i,
GEArrayIndex(a,i)+GEArrayIndex(b,i)))
GEForeach(i =>
(GEUpdate(c,i),
GEPlus(GEArrayIndex(a,i),GEArrayIndex(b,i)))
trait GE[T]
case class GPUCode(
val defs: Map[String,String]
val expr: String
)
class GEArrayIndex(x:GE[Array[Double]], i:GE[Int])
{
def generate():GPUCode =
{
val (cx, ci) = (x.generate(),i.generate())
GPUCode(defs = merge(cx.defs,cy.defs),
expo = s”(${cx.expr}[${cy.expr}]”)
}
}
GEArrayIndex(GEArrayVar(a),GEVar(i)) => “a[i]”
class GEIntVar(name:String) ..
{
def generate():GPUCode =
GPUCode(
defs = Map(name -> “int ${name};”)
expr = name)
}
trait GE[T]
case class GPUCode(
val defs: Map[String,String]
val expr: String
)
class GEArrayIndex(x:GE[Array[Double]], i:GE[Int])
{
def generate():GPUCode =
{
val (cx, ci) = (x.generate(),i.generate())
GPUCode(defs = merge(cx.defs,cy.defs),
expo = s”(${cx.expr}[${cy.expr}]”)
}
}
GEPlus(GEArrayIndex(GEArrayVar(a),GEVar(i)),
GEArrayIndex(GEArrayVar(b),GEVar(i)) =>
“a[i] + b[i]”
class GEPlus(x:GE[Double], y:GE[Double])
{
def generate():GPUCode =
{
val (cx, cy) = (x.generate(),y.generate())
GPUCode(defs = merge(cx.defs,cy.defs),
expo = s”(${cx.expr} + ${cy.expr})”)
}
}
trait GE[T]
case class GPUCode(
val defs: Map[String,String]
val expr: String
)
class GEArrayIndex(x:GE[Array[Double]], i:GE[Int])
{
def generate():GPUCode =
{
val (cx, ci) = (x.generate(),i.generate())
GPUCode(defs = merge(cx.defs,cy.defs),
expo = s”(${cx.expr}[${cy.expr}]”)
}
}
c.update(i,a(i)+b(i)) => “c[i] = a[i] + b[i]”
class GEPlus(x:GE[Double], y:GE[Double])
{
def generate():GPUCode =
{
val (cx, cy) = (x.generate(),y.generate())
GPUCode(defs = merge(cx.defs,cy.defs),
expo = s”(${cx.expr} + ${cy.expr})”)
}
}
class GEUpdate(x:GE[Double],i:GE[Int], y:GE[Double])
{
def generate():GPUCode =
{
val (cx, ci, cy) = (x,i,u) map (_.generate)
GPUCode(defs = merge(cx.defs,cy.defs,ci.defs),
expo = s”(${cx.expr} + ${cy.expr})”)
}
}
trait GE[T]
case class GPUCode(
val defs: Map[String,String]
val expr: String
)
class GEArrayIndex(x:GE[Array[Double]], i:GE[Int])
{
def generate():GPUCode =
{
val (cx, ci) = (x.generate(),i.generate())
GPUCode(defs = merge(cx.defs,cy.defs),
expo = s”(${cx.expr}[${cy.expr}]”)
}
}
GEPlus(GEArrayIndex(GEArrayVar(a),GEVar(i)),
GEArrayIndex(GEArrayVar(b),GEVar(i)) =>
“a[i] + b[i]”
class GEPlus(x:GE[Double], y:GE[Double])
{
def generate():GPUCode =
{
val (cx, cy) = (x.generate(),y.generate())
GPUCode(defs = merge(cx.defs,cy.defs),
expo = s”(${cx.expr} + ${cy.expr})”)
}
}
class GEUpdate(x:GE[Double],i:GE[Int], y:GE[Double])
{
def generate():GPUCode =
{
val (cx, ci, cy) = (x,i,u) map (_.generate)
GPUCode(defs = merge(cx.defs,cy.defs,ci.defs),
expo = s”(${cx.expr} + ${cy.expr})”)
}
}
class GEForeach[T](x:GE[Array[Double]],
f:GE[Int] => GE[T] )
{
def generate():GPUCode =
{
val i = new GEIntVar(System.newName)
val (cx, ci, cfi) = (x,i,f(i)) map (_.generate)
val fName = System.newName
val fBody = s”””
__kernel void ${funName}(${genParamDefs(x)}) {
int ${i.name} = get_global_id(0)
${cfi.expr}
}
“””
GPUCode(
defs = merge(cx.defs,cy.defs,cci.defs,Map(fName,fBody)),
expr = s”${fname}(${genParams(x)})”)
}
}
trait GE[T]
case class GPUCode(
val defs: Map[String,String]
val expr: String
)
class GEArrayIndex(x:GE[Array[Double]], i:GE[Int])
{
def generate():GPUCode =
{
val (cx, ci) = (x.generate(),i.generate())
GPUCode(defs = merge(cx.defs,cy.defs),
expo = s”(${cx.expr}[${cy.expr}]”)
}
}
class GEPlus(x:GE[Double], y:GE[Double])
{
def generate():GPUCode =
{
val (cx, cy) = (x.generate(),y.generate())
GPUCode(defs = merge(cx.defs,cy.defs),
expo = s”(${cx.expr} + ${cy.expr})”)
}
}
class GEUpdate(x:GE[Double],i:GE[Int], y:GE[Double])
{
def generate():GPUCode =
{
val (cx, ci, cy) = (x,i,u) map (_.generate)
GPUCode(defs = merge(cx.defs,cy.defs,ci.defs),
expo = s”(${cx.expr} + ${cy.expr})”)
}
}
class GEForeach[T](x:GE[Array[Double]],
f:GE[Int] => GE[T] )
{
def generate():GPUCode =
{
val i = new GEIntVar(System.newName)
val (cx, ci, cfi) = (x,i,f(i)) map (_.generate)
val fName = System.newName
val fBody = s”””
__kernel void ${funName}(${genParamDef(x)}) {
int ${i.name} = get_global_id(0)
${cfi.expr}
}
“””
GPUCode(
defs = merge(cx.defs,cy.defs,cci.defs,Map(fName,fBody)),
expr = s”${fname}($genParams(x))”)
}
}
for(i <- a.index) yield
c(i)=a(i)+b(i)
=>
defs: “””
__kernel void f1(__global double * a,
__global double * b,
__global double* c, int n) {
int i2 = get_global_id(0)
c[i] = a[i]+b[i]
}
Finally:
val a = GEArray[Double](“a”)
val b = GEArray[Double](“b”)
val c = GEArray[Double](“c”)
for( i<- a.index) {
c(i) = a(i) + b(i)
}
__kernel void f1(__global double*a,
__global double* b,
__global double* c,
int n) {
int i2 = get_global_id(0)
c[i] = a[i]+b[i]
}
GPUExpr(
)
// with macroses can be done in compile time
Complexity
Louse coupling (can be build independently)
Amount of shared infrastructure (duplication)
Amount of location informations.
Typeclasses:
typeclasses in Haskell
implicit type transformations in scala
concepts in C++14x (WS, not ISO)
traits in RUST
A B
B don’t care about AA don’t care about B & C
Crepresentation of A
A B
C
Typeclasses
class GEArrayIndex(x:GE[Array[Double]], i:GE[Int])
{
def generate():GPUCode =
{
val (cx, ci) = (x.generate(),i.generate())
GPUCode(defs = merge(cx.defs,cy.defs),
expo = s”(${cx.expr}[${cy.expr}]”)
}
}
A B
C
Typeclasses
class GEArrayIndex(x:GE[Array[Double]], i:GE[Int])
{
def generate():GPUCode =
{
val (cx, ci) = (x.generate(),i.generate())
GPUCode(defs = merge(cx.defs,cy.defs),
expo = s”(${cx.expr}[${cy.expr}]”)
}
}
class GEArrayIndex(x:GE[Array[Double]], i:GE[Int])
implicit
object GEArrayIndexCompiler extends Compiler[GEArrayIndex,GPUCode]
{
def generate(source: GEArrayIndex):GPUCode =
{
val (cx, ci) = (source.x.generate(), source.i.generate())
GPUCode(defs = merge(cx.defs,cy.defs),
expo = s”(${cx.expr}[${cy.expr}]”)
}
}
trait Compiler[Source,Code]
{
def generate(s:Source):Code
}
A B
C
Typeclasses class String
implicit object StringComparator extends Comparable[String]
trait Comparable[A]
string
trait Ordered
{
fn less(x:&self, y: &self) -> bool
}
RUST: imp Ordered for string
{
fn less(x:&self, y: &self) -> bool
{
return ….
}
}
Language features:
Research => Mainstream
Type analysis
Lightweights threads/async interfaces
Metaprogramming
Lousy Coupling a-la typeclasses
Mostly research
implicit parallelism
distributed computing
gradual typing
language composition
SE 2016.
3 Sep. 2016
Questions.
Ruslan Shevchenko
ruslan@shevchenko.kiev.ua
@rssh1
https://github.com/rssh
See during SE 2016.
3 Sep. 2016
TBD
CREOLE LANGUAGE
Pidgin English (Hawaii Official)
Simplified grammar;
natural learning curve;
Use language without
knowing one

More Related Content

What's hot

Ankara Jug - Practical Functional Programming with Scala
Ankara Jug - Practical Functional Programming with ScalaAnkara Jug - Practical Functional Programming with Scala
Ankara Jug - Practical Functional Programming with ScalaEnsar Basri Kahveci
 
Introduction to Scala for Java Developers
Introduction to Scala for Java DevelopersIntroduction to Scala for Java Developers
Introduction to Scala for Java DevelopersMichael Galpin
 
Why scala is not my ideal language and what I can do with this
Why scala is not my ideal language and what I can do with thisWhy scala is not my ideal language and what I can do with this
Why scala is not my ideal language and what I can do with thisRuslan Shevchenko
 
Scala for Java Programmers
Scala for Java ProgrammersScala for Java Programmers
Scala for Java ProgrammersEric Pederson
 
Demystifying Shapeless
Demystifying Shapeless Demystifying Shapeless
Demystifying Shapeless Jared Roesch
 
Scala introduction
Scala introductionScala introduction
Scala introductionvito jeng
 
First-Class Patterns
First-Class PatternsFirst-Class Patterns
First-Class PatternsJohn De Goes
 
Scala Back to Basics: Type Classes
Scala Back to Basics: Type ClassesScala Back to Basics: Type Classes
Scala Back to Basics: Type ClassesTomer Gabel
 
Ponies and Unicorns With Scala
Ponies and Unicorns With ScalaPonies and Unicorns With Scala
Ponies and Unicorns With ScalaTomer Gabel
 
High Wizardry in the Land of Scala
High Wizardry in the Land of ScalaHigh Wizardry in the Land of Scala
High Wizardry in the Land of Scaladjspiewak
 
Scala Refactoring for Fun and Profit
Scala Refactoring for Fun and ProfitScala Refactoring for Fun and Profit
Scala Refactoring for Fun and ProfitTomer Gabel
 
10 Things I Hate About Scala
10 Things I Hate About Scala10 Things I Hate About Scala
10 Things I Hate About ScalaMeir Maor
 
Understanding Javascript Engines
Understanding Javascript Engines Understanding Javascript Engines
Understanding Javascript Engines Parashuram N
 
Introduction To Scala
Introduction To ScalaIntroduction To Scala
Introduction To ScalaPeter Maas
 
Intro to Kotlin
Intro to KotlinIntro to Kotlin
Intro to KotlinMagda Miu
 

What's hot (20)

Ankara Jug - Practical Functional Programming with Scala
Ankara Jug - Practical Functional Programming with ScalaAnkara Jug - Practical Functional Programming with Scala
Ankara Jug - Practical Functional Programming with Scala
 
Introduction to Scala for Java Developers
Introduction to Scala for Java DevelopersIntroduction to Scala for Java Developers
Introduction to Scala for Java Developers
 
Why scala is not my ideal language and what I can do with this
Why scala is not my ideal language and what I can do with thisWhy scala is not my ideal language and what I can do with this
Why scala is not my ideal language and what I can do with this
 
Scala for Java Programmers
Scala for Java ProgrammersScala for Java Programmers
Scala for Java Programmers
 
Demystifying Shapeless
Demystifying Shapeless Demystifying Shapeless
Demystifying Shapeless
 
Scala introduction
Scala introductionScala introduction
Scala introduction
 
Joy of scala
Joy of scalaJoy of scala
Joy of scala
 
Scala cheatsheet
Scala cheatsheetScala cheatsheet
Scala cheatsheet
 
First-Class Patterns
First-Class PatternsFirst-Class Patterns
First-Class Patterns
 
Scala in Places API
Scala in Places APIScala in Places API
Scala in Places API
 
Scala Back to Basics: Type Classes
Scala Back to Basics: Type ClassesScala Back to Basics: Type Classes
Scala Back to Basics: Type Classes
 
Ponies and Unicorns With Scala
Ponies and Unicorns With ScalaPonies and Unicorns With Scala
Ponies and Unicorns With Scala
 
High Wizardry in the Land of Scala
High Wizardry in the Land of ScalaHigh Wizardry in the Land of Scala
High Wizardry in the Land of Scala
 
Scala Refactoring for Fun and Profit
Scala Refactoring for Fun and ProfitScala Refactoring for Fun and Profit
Scala Refactoring for Fun and Profit
 
10 Things I Hate About Scala
10 Things I Hate About Scala10 Things I Hate About Scala
10 Things I Hate About Scala
 
Understanding Javascript Engines
Understanding Javascript Engines Understanding Javascript Engines
Understanding Javascript Engines
 
Introduction To Scala
Introduction To ScalaIntroduction To Scala
Introduction To Scala
 
Java Performance MythBusters
Java Performance MythBustersJava Performance MythBusters
Java Performance MythBusters
 
Introduction to kotlin
Introduction to kotlinIntroduction to kotlin
Introduction to kotlin
 
Intro to Kotlin
Intro to KotlinIntro to Kotlin
Intro to Kotlin
 

Viewers also liked

Introduction to Rust Programming Language
Introduction to Rust Programming LanguageIntroduction to Rust Programming Language
Introduction to Rust Programming LanguageRobert 'Bob' Reyes
 
Rust Programming Language
Rust Programming LanguageRust Programming Language
Rust Programming LanguageJaeju Kim
 
Hey! There's OCaml in my Rust!
Hey! There's OCaml in my Rust!Hey! There's OCaml in my Rust!
Hey! There's OCaml in my Rust!Kel Cecil
 
Fluency - Yet another fluent logger
Fluency - Yet another fluent loggerFluency - Yet another fluent logger
Fluency - Yet another fluent loggerMitsunori Komatsu
 
Performance Comparison of Mutex, RWLock and Atomic types in Rust
Performance Comparison of Mutex, RWLock and  Atomic types in RustPerformance Comparison of Mutex, RWLock and  Atomic types in Rust
Performance Comparison of Mutex, RWLock and Atomic types in RustMitsunori Komatsu
 
scala-gopher: async implementation of CSP for scala
scala-gopher:  async implementation of CSP  for  scalascala-gopher:  async implementation of CSP  for  scala
scala-gopher: async implementation of CSP for scalaRuslan Shevchenko
 

Viewers also liked (7)

Redox OS
Redox OSRedox OS
Redox OS
 
Introduction to Rust Programming Language
Introduction to Rust Programming LanguageIntroduction to Rust Programming Language
Introduction to Rust Programming Language
 
Rust Programming Language
Rust Programming LanguageRust Programming Language
Rust Programming Language
 
Hey! There's OCaml in my Rust!
Hey! There's OCaml in my Rust!Hey! There's OCaml in my Rust!
Hey! There's OCaml in my Rust!
 
Fluency - Yet another fluent logger
Fluency - Yet another fluent loggerFluency - Yet another fluent logger
Fluency - Yet another fluent logger
 
Performance Comparison of Mutex, RWLock and Atomic types in Rust
Performance Comparison of Mutex, RWLock and  Atomic types in RustPerformance Comparison of Mutex, RWLock and  Atomic types in Rust
Performance Comparison of Mutex, RWLock and Atomic types in Rust
 
scala-gopher: async implementation of CSP for scala
scala-gopher:  async implementation of CSP  for  scalascala-gopher:  async implementation of CSP  for  scala
scala-gopher: async implementation of CSP for scala
 

Similar to SE 20016 - programming languages landscape.

Short intro to scala and the play framework
Short intro to scala and the play frameworkShort intro to scala and the play framework
Short intro to scala and the play frameworkFelipe
 
TI1220 Lecture 14: Domain-Specific Languages
TI1220 Lecture 14: Domain-Specific LanguagesTI1220 Lecture 14: Domain-Specific Languages
TI1220 Lecture 14: Domain-Specific LanguagesEelco Visser
 
Specialized Compiler for Hash Cracking
Specialized Compiler for Hash CrackingSpecialized Compiler for Hash Cracking
Specialized Compiler for Hash CrackingPositive Hack Days
 
BCS SPA 2010 - An Introduction to Scala for Java Developers
BCS SPA 2010 - An Introduction to Scala for Java DevelopersBCS SPA 2010 - An Introduction to Scala for Java Developers
BCS SPA 2010 - An Introduction to Scala for Java DevelopersMiles Sabin
 
An Introduction to Scala for Java Developers
An Introduction to Scala for Java DevelopersAn Introduction to Scala for Java Developers
An Introduction to Scala for Java DevelopersMiles Sabin
 
Scala clojure techday_2011
Scala clojure techday_2011Scala clojure techday_2011
Scala clojure techday_2011Thadeu Russo
 
An Introduction to Scala - Blending OO and Functional Paradigms
An Introduction to Scala - Blending OO and Functional ParadigmsAn Introduction to Scala - Blending OO and Functional Paradigms
An Introduction to Scala - Blending OO and Functional ParadigmsMiles Sabin
 
Scala Talk at FOSDEM 2009
Scala Talk at FOSDEM 2009Scala Talk at FOSDEM 2009
Scala Talk at FOSDEM 2009Martin Odersky
 
JSLab.Руслан Шевченко."JavaScript как платформа компиляции"
JSLab.Руслан Шевченко."JavaScript как платформа компиляции"JSLab.Руслан Шевченко."JavaScript как платформа компиляции"
JSLab.Руслан Шевченко."JavaScript как платформа компиляции"GeeksLab Odessa
 
Jslab rssh: JS as language platform
Jslab rssh:  JS as language platformJslab rssh:  JS as language platform
Jslab rssh: JS as language platformRuslan Shevchenko
 
scalaliftoff2009.pdf
scalaliftoff2009.pdfscalaliftoff2009.pdf
scalaliftoff2009.pdfHiroshi Ono
 
scalaliftoff2009.pdf
scalaliftoff2009.pdfscalaliftoff2009.pdf
scalaliftoff2009.pdfHiroshi Ono
 
scalaliftoff2009.pdf
scalaliftoff2009.pdfscalaliftoff2009.pdf
scalaliftoff2009.pdfHiroshi Ono
 
scalaliftoff2009.pdf
scalaliftoff2009.pdfscalaliftoff2009.pdf
scalaliftoff2009.pdfHiroshi Ono
 
SE2016 Exotic Ruslan Shevchenko "Programming languages landscape new &amp; ol...
SE2016 Exotic Ruslan Shevchenko "Programming languages landscape new &amp; ol...SE2016 Exotic Ruslan Shevchenko "Programming languages landscape new &amp; ol...
SE2016 Exotic Ruslan Shevchenko "Programming languages landscape new &amp; ol...Inhacking
 
Ruslan Shevchenko Programming languages landscape: new &amp; old ideas
Ruslan Shevchenko Programming languages landscape:  new &amp; old ideasRuslan Shevchenko Programming languages landscape:  new &amp; old ideas
Ruslan Shevchenko Programming languages landscape: new &amp; old ideasАліна Шепшелей
 

Similar to SE 20016 - programming languages landscape. (20)

Short intro to scala and the play framework
Short intro to scala and the play frameworkShort intro to scala and the play framework
Short intro to scala and the play framework
 
TI1220 Lecture 14: Domain-Specific Languages
TI1220 Lecture 14: Domain-Specific LanguagesTI1220 Lecture 14: Domain-Specific Languages
TI1220 Lecture 14: Domain-Specific Languages
 
Pune Clojure Course Outline
Pune Clojure Course OutlinePune Clojure Course Outline
Pune Clojure Course Outline
 
Specialized Compiler for Hash Cracking
Specialized Compiler for Hash CrackingSpecialized Compiler for Hash Cracking
Specialized Compiler for Hash Cracking
 
IN4308 1
IN4308 1IN4308 1
IN4308 1
 
Javantura v3 - ES6 – Future Is Now – Nenad Pečanac
Javantura v3 - ES6 – Future Is Now – Nenad PečanacJavantura v3 - ES6 – Future Is Now – Nenad Pečanac
Javantura v3 - ES6 – Future Is Now – Nenad Pečanac
 
ES6 - JavaCro 2016
ES6 - JavaCro 2016ES6 - JavaCro 2016
ES6 - JavaCro 2016
 
BCS SPA 2010 - An Introduction to Scala for Java Developers
BCS SPA 2010 - An Introduction to Scala for Java DevelopersBCS SPA 2010 - An Introduction to Scala for Java Developers
BCS SPA 2010 - An Introduction to Scala for Java Developers
 
An Introduction to Scala for Java Developers
An Introduction to Scala for Java DevelopersAn Introduction to Scala for Java Developers
An Introduction to Scala for Java Developers
 
Scala clojure techday_2011
Scala clojure techday_2011Scala clojure techday_2011
Scala clojure techday_2011
 
An Introduction to Scala - Blending OO and Functional Paradigms
An Introduction to Scala - Blending OO and Functional ParadigmsAn Introduction to Scala - Blending OO and Functional Paradigms
An Introduction to Scala - Blending OO and Functional Paradigms
 
Scala Talk at FOSDEM 2009
Scala Talk at FOSDEM 2009Scala Talk at FOSDEM 2009
Scala Talk at FOSDEM 2009
 
JSLab.Руслан Шевченко."JavaScript как платформа компиляции"
JSLab.Руслан Шевченко."JavaScript как платформа компиляции"JSLab.Руслан Шевченко."JavaScript как платформа компиляции"
JSLab.Руслан Шевченко."JavaScript как платформа компиляции"
 
Jslab rssh: JS as language platform
Jslab rssh:  JS as language platformJslab rssh:  JS as language platform
Jslab rssh: JS as language platform
 
scalaliftoff2009.pdf
scalaliftoff2009.pdfscalaliftoff2009.pdf
scalaliftoff2009.pdf
 
scalaliftoff2009.pdf
scalaliftoff2009.pdfscalaliftoff2009.pdf
scalaliftoff2009.pdf
 
scalaliftoff2009.pdf
scalaliftoff2009.pdfscalaliftoff2009.pdf
scalaliftoff2009.pdf
 
scalaliftoff2009.pdf
scalaliftoff2009.pdfscalaliftoff2009.pdf
scalaliftoff2009.pdf
 
SE2016 Exotic Ruslan Shevchenko "Programming languages landscape new &amp; ol...
SE2016 Exotic Ruslan Shevchenko "Programming languages landscape new &amp; ol...SE2016 Exotic Ruslan Shevchenko "Programming languages landscape new &amp; ol...
SE2016 Exotic Ruslan Shevchenko "Programming languages landscape new &amp; ol...
 
Ruslan Shevchenko Programming languages landscape: new &amp; old ideas
Ruslan Shevchenko Programming languages landscape:  new &amp; old ideasRuslan Shevchenko Programming languages landscape:  new &amp; old ideas
Ruslan Shevchenko Programming languages landscape: new &amp; old ideas
 

More from Ruslan Shevchenko

Embedding Generic Monadic Transformer into Scala. [Tfp2022]
Embedding Generic Monadic Transformer into Scala. [Tfp2022]Embedding Generic Monadic Transformer into Scala. [Tfp2022]
Embedding Generic Monadic Transformer into Scala. [Tfp2022]Ruslan Shevchenko
 
Papers We Love / Kyiv : PAXOS (and little about other consensuses )
Papers We Love / Kyiv :  PAXOS (and little about other consensuses )Papers We Love / Kyiv :  PAXOS (and little about other consensuses )
Papers We Love / Kyiv : PAXOS (and little about other consensuses )Ruslan Shevchenko
 
Scala / Technology evolution
Scala  / Technology evolutionScala  / Technology evolution
Scala / Technology evolutionRuslan Shevchenko
 
{co/contr} variance from LSP
{co/contr} variance  from LSP{co/contr} variance  from LSP
{co/contr} variance from LSPRuslan Shevchenko
 
Java & low latency applications
Java & low latency applicationsJava & low latency applications
Java & low latency applicationsRuslan Shevchenko
 
Behind OOD: domain modelling in post-OO world.
Behind OOD:  domain modelling in post-OO world.Behind OOD:  domain modelling in post-OO world.
Behind OOD: domain modelling in post-OO world.Ruslan Shevchenko
 
Programming Languages: some news for the last N years
Programming Languages: some news for the last N yearsProgramming Languages: some news for the last N years
Programming Languages: some news for the last N yearsRuslan Shevchenko
 
JDays Lviv 2014: Java8 vs Scala: Difference points & innovation stream
JDays Lviv 2014:  Java8 vs Scala:  Difference points & innovation streamJDays Lviv 2014:  Java8 vs Scala:  Difference points & innovation stream
JDays Lviv 2014: Java8 vs Scala: Difference points & innovation streamRuslan Shevchenko
 
Ruslan.shevchenko: most functional-day-kiev 2014
Ruslan.shevchenko: most functional-day-kiev 2014Ruslan.shevchenko: most functional-day-kiev 2014
Ruslan.shevchenko: most functional-day-kiev 2014Ruslan Shevchenko
 
Web architecture - overview of techniques.
Web architecture - overview of  techniques.Web architecture - overview of  techniques.
Web architecture - overview of techniques.Ruslan Shevchenko
 
Javascript in modern scala backend. [russian]
Javascript in modern scala backend.  [russian]  Javascript in modern scala backend.  [russian]
Javascript in modern scala backend. [russian] Ruslan Shevchenko
 
Implementation of 'go-like' language constructions in scala [english version]
Implementation of 'go-like' language constructions in scala [english version] Implementation of 'go-like' language constructions in scala [english version]
Implementation of 'go-like' language constructions in scala [english version] Ruslan Shevchenko
 

More from Ruslan Shevchenko (20)

Embedding Generic Monadic Transformer into Scala. [Tfp2022]
Embedding Generic Monadic Transformer into Scala. [Tfp2022]Embedding Generic Monadic Transformer into Scala. [Tfp2022]
Embedding Generic Monadic Transformer into Scala. [Tfp2022]
 
Svitla talks 2021_03_25
Svitla talks 2021_03_25Svitla talks 2021_03_25
Svitla talks 2021_03_25
 
Akka / Lts behavior
Akka / Lts behaviorAkka / Lts behavior
Akka / Lts behavior
 
Papers We Love / Kyiv : PAXOS (and little about other consensuses )
Papers We Love / Kyiv :  PAXOS (and little about other consensuses )Papers We Love / Kyiv :  PAXOS (and little about other consensuses )
Papers We Love / Kyiv : PAXOS (and little about other consensuses )
 
Scala / Technology evolution
Scala  / Technology evolutionScala  / Technology evolution
Scala / Technology evolution
 
{co/contr} variance from LSP
{co/contr} variance  from LSP{co/contr} variance  from LSP
{co/contr} variance from LSP
 
N flavors of streaming
N flavors of streamingN flavors of streaming
N flavors of streaming
 
Java & low latency applications
Java & low latency applicationsJava & low latency applications
Java & low latency applications
 
Csp scala wixmeetup2016
Csp scala wixmeetup2016Csp scala wixmeetup2016
Csp scala wixmeetup2016
 
IDLs
IDLsIDLs
IDLs
 
R ext world/ useR! Kiev
R ext world/ useR!  KievR ext world/ useR!  Kiev
R ext world/ useR! Kiev
 
Behind OOD: domain modelling in post-OO world.
Behind OOD:  domain modelling in post-OO world.Behind OOD:  domain modelling in post-OO world.
Behind OOD: domain modelling in post-OO world.
 
Programming Languages: some news for the last N years
Programming Languages: some news for the last N yearsProgramming Languages: some news for the last N years
Programming Languages: some news for the last N years
 
JDays Lviv 2014: Java8 vs Scala: Difference points & innovation stream
JDays Lviv 2014:  Java8 vs Scala:  Difference points & innovation streamJDays Lviv 2014:  Java8 vs Scala:  Difference points & innovation stream
JDays Lviv 2014: Java8 vs Scala: Difference points & innovation stream
 
Ruslan.shevchenko: most functional-day-kiev 2014
Ruslan.shevchenko: most functional-day-kiev 2014Ruslan.shevchenko: most functional-day-kiev 2014
Ruslan.shevchenko: most functional-day-kiev 2014
 
Web architecture - overview of techniques.
Web architecture - overview of  techniques.Web architecture - overview of  techniques.
Web architecture - overview of techniques.
 
R scala 17_05_2014
R scala 17_05_2014R scala 17_05_2014
R scala 17_05_2014
 
Javascript in modern scala backend. [russian]
Javascript in modern scala backend.  [russian]  Javascript in modern scala backend.  [russian]
Javascript in modern scala backend. [russian]
 
Osdn2013 rssh
Osdn2013 rsshOsdn2013 rssh
Osdn2013 rssh
 
Implementation of 'go-like' language constructions in scala [english version]
Implementation of 'go-like' language constructions in scala [english version] Implementation of 'go-like' language constructions in scala [english version]
Implementation of 'go-like' language constructions in scala [english version]
 

Recently uploaded

HR Software Buyers Guide in 2024 - HRSoftware.com
HR Software Buyers Guide in 2024 - HRSoftware.comHR Software Buyers Guide in 2024 - HRSoftware.com
HR Software Buyers Guide in 2024 - HRSoftware.comFatema Valibhai
 
How To Use Server-Side Rendering with Nuxt.js
How To Use Server-Side Rendering with Nuxt.jsHow To Use Server-Side Rendering with Nuxt.js
How To Use Server-Side Rendering with Nuxt.jsAndolasoft Inc
 
Define the academic and professional writing..pdf
Define the academic and professional writing..pdfDefine the academic and professional writing..pdf
Define the academic and professional writing..pdfPearlKirahMaeRagusta1
 
Unveiling the Tech Salsa of LAMs with Janus in Real-Time Applications
Unveiling the Tech Salsa of LAMs with Janus in Real-Time ApplicationsUnveiling the Tech Salsa of LAMs with Janus in Real-Time Applications
Unveiling the Tech Salsa of LAMs with Janus in Real-Time ApplicationsAlberto González Trastoy
 
TECUNIQUE: Success Stories: IT Service provider
TECUNIQUE: Success Stories: IT Service providerTECUNIQUE: Success Stories: IT Service provider
TECUNIQUE: Success Stories: IT Service providermohitmore19
 
W01_panagenda_Navigating-the-Future-with-The-Hitchhikers-Guide-to-Notes-and-D...
W01_panagenda_Navigating-the-Future-with-The-Hitchhikers-Guide-to-Notes-and-D...W01_panagenda_Navigating-the-Future-with-The-Hitchhikers-Guide-to-Notes-and-D...
W01_panagenda_Navigating-the-Future-with-The-Hitchhikers-Guide-to-Notes-and-D...panagenda
 
The Guide to Integrating Generative AI into Unified Continuous Testing Platfo...
The Guide to Integrating Generative AI into Unified Continuous Testing Platfo...The Guide to Integrating Generative AI into Unified Continuous Testing Platfo...
The Guide to Integrating Generative AI into Unified Continuous Testing Platfo...kalichargn70th171
 
Introducing Microsoft’s new Enterprise Work Management (EWM) Solution
Introducing Microsoft’s new Enterprise Work Management (EWM) SolutionIntroducing Microsoft’s new Enterprise Work Management (EWM) Solution
Introducing Microsoft’s new Enterprise Work Management (EWM) SolutionOnePlan Solutions
 
5 Signs You Need a Fashion PLM Software.pdf
5 Signs You Need a Fashion PLM Software.pdf5 Signs You Need a Fashion PLM Software.pdf
5 Signs You Need a Fashion PLM Software.pdfWave PLM
 
The Ultimate Test Automation Guide_ Best Practices and Tips.pdf
The Ultimate Test Automation Guide_ Best Practices and Tips.pdfThe Ultimate Test Automation Guide_ Best Practices and Tips.pdf
The Ultimate Test Automation Guide_ Best Practices and Tips.pdfkalichargn70th171
 
Learn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdf
Learn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdfLearn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdf
Learn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdfkalichargn70th171
 
Optimizing AI for immediate response in Smart CCTV
Optimizing AI for immediate response in Smart CCTVOptimizing AI for immediate response in Smart CCTV
Optimizing AI for immediate response in Smart CCTVshikhaohhpro
 
Diamond Application Development Crafting Solutions with Precision
Diamond Application Development Crafting Solutions with PrecisionDiamond Application Development Crafting Solutions with Precision
Diamond Application Development Crafting Solutions with PrecisionSolGuruz
 
VTU technical seminar 8Th Sem on Scikit-learn
VTU technical seminar 8Th Sem on Scikit-learnVTU technical seminar 8Th Sem on Scikit-learn
VTU technical seminar 8Th Sem on Scikit-learnAmarnathKambale
 
8257 interfacing 2 in microprocessor for btech students
8257 interfacing 2 in microprocessor for btech students8257 interfacing 2 in microprocessor for btech students
8257 interfacing 2 in microprocessor for btech studentsHimanshiGarg82
 
+971565801893>>SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHAB...
+971565801893>>SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHAB...+971565801893>>SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHAB...
+971565801893>>SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHAB...Health
 
call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️
call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️
call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️Delhi Call girls
 

Recently uploaded (20)

HR Software Buyers Guide in 2024 - HRSoftware.com
HR Software Buyers Guide in 2024 - HRSoftware.comHR Software Buyers Guide in 2024 - HRSoftware.com
HR Software Buyers Guide in 2024 - HRSoftware.com
 
How To Use Server-Side Rendering with Nuxt.js
How To Use Server-Side Rendering with Nuxt.jsHow To Use Server-Side Rendering with Nuxt.js
How To Use Server-Side Rendering with Nuxt.js
 
Define the academic and professional writing..pdf
Define the academic and professional writing..pdfDefine the academic and professional writing..pdf
Define the academic and professional writing..pdf
 
CHEAP Call Girls in Pushp Vihar (-DELHI )🔝 9953056974🔝(=)/CALL GIRLS SERVICE
CHEAP Call Girls in Pushp Vihar (-DELHI )🔝 9953056974🔝(=)/CALL GIRLS SERVICECHEAP Call Girls in Pushp Vihar (-DELHI )🔝 9953056974🔝(=)/CALL GIRLS SERVICE
CHEAP Call Girls in Pushp Vihar (-DELHI )🔝 9953056974🔝(=)/CALL GIRLS SERVICE
 
Unveiling the Tech Salsa of LAMs with Janus in Real-Time Applications
Unveiling the Tech Salsa of LAMs with Janus in Real-Time ApplicationsUnveiling the Tech Salsa of LAMs with Janus in Real-Time Applications
Unveiling the Tech Salsa of LAMs with Janus in Real-Time Applications
 
TECUNIQUE: Success Stories: IT Service provider
TECUNIQUE: Success Stories: IT Service providerTECUNIQUE: Success Stories: IT Service provider
TECUNIQUE: Success Stories: IT Service provider
 
W01_panagenda_Navigating-the-Future-with-The-Hitchhikers-Guide-to-Notes-and-D...
W01_panagenda_Navigating-the-Future-with-The-Hitchhikers-Guide-to-Notes-and-D...W01_panagenda_Navigating-the-Future-with-The-Hitchhikers-Guide-to-Notes-and-D...
W01_panagenda_Navigating-the-Future-with-The-Hitchhikers-Guide-to-Notes-and-D...
 
The Guide to Integrating Generative AI into Unified Continuous Testing Platfo...
The Guide to Integrating Generative AI into Unified Continuous Testing Platfo...The Guide to Integrating Generative AI into Unified Continuous Testing Platfo...
The Guide to Integrating Generative AI into Unified Continuous Testing Platfo...
 
Introducing Microsoft’s new Enterprise Work Management (EWM) Solution
Introducing Microsoft’s new Enterprise Work Management (EWM) SolutionIntroducing Microsoft’s new Enterprise Work Management (EWM) Solution
Introducing Microsoft’s new Enterprise Work Management (EWM) Solution
 
Microsoft AI Transformation Partner Playbook.pdf
Microsoft AI Transformation Partner Playbook.pdfMicrosoft AI Transformation Partner Playbook.pdf
Microsoft AI Transformation Partner Playbook.pdf
 
5 Signs You Need a Fashion PLM Software.pdf
5 Signs You Need a Fashion PLM Software.pdf5 Signs You Need a Fashion PLM Software.pdf
5 Signs You Need a Fashion PLM Software.pdf
 
The Ultimate Test Automation Guide_ Best Practices and Tips.pdf
The Ultimate Test Automation Guide_ Best Practices and Tips.pdfThe Ultimate Test Automation Guide_ Best Practices and Tips.pdf
The Ultimate Test Automation Guide_ Best Practices and Tips.pdf
 
Learn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdf
Learn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdfLearn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdf
Learn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdf
 
Optimizing AI for immediate response in Smart CCTV
Optimizing AI for immediate response in Smart CCTVOptimizing AI for immediate response in Smart CCTV
Optimizing AI for immediate response in Smart CCTV
 
Diamond Application Development Crafting Solutions with Precision
Diamond Application Development Crafting Solutions with PrecisionDiamond Application Development Crafting Solutions with Precision
Diamond Application Development Crafting Solutions with Precision
 
Vip Call Girls Noida ➡️ Delhi ➡️ 9999965857 No Advance 24HRS Live
Vip Call Girls Noida ➡️ Delhi ➡️ 9999965857 No Advance 24HRS LiveVip Call Girls Noida ➡️ Delhi ➡️ 9999965857 No Advance 24HRS Live
Vip Call Girls Noida ➡️ Delhi ➡️ 9999965857 No Advance 24HRS Live
 
VTU technical seminar 8Th Sem on Scikit-learn
VTU technical seminar 8Th Sem on Scikit-learnVTU technical seminar 8Th Sem on Scikit-learn
VTU technical seminar 8Th Sem on Scikit-learn
 
8257 interfacing 2 in microprocessor for btech students
8257 interfacing 2 in microprocessor for btech students8257 interfacing 2 in microprocessor for btech students
8257 interfacing 2 in microprocessor for btech students
 
+971565801893>>SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHAB...
+971565801893>>SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHAB...+971565801893>>SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHAB...
+971565801893>>SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHAB...
 
call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️
call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️
call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️
 

SE 20016 - programming languages landscape.

  • 1. PROGRAMMING LANGUAGES LANDSCAPE OLD & NEW IDEAS Ruslan Shevchenko VertaMedia/ Researcher ruslan@shevchenko.kiev.ua https://github.com/rssh @rssh1
  • 2. PROGRAMMING LANGUAGES LANDSCAPE: OLD & NEW IDEAS What tomorrow programming will be like. Languages Complexity Hardware Worlds Learning Curve Expressibility Layers
  • 3.
  • 4. ASM PASCAL BASIC JAVASCRIPT ASM C/C++ TCL JAVA C RUST SCALA (?) JS;JULIA(?) CREOL ENGLISH ? ??? QUANTUM ??? 2000 - 2020 80 - 2000 2020 - 20XX J* ?? 20XX - YYYY COBOL
  • 5. Hardware 1 Processor Unit 1 Memory Unit 1 Machine N Different Processors (CPU, GPU, NTU, QTU) N Different Storage Systems (Cache, Mem, SSD, ..) N Different Machines PL: Main Language Constructs: still execution flows
  • 6. Memory Access Evolution: Fortran 57 : static memory allocation Algol 60 : Stack Lisp 58: Garbage Collection BCPL, C [70] - manual ObjectiveC [88] — reference counting Java [95] — Garbage collection become mainstream. Rust [2010-15] — compile-time analysis become mainstream C++ [..88] — manual + destructors Algol 68: - Stack + manual + GC Smalltalk [72-80] — GC (RC as GC optimization) Objective C++ ML [70] - compile time analysis Simula 67 // not all, not main
  • 7. Memory Access Evolution: Manual allocation: Risky, low-level Garbage Collection: Generally Ok, but pauses: not for Real-time systems not for System-level programming Type analysis [RUST] subculture of sun.misc.Unsafe in java
  • 8. RUST: ownership & lifecycle T - object of type T (owned by code in scope) &T - borrowed reference to type T (owned not by us) &’L T - reference to type T with Lifetime L mut T - mutable object of type T * T - row unsafe pointer let y: & str { let email = retrieve_email(….. ) let domain = first_entry(email,”@“) y = domain } // not compiled, lifetime of y is in outer scope. fn first_entry(value: &’a str, pattern: &’b str) -> &’a str
  • 9. RUST: general Next step in low-level system languages. Zero-cost abstraction + safety more difficult to write in comparison with GC lang. fast and easy in Comparison with C [may-be C++] Alternatives: advanced GC [go, D, Nim ]
  • 10. Concurrency Models Evolution: Fortran 57 : one execution flow PL/1 64 : Multitasking API 1972: Actor Model 1988: Erlang [ Actor Model implementation] 1978: CSP Model 1983: Occam [1-st CSP Model Implementation] 1980: Implicit parallelism in functional languages (80-1) 1977. Future [MultiLisp] 2007: Go (CSP become mainstream) 2010: Akka in Scala (Actor Model become mainstream) 2015: Pony [actors + ownership] // not all, not main
  • 11. Concurrency Models: Callbacks: [manual], Futures [Semi-manual] hard to maintain Actor-Model (Active Object) CSP Channels; Generators Async methods. lightweight threads [coroutines, fibers .. ] execution flow ‘breaks’ thread boundaries. Implicit parallelism hard to implement, not yet in mainstream
  • 12. Actor Model: // skip on demand
  • 13. CSP Model: // skip on demand
  • 14. Async/Transform (by compiler/interpreter): def method():Future[Int] = async { val x = retrieveX() val y = retrieveY() x+y } def method():Future[Int] = async { val x = await(retrieveX()) val y = await(retrieveY()) x+y } class methodAsync { var state: Int val promise: Promise[Int] var x, y def m():Unit = { state match { case 0 => x = retrieveX onSuccess{ state=1; m() } case 1 => y = retrieveY on Success { state = 2; m() } case 2 => promise.set(x+y) } }
  • 15. Concurrency Models / current state Problems: Data Races. Possible solutions: immutability (functional programming) copy/move semantics [Go, Rust] static alias analysis [Rust, Pony] Async IO interfaces. Future: Heterogenous/Distributed case Implicit parallelism
  • 16. RUST: race control T <: std::marker::Send — it is safe to send object to other thread — otherThread(t) is safe T <: std::marker::Sync — it is safe to share object between threads — share = send reference —- otherThread(&t) is safe { let x = 1 thread::spawn {|| do_something(x) } } // error - lifetime of x { let x = 1 thread::spawn {move|| do_something(x) } } copy of original
  • 17. Pony: Actors Type Analysis for data sharing. Pony Type - type + capability — T iso - isolated — T val - value —- T ref - reference —- T box - rdonly —- T trn - transition (write part of the box) —- T tag — identity only Destructive read/write fut test(T iso a) { var ref x = a } // error - fun test(T iso a){ var iso x = consume a // ok var iso y = a // error - a is consumed }
  • 18. Distributed computations: Thread boundaries + Network boundaries Locality hierarchy Failures
  • 19. val lines = load(uri) val count = lines.flatMap(_.split(“ “)) .map(word => (word, 1)) .reduceByKey(_ + _) Scala, count words: // Same code, different execution
  • 20. val lines = load(uri) val count = lines.flatMap(_.split(“ “)) .map(word => (word, 1)) .reduceByKey(_ + _) Java, count words: // Same code, different execution @Override public void map(Object key, Text value, Context context ) throws IOException, InterruptedException { String line = (caseSensitive) ? value.toString() : value.toString().toLowerCase(); for (String pattern : patternsToSkip) { line = line.replaceAll(pattern, ""); } StringTokenizer itr = new StringTokenizer(line); while (itr.hasMoreTokens()) { word.set(itr.nextToken()); context.write(word, one); Counter counter = context.getCounter(CountersEnum.class.getName(), CountersEnum.INPUT_WORDS.toString()); counter.increment(1); } } } public static class IntSumReducer extends Reducer<Text,IntWritable,Text,IntWritable> { private IntWritable result = new IntWritable(); public void reduce(Text key, Iterable<IntWritable> values, Context context ) throws IOException, InterruptedException { int sum = 0; for (IntWritable val : values) { sum += val.get(); } result.set(sum); context.write(key, result); } }
  • 21. @Override public void map(Object key, Text value, Context context ) throws IOException, InterruptedException { String line = (caseSensitive) ? value.toString() : value.toString().toLowerCase(); for (String pattern : patternsToSkip) { line = line.replaceAll(pattern, ""); } StringTokenizer itr = new StringTokenizer(line); while (itr.hasMoreTokens()) { word.set(itr.nextToken()); context.write(word, one); Counter counter = context.getCounter(CountersEnum.class.getName(), CountersEnum.INPUT_WORDS.toString()); counter.increment(1); } } } public static class IntSumReducer extends Reducer<Text,IntWritable,Text,IntWritable> { private IntWritable result = new IntWritable(); public void reduce(Text key, Iterable<IntWritable> values, Java, count words: // Same code, different execution Can we do better (?) - Yes [but not for free] - retargeting stream API (impl.effort) - via annotation processor - use byte-code rewriting (low-level)
  • 22. Java, count words(2): // Near same code, different execution List{???}<String> lines = load(uri) int count = lines.toStream.map(x ->x.split(“ “)) .collect(Collectors.group{Concurrent,Distributed}By(w->w, Collectors.mapping(w->1 Collectors.reducing(Integer::Sum))) [distributed version is theoretically possible]
  • 23. Ideas Language Extensibility: F: A=>B F: Expr[A] => Expr[B] • Functional interpreters: Expr[A] build on top of L • well-known functional programming pattern • Macros: Expr[A] == {program in A} • Lisp macroses [1960 … ] • Compiler plugins [X10], • Non-standard interpretation of arguments [R] Reach enough type system, to express Expr[A] (inside language)
  • 24. Language Extensibility: F: A=>B F: Expr[A] => Expr[B] Small example (functional compiler) trait GE[T] Code( val fundefs: Map[String, String] val expr: String, ) trait GERunner { def loadValues(Map[String,Array[Double]]) def loadCode(GE[_]) def run() def retrieveValues(name:String):Array[Double] } // GPU contains OpenCL or CUDA compiler // available via system API
  • 25. case class GEArray(name:String) extends GE[Array[Double]] { def apply(i:GE[Int]): GE[Double] = GEArrayIndex(this,i) def update(i:GE[Int],x:GE[Double]): GE[Unit] = GEUpdate(this,i,x) def index = new { def map(f: GE[Int] => GE[Double]):GE[Array[Double]] = GEMap(this,f) def foreach[T](f:GE[Int] => GE[T]):GE[Unit] = GEForeach(this,f) } } case class GEPlus(x: GE[Double], y: GE[Double]) extends GE[Double] implicit class CEPlusSyntax(x:CE[Double]) extends AnyVal { def + (y:CE[Double]) = CEPlus(x,y) } case class GEMap(a:GE[Array[Double]],f:GE[Int]=>GE[Double]) case class GEArrayIndex(a: GE[Array[Double]],i:GE[Int]) extends GE[Double] case class GEConstant(x:T):GE[T] case class GEVar[T](name:String):GE[T]
  • 26. val a = GEArray[Double](“a”) val b = GEArray[Double](“b”) val c = GEArray[Double](“c”) for( i<- a.index) { c(i) = a(i) + b(i) } a.index.foreach(i => c(i) = a(i)+b(i) ) a.index(i => GEArrayIndex(c,i).update(i, GEArrayIndex(a,i)+GEArrayIndex(b,i))) GEForeach(i => (GEUpdate(c,i), GEPlus(GEArrayIndex(a,i),GEArrayIndex(b,i)))
  • 27. trait GE[T] case class GPUCode( val defs: Map[String,String] val expr: String ) class GEArrayIndex(x:GE[Array[Double]], i:GE[Int]) { def generate():GPUCode = { val (cx, ci) = (x.generate(),i.generate()) GPUCode(defs = merge(cx.defs,cy.defs), expo = s”(${cx.expr}[${cy.expr}]”) } } GEArrayIndex(GEArrayVar(a),GEVar(i)) => “a[i]” class GEIntVar(name:String) .. { def generate():GPUCode = GPUCode( defs = Map(name -> “int ${name};”) expr = name) }
  • 28. trait GE[T] case class GPUCode( val defs: Map[String,String] val expr: String ) class GEArrayIndex(x:GE[Array[Double]], i:GE[Int]) { def generate():GPUCode = { val (cx, ci) = (x.generate(),i.generate()) GPUCode(defs = merge(cx.defs,cy.defs), expo = s”(${cx.expr}[${cy.expr}]”) } } GEPlus(GEArrayIndex(GEArrayVar(a),GEVar(i)), GEArrayIndex(GEArrayVar(b),GEVar(i)) => “a[i] + b[i]” class GEPlus(x:GE[Double], y:GE[Double]) { def generate():GPUCode = { val (cx, cy) = (x.generate(),y.generate()) GPUCode(defs = merge(cx.defs,cy.defs), expo = s”(${cx.expr} + ${cy.expr})”) } }
  • 29. trait GE[T] case class GPUCode( val defs: Map[String,String] val expr: String ) class GEArrayIndex(x:GE[Array[Double]], i:GE[Int]) { def generate():GPUCode = { val (cx, ci) = (x.generate(),i.generate()) GPUCode(defs = merge(cx.defs,cy.defs), expo = s”(${cx.expr}[${cy.expr}]”) } } c.update(i,a(i)+b(i)) => “c[i] = a[i] + b[i]” class GEPlus(x:GE[Double], y:GE[Double]) { def generate():GPUCode = { val (cx, cy) = (x.generate(),y.generate()) GPUCode(defs = merge(cx.defs,cy.defs), expo = s”(${cx.expr} + ${cy.expr})”) } } class GEUpdate(x:GE[Double],i:GE[Int], y:GE[Double]) { def generate():GPUCode = { val (cx, ci, cy) = (x,i,u) map (_.generate) GPUCode(defs = merge(cx.defs,cy.defs,ci.defs), expo = s”(${cx.expr} + ${cy.expr})”) } }
  • 30. trait GE[T] case class GPUCode( val defs: Map[String,String] val expr: String ) class GEArrayIndex(x:GE[Array[Double]], i:GE[Int]) { def generate():GPUCode = { val (cx, ci) = (x.generate(),i.generate()) GPUCode(defs = merge(cx.defs,cy.defs), expo = s”(${cx.expr}[${cy.expr}]”) } } GEPlus(GEArrayIndex(GEArrayVar(a),GEVar(i)), GEArrayIndex(GEArrayVar(b),GEVar(i)) => “a[i] + b[i]” class GEPlus(x:GE[Double], y:GE[Double]) { def generate():GPUCode = { val (cx, cy) = (x.generate(),y.generate()) GPUCode(defs = merge(cx.defs,cy.defs), expo = s”(${cx.expr} + ${cy.expr})”) } } class GEUpdate(x:GE[Double],i:GE[Int], y:GE[Double]) { def generate():GPUCode = { val (cx, ci, cy) = (x,i,u) map (_.generate) GPUCode(defs = merge(cx.defs,cy.defs,ci.defs), expo = s”(${cx.expr} + ${cy.expr})”) } } class GEForeach[T](x:GE[Array[Double]], f:GE[Int] => GE[T] ) { def generate():GPUCode = { val i = new GEIntVar(System.newName) val (cx, ci, cfi) = (x,i,f(i)) map (_.generate) val fName = System.newName val fBody = s””” __kernel void ${funName}(${genParamDefs(x)}) { int ${i.name} = get_global_id(0) ${cfi.expr} } “”” GPUCode( defs = merge(cx.defs,cy.defs,cci.defs,Map(fName,fBody)), expr = s”${fname}(${genParams(x)})”) } }
  • 31. trait GE[T] case class GPUCode( val defs: Map[String,String] val expr: String ) class GEArrayIndex(x:GE[Array[Double]], i:GE[Int]) { def generate():GPUCode = { val (cx, ci) = (x.generate(),i.generate()) GPUCode(defs = merge(cx.defs,cy.defs), expo = s”(${cx.expr}[${cy.expr}]”) } } class GEPlus(x:GE[Double], y:GE[Double]) { def generate():GPUCode = { val (cx, cy) = (x.generate(),y.generate()) GPUCode(defs = merge(cx.defs,cy.defs), expo = s”(${cx.expr} + ${cy.expr})”) } } class GEUpdate(x:GE[Double],i:GE[Int], y:GE[Double]) { def generate():GPUCode = { val (cx, ci, cy) = (x,i,u) map (_.generate) GPUCode(defs = merge(cx.defs,cy.defs,ci.defs), expo = s”(${cx.expr} + ${cy.expr})”) } } class GEForeach[T](x:GE[Array[Double]], f:GE[Int] => GE[T] ) { def generate():GPUCode = { val i = new GEIntVar(System.newName) val (cx, ci, cfi) = (x,i,f(i)) map (_.generate) val fName = System.newName val fBody = s””” __kernel void ${funName}(${genParamDef(x)}) { int ${i.name} = get_global_id(0) ${cfi.expr} } “”” GPUCode( defs = merge(cx.defs,cy.defs,cci.defs,Map(fName,fBody)), expr = s”${fname}($genParams(x))”) } } for(i <- a.index) yield c(i)=a(i)+b(i) => defs: “”” __kernel void f1(__global double * a, __global double * b, __global double* c, int n) { int i2 = get_global_id(0) c[i] = a[i]+b[i] }
  • 32. Finally: val a = GEArray[Double](“a”) val b = GEArray[Double](“b”) val c = GEArray[Double](“c”) for( i<- a.index) { c(i) = a(i) + b(i) } __kernel void f1(__global double*a, __global double* b, __global double* c, int n) { int i2 = get_global_id(0) c[i] = a[i]+b[i] } GPUExpr( ) // with macroses can be done in compile time
  • 33. Complexity Louse coupling (can be build independently) Amount of shared infrastructure (duplication) Amount of location informations.
  • 34. Typeclasses: typeclasses in Haskell implicit type transformations in scala concepts in C++14x (WS, not ISO) traits in RUST A B B don’t care about AA don’t care about B & C Crepresentation of A
  • 35. A B C Typeclasses class GEArrayIndex(x:GE[Array[Double]], i:GE[Int]) { def generate():GPUCode = { val (cx, ci) = (x.generate(),i.generate()) GPUCode(defs = merge(cx.defs,cy.defs), expo = s”(${cx.expr}[${cy.expr}]”) } }
  • 36. A B C Typeclasses class GEArrayIndex(x:GE[Array[Double]], i:GE[Int]) { def generate():GPUCode = { val (cx, ci) = (x.generate(),i.generate()) GPUCode(defs = merge(cx.defs,cy.defs), expo = s”(${cx.expr}[${cy.expr}]”) } } class GEArrayIndex(x:GE[Array[Double]], i:GE[Int]) implicit object GEArrayIndexCompiler extends Compiler[GEArrayIndex,GPUCode] { def generate(source: GEArrayIndex):GPUCode = { val (cx, ci) = (source.x.generate(), source.i.generate()) GPUCode(defs = merge(cx.defs,cy.defs), expo = s”(${cx.expr}[${cy.expr}]”) } } trait Compiler[Source,Code] { def generate(s:Source):Code }
  • 37. A B C Typeclasses class String implicit object StringComparator extends Comparable[String] trait Comparable[A] string trait Ordered { fn less(x:&self, y: &self) -> bool } RUST: imp Ordered for string { fn less(x:&self, y: &self) -> bool { return …. } }
  • 38. Language features: Research => Mainstream Type analysis Lightweights threads/async interfaces Metaprogramming Lousy Coupling a-la typeclasses Mostly research implicit parallelism distributed computing gradual typing language composition
  • 39. SE 2016. 3 Sep. 2016 Questions. Ruslan Shevchenko ruslan@shevchenko.kiev.ua @rssh1 https://github.com/rssh
  • 40. See during SE 2016. 3 Sep. 2016 TBD
  • 41. CREOLE LANGUAGE Pidgin English (Hawaii Official) Simplified grammar; natural learning curve; Use language without knowing one