Back to site
Since 2004, our University project has become the Internet's most widespread web hosting directory. Here we like to talk a lot about web servers, web development, networking and security services. It is, after all, our expertise. To make things better we've launched this science section with the free access to educational resources and important scientific material translated to different languages.

PREGLED



Šta je D?

D je programski jezik u generalne svrhe sistema i aplikacija. To je jezik visokog nivoa, koji međutim zadržava sposobnost da piše kod visokih performansi i interfejs direktno sa API-jem operativnog sistema i hardverom. D je pogodan za pisanje srednjih do velikih programa sa milionskim redovima sa timovima programera. D je lak za učenje, omogućava mnogo funkcija za pomoć programeru i pogodan je za optimizaciju tehnologije agresivnog kompajlera.

D nije jezik za skriptovanje, niti interpretirani jezik. Ne dolazi sa VM, religijom ili sveobuhvatnom filozofijom. To je praktični jezik za praktične programere koji moraju da završe posao brzo, pouzdano i da za sobom ostave kod lak za razumevanje koji se može održavati.



D je kulminacija decenija iskustva implementacije kompajlera za mnoge različite jezike i pokušavanja da se napravi veliki projekat pomoću tih jezika. D je dobio inspiraciju iz tih drugih jezika (naročito od C++) i ublažio ih pomoću iskustva i praktičnosti stvarnog sveta.

Zašto D?

Zaista, zašto. Kome treba još jedan programski jezik?

Softverska industrija je prešla dug put od kada je izmišljen C jezik. Mnogi novi koncepti su dodati C++ jeziku ali je kompatibilnost unazad sa C jezikom održana uključujući kompatibilnost sa skoro svim slabostima originalnog dizajna. Postojalo je mnogo pokušaja da se poprave te slabosti ali su problemi sa kompatibilnosti frustrirajući. Za to vreme i C i C++ prolaze kroz konstantno gomilanje novih funkcija. Ove nove funkcije se moraju pažljivo uklopiti u postojeću strukturu a da ne zahtevaju ponovno pisanje starog koda. Krajnji rezultat je veoma komplikovan - C standard je skoro 500 strana a C++ standard je oko 750 strana! C++ je težak i skup jezik za implementaciju, koji rezultira implementacijom varijacija koji ga čine frustrirajućim za pisanje potpuno prenosnog C++ koda.

C++ implementuje stvari kao što su nizovi čija se veličina može menjati i nizovi povezani u lanac kao deo standardne biblioteke, a ne kao deo jezgra jezika.

Da li se snaga i sposobnost C++ jezika može ekstrahovati, redizajnirani i pretopiti u jezik koji je jednostavan, ortogonalan i praktičan. Da li se sve to može staviti u paket koji oni koji pišu kompajler mogu pravilno implementirati i koji omogućava kompajlerima da efikasno generišu agresivno optimizovan kod?

Moderna tehnologija kompajlera je napredovala do tačke kada se funkcije jezika mogu izostaviti u svrhu kompanzovanja primitivne tehnologije kompajlera. (Primer ovoga bi bila ključna reč "registar" u C, mnogo suptilniji primer je makro preprocesor u C). Možemo se osloniti na modernu tehnologiju optimizacije kompajlera da im funkcije jezika nisu potrebne da bi se dobio prihvatljiv kvalitet koda za primitivne kompajlere.

Glavni ciljevi dizajna D programskog jezika

Kod dizajniranja jezika sve je u kompromisu. Podsećanje na neke principe će Vam pomoći da napravite prave odluke.

