D (programozási nyelv)

Az oldal jelenlegi verzióját még nem ellenőrizték tapasztalt közreműködők, és jelentősen eltérhet a 2020. március 31-én felülvizsgált verziótól ; az ellenőrzések 22 szerkesztést igényelnek .
D
Szemantika több paradigma : imperatív , objektumorientált , funkcionális , szerződés [1] , általános programozás
Nyelvóra objektumorientált programozási nyelv , procedurális programozási nyelv , funkcionális programozási nyelv , általános programozási nyelv , párhuzamos programozási nyelv [d] , többparadigmás programozási nyelv , kötelező programozási nyelv , fordított programozási nyelv és programozási nyelv
A végrehajtás típusa összeállított
Megjelent 2001
Szerző Walter Bright , Andrei Alexandrescu
Fejlesztő Bright, Walter és a D Nyelvi Alapítvány [d]
Fájlkiterjesztés _ .d, .dd, .divagy.def
Kiadás 2.100.2 [2]  ( 2022. szeptember 10. )
Típusrendszer szigorú, statikus, típuskövetkeztetéssel
Főbb megvalósítások Digital Mars D (referencia megvalósítás) , LDC , GDC
Befolyásolva C , C++ , Python , Ruby , C# , Java , Eiffel
befolyásolta MiniD , DScript , Vala , Qore , Swift , Genie
Weboldal dlang.org
 Médiafájlok a Wikimedia Commons oldalon

A D ( Di ) egy több paradigmát tartalmazó statikusan tipizált lefordított programozási nyelv , amelyet Walter Bright , a Digital Mars készített . 2006 óta Andrei Alexandrescu is társszerző . A D a C++ nyelv leszármazottja , de ahhoz képest jelentősen javult. Számos fogalmat kölcsönzött a Python , Ruby , C# , Java , Eiffel programozási nyelvekből is .

A D elérhető Windows, Linux, macOS, FreeBSD operációs rendszerekhez. Dolgoznak az Android rendszerre történő portoláson [3] .

Történelem

A. Alexandrescu A D programozási nyelv című könyvének előszavában Walter Bright azt írja, hogy 1999-ben kezdte fejleszteni ezt a nyelvet. A projekt a C++ nyelv újratervezéseként készült , hogy megszabaduljon az eredeti nyelv legjelentősebb hiányosságaitól, és modern építészeti megoldásokat vezessen bele. A D nyelv létrehozásakor arra törekedtek, hogy a lefordított programozási nyelvek teljesítményét a dinamikus nyelvek biztonságával és kifejezőképességével kombinálják .

Kezdetben a szerző a nyelvet "Mars"-nak szánta, de a C ++-val kapcsolatos folytonosság miatt a nyelvet a megbeszélések során folyamatosan "D"-nek nevezték, ennek eredményeként ezt a nevet rendelték hozzá a projekthez.

A stabil fordító 1.0-s verziója 2007. január 2-án jelent meg [4] . Nem sokkal a fordítóprogram 2007. június 17-i megjelenése után a szerző az 1-es verziót támogatási módba kapcsolta, és elkezdte fejleszteni a 2.0-s verziót, amely kezdetben nem garantálta a visszafelé kompatibilitást [5] . Ezt a verziót (az eddigi utolsó D-dúr verziót) a mai napig fejlesztik.

Nyelvi áttekintés

A D nyelv számos szintaktikai funkciót és koncepciót valósít meg, amelyek nem találhatók meg a C++-ban: szerződéses programozás , beépített egységtesztek , modulok fejlécfájlok helyett (C++20 előtt), szemétgyűjtés támogatása (a kézi memória rendelkezésre állásának fenntartása mellett) menedzsment), beépített asszociatív tömbök, lezárások , névtelen funkciók , a sablonozó motort jelentősen átalakították.

Szintaxis

A D a C-szerű nyelvek családjába tartozik, általánosságban a szintaxisa hasonló a C/C++/C#-hoz, Java-hoz. Egy nyelv fejlesztése során betartjuk az elvet: a C-ben és D-ben egyaránt érvényes kódnak ugyanúgy kell viselkednie.

Helló világ! » D-nek:

import std . stdio ; void main () { writeln ( "Szia, világ!" ); }

