Komputiloj, Programado
Dissendanto - estas ... Tipoj de kompililoj. Konverti kaj elsendon programoj
Programoj, kaj ankaŭ homoj por traduki de unu lingvo al alia bezonas interpretisto aŭ tradukisto.
bazaj konceptoj
La programo estas lingva reprezento de ŝtonoj: mi → P → P (i). Interpretisto estas programo kiu estas provizita al la enigo programo P kaj kelkaj enigo x. Ĝi rezultas ĉe P x: Mi (P, x) = P (x). La fakto ke ekzistas nur unu tradukisto estas kapabla de realigi ĉiuj eblaj programoj (kiu povas esti reprezentita en la formala sistemo) estas tre profunda kaj grava malkovro Turing.
La procesoro estas interpretisto de programoj en lingvo de maŝino. Ĝenerale tro multekosta por skribi interpretistoj por altnivela lingvoj, do ili tradukas en formo kiu estas pli facila de interpreti.
Iuj specoj de tradukistoj havas tre strangajn nomojn:
- La ensamblador tradukas lingvo ensamblador programoj en lingvo de maŝino.
- La tradukilo tradukas altnivelan lingvon al pli malalta lingvo.
Dissendanto - estas programo kiu prenas kiel enigaĵo la programo en iu lingvo S kaj produktas T programo en tia maniero, ke ili ambaŭ havas la saman semantiko: P → X → Q. Ĉi tio estas, ∀x. P (x) = Q (x).
Se gisis la tutan programon en ion interpretebla, oni nomas kompilo antaŭ ekzekuto, aŭ AOT kompilo. AOT tradukilo povas esti uzata en serio, la lasta de kiuj estas ofte la ensamblador, ekzemple:
La fontkodon kompililon → (tradukisto) → → asembleo kodo ensamblador (compilador) → → CPU maŝino kodo (interpretisto).
Funkcia aŭ dinamika kompilo okazas se la programo estas elsendita kiam ekzekutita de aliaj antaŭe kompilis parton. JIT-kompililoj memoras, kion ili jam faris por ne ripeti la fontkodon denove kaj denove. Ili povas eĉ produkti adapta kompilo kaj recompilación surbaze de la konduto de la programo ekzekuto medio.
Multaj lingvoj permesas ekzekuti kodon dum la kompilado kaj kompili la novan kodon en tempo de ekzekuto.
traduko stadio
Elsendo konsistas el la ŝtupoj de analizi kaj sintezi:
La fontkodon analizilo → → → koncepta prezento generatoro (sintezilo) → Celo kodo.
Ĉi tio estas pro ĉi tiuj kialoj:
- Ajna alia metodo ne taŭgas. Vorto traduko simple ne funkcias.
- Bonan inĝenierio solvo: se vi volas skribi tradukistoj por M kaj N fontlingvoj celata necese skribi nur M + N simplaj programoj (polukompilyatorov) anstataŭ M × N kompleksaj (tuta de tradukistoj).
Tamen, praktike, koncepta vido de tre malofte esprima sufiĉe kaj sufiĉe potenca por kovri ĉiu pensebla fonto kaj celo lingvoj. Dum iuj povis veni proksime al tio.
Reala kompililoj trapasi multajn etapojn. Kiam kreante vian propran tradukilo ne bezonas ripeti ĉiujn laboremo ke homoj faris krei reprezentoj kaj generatoroj. Vi povas traduki vian lingvon rekte en JavaScript aŭ C kaj utiligi ekzistantajn JavaScript-motoro kaj la C-tradukilo fari la reston. Vi povas ankaŭ uzi la ekzistantajn intera reprezento kaj virtualaj maŝinoj.
rekordon tradukisto
Dissendanto - estas programo aŭ aparataro, kiu implikis tri lingvojn: la fonto, la celon kaj la bazo. Ili povas esti skribita en T-formo, metante la originalan maldekstra, dekstra kaj celo bazo sube.
Estas tri tipoj de kompililoj:
- Dissendanto - estas samokompilyator se ĝi respondas al la baza fonto lingvo.
- Compiler kiu celas lingvo estas la baza linio, nomita samorezidentnym.
- Dissendanto - kruco-kompililon, se li celis kaj bazaj diversaj lingvoj.
Kial estas ĉi tiu grava?
Eĉ se vi neniam faros reala tradukilo, bona scio de la teknologio de lia kreo, ĉar la koncepto uzata por ĉi tiu celo estas uzataj vaste, ekzemple:
- formatado de teksto;
- lingvo pridemandojn al datumbazoj;
- progresinta komputilo arkitekturo;
- ĝeneraligita optimumigo problemojn;
- GUI-oj;
- skriptolingvoj;
- regiloj;
- virtualaj maŝinoj;
- Maŝintradukado.
Krome, se vi volas skribi preprocessors, linkers, loaders, debuggers kaj profilers, Vi devas iri tra la sama paŝoj kiel kiam skribanta tradukilo.
Vi povas ankaŭ lerni kiel skribi bonaj programoj, de post la komenco de la tradukisto por la lingvo signifas pli bonan komprenon de ĝia kompleksecojn kaj ambigüedades. La studo de la ĝeneralaj principoj de radiodifusión ankaŭ permesas vin fariĝi bona diseñador lingvo. Do gravas kiom kruta la lingvo, se ĝi ne povas esti efektivigita efike?
ampleksa teknologio
kompililon teknologio kovras multajn diversajn areojn de komputiko:
- formala teorio de lingvo: gramatiko, analiza, komputebleca;
- komputila arkitekturo: aroj de instrukcioj, RISC aŭ CISC, pipelined prilaborado kerna horloĝo cikloj, ktp.;
- konceptoj de programlingvoj, ekzemple, plenumante sinsekvo kontrolo, kondiĉa ekzekuto, ripeto, rekursio, funkcia putriĝo, modularidad, sincronización, meta-programado, amplekso, konstanta sub-tipoj, ŝablonojn, produktadon tipo, prototipoj, komentarioj, fluo, monads, leterkestoj, daŭrigu , ĵokerojn, regula esprimo, transaccional memoro, heredaĵo, polimorfismo, modon agordojn, kaj tiel plu. ktp.;
- abstraktaj lingvoj kaj virtualaj maŝinoj;
- algoritmoj kaj datumstrukturoj: regulaj esprimoj, sintaksa analizo algoritmoj, grafikaĵoj algoritmoj, dinamika programado, trejnado;
- programlingvoj: sintakso, semantiko (statika kaj dinamika), subteno paradigmoj (strukturan, OOP, funkcia, logika, pilo, paralelismo, meta-programado);
- kreo programaro (kompililoj, kutime grandaj kaj kompleksaj): lokaligo, caching, componentize, API-interfacoj, reuzi, sincronización.
kompililon dezajno
Kelkaj el la problemoj renkontitaj en la evoluo de la reala tradukisto;
- Problemoj kun la fontlingvo. Ĉu estas facile por kompili ĝin? Ĉu ekzistas antaŭtraktilo? Kiom estas la tipoj? Ĉu ekzistas biblioteko?
- Kolektante kompililon enirpermesiloj: sola aŭ mult-vojo?
- La grado de optimización deziris. Rapida kaj malpura elsendon programoj kun malgranda aŭ neniu optimumigo povas esti normala. Super-optimumigo tradukilo malrapidigi, sed pli bone kodo en tempo de ekzekuto povas valori ĝi.
- La postulata grado de eraro detekto. Ne tradukisto nur haltas ĉe la unua eraro? Kiam ĝi devus halti? Ĉu fidi la tradukilo eraro korekto?
- La havebleco de iloj. Se la originala lingvo ne tre malgranda, la skanilo kaj generatoro analiziloj estas bezonata. Estas ankaŭ generatoroj, kodo generatoroj, sed ili ne estas tiel ofta.
- Tipo de celo kodon por esti generita. Estu elektitaj el pura suplementu aŭ virtuala maŝino kodo. Aŭ simple skribu eniro porcio kiu kreas populara intera reprezento kiel LLVM, RTL, aŭ JVM. Aŭ fari tradukon de la originala en la fontkodon en C aŭ JavaScript.
- La formato de la celo kodon. Vi povas elekti asembleo lingvo, portebla maŝino kodo, maŝino kodo memoro bildo.
- Retargeting. Kiam la aro de generatoroj estas bone havi komunan fjordo parton. Tial ĝi estas bona havi unu generatoro por la enigo de multaj partoj.
kompililon Arkitekturo: komponantojn
Ĉi tiuj estas la ĉefaj funkciaj komponantoj de compilador kiu generas denaska kodo (se la eligo programo estas programo en C aŭ virtuala maŝino, vi devas ne tiel multaj stadioj):
- La eniga programo (fluo markoj) estas manĝita en la skanilo (leksika analizilo), kiu transformas ĝin en fluo de ĵetonoj.
- Parser (parser) konstruante unu abstrakta sintakso arbo.
- Semantika analizilo descompone la semantika informo kaj kontrolas la arbo nodoj por eraroj. Rezulte, konstruita semantika grafeo - abstraktaj sintakso arbo kun aldonaj propraĵoj kaj la establita ligiloj.
- Intera kodo generatoro konstruas fluo grafeo (opoj estas grupigitaj en ĉefaj blokoj).
- Maŝino-sendependa kodo optimizador kondukas ambaŭ lokaj (ene de la bazo unuo) kaj tutmonda (al ĉiuj blokoj) optimumigo esence restanta ene rutinoj. Reduktas redunda kodo kaj simplifica la kalkuloj. La rezulto estas modifita fluo grafo.
- Generatoro ligas celo kodo bazajn blokojn en rectilíneo transdono kontrolo kodo, krei objekton dosiero ensamblador virtuala registroj (eble senefika).
- Maŝino-dependa optimizador, linker allocates memoro inter registroj kaj faras planas teamoj. Ĝi plenumas la konvertiĝo programo en lingvo ensamblador ĉe tiu kunveno kun bona uzo de duktadon.
Krome, la uzo de eraro malkaŝo subsistemon manaĝero kaj simbolo tabloj.
Leksika analizo (escanear)
La skanilo konvertas la rivereto fonto karakteroj en rivereton de ĵetonoj, forigante spaceto, komentojn kaj ekspansiiĝante makrooj.
Skaniloj ofte renkontas problemojn, kiel ekzemple ĉu aŭ ne konsideri la kazon, randoj, linisaltojn kaj enigita komentoj.
Eraroj kiuj povas okazi dum skananta, nomita leksikajn kaj inkludas:
- karakteroj kiuj ne estas en la alfabeto;
- eksceso de la kvanto de karakteroj en vorto aŭ linio;
- ne estas fermita signo aŭ kordo laŭvortan;
- fino de dosiero en komento.
Sintaksa analizo (analiza)
La sintaksa analizilo konvertas la sinsekvo de signoj en abstrakta sintakso arbo. Ĉiu nodo en la arbo estas stokita kiel objekto kun nomata kampoj, multaj el kiuj estas sin la arbo nodoj. En tiu stadio ne estas cikloj. Kiam vi kreas parser oni devas pagi atenton al la nivelo de komplekseco de gramatiko (LL aŭ LR) kaj eltrovi, ĉu ekzistas iuj reguloj malambiguigo. Iuj lingvoj ja postulas semantika analizo.
Eraroj trovitaj ĉe ĉi tiu stadio estas nomataj sintakso. Ekzemple:
- k = 5 * (7 - y;
- j = / 5;
- 56 = x * 4.
semantika analizo
Dum la semantika analizo por kontroli la licitud de reguloj kaj asociita partoj de la parse arbo (permesante referenco nomoj enmeto operacio por implicita tipo konvertiĝoj, kaj tiel plu. D.) Por formi la semantika grafo.
Evidente, la aro de admisibilidad de reguloj en diversaj lingvoj malsamaj. Se vi kompilas la Java-similaj lingvoj, kompililoj povas trovi:
- multoblajn variablo deklaro ene lia medio;
- referenco al variablo antaŭ lia deklaro;
- referencoj al la nomo de la nedeklarita;
- malobservo de patento rajtojn;
- troa aŭ nesufiĉa nombro de argumentoj en metodo voko;
- tipo malkongrua.
generacio
Intera kodo generacio produktas fluon grafeo konsistas el opoj, grupigitaj en bazaj blokoj.
kodo generacio produktas vera maŝino kodo. En tradicia kompililoj por la RISC-maŝinoj sur la unua paŝo, vi kreas ensamblador kun senfina nombro de virtualaj registroj. Por CISC-maŝinoj verŝajne ne okazos.
Similar articles
Trending Now