Computers, Programmering
Broadcaster - is ... Soorten compilers. Omzetten en uitgezonden programma
Programma's, evenals mensen te vertalen van de ene taal naar de andere moet een tolk of vertaler.
basisbegrippen
Het programma is een linguïstische representatie berekeningen: i → P → P (i). Een interpreter is een programma dat wordt toegevoerd aan het invoerprogramma P en wat input x. Het voert bij Px: I (P, x) = P (x). Het feit dat er slechts één vertaler is in staat om alle mogelijke programma's (die in het formele systeem kan worden weergegeven) is een zeer diepgaande en belangrijke ontdekking Turing.
De processor is een interpreter programma in machinetaal. Over het algemeen te duur om te tolken voor high-level talen te schrijven, zodat ze vertalen in een vorm die gemakkelijker te interpreteren.
Sommige soorten vertalers hebben zeer vreemde namen:
- De assembler vertaalt assembler programma's in machinetaal.
- De compiler vertaalt een high-level taal naar een lagere taal.
Omroep - is een programma dat draait als invoergegevens het programma bepaalde taal S en produceert V-programma zodanig dat zij beide dezelfde semantiek: P → X → V. Dat wil zeggen, ∀x. P (x) = Q (x).
Als uitzending het hele programma in iets interpreteerbaar, het is een compilatie Vóór de uitvoering, of AOT compilatie genoemd. AOT compiler kan worden gebruikt in serie, welke laatste dikwijls de assembler, bijvoorbeeld:
De broncode compiler → (vertaler) → → montagecode assembler (compiler) → → CPU machinetaal (interpreter).
Operationele of dynamische compilatie treedt op als het programma wordt uitgezonden, wanneer deze worden uitgevoerd door andere eerder samengesteld deel. JIT-compilers herinneren wat ze al hebben gedaan om te voorkomen dat de broncode opnieuw en opnieuw te herhalen. Ze kunnen zelfs produceren adaptieve compilatie en opnieuw te compileren op basis van het gedrag van de uitvoering van het programma milieu.
Vele talen in staat te stellen code uit te voeren tijdens het compileren en compileren de nieuwe code tijdens runtime.
vertaling podium
Broadcast omvat de stappen van het analyseren en synthetiseren:
De broncode analysator → → → conceptuele voorstelling generator (synthesizer) → doelcode.
Dit is te wijten aan de volgende redenen:
- Elke andere methode is niet geschikt. Woord vertaling werkt gewoon niet.
- Goede technische oplossing: als je wilt vertalers voor M en N brontalen gerichte hoeft alleen schrijven M + N eenvoudige programma's (polukompilyatorov) in plaats van M x N complex (totaal van vertalers) te schrijven.
Echter, in de praktijk, een conceptuele weergave van een zeer zelden expressief genoeg en krachtig genoeg om elke denkbare bron- en doeltaal te dekken. Terwijl sommige in staat waren in de buurt van deze te komen.
Real compilers passeren vele stadia. Bij het maken van je eigen compiler niet nodig om al het harde werk dat de mensen hebben gedaan om representaties en generators te herhalen. U kunt uw taal direct te vertalen in JavaScript of C en te profiteren van de bestaande JavaScript-engine en de C-compiler om de rest te doen. U kunt ook de bestaande tussenrepresentatie en het gebruik van virtuele machines.
opnemen vertaler
Broadcaster - is een programma of hardware, die drie talen betrokken zijn: de bron, de bestemming en de basis. Ze kunnen worden geschreven in een T-vorm, het plaatsen van onder de oorspronkelijke links, rechts en target basis.
Er zijn drie soorten compilers:
- Omroep - is samokompilyator wanneer deze overeenkomt met de basisbron taal.
- Compiler welke taal richten is de basislijn, de zogenaamde samorezidentnym.
- Broadcaster - een cross-compiler, als hij doelgericht en basic verschillende talen.
Waarom is dit belangrijk?
Zelfs als je nooit een echte compiler, een goede kennis van de technologie van haar oprichting, omdat het concept gebruikt voor dit doel op grote schaal worden gebruikt, bijvoorbeeld:
- opmaak tekst;
- language queries tot databases;
- geavanceerde computer architectuur;
- gegeneraliseerde optimalisatie problemen;
- GUI's;
- scripting talen;
- controllers;
- virtuele machines;
- Machine vertaling.
Bovendien, als je wilt preprocessors, linkers, laders, debuggers en profilers te schrijven, moet je door dezelfde stappen als bij het schrijven van een compiler.
U kunt ook leren hoe ze beter programma's te schrijven, sinds de oprichting van de vertaler voor de taal betekent een beter begrip van de complexiteit en dubbelzinnigheden. De studie van de algemene beginselen van de omroep kunt u ook een goede ontwerper taal geworden. Dus maakt het uit hoe steil de taal als het niet effectief kunnen worden uitgevoerd?
uitgebreide technologie
compiler technologie omvat vele verschillende gebieden van de informatica:
- formele theorie van de taal: grammatica, parsing, berekenbaarheid;
- computerarchitectuur. instructiesets, RISC en CISC, gepijplijnde processorkern klokcycli, etc;
- concepten van programmeertalen, bijvoorbeeld het uitvoeren van een sequentie controle, conditionele uitvoering iteratie, recursie, functionele decompositie, modulariteit, synchronisatie, meta-programmeren, scope constante subtypen, sjablonen, uitvoertype, prototypes, annotaties, stroom, monaden, brievenbussen, verder , wildcards, reguliere expressie, transactionele geheugen, overerving, polymorfisme, modusinstellingen, enz enz..;
- abstract talen en virtuele machines;
- algoritmen en datastructuren: reguliere expressies, parsing algoritmen, graphics algoritmen, dynamisch programmeren, opleiding;
- programmeertalen: syntax, semantiek (statisch en dynamisch), ondersteuning paradigma's (structurele, OOP, functioneel, logisch, stack, parallellisme, meta-programmeren);
- Software (compilers, meestal groot en complex): lokalisatie, caching, componentize, API-interfaces, hergebruik, synchronisatie.
compiler ontwerp
Een aantal van de problemen bij de ontwikkeling van de reële vertaler:
- Problemen met de brontaal. Is het makkelijk om het te compileren? Is er een pre-processor? Hoe zijn de soorten? Is er een bibliotheek?
- Groeperen compiler passes: één of meerdere manier?
- De mate van optimalisatie gewenst. Snel en onrein uitgezonden programma's met weinig of geen optimalisatie kan normaal zijn. Over-optimalisatie compiler zal vertragen, maar beter code bij runtime kan de moeite waard zijn.
- De vereiste graad van foutdetectie. Kan een vertaler alleen stoppen bij de eerste fout? Als het moet stoppen? Of het nu om de compiler foutcorrectie vertrouwen?
- De beschikbaarheid van hulpmiddelen. Indien de oorspronkelijke taal is niet erg klein is, worden de scanner en generator analyzers vereist. Er zijn ook generatoren, code generatoren, maar ze zijn niet zo vaak voor.
- Type van het doel code te genereren. Gekozen worden uit pure aangevuld of virtuele machine code. Of gewoon schrijven een item gedeelte waar nu een populair tussenrepresentatie zoals LLVM, RTL, of JVM creëert. Of maak een vertaling van het origineel in de broncode in C of JavaScript.
- Het formaat van het doel code. U kunt kiezen voor een assembler, het machine code geheugen van een draagbare machine code.
- Retargeting. Wanneer de reeks van generatoren is goed om een gemeenschappelijke inlaatgedeelte hebben. Om deze reden is het best om een generator voor het invoeren van een groot aantal onderdelen te hebben.
compiler Architectuur: componenten
Dit zijn de belangrijkste functionele componenten van een compiler die native code genereert (als de uitgang is een programma in C of een virtuele machine, niet zo veel trappen moet je):
- Het invoerprogramma (vloeimerken) wordt in de scanner (lexicale analysator), die het omzet in een stroom van tokens.
- Parser (parser) het construeren van een abstracte syntax boom.
- Semantische analyse ontleedt de semantische informatie en controleert de boom nodes op fouten. Als gevolg hiervan, gebouwd semantische grafiek - abstracte syntax boom met aanvullende eigenschappen en de contacten gelegd.
- Tussencode generator bouwt een stroomdiagram (tupels zijn gegroepeerd in grote blokken).
- Machine-onafhankelijke code optimizer voert zowel lokale (binnen de basiseenheid) en globale (alle blokken) optimalisatie principe blijven binnen routines. Vermindert overbodige code en vereenvoudigt de berekeningen. Het resultaat is een aangepaste stroomdiagram.
- Generator bindt doelcode basisblokken in een rechtlijnige overbrenging besturingscode, waardoor een bestandsobject assembler virtuele registers (eventueel ineffectief).
- Machine-afhankelijke optimizer, linker geheugen toewijst tussen registers en maakt de planning teams. Gebeurt het schakelprogramma in assembler in dit samenstel een goed gebruik van pipelining.
Daarnaast is het gebruik van fout detectiesubsysteem manager en het symbool tafels.
Lexicale analyse (scanning)
De scanner zet de stroom bron personages in een stroom van tokens, het verwijderen van witruimte, opmerkingen en het uitbreiden van macro's.
Scanners vaak geconfronteerd met problemen, zoals het al dan niet rekening te houden met het geval, marges, regeleinden en embedded opmerkingen.
Fouten die optreden tijdens het scannen genoemd lexicale en omvatten:
- tekens die niet in het alfabet;
- boven het aantal tekens in een woord of regel;
- geen gesloten teken of een letterlijke tekenreeks;
- einde van het bestand in commentaar.
Ontleden (parsing)
De parser converteert de sequentie van tekens in een abstract syntaxboom. Elk knooppunt in de boom wordt opgeslagen als een object met de naam velden, waarvan er vele zelf de boom knooppunten. Op dit moment zijn er geen cycli. Wanneer u een parser is het noodzakelijk om aandacht te besteden aan het niveau van de complexiteit van de grammatica (LL of LR) en na te gaan of er sprake is van regels ondubbelzinnig. Sommige talen vereisen semantische analyse.
Gevonden fouten in dit stadium worden genoemd syntax. Bijvoorbeeld:
- k = 5 * (7 - y;
- j = / 5;
- 56 = x * 4.
semantische analyse
Tijdens de semantische analyse van de toelaatbaarheid van regels en geassocieerde delen van het ontledingsboom controleren (waardoor referentienamen inbrengbewerking van impliciete typeconversies, enz. D.) Voor het vormen van de semantische grafiek.
Uiteraard is de set voor de ontvankelijkheid van de regels in verschillende talen anders. Als u de Java-achtige talen compileren, kan compilers vinden:
- meerdere variabelendeclaratie binnen het toepassingsgebied;
- een verwijzing naar een variabele vóór de declaratie;
- verwijzingen naar de naam van het zwartwerk;
- schending van octrooirechten;
- overmatige of onvoldoende aantal argumenten in een methodeaanroep;
- typewanverhouding.
generatie
Tussencode genereren produceert stroomdiagram uit tupels, gegroepeerd in basisblokken.
codegeneratie daadwerkelijk een machinecode. In de traditionele compilers voor de RISC-machines op de eerste stap, maakt u een assembler met een oneindig aantal virtuele registers. Voor CISC-machines zullen waarschijnlijk niet gebeuren.
Similar articles
Trending Now