OH NO!OH NO!
ANOTHER PROGRAMMINGANOTHER PROGRAMMING
LANGUAGELANGUAGE
4programmers.net
TYPICAL DRAMATYPICAL DRAMA
POSTPOST
(2-4 each month)
Mam 32 lata, żonę i urodziło mi się
dziecko (tzn nie urodziło się samo tylko
zostało urodzone ściślej mówiąc), nie
mam czasu na doszkalanie się oraz
naukę nowych technologii. Co zrobić ze
swoim życiem? Jak wskoczyć na
pozycję bardziej menagerskie gdzie nie
potrzeba ciągłej technicznej nauki?
why do always get new technologies ?
why always new frameworks ?
why do we have to learn new programming
languages ?
who creates all those niche languages?
REMEMBER YOUR FIRSTREMEMBER YOUR FIRST
PROGRAMMING LANGUAGE?PROGRAMMING LANGUAGE?
10 PRINT "HELLO WORLD"
20 PRINT
30 GO TO 10
AND YOUR FAVOURITEAND YOUR FAVOURITE
LANGUAGE?LANGUAGE?
YOUR FAVOURITE LANGUAGEYOUR FAVOURITE LANGUAGE
you know it well
you like it
you dislike other
you can do all you want
in
you would do all in it
song in 1500 different programming languages ...
99 bottles of beer on the wall, 99 bottles of beer.
Take one down and pass it around, 98 bottles of beer on the wa
98 bottles of beer on the wall, 98 bottles of beer.
Take one down and pass it around, 97 bottles of beer on the wa
97 bottles of beer on the wall, 97 bottles of beer.
Take one down and pass it around, 96 bottles of beer on the wa
96 bottles of beer on the wall, 96 bottles of beer.
Take one down and pass it around, 95 bottles of beer on the wa
95 bottles of beer on the wall, 95 bottles of beer.
Take one down and pass it around, 94 bottles of beer on the wa
99 bottles of beer
LET'S TALK ABOUTLET'S TALK ABOUT
HARDWAREHARDWARE
FIRST COMPUTERSFIRST COMPUTERS
ANALITICAL ENGINEANALITICAL ENGINE
Designed in 1837+ by Charles Babbage
first planned
computer
mechanical
not finished
first program ever?
N0 6
N1 1
N2 1
×
L1
L0
S1
-
L0
L2
S0
L2
L0
CB?11
PROGRAMMINGPROGRAMMING
LANGUAGELANGUAGE
λn. n (λfab.
(f b ((λmnfx. n f (m f x)) a b)))
(λxy. x) (λfx. x) (λfx. f x)
LAMBDA CALCULUSLAMBDA CALCULUS
1930 Church
x
(λx.M)
(M N)
Λ - CALCULUSΛ - CALCULUS
Λ - CALCULUSΛ - CALCULUS
a programming language
Λ - CALCULUSΛ - CALCULUS
a programming language
minimal
Λ - CALCULUSΛ - CALCULUS
a programming language
minimal
turing tarpit
Λ - CALCULUSΛ - CALCULUS
a programming language
minimal
turing tarpit
low level language of
mathematics
Λ - CALCULUSΛ - CALCULUS
a programming language
minimal
turing tarpit
low level language of
mathematics
needs no computer to run!
BACK TO METALBACK TO METAL
ATANASOFF-BERRY COMPUTERATANASOFF-BERRY COMPUTER
1939!
Z3 ELECTROMECHANICALZ3 ELECTROMECHANICAL
Konrad Zuse / Berlin 1941
Zuse designed first high level programming language
NEXTNEXT
Colossus
1943
ENIAC 1945
EDVAC
BINAC
...
PROGRAMMINGPROGRAMMING
MODERN EXAMPLEMODERN EXAMPLE
eniac + 30 years (30 e.c.e)
a2 0a 18 a0 00 a9 01 ca f0 08 84 fb a8 65 fb 4c 14 08
a8 a9 00 20 91 b3 20 dd bd a9 00 a0 01 20 1e ab 60
6510
a2 0a 18 a0 00 a9 01 ca f0 08 84 fb a8 65 fb 4c 14 08
a8 a9 00 20 91 b3 20 dd bd a9 00 a0 01 20 1e ab 60
6510
Must be put in memory
$080d
a2 0a 18 a0 00 a9 01 ca f0 08 84 fb a8 65 fb 4c 14 08
a8 a9 00 20 91 b3 20 dd bd a9 00 a0 01 20 1e ab 60
6510
Must be put in memory
$080d
f0 is a conditional branch
a2 0a 18 a0 00 a9 01 ca f0 08 84 fb a8 65 fb 4c 14 08
a8 a9 00 20 91 b3 20 dd bd a9 00 a0 01 20 1e ab 60
6510
Must be put in memory
$080d
f0 is a conditional branch
4c is an unconditional jump
a2 0a 18 a0 00 a9 01 ca f0 08 84 fb a8 65 fb 4c 14 08
a8 a9 00 20 91 b3 20 dd bd a9 00 a0 01 20 1e ab 60
MACHINE CODEMACHINE CODE
MACHINE CODEMACHINE CODE
Easy to learn
Conditional branches / loops are hard to calculate
Codes hard(?) to remember (150 opcodes on 6510, ?
>4k on i7 )
mechanical/boring job
hard to program
WE NEEDWE NEED
ANOTHERANOTHER
PROGRAMMINGPROGRAMMING
LANGUAGELANGUAGE
tmp = $fb
Start: ldx #10 ; decimal!
clc
ldy #$0
lda #$1
loop: dex
beq end
sty tmp
tay
adc tmp
jmp loop
end: tay ; result is in Y - lets print it
lda #$00
jsr $B391 ; int to float
ASSEMBLY (1949)ASSEMBLY (1949)
For noobs that cannot remember machine codes
REASON 1REASON 1
Let compiler do automatic and boring job
So that we code faster
REASON 1REASON 1
Let compiler do automatic and boring job
So that we code faster
ASSEMBLYASSEMBLY
As fast as machine code
Some minimal portability
(!)
Registers
Arithmetic calculations
Comments needed (!)
MEANWHILE IN AMEANWHILE IN A
HARDWAREHARDWARE
ANOTHERANOTHER
PROGRAMMINGPROGRAMMING
LANGUAGELANGUAGE
from
SUBROUTINE FIB(N)
INTEGER N,I,F0,F1,TMP
I=0
1060 IF(N.GT.0)THEN
GOTO6129
ELSE
GOTO7290
ENDIF
6129 WRITE(*,3502) 1
N=N-1
I=I+1
IF(I.LT.2)THEN
GOTO1060
ELSE
GOTO9321
https://gist.github.com/wrathematics/ac621cd583c4b9e
FORTRAN (1957)FORTRAN (1957)
FORTRANFORTRAN
simple arithmetic
compiled to very fast code
funny type system
GOTO hell
scientific
FORTRANFORTRAN
simple arithmetic
compiled to very fast code
funny type system variables starting on I-N are
INTEGER
GOTO hell
scientific
ANOTHERANOTHER
PROGRAMMINGPROGRAMMING
LANGUAGELANGUAGE
IDENTIFICATION DIVISION.
PROGRAM-ID. "Fibonacci".
ENVIRONMENT DIVISION.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 ix BINARY-C-LONG VALUE 0.
01 first-number BINARY-C-LONG VALUE 0.
01 second-number BINARY-C-LONG VALUE 1.
01 temp-number BINARY-C-LONG VALUE 1.
01 display-number PIC Z(19)9.
PROCEDURE DIVISION.
START-PROGRAM.
MOVE first-number TO display-number.
DISPLAY display-number.
COBOL (1959)COBOL (1959)
COBOLCOBOL
fast code a er compilation
reading as english (military
version)
no need to comment
REASON #2REASON #2
Make programming easier
REASON #2REASON #2
Make programming easier
MEANWHILE IN AMEANWHILE IN A
HARDWAREHARDWARE
PUNCH CARD DRIVENPUNCH CARD DRIVEN
Guess what?
... ANOTHER... ANOTHER
LANGUAGELANGUAGE
defun fibonacci(n)
(cond
((eq n 1) 0)
((eq n 2) 1)
((+ (fibonacci (- n 1)) (fibonacci (- n 2))))))))
LISP (1958)LISP (1958)
REASON 3REASON 3
New(?)
concept
New paradigm
Elegance
But we will not talk about LISP
REASON 3REASON 3
New(?)
concept
New paradigm
Elegance
But we will not talk about LISP
AND AGAINAND AGAIN
ANOTHER LANGUAGEANOTHER LANGUAGE
PROC fibo = (INT n) INT :
# prints out the Fibonacci sequence up to n. #
BEGIN
INT a := 0, b := 1;
FOR i TO n-1 DO
# print((whole(i, 0), " => ", whole(b, 0), new lin
INT c = a + b;
a := b;
b := c
OD;
b
END;
print(whole(fibo(10),0))
ALGOL (1958)ALGOL (1958)
ALGOLALGOL
Academic language of 60'
ALGOLALGOL
Academic language of 60'
ALGOL 58 better
FORTRAN
ALGOLALGOL
Academic language of 60'
ALGOL 58 better
FORTRAN
ALGOL 60
ALGOLALGOL
Academic language of 60'
ALGOL 58 better
FORTRAN
ALGOL 60
ALGOL 68 great disaster
Man or boy test by Donald Knuth
ALGOL 68ALGOL 68
way ahead of any language of that time
design by community
first design then implementation (few years
later)
lot of funny operators
Reality
Disappointment
MEANWHILE IN AMEANWHILE IN A
HARDWAREHARDWARE
EXPLOSIONEXPLOSION
ALTERNATIVEALTERNATIVE
PROGRAMMINGPROGRAMMING
LANGUAGELANGUAGE
RECORD PERSON (
STRING(20) NAME;
INTEGER AGE;
LOGICAL MALE;
REFERENCE(PERSON) FATHER, MOTHER, YOUNGESTOFFSPRING, ELDER
);
REFERENCE(PERSON) PROCEDURE YOUNGESTUNCLE (REFERENCE(PERSON) R
BEGIN
REFERENCE(PERSON) P, M;
P := YOUNGESTOFFSPRING(FATHER(FATHER(R)));
WHILE (P ¬= NULL) AND (¬ MALE(P)) OR (P = FATHER(R)) D
P := ELDERSIBLING(P);
M := YOUNGESTOFFSPRING(MOTHER(MOTHER(R)));
WHILE (M ¬= NULL) AND (¬ MALE(M)) DO
ALGOL WALGOL W
Niklaus Wirth and Tony
Hoare
NULL - I call it my billion-dollar mistake
AND ANOTHERAND ANOTHER
PROGRAMMINGPROGRAMMING
LANGUAGELANGUAGE
GET "libhdr"
LET start() = VALOF
{ FOR i = 0 TO 15 DO writef("%n, ", fibonacci(i))
writef("...*n")
RESULTIS 0
}
AND fibonacci(n) = n<2 -> 1, fibonacci(n-1)+fibonacci(n-2)
BCPLBCPL (1967)(1967)
only one type
language for os
programming
hungarian notation
AND ANOTHERAND ANOTHER
200 IF N<0 THEN F=-1:RETURN
210 IF N<2 THEN F=1:RETURN
220 N=N-1:GOSUB 200
230 N=N+1:F=F*N
240 RETURN
BASIC (1964)BASIC (1964)
Programming for
masses
interpreter
GOTO
uninitialized variables
MEANWHILE IN AMEANWHILE IN A
HARDWAREHARDWARE
ALTAIR 8800ALTAIR 8800
EVERYBODY WANTED BASICEVERYBODY WANTED BASIC
COMMODORE WANTED BASICCOMMODORE WANTED BASIC
THE DEALTHE DEAL
Microso wanted $3 for each Commodore computer
sold with BASIC in ROM
(from
)
https://tech.wp.pl/internet-commodore-i-atari-
nie-powstalyby-bez-polakow-6035074860253825g/2
Microso got $25 000 for perpetual licence for
Microso got $25 000 for perpetual licence for
all Commodore 65xx based machines
Commodore sold ~ 20 mln of C64 machines
and few millions of others
Microso almost bankrupted
And angry Bill Gates put an easter egg in machine
code...
Commodore Pet
ERA OF BASICERA OF BASIC
1977-19951977-1995
Edsger Dijkstra
GOTO considered harmful
GOTO considered harmful
(WTF?)
ANOTHERANOTHER
PROGRAMMINGPROGRAMMING
LANGUAGE?LANGUAGE?
function FibonacciNumber(const n: integer): integer;
begin
// recursive case
if n > 1 then
result := (FibonacciNumber(n-1) + FibonacciNumber(n-2)
// base case
else if n = 0 then
result := 0
else
result := 1;
end;
PASCAL (1970)PASCAL (1970)
No more GOTO errors
Variable declared
structural
programming
REASON 4REASON 4
Prevent errors
REASON 4REASON 4
Prevent errors
STRUCTURAL PROGRAMMINGSTRUCTURAL PROGRAMMING
Makes impossible to create spaghetti code
Oh really?
BETTERBETTER
ALTERNATIVEALTERNATIVE
If GOTO is bad...
10 COMEFROM 40
20 INPUT "WHAT IS YOUR NAME? "; A$
30 PRINT "HELLO, "; A$
40 REM
YET ANOTHERYET ANOTHER
LANGUAGELANGUAGE
XXXVII
DO .9 <- #16
DO .10 <- #0
DO .11 <- #1
(1) PLEASE READ OUT .11
DO .1 <- .10
DO .2 <- .11
PLEASE (1009) NEXT
DO .10 <- .11
DO .11 <- .3
DO (3) NEXT
DO (1) NEXT
INTERCALINTERCAL (1972)(1972)
One of the first Esoteric Languages
AND ANOTHER NOTAND ANOTHER NOT
SO ESOTERICSO ESOTERIC
: fib ( x1 x2 -- x1 x2 x3 )
2dup
+
;
FORTH (1970)FORTH (1970)
it has nothing to do with
FORTRAN
structural
high level/low level
high level machine code
MEANWHILE IN AMEANWHILE IN A
HARDWAREHARDWARE
AND ANOTHERAND ANOTHER
PROGRAMMINGPROGRAMMING
LANGUAGELANGUAGE
from
#include<stdio.h>
void swap(int* a, int* b)
{
int t = *a;
*a = *b;
*b = t;
}
int partition (int arr[], int low, int high)
{
int pivot = arr[high]; // pivot
int i = (low - 1); // Index of smaller element
for (int j = low; j <= high- 1; j++)
https://www.geeksforgeeks.org/quick-sort/
C (1969)C (1969)
better os programing support
better low level hardware use
mixes easily with assembly
(void*) - and where is your type
now
life is too short for malloc
limited encapsulation
SO ANOTHERSO ANOTHER
LANGUAGELANGUAGE
bool myfunction (int i,int j) { return (i<j); }
struct myclass {
bool operator() (int i,int j) { return (i<j);}
} myobject;
int main () {
int myints[] = {32,71,12,45,26,80,53,33};
std::vector<int> myvector (myints, myints+8);
std::sort (myvector.begin(), myvector.begin()+4, myfunc);
return 0;
}
from
http://www.cplusplus.com/reference/algorithm/sort/
C++C++
object oriented programming
provide encapsulation
better modularization
life is too short for malloc
new/delete
operators overloading hell
meta-programming
portability
bad security
MEANWHILE IN AMEANWHILE IN A
HARDWAREHARDWARE
public class ArrayListTest {
public static void main(String[] args) {
List lst = new ArrayList();
lst.add("alpha");
lst.add("beta");
lst.add("charlie");
System.out.println(lst);
Iterator iter = lst.iterator();
while (iter.hasNext()) {
String str = (String)iter.next();
System.out.println(str);
}
}
}
JAVA (1996)JAVA (1996)
break with C
compatibility
keep similar syntax
portability
garbage collection
great standard library
security
better multithreading
REASON 5REASON 5
AND NOW THE MOSTAND NOW THE MOST
SUCCESSFULSUCCESSFUL
LANGUAGE EVERLANGUAGE EVER
[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[
(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]][([][(![]+[])[+[]]+
[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[
(!![]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+(
[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+
[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+(!![
[+!+[]]+([][[]]+[])[+[]]+([][(![]+[])[+[]]+([![]]+[][[]])[+!+[
(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]]+[])
(!![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[
(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!
[+!+[]]]((![]+[])[+!+[]]+(![]+[])[!+[]+!+[]]+(!![]+[])[!+[]+!+
[+!+[]]+(!![]+[])[+[]]+(![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!
[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])
JAVASCRIPT (1995)JAVASCRIPT (1995)
ECMA
LISPy in core
ugly in details/ bad
parts
Dynamicly typed
wasted chance
REASON 6REASON 6
Niche
REASON 6REASON 6
Niche
TYPES OFTYPES OF
LANGUAGESLANGUAGES
TYPESTYPES
TYPESTYPES
scripting languages vs compiled
languages
TYPESTYPES
scripting languages vs compiled
languages
dynamically typed vs statically typed
TYPESTYPES
scripting languages vs compiled
languages
dynamically typed vs statically typed
strongly typed vs weakly typed
Less types more tests
IS THERE ANYTHINGIS THERE ANYTHING
BETTER?BETTER?
var h = "Hello, "
var w = "World!"
var z = h.length() + w.length()
console.log(h +w + z)
SCALA (2003)SCALA (2003)
SCALA (2003)SCALA (2003)
FP , OOP hybrid
SCALA (2003)SCALA (2003)
FP , OOP hybrid
type inference
SCALA (2003)SCALA (2003)
FP , OOP hybrid
type inference
favors immutability
SCALA (2003)SCALA (2003)
FP , OOP hybrid
type inference
favors immutability
compiles to JVM
SCALA (2003)SCALA (2003)
FP , OOP hybrid
type inference
favors immutability
compiles to JVM
compiles to JS
SCALA (2003)SCALA (2003)
FP , OOP hybrid
type inference
favors immutability
compiles to JVM
compiles to JS
strongly/statically typed without
verbosity
SCALA (2003)SCALA (2003)
FP , OOP hybrid
type inference
favors immutability
compiles to JVM
compiles to JS
strongly/statically typed without
verbosity
complex
SCALA (2003)SCALA (2003)
FP , OOP hybrid
type inference
favors immutability
compiles to JVM
compiles to JS
strongly/statically typed without
verbosity
complex
too complex?
AND ANOTHERAND ANOTHER
LANGUAGELANGUAGE
var h:String = "Hello, ";
var w:String = "World!";
var z = h.length + w.length;
console.log(z);
TYPESCRIPTTYPESCRIPT (2012)(2012)
Compiles to
JS
static typed
but weakly
(*)
MEANWHILE IN AMEANWHILE IN A
HARDWAREHARDWARE
ANOTHER LANGUAGEANOTHER LANGUAGE
quicksort :: (Ord a) => [a] -> [a]
quicksort [] = []
quicksort (x:xs) =
let smallerSorted = quicksort [a | a <- xs, a <= x]
biggerSorted = quicksort [a | a <- xs, a > x]
in smallerSorted ++ [x] ++ biggerSorted l
HASKELL (1990)HASKELL (1990)
functional
pure
(almost)
growing use
libraries
... AND LOT OTHERS... AND LOT OTHERS
NOT TALKED ABOUTNOT TALKED ABOUT
Scheme, Clojure - purity of LISP
(back)
Kotlin - Java++, Scala--
Swi - modern Apple
Prolog - logic programming
Python - practical dynamic typing
Rust - safe concurrency
Erlang - actor model
...
WHAT DO YOU THINKWHAT DO YOU THINK
ABOUT YETABOUT YET
ANOTHERANOTHER
LANGUAGE?LANGUAGE?
LANGUAGELANGUAGE
syntax
LANGUAGELANGUAGE
syntax
semantics
LANGUAGELANGUAGE
syntax
semantics
library
LANGUAGELANGUAGE
syntax
semantics
library
tools
LANGUAGELANGUAGE
syntax
semantics
library
tools
community!
REASONS FOR NEW LANGUAGESREASONS FOR NEW LANGUAGES
TOWARDS BUG FREETOWARDS BUG FREE
opcode errors -> asm
GOTO spaghetti -> C
lack of encapsulation -> C++
memory leaks -> Java
nullpointerexception ->
Kotlin
concurrency problems ->
Rust
end of privacy
for your code
COMPILER WANTS TO KNOWCOMPILER WANTS TO KNOW
MOREMORE
malloc() - just function call in C
new A() - you allocate object in Java
COMPILER WANTS TO KNOWCOMPILER WANTS TO KNOW
MOREMORE
Semaphore.lock() - just a method call in C++
synchronized( ){ - you declare critical section in
Java
COMPILER WANTS TO KNOWCOMPILER WANTS TO KNOW
MOREMORE
public String s - shared variable in Java
let mut s = String::from("hello"); - you
control borrowing in Rust
BETTER PRODUCTIVITYBETTER PRODUCTIVITY
Easier maths -> Fortran
easier algorithms -> Algol
faster prototyping -> Visual
Basic
data processing -> Python
HARDWARE POSSIBILITIESHARDWARE POSSIBILITIES
limited mem -> asm, cobol, fortran
faster cpu -> Pascal, C
more memory -> C++, Java
network /multicore -> Scala,
Haskell
If you use new hardware, and new language
possibilites...
If you use new hardware, and new language
possibilites...
You wil have new types of bugs that are hard to even
imagine now.
If you use new hardware, and new language
possibilites...
You wil have new types of bugs that are hard to even
imagine now.
And You will (eventually) need:
YET ANOTHER LANGUAGEYET ANOTHER LANGUAGE
ETERNAL CYCLEETERNAL CYCLE
FOR YOUFOR YOU
Languages are there not to destroy your life
MASTER ONE LANGUAGE WELLMASTER ONE LANGUAGE WELL
READ AND UNDERSTANDREAD AND UNDERSTAND
LANGUAGES YOU WORK WITHLANGUAGES YOU WORK WITH
I mean You don't know JavaScript
TRYTRY REALLYREALLY DIFFERENT ONESDIFFERENT ONES
C# / Java - try Haskell
C / Pascal - try Java/ C#
Haskell/Ocaml - try Rust
Scala - try Clojure
Javascript - Scala (or asm)
REALLY, REALLYREALLY, REALLY
DIFFERENTDIFFERENT
PROLOG
Rust
Clojure
LANGUAGE CHANGES THE WAYLANGUAGE CHANGES THE WAY
YOU THINKYOU THINK
BE BRAVEBE BRAVE
In your companies you do:
prototypes,
dev tools,
hackatons
trainings
DON'T BE AFRAID OFDON'T BE AFRAID OF
DEAD LANGUAGESDEAD LANGUAGES
Languages never die - they only fade away
Or turn zombies
Last COBOL specification was released 2016
There is still a lot of COBOLERs
WHAT COMES NEXT?WHAT COMES NEXT?
WHAT COMES NEXT?WHAT COMES NEXT?
AI
WHAT COMES NEXT?WHAT COMES NEXT?
AI
256 cores
WHAT COMES NEXT?WHAT COMES NEXT?
AI
256 cores
more
GPU
WHAT COMES NEXT?WHAT COMES NEXT?
AI
256 cores
more
GPU
FPGAs?
WHAT COMES NEXT?WHAT COMES NEXT?
AI
256 cores
more
GPU
FPGAs?
IOT
WHAT COMES NEXT?WHAT COMES NEXT?
AI
256 cores
more
GPU
FPGAs?
IOT
security
WHAT COMES NEXT?WHAT COMES NEXT?
AI
256 cores
more
GPU
FPGAs?
IOT
security
privacy
WHY DON'T WE PROGRAMWHY DON'T WE PROGRAM
HASKELL?HASKELL?
Industry likes small steps
Industry likes small steps
C
Industry likes small steps
C
C++
Industry likes small steps
C
C++
Java/C#
Industry likes small steps
C
C++
Java/C#
Scala/F#
Industry likes small steps
C
C++
Java/C#
Scala/F#
Scala/F#
Industry likes small steps
C
C++
Java/C#
Scala/F#
Scala/F#
Kotlin ??
THE ENDTHE END

Another programming language - jeszcze jeden język