Академический Документы
Профессиональный Документы
Культура Документы
Tolstokulakov Nikolay
Going to native
1. 2. 3. 4. C++11 GoLang Rust DLang
Authors
Andrei Alexandrescu
Modern C++ Design: Generic Programming and Design Patterns Applied C++ Coding Standards: 101 Rules, Guidelines, and Best Practices. The D Programming Language.
Walter Bright
C and C++ compilers: Digital Mars C++ Symantec C++ Zortech C++ (the first native C++ compiler)
Dlang.org
D is a language with C-like syntax and static typing. It pragmatically combines efficiency, control, and modeling power, with safety and programmer productivity. Convenience - minimal boilerplate, automatic memory management,
slices, ranges
Erlang
0.366% 0.360%
Fortran
Assembly 0.471% Bash 0.470% Ladder Logic 0.457% Logo 0.433% Lua 0.413%
0.245%
Prolog
RPG (OS/400)
PostScript 0.312%
DLang
It is complex (more 100 keywords vs 50 in Java) Syntactic sugar & features
slices, auto, powerful foreach, final switch, ... unit tests, contract programming compile time intersection lamda, delegate scope ranges anti-hijacking
Powerful metaprogramming
Built-in array
bool binarySearch(T)(T[] input, T value) { if (input.empty) return false; auto i = input.length / 2; auto mid = input[i]; if (mid > value) return binarySearch(input[0 .. i]); if (mid < value) return binarySearch(input[i + 1 .. $]); return true; }
Ranges
InputRange:
front - get the first element of the range popFront - remove the first element of the range empty - are there more elements in the range? InputRange ForwardRange BidirectionalRange RandomAccessRange (infinite) RandomAccessRange (finite)
Voldemort
http://habrahabr.ru/post/183488/ auto generator(uint seed) { struct RandomNumberGenerator { @property int front() { return ((seed / 0x10000) * seed) >> 16; } void popFront() { seed = seed * 1103515245 + 12345; @property bool empty() { return false; } } RandomNumberGenerator g; g.popFront(); return g; } // get it going }
Pegged
https://github.com/PhilippeSigaud/Pegged/ mixin(grammar(` Arithmetic: Term Add Sub Mul Div `)); < Factor (Add / Sub)* < "+" Factor < "-" Factor < "*" Primary < "/" Primary
..
float interpreter(string expr){ auto p = Arithmetic(expr); float value(ParseTree p) { switch (p.name) { case "Arithmetic": return value(p.children[0]); case "Arithmetic.Term": . void main(string args[]){ pragma(msg, interpreter("1 + 2 - (3-5)*6")); foreach(a; args[1 .. $]) writefln("%s = %s", a, interpreter(a)); }
Dynamic typing
http://wiki.dlang.org/Dynamic_typing
var fromArgs = var.fromJson(args[1]); writefln("%s", fromArgs.keys); uint ids[] = cast(uint[])fromArgs.keys; var newIds = ids.map!(a=>a*2).array; fromArgs.keys = newIds; writefln("%s", fromArgs); string strIds[] = cast(string[])fromArgs.keys; var newStrIds = strIds.map!(a=>a~"!").array; fromArgs.keys = newStrIds; writefln("%s", fromArgs); ./jsvar_test '{"keys":[1,2,3]}' [1, 2, 3] {"keys":[2,4,6]} {"keys":["2!","4!","6!"]}
Materials
dlang.org dconf.org The D Programming Language (Andrei Alexandrescu) Three Unlikely Successful Features of D