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] .
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.
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.
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.
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.
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 ; }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:
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:
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.
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 fő () { // ... }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 ).
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ó.
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 .
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ípusokAz alaptípusok halmaza a következő kategóriákra osztható [7] :
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ípusokA 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:
VeryLongTypeName var = VeryLongTypeName(/* ... */);
helyettesíthető
auto var = VeryLongTypeName(/* ... */);
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.
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:
A D-t számos szövegszerkesztő támogatja: Vim, Emacs, Kate, Notepad++, Sublime Text, TextMate és mások [11] .
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" } }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ő.
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.
Helló világ! »
import std . stdio ; void main () { writeln ( "Szia, világ!" ); }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 ); }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 ( " " )); } } }
Programozási nyelvek | |
---|---|
|
C programozási nyelv | |
---|---|
Fordítók |
|
Könyvtárak | |
Sajátosságok | |
Néhány leszármazott | |
C és más nyelvek |
|
Kategória:C programozási nyelv |
,