D (programmeringsspråk)

D
Utvikler(e)
Digital Mars , Andrei Alexandrescu (siden 2006)
https://dlang.org
Generell informasjon
Vanlige utvidelser .d
Paradigme multi -paradigme : objektorientert , imperativ , funksjonell , meta
Dukket opp i 1999
Designet av Walter Bright , Andrei Alexandrescu (siden 2006)
Siste stabile versjon 2.096.0 [ 1 ] ​( 11. mars 2021 (1 år, 7 måneder og 6 dager) [ 2 ] )
type system sterk, statisk
implementeringer DMD, GDC , LDC
påvirket av C++ , C , C# , Java , Eiffel , Python , Ruby
har påvirket MiniD , DScript , Vala , Qore , Swift [ 3 ]
Operativsystem DMD: Unix-lignende ( FreeBSD , Linux etc), Windows , OS X
Tillatelse GPL / Artistic (DMD frontend),
Boost (standard- og kjøretidsbiblioteker),
kode tilgjengelig (DMD-backend), [ 4 ] Fullstendig
åpen kildekode (LDC eller GDC) [ 5 ]

D er et generelt programmeringsspråk utviklet av Walter Bright , hvis første versjon dukket opp i 1999. Det har sin opprinnelse som en redesign av C++ , med en mer pragmatisk tilnærming, men det er ikke et rent avledet språk. D har beholdt noen funksjoner i C++ og er også påvirket av konsepter fra andre språk som Java , C# og Eiffel . En stabil versjon ble utgitt 2. januar 2007.

Funksjoner

D blir designet med lærdom fra å bruke C++ i stedet for å være designet fra et teoretisk perspektiv. Selv om den bruker mange av konseptene til C/C++, forkaster den også noen, og er derfor ikke kompatibel med kode skrevet i C eller C++. D beholder C++s evne til å lage kode på lavt nivå, slik at du kan inkludere kode i montering. C++ multippel arv erstattes av enkelt arv og grensesnitt og 'mixins'. Deklarasjonssyntaksen og syntaksen for uttrykk ligner den for C++.

Assembly språkstøtte demonstrerer en av Ds forskjeller fra andre språk som Java og C#. Dette lar deg bygge inn maskinspesifikk kode med D-kode, en teknikk som vanligvis brukes av systemprogramvareprogrammerere for å få tilgang til funksjoner på lavt nivå som er nødvendige for å samhandle direkte med maskinvare, slik at du kan skrive programvare som operativsystemer og drivere.

D inkluderer støtte for dokumentasjonskommentarer, men så langt er det bare kompilatoren som er levert av Digital Mars som implementerer en dokumentasjonsgenerator.

Objektorientert

Objektorientert programmering er basert på enkeltarv, med alle klasser avledet fra Object-klassen. D støtter ikke multippel arv; i stedet bruker den Java-lignende grensesnitt, som er sammenlignbare med C++ abstrakte klasser.

Metaprogrammering

Metaprogrammering støttes av en kombinasjon av maler, kjøring av kompileringstidsfunksjoner , tupler og strengmikser. Støtter CTFE (kompileringstidsevaluering av funksjoner). Følgende eksempler viser noen av kjøretidsfunksjonene til D-språket.

Maler i D kan skrives i en mer imperativ stil sammenlignet med funksjonsstilen til C++-maler. Følgende eksempel er en vanlig funksjon som beregner faktorproduktet av et tall:

ulong factorial ( ulong n ) { ulong Produkt = 1 ; for ( ulong i = 2 ; i <= n ; i ++){ Produkt *= i ; } returner produktet ; }

Her vises bruken av det reserverte ordet static for(det iterative bygget ved kjøretid i D) for å bygge en mal som er i stand til å utføre den samme beregningen:

mal Faktoriell ( ulong n ) { ulong Produkt = 1 ; statisk for ( i = 2 ; i <= n ; i ++){ Produkt *= i ; } returner produktet ; }

I de følgende to eksemplene brukes malen og funksjonen definert ovenfor til å beregne faktorialer. Det er ikke nødvendig å eksplisitt spesifisere typene konstanter når kompilatoren utleder typene deres fra høyre side av oppgavene :

enum fact_7 = Faktoriell !( 7 );