Csakúgy, mint a C-ben, a függvény main()egy belépési pont.

A if, for, while, konstrukciók do-whilea C/C++-hoz hasonlóan néznek ki és működnek. A feleletválasztós utasítás switcha C++-hoz hasonlóan néz ki, de engedélyezi a változókat az ágcímkékben, caseés megköveteli, hogy minden ágnak vagy -re kell casevégződnie ; az aktuális feldolgozása után a következő ágra lépéshez a speciális konstrukciót kell használnia . Tilos az elágazás nélküli építmények is . breakreturngoto caseswitchdefault

A további vezérlőstruktúrák közül megjegyezhető static if - egy utasítás a feltételes fordításhoz (a feltételt statikusan ellenőrzik, és a kódban a megfelelő ág tartalma szerepel), a teljes feleletválasztós operátor final switch - a szokásostól switcheltérően csak értékekkel működik enum, és a fordító statikusan ellenőrzi, hogy a választás minden lehetséges opciót figyelembe vesz-e, és ellenkező esetben hibát ad-e. Van egy gyűjtőhurok is foreach.

Modularitás

A D beépített rendszerrel rendelkezik a program modulokra (csomagokra) felosztására, amely külön fordítást és ellenőrzött import-exportot biztosít. A csomagrendszer a Java vagy a Go rendszeréhez hasonlít: a csomagok hierarchikus struktúrát alkotnak, amely természetesen a fájlrendszerfához illeszkedik. A C++-tól eltérően a D-nek nincs globális névtér, minden név egy csomagban van definiálva. Az utasítás segítségével importegy programmodul importálhat egy csomagot, elérhetővé téve az abban található összes definíciót. Az importált nevek a következő minősítéssel érhetők el: " имя_пакета.имя_объекта".

A nyelv számos eszközt biztosít az importált nevek kényelmes munkavégzésére. Lehetőség van az importálás során a csomag átnevezésére, az importált csomag alternatív nevének (alias) beállítására, konkrét nevek importálására. Ezenkívül a nyelv további utasítások nélkül lehetővé teszi az importált nevek használatát, a csomagnév minősítése nélkül. Van azonban egy korlátozás: ha egynél több egyező definíció található a programban a hatókörben, a fordító hibát fog kiütni, és megköveteli a név kifejezett minősítését. Ez megakadályozza az úgynevezett "néveltérítést", amikor egy új csomag hozzáadásakor a fordítóprogram egy bizonyos nevet a programban a korábban társított definíciótól eltérő definícióval kezd társítani.

Univerzális függvényhívás szintaxis (UFCS)

A D megvalósítja az UFCS (Uniform function call syntax) mechanizmust, amely lehetővé teszi bármely objektum függvényeinek meghívását, mintha azok a metódusai lennének. Például:

