A compiler, és az interpreter mért más?
Az interpreter azonnali végrehajtást jelent, a compiler több lépést tesz meg, amíg a futtatható binárist elkészíti.
Az interpreter előnye, hogy ha elszáll az interpretált kód, akkor nem rántja magával a rendszert. A compiled kód esetében ennek veszélye régebben még fennált.
A fordítás (compiling) folyamata nem ritkán nagyon lassú tud lenni. A forrás analízise, felbontása, transzkódolása, olykor egynél több lépésben történő optimalizálása. Ezután jön a tiszta kód assemblálása majd a tárgykód szerkesztése, futtathatóvá tétele, majd futtatása.
A magas szintű nyelvek sem csak interpretáltak. Maga a nyelv csupán egy specifikáció, egy meghatározás. Egy nyelvtani szabályrendszer. Aztán ha erre a formalizmusra születik compiler, akkor jó, ha csak interpreter, akkor meg, ez van.
Mi értelme az interpreternek? Sok esetben van szükség kisebb feladatokat ellátó programocskákra, olyanokra, amiknél a futásidő nem elsődleges szempont. Ehhez még hozzájöhet az, hogy ezeket sok esetben itt-ott módosítani szükséges. Rendszer adminisztráció, adat szűrés, stb. Na, ilyen dolgokra jó egy interpretált nyelv.
Az előbbihez: Van egymenetes compiler is, ami a forrásból egy lépésben csinál binárist, futtatható állományt, de ilyenek használata ma már nem túl gyakori. Összességében a feladat jellege, milyensége határozza meg a programozási nyelvet, de esetenként azt is, hogy a válaszott nyelven születő kód interpretálva, vagy fordítva lesz. De például BASIC-hez, Pascal-hoz, C-hez van interpreter is és compiler is.
"Lehetne magas szintű kód is gyorsabb, ha azt is compiler fordítaná."
Való igaz.
De erre nem minidg van szükség, illetve nem mindig praktikus.
A fordított és értelmezett nyelveknek általában más-más a felhasználási területük.
Legalábbis eredetileg úgy tervezték. Aztán a divat sok mindent felülír. De ez már más kérdés. Alapvetően az értelmezett nyelvek fő célja relatíve kis szkriptek írása, amiket azonnal ki lehet próbálni, nem célunk publikálni ezeket, viszont előny, ha platform- és architektúra-függetlenek.
Alapvetően a compiler a fordító, ami a programodból bináris, a számítógép által futtatható anyagot készít.
Az interpreter egy értelmező, ami a programsoraidat értelmezi és hajtja végre.
Fordított kód pl. a C, C#, C++, Delphi és nagyon sok társukból keletkezik, értelmezett kód pedig pl. alapvetően a Basic, Python, Perl és társaik.
A fordított kód jellemzően jobban optimalizált, az értelmezett kód pedig jellemzően könnyebben módosítható (az eredeti forrás megléte nélkül).
Magas szintű kód is lehet fordított, meg persze értelmezett is.
A szint ebben az értelemben azt jelenti, mennyire áll közel a gép által közvetlenül értelmezhető kódhoz.
Egy magas szintű nyelv tartalmaz bonyolultabb nyelvi elemeket, amit pl. egy fordítónak értelmezni kell és lefordítani gépi kódra... adott esetben az egyes struktúrák vagy objektumorientáltság nem létezik gépi kód szintjén, az csak egy absztrakció, amit a nyelv tesz fölé.
Ha viszonylag egyszerű feladatot kell megoldanod, akkor majdnem mindegy, hogy milyen nyelven készül.
Bonyolultabb esetben (pl. játékmotor, operációs rendszer kódjai) pedig fontos az, hogy optimalizált legyen a kód, vagyis fordított...
A kétféle megoldás alapvetően más célra használható elsősorban.
Az interpretált kód nagy előnye, hogy ahol megvan a futtató környezet (interpreter, libraryk, stb) ott anélkül fut, hogy bármit kéne módosítani, binárist kéne hozzá csinálni, stb. Tehát egyszer megírod és működik mindenhol (a valóság persze ennél kicsit bonyolultabb)
A fordított kód esetén ahány féle környezetben szeretnéd, hogy működjön (pl. Windows, Linux, stb), annyiszor kell a megfelelő fordítóval előállítani a binárist (azt nem várhatod el, hogy a felhasználó lefordítsa magának)
Attól, hogy egy szoftvert assemblyben írnak még nem lesz automatikusan gyorsabb, mint egy fordított nyelv (mint pl. a C++), mert a fordítókban sok optimalizáció van. Viszont több egy assemblbyben a lehetőség gyorsítani a kódon
"Attól, hogy egy szoftvert assemblyben írnak még nem lesz automatikusan gyorsabb, mint egy fordított nyelv (mint pl. a C++), mert a fordítókban sok optimalizáció van."
Ezt azért érdemes hozzágondolni:
Az, aki assemblyben meg tud írni egy olyan programot, ami C-ben is legalább ezer sor, az legalább olyan jóra meg tudja írni, mint amit egy C fordító generálna C forrásból, ráadásul, az assembly fordítók is képesek optimalizálni.
Ugyanakkor, a C, C++ fordítók optimalizálói sem tudnak mit kezdeni rosszul strukturált kóddal, hiszen nem látják át az egész forrást.
#7 Az assembler az assembly (ASM) kód fordítója.
Maga az assembly kód tulajdonképpen a leginkább gépközeli nyelv (leszámítva a hexa editorral szerkesztést), ami azt is jelenti, hogy a leginkább optimalizált kódot ezzel tudod írni (de ehhez az is kell, hogy te magad "ügyes légy", vagyis nem biztos, hogy sikerülni fog), másrészt sokkal-sokkal hosszabb lesz a megírt program mint egy magasabb szintű nyelvnél.
Olyat is szoktak csinálni, hogy magasabb szintű nyelvben helyeznek el kritikus részen assembly kódot (pl. Pascal és C-ben is van ilyen lehetőség), a többi programrész marad az eredeti nyelven.
Az assembly nagy hátránya, hogy platformfüggő - csak olyan hardveren fut, amire készítették.
Magasabb szintű nyelv esetén viszont beállíthatod a platformot és lefordíthatod más eszközökre is (itt is lehetnek egyedi kódrészek, de sok esetben tényleg csak beállítani kell).
Kapcsolódó kérdések:
Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!