60
A D programozási nyelv

A D programozási nyelv

  • Upload
    thimba

  • View
    64

  • Download
    0

Embed Size (px)

DESCRIPTION

A D programozási nyelv. Bevezetés. Amiről ma szó lesz… Miért D? Mert a fejlesztők úgy látták, hogy a C++-on van még mit javítani. Mert a programozók a nyelvnek általában elszigetelt részeit használják csak. Mert a gyakran használt típusok (string, vector) nem a nyelv részei. - PowerPoint PPT Presentation

Citation preview

A D programozsi nyelv

A D programozsi nyelvBevezetsAmirl ma sz leszMirt D?Mert a fejlesztk gy lttk, hogy a C++-on van mg mit javtani.Mert a programozk a nyelvnek ltalban elszigetelt rszeit hasznljk csak.Mert a gyakran hasznlt tpusok (string, vector) nem a nyelv rszei.Mert a fordtk ma mr okosabbak.A D f cljaiGyakran hasznlt funkcikat a nyelv rszv tenni.Tbb paradigma tmogatsaEgyszersts, hogy knnyebb legyen Hasonltson a C++-hozKnny legyen fordtprogramokat rni a nyelvhezContract-ok s unit-tesztekDokumentls knnytseMegtartott funkcikA kinzetProcedurlis, objektum-orientlt s template-(meta)programozs tmogatsaKivtelek (try-catch-finally)Futsidej tpusazonostsOpertor tlterhelsRAIIdown and dirty programming ~ architektrakzli programozsElhagyott funkcikKompatibilits C/C++-szalLink kompatibilits C++-szalC preprocesszorTbbszrs rkldsNvterekForward deklarciInclude files (nem kell mindig jraparszolni az egsz include-ot, hanem be tudja tlteni a ksz szimblumtblt)Nem-virtulis tagfggvnyek16-bites kompatibilitsF tulajdonsgokUtastsok, vezrlsi szerkezetekKifejezsekC/C++ -hoz hasonlrtkad opertor kifejezsKifejezsek rszkifejezseinek kirtkelse ltalban tetszleges sorrendben trtnhetLogikai kiefejezsek balrl jobbra, rvidre zrvaFeltteles kifejezsek C/C++ -hoz hasonlan(log kif) ? expression : expression;Cast-ols: cast (type) expression

UtastsokIf, for, while, switch: C/C++ -hoz hasonlSwitch ben string-et is hasznlhatunkForeach utasts

OOObjektumorientltsgNincs tbbszrs rkldsInterface-ek bevezetseMinden osztly az Object-bl szrmazikMinden fggvny virtulis (kivve static/final)Vannak zrt osztlyokAz osztly referenciaKonstruktorokMinden adattag automatikusan inicializldikA mr megrt konstruktor hasznlhatPldnyosts a new kulcsszvalA a = new A(3); class A { this(int y) { } }