Dette er et eksempel på en funksjon ved kjøretid. Vanlige funksjoner kan bruke konstanter, selv om uttrykk under kjøretid må oppfylle visse kriterier:

enum fact_9 = faktoriell ( 9 );

Funksjonen std.string.formattil stilen printfbrukes til å formatere dataene (også ved kjøretid, gjennom CTFE (kjøring av kjøretidsfunksjon), og "msg"-pragmaen (direktivet) som viser resultatet ved kjøretid. execution:

import std . streng : format ; pragma ( msg , format ( "7! = %s" , fact_7 )); pragma ( msg , format ( "9! = %s" , fact_9 ));

String mixins, kombinert med CTFEer, lar deg generere D-kode ved å bruke strengoperasjoner under kjøring. Den kan brukes til å analysere et domenespesifikt språk til D-kode, som er kompilert som en del av programmet:

importere FooToD ; // Hypotetisk modul som inneholder en funksjon som analyserer Foo-kildekoden // og returnerer den tilsvarende D-koden void main () { mixin ( fooToD ( import ( "example.foo" ))); }

Funksjoner

D støtter funksjonelle programmeringsfunksjoner som anonyme funksjoner , stenginger , rekursivt uforanderlige objekter og bruk av høyere ordensfunksjoner . Det er to syntakser for anonyme funksjoner, inkludert en flerdeklarasjonsform og en enkel uttrykksnotasjon i stenografi: [ 6 ]

int funksjon ( int ) g ; g = ( x ) { return x * x ; }; // lang form g = ( x ) => x * x ; // kortform

Minnehåndtering

Minne administreres vanligvis av en søppelsamler, men spesifikke objekter kan termineres umiddelbart når de går utenfor rekkevidde. Eksplisitt minnehåndtering er mulig ved å bruke de overbelastede operatørene nye og slette, og ganske enkelt ved å kalle C-funksjonene malloc og gratis direkte. Søppelinnsamlingen kan kontrolleres: programmerere kan legge til og ekskludere minneområder fra å bli overvåket av søppelsamleren, de kan pause og gjenoppta søppelsamleren, og tvinge frem en hel generasjon eller søppelinnsamlingssyklus. [ 7 ] Håndboken gir mange eksempler på hvordan man implementerer forskjellige svært optimaliserte minnehåndteringsopplegg for når søppelinnsamling er upassende for programmet.

Interaksjon med andre systemer

C API støttes, i likhet med alle grunnleggende og avledede C-typer, som gir direkte tilgang til eksisterende C-kode og biblioteker. C-standardbiblioteket er en del av D-standarden. Med mindre det brukes svært eksplisitte navnerom, kan det være noe vanskelig tilgjengelig, som man kan se i moduler skrevet i D som benytter seg av denne funksjonen. Men D-standardbiblioteket er vanligvis tilstrekkelig.

Eksempler

Eksempel 1

Dette programmet skriver ut sine kommandolinjeargumenter. Hovedfunksjonen mainer startpunktet til et D-program, og argser en strengmatrise som representerer kommandolinjeargumentene. I D er stringdet en rekke tegn, som er representert med char[]i D1, eller immutable(char)[]i D2.

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

Det reserverte ordet foreachkan gjenta enhver samling. I dette tilfellet produserer den en sekvens av indekser ( i) og verdier ( arg) fra matrisen args. Indeksen iog verdien arghar sine typer utledet fra typen av matrisen args.

Implementering

Gjeldende implementeringer av D kompilerer kode direkte til maskinkode for effektiv utførelse.

Endringer i språket er ikke gjort regelmessig siden versjon 1.0. Designet er praktisk talt frosset, og nye utgivelser konsentrerer seg om å løse eksisterende feil. Den offisielle Walter Bright-kompilatoren definerer språket.

  • DMD: The Digital Mars Compiler, den offisielle D-kompilatoren. Frontend er lisensiert under den kunstneriske lisensen og GNU GPL; Kildene for grensesnittet er distribuert med kompilatorens binære filer. Baksiden er proprietær, men koden er åpen kildekode.
  • GDC: En frontend til GCC -backend , bygget ved hjelp av DMD-kompilatorkildene. Øyeblikksbilder støtter versjon 2.0 av språket.
  • LDC: En kompilator basert på DMD og bruker LLVM som backend. LLVM - backend lar LDC oppnå kodeoptimalisering som når ytelse som ligner på C/C++ og noen ganger til og med overskrider den.

Utviklingsverktøy

D er ennå ikke støttet i mange utviklingsmiljøer, noe som er et stort problem for mange brukere. Redaktører som kan brukes inkluderer Entice Designer, emacs , vim , SciTE og Zeus blant andre. Vim støtter syntaksutheving og kodefullføring (via patchede ctags). Code::Blocks inkluderer delvis språkstøtte.

Det er to plug-ins under utvikling for Eclipse, Descent og Mmrnmhrm.

I tillegg er det IDE-er skrevet i D selv som Poseidon , som inkluderer kodefullføring, syntaksutheving og en debugger.

Applikasjoner skrevet i D kan feilsøkes med hvilken som helst C eller C++ debugger, for eksempel GDB eller WinDbg, selv om støtte for flere grunnleggende D-funksjoner er begrenset. En debugger med eksplisitt støtte for D er Ddbg for Windows. Den kommersielle ZeroBUGS debuggeren for Linux har eksperimentell støtte for D. Ddbg kan brukes med ulike IDEer eller fra kommandolinjen, ZeroBUGS har sitt eget grafiske grensesnitt.

Problemer og kontroverser

Operatør overbelastning

Operatøroverbelastning i D er noen ganger mindre kraftig enn i C++. Et eksempel er opIndex , som lider fordi D ikke tillater returnerende referanser. Dette gjør operasjoner som obj[i]++; umulig. Ds delløsning er opIndexAssign- operatoren , som bare fikser tilfeller der det indekserte uttrykket bare er en L-verdi som obj[i] = 5, men ikke de opprinnelige tilfellene.

Inndeling i standardbiblioteket

Standardbiblioteket i D heter Phobos. Noen medlemmer av samfunnet mener at Phobos er for enkelt og har mange problemer, så en erstatning kalt Tango ble skrevet. [ 8 ] Imidlertid var Tango og Phobos inkompatible på grunn av ulike forskjeller (trådstøtte, søppeloppsamler, etc). Eksistensen av to biblioteker, begge høy bruk, førte til betydelige problemer der noen pakker bruker Phobos og andre bruker Tango. Dette problemet ble løst med versjon 2.0 av språket.

Uferdig støtte for delte/dynamiske biblioteker

Unix ELF-delte biblioteker støttes opp til et punkt ved å bruke GDC-kompilatoren. På Windows støttes DLL-er og lar gjenstander som samles inn av søppeloppsamleren trygt sendes til C-funksjoner, siden søppeloppsamleren sjekker stabelen for pekere. Det er imidlertid fortsatt begrensninger med DLL-er i D, inkludert det faktum at kjøretidsinformasjonen til klasser definert i DLL-en er inkompatibel med de som er definert i den kjørbare filen, og at alle objekter som er opprettet fra DLL-en må ferdigstilles før DLL-en lastes ned. [ 9 ]

Referanser

  1. "Endringslogg: 2.096.0 – D programmeringsspråk" . D Programmeringsspråk 2.0 . D Language Foundation . Hentet 6. april 2021 . 
  2. "D 2.096.0 utgitt og andre nyheter" . Hentet 6. april 2021 . 
  3. "Building assert() i Swift, del 2: __FILE__ og __LINE__ - Swift Blog -" . Apple-utvikler . Hentet 26. september 2014 . "Swift låner en smart funksjon fra D-språket : disse identifikatorene utvides til plasseringen til den som ringer når de evalueres i en standard argumentliste. » 
  4. ^ "readme.txt" . DMD-kildekode . GitHub . Hentet 5. mars 2012 . 
  5. Vanlige spørsmål om digitalmars
  6. ^ "Uttrykk" . DigitalMars . Hentet 27. desember 2012 . 
  7. ^ "core.memory - D-programmeringsspråk - Digital Mars" . Arkivert fra originalen 28. august 2011 . Hentet 2009 . 
  8. Wiki4D:Standard Lib
  9. ^ "Wiki4D:BestPractices/DLL" . Hentet 2009 . 
  • Andrei Alexandrescu, The D Programming Language , Addison-Wesley Professional; 1. utg. ( 12. juni 2010 )

Eksterne lenker