Delphi (programmeringssprog)
Den aktuelle version af siden er endnu ikke blevet gennemgået af erfarne bidragydere og kan afvige væsentligt fra den
version , der blev gennemgået den 8. januar 2020; kontroller kræver
103 redigeringer .
Delphi |
---|
|
Sprog klasse |
imperativ , struktureret , objektorienteret , komponentorienteret , højt niveau |
Dukkede op i |
1986 ( 1986 ) |
Forfatter |
Anders Hejlsberg |
Filtypenavn _ |
.pas, .dpr, .dpk, .pp, .dproj, .dfm, .fmx, .bpl |
Frigøre |
Delphi 11.1 Alexandria [1] (15. marts 2022 ) ( 15-03-2022 ) |
Type system |
statisk , stærk |
Større implementeringer |
Borland/Inprise/Codegear/Embarcadero Delphi ; Borland Kylix ; gratis pascal |
Blev påvirket |
Objekt Pascal , C++ |
påvirket |
C# , Java [1] |
Internet side |
embarcadero.com/ru/produ… |
Platform |
x86, x64, ARM |
OS |
Windows , macOS , iOS , Android , Linux |
Delphi (Delphi, udtales /ˈdɘlˌfi:/ [2] ) er et imperativt, struktureret , objektorienteret programmeringssprog på højt niveau med stærk statisk indtastning af variabler. Det primære brugsområde er at skrive applikationssoftware.
Dette programmeringssprog er en dialekt af Object Pascal-sproget . Objekt Pascal refererede oprindeligt til et lidt anderledes sprog, som blev udviklet hos Apple i 1986 af Larry Teslers gruppe [3] . Men fra og med Delphi 7 [4] begyndte Borlands hvidbøger at bruge navnet Delphi til at henvise til det sprog, der tidligere var kendt som Object Pascal .
Målplatform
Oprindeligt var Delphi-udviklingsmiljøet udelukkende beregnet til udvikling af Microsoft Windows-applikationer , derefter blev en variant til Linux -platforme implementeret (mærket som Kylix ), men efter udgivelsen af Kylix 3 i 2002 blev udviklingen afbrudt og support til Microsoft .NET blev snart annonceret . som igen blev afbrudt med udgivelsen af Delphi 2007.
I øjeblikket, sammen med støtte til udvikling af 32 og 64-bit programmer til Windows, er det muligt at oprette applikationer til Apple macOS (startende med Embarcadero Delphi XE2), iOS (inklusive en simulator, startende med XE4 ved hjælp af sin egen compiler), Google Android (startende med Delphi XE5) [5] , samt Linux Server x64 (startende fra version 10.2 Tokyo).
En uafhængig tredjepartsimplementering af udviklingsmiljøet af Lazarus - projektet ( Free Pascal , når den er kompileret i Delphi-kompatibilitetstilstand) gør det muligt at bruge det til at bygge Delphi-applikationer til platforme som Linux , macOS og Windows CE .
Der har også været forsøg på at bruge sproget i GNU -projekter (f.eks. Notepad GNU ) og at skrive en compiler til GCC ( GNU Pascal ).
Bruges til at skrive IIS internettjenester.
Filosofi og forskelle fra populære anvendte programmeringssprog
Ved oprettelsen af sproget (og her den kvalitative forskel fra C-sproget), var opgaven ikke at sikre den maksimale ydeevne af den eksekverbare kode eller kildekodens kortfattethed for at spare RAM. Oprindeligt fokuserede sproget på harmoni og høj læsbarhed, da det var beregnet til at undervise i disciplinen programmering. Denne indledende slankhed senere, både da hardware voksede og som et resultat af fremkomsten af nye paradigmer, gjorde det lettere at udvide sproget med nye konstruktioner.
Således er kompleksiteten af objekt C++ i sammenligning med C vokset meget betydeligt og gjort det svært at studere det som det første programmeringssprog, hvilket ikke kan siges om Object Pascal i forhold til Pascal.
Følgende er nogle af forskellene mellem Delphi-syntakskonstruktionerne og familien af C-lignende sprog (C/C++/Java/C#):
- I Delphi er den formelle start af ethvert program klart adskilt fra andre kodesektioner og skal være placeret i en specifik kildefil med dpr-udvidelsen, den eneste i projektet (hvorimod andre programkildefiler har pas-udvidelsen).
program Projekt32 ;
{$APPTYPE KONSOL}
{$R *.res}
bruger
System . Sysutils ;
start
prøv
{ TODO -oUser -cConsole Main: Indsæt kode her }
undtagen
på E : Exception do
Writeln ( E . ClassName , ': ' , E . Message ) ;
ende ;
ende .
I C-lignende programmeringssprog mainbruges normalt en global funktion eller statisk metode med et navn og en bestemt liste over parametre som input, og en sådan funktion kan findes i enhver af projektets kildefiler.
- I Delphi læses identifikatorer for typer, variabler og nøgleord uden store og små bogstaver : for eksempel er en identifikator SomeVarfuldstændig ækvivalent med somevar. Skibs-følsomme identifikatorer i begyndelsen af computeralderen fremskyndede kompileringsprocessen og tillod også brugen af meget korte navne, som nogle gange kun adskilte sig i tilfælde af store og små bogstaver.
Og selvom begge disse praksisser nu - brugen af flere identifikatorer, der kun adskiller sig i tilfælde af, såvel som deres overdrevne kortfattethed, er fordømt og ikke anbefalet til brug, stammer næsten alle sprogene fra C - C + +, Java, C # - skelner mellem store og små bogstaver , hvilket på den ene side kræver en del omhu i deklaration og brug af identifikatorer, og på den anden side tvinger det dig til at skrive mere streng kode, når hver variabel har en veldefineret navn (variationer kan forårsage forvirring og fejl).
- I Delphi, i .pas-kildefilerne (som som regel indeholder programmets hoveddel), introduceres en streng opdeling i grænsefladeafsnittet og implementeringsafsnittet på sprogniveau. Interfacedelen indeholder kun type- og metodedeklarationer, mens implementeringskoden i interfacedelen ikke er tilladt på kompileringsniveau. En lignende adskillelse er også karakteristisk for C/C++-sprogene, hvor der inden for rammerne af kultur- og programmeringsparadigmet indføres en adskillelse i header- og faktiske implementeringsfiler, men en sådan adskillelse er ikke tilvejebragt på sproget eller compileren. niveau.
I C# og Java er denne adskillelse fuldstændig tabt - implementeringen af en metode følger som regel umiddelbart efter dens erklæring. Indkapsling tilvejebringes kun ved at tilhøre metoden til et eller andet omfang. Specialværktøjer bruges til kun at se interfacedelen af kildekodemodulet.
- I Delphi er en metode eller funktion klart defineret af de reserverede nøgleord procedureeller function, mens der i C-lignende sprog skelnes med et nøgleord, der specificerer typen af returværdien://Delphi
procedure DoSomething ( aParam : Heltal ) ; // returnerer ikke en
værdifunktion Calculate ( aParam1 , aParam2 : Integer ) : Integer ; //returnerer et heltalsresultat
//C#
void DoSomething ( int aParam ); // returnerer ikke en værdi
{
// code
}
int Calculate ( int aParam1 , aParam2 ); // returnerer et heltalsresultat
{
// code
}
Jo vanskeligere i C#/C++ er sådanne konstruktioner som at erklære typen "pointer to method":
//C++: pCalc-typedeklaration, en pointer til en medlemsfunktion, der tager to heltalsparametre og returnerer et heltalsresultat
typedef int ( TSomeClass ::* pCalc )( int , int );
I ovenstående eksempel adskiller typedeklarationen sig fra variabeldeklarationen med typedef nøgleordet, typenavnet, pCalc, er angivet i midten af udtrykket i parentes.
//C#: pCalc-typedeklaration, en pointer til en medlemsfunktion, der tager to heltalsparametre og returnerer et heltalsresultat
public delegate int pCalc ( int aParam1 , int aParam2 );
I ovenstående eksempel adskiller typedeklarationen sig fra variabeldeklarationen med et særligt nøgleord delegate, typenavnet er angivet i midten af udtrykket.
//Delphi
type pCalc = funktion ( aParam1 , aParam2 : Heltal ) : Heltal af objekt ;
I ovenstående eksempel adskiller typedeklarationen sig fra deklarationen af en variabel med et særligt nøgleord type, brugen af et lighedstegn (i tilfælde af en variabel bruges et kolon), typenavnet kommer umiddelbart efter nøgleordet.
- I Delphi er begyndelsen og slutningen af en programblok markeret med nøgleordene beginog end, mens der i C-lignende programmeringssprog bruges krøllede klammeparenteser til dette formål: {}. Dermed opnår Delphi måske bedre kodelæsbarhed for synshandicappede. På den anden side kan krøllede seler være mere visuelt intuitive og tjene som et piktogram .//C#
if ( bVal ) {
// kode bestående af flere instruktioner
}
if ( bVal2 ) /* kode bestående af en instruktion */ ;
I eksemplet ovenfor betegner krøllede klammeparenteser et sammensat udsagn, dvs. en blok af udsagn. Da et udtryk uden krøllede klammeparenteser er tilladt i en
grenkommando for en enkelt sætning, kræves der parenteser for et betinget udtryk . I komplekse betingede udtryk kan antallet af indlejrede parenteser være stort.
//Delphi
if bVal then start
// multi-instruction code
end ;
hvis bVal2 så (* enkelt instruktionskode *) ;
I Delphi er det betingede udtryk altid adskilt fra det næste udsagn af nøgleordet then, hvilket eliminerer behovet for at omslutte betingelsen i parentes.
- I C-lignende sprog, for denne adskillelse, er sløjfen betinget omgivet i parentes:while ( condition ) { // loop med "precondition"
// loop body
};
do {
// body of another loop
} while ( condition2 ); // slutningen af løkken med en "postcondition", kroppen udføres mindst én gang
I Delphi er sløjfer med en
forudsætning og en
postbetingelse mere forskellige: slutningen af en løkke med en postbetingelse er sværere at forveksle med begyndelsen af en løkke med en forudsætning. Men nogle gange kan en sådan skelnen forårsage forvirring (det skal huskes, at udgangsbetingelsenuntil er angivet i løkken ).
mens betingelse begynder //betingelsen for at fortsætte løkken er sandheden af udtrykket efter ordet while, ligesom C/C#
//loop body
end ;
gentag //begyndelsen af loop med postcondition
//loop body
indtil ikke condition2 ; //sandheden af udtrykket efter ordet indtil er betingelsen for EXIT fra løkken, i modsætning til C/C#
- I Delphi er operationen med at tildele en værdi til en variabel betegnet med et kolon med et lighedstegn, :=, som er lånt fra matematisk notation. Et lighedstegn uden kolon er en lighedstestoperator, der returnerer en boolsk værdi. I modsætning hertil er tildelingsoperatoren i C-lignende sprog et enkelt lighedstegn, og lighedstesten er et dobbelttegn, ==. På grund af det faktum, at opgaven i disse programmeringssprog kun er et udtryk, der returnerer værdien af variablen til venstre, er følgende fejl, der ikke er indlysende for en nybegynder, ikke så sjældne:// C++
int iVal = 12 ;
while ( iVal = 1 ) {
// i henhold til programmørens hensigt bør denne loop body ikke udføres, hvis iVal har en anden værdi end én ved input
//, men som et resultat af en fejlagtig udskiftning af == tegnet med et enkelt =, vil iVal være tildelt værdien 1, og løkken vil være uendelig
}
I Delphi er en sådan fejl umulig, om ikke andet fordi opgaven på dette sprog er en operation, der ikke returnerer en værdi.
- I Delphi er objekt- og objektorienteret programmering, selvom det opmuntres, ikke den eneste mulige. Så det er tilladt (i modsætning til C#) at erklære og bruge globale eller statiske funktioner og variabler.
C#-sproget er tvunget til at være objekt. Globale funktioner uden reference til en klasse er forbudt. Værdityper, som structs struct, nedarves fra den generiske C#-type, selvom de ikke i sig selv kan nedarves (det vil sige, struct-arv er ikke tilladt i C#). Forekomster af C#-klasser er dog implicitte referencetyper, ligesom i Delphi.
Da systemkald i Windows (som faktisk i POSIX-systemer som Linux, Mac OS) formelt er ikke-objekter, er interaktion af C #-kode med dem vanskelig, selv uden at tage højde for det forskellige paradigme for styring af levetiden for variabler i hukommelsen . Delphi har ingen sådanne begrænsninger.
På trods af dette objekt-centrerede paradigme mangler C# konceptet med en virtuel konstruktør, det vil sige at skabe en instans af en klasse, hvis nøjagtige type ikke er kendt på kompileringstidspunktet, men kun basisklassen for den instans er kendt. Dels kan denne ulempe kompenseres ved at bruge grænseflader eller refleksion, men sådanne løsninger er ikke standard for sproget.
type
TAnimal = klasse abstrakt
beskyttet
FPersonalName : string ;
offentlig
konstruktør Opret ( const PersonalName : string ) ; virtuel ; abstrakt ;
funktion GetSpecieName : streng ; virtuel ; abstrakt ; // returnerer den biologiske art af
dyreegenskaben Navn : streng læst FPersonalName ;
ende ;
TAnimalClass = klasse af TAnimal ; // metaklasse, der kan henvise til enhver klasse, der arver fra TAnimal
...
funktion CreateAnAnimal ( const FactAnimalClass : TAnimalClass ; const Navn : string ) : TAnimal ;
start
Resultat := FactAnimalClass . Opret ( navn ) ; // funktionen ved ikke, hvilken slags dyr der vil blive skabt, selvom "kælenavnet" er kendt. Den konkrete implementering af udsigten er skjult.
ende ;
Derudover, i modsætning til C# og C++, hvor kaldet til basisklassekonstruktøren nødvendigvis foretages før indtastning af kroppen af den nedarvede klassekonstruktør, foretages dette kald i Delphi eksplicit. Den kan således udskydes eller helt undlades til særlige formål. I modsætning til C# er det naturligvis muligt at kontrollere undtagelser i basiskonstruktører.
- For den mest fleksible og effektive implementering af den objektorienterede tilgang introducerede Delphi to polymorfe opkaldsmekanismer: klassisk virtuel og dynamisk : hvis i tilfælde af et klassisk virtuelt opkald, vil adresserne på alle virtuelle funktioner være indeholdt i tabellen over virtuelle metoder af hver klasse, så findes der i tilfælde af et dynamisk kald kun en pointer til en metode i tabellen for den klasse, hvor den blev defineret eller tilsidesat.
For dynamisk at kalde fra klasse D en metode af klasse A omdefineret i B, vil det være nødvendigt at søge i metodetabellerne for klasse D, A og B.
Denne optimering har til formål at reducere størrelsen af den statiske hukommelse optaget af metodetabeller. Besparelserne kan være betydelige for lange klassehierarkier med et meget stort antal virtuelle metoder. I C-lignende sprog bruges dynamiske polymorfe kald ikke.
- I modsætning til C# tillader Delphi-sproget oprettelse (initialisering) af en instans af en klasse, der indeholder abstrakte (ikke har en implementering) metoder. For at udelukke muligheden for at oprette en forekomst af en klasse, er det ikke nok at erklære abstrakte metoder i den. Det abstrakte nøgleord skal bruges i klasseerklæringen. På nuværende tidspunkt betragtes klasser, der har abstrakte metoder (i modsætning til tidlige Delphi-implementeringer), ikke som abstrakte. Ved at bruge den virtuelle funktionsmekanisme bestemmer koden for en basisklasse, der har abstrakte metoder, ved kørsel, om en bestemt abstrakt metode tilsidesættes i den faktiske forekomst af klassen, og afhængigt af dette kalder den enten den overstyrede metode eller kaster en EAbstractError-undtagelse.
Delphi tillader også at enhver konkret virtuel metode for en basisklasse tilsidesættes af en abstrakt i en efterkommerklasse:
type
TMyBase = klasse ( TObject )
funktion A : heltal ; virtuel ; // metode A har et implementeret organ i implementeringsslutsektionen
;
TMyDerived = klasse ( TMyBase )
funktion A : heltal ; tilsidesætte ; abstrakt ; // metoden tilsidesættes som abstrakt, har ingen krop,
// og samtidig tilsidesætter (skjuler) den implementerede i basisklassens
ende ;
procedure Test ;
var m : TMyBase ;
start
m := TMyDerived . skabe ; // vi har lavet en klasse med en abstrakt metode
m . A ; // kaldet til A er polymorf, og vi får en EAbstractError, når vi forsøger at udføre den abstrakte metode
ende ;
- I modsætning til C++ har C#-sproget begrebet klasseegenskaber arvet fra Delphi: pseudo-felter, som i nogle tilfælde mere intuitivt sammenlignet med metoder kan reflektere og også ændre et objekts tilstand.public class Dato { //dette eksempel er taget fra [http://msdn.microsoft.com/en-us/library/w86s7x04.aspx msdn]
private int month = 7 ; // backing butik
public int Month {
get { return month ; }
sæt {
if (( værdi > 0 ) && ( værdi < 13 )) {
måned = værdi ;
}
} //set
} //prop
} //klasse
En lignende kildekode i Delphi kan se sådan ud:
type
TDate = klasse
privat
FMonth : Heltal ;
beskyttet
procedure SetMonth ( const Value : Integer ) ; // implementering i implementeringssektionen
offentlig
ejendom Måned : Heltal læs FMonth skriv SetMonth ;
ende ;
Før vi går videre til en sammenligning af sprogimplementeringen af egenskaber, bemærker vi, at en sammenligning af disse to eksempler tydeligt viser, at C #-sproget fremkalder, for det første, misbrug af krøllede seler (hvilket ikke er så skræmmende i betragtning af deres korte skrivning), og for det andet de obligatoriske heap-adgangsspecifikationer for hvert klassemedlem; i Delphi (som i C++), når en specifier er erklæret, gælder den for alle efterfølgende medlemmer. Også, hvis det i Delphi er muligt at binde en egenskab til en feltværdi, så er de i C# altid forsynet med accessormetoder ved hjælp af sammensatte kommandoparenteser (undtagen for automatiske egenskaber). Disse metoder, i modsætning til i Delphi, kan ikke erklæres virtuelle, og de kan heller ikke kaldes direkte.
En accessor i C# refererer altid til én og kun én egenskab, mens dette udsagn i Delphi generelt ikke er sandt. Desuden kan den samme metode bruges til at implementere adgang til væsentligt forskellige egenskaber:
type
TRectangle = class
private
FCordinates : array [ 0..3 ] of Longint ; _ _ funktion GetCoordinate ( Indeks : Heltal ) : Longint ; procedure SetCoordinate ( Indeks : Heltal ; Værdi : Longint ) ; offentlig ejendom Venstre : Longint indeks 0 læs GetCoordinate skriv SetCoordinate ; egenskab Top : Longint indeks 1 læs GetCoordinate skriv SetCoordinate ; egenskab Right : Longint indeks 2 læs GetCoordinate skriv SetCoordinate ; egenskab Nederst : Longint indeks 3 læs GetCoordinate skriv SetCoordinate ;
egenskab Koordinater [ Indeks : Heltal ] : Longint læs GetCoordinate skriv SetCoordinate ;
ende ;
Både Delphi og C# tillader brugen af indekserede egenskaber: i dette tilfælde svarer syntaksen til at få adgang til en sådan egenskab som at få adgang til et array-element. Men mens antallet af indekserede egenskaber i Delphi, såvel som antallet af indeksere, kan være vilkårligt, gælder indekseringsværktøjet i C# kun for en speciel standardegenskab. Også i Delphi kan en standardegenskab ikke kun indekseres, den kan også blive overbelastet af en indekseringstype:
TMyObject = klassebeskyttet
funktion getStr
( Navn : streng ) : streng ; _ virtuel ; funktion getStrByIx ( Indeks : Heltal ) : streng ; virtuel ; funktion getBy2Indicies ( X , Y : Heltal ) : streng ; virtuel ; public property Værdi [ Navn : streng ] : streng læst getStr ; standard ; egenskab Værdi [ Indeks : Heltal ] : streng læst getStrByIx ; standard ; egenskab Værdi [ X , Y : Heltal ] : streng læst getBy2Indicies ; standard ; //nummer ende ;
- Java- og C#-sprogene blev oprindeligt designet til at skrive programmer, der kører i et administreret miljø, hvor miljøet styrer objekternes levetid: så manuel hukommelsesstyring er ikke tilladt. Bekvemmeligheden og sikkerheden ved denne tilgang har en negativ indvirkning på ydeevnen.
Fordele og ulemper ved renovation
.NET- og Java-platformene har i høj grad forenklet udviklingen af programmer ved at introducere en "garbage collector", som gør det muligt for programmøren ikke at bekymre sig om at frigive hukommelsen optaget af objekter, der er gået uden for rækkevidden af den kørende programkode. Dette reducerede på den ene side betydeligt problemet med såkaldte "hukommelseslækager" (når data, der allerede er unødvendige og utilgængelige på grund af tab af adressen, optager RAM), men på den anden side krævede det platform til at implementere en kompleks og ressourcekrævende "skraldeindsamlingsalgoritme" - som traditionelt implementeres som at finde tilgængelige objekter og frigive resten. I praksis, for at udføre en udtømmende analyse af objekters tilgængelighed, suspenderer affaldssamleren på nogle tidspunkter programmet (alle dets tråde), hvilket fører til et kortsigtet tab af reaktionsevne. Hyppigheden og varigheden af sådanne stop afhænger direkte af mængden af tilgængelig RAM (så længe der er ledig hukommelse, forsøger skraldesamleren ikke at udføre blokeringsanalyse), såvel som af antallet af objekter involveret i programmet (således, det er bedre at have nogle få "store" genstande end mange - små).
Situationen forværres, efterhånden som antallet af tråde involveret i programmet vokser, fordi en udtømmende tilgængelighedsanalyse kræver et fuldstændigt stop. Den åbenlyse fordel - løsning af problemet med "hukommelseslækager" og i det hele taget automatisk styring af objekters levetid - gav således anledning til det implicitte problem med skalering og ydeevne "fejl". Dette problem er subtilt i simple programmer, men efterhånden som kompleksiteten og størrelsen af kodebasen vokser, bliver det mere og mere akut - det vil sige på det sidste udviklingstrin. Komplekse softwaresystemer har som regel realtidsreference- og reaktionsevnekrav.
Mere præcist, når affaldsopsamleren har 5 gange mere hukommelse end den har brug for, er dens ydeevne lig med eller lidt bedre end direkte hukommelseshåndtering. Affaldssamlerens ydeevne forringes dog hurtigt, når den skal arbejde med små hofter. Med 3 størrelser påkrævet hukommelse er den i gennemsnit 17 % langsommere, og med 2 størrelser er den 70 % langsommere. Også skraldesamleren er mere tilbøjelig til at søge, hvis hukommelsen er defragmenteret. Under sådanne forhold er alle de skraldeopsamlere, vi har testet, en størrelsesorden langsommere end direkte hukommelseshåndtering.Drew Crawford - Hvorfor mobile webapps er langsomme
Forsøg på at reducere omkostningerne ved affaldsindsamling kan føre til betydelig forvrængning af programmeringsstilen [6] [7] .
Der er ingen automatisk hukommelsesstyring i Delphi: (i klassiske sprogkompilere) oprettes og slettes klasseinstanser manuelt, mens for nogle typer - grænseflader, strenge og dynamiske arrays, bruges referencetællemekanismen. Ingen af disse tilgange garanterer generelt fraværet af hukommelseslækager, men på den anden side er problemet med reaktionsevne ikke relevant, den tidsmæssige overhead til hukommelsesstyring er lille og, endnu vigtigere, indlysende. Også i fravær af lækager er den samlede mængde brugt RAM betydeligt mindre end tilsvarende applikationer, der er afhængige af skraldeopsamleren.
Sprogets historie
Objekt Pascal er resultatet af udviklingen af Turbo Pascal sproget , som igen udviklede sig fra Pascal sproget . Pascal var et fuldstændigt proceduresprog , Turbo Pascal, der startede fra version 5.5, tilføjede objektorienterede egenskaber til Pascal og dynamisk datatypeidentifikation til Object Pascal med mulighed for at få adgang til klassemetadata (det vil sige at beskrive klasser og deres medlemmer) i kompileret kode, også kaldet introspektion - denne teknologi blev betegnet RTTI . Da alle klasser arver funktionerne i TObject-basisklassen, kan enhver pointer til et objekt konverteres til det, hvorefter ClassType-metoden og TypeInfo-funktionen kan bruges, hvilket vil give introspektion.
En karakteristisk egenskab ved Object Pascal fra C++ er også, at objekter er placeret i dynamisk hukommelse som standard. Du kan dog tilsidesætte de virtuelle metoder NewInstance og FreeInstance i TObject-klassen. Således kan absolut enhver klasse opfylde "ønsket" "hvor jeg vil - der vil jeg ligge." Følgelig er "multi-heaping" organiseret.
Objekt Pascal (Delphi) er resultatet af en funktionel udvidelse af Turbo Pascal [8] .
Delphi havde en enorm indflydelse på konceptet med C# -sproget til .NET -platformen . Mange af dets elementer og konceptuelle løsninger er blevet indarbejdet i C#. En af årsagerne er overdragelsen af Anders Hejlsberg , en af de førende udviklere af Delphi, fra Borland Ltd. hos Microsoft Corp.
- Version 8 er i stand til at generere bytekode udelukkende til .NET platformen. Dette er det første miljø med fokus på udvikling af flersprogede applikationer (kun for .NET-platformen);
- Efterfølgende versioner (angivet efter udgivelsesår, snarere end serienumre, som det var tilfældet før) kan oprette både Win32-applikationer og bytekode til .NET-platformen.
Delphi til .NET er et Delphi- udviklingsmiljø samt sproget Delphi (Object Pascal), der fokuserer på udvikling af applikationer til .NET.
Den første version af et fuldgyldigt Delphi-udviklingsmiljø til .NET var Delphi 8. Det tillod kun at skrive applikationer til .NET. Delphi 2006 understøtter MDA-teknologi med ECO (Enterprise Core Objects) version 3.0.
I marts 2006 besluttede Borland at stoppe yderligere forbedringer af de integrerede udviklingsmiljøer JBuilder , Delphi og C++ Builder på grund af urentabiliteten af denne retning. Det var planlagt at sælge virksomhedens IDE-sektor. En gruppe af fri software-tilhængere organiserede en fundraiser for at købe rettighederne til udviklingsmiljøet og compileren fra Borland [9] .
Men i november samme år blev det besluttet ikke at sælge IDE-forretningen. Ikke desto mindre vil udviklingen af IDE-produkter nu blive varetaget af et nyt firma - CodeGear, som bliver fuldstændig økonomisk styret af Borland.
I august 2006 udgav Borland en light-version af RAD Studio kaldet Turbo: Turbo Delphi (til Win32 og .NET), Turbo C#, Turbo C++.
I marts 2008 blev slutningen af udviklingen af denne produktlinje annonceret.
I marts 2007 glædede CodeGear brugerne med en opdateret serie af Delphi 2007 til Win32-produkter og udgivelsen af et helt nyt Delphi 2007 til PHP-produkt.
I juni 2007 præsenterede CodeGear sine planer for fremtiden, det vil sige offentliggjorde den såkaldte køreplan [10] .
Den 25. august 2008 offentliggjorde Embarcadero, den nye ejer af CodeGear, en pressemeddelelse om Delphi til Win32 2009 [11] . Versionen bragte mange innovationer til sproget, såsom [12] :
- Som standard fuld Unicode -understøttelse i alle dele af sproget, VCL og RTL; at erstatte opkald til alle Windows API-funktioner med Unicode-modstykker (det vil sige, at MessageBox kalder MessageBoxW, ikke MessageBoxA).
- Generiske typer , de er også generiske .
- Anonyme metoder .
- Nyt compilerdirektiv $POINTERMATH [ON|OFF].
- Exit-funktionen kan nu acceptere parametre i henhold til funktionens type.
Udgivet i 2011 tilføjede Delphi XE2 en Win64 -kompiler og krydskompilering til Apples operativsystemer (MacOS X, iOS).
Delphi XE5 blev udgivet i 2013 og leverede krydskompilering af applikationer til ARM/Android-enheder.
Kompilere
- Embarcadero Delphi (tidligere CodeGear Delphi og Borland Delphi) er nok den bedst kendte compiler, der er efterfølgeren til Borland Pascal og Turbo Pascal . Brugt af Win16 (Delphi 1), Win32 (Delphi 2 og nyere), Win64 (Delphi 16 (XE2) og nyere), og .NET 1.x, 2.0 (Delphi 8, Delphi 2005-Delphi 2007). .NET-understøttelse blev efterfølgende udskilt til et separat produkt kendt som (Delphi-inkompatibel) Oxygene .
- Free Pascal (FPC) er en gratis Object Pascal-kompiler , der understøtter forskellige Pascal-dialekter, inklusive Turbo Pascal (med nogle forbehold), Delphi og indfødte dialekter. I øjeblikket kan FPC generere kode til x86 , x86-64 , PowerPC , SPARC og ARM processorer såvel som til forskellige operativsystemer, herunder Microsoft Windows , Linux , FreeBSD , Mac OS . Der er flere softwareudviklingsmiljøer til FPC (en af de mest berømte repræsentanter er Lazarus ).
- GNU Pascal (en separat udviklet version fra GCC ). Det har ikke til formål at fortsætte rækken af Delphi-dialekter som en del af Pascal, men indeholder ikke desto mindre Borland Pascal-kompatibilitetstilstanden og er meget langsom til at rumme Delphi-sprogkomponenter. Ikke egnet til at kompilere store projekter, der indeholder Delphi-kode, men de fleste operativsystemer og arkitekturer understøtter det.
- Oxygene (tidligere kendt som Chrome ) er en begrænset Delphi-kompatibel sprogkompiler, der er integreret i Microsoft Visual Studio . Også tilgængelig som en gratis CLI -kommandolinjekompiler . Bruger .NET og monoplatforme. Tidligere solgt under Embarcadero Delphi Prism-mærket.
- MIDletPascal er et programmeringssprog med en Delphi-lignende syntaks og en compiler af samme navn, der konverterer kildekode til kompakt og hurtig Java-bytekode .
- PocketStudio er en Pascal-baseret IDE til Palm OS .
- Virtual Pascal - Gratis compiler og tekst-IDE til Win32, OS/2 og Linux. På det tidspunkt meget hurtigt og meget kompatibelt (delphi 5-konstruktioner er delvist understøttet). Udadtil minder den meget om Borland Pascal 7-tekstmiljøet, selvom der f.eks. ikke er nogen grafik kompatibel med den. Udviklingen sluttede dog i 2004, og kildekoden var ikke åben. Siden da er FPC gået meget længere og er generelt bedre til programmering. Ikke desto mindre forbliver VP en meget god mulighed for en hurtig erstatning for endnu mere forældede versioner af Borland Pascal til skole / institut, givet indbygget arbejde i Win32 uden problemer med russisk kodning.
Syntaks for sproget
Typesystemet
Typesystemet i Delphi er strengt , statisk .
En kort liste over understøttede typer
Følgende datatyper understøttes :
- heltal, signeret og usigneret: Byte, Shortint, Word, Smallint, Cardinal, Integer, UInt64, Int64
- brugerdefinerede enum-typer
- rigtige typer Enkelt, Dobbelt, Udvidet (kun x86-32, på Win64 Extended = Dobbelt), nedarvet Real48 type, der arbejder i heltalsemuleringstilstand. Typen Currencyer ægte med fast præcision.
- linjer. Typen string allokeres automatisk i hukommelsen med referencetælling og Copy-On-Write-paradigmet. I senere versioner af Delphi er tegnene dobbeltbyte, Unicode-kompatible. AnsiString er en lignende implementering for strenge med en tegnbredde på en byte. Sådanne strenge indeholder information om kodningen i servicefeltet. Windows-kompilere fra tidligere versioner har en type WideString, der er fuldt ud kompatibel med typen BSTRi Component Object Model . Det er også tilladt at bruge strenge med en fast længde på højst 255 enkeltbyte tegn. Primitive strengtyper er tilladt, C: stil, PCharogPWideChar
- arrays. Endimensionel, flerdimensionel fast længde, samt lignende dynamik, med referencetælling.
- sæt bestående af elementer af opregningstypen. Den maksimale størrelse af en sådan opregning er 256 elementer.
- Indgange . Strukturel (værdi)type uden arvestøtte. Fra og med Delphi 2006 er der tilføjet understøttelse af indkapsling, metoder og egenskaber. Operatør overbelastning. Fra og med Delphi 10.3 Rio er muligheden for at oprette konstruktører til skrivning blevet tilføjet.
- Klasser og generiske klasser (generiske). En implicit referencetype. Understøttelse af indkapsling, arv, polymorfi, herunder virtuelle konstruktører, attributter, generiske parametre for en klasse og individuelle metoder og metodeafsendelse efter indeks. En klasse kan implementere en eller flere grænseflader, herunder indirekte ved at delegere implementeringen af en grænseflade til en ejendom eller et felt. Multipel nedarvning er ikke understøttet.
- Henvisninger til funktioner og metoder, samt henvisninger til anonyme funktioner.
- Typer er metaklasser , der indeholder en pointer til typen af et objekt (men ikke selve objektet). Primært introduceret til at implementere virtuelle konstruktører og automatisk serialisering.
- grænseflader. COM-kompatibel (på Windows-kompileren), arvet fra samme forfader. Multipel nedarvning er ikke understøttet.
- Dispinterfaces, til at arbejde med IDispatch-grænseflader i sen bindingstilstand.
- Varianttyper Variant ogOleVariant — type med dynamisk indtastning.
- Gamle genstande vedligeholdt for kompatibilitet med Turbo Pascal. I modsætning til en forekomst af en klasse, kan et objekt allokeres på stakken eller statisk. .
Liste over operatorer adskilt af et mellemrum::= + — * / div mod not and or with xor shl shr ^ = <> >= <= < > @ in is as
Kort liste over operatører
- Aritmetik: + — * / div modAddition, subtraktion, multiplikation, division (som giver et reelt resultat), heltalsdivision, restudtræk.
Returtypen skelner mellem heltalsdelingsoperatorerne ( divog mod) og operatoren /. Sidstnævnte, anvendt på både heltals- og reelle operander, resulterer altid i en reel type. Tilføjelsesoperatoren +bruges også til strengsammenkædning (når de indbyggede strengtyper bruges).
- Binær / logisk: not and or xorInversion (negation), "AND", "OR", Eksklusiv "ELLER". Operationstypen (binær eller logisk) afhænger af typen af den første operand.
Bitoperatorer af heltalstyper inkluderer også shl, shr - shift-operatorer, der i betydning svarer til de samme navngivne kommandoer fra Intel x86-processorer.
- Ordinaloperatorer (sammenligningsoperatorer) = <> > < >= <= — ligheder, uligheder (svarer til operatoren !=i C-lignende sprog), større end, mindre end, ikke mindre, ikke mere — gælder for alle ordinale og reelle typer og returnerer en værdi af typeboolean
- Sætoperatorer inkluderer + - * in addition, subtraktion, sæt skæringspunkt og forekomsttestoperatoren, som bruges til at manipulere den indbyggede sættype. De første tre returnerer typen af sættet, den sidste returnerer den booleske type.
Et eksempel på brug af in-operatoren
type
TDayOfWeek = ( mandag , tirsdag , onsdag , torsdag , fredag , lørdag , søndag ) ; //set enum type
TDays = sæt af TDayOfWeek ; //sæt typen er sat
var
dag : TDayOfWeek ;
dage : TDage ;
isMyDay : Boolean ;
begynde
dage := [ søndag , tirsdag , lørdag ] ;
dag := mandag ;
isMyDay := dag i dage ; // in-operatoren returnerer en boolesk værdi, der tager som den første operand en værdi af typen "set element" og som den anden operand en værdi af "set" typen
end ;
- Typestøbningsoperatører () as is - ubetinget støbning, sikker støbning af objekt- og grænsefladetyper og typemedlemskabstestoperatør (returnerer en boolesk værdi). Ubetinget (usikker) støbning bruges i en funktionel stil (typeidentifikator er skrevet til venstre, udtrykket støbt til det er skrevet i parentes til højre) og anvendes på ordinal, reel, struktur, reference, strengtyper. På samme tid, til reference (herunder implicit-reference) typer , er der ingen egentlig cast, men kun en ny fortolkning af de samme data.
Operatorerne asog isgælder for typer, der tillader polymorf adfærd - klasseforekomster og grænseflader. Den første resulterer i en sikker (i betydningen umuligheden af fejlfortolkning) typekonvertering, og den anden test understøttes af en forekomst af en klasse eller grænseflade af en eller anden klasse eller grænseflade. Husk, at i modsætning til i C#, kaster et mislykket cast af en operatør asen undtagelse.
- Referenceoperatorer ^ @ - bruges til at arbejde med pointere.
Operatøren ^derefererer til markøren. Operatøren @gør det modsatte og returnerer variablens adresse. Simple additions- og subtraktionsoperationer understøttes på indtastede pointere, givet størrelsen af de typer, de peger på ( smart pointer-aritmetik).
- Opgaveoperatør :=. I Delphi danner tildelingsoperatoren ikke et udtryk, men en operation, derfor er "strenge" tildelinger ikke tilladt.
I Object Pascal er klasser specielle datatyper, der bruges til at beskrive objekter. Derfor er et objekt, der har typen af en klasse, en forekomst af denne klasse eller en variabel af denne type.
En klasse er en speciel type, der har elementer som felter, egenskaber og metoder. Klassefelter ligner registreringsfelter og bruges til at gemme information om et objekt. Metoder er procedurer og funktioner, der normalt bruges til at behandle felter. Egenskaber er mellemliggende mellem felter og metoder.
Objektorienterede træk ved sproget
At kombinere og skjule objektdata, samt metoder, der behandler dem, inde i en konkret klasse fra brugeren kaldes indkapsling.
Når man opretter nye objekter, kaldes evnen til at få alle egenskaber og metoder fra deres forfædre for arv. Sådanne objekter arver efter deres skabelse alle felter, egenskaber, begivenheder, metoder osv. fra deres forfædre. Arv sparer ofte udviklere for rutinearbejde og giver dem mulighed for hurtigt at begynde at udvikle noget nyt. I modsætning til C++ tillader Delphi ikke multipel nedarvning. I Delphi er det muligt at tilføje metoder til en klasse eller post ved at bruge den såkaldte klassehjælper eller rekordhjælper (klassehjælper eller posthjælper), som, der ikke er en efterkommer af klassen eller posten, der ændres, kan tilføje yderligere metoder til dem. Et eksempel er TStringHelper-hjælperindgangen, der er erklæret i System.SysUtils-modulet.
Delphi implementerer den klassiske polymorfi-model, der er vedtaget i anvendte programmeringssprog, når basisklassemetoder, såvel som referencevariabler af basisklassetypen, er i stand til at manipulere forekomster af efterkommerklasser baseret på kontrakten specificeret i basisklassen. Kontrakten i dette tilfælde er erklæringen om abstrakte metoder i basisklassen.
Eksempler
Programstruktur
Hvert program skrevet på Delphi-sproget består af en programheader (program NewApplication;), et felt af brugte moduler Anvendelser (f.eks. Bruger Windows, Beskeder, SysUtils osv.), som muligvis ikke er inkluderet i selve strukturen, som samt beskrivelsesblokke og udførelser (begynd med en sammensat operator begynde og slutte med slutning.).
program Projekt1 ; // Header af programmet, med dets navn "Project1"
bruger
Forms ,
Unit1 i 'Unit1.pas' {Form1} ; // moduler, der er forbundet med projektet og bruges af programmet
{$R *.res}
begynde
ansøgningen . Initialiser ; // Initialiser applikationen
Application . CreateForm ( TForm1 , Form1 ) ; // Opret formular/vindue
Application . løbe ; // Start og udfør
end .
Eksempel #1
Viser meddelelsen "Hej, verden!" i Delphi-konsolapplikationen
program Helloworld ; //programnavn
{$APPTYPE CONSOLE} //direktiv til compileren for at oprette et konsolprogram
start
writeln ( 'Hej, verden!' ) ; //output besked Hej, verden!
readln ; //vent på, at brugeren trykker på en tast
slut . // programslut
Eksempel #2
Viser meddelelsen "Hej, verden!" i en 32-bit Delphi GUI-applikation
...
procedure TForm1 . Button1Click ( Afsender : TObject ) ; //OnClick hændelseshandler genereret automatisk
begynder
ShowMessage ( 'Hej, verden!' ) ; //output besked Hej, verden!
ende ; //procedurens afslutning
...
Eksempel #3
Dynamisk oprettelse af en liste over strenge og skrivning til en fil.
// Handler for den hændelse, der opstår, når formularen oprettes. MainForm
procedure TMainForm . FormCreate ( Afsender : TObject ) ;
var
// Erklæring af en variabel af typen TStrings (liste over strenge).
Strings : TStrings ;
start
// Oprettelse (allokering af hukommelse og udfyldning af den med startværdier) af et objekt af typen TStringList.
// TStringList er en efterkommer af TStrings, der implementerer sine abstrakte metoder til at gemme strenge i hukommelsen.
Strings := TStringList . skabe ;
prøv
// Tilføjelse af en streng.
Strenge . Tilføj ( 'Linje skal tilføjes.' ) ;
// Gem alle linjer i en fil.
Strenge . SaveToFile ( 'C:\Strings.txt' ) ;
endelig
// Deallokér objektets hukommelse og ryd dets reference for at forhindre utilsigtet adgang til ikke-allokeret hukommelse.
FreeAndNil ( Strings ) ;
ende ;
ende ;
Filtypenavne
- .pas - modulkildekode (pascal)
- .dpr - Projektkildekode (pascal)
- .dproj — Projektkildekode (xml)
- .dproj.local — Projektkildekode (xml)
- .dfm - form kildekode
- .dpk - pakkeprojektets kildekode
- .bpl - kompileret pakke
- .dcu - kompileret modul
- .exe - kompileret ansøgning
- .res - ressourcer
- .dsk - fil links
- .identcache - cachede filtilknytninger
Bemærkelsesværdig Delphi-software
Blandt de mange almindelige softwareprodukter skrevet i Delphi kan man finde [13] :
- Embarcadero-produkter: Embarcadero Delphi , Embarcadero C++ Builder , Borland JBuilder 1 og 2 versioner.
- Databaseadministration og udvikling: MySQL Tools , IBExpert , Open Server.
- Engineering software: Altium Designer , SprutCAM .
- Filhåndtering: Total Commander , Fregate , ViewFD , FreeCommander .
- Grafikfremvisere : FastStone Image Viewer , FuturixImager , drComRead .
- Grafiske redaktører: IcoFX .
- Video- og lydafspillere: Light Alloy , The KMPlayer , AIMP , X-Amp , Nata Player .
- Instant messaging-programmer: QIP 2012 , R&Q , The Bat! , PopTray , FeedDemon , MyChat , Skype (før Microsoft - køb ).
- Fildelingsnetværksklienter: Shareman , Ares Galaxy.
- Musikproduktion: FL Studio , Guitar Pro (op til version 6.0).
- Softwareudvikling: Dev-C++ , DUnit , Game Maker , Inno Setup , PyScripter , PE Explorer
- Webudvikling: Macromedia HomeSite , PHPEdit.
- Teksteditorer: BirEdit , Notepad GNU , Bred (op til Bred 3), PSPad .
- Regnskab og beskatning: Mercury-ERP , " Budget 21 ", " Sejl ", AVARDA (op til version 6.x inklusive), r_keeper , Traider Alpha.
- Elektronisk køsystem " MAXIMA " [14] .
- Programmer til opbevaring og behandling af medicinske billeder Makhaon Worsktation , Makhaon Storage
- Animationssoftware : Pivot Stickfigure Animator .
- Programmer til datakomprimering : ALZip , PowerArchiver , IZArc .
- Find og ødelægge spyware og malware: Spybot - Søg og ødelægge .
- PC-spil: Age of Wonders , " Space Rangers ", Space Rangers HD: Revolution , Venom. Kodenavn: Udbrud , Space Empires V , " Sandheden om det niende kompagni ".
- Portable Application Launcher: PortableApps .
- Diskdefragmentering: SmartDefrag .
- Forskellige systemværktøjer: TreeSize .
- Terminal til arbejde med COM-port: TerminalTMB.
Kritik
Kritik af sproget i de tidlige udviklingsstadier
Kritikken af Pascal går tilbage til 1981 og Brian Kernighans [15] værk , hvis argumenter for det meste er blevet forældede, efterhånden som sproget har udviklet sig.
Innovationer til kompilering på mobile platforme
Nogle sprogændringer implementeret af Embarcadero (sprogudvikler) i de såkaldte Delphi NextGen-kompilere brød med vilje kompatibiliteten med den akkumulerede kildekodebase. Disse ændringer blev negativt modtaget af en lang række erfarne Delphi-udviklere, fordi selvom de bragte sproget tættere på .NET-sprogparadigmet, brød de traditionen med høj bagudkompatibilitet og gjorde det meget sværere at portere eksisterende kildekode til software til mobile platforme. Følgende ændringer udfordrede selve paradigmet med multiplatform, single source-udvikling fremmet af Embarcadero.
- introduktion af nul-base indeksering af strenge
Siden Pascal er den indbyggede strengtype historisk blevet indekseret med en base på én: "null"-elementet i strengen returnerede længden af strengen. Efterhånden som nye (“lange” og “unicode”) strengtyper blev introduceret, blev denne indekseringsrækkefølge opretholdt, hvilket gav en næsten sømløs portabilitet af kodebasen til opdaterede versioner af sproget. Men med introduktionen af næstegen kompilering ændrede paradigmet sig: i nye compilere begyndte strenge at blive indekseret med nul base, som i familien af C-lignende sprog (C ++, C #, Java), mens i de "klassiske" compilere til Windows og Mac OS er paradigmet med enkelt indeksering blevet gemt.
- introduktion af en ikke-alternativ referenceoptællingsmekanisme for klasseforekomster
Historisk set er klasser og deres instanser implicit-reference struct-typer. Livstidsstyringen af en klasseinstans blev dog oprindeligt udført manuelt - ved eksplicit at kalde konstruktøren og destruktoren (eller metoden Free()), og denne funktion er bevaret (fra 2018) i de klassiske versioner af compilere. Referencetælling fungerede kun for klasser, der implementerer grænseflader, og desuden kun i det tilfælde, hvor sådanne klasser blev manipuleret gennem variabler af grænsefladetypen.
Før version 10.4 introducerede compilere til mobile platforme referencetælling for alle forekomster af klasser, og ændrede derved fundamentalt paradigmet for objektlevetidsstyring, da "manuel" styring praktisk talt (bortset fra nogle meget avancerede teknikker) er uforenelig med det nye paradigme.
Siden version 10.4 er en unified memory management-mekanisme [16] blevet introduceret , når den klassiske implementering af objekthukommelseshåndtering bruges til mobil, desktop og server. ARC-hukommelsesstyringsmodelmodellen forblev til styring af strenge og interfacetypereferencer på alle platforme.
Langsom udvikling af sprog betyder
Mange udviklere ser Delphis konservatisme som en dyd, der gør koden meget bærbar og også gør sproget lettere at forstå for nybegyndere.
Men i øjeblikket er situationen sådan, at nye teknologier, paradigmer og endda programmeringssprog dukker op (og vinder popularitet) næsten hvert år. Udviklingen af sprogværktøjer medfører ikke altid afvisning af bagudkompatibilitet.
Et godt eksempel på denne tilgang er
en forsinket introduktion til sproget til at erklære lokale variabler inde i en blok
Før compilerversion 33.0 (Delphi 10.3 Rio) skulle deklarationen af en lokal variabel gå forud for den første instruktion af funktionskoden, og initialisering af lokale (stak)variabler på deklarationsstedet er ikke tilladt. Typeslutning var også umulig.
Til sammenligning var deklaration af en lokal variabel hvor som helst i en funktion naturligt understøttet i C og blev nedarvet af næsten alle sprog, der fulgte den C-lignende stil - C++, C#, Java osv.
Indførelsen af denne sprogfunktion i Delphi blev diskuteret i lang tid, men på det tidspunkt mødte den ikke sprogudviklernes forståelse.
Samtidig kan deklarering af lokale variabler inde i en blok, bortset fra For loop-operationerne, føre til at komplicere læsbarheden af koden for store projekter.
Noter
- ↑ RAD Studio 11.1 Alexandria tilgængelighedsmeddelelse . Arkiveret fra originalen den 20. april 2022. Hentet 12. april 2022.
- ↑ "del-phi"-udtalen dominerer i Storbritannien: en variant af udtalen, der er karakteristisk for Storbritannien (engelsk) (utilgængeligt link) . Merriam-Webster Online Ordbog . Merriam Webster. Hentet 1. oktober 2008. Arkiveret fra originalen 21. august 2011. , og i USA - "del-fi": en variant af den udtale, der er karakteristisk for USA (engelsk) (utilgængeligt link) . Merriam-Webster Online Ordbog . Merriam Webster. Hentet 1. oktober 2008. Arkiveret fra originalen 21. august 2011.
- ↑ David T. Craig. Apple Lisa Computer: Apples og Pascals historie . (ubestemt)
- ↑ Delphi sprogoversigt (downlink)
- ↑ udføres direkte på ARM-processoren )
- ↑ Dmitry Ivanov - Fortællinger om for tidlig optimering på YouTube , der starter kl. 35:40
- ↑ Roman Elizarov - Millioner af citater pr. sekund i ren Java på YouTube , startende ved 58:59
- ↑ Dette er angivet ved kompileringsversionsbetegnelserne. Så i Delphi 7 har compileren et versionsnummer på 15.0 (den seneste version af Borland Pascal / Turbo Pascal blev betegnet 7.0, i Delphi 1 har compileren version 8.0, i Delphi 2 - 9.0 osv. Versionsnummeret 11.0 er Pascal-kompileren, som var en del af miljøet C++ Builder ).
- ↑ Standard Parallels Plesk Panel Side Arkiveret 5. december 2006.
- ↑ Delphi og C++Builder Roadmap (downlink) . Hentet 18. juli 2007. Arkiveret fra originalen 10. oktober 2007. (ubestemt)
- ↑ Databaseværktøjer og udviklersoftware | Embarcadero Technologies (utilgængeligt link) . Dato for adgang: 25. august 2008. Arkiveret fra originalen 29. august 2008. (ubestemt)
- ↑ Delphi fra Embarcadero | Arkiveret fra originalen den 10. juli 2008. RAD Application Development Software
- ↑ Applikationer af god kvalitet bygget med Delphi - Delphi-programmering arkiveret 30. juni 2011 på Wayback Machine
- ↑ MAXIMA elektronisk køsystem . mtg-biz.ru. Dato for adgang: 5. januar 2017. Arkiveret fra originalen 6. januar 2017. (ubestemt)
- ↑ Hvorfor Pascal ikke er mit foretrukne programmeringssprog . Dato for adgang: 23. maj 2016. Arkiveret fra originalen 28. april 2009. (ubestemt)
- ↑ Hvad er nyt i RAD Studio 10.4 Sydney - RAD Studio - Produkter .features-tabs ul.nav.nav-tabs Hvad er nyt i RAD Studio 10.4 RAD Studio 10.4 leverer betydeligt forbedret højtydende native Windows-understøttelse, øget produktivitet med lynende ) ? . Embarcadero hjemmeside . Hentet 15. september 2020. Arkiveret fra originalen 16. september 2020. (ubestemt)
Litteratur
Links