SlideShare a Scribd company logo
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 Scala
Ensar Basri Kahveci
 
Introduction to Scala for Java Developers
Introduction to Scala for Java DevelopersIntroduction to Scala for Java Developers
Introduction to Scala for Java Developers
Michael 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 this
Ruslan Shevchenko
 
Scala for Java Programmers
Scala for Java ProgrammersScala for Java Programmers
Scala for Java Programmers
Eric Pederson
 
Demystifying Shapeless
Demystifying Shapeless Demystifying Shapeless
Demystifying Shapeless
Jared Roesch
 
Scala introduction
Scala introductionScala introduction
Scala introduction
vito jeng
 
Joy of scala
Joy of scalaJoy of scala
Joy of scala
Maxim Novak
 
Scala cheatsheet
Scala cheatsheetScala cheatsheet
Scala cheatsheet
Arduino Aficionado
 
First-Class Patterns
First-Class PatternsFirst-Class Patterns
First-Class Patterns
John De Goes
 
Scala in Places API
Scala in Places APIScala in Places API
Scala in Places API
Łukasz Bałamut
 
Scala Back to Basics: Type Classes
Scala Back to Basics: Type ClassesScala Back to Basics: Type Classes
Scala Back to Basics: Type Classes
Tomer Gabel
 
Ponies and Unicorns With Scala
Ponies and Unicorns With ScalaPonies and Unicorns With Scala
Ponies and Unicorns With Scala
Tomer 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 Scala
djspiewak
 
Scala Refactoring for Fun and Profit
Scala Refactoring for Fun and ProfitScala Refactoring for Fun and Profit
Scala Refactoring for Fun and Profit
Tomer Gabel
 
10 Things I Hate About Scala
10 Things I Hate About Scala10 Things I Hate About Scala
10 Things I Hate About Scala
Meir 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 Scala
Peter Maas
 
Java Performance MythBusters
Java Performance MythBustersJava Performance MythBusters
Java Performance MythBusters
Sebastian Zarnekow
 
Introduction to kotlin
Introduction to kotlinIntroduction to kotlin
Introduction to kotlin
NAVER Engineering
 
Intro to Kotlin
Intro to KotlinIntro to Kotlin
Intro to Kotlin
Magda 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

Redox OS
Redox OSRedox OS
Redox OS
Norbert Melzer
 
Introduction to Rust Programming Language
Introduction to Rust Programming LanguageIntroduction to Rust Programming Language
Introduction to Rust Programming Language
Robert 'Bob' Reyes
 
Rust Programming Language
Rust Programming LanguageRust Programming Language
Rust Programming Language
Jaeju 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 logger
Mitsunori 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 Rust
Mitsunori 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 scala
Ruslan 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 framework
Felipe
 
TI1220 Lecture 14: Domain-Specific Languages
TI1220 Lecture 14: Domain-Specific LanguagesTI1220 Lecture 14: Domain-Specific Languages
TI1220 Lecture 14: Domain-Specific Languages
Eelco Visser
 
Pune Clojure Course Outline
Pune Clojure Course OutlinePune Clojure Course Outline
Pune Clojure Course Outline
Baishampayan Ghose
 
Specialized Compiler for Hash Cracking
Specialized Compiler for Hash CrackingSpecialized Compiler for Hash Cracking
Specialized Compiler for Hash Cracking
Positive Hack Days
 
IN4308 1
IN4308 1IN4308 1
IN4308 1
Eelco Visser
 
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
HUJAK - Hrvatska udruga Java korisnika / Croatian Java User Association
 
ES6 - JavaCro 2016
ES6 - JavaCro 2016ES6 - JavaCro 2016
ES6 - JavaCro 2016
Nenad Pecanac
 
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
Miles Sabin
 
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
Miles Sabin
 
Scala clojure techday_2011
Scala clojure techday_2011Scala clojure techday_2011
Scala clojure techday_2011
Thadeu 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 Paradigms
Miles Sabin
 
Scala Talk at FOSDEM 2009
Scala Talk at FOSDEM 2009Scala Talk at FOSDEM 2009
Scala Talk at FOSDEM 2009
Martin 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 platform
Ruslan Shevchenko
 
scalaliftoff2009.pdf
scalaliftoff2009.pdfscalaliftoff2009.pdf
scalaliftoff2009.pdf
Hiroshi Ono
 
