D | |
---|---|
Semantik | multiparadigm : imperativ , objektorienterad , funktionell , kontrakt [1] , generisk programmering |
Språkklass | objektorienterat programmeringsspråk , procedurspråk , funktionellt programmeringsspråk , generiskt programmeringsspråk , parallellt programmeringsspråk [d] , multiparadigm programmeringsspråk , imperativt programmeringsspråk , kompilerat programmeringsspråk och programmeringsspråk |
Utförandetyp | sammanställt |
Framträdde i | 2001 |
Författare | Walter Bright , Andrei Alexandrescu |
Utvecklaren | Bright, Walter och D Language Foundation [d] |
Filtillägg _ | .d, .dd, .dieller.def |
Släpp | 2.100.2 [2] ( 10 september 2022 ) |
Typ system | strikt, statisk, med typinferens |
Stora implementeringar | Digital Mars D (referensimplementering) , LDC , GDC |
Blivit påverkad | C , C++ , Python , Ruby , C# , Java , Eiffel |
påverkas | MiniD , DScript , Vala , Qore , Swift , Genie |
Hemsida | dlang.org |
Mediafiler på Wikimedia Commons |
D ( Di ) är ett multiparadigm statiskt typat kompilerat programmeringsspråk skapat av Walter Bright från Digital Mars . Sedan 2006 har Andrei Alexandrescu också varit medförfattare . D är en ättling till C++-språket , men har förbättrats avsevärt i jämförelse med det. Den lånar också ett antal koncept från programmeringsspråken Python , Ruby , C# , Java , Eiffel .
D är tillgängligt för Windows, Linux, macOS, FreeBSD operativsystem. Arbete pågår för att porta till Android [3] .
I förordet till A. Alexandrescus bok The D Programming Language skriver Walter Bright att han började utveckla detta språk 1999. Projektet var tänkt som en omarbetning av C++-språket för att bli av med de mest betydande bristerna i originalspråket och introducera moderna arkitektoniska lösningar i det. När man skapade D-språket gjordes ett försök att kombinera prestandan hos kompilerade programmeringsspråk med säkerheten och uttrycksfullheten hos dynamiska .
Ursprungligen avsåg författaren att kalla språket "Mars", men på grund av kontinuiteten med avseende på C ++ kallades språket ständigt "D" i diskussioner, som ett resultat tilldelades detta namn till projektet.
Den stabila kompilatorn version 1.0 släpptes den 2 januari 2007 [4] . Kort efter utgivningen av kompilatorn den 17 juni 2007 bytte författaren version 1 till stödläge och började utveckla version 2.0, som till en början inte garanterade bakåtkompatibilitet [5] . Denna version (den sista D-durversionen hittills) utvecklas fortfarande till denna dag.
D-språket implementerar många syntaktiska funktioner och koncept som inte finns i C++: kontraktsprogrammering , inbyggda enhetstester , moduler istället för header-filer (pre-C++20), skräpuppsamlingsstöd (samtidigt som tillgängligheten till manuellt minne bibehålls management), inbyggda associativa arrayer, stängningar , anonyma funktioner , har mallmotorn gjorts om avsevärt.
D tillhör familjen C-liknande språk, generellt sett liknar dess syntax C/C++/C#, Java. Vid utveckling av ett språk iakttas principen: kod som är lika giltig i både C och D måste bete sig på samma sätt.
Hej världen! » till D:
import std . stdio ; void main () { writeln ( "Hej världen!" ); }Precis som i C är en funktion main()en ingångspunkt.
Konstruktionerna if, for, while, do-whileser ut och fungerar på samma sätt som C/C++. Flervalsinstruktionen switchser ut som C++, men tillåter variabler i grenetiketter caseoch kräver att varje gren caseslutar med breakeller return; för att flytta till nästa gren efter att ha bearbetat den nuvarande måste du använda den speciella konstruktionen goto case. switchStrukturer utan gren är också förbjudna default.
Av de ytterligare kontrollstrukturerna kan man notera static if - en instruktion för villkorlig kompilering (villkoret kontrolleras statiskt och innehållet i grenen som motsvarar det ingår i koden), den fullständiga flervalsoperatören final switch - till skillnad från den vanliga switch, den fungerar bara med värden enumoch kompilatorn kontrollerar statiskt att valet tar hänsyn till alla möjliga alternativ och ger ett fel i övrigt. Det finns också en samlingsslinga foreach.
D har ett inbyggt system för att dela upp ett program i moduler (paket), vilket ger separat kompilering och kontrollerad import-export. Paketsystemet liknar det för Java eller Go: paket bildar en hierarkisk struktur som mappas naturligt till filsystemträdet. Till skillnad från C++ har D inte ett globalt namnutrymme, varje namn definieras i ett paket. Med hjälp av instruktionen importkan en programmodul importera ett paket och göra alla definitioner i det tillgängliga. Importerade namn kan nås med kvalifikationen: " имя_пакета.имя_объекта".
Språket tillhandahåller ett antal verktyg som syftar till att ge bekvämt arbete med importerade namn. Det är möjligt att byta namn på paketet under import, ställa in ett alternativt namn (alias) för det importerade paketet, importera specifika namn. Dessutom tillåter språket, utan några ytterligare instruktioner, användning av importerade namn utan begränsning av paketnamnet. Det finns dock en begränsning: om det finns mer än en matchande definition av ett namn som påträffas i programmet i omfattning, kommer kompilatorn att ge ett fel och kräva att namnet är explicit kvalificerat. Detta förhindrar den så kallade "namnkapningen" när, när ett nytt paket läggs till i importlistorna, kompilatorn börjar associera ett visst namn i programmet med en annan definition än den definition som den tidigare var associerad med.
D implementerar UFCS-mekanismen (Uniform function call syntax), som låter dig anropa funktioner för vilket objekt som helst som om de vore dess metoder. Till exempel:
import std . stdio ; import std . algoritm ; import std . array ; void main () { auto a = [ 2 , 4 , 1 , 3 ]; // alla tre av följande är korrekta och fungerar på samma sätt ( a ); // "klassisk" C-liknande version av en . skrivln (); // funktionen anropas som om den vore en metod för objekt "a" även om den inte är en . skrivln ; // funktion utan parametrar kan anropas utan parentes // detta låter dig använda samtalskedjor som är specifika för funktionella språk int [] e = a . sortera (). omvänd ; // multi-line chaining är också möjlig stdin . byLine ( KeepTerminator . ja ) . karta !( a => a . idup ) . array . sortera ; }Funktioner i D kan definieras med ytterligare valfria attribut som gör att du explicit kan specificera vissa aspekter av dessa funktioners beteende. Till exempel är en funktion markerad med attributet pure garanterat funktionellt ren (med vissa varningar) [6] . Funktionell renhet kontrolleras vid kompilering. Ett exempel på en funktionsdeklaration med ett attribut:
ren int summa ( int första , int andra ) { returnera första + andra ; } int summa ( int första , int andra ) rena //-attribut kan också anges efter argumentlistan { return first + second ; }Exempel på funktionsattribut:
Språket har en inbyggd mekanism för att starta parallella delprocesser med hjälp av en inbyggd funktion spawn()och datautbyte mellan parallellt exekverade kodfragment genom att skicka meddelanden (funktioner send()och receive()/ receiveTimeout()). Användningen av meddelanden anses av författarna till D vara att föredra framför datautbyte via delat minne.
Men i fall där detta är nödvändigt (till exempel vid överföring av stora mängder data mellan koroutiner), är det möjligt att använda den traditionella metoden för imperativa språk med delade minnesområden och få tillgång till synkronisering genom semaforer och mutexer . För att stödja ett sådant utbyte:
För alla inbyggda synkroniseringsverktyg övervakar och förbjuder kompilatorn automatiskt försök att ändra icke-delad data inom synkroniserad kod som är tillgänglig för mer än en tråd.
I D är enhetstester en del av språket och kan användas utan ytterligare bibliotek eller ramverk.
import std . stdio ; int first ( int [] arr ) { return arr [ 0 ]; } unittest { int [] arr1 = [ 1 , 2 , 3 ]; int [] arr2 = [ 10 , 15 , 20 ]; hävda ( först ( arr1 ) == 1 ); hävda ( först ( arr2 ) == 10 ); } void main () { // ... }D implementerar fem huvudsakliga programmeringsparadigm - imperativ , OOP , metaprogrammering , funktionell programmering och parallell beräkning ( aktörsmodell ).
D använder en sopsamlare för minneshantering, dock är manuell styrning också möjlig med operatörsöverbelastning newoch delete, samt att använda malloc och gratis , liknande C. Sophämtaren kan slås på och av manuellt, du kan lägga till och ta bort minne områden från dess synlighet, tvinga start partiell eller fullständig monteringsprocess. Det finns en detaljerad manual som beskriver olika minneshanteringsscheman i D för fall där standardsopsamlaren inte är tillämplig.
SafeD är namnet på en delmängd av D-språket, vars användning garanterar säkerheten för minnesåtkomst .
Språket har en rik uppsättning definierade datatyper och faciliteter för att definiera nya typer. Typer på D-språket är indelade i värdetyper och referenstyper.
BastyperUppsättningen av grundläggande typer kan delas in i följande kategorier [7] :
Till skillnad från C++ definieras alla storlekar av heltalstyper av specifikationen. Det vill säga, typen int kommer alltid att vara 32 bitar. Heltalsliteraler kan skrivas i decimal, binär (med 0b som prefix) och hexadecimal (med prefix 0x). Notationen i C-stil av bokstaver i oktal (dvs. prefixet med 0) har tagits bort, eftersom det är lätt att förväxla sådan notation med decimal. Om du fortfarande behöver använda det oktala systemet kan du använda mallen std.conv.octal .
Härledda typerD har en typinferensmekanism. Detta innebär att typen som regel kan beräknas vid kompilering och inte behöver anges explicit. Till exempel kommer uttrycket: auto myVar = 10att konverteras till int myVar = 10. Att använda typinferens har flera fördelar:
VeryLongTypeName var = VeryLongTypeName(/* ... */);
kan ersättas av
auto var = VeryLongTypeName(/* ... */);
De namnlösa typerna kallas informellt för Voldemort-typer, efter Voldemort ( "Han-Vem-Må-Inte-Be-namnas"), huvudantagonisten i Harry Potter-serien [8] . Typinferens ska inte förväxlas med dynamisk typning , för även om typen inte är explicit specificerad, beräknas den vid kompilering, inte vid körning.
Stöd för D i olika IDE , implementerat med plugins:
ID | plugin | Plattformar |
---|---|---|
IntelliJ IDÉ | DSpråk | plattformsoberoende |
Förmörkelse | DDT | plattformsoberoende |
MonoDevelop/Xamarin | Mono-D | plattformsoberoende |
visuell Studio | Visual-D | Windows |
Visual Studio-kod | Kod-D | plattformsoberoende |
xcode | D för Xcode | MacOS X |
Zeus IDE | D för Zeus IDE | Windows |
Native IDE för D-språk:
D stöds av många textredigerare: Vim, Emacs, Kate, Notepad++, Sublime Text, TextMate och andra [11] .
DUB är den officiella pakethanteraren för D. DUB fungerar som ett paketförråd och används för beroendehantering och även som ett byggsystem. Uppsättningen av beroenden, metadata om projektet och kompilatorflaggor lagras i JSON- eller SDL-format. Exempel på en enkel projektfil (JSON):
{ "name" : "myproject" , "description" : "En liten webbtjänst av mig." , "authors" : [ "Peter Parker" ], "homepage" : "http://myproject.example.com" , "license" : "GPL-2.0" , "beroenden" : { "vibe-d" : " ~>0.7.23" } }rdmd är ett verktyg som följer med DMD-kompilatorn som låter dig kompilera och köra D-källfiler i farten. Detta gör att D kan användas för små program på liknande sätt som bash, perl och python:
// myprog.d # !/ usr / bin / env rdmd import std . stdio ; void main () { writeln ( "Hej, värld med ett automatiskt skript som körs!" ); }Att anropa kommandot ./myprog.di konsolen kommer automatiskt att kompilera och köra programmet.
DPaste [12] är en onlinetjänst för att köra D-program i en webbläsare, liknande tjänsterna JSBin och CodePen .
run.dlang.io [13] är en onlinekompilator och disassemblerare.
Distributionen av D-språket är begränsad, men det används för riktig industriell mjukvaruutveckling. Den officiella webbplatsen [14] tillhandahåller en lista över 26 företag som framgångsrikt använder D i utvecklingen av mjukvarusystem som verkar inom en mängd olika områden, inklusive systemprogrammering, webbprojekt, spel och spelmotorer, programvara för vetenskapliga beräkningar, verktyg för olika ändamål , och så vidare. D-språket främjas i synnerhet av D Language Foundation, en offentlig organisation som marknadsför själva D-språket och programvara med öppen källkod skapad med hjälp av det.
Enligt TIOBE-indexet manifesterades det maximala intresset för D 2007-2009, i mars 2009 nådde D-språkindexet 1,8 (12:e plats), vilket är dess absoluta maximum. Efter en nedgång under första hälften av 2010-talet kom det 2016 till ett relativt stabilt tillstånd - det numeriska värdet på indexet fluktuerar i intervallet 1,0-1,4, i rankningen är språket på den tredje tio. I popularitetsbetyget , sammanställt baserat på resultaten av aggregering av data om lediga jobb för utvecklare, ingår inte D-språket i vare sig huvudlistan (topp-20) eller allmän (topp-43), vilket indikerar en låg efterfrågan bland arbetsgivare.
Hej världen! »
import std . stdio ; void main () { writeln ( "Hej världen!" ); }Ett program som skriver ut kommandoradsargumenten som det anropades med
import std . stdio : writefln ; void main ( sträng [] args ) { foreach ( i , arg ; args ) writefln ( "args[%d] = '%s'" , i , arg ); }Ett program som läser en lista med ord från en fil rad för rad och matar ut alla ord som är anagram av andra ord
import std . stdio , std . algoritm , std . räckvidd , std . sträng _ void main () { dstring [][ dstring ] signs2words ; foreach ( dchar [] w ; lines ( File ( "words.txt" ))) { w = w . chomp (). toLower (); oföränderlig nyckel = w . dup . sortera (). släpp (). idup ; tecken2ord [ nyckel ] ~= w . idup ; } foreach ( ord ; tecken2ord ) { if ( ord . längd > 1 ) { skrivfln ( ord . sammanfoga ( " " )); } } }
Programmeringsspråk | |
---|---|
|
C programmeringsspråk | |
---|---|
Kompilatorer |
|
Bibliotek | |
Egenheter | |
Några ättlingar | |
C och andra språk |
|
Kategori:C programmeringsspråk |
,