[Powered by Google Translate] ROB Bowden: pričajmo o prevodiocima.
Do ove točke, upravo ste upisali svoj izvorni kod u
neke datoteke, poslao ih kroz ove velike crne kutije koja je
Jeka, i iz pitanju vaš izvršnu datoteku koja ne radi
točno ono što je napisao u svom izvornom kodu.
Kao čaroban kao da je bilo, idemo uzeti bliže
pogled na ono što se zapravo događa
kad smo sastaviti datoteku.
Dakle, što to znači da sastavi nešto?
>> Pa, u najopćenitijem smislu, to samo znači
pretvarajući kod napisan u jednom
programskom jeziku u drugi.
No, obično kada ljudi kažu da sastaviti nešto, oni
Znaci oni ga uzimati s više razine programiranja
jezik na nižoj razini programskog jezika.
To se može činiti kao vrlo subjektivnim uvjetima.
Na primjer, vjerojatno ne razmišljaju o C kao visoka
Razina programski jezik, ali ne ga sastaviti.
No, to je sve relativna.
Kao što ćemo vidjeti, montaža broj i na kraju stroj
kod koji smo sastaviti dolje to je nedvojbeno niža razina
nego C.
Iako ćemo biti koristeći zveka u današnjem demonstracije,
puno ideja ovdje prenijeti na drugim prevodiocima.
>> Za zveka, postoje četiri glavna koraka u ukupnom
kompilacija.
To su jedan, predobradba učinio preprocesora; dva,
Kompilacija učinio prevodilac, tri, montaže
obavlja asembler, i četiri,
povezivanje obavlja spojnici.
To može biti zbunjujuće da je jedan od substeps ukupnog
Jek prevoditelji zove prevodilac, ali
ćemo doći do toga.
Mi ćemo se pomoću jednostavnog Hello World program kao naš primjer
tijekom ovog videa.
Idemo pogledati.
>> Prvi korak je predobradba.
Što preprocesor učiniti?
U prilično mnogo svaki C programu ste ikada pročitali ili pisani,
Ako ste već koristili linija koda koje počinju s mljeveno meso.
Nazvat ću ga mljeveno meso, ali također može nazvati funti, broj
potpisati ili oštra.
Svaka takva linija je preprocesor direktiva.
Vjerojatno ste vidjeli # define i # include prije, ali ima
su još nekoliko koji preprocesor prepoznaje.
Dodajmo # define našem Hello World primjer.
Sada ćemo pokrenuti samo preprocesor na ovu sliku.
Do donošenja clage the-E zastavu, naređujete da pokrenete
samo preprocesor.
Idemo vidjeti što se događa.
To izgleda kao jeka samo ispljune sve
u zapovjednoj liniji.
Da bi spasio sve ove proizvodnje na novu datoteku pod nazivom
hello2.c, mi ćemo dodati> hello2.c na našim zapovjedništvom.
Sada ćemo pogledati naš preprocessed datoteku.
>> Opa, što se dogodilo s našim kratkom malo programa?
Ako idemo skroz na dnu ove datoteke, vidjet ćemo
neki kod da mi zapravo napisao.
Primjetite da # define je otišao i sve instance ime
zamijenjeni su upravo ono što je navedeno u
# define linije.
Dakle, ono što su svi ti typedefs i funkcije deklaracije
na vrhu datoteke?
Primjetite da # define nije bio jedini preprocesor
direktiva koje smo naveli.
Mi također uključuju stdio.h # su.
Dakle, sve lude linije su zapravo samo stdio.h kopirati
i zalijepiti u vrhu ove datoteke.
To je razlog zašto zaglavlje datoteke su tako korisne za funkciju
deklaracije.
Umjesto potrebe za kopirati i zalijepiti sve funkcije
Izjave koje planirate o korištenju na vrhu datoteku,
preprocesor će kopirati i zalijepiti ih iz glave
datoteku za vas.
>> Sada kada smo učinili predobradba, krećemo na
kompilacija.
Razlog zovemo ovaj korak kompilaciju je jer je to
korak gdje zveka zapravo ne njegovo sastavljanje od C do
Skupština broj.
Da bi zveka sastaviti datoteku dolje na skupštini, ali
nastaviti dalje, to prođe-S zastava
u zapovjednoj liniji.
Hajdemo pogledati na skupštini
datoteku koja je outputted.
To izgleda kao prilično drugom jeziku.
Skupština code je vrlo specifičan procesor.
U ovom slučaju, jer CS50 uređaj radi na
virtualni x86 procesora, to je x86 skupština koda.
Vrlo malo ljudi pisati izravno u asemblerskom kodu ovih dana,
ali svaki C program ćete ikada pisati dobiva pretvorena dolje
u skupštini.
Opet, mi zovemo ovaj korak sastavljanju C u skupštini
budući da ćemo s više razine na nižu razinu
programskom jeziku.
>> Što čini sklop nižu razinu nego C?
Pa, u skupštini, vrlo smo ograničeni u onome što možemo učiniti.
Nema ako je, dok je, za to, ili petlje bilo koje vrste.
Ali možete ostvariti iste stvari koje ti kontrola
strukture nude pomoću ograničene operacije koje
Skupština ne daju.
No, samo da vidim kako niska razina montaža stvarno, ajmo
jedan korak dalje u našem izračunu, montaže.
To je monter posao transformirati sklopa kod
u objekt ili strojni kod.
Sjetite se da je monter ne izlazni sklop;
umjesto toga, on uzima u skupštini i izlaza strojnom kodu.
Stroj kod je stvarna 1 i 0 je da CPU može
razumjeti, iako još uvijek imamo jedan maleni malo posla lijevo
prije nego što možemo pokrenuti naš program.
Ajmo okupiti naše proizvodne kod prolazeći
Jeka-c zastava.
Sada ćemo vidjeti što je u okupljenom datoteku.
>> Pa, to nam ne pomaže mnogo.
Sjetite se da je stroj kod one i nula da
vaše računalo može razumjeti.
To ne znači da je lako za nas da shvatimo.
Dakle, točno kako niska razina je montaža?
To je gotovo identičan objektnom kodu.
Ide od okupljanja na objektnom kodu je mnogo više od
prevođenje od transformacije, što je razlog zašto
nitko ne može uzeti u obzir da monter
učiniti bilo stvarni sastavljanja.
U stvari, to je prilično jednostavan za ručno prevesti s
Skupština na strojnom kodu.
Gledajući na skupštini za glavne funkcije, da prva linija
dogodi da odgovaraju heksadecimalni 0x55.
U binarnom, to je 1.010.101.
Druga linija dogodi da odgovaraju heksadecimalni 0x895.
I pored, 0x56.
S obzirom na relativno jednostavan stol, što bi moglo prevesti
Skupština u kodu da strojevi mogu shvatiti previše.
>> Dakle, postoji jedan preostali korak u
kompilacija, koja povezuje.
Povezivanje kombinira hrpa objekta datoteka u jednu veliku datoteku
da zapravo možete izvršiti.
Povezivanje je vrlo ovisi o sustavu.
Dakle, najlakši način da dobijete zveka samo povezati objekt
slika zajedno je nazvati zveka na sve datoteke koje
želite povezati.
Ako ste naveli. Salbunj datoteke, onda to neće trebati preobraditi,
sastaviti, i skupite sve svoje izvornog koda.
Ajmo baciti matematičke funkcije u našoj datoteci, tako da imamo
nešto povezati u.
Sada ćemo ga sastaviti natrag dolje na objektnom kodu i
nazovite zveka na njega.
Ups.
Budući da smo uključeni matematičke funkcije, moramo povezati u
matematike knjižnica s-lm.
>> Ako želimo povezati hrpu. O datoteke koje smo
napisao na naš vlastiti, moramo samo bih navesti ih sve na
naredbenog retka.
Ograničenje je da samo jedan od tih datoteka mora
zapravo odrediti glavnu funkciju, ili pak
rezultiralo izvršnu ne bi znao gdje početi
trčanje svoj kôd.
Koja je razlika između navodeći datoteku povezati u
s-l, a samo određivanjem datoteku izravno?
Ništa.
To je samo da zveka se događa da znam točno što datoteku
nešto poput-lm dogodi da se odnosi na.
Ako je znao tu datoteku sebe, da bi mogao odrediti
eksplicitno.
Dovoljno je sjetiti da su svi l zastave moraju doći na kraju
vašeg klijenta potražnje.
>> I to je sve što je na njega.
Kada samo pokrenuti zveka na nekim datotekama, to je ono što je
zapravo radi.
Moje ime je Rob Bowden, a ovo je CS50.