1. Pisanje koda koji se može preneti sa kompajlera na kompajler, sa mašine na mašinu, sa operativnog sistema na operativni sistem je mnogo lakše. Eliminiše nedefinisana i implementacijama definisana ponašanja koliko i praktična.
2. Obezbeđuje sitaktičke i semantičke konstrukte koji eliminišu ili barem smanjuju učestale greške. Smanjuje ili čak eliminiše potrebu za kontrolorima statičkog koda sa strane.
3. Podržava memorijski bezbedno programiranje.
4. Podržava programiranje u više paradigmi, na primer, u imperativnim paradigmama sa minimum podrške, u struktuisanim, objektu orijentisanim, generičkim, pa čak i funkcionalnim programskim paradigmama.
5. Čini da stvari radite kako treba lakše nego da ih radite na pogrešan način.
6. Ima malu krivu učenja za programere koji su navikli na programiranje u C, C++ ili Javi.
7. Obezbeđuje pristup čistom metalu niskog nivoa po potrebi. Obezbeđuje sredstva pomoću kojih iskusan programer može da izbegne proveravanje kad je neophodno.
8.Čini D lakim za primenu kompajlera.
9. Kompatibilan je sa lokalnom C aplikacijom binarnog interfejsa
10. Kada D kod izgleda isto kao C kod to znači da se ili ponašaju isto ili je u pitanju neka greška.
11. Ima gramatiku oslobođenu konteksta. Uspešno raščlanjivanje ne sme sadržati semantičku analizu.
12. Lako podržava pisanje internacionalizovanih aplikacija-
13. Inkorporira Ugovorno programiranje i metodologiju testiranja jedinica.
14. Sposoban je za pravljenje lakih, samostalnih programa.
15. Smanjuje trošak pravljenja dokumentacije.
16. Obezbeđuje dovoljnu semantiku kako bi omogućio napretke u tehnologiji optimizacije kompajlera.
17. Zadovoljava potrebe programera koji se bave numeričkom analizom.
18. Očigledno, ovi ciljevi će se nekad sukobiti. Odluka će ići u prilog korisnosti.

Odlike koje bi trebalo zadržati

D u suštini izgleda kao C i C++. Ovo ga čini lakim za učenje i prebacivanje koda u D. Prelaz iz C/C++ u D bi trebao da bude neprimetan. Programer neće morati da uči od početka kako se stvari rade.