scalaliftoff2009.pdf
scalaliftoff2009.pdfscalaliftoff2009.pdf
scalaliftoff2009.pdf
Hiroshi Ono
 
scalaliftoff2009.pdf
scalaliftoff2009.pdfscalaliftoff2009.pdf
scalaliftoff2009.pdf
Hiroshi Ono
 
scalaliftoff2009.pdf
scalaliftoff2009.pdfscalaliftoff2009.pdf
scalaliftoff2009.pdf
Hiroshi 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
 
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
 
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
 
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
 
Svitla talks 2021_03_25
Svitla talks 2021_03_25Svitla talks 2021_03_25
Svitla talks 2021_03_25
Ruslan Shevchenko
 
Akka / Lts behavior
Akka / Lts behaviorAkka / Lts behavior
Akka / Lts behavior
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 evolution
Ruslan Shevchenko
 
{co/contr} variance from LSP
{co/contr} variance  from LSP{co/contr} variance  from LSP
{co/contr} variance from LSP
Ruslan Shevchenko
 
N flavors of streaming
N flavors of streamingN flavors of streaming
N flavors of streaming
Ruslan Shevchenko
 
Java & low latency applications
Java & low latency applicationsJava & low latency applications
Java & low latency applications
Ruslan Shevchenko
 
Csp scala wixmeetup2016
Csp scala wixmeetup2016Csp scala wixmeetup2016
Csp scala wixmeetup2016
Ruslan Shevchenko
 
IDLs
IDLsIDLs
R ext world/ useR! Kiev
R ext world/ useR!  KievR ext world/ useR!  Kiev
R ext world/ useR! Kiev
Ruslan 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 years
Ruslan 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 stream
Ruslan 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 2014
Ruslan Shevchenko
 
Web architecture - overview of techniques.
Web architecture - overview of  techniques.Web architecture - overview of  techniques.
Web architecture - overview of techniques.
Ruslan Shevchenko
 
R scala 17_05_2014
R scala 17_05_2014R scala 17_05_2014
R scala 17_05_2014
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
 
Osdn2013 rssh
Osdn2013 rsshOsdn2013 rssh
Osdn2013 rssh
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

How Can Hiring A Mobile App Development Company Help Your Business Grow?
How Can Hiring A Mobile App Development Company Help Your Business Grow?How Can Hiring A Mobile App Development Company Help Your Business Grow?
How Can Hiring A Mobile App Development Company Help Your Business Grow?
ToXSL Technologies
 
GreenCode-A-VSCode-Plugin--Dario-Jurisic
GreenCode-A-VSCode-Plugin--Dario-JurisicGreenCode-A-VSCode-Plugin--Dario-Jurisic
GreenCode-A-VSCode-Plugin--Dario-Jurisic
Green Software Development
 
SQL Accounting Software Brochure Malaysia
SQL Accounting Software Brochure MalaysiaSQL Accounting Software Brochure Malaysia
SQL Accounting Software Brochure Malaysia
GohKiangHock
 
Hand Rolled Applicative User Validation Code Kata
Hand Rolled Applicative User ValidationCode KataHand Rolled Applicative User ValidationCode Kata
Hand Rolled Applicative User Validation Code Kata
Philip Schwarz
 
Fundamentals of Programming and Language Processors
Fundamentals of Programming and Language ProcessorsFundamentals of Programming and Language Processors
Fundamentals of Programming and Language Processors
Rakesh Kumar R
 
一比一原版(UMN毕业证)明尼苏达大学毕业证如何办理
一比一原版(UMN毕业证)明尼苏达大学毕业证如何办理一比一原版(UMN毕业证)明尼苏达大学毕业证如何办理
一比一原版(UMN毕业证)明尼苏达大学毕业证如何办理
dakas1
 
ALGIT - Assembly Line for Green IT - Numbers, Data, Facts
ALGIT - Assembly Line for Green IT - Numbers, Data, FactsALGIT - Assembly Line for Green IT - Numbers, Data, Facts
ALGIT - Assembly Line for Green IT - Numbers, Data, Facts
Green Software Development
 
Requirement Traceability in Xen Functional Safety
Requirement Traceability in Xen Functional SafetyRequirement Traceability in Xen Functional Safety
Requirement Traceability in Xen Functional Safety
Ayan Halder
 
