A c# valóban Compiler nyelv az az nem interpretált?
Itt van ez a cikk
Ha igaz akkor a c# fordító elkészíti a cli nyelvű állományt amit clr kap meg futási időben és most jön a furcsaság mert a cikk szerint a clr a cli állomány egy részét ami épp lefut natív gépi kóddá alakítja de ez a fordítás csak egyszer történik meg ha lehetséges.
Szal ez azt jelenti hogy a cli nagy részét natív gépi kóddá lesz alakítva amikor rá kerül a progi futásakor a sor de ha újból rá kerül a sor akkor már nem fordít a clr mert ez már le van fordítva natív gépi kóddá.
Ha ez igaz akkor a c# valóban nem az interpretált nyelvek közé tartozik hisz a fordítás csak egyszer történik meg mint a c++ ban.
Persze ez mellett lehetnek olyan részek amiket bizonyos feltételek teljelsülésekor újból meg kell tenni. Pl ha a pythonnal akarom használni a c# (dinamikus kulcsszó)
Szal a clr egyszer fordít ezért a c# compile nyelv de tud többször is ha szükséges.
Jól mondtam mindent?
"a cli nagy része natív gépi kóddá lesz alakítva"
Ez az, hogy nem teljes egészében. Mert ha eltekintünk attól, hogy az interpretált nyelven írt program futásakor is végső soron mindvégig natív gépi kód fut – mi más lehetne, ugye –, az alapvető különbség a programkód újrafeldolgozásának szükségessége.
Viszont nem szabad elfelejteni, hogy egy nyelv nem egy bizonyos fordítót jelent. A C# nyelvre is írható lenne interpreter. De az, amire mindketten gondolunk, tényleg nem interpreter.
Vannak .NET-es nyelvek, például a C#, a VB.NET, F#, stb.
Ha ezeken a nyelveken írt kódokat te lefordítod, létrejön egy ún. Common Intermediate Language (CIL) nyelvű kód. Ezzel az a gond, hogy ez nem gépi kód, tehát ezt a processzorod nem tudja közvetlenül futtatni. A .NET Framework ugyanis rendelkezik egy saját "virtuális processzorral", az ún. Common Language Runtime-mal (CLR). A CIL kódot a CLR fogja végrehajtani úgy, ahogy egy értelmező is működik - ezért is hívják ezt "just in time" (JIT) fordítónak.
Ezzel szemben ha mondjuk C vagy C++ nyelvű kódot fordítasz, akkor egyből olyan valami jön létre, amit a processzor már közvetlenül képes futtatni. Éppen ezért hívjuk ezeket natív kódoknak.
"A .NET Framework ugyanis rendelkezik egy saját "virtuális processzorral", az ún. Common Language Runtime-mal (CLR). A CIL kódot a CLR fogja végrehajtani úgy, ahogy egy értelmező is működik - ezért is hívják ezt "just in time" (JIT) fordítónak. "
Igen ez így van de a cikk szerint csak egyszer fordítsa le a cli állomány (és ez a lényeg) annak részét amelyet épp végrehajtani kell(teljes cli egy,több,egész futtatandó részéből ből lesz natív gépi kód), újból nem fogja fordítani a clr ha a futás során megint rá kerülne a sor.
És ha ez bekövetkezik az egész cli állományra akkor már hasonló lesz a helyzet mint a c++ esetében szal kész lesz az egész cli nek a natívan lefordított verziója és nem fordít újból hanem ezt fogja használni míg be nem fejeződik a program futása.
Ha ez tényleg igaz akkor ez egy nagy előnye a javával szemben. Ha a javába ez nincs csak akkor persze.
Három féle lehetőséget alkalmaznak.
Ezek egyike a direkt gépi kód. A programok zöme ilyenre van fordítva. Ez elviekben a leggyorsabb.
A másik az interpreteres megoldás, amikor sorról sorra, sőt, utasításról utasításra olvassa be a forrást a gép és értelmezi, majd futtatja.
Végül a p kódos, vagy byte kódos verzió, ami lefordul a futtatás előtt, de nem natív gépi kódra, hanem egy virtuális processzor kódjára (ASM jellemzően ez is) és a lefordított kód ezen a virtuális gépen (többnyire inkább csak processzoron) fut. A virtuális processzor meg magán a vason fut, általában natív binárisként.
Van olyan is, hogy a valódi processzor futtat egy virtuális processzort, amely futtat egy másik virtuális processzort, amely futtatja a futtatandó programot.
Bchs, QEmu, stb..
"A C# először egy köztes nyelvre fordul, majd az bájtkódra"
Én a doksiban nem így láttam egy ábra is volt ott.
Egy köztes nyelvre fordul először az igaz ez lesz a cli de ebből nem bájtkód lesz hanem egyből natív gépi kód. cli ből a clr natív gépi kódot készít.
A java csinál úgy ahogy te írtad.
A javánál bytekód lesz és ez fogja futtatni virtuális gép ami natívan fut a rendszeren. De a virtuális gép által értelmezett bájt kódból nem lesz natív gépi kód úgy mint a C# esetében ezért a c# sokkal gyorsabban fut mint a java.
Ez azt jelenti Hogy a java programok a java virtuális gépén futnak ez pedig nem natív futás. A c# ban nincs virtuális gép hanem clr van ami egy olyan fordítóprogram ami a cli ből (bytekód) natívan futó gépi kódot generál.
Szal a java programok virtuális procin futnak mert nem fordítódnak natívvá a c# programok pedig natívan futnak.
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!