Korišćenje D ne znači da je programer ograničen na specijalnu dužinu trajanja vm (virtual machine) kao kod Java vm ili Smalltalk vm. Ne postoji D vm, to je otvoren kompajler koji generiše fajlove objekata koji se mogu likovati. D se povezuje sa operativnim sistemom baš kao C. Uobičajeni poznati alati kao što je napravi (make) će se lako uklopiti u D razvoj.

  • Opšti izgled i osećaj C/C++ je zadržan. Koristi istu algebarsku sintaksu, većinu istih izraza i formi izjava i opšti lejaut.
  • D programi se mogu pisati ili u C funkciji-i-podacima, C objektno orijentisanom stilu, C++ stilu za metaprogramiranje šablona ili u miksu sva tri.
  • Razvojni model za kompajliranje/linkovanje/debagovanje se nastavlja, iako ništa ne sprečava D da se kompajlira u bajtkod i interpretira.
  • Rukovanje izuzecima. sve više i više iskustva sa rukovanjem izuzecima pokazuje da je to bolji način da se reše greške nego u tradicionalnom C metodu korišćenja kodova grešaka i globala grešaka.
  • Identifikacija tipa dužine trajanja. Ovo je delimično usađeno u C++; u D je odvedeno na novi, logični nivo. Podržavajući je omogućavate bolje sakupljanje otpadaka, bolju debugger podršku, automatizovaniju istrajnost itd.
  • D održava kompatibilnost sa linkom funkcije sa C pozivajućim konvencijama. Ovo omogućava D programima da pristupe API-ju operativnog sistema direktno. Znanje i iskustvo programera sa postojećim programirajućim API-jevima i paradigmama se može preneti i na D uz malo napora.
  • Preopterećenje operatora. D programi mogu preopteretiti operatore omogućavajući nastavak na bazične tipove sa korisnički definisanim tipovima.
  • Metaprogramiranje šablona. Šabloni su način za implementiranje generičkog programiranja. Drugi načini uključuju korišćenje makroa ili dvojak tip podataka. Korišćenje makroa više nije u modi. Dubleti su otvoreni, ali neefikasni i fali im provera kucanja. Teškoća sa C++ šablonima je njihova kompleksnost, oni se ne uklapaju dobro u sintaksu jezika; sva različita pravila za konverzije i preopterećenje su stali na vrh itd. D nudi jednostavniji način pravljenja šablona.
  • RAII (Resource Acquisition Is Initialization). RAII tehnike su osnovna komponenta pisanja pouzdanog softvera.
  • Realistično programiranje. D je zadržao sposobnost za realistično programiranje a da nema potrebu za tim da pravi reference za eksterne module kompajlirane u drugim jezicima. Ponekad je neophodno da usmerite pokazivač ili da se potopite u asembli kada pokušavate da osposobite sisteme. Cilj D jezika nije da spreči realistično programiranje već da smanji potrebu da ga koristite prilikom rešavanja rutinskih zadataka sa kodiranjem.

    Odlike koje ne bi trebalo zadržati

  • C source code kompatibilnost. Poboljšanja C jezika koja održavaju source kompatibilnost su već napravljena (C++ i ObjectiveC). Dalji rad u ovom području je ometen legacy kodom da je malo verovatno da se značajne promene mogu napraviti.
  • Kompatibilnost veze sa C++. C++ model dužine trajanja objekta je previše komplikovan - podržavajući ga nagovestili bismo pravljenje potpunog C++ kompajlera od D jezika.
  • C preprocesor. Makro procesiranje je lak način za proširivanje jezika, dodavanje lažnih odlika koje se zapravo ne nalaze tu (nevidljivih simboličkom debuggeru). Uslovna komplikacija, čiji se slojevi sastoje od #include teksta, makroa, tokena povezanih u lanac itd, u suštini ne formira jedan jezik već dva spojena jezika bez očigledne razlike među njima. Što je još gore (ili bolje) C preprocesor je veoma primitivan makro jezik. Vreme je da se odaljimo, pogledamo za šta se koristi preprocesor i da dizajniramo podršku za te sposobnosti direktno u jezik.
  • Višestruko nasleđe. To je složena odlika diskutabilne vrednosti. Teško je implementirati na efikasan način, a kompajleri su podložni bagovima pri implementiranju. Skoro svim MI vrednostima se može rukovati pomoću jednog nasleđa uparenog sa interfejsima i agregacijom. Ono što preostaje ne opravdava težinu implementacije MI.
  • Imenski prostor. Pokušaj da se nosimo sa problemima koji nastaju povezivanjem nezavisno razvijenih kodova koji imaju komfliktna imena. Ideja o modulima je jednostavnija i bolje radi.
  • Označavanje imenskog prostora. Ova loša odlika C jezika se nalazi tamo gde i oznake imena struktura, u odvojenoj tabeli ali u tabeli sa paralelnim simbolima. C++ je pokušao da spoji prostor za označavanje imena sa regularnim prostorom za ime zadržavajući kompatibilnost unazad sa legacy C kodom. Rezultat je bespotrebno zbunjujuć.
  • Prednje deklaracije. C kompajluje semantički samo znaju o onom što je leksički prethodilo trenutnom stanju. C++ malo proširuje ovo, na taj način da članovi klase mogu da se oslone na prednje referisane članove klase. D dovodi ovo do logičkog zaključka, prednje deklaracije nisu više neophodne na nivou modula. Funkcije se mogu definisati prirodnim predom pre nego tipičnim izvrnutim redom koji se uglavnom koristi u C programima kako bi se izbeglo pisanje prednjih deklaracija.
  • Uključivanje fajlova. Glavni razlog za spore kompajlove kako svaka jedinica za kompilaciju mora da preproda ogromne količine header fajlova. Uključivanje fajlova bi trebalo da bude završeno importovanjem tabele simbola.
  • Trigrafi i digrafi. Unicode je budućnost.
  • Funkcije nevirtuelnih članova. U C++, dizajner klase unapred odlučuje da li će funkcija biti virtuelna ili ne. Česta greška (i teška za naći) pri kodiranju jeste zaboravljanje da se retrofituje funkcija člana osnovne klase da bude virtuelna kada se funkcija obori. Mnogo pouzdanije je da se sve funkcije članova učine virtuelnim i da se kompajler putsti da odluči ukoliko ne postoji više obaranja i stoga se može konvertovati i u nevirtuelnu funkciju.
  • Bit polja arbitrarne veličine. Bit polja su složena, neefikasna odlika koja se retko koristi.
  • Podrška za 16-bitne kompjutere. Pri pravljenju D jezika nije bilo razmatranja mešovitih pokazivača za blizu/daleko i svih mahinacija neophodnih za generisanje dobrog 16-bitnog koda. Dizajn D jezika pretpostavlja barem 32-bitni prostor flat memorije. D će se lako uklopiti u 64-bitnu arhitekturu.
  • Međusobna zavisnost kompajlerskih prolaza. U C++ uspešno raščlanjivanje source teksta se oslanja na tabelu simbola i na različidite komande preprocesora. Ovo onemogućava prethodno raščlanjivanje C++ koda i čini da analizatori za pisanje koda i sintaksom vođene uređivači jedva rade kako treba.
  • Složenost kompajlera. Smanjivanje kompleksnosti implementacije ćini verovatnijim da su višestruke, tačne implementacije dostupne.
  • Pojednostavljena floating point. Ako neko koristi hardver koji implementira modernu floating point, trebalo bi da bude dostupan programeru umesto da floating point podržava pojednostavljivanje do najnižeg zajedničkog imenioca među mašinama. U suštini D implementacija mora da podržava IEEE 754 aritmetiku i ako je proširena preciznost dostupna ona mora biti podržana.
  • Preopterećenje šablona < and > simbolima. Ovo je godinama izazivalo bagove, očaj i zbunjenost među programerima, C++ realizatorima i prodavcima C++ alata za raščlanjivanje izvora. Nemoguće je da raščlanite C++ kod korektno a da ne uradite skoro ceo C++ kompajler. D koristi !( and) koji se lepo i nedvosmisleno uklapa u gramatiku.

    Kome je D namenjen?

  • Programerima koji rutinski koriste lint ili slične alate za analiziranje koda kako bi eliminisali bagove pre nego što se kod kompajlira.
  • Ljudima koji kompajluju sa uključenim nivoima maksimalnog upozorenja koji daju instrukcije kompajleru da tretira upozorenje kao greške.
  • Programerskim menadžerima koji su primorani da se oslone na smernice u stilu programiranja kako bi izbegli učestale C bagove.
  • Onima koji smatraju da obećanje o C++ objektno orijentisanom programiranju nije održano zbog kompleksnosti.
  • Programerima koji uživaju u ekspresivnoj moći C++, ali koji su frustrirani potrebom za ulaganjem velikog truda u rukovanje memorijom i za nalaženjem bagova sa pokazivačima.
  • Projektima kojima je potrebno ugrađeno testiranje i verifikacija.
  • Timovima koji pišu aplikacije sa milion linija koda.
  • Programerima koji misle da bi jezik trebalo da obezbedi dovoljno odlika da otkloni konstantnu potrebu za direktnim kontrolisanjem pokazivača.
  • Numeričkim programerima. D ima mnogo odlika da direktno podrži odlike koje trebaju numeričkim programerima, kao što je proširena preciznost floating pointa, podrška jezgra za kompleksne i imaginarne floating tipove i definisano ponašanje za NaN-ove i beskonačnosti (Ovo je dodato u novom C99 standardu, ali ne i u C++).
  • Programerima koji pišu pola svojih aplikacija u skriptovanim jezicima kao što je Ruby i Python, a drugu polovinu u C++ da bi ubrzali protok. D ima mnogo produktivnih odlika Ruby-ja i Python-a, što ga čini dovoljnim za pisanje jedne aplikacije u samo jednom jeziku.
  • D leksički analizator i raščlanjivač su potpuno nezavisni jedan od drugog i od semantičkog analizatora. Ovo znači da je lako da napišete jednostavne alate da biste manipulisali D kodom perfektno a da ne morte da napravite čitav kompajler. To takođe znači da source code može da bude prenet u tokenizovanu formu za specijalizovane aplikacije.

    Kome D nije namenjen?

  • Budimo realni, niko neće da prebaci milion linija C ili C++ programa u D. Budući da D ne kompajluje nemodifikovani C/C++ source code, D nije za legacy aplikacije. (Pa ipak, D podržava legacy C API-jeve sasvim dobro. D može da se direktno poveže sa bilo kojim kodom koji izlaže C interfejs).
  • Ko prvi programski jezik, Basic ili Java su bolji za početnike. D je odličan drugi jezik za srednji ili viši nivo programiranja.
  • Jezičke čistunce. D je praktični jezik i svaka njegova odlika je evaluirana u tom svetlu a ne prema idealu. Na primer, D ima konstrukte i semantiku koji virtuelno eliminišu potrebu za pokazivačima za uobičajene zadatke. Ali pokazivači su još tu, jer se pravila ponekad moraju kršiti. Slično tome, kalupi su još uvek tu za ona vremena kada se mora odobriti sistem kucanja.

    Glavne odlike D jezika

    Ovaj odeljak daje listu najinteresantnijih odlika D jezika u različitim kategorijama.

    Objektno orijentisano programiranje

    Klase

    Objektno orijentisana priroda D jezika dolazi od klasa. Model nasleđa je popravljen sa interfejsima. Klasa objekta stoji u korenu hijerarhije nasleđa tako da sve klase usašuju zajednički set funkcionalnosti. Klase su instance po referenci, te nije potrebno da kompleksni kod čisti za izuzecima.

    Preopterećenje operatora

    Klase se mogu napraviti da rade sa postojećim operaterima da bi proširile sistem tipa u cilju podržavanja novih tipova. Primer bi bio pravljenje bignumber klase i preopterećenje iste sa +, -, * i / operaterima kako bi se omogućilo korišćenje obične algebarske sintakse sa njima.

    Funkcionalno programiranje

    Funkcionalno programiranje ima mnogo šta da ponudi u terminima enkapsulacije, istovremenog programiranja, bezbednosti memorije i kompozicije. Podrška D jezika za funkcionalne stilove programiranja uključuje:

  • Čiste funkcije
  • Postojane strukture tipova i podataka
  • Lambda funkcije i zatvaranje

    Produktivnost

    Moduli

    Source fajlovi imaju jedan-na jedan korespondenciju sa modulima. Umesto #include'ing teksta fajla deklaracije, samo ubacite modul. Nemojte da brinete o višestrukim unosima istog modula, nije potrebno da uvijate header fajlove uz pomoć #ifndef#endif ili #pragma once klugdes itd.

    Deklaracija nasuprot definiciji

    C++ obično zahteva da se funkcije i klase deklarišu dva puta - deklaracija koja ide u .h zaglavlje fajla i definicija koja ide u .c izvor fajla. Ovo je podložno greškama i dosadan je proces. Očigledno, programer bi trebalo da ga napiše samo jednom, a kompajler bi potom trebalo da otpakuje informaciju o deklaraciji i da je učini dostupnom za simbolički unos. Ovako radi D.

    Primer:
    class ABC
    {
        int func() { return 7; }
        static int z = 7;
    }
    int q;
    


    Ne postoji više potreba za odvojenim definicijama funkcija članova, statičnih članova, eksternala ili smotanih sintaksi kao što je:
    int ABC::func() { return 7; }
    int ABC::z = 7;
    extern int q;
    


    Napomena: Naravno, u C++ trivijalne funkcije kao što je { return 7; } su napisane unutar linije takođe, ali kompleksnije nisu. Pored toga, ako postoji bilo kakva naredna referenca, funkcije moraju biti prototipovane. Ovo neće raditi u C++:
    class Foo
    {
        int foo(Bar *c) { return c->bar(); }
    };
    
    class Bar
    {
      public:
        int bar() { return 3; }
    };
    


    Ali će identičan D kod raditi:
    class Foo
    {
        int foo(Bar c) { return c.bar; }
    }
    
    class Bar
    {
        int bar() { return 3; }
    }
    


    Bez obzira na to da li se D funkcija nalazi unutar linije ili nije određena podešavanjima optimizera.

    Šabloni

    D šabloni nude čist pristup za podržavanje generičkog programiranja dok daju snagu parcijalne specijalizacije. Klase šablona i funkcije šablona su dostupne zajedno sa variadic argumentima šablona i tupleima.

    Asocijativni redovi

    Asocijativni redovi su redovi sa arbitrarnim tipom podataka kao indeksom umesto što su ograničini indeksom celih brojeva. U suštini, asocijativni redovi su papazjanija od tabela. Asocijativni redovi omogućavaju lako građenje i efikasne tabele simbola bez bagova.

    Dokumentacija

    Dokumentacija se tradicionalno radi dva puta - na prvom mestu postoje komentari koji dokumentuju šta funkcija radi, a potom se ovo prepisuje u odvojeni html ili na glavnu stranicu. I prirodno, s vremenom, oni će pokušati da se odvoje sa ažuriranjem koda, dok se odvojena dokumentacija ne odvaja. Sposobnost da se generiše neophodna uglađena dokumentacija direktno iz komentara koji su ugrađeni u izvor neće samo duplo uštedeti vreme potrebno za pripremu dokumentacije, već će i olakšati čuvanje dokumentacije u sync zajedno sa kodom. Ddoc je specifikacija za generator D dokumentacije. Ova stranica je generisana pomoću Ddoc-a, takođe.

    Iako third party alati za pravljenje ovoga postoje u C++, oni imaju neke ozbiljne mane:

  • Začuđujuće je teško raščlaniti C++ 100% korektno. Ovo zahteva pun C++ kompajler. Third party alati raščlanjuju samo subset C++ tačno, tako da će njihova upotreba ograničiti source code na taj subset.
  • Različiti kompajleri podržavaju različite verzije C++ i imaju različite dodatke za C++- Third party alati imaju problem sparivanje svih ovih varijacija.
  • Third party alati mogu biti nedostupni za sve željene platforme i oni su nužno na drugom ciklusu ažuriranja od kompajlera.
  • To što je ugrađen u kompajler znači da je standardizovan za sve D implementacije. Ukoliko je jedan spreman svaki put znači da je verovatnije da će biti korišćen.

    Funkcije

    D ima očekivanu podršku za uobičajene funkcije koje uključuju globalne funkcije, preopterećene funkcije, poravnanje funkcija, funkcije članova, virtuelne funkcije, pokazivače funkcija itd. Pored toga:

    Umetnute funkcije

    Funkcije mogu biti umetnute u druge funkcije. Ovo je veoma korisno za faktorisanje koda, lokalitet i tehnike funkcije zatvaranja.

    Literali funkcije

    Anonimne funkcije se mogu ugraditi direktno u ekspresiju.

    Dinamička zatvaranja

    Na umetnute funkcije i funkcije klasa članova mogu se praviti reference sa zatvaranjem (koje se takođe zovu delegati), čineći generičko programiranje lakšim i kucanje bezbednim.

    Unutrašnji, spoljašnji i referentni parametri

    Ne samo da specifikovanje ovog pomaže da se funkcije lakše samodokumentuju, nego i eliminiše većinu potrebe za pokazivačima a da se ništa ne mora žrtvovati zauzvrat, dok pored toga otvara mogućnosti za više pomoći kompajlera u nalaženju problema sa kodiranjem.
    To omogućava D jeziku da se direktno suoči sa širim spektrom stranih API-jeva. Ne postoji potreba za rešenjima kao što su "Jezici definicije interfejsa".

    Redovi

    C redovi imaju nekoliko grešaka koje mogu biti ispravljene:

  • Informacija dimenzije se ne prenosi sa redom, te se mora posebno pohraniti i preneti. Klasičan primer ovoga su argc i argv parametri za glavni (int argc, char *argv[]). (U D jeziku, glavni je deklarisan kao glavni(char[][] args).)
  • Redovi nisu objekti prve klase. Kada se red prenese u funkciju on se konvertuje u pokazivač, iako nas prototip zbunjuje time što kaže da je to red. Kada se ovo pretvaranje dogodi, informacije reda se izgube.
  • C redovi ne mogu promeniti svoju veličinu. Ovo znači da se čak i proste grupe kao što je stek moraju konstruisati kao složena klasa.
  • Provera granica se ne može sprovesti nad C redovima, jer oni ne znaju šta su granice redova.
  • Redovi se ograničavaju pomoću [] nakon identifikatora. Ovo vodi tome da veoma nespretna sintaksa deklariše stvari kao pokazivač reda.
    int (*array)[3];
    


    U D jeziku, [] za red ide sa leve strane:
    int (*array)[3];
    


    što je mnogo jednostavnije za razumevanje.

    D redovi dolaze u nekoliko različitih varijanti: pokazivači, statični redovi, dinamični redovi i asocijativni redovi.

    Vidi Redovi.

    Niske

    Manipulacija niskama je tako učestala i tako nespretna u C i C++ da joj treba direktna podrška u jeziku. Savremeni jezici se nose sa povezivanjem niski u lanac, kopiranjem itd, pa to nije izuzetak sa D jezikom. Niske su direktna posledica poboljšanog upravljanja redovima.

    Upravljanje izvorima

    Upravljanje automatskom memorijom

    Raspodela D memorije je u potpunosti prikupljeno smeće. Iskustvo pokazuje da je dosta komplikovanih odlika C++ jezika neophodno kako bi se upravljalo čišćenjem memorije. Sa kolekcijom smeća, jezik postaje jednostavniji.

    Postoji viđenje da je kolekcija smeća za lenje programere početnike. Sećam se kad su to rekli za C++, pa ipak, ne postoji ništa u C++ što se ne može uraditi u C ili u asembleru.

    Kolekcija smeća eliminiše dosadni, greškama podložni kod za praćenje raspodele memorije koji je neophodan u C i C++. Ovo ne znači samo brže vreme razvoja i niže troškove održavanje već i to da se rezultirajući program često pokreće brže!

    Naravno, prikupljači smeća se mogu koristiti pomoću C++, a ja sam ih koristio u svojim C++ projektima. Jezik nije prijateljski nastrojen prema prikupljačima i preti efikasnosti jezika. Većina runtime library koda ne može biti korišćena sa prikupljačima. Za kompletnu diskusiju o ovome, pogledajte kolekciju smeća.

    Upravljanje eksplicitnom memorijom

    Iako je D jezik prikupljanog smeća, operacije “novo” i “obriši” se mogu poništiti za određene klase tako da se uobičajeni delitelj može koristiti.

    RAII

    RAII je savremena tehnika razvoja softvera koja se koristi za upravljanje raspodelom izvora i čišćenjem. D podržava RAII na kontrolisan, predvidljiv način koji je nezavistan od ciklusa kolekcije smeća.

    Performanse

    Grupe lake kategorije

    D podržava jednostavnu strukturu C stila i zbog kompatibilnosti sa C strukturom podataka i zato što je korisna kada je puna moć klasa uništenje.

    Asembler unutar reda

    Drajveri uređaja, visoke performanse aplikacija sistema, ugrađeni sistemi i specijalizovani kodovi ponekad moraju da zarone dublje u asemblerski jezik kako bi se posao uradio. Dok izvršenja D jezika nisu neophodna za ispunjenje asemblera unutar reda, to je definisano i predstavlja deo jezika. Mnoge potrebe asemblerskog koda se mogu izvršiti na taj način otklanjajući potrebu za odvojenim asemblerima ili DLL-ovima.

    Mnoga izvršenja D jezika će takođe podržati intrinzičke funkcije analogno sa C podrškom intrinsic-a za upravljanje I/O portom, direktan pristup specijalnim plutajućim operacijama pokazivanja itd.

    Pouzdanost

    Moderni jezik bi trebalo da uradi sve što je u njegovoj moći da pomogne programeru da se oslobodi bagova u kodu. Pomoć može doći u mnogim oblicma, od pomaganja u pravljenju robustnijih tehnika preko klonutosti kompajlera očigledno neispravnih kodova do provere dužine trajanja.

    Ugovori

    Kontraktno programiranje (koje je izumeo B. Mejer) je revolucionarna tehnika za pomoć u proveravanju ispravnosti programa. Verzija D jezika DBC-a uključuje preduslove funkcije, ishode, invarijante klasa i ugovorne tvrdnje. Pogledajte Ugovore za D implementaciju.

    Testiranje jedicina

    Testiranje jedinica se može dodati klasi, tako da se to automatski pokreće po pokretanju programa. Ovo pomaže u verifikaciji u svakoj građi da implementacije nisu neadekvatne. Testiranje jedinica formira deo source koda za klasu. Kreiranje ovog postaje deo procesa razvoja klasa što je u suprotnosti sa bacanjem završenog koda preko ograde grupi za testiranje.

    Testiranje jedinica se može vršiti u drugim jezicima, ali rezultat nije dobar i jezici se ne mogu navići na to. Testiranje jedinica je glavna odlika D jezika. To odlično funkcioniše za funkcije biblioteke, garantujući da će funkcije zapravo raditi i ilustrujući upotrebu funkcija.

    Imajte na umu da su mnogi C++ kodovi bibilioteke i aplikacija dostupni za preuzimanje na internetu. Koliko njih zapravo dolazi sa *bilo kakvim* verifikacionim testovima i testiranjem jedinica? Manje od 1%? Praksa je da ako se kompajluje, verovatno će raditi. A mi se pitamo da li su upozorenja koje kompajler izbacuje u procesu pravi bagovi ili nešto sasvim nebitno.

    Zajedno sa kontraktnim programiranjem, testiranje jedinica čini D daleko najboljim jezikom za pisanje pouzdanih, robustnih aplikacija. Testiranje jedinica nam takođe omogućava brzu procenu kvaliteta nekih nepoznatih delova D koda koji su nam preostali - ako nema testiranje jedinica i nema ugovora, to je neprihvatljivo.

    Atributi i izjave debug-a

    Debug je sada deo sintakse jezika. Kod se može omogućiti ili onemogućiti u vremenu kompajliranja, bez upotrebe makroa ili komandi preprocesiranja. Sintaksa debug-a omogućava konzistentno, prenosivo i razumljivo prepoznavanje da pravi source kod mora da bude sposoban da generiše i komplikacije debug-a i kompilacije oslobađanja.

    Upravljanje izuzecima

    Superiorni try-catch-finally (probaj-uhvati-napokon) model se koristi umesto običnog try-catch. Ne postoji potreba za kreiranjem lutki da bi destruktor implementirao finally semantiku.

    Sinhrnonizacija

    Multihreaded programiranje postaje sve više i više popularno, a D obezbeđuje primitive kako bi se napravili multihreaded programi. Sinhronizacija se može obaviti na bilo koji način ili na bilo kom nivou objekta.
    synchronized int func() { ... }
    

    Funkcije sinhronizacije omogućavaju samo jednoj stvari da izvrši funkciju u datom trenutku.

    Izjava sinhronizacije stavlja mutex oko bloka izjava, kontrolišući pristup ili pomoću objekata ili globalno.

    Podrška za robustne tehnike

  • Dinamički redovi umesto pokazivača
  • Referentne varijable umesto pokazivača
  • Referentni objekti umesto pokazivača
  • Kolekcija smeća umesto upravljanja eksplicitnom memorijom
  • Ugrađeni primitivi za sinhronizaciju tema
  • Nema makroa koji će nemarno zatvoriti kod
  • Funkcije unutar reda umesto makroa
  • Veoma smanjena potreba za pokazivačima
  • Veličina tipa integrala su eksplicitne
  • Ne postoji neizvesnost oko signedness-a karaktera
  • Ne postoji potreba za dupliranjam deklaracija u fajlovima izvora i zaglavlja
  • Eksplicitna podrška za raščlanjivanje u svrhu dodavanja debug koda

    Provere vremena kompajliranja

  • Jača provera kucanja
  • Nema praznih ; za petlje
  • Zadaci ne daju buleanske rezultate
  • Osuđivanje zastarelih API-jeva

    Provera dužine trajanja
  • assert() izrazi
  • provera veza među redovima
  • nedefinisan slučaj u slučaju zamene
  • izuzetak “nedostatka memorije”
  • podrška kontraktnog programiranja za invarjiante unutra, izvan i klase

    Kompatibilnost

    Prvenstvo operatora i pravila evaluacije

    D zadržava C operatore i njihova pravila prvenstva, naređenje pravila evaluacije i pravila unapređivanja. Ovo omogućava izbegavanje suptilnih bagova koji se mogu stvoriti zbog naviknutosti na način na koji C radi stvari te osoba ima problema da nađe greške usled različite semantike.

    Direktan pristup API-jevima C jezika

    Ne samo da D ima tipove podataka koji odgovaraju C tipovima, on omogućava direktan pristup C funkcijama. Ne postoji potreba za pisanjem omotača funkcija, swizzlera parametara niti koda za kopiranje grupisanih članoga jednog po jednog.

    Podrška za sve tipove C podataka

    Čini mogućim da se interfejsuje bilo koji C-ov API ili postojeći C kod biblioteke. Ova podrška uključuje strukture, unije, enume, pokazivače i sve C99 tipove. D uključuje sposobnost da postavi poravnanje članova strukture kako bi se osigurala kompatibilnost sa eksterno nametnutim formatima podataka.

    Rukovanje izuzecima OS-a

    Mehanizam rukovanja izuzecima u D jeziku će se povezati sa načinom na koji se operativni sistem nosi sa izuzecima u aplikaciji.

    Koristi postojeće alate

    D stvara kod u formatu standardnog fajla objekta, omogućavajući korišćenje standardnih asemblera, linkera, debagera, profila, exe kompresora i drugih analizatora, kao i linkovanje koda napisanog u drugim jezicima.

    Upravljanje projektom

    Verzioniranje

    D omogućava ugrađenu podršku za generaciju višestrukih verzija programa iz istog teksta. On zamenjuje C preprocesor #if/#endif tehnike.

    Negodovanje

    Dok kod evoluira vremenom, neki stari kod biblioteke se zamenjeju novim, boljim verzijama. Stare verzije moraju biti dostupne za podršku legacy kodu, ali se mogu označiti kao negovane. Kod koji koristi negodovane verzije će biti normalno označen kao nelegalan, ali će biti omogućen zamenom kompajlera. Ovo čini lakim za programere koji održavaju da identifikuju zavisnost na negodovanim funkcijama.

    Primer D programa (sieve.d)
    /* Sieve of Eratosthenes prime numbers */
    
    import std.stdio;
    
    bool[8191] flags;
    
    int main()
    {
        int i, count, prime, k, iter;
    
        writefln("10 iterations");
        for (iter = 1; iter <= 10; iter++)
        {
            count = 0;
            flags[] = 1;
            for (i = 0; i < flags.length; i++)
            {
                if (flags[i])
                {
                    prime = i + i + 3;
                    k = i + prime;
                    while (k < flags.length)
                    {
                        flags[k] = 0;
                        k += prime;
                    }
                    count += 1;
                }
            }
        }
        writefln("%d primes", count);
        return 0;
    }
    




  • Published (Last edited): 27-07-2016 , source: https://dlang.org/overview.html