class B : A { int j; this() { ... super(3); // call base constructor A.this(3) ... } } DestruktorokGC hvja meg (ltalban)

Begyazott osztlyokclass Outer { class Inner { } static class SInner { }}

void func() { class Nested { }

Outer o = new Outer; // Ok Outer.Inner oi = new Outer.Inner; // Error, no 'this' for Outer Outer.SInner os = new Outer.SInner; // Ok Nested n = new Nested; // Ok } Opertor tlterhelsOpertor, opfuncOp a a.opfunc();

Binris opertor tlterhelsa op b a.opfunc(b);VAGY b.opfunc_r(a);

Resource Acquisition Is InitializationKezdeti rtkads == Az erforrs megszerzseA C++ mdszer erforrsok kezelsreGC szp s j, de hasznlhatatlann teszi az RAII-tRAIIErforrs-kezels JAVA-ban

Erforrs-kezels C#-benIDisposeable interfsz, Dispose() fggvny

Erforrs-kezels C#-ben

s akkor RAII, C++-ban:

s akkor RAII, C++-ban:

Vgl: RAII D-benGarbage Collection vanObjektumok a heap-en jnnek ltre, nincs explicit lettartamukTry/finally t is hasznlhatunk erforrs kezelsreRAII tmogatsa: scope attribtumVgl: RAII D-ben

Scope Guard statementsscope(exit) NonEmptyOrScopeBlockStatement scope(success) NonEmptyOrScopeBlockStatement scope(failure) NonEmptyOrScopeBlockStatement

FggvnyekltalbanBevezettek tbb fajta fggvnytFggvnyeket lehet egymsba gyazniFggvnyekre bevezettk az invarins fogalmtDelegtokInline fggvnyekFggvnyliterlokint function(char c) fp;void test() { static int foo(char c) { return 6; } fp = &foo;}

int function(char c) fp;void test() { fp = function int(char c) { return 6;} ;}

Fggvnyliterlok folytatsint abc(int delegate(long i)); void test() { int b = 3; int foo(long c) { return 6 + b; } abc(&foo); } int abc(int delegate(long i));void test() { int b = 3; abc( delegate int(long c) { return 6 + b; } );}// no reference to return value int abc(int delegate(long i));void test() { int b = 3; abc( (long c) { return 6 + b; } );} Begyazott fggvnyekint bar(int a) { int foo(int b) { int abc() { return 1; } return b + abc(); } return foo(a); } void test() { int i = bar(3); // i is assigned 4} Begyazott fggvnyek tulajdonsgokA begyazott fggvnyek csak a scope-jukban rhetk el.A begyazott fggvnyek elrik a begyaz vltozit s mdosthatjk is ket.Begyazott fggvny lehet member-ben is, de az osztly nem statikus adattagjait nem ri elBuktat: begyazott fggvnyek nem hivatkozhatnak egymsra (kvetez dia)

Buktatvoid test() { void foo() { bar(); } // error, bar not defined void bar() { foo(); } // ok}

//megolds

void test() { void delegate() fp; void foo() { fp(); } void bar() { foo(); } fp = &bar; } Property fggvnyekstruct S { int m_x; @property { int x() { return m_x; } int x(int newx) { return m_x = newx; } }}

void foo() { S s; s.x = 3; // calls s.x(int) bar(s.x); // calls bar(s.x())} Pure fggvnyekGarantlja, hogy a minden futsa ugyanolyan eredmnnyel jrParamtereiVagy inmutable tpusokVagy implicit azz konvertlhatkRef fggvnyekAz alaprtelmezett fggvnyvisszatrsi rtk jobbrtk.Ref kulcsszval lehet balrtkknt visszaadni rtketref int foo() { auto p = new int; return *p;}...foo() = 3; // reference returns can be lvalues Auto fggvnyekA visszatrsi rtkket automatikusan ki tudja kvetkeztetni

auto foo(int i) { return i + 3; // return type is inferred to be int} ParamterekA paramterek lehetnek in,out,ref,Stb: (lazy, final, const, immutable, scope)in = const scopeout : Mindig inicializldik!Minst nlkl mutable msolat lesz a paramter rtkeVariadic fggvnyekC-stlusfoo(3, 4, 5); // first variadic argument is 5 int foo(int x, int y, ...) { int z; z = *cast(int*)_argptr; // z is set to 5} Tpusinfval elltottTpusbiztosTpusinfval import std.stdio; class Foo { int x = 3; } class Bar { long y = 4; }

void printargs(int x, ...) { writefln("%d arguments", _arguments.length); for (int i = 0; i < _arguments.length; i++) { _arguments[i].print(); if (_arguments[i] == typeid(int)) { int j = *cast(int *)_argptr; _argptr += int.sizeof; writefln("\t%d", j); } else if (_arguments[i] == typeid(long)) { } else if (_arguments[i] == typeid(Bar)) { Bar b = *cast(Bar*)_argptr; _argptr += Bar.sizeof; writefln("\t%X", b); } else assert(0); }} void main() { Foo f = new Foo(); Bar b = new Bar(); writefln("%X", f); printargs(1, 2, 3L, 4.5, f, b); } Tpusbiztosint test() { return sum(1, 2, 3) + sum(); // returns 6+0 } int func() { int[3] ii = [4, 5, 6]; return sum(ii); // returns 15 }int sum(int[] ar ...) { int s; foreach (int x; ar) s += x;return s; } Contract-okContract-oklong square_root(long x) in { assert(x >= 0); }out (result){ assert((result * result) = x); } body { return cast(long)std.math.sqrt(cast(real)x); } Mirt j ez?Egysges kinzet a contract-oknakTool supportA fordt jobb kdot tud generlni ezzel az informcivalKnnyebb a kezelse s kiknyszertseAz rklds kezelse rkldsMember fggvnyek esetn rkldskor a kvetkez szablyok rvnyesekin contractok diszjunkcijnakout contractok konjunkcijnakkell teljeslniInvarinsokLefutKonstruktor utnDestruktor elttPublikus member eltt s utnHiba esetn AssertError-t dobCsak egy invarinsa lehet egy osztlynakRelease-re fordtsnl az invarins kd nem fordul leclass Date { int day; int hour;

invariant() {assert(1