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 programmeringssproghø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#):

program Projekt32 ; {$APPTYPE KONSOL} {$R *.res} bruger System . Sysutils ; start prøv { TODO -oUser -cConsole Main: Indsæt kode her } undtagen 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 (* 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. .

Operatører

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.

Klasser

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

Indkapsling

At kombinere og skjule objektdata, samt metoder, der behandler dem, inde i en konkret klasse fra brugeren kaldes indkapsling.

Arv

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.

Polymorfi

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] :

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

  1. RAD Studio 11.1 Alexandria tilgængelighedsmeddelelse . Arkiveret fra originalen den 20. april 2022. Hentet 12. april 2022.
  2. "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.
  3. David T. Craig. Apple Lisa Computer: Apples og Pascals historie .
  4. Delphi sprogoversigt  (downlink)
  5. udføres direkte på ARM-processoren )
  6. Dmitry Ivanov - Fortællinger om for tidlig optimeringYouTube , der starter kl. 35:40
  7. Roman Elizarov - Millioner af citater pr. sekund i ren JavaYouTube , startende ved 58:59
  8. 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 ).
  9. Standard Parallels Plesk Panel Side Arkiveret 5. december 2006.
  10. Delphi og C++Builder Roadmap (downlink) . Hentet 18. juli 2007. Arkiveret fra originalen 10. oktober 2007. 
  11. Databaseværktøjer og udviklersoftware | Embarcadero Technologies (utilgængeligt link) . Dato for adgang: 25. august 2008. Arkiveret fra originalen 29. august 2008. 
  12. Delphi fra Embarcadero | Arkiveret fra originalen den 10. juli 2008. RAD Application Development Software
  13. Applikationer af god kvalitet bygget med Delphi - Delphi-programmering arkiveret 30. juni 2011 på Wayback Machine 
  14. MAXIMA elektronisk køsystem . mtg-biz.ru. Dato for adgang: 5. januar 2017. Arkiveret fra originalen 6. januar 2017.
  15. Hvorfor Pascal ikke er mit foretrukne programmeringssprog . Dato for adgang: 23. maj 2016. Arkiveret fra originalen 28. april 2009.
  16. 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.

Litteratur

Links