Fordító - olyan program vagy technikai eszköz, amely a program fordítását végzi [1] [2] .
A program fordítása az egyik programozási nyelven bemutatott program átalakítása egy másik nyelven írt programmá. A fordító általában hibadiagnosztikát is végez, azonosító szótárakat generál, kinyomtatja a programszöveget stb. [1]
Azt a nyelvet, amelyen a bemeneti program bemutatásra kerül, forrásnyelvnek , magát a programot pedig forráskódnak nevezzük . A kimeneti nyelvet célnyelvnek nevezzük .
Általános esetben a fordítás fogalma nem csak a programozási nyelvekre vonatkozik, hanem más nyelvekre is - mind a formális számítógépes nyelvekre (például HTML jelölőnyelvek ), mind a természetes nyelvekre ( orosz , angol stb. ) 3] [4] .
Többféle fordító létezik [2] .
A fordítás célja, hogy a szöveget egy nyelvről a címzett számára érthető nyelvre alakítsák át. Számítógépes program sugárzásakor a címzett lehet:
Adás típusai:
A processzor (eszköz, gép) nyelvét gépi nyelvnek, gépi kódnak nevezzük . A gépi nyelvi kódot a processzor hajtja végre. A gépi nyelv általában alacsony szintű nyelv , de vannak olyan processzorok, amelyek magas szintű nyelveket használnak (például iAPX-432 [5] ). Az ilyen processzorok azonban bonyolultságuk és magas költségük miatt nem terjedtek el.
A fordító egyfajta fordító, amely a forráskódot programozási nyelvből gépi nyelvvé alakítja [6] .
Az összeállítási folyamat általában több lépésből áll:
A program használhatja az operációs rendszer és a harmadik féltől származó könyvtárak által biztosított szolgáltatásokat (például a fájlokkal való munkavégzésre szolgáló könyvtárakat és a grafikus felület létrehozására szolgáló könyvtárakat). A csatolás vagy csatolás azért történik , hogy más objektumfájlokból gépi kódot ( statikus könyvtárak kódja) és dinamikus könyvtárakra vonatkozó információkat adjon hozzá egy objektumfájlhoz . A linkelést vagy linkelést a linker vagy linker végzi . A linker lehet egy önálló program vagy egy fordítóprogram része . A linker létrehoz egy végrehajtható fájlt . A végrehajtható fájl (program) a következőképpen indul el:
Összeállítás előnyei:
Összeállítás hátrányai:
Az assembler egy olyan fordító, amely a szöveget assembly nyelvről gépi nyelvre konvertálja . Az Assembly nyelv a gépi nyelvhez közel álló, alacsony szintű nyelv .
Az értelmezés a forráskód olvasásának és végrehajtásának folyamata . Tolmács programmal valósítva meg .
A tolmács kétféleképpen dolgozhat:
Az első esetben a fordítást nem, a második esetben pedig a forráskód köztes kódra történő fordítását alkalmazzák.
A tolmács szakaszai:
Az értelmező modellez egy gépet ( virtuális gép ), végrehajtja a gépi parancsok lekérési-végrehajtási ciklusát. A gépi parancsokat nem gépi nyelven írják, hanem magas szintű nyelven . Az értelmezőt virtuális gép nyelvi végrehajtójának nevezhetjük .
A tiszta értelmezést általában olyan egyszerű szerkezetű nyelvekre alkalmazzák, mint például a szkriptnyelvek , az APL és a Lisp .
Példák bájtkódot előállító interpretátorokra : Perl , PHP , Python , Erlang .
A tolmácsok előnyei a fordítókkal szemben:
A tolmácsok hátrányai a fordítókhoz képest:
Egy tiszta értelmező és egy bájtkódot generáló interpreter összehasonlítása :
Dinamikus vagy JIT fordítás - fordítás, amelyben a forrás- vagy köztes kódot közvetlenül futás közben, "on the fly" ( angol just in time , JIT ) gépi kóddá alakítják (lefordítják ). Minden kódrészletet csak egyszer fordítanak le; A lefordított kód gyorsítótárba kerül , és szükség szerint újrafelhasználható.
A dinamikus fordítás előnyei a fordításhoz képest:
A dinamikus fordítás hátrányai a fordításhoz és a tiszta interpretációhoz képest:
A dinamikus fordítás kiválóan alkalmas webes alkalmazásokhoz .
A dinamikus fordítás megjelent és bizonyos mértékig támogatott a Java , .NET Framework , Perl , Python implementációiban .
A "fordítás" és az "értelmezés" fogalma eltérő. A fordítás során a programkód egyik nyelvről a másikra konvertálódik. Az értelmezés során a program lefut.
Mivel a fordítás célja általában a tolmácsolásra való felkészülés, ezeket a folyamatokat együtt tekintjük. Például a programozási nyelveket gyakran "összeállítottnak" vagy "értelmezettnek" jellemezik, attól függően, hogy a nyelvet túlnyomóan használják-e: fordítás vagy értelmezés. Ezen túlmenően szinte minden alacsony szintű és harmadik generációs nyelv , mint például az assembler , a C vagy a Modula-2 , le van fordítva, és a magasabb szintű nyelveket , például a Pythont vagy az SQL -t értelmezik.
Másrészt a fordítási és tolmácsolási folyamatok áthatolnak: a tolmácsok fordíthatnak (beleértve a dinamikus fordítást is), a fordítók pedig tolmácsolást igényelhetnek a metaprogramozás megvalósításához (például makrók esetén assembly nyelven , feltételes fordítás C nyelven vagy sablonok esetén C ++ nyelven ) .
Sőt, ugyanaz a programozási nyelv fordítható és értelmezhető is, és mindkét esetben közös elemzési és felismerési szakaszoknak kell lenniük a forrásnyelv konstrukcióinak és direktíváinak. Ez vonatkozik mind a szoftveres, mind a hardveres megvalósításokra – például az x86 család processzoraira, a gépi nyelvi utasítások végrehajtása előtt dekódolja azokat, kiemelje az operandusmezőket a műveleti kódokban ( regiszterek , memóriacímek , konstansok jelzése ), bitmélység stb., valamint az In Pentiumban A NetBurst architektúrájú processzorok esetében ugyanazt a gépi kódot a belső gyorsítótárban történő tárolás előtt mikroműveletek sorozatává is lefordítják .
![]() |
---|