Kezdőoldal » Számítástechnika » Programozás » A számítógépes fordítók mikor...

Bulcsando kérdése:

A számítógépes fordítók mikor lefordítják a kódot gépi kódra bonyolítják azt?

Figyelt kérdés
Furcsa bele gondolni hogy lényegében egyszerűbb dolgot bonyolítanak a fordítók , vagy hogy minden megírható magas szintű nyelvekben ? Mi számít jó fordítónak? És amikor megírják a fordítót akkor bonyolultabb dolgot egyszerűsítenek ? Mert azt könnyebb elképzelni hogy egy bonyolultabb dolog könnyebben tud bonyolítani fejleszteni egy egyszerűbbet mint az egyszerűbb egyszerűsíteni a bonyolultat. Vagy is hogy akkor valószínű hogy tanítják az emberiséget már mint hogy nagyobb mértékben jött létre az élet mesterségesen mint ahogy magától. Hogy ezek a megoldások valahonnan áramlanak az emberekbe ? Vagy hogy tud az ember nála bonyolultabb dolgot lebontani mert a természet meg a számítógép bonyolultabb az embernél.Vagy olyan ez is akár mint egy tápláléklánc hogy hasonló állatok egymásból táplálkoznak ?Vagy mint egy levezetés , bizonyítás ? Amikor valaminek az egyszerűbb változatát keresi az ember ? És sorba rendezi az egyre egyszerűbb rendszereket ?

#Compiler #számítógépesfordítók
okt. 14. 13:58
1 2
 1/14 anonim ***** válasza:
88%

Mivan?? Te érted, hogy mit akarsz kérdezni?


Amikor gépi kódot fordítunk egy forráskódból, akkor lefordítjuk a processzor által érthető nyelvezetre.

okt. 14. 14:17
Hasznos számodra ez a válasz?
 2/14 A kérdező kommentje:
Igazából a kérdés az hogy a gépi kód bonyolultabb -e a forrás kódnál? De most úgy látom hogy igen és hogy lényegében amikor programozik valaki akkor megokosítja a gép csak nem mindegy hogy mennyire kell az embernek a gép szájába rágni a dolgokat és fordítva.Hogy mennyire kell a gépnek az emberbe hatolnia ? (Pl MI ahol már beszélgetni is lehet vele )
okt. 14. 15:24
 3/14 anonim ***** válasza:
79%
Nem bonyolít semit. Olyan értelemben lehet, hogy az a=b+c egysoros műveketből csinál egy olyat, hogy betölti a b-t az x regiszterbe, c-t az y regiszterbe, megnöveli x-et y-nal, majd tárolja az x-et a-ba. De ennek ez a menete, nem bonyolítja, csak te írod le egyszerűbben, amit a fordító lefordít.
okt. 14. 15:25
Hasznos számodra ez a válasz?
 4/14 anonim ***** válasza:
91%

"Igazából a kérdés az hogy a gépi kód bonyolultabb -e a forrás kódnál?"


Erre így nem lehet válaszolni. Mit jelent a bonyolultság? A magasabb szintű absztrakciók alacsonyabb szintűre képződnek le, miközben a forráskódból tárgykód lesz (forráskódban lehetnek pl. osztályok, de a processzor nem ismeri az osztály fogalmát). Ilyen szempontból egyszerűbb, primitívebb a tárgykód.

De mivel primitívebb utasításokból áll össze, ezért mondhatni komplexebb is.


"De most úgy látom hogy igen és hogy lényegében amikor programozik valaki akkor megokosítja a gép csak nem mindegy hogy mennyire kell az embernek a gép szájába rágni a dolgokat és fordítva.Hogy mennyire kell a gépnek az emberbe hatolnia ?"


A gépnek az emberbe hatolnia? A gép nem hatol az emberbe...

okt. 14. 15:32
Hasznos számodra ez a válasz?
 5/14 anonim ***** válasza:

Értem, hogy mit nem értesz.


A gépi kód az alap, sokkal egyszerűbb mint a magasabb szintű programnyelvek. Legalábbis abban az értelemben, ahogyan TE érted.


A gépi kód "bonyolizálásával" alkotják a magasabb szintűeket.

okt. 14. 18:09
Hasznos számodra ez a válasz?
 6/14 anonim ***** válasza:

Minden számítógép processzorának van egy szerkezete. Ez a szerkezet, pontosabban, ennek milyensége határozza meg, hogy a CPU miként hajtja végre azokat az utasításokat, amelyeket egyáltalán ismer. Ezeknek az utasításoknak az összessége egyébként maga a gépi kód.

A számítógép CPU-ja nem is képes másra, csak a gépi kódot tudja futtatni.

Ezek a gépi kódú utasítások általában (!) elemi utasítások, azaz, nem bonthatók fel további utasításokra (bár előfordul kivétel is). Az ilyen utasításokból sok van, de többnyire minden utasítás csak egy nagyon egyszerű dolgot valósít meg.