J-Spring 2024 - Going serverless with Quarkus, GraalVM native images and AWS ...
J-Spring 2024 - Going serverless with Quarkus, GraalVM native images and AWS ...J-Spring 2024 - Going serverless with Quarkus, GraalVM native images and AWS ...
J-Spring 2024 - Going serverless with Quarkus, GraalVM native images and AWS ...
Bert Jan Schrijver
 
Odoo ERP Vs. Traditional ERP Systems – A Comparative Analysis
Odoo ERP Vs. Traditional ERP Systems – A Comparative AnalysisOdoo ERP Vs. Traditional ERP Systems – A Comparative Analysis
Odoo ERP Vs. Traditional ERP Systems – A Comparative Analysis
Envertis Software Solutions
 
UI5con 2024 - Keynote: Latest News about UI5 and it’s Ecosystem
UI5con 2024 - Keynote: Latest News about UI5 and it’s EcosystemUI5con 2024 - Keynote: Latest News about UI5 and it’s Ecosystem
UI5con 2024 - Keynote: Latest News about UI5 and it’s Ecosystem
Peter Muessig
 
E-Invoicing Implementation: A Step-by-Step Guide for Saudi Arabian Companies
E-Invoicing Implementation: A Step-by-Step Guide for Saudi Arabian CompaniesE-Invoicing Implementation: A Step-by-Step Guide for Saudi Arabian Companies
E-Invoicing Implementation: A Step-by-Step Guide for Saudi Arabian Companies
Quickdice ERP
 
Using Query Store in Azure PostgreSQL to Understand Query Performance
Using Query Store in Azure PostgreSQL to Understand Query PerformanceUsing Query Store in Azure PostgreSQL to Understand Query Performance
Using Query Store in Azure PostgreSQL to Understand Query Performance
Grant Fritchey
 
Lecture 2 - software testing SE 412.pptx
Lecture 2 - software testing SE 412.pptxLecture 2 - software testing SE 412.pptx
Lecture 2 - software testing SE 412.pptx
TaghreedAltamimi
 
8 Best Automated Android App Testing Tool and Framework in 2024.pdf
8 Best Automated Android App Testing Tool and Framework in 2024.pdf8 Best Automated Android App Testing Tool and Framework in 2024.pdf
8 Best Automated Android App Testing Tool and Framework in 2024.pdf
kalichargn70th171
 
socradar-q1-2024-aviation-industry-report.pdf
socradar-q1-2024-aviation-industry-report.pdfsocradar-q1-2024-aviation-industry-report.pdf
socradar-q1-2024-aviation-industry-report.pdf
SOCRadar
 
How to write a program in any programming language
How to write a program in any programming languageHow to write a program in any programming language
How to write a program in any programming language
Rakesh Kumar R
 
Transform Your Communication with Cloud-Based IVR Solutions
Transform Your Communication with Cloud-Based IVR SolutionsTransform Your Communication with Cloud-Based IVR Solutions
Transform Your Communication with Cloud-Based IVR Solutions
TheSMSPoint
 
Mobile App Development Company In Noida | Drona Infotech
Mobile App Development Company In Noida | Drona InfotechMobile App Development Company In Noida | Drona Infotech
Mobile App Development Company In Noida | Drona Infotech
Drona Infotech
 
Mobile app Development Services | Drona Infotech
Mobile app Development Services  | Drona InfotechMobile app Development Services  | Drona Infotech
Mobile app Development Services | Drona Infotech
Drona Infotech
 

Recently uploaded (20)

How Can Hiring A Mobile App Development Company Help Your Business Grow?
How Can Hiring A Mobile App Development Company Help Your Business Grow?How Can Hiring A Mobile App Development Company Help Your Business Grow?
How Can Hiring A Mobile App Development Company Help Your Business Grow?
 
GreenCode-A-VSCode-Plugin--Dario-Jurisic
GreenCode-A-VSCode-Plugin--Dario-JurisicGreenCode-A-VSCode-Plugin--Dario-Jurisic
GreenCode-A-VSCode-Plugin--Dario-Jurisic
 
SQL Accounting Software Brochure Malaysia
SQL Accounting Software Brochure MalaysiaSQL Accounting Software Brochure Malaysia
SQL Accounting Software Brochure Malaysia
 
