Modern rendszerprogramozási nyelvek
Bemutatkozás Rendszerprogramozási nyelvekkel kapcsolatos kutatások Kódmegértés Kódmetrikák Statikus analízis Kód instrumentáció Főleg C/C++ tapasztalat Tavalyi előadásom
Elvárások Ahead of time compilation Jól optimalizáló fordító Statikus kódellenőrzés Statikus típusrendszer Alacsony szint támogatása Inline assembly Modern nyelvi eszközök Olcsó absztrakciók Multiparadigmás programozás
C++ Jelenleg legmegfelelőbb Olcsó absztrakciók, gyors Backward compatibility Lassú fordítás Multiparadigmás nyelv Funkcionális (C++11), generatív, struktúrált, OOP, logikai Sok hibalehetőség
A mai versenyzők
Tendenciák Konkurens és párhuzamos eszközök Funkcionális eszközök, konstansság Test, coverage, doc eszközök Fordítási idejű garanciák OOP háttérbe szorulása Típusok kikövetkeztetése
Paradigma preferencia Deklaratív Config, GUI, Regexp, SQL, Prolog Funkcionális MapReduce stratégiák Imperatív OOP, ASM
Modern Funkcionális programozás alapjai (1930 Church: Lambda kalkulus) Lambda függvény, closure, curryzés (1960 John McCarthy: Lisp) Google Go vs Algol-68 Rust kis önirónia :-)
Kóstoló a jövőből STM: Haskell (2005) - C++17 Haskell Kategória elmélet Agda Konstruktív logika Koindukció Típuselmélet Csoportelmélet
OOP problémái Rust, Go nincsenek osztályok Öröklődés Típusok kompozíciója Polimorfizmus Kód újrafelhasználás Nem éri meg
OOP problémái - példa Java tisztán OOP-nak indult Nem mindenható paradigma... Generic-ek bevezetése OOP-ra való visszavezetéssel Gyenge típusrendszer, kevés fordítási idejű garancia Nem alkalmas rendszerprogramozási nyelvnek
MythBusters Alacsony szintű kód!= gyors kód qsort vs std::sort inlineing TBAA a fénynél is gyorsabban Option/Maybe nullable Metaalgorithms Szuper optimalizáció
Áttekintés D C++ done right Fordítási idejű reflexió, erős TMP, szerződés alapú prog. Rust C + Haskell + Ruby Egyedi memória modell, immutability AST alapú makrók Go Google Kevés nyelvi eszköz, stabil Általános Garbage collector (opcionális) Nyelvi unit test támogatás Doc generálás támogatás Konkurens programok támogatása
Gyors kóstoló Russel Winder előadása: Lightning talk Who Needs C++ When You Have D and Go? and Rust?! Russel konklúziója: Használjunk bármit, csak ne C++-t én mint C++ hívő
Egy egyszerű feladat Számoljuk ki azon számok négyzeteinek az összegét 0 és 100 között, amik oszthatóak 7-tel.
int sequential_iterative() { auto sum = 0; foreach(i; 0.. 100) { if (i % 7 == 0) { sum += i*i; return sum;
func sequential_iterative() (sum int) { for i := 0; i < 100; i++ { if (i % 7 == 0) { sum += i*i return
fn sequential_iterative() -> int { let mut sum = 0; for int::range(0,100) n { if n % 7 == 0 { sum += n * n; return sum;
int sequential_iterative() { auto sum = 0; for (auto i = 0; i < 100; ++i) { if (i % 7 == 0) { sum += i*i; return sum;
Mit láttunk eddig? Alig van különbség? Miért vagyunk itt? Miről szól egyáltalán ez az előadás? Legyünk kicsit funkcionálisabbak és deklaratívabbak!
reduce!"a+b"( map!"a*a"( filter!"a % 7 == 0"( iota(100)))); functools.inject( func (a, b int) int { return a + b, functools.collect(func (i int) int { return i * i, functools.filter( func (i int) bool { return i % 7 == 0, make([]int, 100)))) let x = v.filtered( x *x % 7 == 0). map( x *x * *x). foldl(0, a, x *a + *x);
iota(100). filter!"a % 7 == 0"(). map!"a*a"(). reduce!"a+b"(); functools.intslice(make([]int, 100)). Filter(func (i int) bool { return i % 7 == 0). Collect(func (i int) int { return i * i). Inject(func (a, b int) int { return a + b )
int sequential_declarative() { vector<int> numbers(100); iota(numbers.begin(), numbers.end(), 1); list<int> filtered; copy_if(numbers.begin(), numbers.end(), back_insert_iterator<list<int>>(filtered), [=](int i) { return i % 7 == 0; ); vector<int> squares(filtered.size()); transform(filtered.begin(), filtered.end(), back_insert_iterator<vector<int>>(squares), [=](int i) { return i * i; ); return accumulate(squares.begin(), sqares.end(), 0, [=](int i, int j) { return i + j );
Annyira nem rossz a helyzet! C++ Multiparadigmás! De az STL nem! Nincs még elegáns FP könyvtár =(
bool ismathop(const string op) { return op == "+" op == "-" op == "*" op == "/"; class IntEntry : EntryBase { this(string str) { super(datatype.int_t); value = parse!int(str); override string tostringrepr() const { return text(value); override int opcmp(const string rhs) const { auto tmp = rhs.dup; return value - parse!int(tmp); override int opbinary(string op)(int i) if(ismathop(op)) { mixin("return value" ~ op ~ "i;"); private: int value;
long square_root(long x) in { assert(x >= 0); out (result) { assert((result * result) <= x && (result+1) * (result+1) >= x); body { return cast(long)std.math.sqrt(cast(real)x); class Date { int day; int hour; invariant() { assert(1 <= day && day <= 31); assert(0 <= hour && hour < 24);
void abc() { Mutex m = new Mutex; lock(m); scope(exit) unlock(m); foo(); int[10] a; int[] b; ulong[string] dictionary; dictionary["alma"] = 2; //... a[0..5] = 3; b = a[2..$];
enum Shape { Circle { center: Point, radius: float, Rectangle { top_left: Point, bottom_right: Point fn area(sh: Shape) -> float { match sh { Circle { radius: radius, _ => float::consts::pi * square(radius), Rectangle { top_left: top_left, bottom_right: bottom_right => { (bottom_right.x - top_left.x) * (bottom_right.y - top_left.y)
let price = if item == "salad" { 3.50 else if item == "muffin" { 2.25 else { 2.00 ; match my_number { 0 => println("zero"), 1 2 => println("one or two"), 3..10 => println("three to ten"), _ => println("something else")
let mut max = 0; [1, 2, 3].map( x if *x > max { max = *x ); enum Option<T> { Some(T), None trait Printable { fn print(&self); impl Printable for int { fn print(&self) { println(fmt!("%d", *self))
Google GO Nincs inline assembly Nem opcionális a GC Nincsenek exception-ök Nincsenek generic-ek Production ready
Konklúzió C++ sokáig marad D-re legkönnyebb váltani Rust avatott szemnek szép kód Go production ready, kevés újdonság Hiány: curryzés (Rust macro)
Köszönöm a figyelmet! Slide-ok elkérhetőek Elérhetőségek: E-mail: xazax.hun@gmail.com Skype: norrec01