Ez annyit jelent, hogy míg pl. egy magas szintű nyelvben az INC(rement) utasítás egy kulcsszó és egy (vagy két) paraméter, addig ugyanennek a gépi kódja állhat hat, vagy nyolc-tizenkét elemi utasításból is.


A fordítók leglényegibb feladata az, hogy a magas szintű nyelvek utasításait és a magas szintű nyelven írt forráskódban előforduló kifejezéseket (A = B + (C * D)) elemi utasításokra (gépi kódra) bontsa fel. Természetes, hogy míg a magas szintű nyelv valamely ciklusa, vezérlő szerkezete egy-két kulcsszó és paraméter, addig ugyanez gépi kódban akár ötven-száz utasításból is állhat.


Egy növekményes (for) ciklus, vagy egy CASE szerkezet még üresen is több tíz elemi, gépi kódú utasításból áll.


A fordítók nem bonyolítanak, inkább egyszerűsítenek, legalábbis a jobbak. Ez az optimalizálás, aminek vannak szintjei. A legegyszerűbb optimalizálás nem több, mint az adatok mozgatásának csökkentése, mert alaphelyzetben egy sima, egymenetes (tehát, nem intelligens) fordító úgy fordít, hogy elég sok fölös adatmozgatás lesz a gépi kódban.


Pl. előfordulhat, hogy az (A + B) * C kifejezés esetében elvégzi az A és a B összeadását, az eredményt a regiszterből kitolja a memóriába, azután onnan vissza is teszi a regiszterbe és csak utána fogja szorozni C értékével. Ez már két fölösleges (adat ki, adat be) utasítás.

Ekkor egy intelligens fordító nem mozgatja a memóriába az A + B eredményét, hanem betölti a C értékét és szoroz.


Persze ez függ a processzor architektúrájától is. Mert van, amelyik így, van amelyik meg úgy hajtja végre ugyanazt a műveletet, vagy műveletsort.


Akad, amelyik sok regiszterrel rendelkezik, akad amelyik meg kevéssel.

Akad olyan is, amelyik még szorozni sem tud, ez összeadások sorával valósítja meg a szorzás műveletét, ami sokkal lassabb lesz, mint az olyan, amelyiknek van szorzó áramköre.

okt. 14. 21:46
Hasznos számodra ez a válasz?
 7/14 anonim ***** válasza:

Ez az összeadás,


a = 6;

b = 2;

c = a + b;


így néz ki, egy szimpla, de trükkös CPU* gépi kódjában:


MOV AX,6

MOV [A],AX

MOV AX,2

MOV [B],AX

MOV AX,[A]

PUSH AX

MOV AX,[B]

POP BX

ADD AX,BX

MOV [C],AX


Lám. Három sorból lett tíz.


* Ez egy -saját- VM két regiszteres (AX,BX) virtuális processzora. Érdekessége, hogy az adatmozgatást stack-kel oldja meg. Ez sokat egyszerűsít a CPU szerkezetén és az ADAT-út is a lehető legrövidebb.


A kódban az

[A],

[B] és

[C] eredetileg az A,B,C változók (literálok) memóriahelyei, de kicseréltem őket változónevekre, az érthetőség kedvéért.

okt. 14. 22:04
Hasznos számodra ez a válasz?
 8/14 anonim ***** válasza:

Egy loop példa:


A = 1;

While (A < 4) do A = A + 1;


és a két sor - fordító által generált - assembly kimenete:


MOV AX,1

MOV [A],AX

LBL0:

MOV AX,[A]

PUSH AX

MOV AX,4

POP BX

SUB BX,AX

MOV AX,BX

OR AX,AX

JNZ LBL1

JMP END

LBL1:

MOV AX,[A]

PUSH AX

MOV AX,1

POP BX

ADD AX,BX

MOV [A],AX

JMP LBL0

END:

okt. 15. 00:02
Hasznos számodra ez a válasz?
 9/14 anonim ***** válasza:

A jobb olvashatóság kedvéért:


01 MOV AX,1

02 MOV [A],AX


LBL0:


03 MOV AX,[A]

04 PUSH AX

05 MOV AX,4

06 POP BX

07 SUB BX,AX

08 MOV AX,BX

09 OR AX,AX

10 JNZ LBL1

11 JMP END


LBL1:


12 MOV AX,[A]

13 PUSH AX

14 MOV AX,1

15 POP BX

16 ADD AX,BX

17 MOV [A],AX

18 JMP LBL0


END:

okt. 15. 01:07
Hasznos számodra ez a válasz?
 10/14 anonim ***** válasza:
Takarodjál már ebből a témakörből.
okt. 15. 19:11
Hasznos számodra ez a válasz?
1 2

További 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

A weboldalon megjelenő anyagok nem minősülnek szerkesztői tartalomnak, előzetes ellenőrzésen nem esnek át, az üzemeltető véleményét nem tükrözik.
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!