Delphi | |
---|---|
Clasa de limba | imperativ , structurat , orientat pe obiecte , orientat pe componente , la nivel înalt |
Aparut in | 1986 |
Autor | Anders Hejlsberg |
Extensie de fișier | .pas, .dpr, .dpk, .pp, .dproj, .dfm, .fmx, .bpl |
Eliberare | Delphi 11.1 Alexandria [1] (15 martie 2022 ) |
Tip sistem | static , puternic |
Implementări majore | Borland/Inprise/Codegear/Embarcadero Delphi ; Borland Kylix ; pascal liber |
A fost influențat | Obiect Pascal , C++ |
influențat | C# , Java [1] |
Site-ul web | embarcadero.com/ru/produ… |
Platformă | x86, x64, ARM |
OS | Windows , macOS , iOS , Android , Linux |
Delphi (Delphi, pronunțat /ˈdɘlˌfi:/ [2] ) este un limbaj de programare la nivel înalt , imperativ, structurat , orientat pe obiecte , cu tipărire statică puternică a variabilelor. Domeniul principal de utilizare este scrierea de aplicații software.
Acest limbaj de programare este un dialect al limbajului Object Pascal . Obiectul Pascal sa referit inițial la un limbaj ușor diferit care a fost dezvoltat la Apple în 1986 de grupul lui Larry Tesler [3] . Cu toate acestea, începând cu Delphi 7 [4] , lucrările lui Borland au început să folosească numele Delphi pentru a se referi la limbajul cunoscut anterior ca Object Pascal .
Inițial, mediul de dezvoltare Delphi a fost destinat exclusiv dezvoltării aplicațiilor Microsoft Windows , apoi a fost implementată o variantă pentru platformele Linux (marca Kylix ), cu toate acestea, după lansarea Kylix 3 în 2002, dezvoltarea sa a fost întreruptă și suportul pentru Microsoft . În curând a fost anunțat .NET , care, la rândul său, a fost întrerupt odată cu lansarea Delphi 2007.
În prezent, împreună cu suportul pentru dezvoltarea de programe pe 32 și 64 de biți pentru Windows, este posibil să se creeze aplicații pentru Apple macOS (începând cu Embarcadero Delphi XE2), iOS (inclusiv un simulator, începând cu XE4 folosind propriul compilator), Google Android (începând cu Delphi XE5) [5] , precum și Linux Server x64 (începând cu versiunea 10.2 Tokyo).
O implementare independentă, terță parte, a mediului de dezvoltare de către proiectul Lazarus ( Free Pascal , atunci când este compilat în modul de compatibilitate Delphi) îi permite să fie utilizat pentru a construi aplicații Delphi pentru platforme precum Linux , macOS și Windows CE .
Au existat, de asemenea, încercări de a folosi limbajul în proiecte GNU (de ex. Notepad GNU ) și de a scrie un compilator pentru GCC ( GNU Pascal ).
Folosit pentru a scrie servicii de internet IIS.
La crearea limbajului (și aici diferența calitativă față de limbajul C), sarcina nu a fost să asigure performanța maximă a codului executabil sau concizia codului sursă pentru a salva RAM. Inițial, limbajul s-a concentrat pe armonie și lizibilitate ridicată, deoarece era destinat să predea disciplina programarii. Această zveltețe inițială mai târziu, atât pe măsură ce hardware-ul a crescut, cât și ca urmare a apariției de noi paradigme, a făcut mai ușoară extinderea limbajului cu noi constructe.
Astfel, complexitatea obiectului C++, în comparație cu C, a crescut foarte semnificativ și a făcut dificilă studierea lui ca prim limbaj de programare, ceea ce nu se poate spune despre Object Pascal în comparație cu Pascal.
Următoarele sunt câteva dintre diferențele dintre constructele de sintaxă Delphi și familia de limbaje asemănătoare C (C/C++/Java/C#):
Platformele .NET și Java au simplificat foarte mult dezvoltarea programelor prin introducerea unui „colector de gunoi”, care permite programatorului să nu-și facă griji cu privire la eliberarea memoriei ocupate de obiectele care au ieșit din sfera de aplicare a codului programului care rulează. Acest lucru, pe de o parte, a redus semnificativ problema așa-numitelor „scurgeri de memorie” (atunci când datele care sunt deja inutile și inaccesibile din cauza pierderii adresei ocupă RAM), dar, pe de altă parte, a necesitat platformă pentru a implementa un algoritm complex și intensiv de „colectare a gunoiului” – care este implementat în mod tradițional pentru a găsi obiecte accesibile și a elibera restul. În practică, pentru a efectua o analiză exhaustivă a accesibilității obiectelor, colectorul de gunoi la un moment dat suspendă programul (toate firele sale), ceea ce duce la o pierdere pe termen scurt a capacității de răspuns. Frecvența și durata unor astfel de opriri depind direct de cantitatea de RAM disponibilă (atâta timp cât există memorie liberă, colectorul de gunoi încearcă să nu efectueze analize de blocare), precum și de numărul de obiecte implicate în program (astfel, este mai bine să ai câteva obiecte „mari” decât multe – mici).
Situația se înrăutățește pe măsură ce numărul de fire implicate în program crește, deoarece o analiză exhaustivă a accesibilității necesită o oprire completă. Astfel, beneficiul evident – rezolvarea problemei „scurgerii de memorie” și, în general, gestionarea automată a duratei de viață a obiectelor – a dat naștere implicită a problemei de scalare și „eșecuri” de performanță. Această problemă este subtilă în programele simple, dar pe măsură ce complexitatea și dimensiunea bazei de cod crește, devine din ce în ce mai acută - adică în stadiul final de dezvoltare. Sistemele software complexe, de regulă, au cerințe de referință și de reacție în timp real.
Mai exact, atunci când colectorul de gunoi are de 5 ori mai multă memorie decât are nevoie, performanța sa este egală sau puțin mai bună decât gestionarea directă a memoriei. Cu toate acestea, performanța colectorului de gunoi se degradează rapid atunci când trebuie să lucreze cu șolduri mici. Cu 3 dimensiuni de memorie necesară, este în medie cu 17% mai lentă, iar cu 2 dimensiuni este cu 70% mai lentă. De asemenea, colectorul de gunoi este mai predispus la paginare dacă memoria este defragmentată. În astfel de condiții, toți colectorii de gunoi pe care i-am testat sunt cu un ordin de mărime mai lenți decât gestionarea directă a memoriei.Drew Crawford - De ce aplicațiile web mobile sunt lente
Încercările de reducere a suprasolicitarii colectării gunoiului pot duce la o distorsiune semnificativă a stilului de programare [6] [7] .
Nu există o gestionare automată a memoriei în Delphi: (în compilatoarele de limbaj clasice ) instanțele de clasă sunt create și șterse manual, în timp ce pentru unele tipuri - interfețe, șiruri și matrice dinamice, este folosit mecanismul de numărare a referințelor. Niciuna dintre aceste abordări, în general, nu garantează absența scurgerilor de memorie, dar, pe de altă parte, problema receptivității nu este relevantă, timpul de gestiune a memoriei este mic și, mai important, evident. De asemenea, în absența scurgerilor, cantitatea totală de RAM utilizată este semnificativ mai mică decât aplicațiile similare care se bazează pe colectorul de gunoi.
Obiectul Pascal este rezultatul dezvoltării limbajului Turbo Pascal , care, la rândul său, s-a dezvoltat din limbajul Pascal . Pascal a fost un limbaj complet procedural , Turbo Pascal, începând cu versiunea 5.5, a adăugat proprietăți orientate pe obiect la Pascal și identificarea dinamică a tipului de date la Object Pascal cu posibilitatea de a accesa metadatele clasei (adică de a descrie clasele și membrii acestora) în cod compilat, numit și introspecție - această tehnologie a fost denumită RTTI . Deoarece toate clasele moștenesc funcțiile clasei de bază TObject, orice pointer către un obiect poate fi convertit în acesta, după care se pot folosi metoda ClassType și funcția TypeInfo, care vor oferi introspecție.
De asemenea, o proprietate distinctivă a Object Pascal din C++ este că obiectele sunt localizate implicit în memoria dinamică. Cu toate acestea, puteți suprascrie metodele virtuale NewInstance și FreeInstance ale clasei TObject. Astfel, absolut orice clasă poate îndeplini „dorința” „unde vreau – acolo voi minți”. În consecință, „multi-heaping” este organizat.
Obiectul Pascal (Delphi) este rezultatul unei extensii funcționale a Turbo Pascal [8] .
Delphi a avut un impact uriaș asupra conceptului de limbaj C# pentru platforma .NET . Multe dintre elementele și soluțiile sale conceptuale au fost încorporate în C#. Unul dintre motive este transferul lui Anders Hejlsberg , unul dintre principalii dezvoltatori ai Delphi, de la Borland Ltd. la Microsoft Corp.
Delphi pentru .NET este un mediu de dezvoltare Delphi , precum și limbajul Delphi (Object Pascal), axat pe dezvoltarea de aplicații pentru .NET.
Prima versiune a unui mediu de dezvoltare Delphi cu drepturi depline pentru .NET a fost Delphi 8. A permis scrierea de aplicații numai pentru .NET. Delphi 2006 acceptă tehnologia MDA cu ECO (Enterprise Core Objects) versiunea 3.0.
În martie 2006, Borland a decis să oprească îmbunătățirea ulterioară a mediilor de dezvoltare integrate JBuilder , Delphi și C++ Builder din cauza nerentabilității acestei direcții. S-a planificat vânzarea sectorului IDE al companiei. Un grup de susținători de software liber a organizat o strângere de fonduri pentru a cumpăra drepturile asupra mediului de dezvoltare și compilator de la Borland [9] .
Totuși, în noiembrie același an, s-a luat decizia de a nu vinde afacerea IDE. Cu toate acestea, dezvoltarea produselor IDE va fi acum gestionată de o nouă companie - CodeGear, care va fi complet controlată financiar de Borland.
În august 2006, Borland a lansat o versiune ușoară a RAD Studio numită Turbo: Turbo Delphi (pentru Win32 și .NET), Turbo C#, Turbo C++.
În martie 2008, a fost anunțat sfârșitul dezvoltării acestei linii de produse.
În martie 2007, CodeGear a mulțumit utilizatorilor cu o linie actualizată de Delphi 2007 pentru produse Win32 și lansarea unui produs complet nou Delphi 2007 pentru PHP.
În iunie 2007, CodeGear și-a prezentat planurile de viitor, adică a publicat așa-numita foaie de parcurs [10] .
Pe 25 august 2008, Embarcadero, noul proprietar al CodeGear, a publicat un comunicat de presă despre Delphi pentru Win32 2009 [11] . Versiunea a adus multe inovații limbajului, cum ar fi [12] :
Lansat în 2011, Delphi XE2 a adăugat un compilator Win64 și o compilare încrucișată pentru sistemele de operare Apple (MacOS X, iOS).
Lansat în 2013, Delphi XE5 a oferit o compilare încrucișată a aplicațiilor pentru dispozitive ARM/Android.
Sistemul de tipuri din Delphi este strict , static .
O listă scurtă de tipuri acceptateSunt acceptate următoarele tipuri de date :
Lista operatorilor separați printr-un spațiu::= + — * / div mod not and or with xor shl shr ^ = <> >= <= < > @ in is as
Lista scurtă de operatoriTipul de returnare distinge între operatorii de diviziune întregi ( divși mod) și operatorul /. Acesta din urmă, aplicat atât la operanzi întregi, cât și la operanzi reali, are ca rezultat întotdeauna un tip real. Operatorul de adăugare +este folosit și pentru concatenarea șirurilor (când sunt utilizate tipurile de șiruri încorporate).
Operatorii de biți de tipuri întregi includ și operatorii shl, shr - shift, corespunzând în sensul comenzilor cu același nume ale procesoarelor Intel x86.
Operatorii asși isse aplică tipurilor care permit comportamentul polimorf - instanțe de clasă și interfețe. Primul are ca rezultat o conversie de tip sigur (în sensul imposibilității interpretării greșite), iar cel de-al doilea testează suportul de către o instanță a unei clase sau interfețe a unei clase sau interfețe. Amintiți-vă că, spre deosebire de C#, o distribuție nereușită de către un operator asaruncă o excepție.
Operatorul ^dereferențează indicatorul. Operatorul @face invers, returnând adresa variabilei. Operațiile simple de adunare și scădere sunt acceptate pe pointerii tipați, având în vedere dimensiunea tipurilor către care indică ( aritmetică inteligentă a indicatorului).
În Object Pascal, clasele sunt tipuri speciale de date folosite pentru a descrie obiecte. În consecință, un obiect care are tipul unei clase este o instanță a acestei clase sau o variabilă de acest tip.
O clasă este un tip special care are elemente precum câmpuri, proprietăți și metode. Câmpurile de clasă sunt similare câmpurilor de înregistrare și sunt folosite pentru a stoca informații despre un obiect. Metodele sunt proceduri și funcții care sunt de obicei utilizate pentru procesarea câmpurilor. Proprietățile sunt intermediare între câmpuri și metode.
Combinarea și ascunderea datelor obiectului, precum și a metodelor care le procesează, în interiorul unei clase concrete de la utilizator se numește încapsulare.
Atunci când se creează obiecte noi, capacitatea de a obține toate proprietățile și metodele de la strămoșii lor se numește moștenire. Astfel de obiecte moștenesc după crearea lor toate câmpurile, proprietățile, evenimentele, metodele etc. de la strămoșii lor. Moștenirea salvează adesea dezvoltatorii de munca de rutină și le permite să înceapă rapid să dezvolte ceva nou. Spre deosebire de C++, Delphi nu permite moștenirea multiplă. În Delphi, este posibil să se adauge metode la o clasă sau înregistrare folosind așa-numitul class helper sau record helper (clas helper sau record helper), care, nefiind un descendent al clasei sau înregistrării care se modifică, poate adăuga metode suplimentare. lor. Un exemplu este intrarea de ajutor TStringHelper declarată în modulul System.SysUtils.
Delphi implementează modelul clasic de polimorfism adoptat în limbajele de programare aplicate , atunci când metodele clasei de bază, precum și variabilele de referință de tipul clasei de bază, sunt capabile să manipuleze instanțe ale claselor descendente pe baza contractului specificat în clasa de bază. Contractul în acest caz este declararea metodelor abstracte în clasa de bază.
Fiecare program scris în limbajul Delphi constă dintr-un antet de program (program NewApplication;), un câmp de module utilizate Utilizări (de exemplu, Uses Windows, Messages, SysUtils etc.), care este posibil să nu fie incluse în structura în sine, ca precum și blocuri de descriere și execuții (începe cu un operator compus începe și se termină cu final.).
program Project1 ; // Antetul programului, cu numele „Proiect1” folosește Forms , Unit1 în 'Unit1.pas' {Form1} ; // module care sunt conectate la proiect și utilizate de program {$R *.res} începe aplicația . Inițializați ; // Inițializați aplicația Aplicație . CreateForm ( TForm1 , Form1 ) ; // Creați formular/fereastră Aplicație . alerga ; // Lansați și executați end .Afișarea mesajului „Bună, lume!” în aplicația de consolă Delphi
programul Helloworld ; //numele programului {$APPTYPE CONSOLE} //directivă către compilator pentru a crea o aplicație de consolă începe writeln ( 'Bună, lume!' ) ; //mesaj de ieșire Salut, lume! readln ; //așteptați ca utilizatorul să apese o tastă finală . // sfârşitul programuluiAfișarea mesajului „Bună, lume!” într-o aplicație GUI Delphi pe 32 de biți
... procedura TForm1 . Button1Click ( Expeditor : TObject ) ; //Managerul de evenimente OnClick generat automat începe ShowMessage ( 'Bună, lume!' ) ; //mesaj de ieșire Salut, lume! sfârşitul ; //sfârșitul procedurii ...Crearea dinamică a unei liste de șiruri și scrierea acesteia într-un fișier.
// Handler pentru evenimentul care apare la crearea formularului procedura MainForm TMainForm . FormCreate ( Expeditor : TObject ) ; var // Declararea unei variabile de tip TStrings (lista de șiruri). Șiruri de caractere : TStrings ; begin // Crearea (alocarea memoriei și completarea acesteia cu valori inițiale) a unui obiect de tip TStringList. // TStringList este un descendent al TStrings care implementează metodele sale abstracte pentru a stoca șiruri de caractere în memorie. Șiruri := TStringList . a crea ; try // Adăugarea unui șir. Coarde . Adăugați ( „Linie de adăugat.” ) ; // Salvați toate liniile într-un fișier. Coarde . SaveToFile ( 'C:\Strings.txt' ) ; în final // Dealocați memoria obiectului și ștergeți referința acestuia pentru a preveni accesul neintenționat la memoria nealocată. FreeAndNil ( șiruri ) ; sfârşitul ; sfârşitul ;Printre numeroasele produse software comune scrise în Delphi, se poate găsi [13] :
Istoria criticii lui Pascal datează din 1981 și lucrările lui Brian Kernighan [15] , ale cărui argumente au devenit în mare parte învechite pe măsură ce limbajul a evoluat.
Unele modificări de limbaj implementate de Embarcadero (dezvoltatorul de limbă) în așa-numitele compilatoare Delphi NextGen au rupt intenționat compatibilitatea cu baza de cod sursă acumulată. Aceste modificări au fost primite negativ de o gamă largă de dezvoltatori Delphi cu experiență, deoarece, deși au adus limbajul mai aproape de paradigma limbajului .NET, au spart tradiția compatibilității cu versiuni inverse ridicate și au făcut mult mai dificilă portarea codului sursă existent la software. pentru platformele mobile. Următoarele modificări au provocat însăși paradigma dezvoltării multiplatformă, sursă unică, promovată de Embarcadero.
De la Pascal, tipul de șir încorporat a fost istoric indexat cu o bază de unu: elementul „null” al șirului a returnat lungimea șirului. Pe măsură ce au fost introduse noi tipuri de șiruri („lung” și „unicode”), această ordine de indexare a fost menținută, oferind o portabilitate aproape perfectă a bazei de cod la versiuni actualizate ale limbii. Cu toate acestea, odată cu introducerea compilației nextgen, paradigma s-a schimbat: în compilatoarele noi, șirurile au început să fie indexate la bază zero, ca în familia limbajelor asemănătoare C (C ++, C #, Java), în timp ce în compilatoarele „clasice” pentru Windows și Mac OS, paradigma indexării unice a fost salvată.
Din punct de vedere istoric, clasele și instanțele lor sunt tipuri de structuri cu referință implicită. Cu toate acestea, gestionarea duratei de viață a unei instanțe de clasă a fost inițial făcută manual - prin apelarea explicită a constructorului și a destructorului (sau a metodei Free()), iar această caracteristică este păstrată (din 2018) în versiunile clasice ale compilatoarelor. Numărarea referințelor a funcționat doar pentru clasele care implementează interfețe și, în plus, doar în cazul în care astfel de clase au fost manipulate prin variabile de tipul interfeței.
Înainte de versiunea 10.4, compilatoarele pentru platformele mobile au introdus numărarea referințelor pentru toate instanțele claselor, schimbând astfel fundamental paradigma managementului duratei de viață a obiectelor, deoarece managementul „manual” este practic (cu excepția unor tehnici foarte avansate) incompatibil cu noua paradigmă.
Începând cu versiunea 10.4, a fost introdus un mecanism unificat de gestionare a memoriei [16] , când implementarea clasică a managementului memoriei obiect este utilizată pentru mobil, desktop și server. Modelul modelului de management al memoriei ARC a rămas pentru gestionarea șirurilor și a referințelor tip interfață pe toate platformele.
Mulți dezvoltatori văd conservatorismul lui Delphi ca pe o virtute care face codul extrem de portabil și, de asemenea, face limbajul mai ușor de înțeles pentru programatorii începători.
Cu toate acestea, în prezent, situația este astfel încât noile tehnologii, paradigme și chiar limbaje de programare apar (și câștigă popularitate) aproape în fiecare an. Dezvoltarea instrumentelor lingvistice nu implică întotdeauna respingerea compatibilității cu retrocompatibilitatea.
Un prim exemplu al acestei abordări este
o introducere întârziată în limbajul declarării variabilelor locale în interiorul unui blocÎnainte de versiunea compilatorului 33.0 (Delphi 10.3 Rio), declararea unei variabile locale trebuia să preceadă prima instrucțiune a codului funcției, iar inițializarea variabilelor locale (stive) la site-ul declarației nu este permisă. Inferența tipului a fost, de asemenea, imposibilă.
Prin comparație, declararea unei variabile locale oriunde într-o funcție a fost acceptată nativ în C și a fost moștenită de aproape toate limbile care au aderat la stilul C-like - C++, C#, Java etc.
Introducerea acestei caracteristici de limbaj în Delphi a fost discutată mult timp, dar la acel moment nu a întâlnit înțelegerea dezvoltatorilor de limbaj.
În același timp, declararea variabilelor locale în interiorul unui bloc, cu excepția operațiunilor în buclă For, poate duce la complicarea lizibilității codului proiectelor mari.
Pascal | |||||||
---|---|---|---|---|---|---|---|
Dialectele |
| ||||||
Compilatoare |
| ||||||
IDE | |||||||
Persoane |
Limbaje de programare | |
---|---|
|