Hand Rolled Applicative User Validation Code Kata
Hand Rolled Applicative User ValidationCode KataHand Rolled Applicative User ValidationCode Kata
Hand Rolled Applicative User Validation Code Kata
 
Fundamentals of Programming and Language Processors
Fundamentals of Programming and Language ProcessorsFundamentals of Programming and Language Processors
Fundamentals of Programming and Language Processors
 
一比一原版(UMN毕业证)明尼苏达大学毕业证如何办理
一比一原版(UMN毕业证)明尼苏达大学毕业证如何办理一比一原版(UMN毕业证)明尼苏达大学毕业证如何办理
一比一原版(UMN毕业证)明尼苏达大学毕业证如何办理
 
ALGIT - Assembly Line for Green IT - Numbers, Data, Facts
ALGIT - Assembly Line for Green IT - Numbers, Data, FactsALGIT - Assembly Line for Green IT - Numbers, Data, Facts
ALGIT - Assembly Line for Green IT - Numbers, Data, Facts
 
Requirement Traceability in Xen Functional Safety
Requirement Traceability in Xen Functional SafetyRequirement Traceability in Xen Functional Safety
Requirement Traceability in Xen Functional Safety
 
J-Spring 2024 - Going serverless with Quarkus, GraalVM native images and AWS ...
J-Spring 2024 - Going serverless with Quarkus, GraalVM native images and AWS ...J-Spring 2024 - Going serverless with Quarkus, GraalVM native images and AWS ...
J-Spring 2024 - Going serverless with Quarkus, GraalVM native images and AWS ...
 
Odoo ERP Vs. Traditional ERP Systems – A Comparative Analysis
Odoo ERP Vs. Traditional ERP Systems – A Comparative AnalysisOdoo ERP Vs. Traditional ERP Systems – A Comparative Analysis
Odoo ERP Vs. Traditional ERP Systems – A Comparative Analysis
 
UI5con 2024 - Keynote: Latest News about UI5 and it’s Ecosystem
UI5con 2024 - Keynote: Latest News about UI5 and it’s EcosystemUI5con 2024 - Keynote: Latest News about UI5 and it’s Ecosystem
UI5con 2024 - Keynote: Latest News about UI5 and it’s Ecosystem
 
E-Invoicing Implementation: A Step-by-Step Guide for Saudi Arabian Companies
E-Invoicing Implementation: A Step-by-Step Guide for Saudi Arabian CompaniesE-Invoicing Implementation: A Step-by-Step Guide for Saudi Arabian Companies
E-Invoicing Implementation: A Step-by-Step Guide for Saudi Arabian Companies
 
Using Query Store in Azure PostgreSQL to Understand Query Performance
Using Query Store in Azure PostgreSQL to Understand Query PerformanceUsing Query Store in Azure PostgreSQL to Understand Query Performance
Using Query Store in Azure PostgreSQL to Understand Query Performance
 
Lecture 2 - software testing SE 412.pptx
Lecture 2 - software testing SE 412.pptxLecture 2 - software testing SE 412.pptx
Lecture 2 - software testing SE 412.pptx
 
8 Best Automated Android App Testing Tool and Framework in 2024.pdf
8 Best Automated Android App Testing Tool and Framework in 2024.pdf8 Best Automated Android App Testing Tool and Framework in 2024.pdf
8 Best Automated Android App Testing Tool and Framework in 2024.pdf
 
socradar-q1-2024-aviation-industry-report.pdf
socradar-q1-2024-aviation-industry-report.pdfsocradar-q1-2024-aviation-industry-report.pdf
socradar-q1-2024-aviation-industry-report.pdf
 
How to write a program in any programming language
How to write a program in any programming languageHow to write a program in any programming language
How to write a program in any programming language
 
Transform Your Communication with Cloud-Based IVR Solutions
Transform Your Communication with Cloud-Based IVR SolutionsTransform Your Communication with Cloud-Based IVR Solutions
Transform Your Communication with Cloud-Based IVR Solutions
 
Mobile App Development Company In Noida | Drona Infotech
Mobile App Development Company In Noida | Drona InfotechMobile App Development Company In Noida | Drona Infotech
Mobile App Development Company In Noida | Drona Infotech
 
Mobile app Development Services | Drona Infotech
Mobile app Development Services  | Drona InfotechMobile app Development Services  | Drona Infotech
Mobile app Development Services | Drona Infotech
 

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