In computing , 'n samesteller is 'n rekenaarprogram wat vertaal rekenaar kode geskryf in een programmeertaal (die bron taal) in 'n ander taal (die teiken taal). Die naam "samesteller" word hoofsaaklik gebruik vir programme wat bronkode vertaal van 'n hoë vlak programmeertaal na 'n laer vlak taal (bv. Samestellingstaal , voorwerpkode of masjienkode ) om 'n uitvoerbare program te skep .   : p1
Daar is baie verskillende soorte samestellers wat produksie in verskillende nuttige vorms lewer. 'N Samesteller wat op 'n rekenaar kan werk waarvan die SVE of bedryfstelsel anders is as die kode waarop die kode wat dit produseer, gebruik word, word 'n kruis-samesteller genoem . 'N Bootstrap-samesteller is geskryf in die taal wat hy van plan is om saam te stel. 'N Program wat vertaal word van 'n lae-vlak taal na 'n hoër vlak een is 'n dekompiler . 'N Program wat vertaal word tussen tale op hoë vlak, word gewoonlik 'n bron-tot-bron-samesteller of transkompilator genoem . 'N Taalherskrywer is gewoonlik 'n program wat die vorm van uitdrukkings vertaal sonder dat die taal verander. Die term samesteller-samesteller verwys na instrumente wat gebruik word om te skep parsers wat verrig sintaksis analise.
'N Samesteller sal waarskynlik baie of al die volgende bewerkings uitvoer: voorverwerking , leksikale analise , parsing , semantiese analise ( sintaksgerigte vertaling ), omskakeling van invoerprogramme na 'n tussentydse voorstelling , kode-optimalisering en kodegenerering . Samestellers implementeer hierdie bewerkings in fases wat effektiewe ontwerp en korrekte transformasies van broninvoer na teikenuitsette bevorder. Programfoute wat veroorsaak word deur verkeerde samestellergedrag kan baie moeilik wees om op te spoor en om te werk; samesteller-implementeerders doen dus groot moeite om die korrektheid van die samesteller te verseker . 
Samestellers is nie die enigste taalverwerker wat gebruik word om bronprogramme te transformeer nie. 'N Tolk is rekenaarsagteware wat die aangeduide bewerkings transformeer en dan uitvoer.  : p2 Die vertaalproses beïnvloed die ontwerp van rekenaartale, wat lei tot die voorkeur van samestelling of interpretasie. In die praktyk kan 'n tolk geïmplementeer word vir saamgestelde tale en samestellers vir geïnterpreteerde tale.
'N Diagram van die werking van 'n tipiese meertalige samesteller met meerdere teikens
Teoretiese rekenaarkonsepte wat deur wetenskaplikes, wiskundiges en ingenieurs ontwikkel is, was die basis van digitale moderne rekenaarontwikkeling tydens die Tweede Wêreldoorlog. Primitiewe binêre tale het ontwikkel omdat digitale toestelle net een en nulle en die stroombaanpatrone in die onderliggende masjienargitektuur verstaan. In die laat veertigerjare is samestellingstale geskep om 'n meer werkbare abstraksie van die rekenaarargitektuur aan te bied. Beperkte geheuevermoë van vroeë rekenaars het gelei tot groot tegniese uitdagings toe die eerste samestellers ontwerp is. Daarom moes die samestellingsproses in verskeie klein programme verdeel word. Die voorste programme lewer die ontledingsprodukte wat deur die agterste programme gebruik word om teikenkode te genereer. Aangesien rekenaartegnologie meer hulpbronne verskaf, kan samestellerontwerpe beter aansluit by die samestellingsproses.
Dit is gewoonlik produktiewer vir 'n programmeerder om 'n taal op hoë vlak te gebruik, en die ontwikkeling van tale op hoë vlak is natuurlik die gevolg van die vermoëns wat digitale rekenaars bied. Hoëvlak-tale is formele tale wat streng gedefinieer word deur hul sintaksis en semantiek wat die hoëvlak- taalargitektuur vorm. Elemente van hierdie formele tale sluit in:
Alfabet , enige eindige stel simbole;
Tou , 'n eindige reeks simbole;
Taal , enige stel snare op 'n alfabet.
Die sinne in 'n taal kan gedefinieer word deur 'n stel reëls wat 'n grammatika genoem word. 
Backus – Naur vorm (BNF) beskryf die sintaksis van 'sinne' van 'n taal en is deur John Backus gebruik vir die sintaksis van Algol 60 .  Die idees is afgelei van die konteksvrye grammatika- konsepte deur Noam Chomsky , 'n taalkundige.  "BNF en sy uitbreidings het standaardinstrumente geword om die sintaksis van programmeringskennisgewings te beskryf, en in baie gevalle word dele van samestellers outomaties gegenereer uit 'n BNF-beskrywing." 
In die veertigerjare ontwerp Konrad Zuse 'n algoritmiese programmeertaal genaamd Plankalkül ("Plan Calculus"). Alhoewel geen werklike implementering voor die 1970's plaasgevind het nie, het dit konsepte aangebied wat later gesien is in APL wat deur Ken Iverson in die laat 1950's ontwerp is.  APL is 'n taal vir wiskundige berekeninge.
Hoëvlak-taalontwerp gedurende die vormingsjare van digitale rekenaars het nuttige programmeringsinstrumente verskaf vir 'n verskeidenheid toepassings:
FORTRAN (formulevertaling) vir ingenieurs- en wetenskapstoepassings word beskou as die eerste taal op hoë vlak. 
COBOL (Common Business-Oriented Language) het ontwikkel van A-0 en FLOW-MATIC om die dominante hoëvlaktaal vir besigheidstoepassings te word. 
LISP (Lysverwerker) vir simboliese berekening. 
Samestellertegnologie het ontwikkel uit die behoefte aan 'n streng omskrewe transformasie van die hoëvlakbronprogram in 'n laevlak-teikenprogram vir die digitale rekenaar. Die samesteller kan gesien word as 'n voorkant vir die ontleding van die bronkode en 'n agterkant om die analise in die teikenkode te sintetiseer. Optimalisering tussen die voor- en agterkant kan doeltreffender teikenkode lewer. 
Enkele vroeë mylpale in die ontwikkeling van samestellertegnologie:
1952 : 'n Autocode- samesteller wat deur Alick Glennie ontwikkel is vir die Manchester Mark I- rekenaar aan die Universiteit van Manchester, word deur sommige as die eerste saamgestelde programmeertaal beskou.
1952 : Die span van Grace Hopper by Remington Rand het die samesteller vir die A-0 programmeertaal geskryf (en die term samesteller geskep om dit te beskryf),   hoewel die A-0 samesteller meer as 'n laaier of skakelaar funksioneer. as die moderne begrip van 'n volledige samesteller.
1954–1957 : 'n Span onder leiding van John Backus by IBM het FORTRAN ontwikkel wat gewoonlik as die eerste taal op hoë vlak beskou word. In 1957 voltooi hulle 'n FORTRAN-samesteller wat algemeen erken word dat dit die eerste ondubbelsinnige samesteller bekendgestel het.
1959 : Die CODASYL-konferensie oor datastelseltaal het die ontwikkeling van COBOL begin . Die COBOL-ontwerp is gebaseer op A-0 en FLOW-MATIC. Teen die vroeë 1960's is COBOL op verskeie argitekture saamgestel.
1958–1962 : John McCarthy by MIT ontwerp LISP .  Die simboolverwerkingsvermoë het nuttige funksies vir kunsmatige intelligensie-navorsing verskaf. In 1962 het LISP 1.5 bekendgestel dat daar 'n paar instrumente was: 'n tolk geskryf deur Stephen Russell en Daniel J. Edwards, 'n samesteller en samesteller wat geskryf is deur Tim Hart en Mike Levin. 
Vroeë bedryfstelsels en sagteware is in samestellingstaal geskryf. In die 1960's en vroeë 1970's was die gebruik van hoëvlak-tale vir stelselprogrammering steeds omstrede weens hulpbronbeperkings. Maar 'n paar navorsing en nywerheid pogings begin die verskuiwing in die rigting van 'n hoë-vlak stelsels programmeertale, byvoorbeeld, BCPL , BLISS , B , en C .
BCPL (Basic Combined Programming Language) wat in 1966 deur Martin Richards aan die Universiteit van Cambridge ontwerp is, is oorspronklik ontwikkel as 'n samestellings-skryfinstrument.  Verskeie samestellers is geïmplementeer, Richards se boek bied insig aan die taal en die samesteller daarvan.  BCPL was nie net 'n invloedryke stelselprogrammeringstaal wat steeds in navorsing gebruik word nie , maar ook 'n basis vir die ontwerp van B- en C-tale.
BLISS (Basic Language for Implementation of System Software) is ontwikkel vir 'n Digital Equipment Corporation (DEC) PDP-10-rekenaar deur die navorsingspan van Carnegie Mellon University (CMU) van WA Wulf. Die CMU-span het 'n jaar later in 1970 die BLISS-11-samesteller ontwikkel.
Multics (Multiplexed Information and Computing Service), 'n bedryfstelselprojek vir tydverdeling, het MIT , Bell Labs , General Electric (later Honeywell ) betrek en is gelei deur Fernando Corbató van MIT.  Multics is geskryf in die PL / I- taal wat ontwikkel is deur IBM en IBM User Group.  IBM se doel was om te voldoen aan die vereistes vir besigheid, wetenskap en stelselprogrammering. Daar kon ander tale oorweeg word, maar PL / I het die mees volledige oplossing aangebied, alhoewel dit nie geïmplementeer is nie.  Vir die eerste paar jaar van die Multics-projek kon 'n deelversameling van die taal saamgestel word tot samestellingstaal met die Early PL / I (EPL) -samesteller deur Doug McIlory en Bob Morris van Bell Labs.  EPL het die projek ondersteun totdat 'n samesteller van die boot-band vir die volledige PL / I ontwikkel kon word. 
Bell Labs het die Multics-projek in 1969 verlaat: "Met verloop van tyd is hoop vervang deur frustrasie, aangesien die groeppoging aanvanklik nie 'n ekonomies bruikbare stelsel kon oplewer nie."  Voortgesette deelname sal projekondersteuningskoste verhoog. Daarom het navorsers hulle gewend tot ander ontwikkelingspogings. 'N Stelselprogrammeringstaal B gebaseer op BCPL-konsepte is geskryf deur Dennis Ritchie en Ken Thompson . Ritchie het 'n opstart-samesteller vir B geskep en Unics (Uniplexed Information and Computing Service) bedryfstelsel vir 'n PDP-7 in B. geskryf. Unics word uiteindelik Unix gespel.
Bell Labs het begin met die ontwikkeling en uitbreiding van C gebaseer op B en BCPL. Die BCPL-samesteller is deur Bell Labs na Multics vervoer en BCPL was 'n voorkeurtaal by Bell Labs.  Aanvanklik is 'n frontprogram vir Bell Labs se B-samesteller gebruik terwyl 'n C-samesteller ontwikkel is. In 1971 voorsien 'n nuwe PDP-11 die bron om uitbreidings aan B te definieer en die samesteller te herskryf. Teen 1973 was die ontwerp van die C-taal in wese voltooi en is die Unix-kern vir 'n PDP-11 in C herskryf. Steve Johnson begin met die ontwikkeling van Portable C Compiler (PCC) om die herrigting van C-samestellers na nuwe masjiene te ondersteun.  
Objekgeoriënteerde programmering (OOP) het interessante moontlikhede gebied vir die ontwikkeling en instandhouding van toepassings. OOP-konsepte gaan verder terug, maar was deel van LISP en Simula-taalwetenskap .  By Bell Labs het die ontwikkeling van C ++ in OOP belanggestel.  C ++ is die eerste keer in 1980 gebruik vir stelselprogrammering. Die aanvanklike ontwerp het gebruik gemaak van C-taalstelselprogrammeringsfunksies met Simula-konsepte. Voorwerpgerigte fasiliteite is in 1983 toegevoeg.  Die Cfront-program het 'n C ++ front-end geïmplementeer vir die samesteller van C84-tale. In die daaropvolgende jare is verskeie C ++ - samestellers ontwikkel namate die gewildheid van C ++ toegeneem het.
In baie toepassingsdomeine het die idee om 'n taal op hoër vlak te gebruik, vinnig aangegryp. Weens die uitbreiding van funksionaliteit wat deur nuwer programmeertale ondersteun word en die toenemende kompleksiteit van rekenaarargitekture, het samestellers meer ingewikkeld geraak.
DARPA (Defense Advanced Research Projects Agency) het in 1970 'n samestellerprojek saam met Wulf se CMU-navorsingspan geborg. Die produksiekwaliteit-samesteller-samesteller- PQCC- ontwerp sou 'n produksiekwaliteit-samesteller (PQC) vervaardig uit formele definisies van die brontaal en die teiken.  PQCC het probeer om die term samesteller-samesteller buite die tradisionele betekenis uit te brei as 'n ontledergenerator (bv. Yacc ) sonder veel sukses. PQCC kan meer korrek na verwys word as 'n samestellergenerator.
PQCC-navorsing oor die generering van kode het gepoog om 'n werklike outomatiese stelsel vir die opstel van samestellers te bou. Die poging het die fasestruktuur van die PQC ontdek en ontwerp. Die BLISS-11-samesteller het die aanvanklike struktuur verskaf.  Die fases het analises (voorkant), tussentydse vertaling na virtuele masjien (middelkant) en vertaling na die teiken (agterkant) ingesluit. TCOL is ontwikkel vir die PQCC-navorsing om taalspesifieke konstrukte in die intermediêre voorstelling te hanteer.  Variasies van TCOL het verskillende tale ondersteun. Die PQCC-projek het tegnieke vir outomatiese samestellerkonstruksie ondersoek. Die ontwerpkonsepte was nuttig om samestellers en samestellers vir die objekgerigte programmeertaal Ada te optimaliseer .
Die Ada Stoneman-dokument het die programondersteuningsomgewing (APSE) saam met die kern (KAPSE) en minimal (MAPSE) geformaliseer. 'N Ada-tolk NYU / ED ondersteun ontwikkelings- en standaardiseringspogings met die American National Standards Institute (ANSI) en die International Standards Organization (ISO). Die aanvanklike ontwikkeling van die Ada-samesteller deur die Amerikaanse militêre dienste het die samestellers ingesluit in 'n volledige, geïntegreerde ontwerpomgewing volgens die Stoneman-dokument. Army en Navy het gewerk aan die Ada Language System (ALS) -projek wat gerig is op DEC / VAX-argitektuur, terwyl die lugmag begin het met die Ada Integrated Environment (AIE) wat gerig is op IBM 370-reeks. Alhoewel die projekte nie die gewenste resultate gelewer het nie, het dit wel bygedra tot die algehele inspanning vir die ontwikkeling van Ada. 
Ander Ada-samestellingspogings is aan die gang in Brittanje aan die Universiteit van York en in Duitsland aan die Universiteit van Karlsruhe. In die VSA het Verdix (wat later deur Rational verkry is) die Verdix Ada Development System (VADS) aan die weermag gelewer. VADS het 'n stel ontwikkelingsinstrumente verskaf, insluitend 'n samesteller. Unix / VADS kan aangebied word op 'n verskeidenheid Unix-platforms soos DEC Ultrix en die Sun 3/60 Solaris wat gerig is op Motorola 68020 in 'n Army CECOM-evaluering.  Daar was gou baie Ada-samestellers beskikbaar wat die Ada-valideringstoetse geslaag het. Die Free Software Foundation GNU-projek het die GNU Compiler Collection (GCC) ontwikkel wat 'n kernvermoë bied om verskeie tale en teikens te ondersteun. Die Ada-weergawe GNAT is een van die mees gebruikte Ada-samestellers. GNAT is gratis, maar daar is ook kommersiële ondersteuning, byvoorbeeld AdaCore, wat in 1994 gestig is om kommersiële sagteware-oplossings vir Ada te bied. GNAT Pro bevat die GNU GCC-gebaseerde GNAT met 'n gereedskapstel om 'n geïntegreerde ontwikkelingsomgewing te bied .
Hoëvlak-tale het voortgegaan om navorsing en ontwikkeling van samestellers te dryf. Fokusareas het optimering en outomatiese kodegenerering ingesluit. Neigings in programmeertale en ontwikkelingsomgewings beïnvloed samestellertegnologie. Meer samestellers is opgeneem in taalverspreidings (PERL, Java Development Kit) en as onderdeel van 'n IDE (VADS, Eclipse, Ada Pro). Die onderlinge verband en interafhanklikheid van tegnologieë het toegeneem. Die koms van webdienste het die groei van web- en skripttale bevorder. Skripte word teruggevoer na die vroeë dae van Command Line Interfaces (CLI) waar die gebruiker opdragte kan invoer wat deur die stelsel uitgevoer moet word. User Shell-konsepte ontwikkel met tale om shell-programme te skryf. Vroeë Windows-ontwerpe het 'n eenvoudige groepprogrammeringsvermoë aangebied. Die konvensionele transformasie van hierdie taal het 'n tolk gebruik. Alhoewel dit nie baie gebruik word nie, is Bash en Batch-samestellers geskryf. Onlangs het gesofistikeerde geïnterpreteerde tale deel geword van die gereedskapstel vir ontwikkelaars. Moderne skripttale sluit in PHP, Python, Ruby en Lua. (Lua word wyd gebruik in spelontwikkeling.) Al hierdie het tolk- en samestellerondersteuning. 
'Toe die veld vir kompilering in die laat 50's begin het, was die fokus beperk tot die vertaling van hoëvlak-taalprogramme in masjienkode ... Die veld vir samesteller word al hoe meer verweef met ander vakgebiede, waaronder rekenaarargitektuur, programmeertale, formele metodes, sagteware-ingenieurswese, en rekenaarbeveiliging. "  In die artikel "Compiler Research: The Next 50 Years" word die belang van objekgerigte tale en Java opgemerk. Sekuriteit en parallelle rekenaars is onder die toekomstige navorsingsdoelwitte genoem.
'N Samesteller implementeer 'n formele transformasie van 'n hoëvlakbronprogram na 'n laevlak-teikenprogram. Samesteller-ontwerp kan 'n end-tot-end-oplossing definieer of 'n gedefinieerde onderstel aanpak wat koppel aan ander samestellingsinstrumente, byvoorbeeld voorverwerkers, monteerders, skakelers. Ontwerpvereistes sluit streng gedefinieerde koppelvlakke in, beide intern tussen samestelleronderdele en ekstern tussen ondersteunende gereedskapstelle.
In die vroeë dae is die benadering van die samestellerontwerp direk beïnvloed deur die kompleksiteit van die rekenaartaal wat verwerk moet word, die ervaring van die persoon (s) wat dit ontwerp en die beskikbare bronne. Hulpbronbeperkings het gelei tot die behoefte om meer as een keer deur die bronkode te gaan.
'N Samesteller vir 'n betreklik eenvoudige taal wat deur een persoon geskryf word, kan 'n enkele, monolitiese sagteware wees. Namate die brontaal in kompleksiteit groei, kan die ontwerp egter in 'n aantal interafhanklike fases verdeel word. Afsonderlike fases bied ontwerpverbeterings wat fokus op die funksies in die samestellingsproses.
Een-pass versus multi-pass samestellers
Die klassifikasie van samestellers volgens die aantal slaagsyfers het sy agtergrond in die hardewarehulpbronbeperkings van rekenaars. Kompilering behels baie werk en vroeë rekenaars het nie genoeg geheue gehad om een ​​program te bevat wat al hierdie werk gedoen het nie. Samestellers is dus opgedeel in kleiner programme wat elk die bron (of 'n enkele weergawe daarvan) deurgegee het en die nodige ontledings en vertalings uitgevoer het.
Die vermoë om in 'n enkele slaag saam te stel , word klassiek gesien as 'n voordeel omdat dit die werk om 'n samesteller te skryf, vereenvoudig en samestellers met een slaag gewoonlik kompilasies vinniger uitvoer as multi-slaagsamestellers . Dus, deels gedryf deur die hulpbronbeperkings van vroeë stelsels, is baie vroeë tale spesifiek ontwerp sodat dit in 'n enkele slaag saamgestel kan word (bv. Pascal ).
In sommige gevalle kan die ontwerp van 'n taalfunksie vereis dat 'n samesteller meer as een pass oor die bron uitvoer. Beskou byvoorbeeld 'n verklaring wat op reël 20 van die bron verskyn en wat die vertaling van 'n verklaring wat op reël 10 verskyn, beïnvloed. In hierdie geval moet die eerste slaag inligting versamel oor verklarings wat verskyn na verklarings wat dit raak, terwyl die werklike vertaling plaasvind tydens 'n volgende slaag.
Die nadeel van die samestelling in 'n enkele pas is dat dit nie moontlik is om baie van die gesofistikeerde optimalisasies uit te voer wat nodig is om kode van hoë gehalte te genereer nie. Dit kan moeilik wees om presies te tel hoeveel passe 'n optimaliserende samesteller maak. In verskillende fases van optimalisering kan byvoorbeeld een uitdrukking baie keer ontleed word, maar slegs een keer 'n ander uitdrukking ontleed.
Die opdeel van 'n samesteller in klein programme is 'n tegniek wat gebruik word deur navorsers wat belangstel om bewysbare korrekte samestellers te vervaardig. Om die korrektheid van 'n stel klein programme te bewys, verg dikwels minder moeite as om die korrektheid van 'n groter, gelykstaande program te bewys.
Ongeag die presiese aantal fases in die samestellerontwerp, kan die fases in een van die drie fases toegeken word. Die verhoë sluit in 'n voorkant, 'n middel en 'n agterkant.
Die voorkant skandeer die invoer en verifieer sintaksis en semantiek volgens 'n spesifieke brontaal. Vir staties getikte tale voer dit tipe kontrole uit deur tipe inligting in te samel. As die invoerprogram sintakties verkeerd is of 'n tipe fout het, genereer dit fout- en / of waarskuwingsboodskappe wat gewoonlik die ligging in die bronkode waar die probleem opgespoor is, identifiseer; in sommige gevalle kan die werklike fout (baie) vroeër in die program wees. Aspekte van die voorkant sluit in leksikale analise, sintaksanalise en semantiese analise. Die voorkant omskep die invoerprogram in 'n intermediêre voorstelling (IR) vir verdere verwerking deur die middelste punt. Hierdie IR is gewoonlik 'n voorstelling van die program op 'n laer vlak met betrekking tot die bronkode.
Die middelkant voer optimalisasies uit op die IR wat onafhanklik is van die CPU-argitektuur wat geteiken word. Hierdie bronkode / masjienkode-onafhanklikheid is bedoel om dit moontlik te maak om generiese optimalisasies te kan deel tussen weergawes van die samesteller wat verskillende tale en teikenverwerkers ondersteun. Voorbeelde van middel-end-optimalisasies is die verwydering van nuttelose ( dooie kode-eliminasie ) of onbereikbare kode ( bereikbaarheidsanalise ), ontdekking en voortplanting van konstante waardes ( konstante voortplanting ), die verskuiwing van berekening na 'n plek wat minder gereeld uitgevoer word (bv. Buite 'n lus) , of spesialisering van berekening gebaseer op die konteks. Uiteindelik die vervaardiging van die "geoptimaliseerde" IR wat deur die agterkant gebruik word.
Die agterkant haal die geoptimaliseerde IR vanaf die middelste punt. Dit kan meer analises, transformasies en optimerings uitvoer wat spesifiek is vir die teiken-SVE-argitektuur. Die agterkant genereer die teikenafhanklike monteringskode en voer die registertoekenning in die proses uit. Die agterkant voer instruksieskedulering uit , wat instruksies herbestel om parallelle uitvoeringseenhede besig te hou deur vertragingsgleuwe in te vul . Alhoewel die meeste optimaliseringsprobleme NP-moeilik is , is heuristiese tegnieke om dit op te los goed ontwikkel en tans geïmplementeer in samestellers van produksiekwaliteit. Die uitvoer van 'n agterkant is gewoonlik masjienkode wat vir 'n spesifieke verwerker en bedryfstelsel spesialiseer.
Hierdie front / middel / back-end benadering maak dit moontlik om die voorkant vir verskillende tale te kombineer met die agterkant vir verskillende SVE's, terwyl die optimalisering van die middelste deel gedeel word.  Praktiese voorbeelde van hierdie benadering is die GNU Compiler Collection , Clang ( LLVM- gebaseerde C / C ++ samesteller),  en die Amsterdam Compiler Kit , wat veelvuldige voorpunte, gedeelde optimalisasies en veelvuldige agterpunte het.
Laer is en ontleder voorbeeld vir C . Vanuit die reeks karakters " if(net>0.0)total+=net*(1.0+tax/100.0);", stel die skandeerder 'n reeks tekens saam en kategoriseer elkeen daarvan, byvoorbeeld as identifiseerder , voorbehou woord , letterletter of operateur . Laasgenoemde volgorde word deur die ontleder omskep in 'n sintaksboom , wat dan deur die oorblywende samestellerfases behandel word. Die skandeerder en ontleder hanteer die gewone en behoorlik konteksvrye dele van die grammatika vir onderskeidelik C.
Die voorkant analiseer die bronkode om 'n interne voorstelling van die program te vorm, genaamd die intermediêre voorstelling (IR). Dit bestuur ook die simbooltabel , 'n datastruktuur wat elke simbool in die bronkode toewys aan gepaardgaande inligting soos ligging, tipe en omvang.
Alhoewel die voorkant 'n enkele monolitiese funksie of program kan wees, soos in 'n skandeerderlose ontleder , is dit tradisioneel geïmplementeer en geanaliseer as verskeie fases, wat opeenvolgend of gelyktydig kan uitgevoer word. Hierdie metode word bevoordeel as gevolg van die modulariteit en die skeiding van bekommernisse . Die voorste deel word vandag meestal in drie fases ingedeel : leksikale analise (ook bekend as lexing of scan), sintaksisanalise (ook bekend as scanning of parsing) en semantiese analise . Lexing en parsing bestaan ​​uit die sintaktiese ontleding (onderskeidelik woordsintaksis en frasesintaksis), en in eenvoudige gevalle kan hierdie modules (die lexer en parser) outomaties gegenereer word uit 'n grammatika vir die taal, alhoewel dit in meer ingewikkelde gevalle handmatig nodig is . Die leksikale grammatika en frase-grammatika is gewoonlik konteksvrye grammatikas , wat die analise aansienlik vergemaklik, met konteksgevoeligheid wat tydens die semantiese analisefase hanteer word. Die semantiese ontledingsfase is oor die algemeen meer kompleks en met die hand geskryf, maar kan gedeeltelik of volledig geoutomatiseer word met behulp van attribuutgrammatika . Hierdie fases self kan verder opgebreek word: lexing as skandering en evaluering, en ontleding as die bou van 'n konkrete sintaksboom (CST, parse boom) en dit dan omskep in 'n abstrakte sintaksboom (AST, sintaksboom). In sommige gevalle word addisionele fases gebruik, veral lynrekonstruksie en voorverwerking, maar dit is skaars.
Die hooffases van die voorkant sluit die volgende in:
Reëlrekonstruksie skakel die ingevoerde karaktervolgorde om na 'n kanonieke vorm wat gereed is vir die ontleder. Tale wathul sleutelwoordeuittrekof arbitrêre spasies binne identifiseerders toelaat, benodig hierdie fase. Dietabel-gedrewe ontleders vanbo-na onder,rekursiewe afkoms, wat in die 1960's gebruik is, het die bron een karakter tegelyk gelees en het nie 'n aparte tokeniseringsfase benodig nie. Atlas AutocodeenImp(en 'n paar implementering vanAlgolenCoral 66) is 'n voorbeeld van stropped tale waarvan die opstellers sou 'n hêLine Heropbou-fase.
Voorverwerking ondersteun makro- vervanging en voorwaardelike samestelling . Die voorverwerkingsfase vind gewoonlik plaas voor sintaktiese of semantiese ontleding; in die geval van C, manipuleer die voorverwerker leksikale tekens eerder as sintaktiese vorms. Sommige tale soos Skema ondersteun egter makro-vervangings gebaseer op sintaktiese vorms.
Leksikale ontleding (ook bekend as lexing of tokenization ) breek die bronkode-teks op in 'n reeks klein stukke wat leksikale tokens genoem word .  Hierdie fase kan in twee fases verdeel word: die skandering , wat die invoerteks in segmentiese eenhede, wat lekseme genoem word, segmenteeren 'n kategorie daaraan toewys; en die evaluering , wat lekseme omskakel in 'n verwerkte waarde. 'N Teken is 'n paar wat bestaan ​​uit 'n tekennaam en 'n opsionele tekenwaarde .  Algemene token-kategorieë kan identifiseerders, sleutelwoorde, skeiers, operatore, letterkuns en opmerkings insluit, hoewel die stel token-kategorieë in verskillende programmeertale wissel. Die lekseme-sintaksis is gewoonlik 'n gewone taal , dus kan 'n eindtoestandautomaat wat uit 'n gereelde uitdrukking saamgestelis, gebruik word om dit te herken. Die sagteware wat leksikale analise doen, word 'n leksikale ontleder genoem . Dit is miskien nie 'n aparte stap nie - dit kan gekombineer word met die ontledingstap in skandeerlose ontleding , in welke geval ontleding op karaktervlak gedoen word, nie op die vlak van tekens nie.
Sintaksisontleding (ook bekend as ontleding ) behels die ontleding van die tekenreeks om die sintaktiese struktuur van die program te identifiseer. Hierdie fase bou gewoonlik 'n ontledingsboom wat die lineêre volgorde van tekens vervang met 'n boomstruktuur wat gebou is volgens die reëls van 'n formele grammatika wat die sintaksis van die taal definieer. Die ontledingsboom word dikwels deur latere fases in die samesteller ontleed, aangevul en getransformeer. 
Semantiese analise voeg semantiese inligting by die ontledingsboom en bou die simbooltabel . Hierdie fase voer semantiese ondersoeke uit soos tipe kontrole (ondersoek na tipe foute), of objekbinding (assosiasie van veranderlike en funksie verwysings met hul definisies), of definitiewe toewysing (wat vereis dat alle plaaslike veranderlikes geïnitialiseer moet word voor gebruik), wat verkeerde programme verwerp of uitreik waarskuwings. Semantiese ontleding vereis gewoonlik 'n volledige ontledingsboom, wat beteken dat hierdie fase logies die ontledingsfase volgen logies die kode-genereringsfase voorafgaan, alhoewel dit dikwels moontlik is om meerdere fases in een pas oor die kode te vou in 'n samestellerimplementering.
Die middelkant, ook bekend as optimizer, voer optimalisasies uit op die tussentydse voorstelling om die prestasie en die kwaliteit van die vervaardigde masjienkode te verbeter.  Die middelste deel bevat optimerings wat onafhanklik is van die CPU-argitektuur wat geteiken word.
Die belangrikste fases van die middelste punt sluit die volgende in:
Analise : Dit is die insameling van programinligting uit die intermediêre voorstelling afgelei van die insette; data-vloei-analise word gebruik om gebruiksdefinieerkettings te bou , tesame met afhanklikheidsanalise , aliasanalise , wyseranalise , ontsnappingsanalise , ens. Akkurate analise is die basis vir enige samestellingsoptimalisering. Die kontrolevloeidiagram van elke saamgestelde funksie en die oproepgrafiek van die program word gewoonlik ook tydens die ontledingsfase opgebou.
Optimalisering : die intermediêre taalvoorstelling word omskep in funksioneel ekwivalente maar vinniger (of kleiner) vorms. Gewilde optimalisasies is inlyn-uitbreiding , doodskode-eliminasie , konstante voortplanting , lus-transformasie en selfs outomatiese parallelisering .
Samestelleranalise is die voorvereiste vir enige samestelleroptimalisering, en hulle werk nou saam. Byvoorbeeld, afhanklikheid analise is noodsaaklik vir lus transformasie .
Die omvang van die samesteller-analise en optimalisering wissel baie; hul omvang kan wissel van werk binne 'n basiese blok , tot hele prosedures, of selfs die hele program. Daar is 'n kompromie tussen die fynere optimalisering en die koste van die samestelling. Byvoorbeeld, die optimering van loergate kan vinnig uitgevoer word tydens samestelling, maar beïnvloed slegs 'n klein plaaslike fragment van die kode en kan onafhanklik van die konteks waarin die kodefragment verskyn, uitgevoer word. Daarenteen verg interprosedurele optimalisering meer tyd en geheuespasie, maar maak optimerings moontlik wat slegs moontlik is deur die gedrag van verskeie funksies gelyktydig in ag te neem.
Interprosedurele analise en optimalisering is algemeen in moderne kommersiële samestellers van HP , IBM , SGI , Intel , Microsoft en Sun Microsystems . Die gratis sagteware GCC is lank gekritiseer vir die gebrek aan kragtige interprosedurele optimalisasies, maar dit verander in hierdie opsig. 'N Ander oopbron-samesteller met volledige analise- en optimaliseringsinfrastruktuur is Open64 , wat deur baie organisasies vir navorsings- en kommersiële doeleindes gebruik word.
Vanweë die ekstra tyd en ruimte wat nodig is vir samestelleranalise en -optimalisasies, slaan sommige samestellers dit standaard oor. Gebruikers moet kompilasie-opsies gebruik om die samesteller eksplisiet te vertel watter optimalisasies geaktiveer moet word.
Die agterkant is verantwoordelik vir die optimalisering van die CPU-argitektuur en vir kodegenerering  .
Die belangrikste fases van die agterkant sluit die volgende in:
Masjienafhanklike optimalisasies : optimalisasies wat afhang van die besonderhede van die SVE-argitektuur wat die samesteller teiken.  ' n Prominente voorbeeld is die optimalisering van die loergat , wat kort reekse van die samestellingsinstruksies herskryf tot doeltreffender instruksies.
Kodegenerering : die getransformeerde tussentaal word vertaal in die uitvoertaal, gewoonlik die oorspronklike masjientaal van die stelsel. Dit behels besluite oor hulpbronne en stoor, soos om te besluit watter veranderlikes in registers en geheue moet pas, en die keuse en skedulering van toepaslike masjieninstruksies, tesame met die gepaardgaande aanspreekmetodes (sien ook Sethi-Ullman-algoritme ). Foutopsporingsdata moet dalk ook gegenereer word om foutopsporing te vergemaklik.
Die korrektheid van die samesteller is die tak van sagteware-ingenieurswese wat handel oor die bewys dat 'n samesteller volgens sy taalspesifikasie optree . [ aanhaling benodig ] Tegnieke sluit in die ontwikkeling van die samesteller met behulp van formele metodes en die gebruik van streng toetsing (dikwels samestellingsvalidering genoem) op 'n bestaande samesteller.
Saamgestelde en geïnterpreteerde tale
Programmeringstale op hoër vlak verskyn gewoonlik met die oog op 'n vertaling : óf ontwerp as saamgestelde taal óf as geïnterpreteerde taal . In die praktyk is daar egter selde iets oor 'n taal wat vereis dat dit eksklusief saamgestel of uitsluitlik geïnterpreteer moet word, hoewel dit moontlik is om tale te ontwerp wat op die tydstip staatmaak op herinterpretasie. Die kategorisering weerspieël gewoonlik die gewildste of wydverspreide implementasies van 'n taal - byvoorbeeld, BASIC word soms 'n geïnterpreteerde taal genoem, en C 'n saamgestelde taal, ondanks die bestaan ​​van BASIC-samestellers en C-tolke.
Interpretasie vervang nie volledig nie. Dit verberg dit net vir die gebruiker en maak dit geleidelik. Alhoewel 'n tolk self geïnterpreteer kan word, is 'n program wat direk uitgevoer word, êrens onderaan die stapel nodig (sien masjientaal ).
Voorts kan samestellers tolke bevat om optimaliseringsredes. As 'n uitdrukking byvoorbeeld tydens die samestelling uitgevoer kan word en die resultate in die uitvoerprogram ingevoeg kan word, kan dit voorkom dat dit elke keer weer herbereken moet word, wat die finale program aansienlik kan bespoedig. Moderne tendense in die rigting van net-tyd-samestelling en interpretasie van bykode vervaag soms die tradisionele kategorisering van samestellers en tolke.
Sommige taalspesifikasies bepaal dat implementerings 'n samestellingsfasiliteit moet insluit; byvoorbeeld Common Lisp . Daar is egter niks inherent aan die definisie van Common Lisp wat keer dat dit geïnterpreteer word nie. Ander tale het funksies wat baie maklik in 'n tolk geïmplementeer kan word, maar die skryf van 'n samesteller maak dit baie moeiliker; Byvoorbeeld, APL , SNOBOL4 en baie skripttale laat programme toe om willekeurige bronkode tydens looptyd te konstrueer met gereelde snaarbewerkings, en voer die kode dan uit deur dit na 'n spesiale evalueringsfunksie oor te dra . Om hierdie funksies in 'n saamgestelde taal te implementeer, moet programme gewoonlik gestuur word met 'n runtime-biblioteek wat 'n weergawe van die samesteller self bevat.
Een klassifikasie van samestellers is volgens die platform waarop hul gegenereerde kode uitgevoer word. Dit staan ​​bekend as die teikenplatform.
'N Inheemse of gehoste samesteller is een waarvan die uitvoer bedoel is om direk op dieselfde tipe rekenaar en bedryfstelsel te werk waarop die samesteller werk. Die uitvoer van 'n dwarssamesteller is ontwerp om op 'n ander platform te werk. Kruis samestellers word dikwels gebruik wanneer sagteware ontwikkel word vir ingeboude stelsels wat nie bedoel is om 'n sagteware-ontwikkelingsomgewing te ondersteun nie.
Die uitvoer van 'n samesteller wat kode vir 'n virtuele masjien (VM) produseer , kan al dan nie op dieselfde platform uitgevoer word as die samesteller wat dit vervaardig het. Om hierdie rede word sulke samestellers gewoonlik nie as moedertaal- of kruis-samestellers geklassifiseer nie.
Die laer vlak taal wat die teiken van 'n samesteller is, kan self 'n hoë vlak programmeertaal wees . C, deur sommige beskou as 'n soort draagbare monteertaal, is dikwels die doeltaal van sulke samestellers. Byvoorbeeld, Cfront , die oorspronklike opsteller vir C ++ , gebruik C as sy doeltaal. Die C-kode wat deur so 'n samesteller gegenereer word, is gewoonlik nie bedoel om deur mense leesbaar en onderhou te word nie, daarom word die styl van die inspringing en die skep van mooi C-tussenkode geïgnoreer. Sommige van die kenmerke van C wat dit 'n goeie doeltaal maak, is onder meer die #linerichtlijn, wat deur die samesteller gegenereer kan word om foutopsporing van die oorspronklike bron te ondersteun , en die wye platformondersteuning beskikbaar met C-samestellers.
Terwyl 'n algemene samesteller-tipe masjienkode uitvoer, is daar baie ander tipes:
Bron-tot-bron-samestellers is 'n soort samesteller wat 'n hoëvlaktaal as invoer gebruik en 'n hoëvlaktaal uitvoer. Byvoorbeeld, 'n outomatiese paralleliserende samesteller neem gereeld 'n taalprogram op hoë vlak in as invoer en transformeer die kode en annoteer dit met parallelle kode-aantekeninge (bv. OpenMP ) of taalkonstruksies (bv. Fortran se DOALLverklarings).
Bytecode- samestellers wat 'n teoretiese masjien se samestellingstaal saamstel, soos sommige Prolog- implementerings
Hierdie Prolog-masjien staan ​​ook bekend as die Warren Abstract Machine (of WAM).
Bytecode-samestellers vir Java , Python is ook voorbeelde van hierdie kategorie.
Vir sommige tale, soos Java, word toepassings eers saamgestel met behulp van 'n bytecode-samesteller en afgelewer in 'n masjien-onafhanklike tussenvoorstelling . 'N Bytecode-tolk voer die bytecode uit, maar die JIT-samesteller sal die bytecode vertaal na masjienkode wanneer verhoogde prestasie nodig is.  [ nie-primêre bron benodig ]
Hardeware-samestellers (ook bekend as sintesegereedskap) is samestellers waarvan die uitvoer 'n beskrywing is van die hardeware-opset in plaas van 'n reeks instruksies.
Die uitvoer van hierdie samestellers is gerig op rekenaarhardeware op 'n baie lae vlak, byvoorbeeld 'n veldprogrammeerbare hekskikking (FPGA) of gestruktureerde toepassingsspesifieke geïntegreerde stroombaan (ASIC).  [ Nie-primêre bron benodig ] Daar word gesê dat sulke samestellers hardeware-samestellers is, omdat die bronkode wat hulle saamstel, effektief die finale konfigurasie van die hardeware beheer en hoe dit werk. Die uitvoer van die samestelling is slegs 'n interkonneksie van transistors of opsoektabelle .
'N Voorbeeld van hardeware-samesteller is XST, die Xilinx Synthesis Tool wat gebruik word vir die konfigurasie van FPGA's.  [ nie-primêre bron benodig ] Soortgelyke gereedskap is beskikbaar by Altera,  [ nie-primêre bron benodig ] Synplicity, Synopsys en ander hardewareverkopers. [ aanhaling nodig ]
'N Samesteller is 'n program wat menslike leesbare monteertaal saamstel met masjienkode , die werklike instruksies wat deur hardeware uitgevoer word. Die omgekeerde program wat masjienkode vertaal na samestellingstaal, word 'n demontageerder genoem .
'N Program wat vertaal word van 'n lae-vlak taal na 'n hoër vlak een is 'n dekompiler . [ aanhaling nodig ]
'N Program wat tussen hoëvlak-tale vertaal, word gewoonlik 'n taalvertaler, bron-tot-bron-samesteller , taalomskakelaar of taalherskrywer genoem . [ aanhaling nodig ] Die laaste term word gewoonlik toegepas op vertalings wat geen taalverandering behels nie. 
'N Program wat vertaal word in 'n objekkodeformaat wat nie op die kompilasiemasjien ondersteun word nie, word 'n dwarssamesteller genoem en word gewoonlik gebruik om kode voor te berei vir ingebedde toepassings. [ aanhaling nodig ] [ opheldering nodig ]
'N Program wat die voorwerpkode weer herskryf in dieselfde tipe voorwerpkode tydens optimalisering en transformasie, is 'n binêre hersteller .
Parsing van onder af
Stel en gaan laai op
Lys van samestellers
Lys van belangrike publikasies in rekenaarwetenskap § Samestellers
^ PC Mag Staff (28 Februarie 2019). "Ensiklopedie: definisie van samesteller" . PCMag.com . Besoek op 28 Februarie 2017 .
^ a b Compilers: Principles, Techniques, and Tools deur Alfred V. Aho, Ravi Sethi, Jeffrey D. Ullman - Tweede uitgawe, 2007
^ Son, Chengnian; Le, Vu; Zhang, Qirun; Su, Zhendong (2016). "Om begripsfoute in GCC en LLVM te verstaan" . ACM .
^ lesingsnotas Samestellers: beginsels, tegnieke en gereedskap Jing-Shin Chang Departement Rekenaarwetenskap en Inligtingingenieurswese Nasionale Chi-Nan Universiteit
^ Naur, P. et al. "Verslag oor ALGOL 60". Mededeling van die ACM 3 (Mei 1960), 299–314.
^ Chomsky, Noam; Lightfoot, David W. (2002). Sintaktiese strukture . Walter de Gruyter. ISBN 978-3-11-017279-9.
^ Gries, David (2012). "Aanhangsel 1: Backus-Naur-vorm" . Die wetenskap van programmering . Springer Science & Business Media. bl. 304. ISBN 978-1461259831.
^ Iverson, Kenneth E. (1962). 'N Programmeringstaal . John Wiley & Sons. ISBN 978-0-471430-14-8.
^ Backus, John. "Die geskiedenis van FORTRAN I, II en III" (PDF) . Geskiedenis van programmeertale . Softwarepreservation.org .
^ Porter Adams, Vicki (5 Oktober 1981). "Kaptein Grace M. Hopper: die moeder van COBOL". InfoWêreld. 3 (20): 33. ISSN 0199-6649.
^ McCarthy, J .; Brayton, R .; Edwards, D .; Fox, P.; Hodes, L .; Luckham, D .; Maling, K .; Park, D .; Russell, S. (Maart 1960). "LISP I-programmeerdershandleiding" (PDF). Boston, Massachusetts: kunsmatige intelligensiegroep, MIT-berekeningsentrum en navorsingslaboratorium.
^ Compilers Principles, Techniques, & Tools 2de uitgawe deur Aho, Lam, Sethi, Ullman ISBN 0-321-48681-1
^ Hopper, Grace Murray (1952). "Die opvoeding van 'n rekenaar". Verrigtinge van die ACM Nasionale Vergadering van 1952 (Pittsburgh) : 243–249. doi : 10.1145 / 609784.609818 . S2CID 10081016 .
^ Ridgway, Richard K. (1952). "Opstel van roetines". Verrigtinge van die ACM Nasionale Vergadering van 1952 (Toronto) : 1–5. doi : 10.1145 / 800259.808980 . S2CID 14878552 .
^ " Rekursiewe funksies van simboliese uitdrukkings en die berekening daarvan per masjien ", mededeling van die ACM, April 1960
^ McCarthy, John; Abrahams, Paul W.; Edwards, Daniel J .; Hart, Timothy P.; Levin, Michael I. (1965). Lisp 1.5-programmeerhandleiding . Die MIT Press. ISBN 9780262130110.
^ " BCPL: 'n instrument vir die opstel van samestellers en stelselprogrammering " M. Richards, University Mathematical Laboratory Cambridge, Engeland 1969
^ BCPL: The Language and Its Compiler, M Richards, Cambridge University Press (vir die eerste keer gepubliseer op 31 Desember 1981)
^ Die BCPL Cintsys en Cintpos gebruikershandleiding, M. Richards, 2017
^ Corbató, FJ; Vyssotsky, VA "Inleiding en oorsig van die MULTICS-stelsel" . 1965-gesamentlike herfs vir rekenaars . Multicians.org.
^ Verslag II van die SHARE Advanced Language Development Committee, 25 Junie 1964
^ Multicians.org "The Choice of PL / I" -artikel, redakteur / tom Van Vleck
^ "PL / I As a tool for System Programming", FJ Corbato, Datamation 6 Mei 1969-uitgawe
^ " The Multics PL / 1-samesteller ", RA Freiburghouse, GE, Fall Joint Computer Conference 1969
^ Datamasie- kolom, 1969
^ Dennis M. Ritchie, " The Development of the C Language ", ACM Tweede geskiedenis van programmeertaalkonferensie, April 1993
^ SC Johnson, 'a Portable C Compiler: Theory and Practice', 5de ACM POPL-simposium, Januarie 1978
^ A. Snyder, ' n draagbare samesteller vir die taal C , MIT, 1974.
^ K. Nygarard, Universiteit van Oslo, Noorweë, " Basic Concepts in Object Oriented Programming ", SIGPLAN Notices V21, 1986
^ B. Stroustrup: "Wat is objektoriënte programmering?" Verrigtinge 14de ASU-konferensie, 1986.
^ Bjarne Stroustrup, "'n Oorsig van die C ++ programmeertaal", Handboek van objektegnologie (Redakteur: Saba Zamir, ISBN 0-8493-3135-8 )
^ Leverett, Cattell, Hobbs, nuweling, Reiner, Schatz, Wulf: "'n oorsig van die produksiekwaliteit-samesteller-samestellerprojek", CMU-CS-89-105, 1979
^ W. Wulf, K. Nori, " Vertraagde binding in samestellers wat deur PQCC gegenereer word ", CMU Research Showcase Report, CMU-CS-82-138, 1982
^ Joseph M. Nuweling, David Alex Lamb, Bruce W. Leverett, Michael Tighe, William A. Wulf - Carnegie-Mellon Universiteit en David Levine, Andrew H. Reinerit - Intermetrics: "TCOL Ada: Hersiene verslag oor 'n tussentydse verteenwoordiging vir die DOD Standaard Programmeringstaal ", 1979
^ William A. Whitaker, "Ada - die projek: die DoD High Order-werkgroep", ACM SIGPLAN-kennisgewings (Volume 28, No. 3, Maart 1991)
^ CECOM Sentrum vir sagteware-ingenieurswese Gevorderde sagtewaretegnologie, "Finale verslag - Evaluering van die ACEC-maatstafpakket vir intydse toepassings", AD-A231 968, 1990
^ P.Biggar, E. de Vries, D. Gregg, "A Practical Solution for Scripting Language Compilers", voorlegging aan Science of Computer Programming, 2009
^ M.Hall, D. Padua, K. Pingali, "Compiler Research: The Next 50 Years", ACM Communications 2009 Vol 54 # 2
^ Cooper en Torczon 2012, p. 8
^ Lattner, Chris (2017). "LLVM" . In Brown, Amy; Wilson, Greg (reds.). Die argitektuur van oopbrontoepassings . Op 2 Desember 2016 vanaf die oorspronklike argief . Besoek op 28 Februarie 2017 .
^ a b Blindell, Gabriel Hjort (3 Junie 2016). Instruksieseleksie: beginsels, metodes en toepassings . Switserland. ISBN 9783319340197. OCLC 951745657 .
^ Cooper en Toczon (2012), p. 540
^ Aycock, John (2003). "'N Kort geskiedenis van net betyds". ACM-rekenaar. Surv . 35 (2 Junie): 93–113. doi : 10.1145 / 857076.857077 . S2CID 15345671 . [ nie-primêre bron benodig ]
^ Swartz, Jordan S .; Betz, Vaugh; Rose, Jonathan (22–25 Februarie 1998). "'N Vinnige roeteerder-gedrewe router vir FPGA's" (PDF) . FPGA '98 Verrigtinge van die 1998 ACM / SIGDA sesde internasionale simposium oor veldprogrammeerbare hekskikkings . Monterey, CA: ACM : 140–149. doi : 10.1145 / 275107.275134 . ISBN 978-0897919784. S2CID 7128364 . Gearchiveer (PDF) vanaf die oorspronklike op 9 Augustus 2017.
^ Xilinx Staff (2009). "Oorsig van XST-sintese" . Xilinx, Inc. Gearchiveer vanaf die oorspronklike op 2 November 2016 . Besoek op 28 Februarie 2017 . [ nie-primêre bron benodig ]
^ Altera Staff (2017). "Spectra-Q ™ enjin" . Altera.com. Gearchiveer vanaf die oorspronklike op 10 Oktober 2016 . Besoek op 28 Februarie 2017 . [ nie-primêre bron benodig ]
^ "Handleiding vir taalvertalers" (PDF) . Washington Universiteit .
Aho, Alfred V .; Sethi, Ravi ; Ullman, Jeffrey D. (1986). Samestellers: beginsels, tegnieke en gereedskap (1ste uitg.). Addison-Wesley . ISBN 9780201100884.
Allen, Frances E. (September 1981). "'N Geskiedenis van taalverwerkertegnologie in IBM". IBM Tydskrif vir Navorsing en Ontwikkeling . IBM . 25 (5): 535–548. doi : 10.1147 / rd.255.0535 .
Allen, Randy; Kennedy, Ken (2001). Optimalisering van samestellers vir moderne argitekture . Morgan Kaufmann-uitgewers . ISBN 978-1-55860-286-1.
Appel, Andrew Wilson (2002). Moderne implementering van samesteller in Java (2de uitg.). Cambridge University Press . ISBN 978-0-521-82060-8.
Appel, Andrew Wilson (1998). Moderne samesteller-implementering in ML . Cambridge University Press . ISBN 978-0-521-58274-2.
Bornat, Richard (1979). Samestellers verstaan ​​en skryf: 'n gids self doen (PDF) . Macmillan Publishing . ISBN 978-0-333-21732-0.
Calingaert, Peter (1979). Horowitz, Ellis (red.). Versamelaars, samestellers en programvertaling . Rekenaarprogrammatuur-ingenieursreeks (1ste druk, 1ste uitg.). Potomac, Maryland: Computer Science Press, Inc. ISBN 0-914894-23-4. ISSN 0888-2088 . LCCN 78-21905 . Besoek op 20 Maart 2020 . (2 + xiv + 270 + 6 bladsye)
Cooper, Keith Daniel; Torczon, Linda (2012). Ingenieur 'n samesteller (2de uitg.). Amsterdam: Elsevier / Morgan Kaufmann. bl. 8. ISBN 9780120884780. OCLC 714113472 .
McKeeman, William Marshall ; Horning, James J .; Wortman, David B. (1970). 'N Samestellergenerator . Englewood Cliffs, NJ : Prentice-Hall . ISBN 978-0-13-155077-3.
Muchnick, Steven (1997). Gevorderde samesteller-ontwerp en -implementering . Morgan Kaufmann-uitgewers . ISBN 978-1-55860-320-2.
Scott, Michael Lee (2005). Programmeringstaalpragmatiek (2de uitg.). Morgan Kaufmann . ISBN 978-0-12-633951-2.
Srikant, YN; Shankar, Priti (2003). Die handboek vir samestellingsontwerp: optimalisering en generering van masjienkodes . CRC Pers . ISBN 978-0-8493-1240-3.
Terry, Patrick D. (1997). Samestellers en samestellergenerators: 'n inleiding met C ++ . Internasionale Thomson Computer Press. ISBN 978-1-85032-298-6.
Wirth, Niklaus (1996). Samestellerkonstruksie (PDF) . Addison-Wesley . ISBN 978-0-201-40353-4. Argief van die oorspronklike (PDF) op 17 Februarie 2017 . Besoek op 24 April 2012 .
LLVM gemeenskap. "Die LLVM teikenonafhanklike kodegenerator" . LLVM-dokumentasie . Besoek op 17 Junie 2016 .
Samestellerhandboekverwysings ' n Versameling verwysings na die hoofstroom-samestellingskonstruksiehandboeke
Samestellers by Curlie
Inkrementele benadering tot samestellingskonstruksie - 'n PDF-handleiding
Basiese beginsels van samestellerontwerp by die Wayback Machine (geargiveer 15 Mei 2018)
Kort animasie op YouTube wat die belangrikste konseptuele verskil tussen samestellers en tolke verduidelik
Sintaksisontleding en LL1-ontleding op YouTube
Kom ons bou 'n samesteller , deur Jack Crenshaw
Forum oor samestellerontwikkeling by die Wayback Machine (geargiveer 10 Oktober 2014)
This page is based on the copyrighted Wikipedia article "/wiki/Compiler" (Authors); it is used under the Creative Commons Attribution-ShareAlike 3.0 Unported License. You may redistribute it, verbatim or modified, providing that you comply with the terms of the CC-BY-SA. Cookie-policy To contact us: mail to [email protected]