Magas szintű nyelven megírt program fordítása gépi kódra?
2013-06-03T23:40:18+02:00
2013-06-04T00:41:53+02:00
2022-07-23T09:56:17+02:00
  • Úhh, nagyon köszönöm, megvilágosodtam :D
    Az egész felvetésem abból indult ki, hogy azt hittem, hogy már az "alap" utasítások is tök mások, de így már érthető.
    Mutasd a teljes hozzászólást!
  • Egyik oldalról az van, amit real_het is ír, futás időben is meg lehet nézni, hogy az adott utasítás készletet a processzor támogatja vagy sem, és annak megfelelő kód kerül futtatásra.

    Pl: befordítanak egy tomorit_1() és egy tomorit_2() függvényt, amiből az 1() az elmegy minden 386 -s alapú gépen (x86), és a tomorit_2() az meg csak sse4.2 esetén fut. Majd a híváskor a eldől melyik fut (technikailag mondjuk van előtte egy tomorit() függvény hívás).

    iPhone -nál ez úgy van megoldva, hogy 1 exe tartalmazza a 3 architektúrára fordított kódot, azaz igazából egy exe (elf) 3 exe -t tartalmaz.

    Meg fordíthatod úgy is a programod, hogy a leggyengébbre fordítod, mondjuk 386-ra, és akkor az ma már mindenen (x86-s vonalon mindenen, atom, p4, i7, amd, jaguar stb.) el fog futni. Persze nem használja ki a a proci tudását, de hát valamit valamiért.
    Mutasd a teljes hozzászólást!
  • Na ez aztán a kaotikus témafelvetés..... nagyon összevisszaságokat kérdezel, de megpróbálok neked válaszolni:

    "Ahány processzor annyi féle utasításkészlet ugyebár."

    -Semmi sem akadályozza meg, hogy két különféle processzornak ugyanaz legyen akár az utasításkészlete. Vannak ilyen esetek is, ilyenkor például a modellek csak sebességben térnek el, vagy lábkiosztásban stb. de lehet a belső architektúrájuk is teljesen más, mégis kívülről tök ugyanolyan a gépi kódjuk felülete.
    -Ezen felül az utasításkészlet NEM TOTÁL MÁS szokott lenni, akkor sem, ha különbözik. Az x86-os és x64-es procik között például nagyon sok utasítás még mindig ugyanazokkal a gépi kódokkal érhető el, mint 20-30 évvel ezelőtt. A gyártók nem cserélnek le rögtön mindent, hiszen akkor nem indulnának a régi programok...
    -Viszont teljesen más családokba tartozó procik esetén, amik másra valók, vagy történelmileg külön fejlődtek, természetesen nincs igazán átjárás bináris szinten. Tehát amit megírsz x86-ra, az nem lesz jó ARM-on, vagy PowerPC-n és fordítva......

    "Hogy lehet az, hogy egy gépi kódra fordított programot (pl exe fájl) mégis minden gép végre tud hajtani, függetlenül attól, milyen processzor van benne."

    -Úgy, hogy olyan exe-t fordítanak le, ami általánosságban x86-os kódokat tartalmaz és semmi külön extrát, vagy ha használnak is extrát a program a futás elején lekérdezi a CPUID-t, amivel ki tudja deríteni, hogy mikre képes a gép és csak akkor használ valamit, ha lehet (egyébként lassabban emulál mondjuk).
    -Egyébként nem tud minden gép egy EXE-t végrehajtani, hiszen itt már belekeveredik az oprendszer is: az EXE fájl binárisa egy csomó olyan adatot tartalmaz, ami olyan információkkal szolgál, hogy hova tegye a rendszer a változókat, milyen rendszerhívásokra van szükség stb. Ez a leírás oprendszerenként változó, így linuxon már nem fog futni az EXE-d és mac-n sem fog menni. Hasonlóképp lehetnek gondok 32 bites exe-vel 16 bites környezetben (dos alatt), 64 bites exe-vel 32 bites környezetben és emellett mivel a windows 64 bites változatai nem tartalmaznak NTVDM-et, vagyis DOS virtuális gépet, 16 bites régi dos-os exe-t se tudsz már futtatni 64bites rendszeren például.... Hasonló dolgok megvannak más oprendszerek esetén is, csak linuxnál szinte mindent kódból fordítanak, így ott kevésbé fontos mi mivel kompatibilis binárisan....

    "Mi a helyzet akkor, ha a processzor különlegesebb utasításokat is ismer, amit más processzorok általában nem"

    -Akkor ezt vagy kihasználják, vagy nem. Fent leírtam mi a helyzet...

    "(pl. vmi olyan utasítást aminek segítségével nagyban gyorsítható a videó renderelés)"

    -Ilyen utasítás nem nagyon lesz, mert ez manapság inkább a videókártya dolga, ami általában tök független a processzortól (de ha egybe is lenne, logikailag valószínűleg más egységet képezne akkor is)

    "akkor ezt az utasítást hogy lehet használni ezen a processzoron úgy, hogy közben egy olyan processzoron is elfut a program, ami nem is ismeri ezt az utasítást."

    CPUID - le lehet kérdezni mit tud a gép és mit nem, aztán a megfelelő programrészekkel oldjuk meg a feladatokat a lekérdezés után. Profi esetben ezt ki lehet deríteni a telepítésnél és eleve több verziót gyártani le, vagy a függvények címeit mondjuk a betöltéskor átírni a megfelelőre...
    -Ha nem natív binárist csinálsz, hanem mondjuk java, vagy .NET binárist (utóbbi szintén egy exe, ami nem is fut .NET framework és a megfelelő virtuális gép nélkül, előbbinél hasonló a JVM szükségessége), akkor a binárisban nem az igazi gépi kód van, hanem egy logikai gépre írt kód, amit just-in-time fordít le a rendszer amikor elindítod a programot. Az egyszerűség kedvéért elképzelheted úgy, hogy a program egyes funkcióit csak akkor fordítja le a végleges hardverre a gép, amikor pont szükség van rájuk először - persze ez erős egyszerűsítés, de talán így el tudod képzelni, hogy ez nem virtuális emulálás, hanem inkább egy futtatás idejére késleltetett fordítás.... Persze a bytekód elég alacsonyszintű, így azt már könnyebb a gép nyelvére lefordítani....

    "Valaki elmagyarázná ezt nekem?"

    Igyekeztem és real_het-re is figyelj oda, mert ő igazi profi low-level programmer arc, szóval tudja mit beszél
    Mutasd a teljes hozzászólást!
  • Az x86-on belul (ha már .exe-t emlitettel) 2 egymassal nem kompatibilis (csak hasonlo, hogy a fordito-iroknak konnyu dolga legyen) fajta van: IA-32 es IA-64.
    Ezeken belul pedig vannak extensionok, amiknek a letezeset le lehet kerdezni a CPUID utasitassal. Ezek az extensionok egymasra epulnek es mind az alap ôskövület XT utasitaskeszletet bovitik. Az elso ilyen extension volt az MMX, meg a 3DNow, aztan jott az SSE1,2,3,4, a 4-en belul lett tobb fele de egyre kisebbek. Most a legujabb nagyobb fajta extension a 256bit AVX (Intel - Sandy Bridge, AMD - Bulldozer). De már lehet hallani az 512bites zmm regiszterekrol is, az lesz gondolom az AVX2.
    De kulon kulon vannak kisebbek extensionok is, mint pl az SSE4-en belul a CRC-szamitas, vagy AES (kriptografia), illetve FMA4 extension (1 utasitassal az a:=b*c+d muvelet).
    Es jut eszembe van mégegy kategoria, az uzemmodja a procinak: ami lehet real-mode 16bit, vagy protected mode 32 illetve 64 bit. Ezekhez mind kulon kell forditani.

    Es nem csak x86 van a vilagon, ott van pl. az ARM is.

    Itt egy jo attekintes az x86 extensionjairol -> SSE2 Instruction Set
    Mutasd a teljes hozzászólást!
  • Ahány processzor annyi féle utasításkészlet ugyebár. Hogy lehet az, hogy egy gépi kódra fordított programot (pl exe fájl) mégis minden gép végre tud hajtani, függetlenül attól, milyen processzor van benne. Mi a helyzet akkor, ha a processzor különlegesebb utasításokat is ismer, amit más processzorok általában nem (pl. vmi olyan utasítást aminek segítségével nagyban gyorsítható a videó renderelés), akkor ezt az utasítást hogy lehet használni ezen a processzoron úgy, hogy közben egy olyan processzoron is elfut a program, ami nem is ismeri ezt az utasítást. Valaki elmagyarázná ezt nekem?
    Mutasd a teljes hozzászólást!
abcd