Rekenaars, Programmering
Uitsaaier - is ... Tipes van opstellers. Omskep en uitgesaai programme
Programme, sowel as mense om te vertaal van een taal na 'n ander moet 'n tolk of vertaler.
basiese konsepte
Die program is 'n taalkundige voorstelling van berekeninge: I → P → P (i). 'N tolk is 'n program wat verskaf om die insette program P en 'n paar insette x. Dit voer aan P x: Ek (P, x) = P (x). Die feit dat daar net een vertaler in staat is om van die verrigting van alle moontlike programme (wat in die formele stelsel voorgestel kan word) is 'n baie diep en betekenisvolle ontdekking Turing.
Die verwerker is 'n tolk van programme in masjientaal. Oor die algemeen te duur om tolke vir 'n hoë-vlak tale te skryf, sodat hulle vertaal in 'n vorm wat is makliker om te interpreteer.
Sommige vorme van vertalers het baie vreemd name:
- Die samesteller vertaal saamsteltaal programme in masjientaal.
- Die samesteller vertaal 'n hoëvlaktaal na 'n laer taal.
Uitsaaier - is 'n program wat neem as invoer data die program in 'n paar taal S en produseer T program in so 'n manier dat hulle albei dieselfde semantiek: P → X → Q. Dit is, ∀x. P (x) = Q (x).
As uitgesaai die hele program in iets interpreteerbare, is dit 'n samestelling voor uitvoering, of AOT samestelling genoem. AOT samesteller kan gebruik word in 'n reeks, laasgenoemde waarvan dikwels die assembler, byvoorbeeld:
Die bron-kode samesteller → (vertaler) → → vergadering kode assembler (samesteller) → → CPU masjien kode (tolk).
Operasionele of dinamiese samestelling voorkom asof die program uitgesaai word, wanneer dit uitgevoer word deur ander wat voorheen saamgestel deel. JIT-opstellers onthou wat hulle reeds gedoen het sodat dit nie die bronkode weer en weer herhaal. Hulle kan selfs produseer adaptive samestelling en hersamestelling gebaseer op die gedrag van die program uitvoering omgewing.
Baie tale toelaat om kode te voer tydens kompilering en stel die nuwe kode tydens looptyd.
vertaling stadium
Uitsending bestaan uit die stappe van die ontleding en sintetisering:
Die bron-kode ontleder → → → konseptuele voorstelling kragopwekker (sintetiseerder) → Doel kode.
Dit is te danke aan hierdie redes:
- Enige ander metode is nie geskik nie. Woord vertaling eenvoudig nie werk nie.
- Goeie ingenieurswese oplossing: as jy wil om vertalers vir M en N bron tale gerig hoef te skryf net M + N eenvoudige program (polukompilyatorov) eerder as M × N komplekse (totaal van vertalers) skryf.
Maar in die praktyk, 'n konseptuele siening van 'n baie selde ekspressiewe genoeg en sterk genoeg is om elke denkbare bron- en doeltale te dek. Terwyl sommige in staat was om naby aan hierdie om te kom.
Real opstellers slaag deur baie fases. Wanneer die skep van jou eie samesteller hoef nie al die harde werk wat mense gedoen het om vertoë en kragopwekkers te skep herhaal. Jy kan jou taal direk vertaal in JavaScript of C en neem voordeel van bestaande JavaScript-enjin en die C samesteller om die res te doen. Jy kan ook die bestaande intermediêre verteenwoordiging en gebruik virtuele masjiene.
rekord vertaler
Uitsaaier - is 'n program of hardeware, wat drie tale betrokke: die bron, die bestemming en die basis. Hulle kan geskryf word in 'n T-vorm, plaas onder die oorspronklike links, regs en teiken basis.
Daar is drie tipes van opstellers:
- Uitsaaier - is samokompilyator as dit ooreenstem met die basiese brontaal.
- Samesteller watter taal teiken is die basislyn, genoem samorezidentnym.
- Uitsaaier - 'n kruis-samesteller, as hy gerig en basiese verskeie tale.
Hoekom is dit belangrik?
Selfs as jy nog nooit 'n werklike samesteller, 'n goeie kennis van die tegnologie van sy skepping, omdat die konsep vir hierdie doel gebruik wyd gebruik word, byvoorbeeld:
- opmaak teks;
- taal navrae aan databasisse;
- gevorderede rekenaarargitektuur;
- algemene optimeringsprobleme;
- GUI;
- script tale;
- beheerders;
- virtuele masjiene;
- Masjien vertaling.
Daarbenewens, as jy wil preprocessors, linkers, loaders, debug gers en profilers skryf, moet jy gaan deur dieselfde stappe as tydens die skryf van 'n samesteller.
Jy kan ook leer hoe om beter programme skryf, sedert die skepping van die vertaler vir die taal beteken 'n beter begrip van die verwikkeldheid en teenstrydighede. Die studie van die algemene beginsels van die uitsaaiwese kan jy ook 'n goeie ontwerper taal geword. So maak dit saak hoe steil die taal as dit nie effektief geïmplementeer kan word?
omvattende tegnologie
samesteller tegnologie dek baie verskillende gebiede van rekenaarwetenskap:
- formele teorie van taal: taal, ontleding, berekenbaarheid;
- rekenaarargitektuur. instruksie stelle, RISC of CISC, pyplyn verwerking kern klok siklusse, ens;
- konsepte van programmeertale, byvoorbeeld, die verrigting van 'n reeks beheer, voorwaardelike uitvoering, iterasie, rekursie, funksionele ontbinding, modulariteit, sinchronisasie, meta-programmering, omvang, konstante sub-tipes, templates, uitset tipe, prototipes, notas, vloei, Monads, posbusse, voortgaan , wildcards, gereelde uitdrukking, transaksionele geheue, erfenis, polimorfisme, modus instellings, en so aan, ens..;
- abstrakte tale en virtuele masjiene;
- algoritmes en datastrukture: gereelde uitdrukkings, die ontleding van algoritmes, grafiese algoritmes, dinamiese programmering, opleiding;
- programmeertale: sintaksis, semantiek (staties en dinamies), ondersteuning paradigmas (strukturele, OOP, funksionele, logiese, stapel, parallelisme, meta-programmering);
- skepping sagteware (samestellers, gewoonlik groot en komplekse): lokalisering, caching, componentize, API-koppelvlakke, hergebruik, sinchronisasie.
samesteller ontwerp
Sommige van die probleme in die ontwikkeling van die werklike vertaler:
- Probleme met die brontaal. Is dit maklik om dit op te stel? Is daar 'n voorverwerker? Hoe is die tipe? Is daar 'n biblioteek?
- Groepering samesteller passe: enkel-of multi-pad?
- Die graad van optimalisering wense oor. Vinnig en onrein uitsending programme met min of geen optimization kan normaal wees. Oor-optimalisering samesteller sal stadig, maar beter kode tydens looptyd kan die moeite werd wees.
- Die vereiste graad van die fout opsporing. Kan 'n vertaler net stop by die eerste fout? Wanneer dit moet stop? Of om die samesteller foutkorreksie vertrou?
- Die beskikbaarheid van hulpmiddels. As die oorspronklike taal is nie baie klein, is die skandeerder en generator ontleder vereis. Daar is ook kragopwekkers,-kode kragopwekkers, maar hulle is nie so algemeen.
- Tipe teiken-kode te genereer. Gekies uit pure is aangevul of virtuele masjien kode. Of net skryf 'n inskrywing gedeelte wat 'n gewilde intermediêre verteenwoordiging soos LLVM, RTL, of JVM skep. Of maak 'n vertaling van die oorspronklike in die bronkode in C of JavaScript.
- Die formaat van die teiken-kode. Jy kan kies 'n saamsteltaal, beeld masjien kode geheue 'n draagbare masjien kode,.
- Beter oordeel. Wanneer die stel van kragopwekkers is goed om 'n gemeenskaplike inlaat gedeelte het. Om hierdie rede is dit die beste om 'n kragopwekker vir die insette van baie dele het.
samesteller Architecture: komponente
Dit is die groot funksionele komponente van 'n samesteller wat inheemse kode genereer (indien die uitset program is 'n program in C of 'n virtuele masjien, nie so baie fases moet jy):
- Die insette program (vloei punte) is gevoer in die skandeerder (leksikale ontleder), wat dit vat in 'n stroom van tekens.
- Parser (parser) die bou van 'n abstrakte sintaksis boom.
- Semantiese ontleder ontbind die semantiese inligting en gaan die boom nodes vir foute. As gevolg hiervan, gebou semantiese grafiek - abstrakte sintaksis boom met bykomende eienskappe en die gevestigde skakels.
- Intermediêre kode kragopwekker bou 'n vloei grafiek (tuples is gegroepeer in hoof blokke).
- Masjien-onafhanklike kode optimizer doen beide plaaslike (binne die basis eenheid) en globale (al blokke) optimization basies oorblywende binne roetines. Verminder onnodige kode en vergemaklik die berekeninge. Die resultaat is 'n aangepaste vloei grafiek.
- Kragopwekker bind teiken kode basiese blokke in 'n reglynige oordrag beheer kode, die skep van 'n lêer voorwerp assembler virtuele registers (moontlik oneffektief).
- Masjien-afhanklike optimizer, linker ken geheue tussen registers en maak die beplanning van spanne. Dit voer die omskakeling program in saamsteltaal by hierdie vergadering met 'n goeie gebruik van pipelining.
Daarbenewens het die gebruik van die fout opsporing substelsel bestuurder en simbool tafels.
Leksikale ontleding (skandering)
Die skandeerder vat die stroom bron karakters in 'n stroom van tekens, die verwydering van witspasie, kommentaar en uit te brei makros.
Skandeerders dikwels teëkom probleme, soos of nie rekening hou met die geval, marges, lyn breek en ingeboude kommentaar.
Foute wat mag voorkom tydens skandering, genoem leksikale en sluit in:
- karakters wat nie in die alfabet;
- meer as die aantal karakters in 'n woord of reël;
- nie 'n geslote teken of 'n string letterlike;
- einde van lêer in kommentaar.
Ontleding van (parsing)
Die ontleder vat die volgorde van tekens in 'n abstrakte sintaksis boom. Elke node in die boom gestoor as 'n voorwerp met die naam velde, waarvan baie self die boom nodes. Op hierdie stadium is daar geen siklusse. As jy 'n ontleder is dit nodig om aandag te skenk aan die vlak van kompleksiteit van grammatika (LL of LR) en uit te vind of daar enige reëls wat onduidelikhede opklaar. Sommige tale vereis semantiese analise.
Foute gevind op hierdie stadium is geroep sintaksis. Byvoorbeeld:
- k = 5 * (7 - y;
- j = / 5;
- 56 = x * 4.
semantiese analise
Gedurende die semantiese analise van die toelaatbaarheid van reëls en mede dele van die parse boom kyk (sodat verwysing name inbring operasie vir implisiete tipe doelskoppe, en so aan. D.) Vir die vorming van die semantiese grafiek.
Dit is duidelik dat die stel van toelaatbaarheid van reëls in verskillende tale verskillende. As jy die Java-agtige tale op te stel, kan opstellers vind:
- veelvuldige veranderlike verklaring binne die omvang;
- 'n verwysing na 'n veranderlike voor sy verklaring;
- verwysings na die naam van die onverklaarde;
- skending van patentregte;
- oormatige of onvoldoende aantal argumente in 'n metode oproep;
- tipe wanaanpassing.
generasie
Intermediêre kodegenerasie produseer vloei grafiek saamgestel uit tuples, gegroepeer in basiese blokke.
kodegenerasie produseer 'n werklike masjien kode. In tradisionele opstellers vir die RISC-masjiene op die eerste stap, skep jy 'n assembler met 'n oneindige aantal virtuele registers. Vir CISC-masjiene sal waarskynlik nie gebeur nie.
Similar articles
Trending Now