import std . stdio ; import std . algoritmus ; import std . tömb ; void main () { auto a = [ 2 , 4 , 1 , 3 ]; // mindhárom alábbi helyes, és ugyanazt az írást ( a ) végzi; // "klasszikus" C-szerű változata a . írva (); // a függvényt úgy hívják, mintha az "a" objektum metódusa lenne, bár nem a . írva ; // A paraméterek nélküli függvény zárójelek nélkül is meghívható // ez lehetővé teszi a funkcionális nyelvekre jellemző hívási láncok használatát int [] e = a . rendezés (). fordított ; // többsoros láncolás is lehetséges stdin . byLine ( KeepTerminator . igen ) . térkép !( a => a . idup ) . tömb . rendezés ; }

Funkció attribútumok

A D-beli függvények további opcionális attribútumokkal definiálhatók, amelyek lehetővé teszik e függvények viselkedésének bizonyos aspektusainak explicit megadását. Például a pure attribútummal jelölt függvény garantáltan funkcionálisan tiszta (bizonyos kikötésekkel) [6] . A funkcionális tisztaságot a fordításkor ellenőrzik. Példa egy attribútummal rendelkező függvénydeklarációra:

tiszta int összeg ( int első , int második ) { return első + második ; } int sum ( int first , int second ) pure // attribútumok az argumentumlista után is megadhatók { return first + second ; }

Példák a függvényattribútumokhoz:

  • tiszta - funkcionális tisztaság
  • @safe – a memória biztonságos működésének garanciája
  • nothrow - a funkció garantáltan nem dob kivételeket
  • @nogc - garantálja, hogy a függvény nem tartalmaz olyan műveleteket, amelyek memóriát foglalnak le a szemétgyűjtőn
  • A @property egy osztálymetódus attribútuma, amely elkerüli a "naiv" getter-beállítók használatát

Párhuzamos számítástechnika

A nyelv rendelkezik egy beépített mechanizmussal párhuzamos részfolyamatok elindítására beépített függvény segítségével, spawn()valamint adatcserét párhuzamosan végrehajtott kódrészletek között üzenetek (függvények send()és receive()/ receiveTimeout()) átadásával. Az üzenetküldés használatát a D szerzői előnyösebbnek tartják, mint az osztott memórián keresztüli adatcserét.

Azonban azokban az esetekben, amikor ez szükséges (például nagy mennyiségű adat átvitelekor a korutinok között), lehetőség van a megosztott memóriaterületekkel rendelkező kötelező nyelvek hagyományos megközelítésére, valamint a szemaforokon és mutexeken keresztüli szinkronizáláshoz . Egy ilyen csere támogatásához:

  • módosító használatával a sharedszálak között megosztott adatok deklarálhatók, míg az adatokkal való nem atomi műveletekkel való munkavégzés a fordító szintjén blokkolva van;
  • a nyelvi könyvtár szabványos szinkronizálási primitíveket biztosít;
  • a nyelvi könyvtár speciális zárolási osztályokat biztosít, amelyeket a környezet zárolásához használnak : egy ilyen osztály példányának deklarálása egy metódusban szinkronizálja a kódot attól a ponttól a metódus végéig;
  • a szinkronizált módosítóval egy egész osztályt szinkronizáltnak deklarálhatunk : ennek az osztálynak az összes metódusát a fordító automatikusan szinkronizálja, így nem lehet kettő párhuzamosan végrehajtani egy megosztottként deklarált osztály ugyanazon példányára.

Az összes beépített szinkronizálási eszköz esetében a fordító automatikusan figyeli és tiltja a nem megosztott adatok megváltoztatására irányuló kísérleteket a szinkronizált kódon belül, amelyhez több szál is hozzáfér.

Beépített egységtesztek

A D-ben az egységtesztek a nyelv részét képezik, és további könyvtárak vagy keretrendszerek nélkül használhatók.

import std . stdio ; int első ( int [] arr ) { return arr [ 0 ]; } unittest { int [] arr1 = [ 1 , 2 , 3 ]; int [] arr2 = [ 10 , 15 , 20 ]; assert ( first ( arr1 ) == 1 ); assert ( első ( arr2 ) == 10 ); } érvénytelen () { // ... }

Programozási paradigmák

A D öt fő programozási paradigmát valósít meg – kötelező , OOP , metaprogramozás , funkcionális programozás és párhuzamos számítástechnika ( aktor modell ).

Memóriakezelés

A D szemétgyűjtőt használ memóriakezelésre, azonban kézi vezérlés is lehetséges operátori túlterhelés newés delete, valamint malloc és free használatával , hasonlóan a C-hez. A szemétgyűjtő manuálisan be- és kikapcsolható, memória bővíthető és eltávolítható. a láthatóságtól, a részleges vagy teljes összeszerelési folyamat elindítását. Van egy részletes kézikönyv , amely leírja a különböző memóriakezelési sémákat a D-ben azokra az esetekre, amikor a szabványos szemétgyűjtő nem alkalmazható.

SafeD

A SafeD a D nyelv egy részhalmazának neve, amelynek használata garantálja a memória-hozzáférés biztonságát .

Adattípusok

A nyelv definiált adattípusok gazdag készletével és lehetőségekkel rendelkezik az új típusok meghatározásához. A D nyelvben a típusok értéktípusokra és hivatkozási típusokra oszthatók.

Alaptípusok

Az alaptípusok halmaza a következő kategóriákra osztható [7] :

  • void - speciális típus üres értékekhez
  • bool - logikai típusú
  • egész típusok: előjeles byte, short, int, longés a hozzájuk tartozó előjel nélküli ubyte, ushort, uint,ulong
  • lebegőpontos típusok: float, double, real. A lebegőpontos típusokhoz léteznek megfelelő változatok az imaginárius és komplex számokhoz:
    • képzeletbeli: ifloat, idouble,ireal
    • komplex: сfloat, сdouble,сreal
  • jel (karakter) típusok: char, wchar, dchar, UTF-8, UTF-16 és UTF-32 kódolású kódegységeket jelölve.

A C++-tól eltérően az egész típusok minden méretét a specifikáció határozza meg. Vagyis az int típus mindig 32 bites lesz. Az egész literálokat decimálisan, binárisan (0b előtaggal) és hexadecimálisan (0x előtaggal) írhatjuk. Az oktális (vagyis 0 előtagú) literálok C-stílusú jelölését eltávolítottuk, mivel az ilyen jelöléseket könnyű összetéveszteni a decimálissal. Ha továbbra is az oktális rendszert kell használnia, használhatja az std.conv.octal sablont .

Származtatott típusok
  • pointer - mutató
  • array - tömb
  • associative array - asszociatív tömb
  • function - funkció
  • delegate - küldött
  • string, wstring, dstring kényelmes álnevek az előjeles (karakteres) típusú megváltoztathatatlan tömbökhöz immutable(char)[], immutable(wchar)[]és immutable(dchar)[]a megváltoztathatatlan ( változhatatlan minősítő ) Unicode karakterláncokat jelölik az UTF-8, UTF-16 és UTF-32 kódolások egyikében.
Egyéni típusok
  • alias - álnév
  • enum - felsorolás
  • struct - szerkezet
  • union - egyesület
  • class - Osztály
Típuskövetkeztetés, kulcsszavak "auto", "typeof" és névtelen ("Voldemort") típusok

A D típuskövetkeztetési mechanizmussal rendelkezik. Ez azt jelenti, hogy a típus általában a fordítási időben számítható, és nem kell kifejezetten megadni. Például a: kifejezés a következőre auto myVar = 10lesz konvertálva int myVar = 10. A típuskövetkeztetésnek számos előnye van:

  • Tömörebb és olvashatóbb kód, különösen, ha hosszú szerkezet- vagy osztályneveket használ. Például a kifejezés

VeryLongTypeName var = VeryLongTypeName(/* ... */);

helyettesíthető

auto var = VeryLongTypeName(/* ... */);

  • A typeof kulcsszó használatával létrehozhat egy olyan változót, amely ugyanolyan típusú, mint egy meglévő változó, még akkor is, ha a típusa ismeretlen. Példa:
// fájl1.d int var1 ; // file2.d typeof ( var1 ) var2 ; // A var2 int típust kap
  • névtelen típusok használata. Példa:
// A függvény valójában TheUnnameable típusú eredményt ad vissza, de mivel ez a típus a függvényen belül van definiálva, // nem tudjuk kifejezetten visszatérési típusként beállítani. // A visszatérési típust azonban beállíthatjuk "auto"-ra, így a fordító maga találja ki azt auto createVoldemortType ( int value ) { struct TheUnnameable { int getValue () { return value ; } } return TheUnnameable (); }

A névtelen típusokat informálisan Voldemort-típusoknak nevezik, Voldemort ( "He-Who-Must-Not-Be-Meed"), a Harry Potter-sorozat fő antagonistája után [8] . A típuskövetkeztetést nem szabad összetéveszteni a dinamikus gépeléssel , mert bár a típus nincs kifejezetten megadva, a számítás a fordítási, nem pedig a futási időben történik.

Megvalósítások

  • DMD  - Digital Mars D ( VIKI ), Walter Bright által kifejlesztett referencia-fordító. Ez a fordító valósítja meg legteljesebben a nyelvi szabványt, minden újítás támogatása első helyen jelenik meg benne. A front end és a back end ( [1] ) a Boost licenc alatt kerül terjesztésre .
  • LDC  – DMD ( WIKI ) – kezelőfelület az LLVM -hez ( SITE )
  • GDC  - DMD ( VIKI ) - front-end a GCC fordítóhoz
  • LDC iOS-hez  – LDC-alapú eszközkészlet iOS-re való keresztfordításhoz
  • D for Android  (nem elérhető link)  – Eszközkészlet Androidra való keresztfordításhoz (x86 DMD-vel és ARM LDC-vel )
  • Az SDC (Stupid D Compiler)  egy kísérleti fordító (a fordító könyvtárként), amely LLVM-et használ háttérként, és nem DMD-n alapul.
  • Calypso  - LDC villa, amely közvetlen Clang interoperabilitást biztosít, lehetővé téve a C fejlécek közvetlen használatát.
  • MicroD  - DMD fork, amely C forráskódot ad ki az objektumfájlok helyett
  • DtoJS  – DMD fork, amely JavaScript-forráskódot ad ki az objektumfájlok helyett
  • D Fordító .NET  -hez – Háttér a D programozási nyelv 2.0 fordítójához [9] [10] . A kódot Common Intermediate Language (CIL) bájtkódra fordítja, nem pedig gépi kódra. A CIL ezután egy Common Language Infrastructure (CLR) virtuális gépen keresztül futtatható .
  • A DIL egy kézzel készített fordító megvalósítás a D programozási nyelvhez, amely D v2-ben íródott a Tango szabványkönyvtár segítségével. A lexer és az elemző teljesen implementálva van. A szemantikai elemzésen dolgoznak. A háttér valószínűleg az LLVM lesz .

Fejlesztőeszközök és eszközök

IDE-k és szerkesztők

D támogatása különböző IDE -ekben, bővítmények segítségével megvalósítva:

IDE csatlakoztat Platformok
IntelliJ ÖTLET DLanguage platformközi
Fogyatkozás DDT platformközi
MonoDevelop/Xamarin Mono-D platformközi
vizuális Stúdió Visual-D ablakok
Visual Studio kód Code-D platformközi
xcode D az Xcode-hoz Mac OS X
Zeus IDE D Zeus IDE-hez ablakok

Natív IDE-k D nyelvhez:

  • Coedit (Windows, Linux)
  • DLangIDE (Windows, Linux, OS X) – magára a D-re épül, támogatja a szintaxiskiemelést, a kódkiegészítést, a DUB-t, a különféle fordítókat, a hibakeresést stb.

A D-t számos szövegszerkesztő támogatja: Vim, Emacs, Kate, Notepad++, Sublime Text, TextMate és mások [11] .

Csomagkezelő

A DUB a D hivatalos csomagkezelője. A DUB csomagtárolóként működik, és függőségek kezelésére, valamint összeállítási rendszerként is használható. A függőségek, a projekt metaadatai és a fordítójelzők készlete JSON vagy SDL formátumban kerül tárolásra. Példa egy egyszerű projektfájlra (JSON):

{ "name" : "myproject" , "description" : "Egy kis webszolgáltatásom." , "szerzők" : [ "Peter Parker" ], "homepage" : "http://myproject.example.com" , "license" : "GPL-2.0" , "dependencies" : { "vibe-d" : " ~>0,7,23" } }

Segédprogramok és eszközök

Az rdmd  a DMD fordítóhoz mellékelt segédprogram, amely lehetővé teszi a D forrásfájlok menet közbeni fordítását és futtatását. Ez lehetővé teszi a D használatát kis programokhoz hasonlóan, mint a bash, a perl és a python:

// myprog.d # !/ usr / bin / env rdmd import std . stdio ; void main () { writeln ( "Helló világ, automatizált szkript fut!" ; }

A parancs meghívása a ./myprog.dkonzolban automatikusan lefordítja és végrehajtja a programot.

A DPaste [12]  egy online szolgáltatás D programok böngészőben való futtatására, hasonlóan a JSBin és CodePen szolgáltatásokhoz .

A run.dlang.io [13]  egy online fordító és szétszerelő.

Felhasználás, terjesztés

A D nyelv elterjedése korlátozott, de valódi ipari szoftverfejlesztésre használják. A hivatalos webhely [14] 26 olyan cég listáját tartalmazza, amelyek sikeresen használják a D-t számos területen működő szoftverrendszerek fejlesztésében, beleértve a rendszerprogramozást, webprojekteket, játékokat és játékmotorokat, tudományos számításokhoz szükséges szoftvereket, különféle célú segédprogramokat. , stb. A D nyelvet különösen a D Language Foundation támogatja, amely egy olyan közszervezet, amely magát a D nyelvet és az annak felhasználásával készített nyílt forráskódú szoftvereket népszerűsíti .

A TIOBE index szerint a D iránti maximális érdeklődés 2007-2009-ben mutatkozott meg, 2009 márciusában a D nyelvi index elérte az 1,8-at (12. hely), ami az abszolút maximuma. A 2010-es évek első felében tapasztalt visszaesés után 2016-ra viszonylag stabil állapotba került - az index számértéke 1,0-1,4 között ingadozik, a rangsorban a nyelv a harmadik tízben van. A fejlesztői álláshelyekre vonatkozó adatok összesítése alapján összeállított népszerűségi értékelésben a D nyelv nem szerepel sem a fő (top-20), sem az általános (top-43) listán, ami a munkáltatók körében alacsony keresletre utal.

Kódpéldák

1. példa

Helló világ! »

import std . stdio ; void main () { writeln ( "Szia, világ!" ); }

2. példa

Olyan program, amely kiírja azokat a parancssori argumentumokat, amelyekkel meghívták

import std . stdio : writefln ; void main ( string [] args ) { foreach ( i , arg ; args ) writefln ( "args[%d] = '%s'" , i , arg ); }

3. példa

Egy program, amely soronként beolvassa a szavak listáját egy fájlból, és kiírja az összes olyan szót, amely más szavak anagrammái

import std . stdio , std . algoritmus , std . tartomány , std . karakterlánc _ void main () { dstring [][ dstring ] jelek2szavak ; foreach ( dchar [] w ; lines ( Fájl ( "words.txt" ))) { w = w . chomp (). leengedni (); változtathatatlan kulcs = w . dup . rendezés (). kiadás (). idup ; jelek2szavak [ kulcs ] ~= w . idup ; } foreach ( szavak ; jelek2szavak ) { if ( szavak . hossza > 1 ) { writefln ( szavak . join ( " " )); } } }

Lásd még

  • Digitális Mars
  • A D jellemzőinek más nyelvekkel való összehasonlításához lásd: Programozási nyelvek összehasonlítása (szintaxis)

Jegyzetek

  1. A szerződéses programozási paradigma megvalósításának leírása Dee nyelven . Archiválva az eredetiből 2014. január 3-án.
  2. Változásnapló: 2.100.2 .
  3. D for Android - D programozási nyelv vitafórum . Letöltve: 2015. június 7. Az eredetiből archiválva : 2015. május 21..
  4. DMD 1.00 – itt van! (digitalmars.D.announce) Archiválva : 2007. március 5. a Wayback Machine -nél 
  5. D 2.0 változásnapló (downlink) . Letöltve: 2009. január 11. Az eredetiből archiválva : 2012. június 1.    (Angol)
  6. Funkciók - D programozási nyelv . Letöltve: 2015. június 17. Az eredetiből archiválva : 2015. június 17.
  7. Types - D programozási nyelv . Letöltve: 2015. június 7. Az eredetiből archiválva : 2015. május 17.
  8. Voldemort típusai D-ben | Dobb doktor . Letöltve: 2015. június 8. Az eredetiből archiválva : 2015. június 19.
  9. CodePlex archívum . CodePlex archívum. Letöltve: 2018. február 16. Az eredetiből archiválva : 2018. január 26..
  10. A D.NET fordító forrása már elérhető . InfoQ. Letöltve: 2018. február 16. Az eredetiből archiválva : 2018. november 30.
  11. Szerkesztők-D Wiki . Hozzáférés időpontja: 2015. június 16. Az eredetiből archiválva : 2015. július 3.
  12. Dpaste (downlink) . Letöltve: 2015. június 16. Az eredetiből archiválva : 2015. július 6.. 
  13. run.dlang.io . Letöltve: 2019. szeptember 23. Az eredetiből archiválva : 2019. december 24.
  14. A D nyelvet használó szervezetek . dlang.org. Letöltve: 2019. október 7. Az eredetiből archiválva : 2019. augusztus 6..

Irodalom

Linkek


,