Delphi | |
---|---|
Nyelvóra | kötelező , strukturált , objektumorientált , komponens orientált , magas szintű |
Megjelent | 1986 |
Szerző | Anders Hejlsberg |
Fájlkiterjesztés _ | .pas, .dpr, .dpk, .pp, .dproj, .dfm, .fmx, .bpl |
Kiadás | Delphi 11.1 Alexandria [1] (2022. március 15. ) |
Típusrendszer | statikus , erős |
Főbb megvalósítások | Borland/Inprise/Codegear/Embarcadero Delphi ; Borland Kylix ; ingyenes pascal |
Befolyásolva | Object Pascal , C++ |
befolyásolta | C# , Java [1] |
Weboldal | embarcadero.com/ru/produ… |
Felület | x86, x64, ARM |
OS | Windows , macOS , iOS , Android , Linux |
A Delphi (Delphi, ejtsd: /ˈdɘlˌfi:/ [2] ) egy imperatív, strukturált , objektum-orientált , magas szintű programozási nyelv , amely a változók erős statikus tipizálásával rendelkezik. A fő felhasználási terület az alkalmazásszoftverek írása.
Ez a programozási nyelv az Object Pascal nyelv dialektusa . Az Object Pascal eredetileg egy kicsit más nyelvre utalt, amelyet 1986-ban az Apple -nél fejlesztett ki Larry Tesler csoportja [3] . A Delphi 7-től kezdve [4] azonban Borland fehér könyvei a Delphi nevet kezdték használni a korábban Object Pascal néven ismert nyelvre .
Kezdetben a Delphi fejlesztői környezetet kizárólag Microsoft Windows alkalmazások fejlesztésére szánták , majd egy Linux platformra való változatot valósítottak meg ( Kylix néven), azonban a Kylix 3 2002-es megjelenése után a fejlesztése leállt és a Microsoft támogatása Hamarosan bejelentették a .NET -et , amely viszont a Delphi 2007 megjelenésével megszűnt.
Jelenleg a 32 és 64 bites Windows-os programok fejlesztésének támogatása mellett lehetőség van Apple macOS -re (kezdve az Embarcadero Delphi XE2-vel), iOS - re (beleértve a szimulátort is, az XE4-től kezdve a saját fordítójával), Google Android (a Delphi XE5-től kezdve) [5] , valamint a Linux Server x64 (a Tokyo 10.2-es verziójától).
A fejlesztői környezet független, harmadik féltől származó megvalósítása a Lazarus projekt által ( Delphi kompatibilitási módban fordítva Free Pascal ) lehetővé teszi Delphi-alkalmazások létrehozását olyan platformokra, mint a Linux , a macOS és a Windows CE .
Voltak kísérletek a nyelv használatára GNU projektekben (pl . Notepad GNU ) és fordítóprogram írására a GCC számára ( GNU Pascal ).
IIS internetes szolgáltatások írására szolgál.
A nyelv létrehozásakor (és itt a minőségi különbség a C nyelvhez képest) nem az volt a feladat, hogy a futtatható kód maximális teljesítményét, vagy a forráskód tömörségét biztosítsuk a RAM megtakarítása érdekében. Kezdetben a nyelv a harmóniára és a jó olvashatóságra helyezte a hangsúlyt, mivel a programozási fegyelem megtanítására szolgált. Ez a kezdeti karcsúság később, mind a hardver növekedésével, mind az új paradigmák megjelenése következtében megkönnyítette a nyelv új konstrukciókkal való bővítését.
Így a C++ objektum komplexitása a C-hez képest nagyon jelentősen megnőtt, és megnehezítette az első programozási nyelvként való tanulmányozását, ami az Object Pascalról nem mondható el Pascalhoz képest.
Az alábbiakban bemutatunk néhány különbséget a Delphi szintaxis konstrukciói és a C-szerű nyelvek családja (C/C++/Java/C#) között:
A .NET és a Java platformok nagyban leegyszerűsítették a programok fejlesztését egy "szemétgyűjtő" bevezetésével, amely lehetővé teszi a programozó számára, hogy ne aggódjon a futó programkód hatókörén kívül eső objektumok által elfoglalt memória felszabadítása miatt. Ez egyrészt jelentősen csökkentette az ún. „memóriaszivárgások” problémáját (amikor a címvesztés miatt amúgy is szükségtelen és elérhetetlen adatok foglalják el a RAM-ot), másrészt viszont szükség volt a platform egy összetett és erőforrás-igényes „szemétgyűjtési” algoritmus megvalósítására – amelyet hagyományosan úgy valósítanak meg, hogy megtalálják az elérhető objektumokat, és elengedik a többit. A gyakorlatban az objektumok elérhetőségének kimerítő elemzése érdekében a szemétgyűjtő bizonyos időpontokban felfüggeszti a programot (minden szálát), ami a válaszkészség rövid távú elvesztéséhez vezet. Az ilyen leállások gyakorisága és időtartama közvetlenül függ a rendelkezésre álló RAM mennyiségétől (amíg van szabad memória, a szemétgyűjtő igyekszik nem végezni blokkolási elemzést), valamint a programban részt vevő objektumok számától (így, jobb, ha van néhány "nagy" tárgy, mint sok - kicsi).
A helyzet a programba bevont szálak számának növekedésével romlik, mert a kimerítő elérhetőségi elemzés teljes leállítást igényel. Így a nyilvánvaló előny - a "memóriaszivárgás" problémájának megoldása és általában az objektumok élettartamának automatikus kezelése - a méretezés és a teljesítmény "hiba" implicit problémájához vezetett. Ez a probléma az egyszerű programokban finom, de a kódbázis összetettségének és méretének növekedésével egyre akutabbá válik - vagyis a fejlesztés végső szakaszában. Az összetett szoftverrendszerek általában valós idejű referencia- és reagálási követelményekkel rendelkeznek.
Pontosabban, ha a szemétgyűjtőnek 5-ször több memóriája van, mint amennyire szüksége van, akkor a teljesítménye megegyezik vagy valamivel jobb, mint a közvetlen memóriakezelés. A szemétgyűjtő teljesítménye azonban gyorsan romlik, ha kis csípővel kell dolgozni. 3 méretű szükséges memóriával átlagosan 17%-kal, 2 mérettel pedig 70%-kal lassabb. A szemétgyűjtő is hajlamosabb a lapozásra, ha a memória töredezettségmentes. Ilyen körülmények között az összes általunk tesztelt szemétgyűjtő egy nagyságrenddel lassabb, mint a közvetlen memóriakezelés.Drew Crawford – Miért lassúak a mobilwebes alkalmazások?
A szemétszállítás rezsi csökkentésére tett kísérletek a programozási stílus jelentős torzulásához vezethetnek [6] [7] .
A Delphiben nincs automatikus memóriakezelés: (a klasszikus nyelvi fordítóprogramokban) az osztálypéldányok manuálisan jönnek létre és törlődnek, míg egyes típusoknál - interfészek, karakterláncok és dinamikus tömbök - a referenciaszámláló mechanizmust használják. Általánosságban elmondható, hogy ezen megközelítések egyike sem garantálja a memóriaszivárgás hiányát, másrészt viszont a reszponzivitás problémája nem releváns, a memóriakezelés időráfordítása kicsi, és ami még fontosabb, nyilvánvaló. Ezenkívül szivárgás hiányában a felhasznált RAM teljes mennyisége jelentősen kevesebb, mint a szemétgyűjtőre támaszkodó hasonló alkalmazások.
Az Object Pascal a Turbo Pascal nyelv fejlesztésének eredménye , amely viszont a Pascal nyelvből fejlődött ki . A Pascal egy teljesen procedurális nyelv volt , a Turbo Pascal az 5.5-ös verziótól kezdve objektum-orientált tulajdonságokat adott hozzá a Pascalhoz, és dinamikus adattípus azonosítást adott az Object Pascalhoz, amely képes volt hozzáférni az osztályok metaadataihoz (azaz osztályok és tagjaik leírásához) lefordított kód, más néven introspekció – ezt a technológiát RTTI -nek nevezték el . Mivel minden osztály örökli a TObject alaposztály funkcióit, így bármely objektumra mutató mutató konvertálható azzá, ami után a ClassType metódus és a TypeInfo függvény használható, amely introspekciót biztosít.
Ezenkívül a C ++ Object Pascal megkülönböztető tulajdonsága, hogy az objektumok alapértelmezés szerint a dinamikus memóriában helyezkednek el. A TObject osztály NewInstance és FreeInstance virtuális metódusait azonban felülbírálhatja. Így abszolút bármely osztály teljesítheti a "vágyat", "ahol akarok - ott fogok feküdni". Ennek megfelelően szerveződik a "többhalomozás".
Az Object Pascal (Delphi) a Turbo Pascal [8] funkcionális kiterjesztésének eredménye .
A Delphi óriási hatással volt a .NET platform C# nyelvének koncepciójára . Számos eleme és koncepcionális megoldása beépült a C#-ba. Ennek egyik oka Anders Hejlsberg , a Delphi egyik vezető fejlesztőjének átigazolása a Borland Ltd.-től. a Microsoft Corp.-nál.
A Delphi for .NET egy Delphi fejlesztői környezet , valamint a Delphi (Object Pascal) nyelv, amely a .NET-hez való alkalmazások fejlesztésére összpontosít.
A teljes értékű Delphi .NET fejlesztői környezet első verziója a Delphi 8 volt. Ez csak .NET-hez tette lehetővé alkalmazások írását. A Delphi 2006 támogatja az MDA technológiát az ECO (Enterprise Core Objects) 3.0-s verziójával.
2006 márciusában a Borland úgy döntött, hogy leállítja a JBuilder , Delphi és C ++ Builder integrált fejlesztői környezetek további fejlesztését az irányzat veszteségessége miatt. A cég IDE szektorának eladását tervezték. A szabad szoftverek támogatóinak egy csoportja adománygyűjtést szervezett, hogy megvásárolja a fejlesztői környezet és a fordító jogait a Borlandtól [9] .
Ugyanezen év novemberében azonban úgy döntöttek, hogy nem adják el az IDE üzletágat. Ennek ellenére az IDE-termékek fejlesztését mostantól egy új cég – a CodeGear – fogja irányítani, amelyet teljes egészében a Borland pénzügyileg irányít majd.
2006 augusztusában a Borland kiadta a RAD Studio könnyű verzióját Turbo néven: Turbo Delphi (Win32-hez és .NET-hez), Turbo C#, Turbo C++.
2008 márciusában bejelentették a termékcsalád fejlesztésének végét.
2007 márciusában a CodeGear megörvendeztette a felhasználókat egy frissített Delphi 2007 for Win32 termékcsaláddal és egy teljesen új Delphi 2007 for PHP termékkel.
2007 júniusában a CodeGear bemutatta a jövőre vonatkozó terveit, azaz közzétette az úgynevezett útitervet [10] .
2008. augusztus 25-én az Embarcadero, a CodeGear új tulajdonosa sajtóközleményt tett közzé a Delphi for Win32 2009-hez [11] . A verzió számos újítást hozott a nyelvbe, például [12] :
A 2011-ben kiadott Delphi XE2 Win64 fordítóval és keresztfordítással egészítette ki az Apple operációs rendszereit (MacOS X, iOS).
A 2013-ban kiadott Delphi XE5 alkalmazások kereszt-összeállítását biztosította ARM/Android eszközökhöz.
A Delphi típusrendszere szigorú , statikus .
A támogatott típusok rövid listájaA következő adattípusok támogatottak :
Az operátorok listája szóközzel elválasztva::= + — * / div mod not and or with xor shl shr ^ = <> >= <= < > @ in is as
Az operátorok rövid listájaA visszatérési típus különbséget tesz az egész szám osztási operátorok ( divés mod) és az operátor között /. Ez utóbbi egész és valós operandusokra egyaránt alkalmazva mindig valós típust eredményez. Az összeadás operátort +a karakterlánc összefűzésére is használják (amikor a beépített karakterlánctípusokat használják).
Az egész típusú bitoperátorok közé tartoznak a shl, shr - shift operátorok is, amelyek jelentésükben megfelelnek az Intel x86 processzorok azonos nevű parancsainak.
A asés operátorok isolyan típusokra vonatkoznak, amelyek lehetővé teszik a polimorf viselkedést – osztálypéldányok és interfészek. Az első biztonságos (a félreértelmezés lehetetlensége értelmében) típuskonverziót eredményez, a második pedig valamilyen osztály vagy interfész osztályának vagy interfészének példányán keresztül teszteli a támogatást. Ne feledje, hogy a C#-tól eltérően az operátor hibás asöntése kivételt jelent.
Az operátor ^nem hivatkozik a mutatóra. Az operátor @az ellenkezőjét teszi, visszaadja a változó címét. Az egyszerű összeadás és kivonás a típusos mutatókon támogatott, a típusok méretétől függően ( intelligens mutató aritmetika).
Az Object Pascalban az osztályok speciális adattípusok, amelyeket az objektumok leírására használnak. Ennek megfelelően egy objektum, amelynek egy osztály típusa van, ennek az osztálynak egy példánya vagy egy ilyen típusú változó.
Az osztály egy speciális típus, amelynek olyan elemei vannak, mint a mezők, tulajdonságok és metódusok. Az osztálymezők hasonlóak a rekordmezőkhöz, és egy objektum információinak tárolására szolgálnak. A metódusok olyan eljárások és függvények, amelyeket általában mezők feldolgozására használnak. A tulajdonságok köztesek a mezők és módszerek között.
Az objektumadatok, valamint az azokat feldolgozó metódusok egy konkrét osztályon belüli kombinálását és elrejtését a felhasználó elől beágyazásnak nevezzük.
Új objektumok létrehozásakor öröklődésnek nevezzük azt a képességet, hogy az összes tulajdonságot és metódust az őseiktől megkapják. Az ilyen objektumok létrehozásuk után örökölnek őseiktől minden mezőt, tulajdonságot, eseményt, módszert stb. Az öröklődés gyakran megkíméli a fejlesztőket a rutinmunkától, és lehetővé teszi számukra, hogy gyorsan nekifogjanak valami új fejlesztésének. A C++-tól eltérően a Delphi nem engedélyezi a többszörös öröklődést. A Delphiben lehetőség van egy osztályhoz vagy rekordhoz metódusokat hozzáadni az úgynevezett osztálysegítő vagy rekordsegéd (osztálysegítő vagy rekordsegéd) segítségével, amely nem lévén a módosítandó osztály vagy rekord leszármazottja, további metódusokat tud hozzáadni. nekik. Példa erre a System.SysUtils modulban deklarált TStringHelper helper bejegyzés.
A Delphi az alkalmazott programozási nyelvekben elfogadott klasszikus polimorfizmus-modellt valósítja meg , amikor az alaposztályi metódusok, valamint az alaposztály típusú referenciaváltozók képesek manipulálni a leszármazott osztályok példányait az alaposztályban meghatározott szerződés alapján. A szerződés ebben az esetben az absztrakt metódusok deklarálása az alaposztályban.
Minden Delphi nyelven írt program egy programfejlécből (program NewApplication;), a használt modulok mezőjéből áll (például Uses Windows, Messages, SysUtils stb.), amelyek nem feltétlenül szerepelnek magában a szerkezetben, mivel valamint leírás blokkokat és végrehajtásokat (kezdődik összetett operátorral kezdődik és a végén a end.).
program Projekt1 ; // A program fejléce "Project1" névvel a Forms , Unit1 elemet használja a 'Unit1.pas' {Form1} -ben ; // a projekthez kapcsolódó és a program által használt modulok {$R *.res} kezdje el az alkalmazást . Inicializálja ; // Alkalmazás inicializálása Alkalmazás . CreateForm ( TForm1 , Form1 ) ; // Űrlap/ablak alkalmazás létrehozása . futni ; // Indítsa el és hajtsa végre end .A "Hello, world!" üzenet megjelenítése Delphi konzolalkalmazásban
program Helloworld ; //program neve {$APPTYPE CONSOLE} //irányító a fordítónak egy konzolalkalmazás létrehozásához begin writeln ( 'Hello, world!' ) ; //kimeneti üzenet Hello, world! readln ; //várja, amíg a felhasználó megnyom egy billentyűvéget . // program végeA "Hello, world!" üzenet megjelenítése egy 32 bites Delphi GUI alkalmazásban
... eljárás TForm1 . Button1Click ( Feladó : TObject ) ; //Az OnClick eseménykezelő automatikusan generált kezdődik ShowMessage ( 'Hello, world!' ) ; //kimeneti üzenet Hello, world! vége ; //eljárás vége ...A karakterláncok listájának dinamikus létrehozása és fájlba írása.
// Az űrlap létrehozásakor bekövetkező esemény kezelője MainForm eljárás TMainForm . FormCreate ( Feladó : TObject ) ; var // TStrings típusú változó deklarálása (karakterláncok listája). Strings : TStrings ; begin // TStringList típusú objektum létrehozása (memória lefoglalása és kezdeti értékekkel való feltöltése). // A TStringList a TStrings leszármazottja, amely absztrakt módszereit valósítja meg a karakterláncok memóriában való tárolására. Strings := TStringList . létrehozni ; próbálkozzon // Karakterlánc hozzáadása. Húrok . Add ( 'Hozzáadandó sor.' ) ; // Minden sor mentése fájlba. Húrok . SaveToFile ( 'C:\Strings.txt' ) ; végül // Az objektum memóriájának lefoglalása és hivatkozásának törlése, hogy megakadályozza a nem lefoglalt memóriához való véletlen hozzáférést. FreeAndNil ( Strings ) ; vége ; vége ;A Delphiben írt számos általános szoftvertermék között megtalálható [13] :
A Pascal-kritika története 1981-ig és Brian Kernighan [15] munkásságáig nyúlik vissza , akinek érvei a nyelv fejlődésével többnyire elavultak.
Az Embarcadero (nyelvi fejlesztő) által az úgynevezett Delphi NextGen fordítókban végrehajtott néhány nyelvi változtatás szándékosan megszakította a kompatibilitást a felhalmozott forráskódbázissal. Ezeket a változtatásokat a tapasztalt Delphi fejlesztők széles köre negatívan fogadta, mert bár közelebb hozták a nyelvet a .NET nyelvi paradigmához, megtörték a magas visszamenőleges kompatibilitás hagyományát, és jelentősen megnehezítették a meglévő forráskód szoftverre történő portolását. mobil platformokhoz. A következő változtatások megkérdőjelezték az Embarcadero által támogatott többplatformos, egyetlen forrású fejlesztés paradigmáját.
A Pascal óta a beépített karakterlánctípust történelmileg 1-es bázissal indexelték: a karakterlánc "null" eleme visszaadta a karakterlánc hosszát. Az új („hosszú” és „unicode”) karakterlánc-típusok bevezetésével ez az indexelési sorrend megmaradt, így a kódbázis szinte zökkenőmentes hordozhatóságát biztosította a nyelv frissített verzióihoz. A nextgen fordítás bevezetésével azonban megváltozott a paradigma: az új fordítókban a karakterláncokat nulla bázissal kezdték indexelni, mint a C-szerű nyelvek családjában (C ++, C #, Java), míg a Windows és Mac OS "klasszikus" fordítóiban az egyszeri indexelés paradigmáját megmentették.
Történelmileg az osztályok és példányaik implicit hivatkozású struktúratípusok. Az osztálypéldány élettartam-kezelése azonban eredetileg manuálisan történt - a konstruktor és a destruktor (vagy metódus Free()) explicit meghívásával, és ez a funkció megmarad (2018-tól) a fordítók klasszikus verzióiban. A referenciaszámlálás csak olyan osztályoknál működött, amelyek interfészeket valósítanak meg, és ráadásul csak abban az esetben, ha az ilyen osztályokat interfész típusú változókon keresztül manipulálták.
A 10.4-es verzió előtt a mobil platformok fordítói bevezették a referenciaszámlálást az osztályok minden példányára, ezzel alapjaiban változtatták meg az objektum élettartam-kezelés paradigmáját, mivel a "kézi" kezelés gyakorlatilag (néhány nagyon fejlett technikát leszámítva) nem kompatibilis az új paradigmával.
A 10.4-es verzió óta bevezették az egységes memóriakezelési mechanizmust [16] , amikor az objektummemória-kezelés klasszikus megvalósítását használják mobilra, asztali számítógépre és szerverre. Az ARC memóriakezelési modell megmaradt a karakterláncok és interfésztípus hivatkozások kezelésére minden platformon.
Sok fejlesztő úgy látja, hogy a Delphi konzervativizmusa olyan erény, amely rendkívül hordozhatóvá teszi a kódot, és megkönnyíti a nyelv megértését a kezdő programozók számára.
Jelenleg azonban olyan a helyzet, hogy szinte minden évben megjelennek (és egyre népszerűbbek) új technológiák, paradigmák, sőt programozási nyelvek is. A nyelvi eszközök fejlesztése nem mindig vonja maga után a visszafelé kompatibilitás elutasítását.
Ennek a megközelítésnek a kiváló példája az
egy megkésett bevezetés a lokális változók blokkon belüli deklarálásának nyelvébeA fordító 33.0-s verziója (Delphi 10.3 Rio) előtt a lokális változó deklarációjának meg kellett előznie a függvénykód első utasítását, és a helyi (verem) változók inicializálása a deklarációs oldalon nem megengedett. A típuskövetkeztetés szintén lehetetlen volt.
Összehasonlításképpen, a lokális változó deklarálása a függvényben bárhol natívan támogatott C-ben, és szinte minden olyan nyelv örökölte, amely a C-szerű stílushoz ragaszkodott - C++, C#, Java stb.
Ennek a nyelvi funkciónak a Delphiben való bevezetéséről sokáig szó esett, de akkor még nem találkozott a nyelvfejlesztők megértésével.
Ugyanakkor a lokális változók blokkon belüli deklarálása, kivéve a For ciklus műveleteit, megnehezítheti a nagy projektek kódjának olvashatóságát.
Pascal | |||||||
---|---|---|---|---|---|---|---|
Dialektusok |
| ||||||
Fordítók |
| ||||||
IDE | |||||||
Személyek |
Programozási nyelvek | |
---|---|
|