Mikä on kääntäjä? Ohjelmointikielet. Kääntäjät ja tulkit. Algoritmi yksinkertaiselle tulkille

Ohjelmointikielten erityisiä toteuttajia ovat kääntäjät ja tulkit.

Kääntäjä on ohjelma, jonka perusteella tietokone muuntaa siihen syötetyt ohjelmat konekieleksi, koska se voi suorittaa vain prosessorin kielellä kirjoitettuja ohjelmia ja toisella kielellä määritellyt algoritmit on käännettävä konekielelle ennen niiden suorittamista.

Kääntäjä- ohjelma tai tekninen väline, joka lähettää ohjelmaa.

Ohjelman lähetys- jollain ohjelmointikielellä esitellyn ohjelman muuntaminen toisella kielellä olevaksi ohjelmaksi, joka vastaa suoritustulosten osalta ensimmäistä. Kääntäjä yleensä myös diagnosoi virheet, luo tunnistesanakirjoja, tuottaa ohjelmatekstejä tulostettaviksi jne.

Kieltä, jolla syöttöohjelma esitetään, kutsutaan alkuperäinen kieli ja itse ohjelma - lähdekoodi. Tulostuskieltä kutsutaan kohdekieleksi tai tavoite koodi. Käännöksen tarkoitus on muuntaa tekstiä kielestä toiselle, mikä on tekstin vastaanottajan ymmärrettävää. Käännösohjelmien tapauksessa vastaanottaja on tekninen laite(prosessori) tai tulkkiohjelma.

Kääntäjät toteutetaan kääntäjinä tai tulkkeina. Työn tekemisen kannalta kääntäjä ja tulkki eroavat merkittävästi toisistaan.

Prosessorien kieli (konekoodi) on matalatasoinen. Kutsutaan kääntäjä, joka muuntaa ohjelmat konekielelle, jonka prosessori vastaanottaa ja suorittaa suoraan kääntäjä.

Kääntäjä(Englanti) kääntäjä- kääntäjä, kerääjä) lukee koko ohjelman, kääntää sen ja luo ohjelmasta täydellisen version konekielellä, joka sitten suoritetaan. Kääntäjän tulos on binaarinen suoritettava tiedosto.

Kääntäjän etu: ohjelma käännetään kerran, eikä se vaadi lisämuunnoksia joka kerta kun se suoritetaan. Vastaavasti kääntäjää ei tarvita kohdekoneessa, jolle ohjelma on käännetty. Haitta: Erillinen käännösvaihe hidastaa kirjoittamista ja virheenkorjausta ja vaikeuttaa pienten, yksinkertaisten tai yksittäisten ohjelmien suorittamista.

Jos lähdekieli on assembly-kieli (matalan tason kieli lähellä konekieltä), niin tällaisen kielen kääntäjä on ns. kokoaja.

Toinen toteutustapa on, kun ohjelma suoritetaan käyttäen tulkki ei lähetystä ollenkaan.

Tulkki(Englanti) tulkki- tulkki, tulkki) kääntää ja suorittaa ohjelman rivi riviltä.

Tulkkiohjelmisto mallintaa konetta, jonka hae-suorita -sykli toimii korkean tason kielten ohjeilla konekäskyjen sijaan. Tämä ohjelmistosimulaatio luo virtuaalikoneen, joka toteuttaa kielen. Tätä lähestymistapaa kutsutaan puhdas tulkinta. Puhdasta tulkintaa käytetään yleensä kielille, joilla on yksinkertainen rakenne (esimerkiksi APL tai Lisp). Tulkit komentorivi käsitellä komentoja komentosarjoissa UNIXissa tai erätiedostoina (.bat) MS-DOS:ssa, myös yleensä puhtaassa tulkintatilassa.

Puhtaan tulkin etu: käännösten välitoimien puuttuminen yksinkertaistaa tulkin toteuttamista ja helpottaa sen käyttöä, myös dialogitilassa. Haittana on, että tulkin on oltava läsnä kohdekoneessa, jossa ohjelma suoritetaan. Lisäksi nopeudessa on yleensä enemmän tai vähemmän merkittävää menetystä. Ja puhtaan tulkin ominaisuus, että virheet tulkitussa ohjelmassa havaitaan vain silloin, kun yritetään suorittaa komento (tai rivi) virheellisesti, voidaan pitää sekä haittana että etuna.

Ohjelmointikielten toteutuksessa on kompromisseja kääntämisen ja puhtaan tulkinnan välillä, kun tulkki ennen ohjelman suorittamista kääntää sen välikielelle (esimerkiksi tavukoodiksi tai p-koodiksi), joka on tulkinnan kannalta kätevämpi (eli puhumme tulkista, jossa on sisäänrakennettu kääntäjä). Tätä menetelmää kutsutaan sekoitettu toteutus. Esimerkki sekakielisestä toteutuksesta on Perl. Tässä lähestymistavassa yhdistyvät sekä kääntäjän ja tulkin edut (suurempi suoritusnopeus ja helppokäyttöisyys) että haitat (lisäresursseja tarvitaan ohjelman kääntämiseen ja tallentamiseen välikielellä; tulkki on järjestettävä ohjelman suorittamiseksi kohteessa kone). Samoin, kuten kääntäjässä, sekoitettu toteutus vaatii sen ennen suorittamista lähde ei sisältänyt virheitä (leksikaalisia, syntaktisia ja semanttisia).

Tietokoneresurssien lisääntymisen ja erityyppisiä ja -arkkitehtuuriisia tietokoneita yhdistävien heterogeenisten verkkojen (mukaan lukien Internet) laajenemisen myötä on syntynyt uudenlainen tulkinta, jossa lähdekoodi (tai välikoodi) käännetään konekoodiksi suoraan ajon aikana. , "lennossa." Jo käännetyt koodiosat tallennetaan välimuistiin, joten kun niitä käytetään uudelleen, ne saavat välittömästi hallinnan ilman uudelleenkääntämistä. Tätä lähestymistapaa kutsutaan dynaaminen kokoelma.

Dynaamisen kääntämisen etuna on, että ohjelman tulkintanopeus on verrattavissa ohjelman suoritusnopeuteen perinteisillä käännetyillä kielillä, kun taas itse ohjelma tallennetaan ja jaetaan yhdessä muodossa kohdealustoista riippumatta. Haittana on suurempi toteutuksen monimutkaisuus ja suuremmat resurssivaatimukset kuin yksinkertaisten kääntäjien tai pelkkien tulkkien tapauksessa.

Tämä menetelmä toimii hyvin verkkosovelluksissa. Niinpä dynaaminen kääntäminen on ilmestynyt ja sitä tuetaan tavalla tai toisella Java-toteutuksissa. NET Framework, Perl, Python.

Kun ohjelma on käännetty, ohjelman suorittamiseen ei tarvita ohjelman lähdekoodia eikä kääntäjää. Samalla tulkin käsittelemä ohjelma on käännettävä uudelleen konekielelle joka kerta, kun ohjelma käynnistetään. Eli lähdetiedosto on suoraan suoritettava.

Käännetyt ohjelmat toimivat nopeammin, mutta tulkittuja on helpompi korjata ja muuttaa.

Jokainen tietty kieli on suunnattu joko kokoamiseen tai tulkintaan - riippuen tarkoituksesta, jota varten se on luotu. Esimerkiksi C++:aa käytetään yleensä melko monimutkaisten ongelmien ratkaisemiseen, joissa ohjelman nopeus on tärkeä, joten tämä kieli toteutetaan kääntäjällä.

Ohjelmien nopeamman toiminnan saavuttamiseksi tulkistetuilla ohjelmointikielillä voidaan käyttää käännöstä välitavukoodiin. Kielet, jotka sallivat tämän tempun, ovat Java, Python ja jotkut muut ohjelmointikielet.

Algoritmi yksinkertaiselle tulkille:

2. analysoida ohjeet ja määrittää asianmukaiset toimenpiteet;

3. ryhtyä asianmukaisiin toimiin;

4. Jos ohjelman lopetusehtoa ei saavuteta, lue seuraavat ohjeet ja siirry vaiheeseen 2

Ohjelmointikielet voidaan jakaa käännettyihin ja tulkittuihin.

Käännetyllä kielellä oleva ohjelma muunnetaan (käännetään) erityistä kääntäjäohjelmaa käyttäen ohjejoukoksi tämän tyyppistä prosessori (konekoodi) ja kirjoitetaan sitten suoritettavaan moduuliin, joka voidaan käynnistää suoritettavaksi erillisenä ohjelmana. Toisin sanoen kääntäjä kääntää ohjelman lähdekoodin korkean tason ohjelmointikielestä prosessorin käskyjen binäärikoodeiksi.

Jos ohjelma on kirjoitettu tulkitulla kielellä, tulkki suorittaa (tulkitaan) suoraan lähdetekstin ilman edeltävää käännöstä. Tässä tapauksessa ohjelma pysyy alkuperäisellä kielellä, eikä sitä voida käynnistää ilman tulkkia. Voimme sanoa, että tietokoneen prosessori on konekoodin tulkki.

Lyhyesti sanottuna kääntäjä kääntää ohjelman lähdekoodin konekielelle välittömästi ja kokonaisuudessaan luoden erillisen suoritettavan ohjelman ja tulkki suorittaa lähdetekstin ohjelman ollessa käynnissä.

Jako koottuihin ja tulkkaisiin kieliin on hieman mielivaltaista. Joten mille tahansa perinteisesti käännetylle kielelle, kuten Pascalille, voit kirjoittaa tulkin. Lisäksi useimmat nykyaikaiset "puhtaat" tulkit eivät suorita kielirakenteita suoraan, vaan pikemminkin kokoavat ne johonkin korkean tason väliesitykseen (esimerkiksi muuttujan viittausten poistamisella ja makrolaajennuksella).

Kääntäjä voidaan luoda mille tahansa tulkittavalle kielelle - esimerkiksi Lisp-kieli, joka on natiivitulkkaus, voidaan kääntää ilman rajoituksia. Ohjelman suorituksen aikana luotu koodi voidaan myös kääntää dynaamisesti suorituksen aikana.

Yleensä käännetyt ohjelmat toimivat nopeammin eivätkä vaadi lisäohjelmia, koska ne on jo käännetty konekielelle. Samanaikaisesti joka kerta kun ohjelman tekstiä muutetaan, se on käännettävä uudelleen, mikä aiheuttaa vaikeuksia kehityksen aikana. Lisäksi käännetty ohjelma voidaan suorittaa vain samantyyppisellä tietokoneella ja yleensä samalla käyttöjärjestelmällä, jota varten kääntäjä on suunniteltu. Jos haluat luoda suoritettavan tiedoston erityyppiselle koneelle, tarvitaan uusi kokoelma.

Tulkituissa kielissä on joitain erityisiä lisäominaisuuksia (katso yllä), lisäksi niissä olevat ohjelmat voidaan ajaa heti muokkauksen jälkeen, mikä helpottaa kehitystä. Tulkitulla kielellä olevaa ohjelmaa voidaan usein ajaa erityyppisissä koneissa ja käyttöjärjestelmissä ilman lisäponnistuksia.

Tulkitut ohjelmat toimivat kuitenkin huomattavasti hitaammin kuin käännetyt, eikä niitä voida suorittaa ilman lisätulkkiohjelmaa.

Jotkut kielet, kuten Java ja C#, ovat käännetyn ja tulkitun välissä. Ohjelmaa ei nimittäin ole käännetty konekieleksi, vaan matalan tason koneriippumattomaksi koodiksi, tavukoodiksi. Tavukoodi suoritetaan sitten virtuaalikone. Tulkintaa käytetään yleensä tavukoodin suorittamiseen, vaikka sen yksittäiset osat voidaan kääntää konekoodiksi suoraan ohjelman suorituksen aikana JIT-käännön (JIT) avulla ohjelman nopeuttamiseksi. Javassa tavukoodi suoritetaan virtuaalisesti Java kone(Java Virtual Machine, JVM), C#:lle - Common Language Runtime.

Tämä lähestymistapa antaa tietyssä mielessä mahdollisuuden käyttää sekä tulkkien että kääntäjien etuja. On myös syytä mainita alkuperäinen Forth-kieli, jossa on sekä tulkki että kääntäjä.

Koska ohjelmointikielellä kirjoitettu teksti on tietokoneelle käsittämätöntä, se on käännettävä konekoodiksi. Tätä ohjelman käännöstä ohjelmointikielestä konekoodikieleksi kutsutaan käännökseksi, ja sen suorittavat erikoisohjelmat - kääntäjät.

Kääntäjä - palveluohjelma, joka muuntaa syöteohjelmointikielellä tarjotun lähdeohjelman kieleksi työohjelma, esitetty objektikielellä.

Tällä hetkellä kääntäjät jaetaan kolmeen pääryhmään: kokoajat, kääntäjät ja tulkit.

Assembler on järjestelmän apuohjelma, joka muuntaa symboliset rakenteet konekielisiksi komentoiksi. Assemblereiden erityispiirre on, että ne kääntävät sanatarkasti yhden symbolisen käskyn yhdeksi konekäskyksi. Siten kokoonpanokieli (kutsutaan myös autokoodiksi) on suunniteltu helpottamaan tietokoneen komentojärjestelmän havaitsemista ja nopeuttamaan ohjelmointia tässä komentojärjestelmässä. Ohjelmoijan on paljon helpompi muistaa konekäskyjen muistomerkki kuin niiden binäärikoodi.

Samaan aikaan kokoonpanokieli sisältää konekäskyjen analogien lisäksi monia lisädirektiivejä, jotka helpottavat erityisesti tietokoneresurssien hallintaa, toistuvien fragmenttien kirjoittamista ja monimoduuliohjelmien rakentamista. Siksi kielen ilmaisukyky on paljon rikkaampi kuin pelkkä symbolinen koodauskieli, mikä parantaa huomattavasti ohjelmoinnin tehokkuutta.

Kääntäjä on palveluohjelma, joka kääntää lähdeohjelmointikielellä kirjoitetun ohjelman konekieleksi. Aivan kuten kokoaja, kääntäjä muuntaa ohjelman kielestä toiselle (useimmiten tietyn tietokoneen kielelle). Samaan aikaan lähdekielen komennot eroavat merkittävästi organisaatioltaan ja teholtaan konekielisistä komennoista. On kieliä, joissa yksi lähdekielen komento käännetään 7-10 konekäskyksi. On kuitenkin myös kieliä, joissa jokaisessa komennossa voi olla 100 tai enemmän konekäskyä (esimerkiksi Prolog). Lisäksi lähdekielet käyttävät melko usein tiukkaa tietojen kirjoittelua, joka suoritetaan niiden alustavan kuvauksen kautta. Ohjelmointi ei välttämättä perustu algoritmin koodaamiseen, vaan tietorakenteiden tai luokkien tarkkaan miettimiseen. Tällaisista kielistä kääntämistä kutsutaan yleensä kääntämiseksi, ja lähdekielet luokitellaan yleensä korkean tason ohjelmointikieliksi (tai korkean tason kieliksi). Ohjelmointikielen poistaminen tietokoneen komentojärjestelmästä johti itsenäiseen luomiseen monenlaisia ​​kieliä, jotka keskittyivät tiettyjen ongelmien ratkaisemiseen. Kielet ovat ilmestyneet tieteellisiin laskelmiin, taloudellisiin laskelmiin, tietokantoihin pääsyyn ja muihin.

Tulkki - ohjelma tai laite, joka suorittaa operaattorikohtaisen käännöksen ja lähdeohjelman suorittamisen. Toisin kuin kääntäjä, tulkki ei tuota konekielistä ohjelmaa tulosteena. Kun se on tunnistanut komennon lähdekielellä, se suorittaa sen välittömästi. Sekä kääntäjät että tulkit käyttävät samoja menetelmiä ohjelman lähdekoodin analysointiin. Mutta tulkin avulla voit aloittaa tietojen käsittelyn yhden komennon kirjoittamisen jälkeen. Tämä tekee ohjelmien kehittämis- ja virheenkorjausprosessista joustavamman. Lisäksi konekoodin puuttuminen mahdollistaa sotkumisen välttämisen ulkoisia laitteita lisätiedostoja, ja itse tulkki on melko helposti sovitettavissa mihin tahansa konearkkitehtuuriin kehittämällä se vain kerran laajasti käytetyllä ohjelmointikielellä. Siksi tulkitut kielet, kuten Java Script ja VB Script, ovat yleistyneet. Tulkkien haittana on ohjelman alhainen suoritusnopeus. Tyypillisesti tulkitut ohjelmat toimivat 50-100 kertaa hitaammin kuin alkuperäiset ohjelmat.

Emulaattori on ohjelma tai ohjelmisto- ja laitteistotyökalu, joka mahdollistaa ilman uudelleenohjelmointia suorittaa tietyllä tietokoneella ohjelman, joka käyttää koodeja tai menetelmiä toimintojen suorittamiseen, jotka eroavat annetusta tietokoneesta. Emulaattori on samanlainen kuin tulkki siinä mielessä, että se suorittaa suoraan tietyllä kielellä kirjoitetun ohjelman. Useimmiten se on kuitenkin konekieli tai välikoodi. Molemmat edustavat binäärikoodin ohjeita, jotka voidaan suorittaa välittömästi toimintakoodin tunnistamisen jälkeen. Toisin kuin tekstiohjelmissa, ei tarvitse tunnistaa ohjelman rakennetta tai valita operandeja.

Emulaattoreita käytetään melko usein erilaisiin tarkoituksiin. Esimerkiksi uusia laskentajärjestelmiä kehitettäessä luodaan ensin emulaattori, joka ajaa ohjelmia, jotka on kehitetty tietokoneille, joita ei vielä ole olemassa. Tämän avulla voit arvioida komentojärjestelmää ja kehittää perustietoja ohjelmisto jo ennen kuin vastaava laitteisto on luotu.

Hyvin usein emulaattoria käytetään vanhojen ohjelmien suorittamiseen uusissa tietokoneissa. Tyypillisesti uudemmat tietokoneet ovat nopeampia ja niissä on paremmat oheislaitteet. Näin voit emuloida vanhempia ohjelmia tehokkaammin kuin ajaa niitä vanhemmissa tietokoneissa.

Transkooderi on ohjelma tai ohjelmistolaite, joka kääntää yhden tietokoneen konekielellä kirjoitetut ohjelmat toisen tietokoneen konekielisiksi ohjelmiksi. Jos emulaattori on tulkin vähemmän älykäs analogi, niin transkooderi toimii samassa kapasiteetissa kääntäjään nähden. Vastaavasti lähdekoodi (ja yleensä binäärinen) konekoodi tai väliesitys muunnetaan toiseksi vastaavaksi koodiksi yhdellä käskyllä ​​ja ilman lähdeohjelman rakenteen yleistä analyysiä. Transkooderit ovat hyödyllisiä siirrettäessä ohjelmia tietokonearkkitehtuurista toiseen. Niiden avulla voidaan myös rekonstruoida korkean tason kieliohjelmatekstiä olemassa olevasta binäärikoodista.

Makroprosessori on ohjelma, joka korvaa yhden merkkisarjan toisella. Tämä on eräänlainen kääntäjä. Se luo tulostekstiä käsittelemällä lähdetekstissä olevia erityisiä lisäyksiä. Nämä lisäykset on suunniteltu erityisellä tavalla ja kuuluvat makrokieleksi kutsutun kielen rakenteisiin. Makroprosessoreita käytetään usein ohjelmointikielten lisäosina, mikä lisää ohjelmointijärjestelmien toimivuutta. Lähes kaikki kokoonpanolaitteet sisältävät makroprosessorin, mikä lisää koneohjelmien kehittämisen tehokkuutta. Tällaisia ​​ohjelmointijärjestelmiä kutsutaan yleensä makrokokoajiksi.

Makroprosessoreita käytetään myös korkean tason kielillä. Ne lisäävät kielten, kuten PL/1, C, C++, toimivuutta. Makroprosessorit ovat erityisen laajasti käytössä C- ja C++-kielissä, mikä helpottaa ohjelmien kirjoittamista. Makroprosessorit parantavat ohjelmoinnin tehokkuutta muuttamatta kielen syntaksia tai semantiikkaa.

Syntaksi on joukko kielen sääntöjä, jotka määräävät sen elementtien muodostumisen. Toisin sanoen tämä on joukko sääntöjä semanttisesti merkittävien symbolijonojen muodostamiseksi tietyllä kielellä. Syntaksi määritetään säännöillä, jotka kuvaavat kielen käsitteitä. Esimerkkejä käsitteistä ovat: muuttuja, lauseke, operaattori, menettely. Käsitteiden järjestys ja niiden hyväksyttävä käyttö säännöissä määräytyy syntaktisesti oikeat rakenteet, muodostaa ohjelmia. Syntaksin avulla määritellään objektien hierarkia, ei tapa, jolla ne ovat vuorovaikutuksessa keskenään. Esimerkiksi lause voi esiintyä vain proseduurissa, lauseke käskyssä, muuttuja voi koostua nimestä ja valinnaisista indekseistä jne. Syntaksia ei liitetä sellaisiin ohjelman ilmiöihin kuin "hyppy ei-olemattomaan nimikkeeseen" tai "muuttujaa, jolla on annettu nimi, ei ole määritelty". Tätä semantiikka tekee.

Semantiikka - säännöt ja ehdot, jotka määrittävät kielen elementtien väliset suhteet ja niiden semanttiset merkitykset sekä kielen syntaktisten rakenteiden merkityksellisen merkityksen tulkinnan. Ohjelmointikielen objektit eivät vain sijoiteta tekstiin tietyn hierarkian mukaisesti, vaan ne myös liitetään toisiinsa muiden käsitteiden kautta, jotka muodostavat erilaisia ​​assosiaatioita. Esimerkiksi muuttuja, jolle syntaksi määrittää kelvollisen sijainnin vain ilmoituksissa ja joissakin lausekkeissa, on tietty tyyppi, sitä voidaan käyttää rajoitetulla määrällä operaatioita, sillä on osoite, koko ja se on ilmoitettava ennen kuin se voidaan ilmoittaa. käyttää ohjelmassa.

Jäsentäjä on kääntäjäkomponentti, joka tarkistaa lähdelausekkeiden yhteensopivuuden tietyn ohjelmointikielen syntaktisten sääntöjen ja semantiikan kanssa. Nimestään huolimatta analysaattori tarkistaa sekä syntaksin että semantiikan. Se koostuu useista lohkoista, joista jokainen ratkaisee omat ongelmansa. Sitä käsitellään tarkemmin kuvattaessa kääntäjän rakennetta. kääntäjän kääntäjäkieliohjelmointi

Jokainen kääntäjä suorittaa seuraavat päätehtävät:

  • - analysoi käännetyn ohjelman, erityisesti määrittää, onko siinä syntaksivirheitä;
  • - luo tulosohjelman (kutsutaan usein objektiohjelmaksi) koneen komentokielellä;
  • - varaa muistia objektiohjelmalle.1.1 Tulkit

Yksi tulkinnan toteutuksen usein mainittu etu on, että se sallii "välittömän tilan". Suoratilassa voit kysyä tietokoneelta ongelman, kuten PRINT 3.14159*3/2.1, ja palauttaa vastauksen heti, kun painat ENTER-näppäintä (tämän avulla voit käyttää 3 000 dollarin tietokonetta 10 dollarin laskimena). Lisäksi tulkeilla on erityisiä ominaisuuksia, jotka helpottavat virheenkorjausta. Voit esimerkiksi keskeyttää tulkkiohjelman käsittelyn, näyttää tiettyjen muuttujien sisällön, selata ohjelmaa ja jatkaa sen jälkeen suorittamista.

Ohjelmoijat pitävät tulkkeissa eniten kyvystä saada nopea vastaus. Tässä ei ole tarvetta kääntää, koska tulkki on aina valmis häiritsemään ohjelmaasi. Kirjoita RUN ja tulos on sinun viimeinen mahdollisuus ilmestyy näytölle.

Tulkkikielillä on kuitenkin haittoja. On esimerkiksi välttämätöntä, että kopio tulkista on aina muistissa, kun taas monet tulkin ominaisuudet ja siten sen ominaisuudet eivät välttämättä ole välttämättömiä tietyn ohjelman suorittamiseksi.

Tulkkien hienovarainen haitta on, että heillä on tapana estää hyvä ohjelmointityyli. Koska kommentit ja muut formalisoidut yksityiskohdat vievät huomattavan määrän ohjelmamuistia, ihmiset eivät yleensä käytä niitä. Paholainen on vähemmän raivoissaan kuin tulkin BASICissa työskentelevä ohjelmoija, joka yrittää saada 120 000 ohjelman 60 000 muistiin. mutta pahinta on, että tulkit liikkuvat hitaasti.

He viettävät liian paljon aikaa yrittäessään selvittää, mitä tehdä sen sijaan, että he todella tekisivät työtä. Ohjelmakäskyjä suoritettaessa tulkin tulee ensin skannata jokainen käsky lukeakseen sen sisällön (mitä tämä henkilö pyytää minua tekemään?) ja sitten suoritettava pyydetty toiminto. Silmukoissa olevia operaattoreita tarkistetaan liikaa.

Harkitse ohjelmaa: tulkissa BASIC 10 FOR N=1 - 1000 20 PRINT N,SQR(N) 30 NEXT N kun käyt tämän ohjelman läpi ensimmäisen kerran, BASIC Interpreterin on selvitettävä, mitä rivi 20 tarkoittaa:

  • 1. Muunna numeerinen muuttuja N merkkijonoksi
  • 2. Lähetä merkkijono näytölle
  • 3. siirry seuraavalle tulostusalueelle
  • 4. Laske N:n neliöjuuri
  • 5. Muunna tulos merkkijonoksi
  • 6. Lähetä merkkijono näytölle

Jakson toisella kierroksella kaikki tämä ratkaisu toistetaan uudelleen, koska kaikki tämän rivin tutkimisen tulokset muutama millisekunti sitten unohdetaan kokonaan. Ja niin edelleen kaikille seuraaville 998 passille. On selvää, että jos pystyisit jotenkin erottamaan skannaus-/ymmärtämisvaiheen suoritusvaiheesta, sinulla olisi enemmän nopea ohjelma. Ja tätä varten kääntäjät ovat juuri sitä varten.


4. Kääntäjien rakentamisen perusperiaatteet. Kääntäjät, kääntäjät ja tulkit - yleinen työsuunnitelma. Nykyaikaiset kääntäjät ja tulkit.

Kääntäjien rakentamisen perusperiaatteet.

Kääntäjät, kääntäjät, tulkit - yleinen työsuunnitelma.

Kääntäjän, kääntäjän, tulkin määritelmä

Aluksi annetaan muutama määritelmä - mitä tarkalleen ovat jo toistuvasti mainitut kääntäjät ja kääntäjät.

Kääntäjän virallinen määritelmä

Kääntäjä on ohjelma, joka kääntää lähdekielellä olevan syöttöohjelman vastaavaksi tulosohjelmaksi tuloksena olevalla (tulostus) kielellä. Tässä määritelmässä sana "ohjelma" esiintyy kolme kertaa, eikä tämä ole virhe tai tautologia. Itse asiassa kääntäjän työhön liittyy aina kolme ohjelmaa.

Ensinnäkin itse kääntäjä on ohjelma 1 - se on yleensä osa tietokonejärjestelmän järjestelmäohjelmistoa. Toisin sanoen kääntäjä on ohjelmisto; se on joukko konekäskyjä ja tietoja, ja sen suorittaa tietokone, kuten kaikki muutkin käyttöjärjestelmän (OS) ohjelmat. Kaikki kääntäjän komponentit ovat ohjelmafragmentteja tai moduuleja, joilla on omat tulo- ja lähtötiedot.

Toiseksi, kääntäjän syöttödata on syöttöohjelman teksti - tietty lausesarja syöttöohjelmointikielellä. Tämä on yleensä symbolitiedosto, mutta tiedoston tulee sisältää ohjelmatekstiä, joka täyttää syöttökielen syntaktiset ja semanttiset vaatimukset. Lisäksi tällä tiedostolla on jokin merkitys, joka määräytyy syöttökielen semantiikan mukaan.

Kolmanneksi kääntäjän tulos on tuloksena olevan ohjelman teksti. Tuloksena oleva ohjelma on rakennettu kääntäjän tulostuskielessä määritettyjen syntaktisten sääntöjen mukaan ja sen merkitys määräytyy tuloskielen semantiikan mukaan. Tärkeä vaatimus kääntäjän määrittelyssä on syöttö- ja tulosohjelmien vastaavuus. Kahden ohjelman ekvivalenssi tarkoittaa niiden merkityksen yhtäläisyyttä syöttökielen semantiikan (lähdeohjelmalle) ja tuloskielen semantiikan (tulosohjelmalle) kannalta. Ilman tätä vaatimusta kääntäjä itse menettää kaiken käytännön merkityksen.

Joten, jotta voit luoda kääntäjän, sinun on ensin valittava syöttö- ja tulostuskielet. Kääntäjä toimii kääntäjänä syöttökielen lauseiden muuntamisen kannalta tuloskielen vastaaviksi lauseiksi. Esimerkiksi ohjelman kääntäminen C-kielestä kokoonpanokielelle ei pohjimmiltaan eroa kääntämisestä esimerkiksi venäjän kielestä englanniksi, sillä ainoa ero on, että kielten monimutkaisuus on hieman erilainen (miksi luonnollisesta kielestä ei ole kääntäjiä). kielet - katso kohta "Luokittelu" kielet ja kieliopit, luku 9). Siksi sana "kääntäjä" itse (englanniksi: kääntäjä) tarkoittaa "kääntäjä".

Tuloksena oleva ohjelma on kääntäjän työn tulos, mutta vain jos lähdeohjelman teksti on oikea - ei sisällä virheitä syöttökielen syntaksin ja semantiikan suhteen. Jos lähdeohjelma on virheellinen (sisältää vähintään yhden virheen), tulee kääntäjän tuloksena virheilmoitus (yleensä lisäselvityksellä ja virheen sijainnilla lähdeohjelmassa). Tässä mielessä kääntäjä on samanlainen kuin esimerkiksi englannin kielen kääntäjä, jolle on annettu väärä teksti.

Teoriassa on mahdollista toteuttaa kääntäjä laitteiston avulla. Kirjoittaja on kohdannut tällaisia ​​kehityskulkuja, mutta niiden laajaa käytännön sovellusta ei tunneta. Tässä tapauksessa kaikki kääntäjän komponentit voidaan toteuttaa laitteiston ja niiden fragmenttien muodossa - silloin tunnistuspiiri voi saada täysin käytännöllisen toteutuksen!

Kääntäjän määritelmä.

Ero kääntäjän ja kääntäjän välillä

Käsitteen "kääntäjä" lisäksi käytetään laajasti myös käsitettä "kääntäjä", jolla on samanlainen merkitys.

Kääntäjä - Tämä on kääntäjä, joka kääntää lähdeohjelman vastaavaksi objektiohjelmaksi koneen komentokielellä tai kokoonpanokielellä.

Kääntäjä eroaa siis kääntäjästä vain siinä, että sen tuloksena oleva ohjelma on aina kirjoitettava konekoodilla tai kokoonpanokielellä. Tuloksena oleva käännösohjelma voidaan yleensä kirjoittaa millä tahansa kielellä - esimerkiksi ohjelmien kääntäjä Pascalista C:hen on mahdollista. Näin ollen jokainen kääntäjä on kääntäjä, mutta ei päinvastoin - jokainen kääntäjä ei ole kääntäjä. Esimerkiksi edellä mainittu Pascal-C-kääntäjä ei ole kääntäjä 1 .

Itse sana "kääntäjä" tulee sanasta Englanninkielinen termi"kääntäjä" ("kääntäjä", "linkkeri"). Ilmeisesti termi johtuu kääntäjien kyvystä muodostaa objektiohjelmia lähdeohjelmien perusteella.

Tuloksena olevaa kääntäjäohjelmaa kutsutaan "olioohjelmaksi" tai "objektikoodiksi". Tiedostoa, johon se kirjoitetaan, kutsutaan yleensä "objektitiedostoksi". Vaikka tuloksena oleva ohjelma generoidaan koneen komentokielellä, objektiohjelman (objektitiedoston) ja suoritettavan ohjelman (suoritettava tiedosto) välillä on merkittävä ero. Kääntäjän tuottamaa ohjelmaa ei voi suorittaa suoraan tietokoneella, koska se ei ole sidottu tiettyyn muistialueeseen, jossa sen koodin ja datan tulisi sijaita (katso tarkemmin kappaleesta Ohjelmointijärjestelmien toiminnan periaatteet, luku 15) 2.

Kääntäjät ovat tietysti yleisin kääntäjätyyppi (monet pitävät niitä ainoana kääntäjänä, vaikka tämä ei pidä paikkaansa). Niillä on laajin käytännön sovellus, mikä johtuu kaikenlaisten ohjelmointikielten laajasta käytöstä. Seuraavassa puhumme aina kääntäjistä, mikä tarkoittaa, että tulosohjelma on kirjoitettu sisään

Luonnollisesti kääntäjät ja kääntäjät, kuten kaikki muutkin ohjelmat, on kehittänyt henkilö (ihmiset) - yleensä ryhmä kehittäjiä. Periaatteessa ne voitaisiin luoda suoraan konekäskykielellä, mutta nykyaikaisten kääntäjien koodin ja datan määrä on sellainen, että niiden luominen koneen komentokielellä on käytännössä mahdotonta kohtuullisessa ajassa ja kohtuullisin työvoimakustannuksin. Siksi melkein kaikki nykyaikaiset kääntäjät luodaan myös kääntäjien avulla (yleensä saman valmistajan aiemmat kääntäjät ovat tätä roolia). Ja tässä ominaisuudessa kääntäjä on jo tulosohjelma toiselle kääntäjälle, joka ei ole parempi tai huonompi kuin kaikki muut luodut tulostusohjelmat 2.

Tulkin määritelmä. Ero tulkkien ja kääntäjien välillä

Samankaltaisten käsitteiden "kääntäjä" ja "kääntäjä" lisäksi tulkin käsite on pohjimmiltaan erilainen.

Tulkki - se on ohjelma, joka ottaa syöteohjelman lähdekielellä ja suorittaa sen.

Toisin kuin kääntäjät, tulkit eivät luo tuloksena olevaa ohjelmaa (tai mitään tuloksena olevaa koodia ollenkaan) - ja tämä on niiden välinen perustavanlaatuinen ero. Tulkki, kuten kääntäjä, analysoi lähdeohjelman tekstiä. Se ei kuitenkaan generoi tuloksena olevaa ohjelmaa, vaan suorittaa välittömästi alkuperäisen sen merkityksen mukaisesti, jonka syöttökielen semantiikka antaa. Siten tulkin tulos on lähdeohjelman merkityksen määrittelemä tulos, jos tämä ohjelma on oikea, tai virheilmoitus, jos lähdeohjelma on väärä.

Tietenkin tulkin on lähdeohjelman suorittamiseksi jotenkin muutettava se konekoodikieleksi, koska muuten ohjelmien suorittaminen tietokoneella on mahdotonta. Hän tekee tämän, mutta tuloksena olevat konekoodit eivät ole käytettävissä - ne eivät näy tulkin käyttäjälle. Tulkki luo nämä konekoodit, suorittaa ne ja tuhoaa ne.

1 Erityisesti on mainittava, että nyt nykyaikaisiin ohjelmointijärjestelmiin on alkanut ilmestyä kääntäjiä, joissa tuloksena oleva ohjelma ei luoda koneen komentokielellä tai kokoonpanokielellä, vaan jollain välikielellä. Itse tätä välikieliä ei voida suorittaa suoraan tietokoneella, vaan se vaatii erityisen välitulkin suorittamaan sille kirjoitetut ohjelmat. Vaikka tässä tapauksessa termi "kääntäjä" olisi luultavasti oikeampi, kirjallisuudessa käytetään termiä "kääntäjä", koska välikieli on erittäin matalan tason kieli, joka on sukua konekäskyille ja kokoonpanokielille.

Tässä herää ikivanha "kana ja muna" -kysymys. Tietysti ensimmäisessä sukupolvessa ensimmäiset kääntäjät kirjoitettiin suoraan koneen ohjeisiin, mutta sitten kääntäjien tultua pois tästä käytännöstä. Jopa kääntäjien kriittisimmät osat luodaan vähintään kokoonpanokielellä - ja kääntäjä käsittelee myös tämän. räätälöidään tarpeen mukaan - tulkin tietyn toteutuksen edellyttämällä tavalla. Käyttäjä näkee näiden koodien suorittamisen tuloksen - tämä on tulos lähdeohjelman suorittamisesta (lähdeohjelman ja luotujen konekoodien vastaavuusvaatimus tässä tapauksessa (ehdollisesti on täytettävä).

Tulkkien toteutukseen liittyviä kysymyksiä ja niiden eroa kääntäjiin käsitellään tarkemmin vastaavassa osiossa.

Kääntäjien, kääntäjien ja tulkkien tarkoitus. Toteutusesimerkkejä

Ensimmäiset ohjelmat, jotka luotiin ensimmäisen sukupolven tietokoneille, kirjoitettiin suoraan konekoodikielellä. Se oli todella helvetinmoinen työ. Heti kävi selväksi, että ihmisen ei pitäisi eikä voi puhua konekäskyjen kieltä, vaikka hän olisi tietokoneasiantuntija. NOIN; Kaikki yritykset opettaa tietokone puhumaan ihmiskieliä ovat kuitenkin olleet onnistuneita, eivätkä ne todennäköisesti koskaan onnistu (joille on tiettyjä syitä, joita käsitellään tämän oppaan ensimmäisessä luvussa).

Siitä lähtien koko tietokoneohjelmistojen kehitys on ollut erottamattomasti sidoksissa kääntäjien syntymiseen ja kehittämiseen.

Ensimmäiset kääntäjät olivat kääntäjiä kokoonpanokielistä tai, kuten niitä kutsuttiin, muistokoodeista. Mnemoniset koodit muuttivat konekäskyjen kielen "philkinin kieliopin" monien (enimmäkseen englanninkielisten) merkintöjen kieleksi näille komentoille, jotka ovat asiantuntijalle enemmän tai vähemmän ymmärrettäviä. (ohjelmien tuottaminen on jo paljon helpompaa, mutta yksikään tietokone ei pysty suorittamaan mnems-kieltä (assembly language) itse; vastaavasti syntyi tarve luoda kääntäjiä. Nämä kääntäjät ovat perus, mutta niillä on edelleen merkittävä rooli ohjelmoinnissa Lisätietoa assembly-kielestä ja kääntäjistä on tarina siitä: tarkemmin vastaavassa osiossa.

Seuraava vaihe oli korkean tason kielten luominen. Korkean tason kielet (näihin kuuluvat useimmat ohjelmointikielet) edustavat jonkinlaista välilinkkiä puhtaasti muodollisten kielten ja ihmisten välisen luonnollisen viestinnän kielten välillä. Ensimmäisestä he saivat kielen lauseiden syntaktisen rakenteen tiukan malisaation, toisesta - merkittävän osan sanastoa, perusrakenteiden ja lausekkeiden semantiikkaa (algebrasta peräisin olevien matemaattisten operaatioiden elementeillä).

Korkean tason kielten ilmestyminen yksinkertaisti ohjelmointiprosessia merkittävästi, vaikka se ei vähentänyt sitä "kotiäititasolle", kuten jotkut kirjoittajat ylimielisesti väittivät ohjelmointikielten kynnyksellä 1 . Tällaisia ​​kieliä oli vain muutama, sitten kymmeniä, ja nyt niitä on luultavasti yli sata. Tälle prosessille ei näy loppua. Siitä huolimatta hallitsevat edelleen perinteisen "Neumann"-arkkitehtuurin tietokoneet, jotka voivat ymmärtää vain konekäskyjä, joten kääntäjien luominen on edelleen ajankohtainen.

Heti kun syntyi valtava tarve luoda kääntäjiä, erikoistunut teoria alkoi kehittyä. Ajan myötä se löysi käytännön sovelluksia monista luoduista kääntäjistä. Kääntäjiä on luotu ja luodaan edelleen paitsi uusille, myös pitkään tunnetuille kielille. Monet valmistajat tunnetuista, hyvämaineisista yrityksistä (kuten Microsoft tai Inprise) vähän tunnettuihin kirjoittajaryhmiin julkaisevat markkinoille yhä enemmän uusia kääntäjänäytteitä. Tämä johtuu useista syistä, joita käsitellään jäljempänä.

Lopuksi, koska suurin osa kääntäjien alan teoreettisista näkökohdista sai käytännön toteutuksen (ja tämä, täytyy sanoa, tapahtui melko nopeasti, 60-luvun lopulla), kääntäjien kehitys on seurannut heidän ihmisystävällisyytensä polkua - käyttäjä, ohjelmien kehittäjä kielillä korkealla tasolla. Tämän prosessin looginen päätelmä oli ohjelmointijärjestelmien luominen - ohjelmistojärjestelmät, jotka itse kääntäjien lisäksi yhdistävät monia asiaan liittyviä ohjelmistokomponentteja. Ohjelmointijärjestelmät valloittivat nopeasti markkinat ja hallitsevat niitä nyt suurimmaksi osaksi (itse asiassa erilliset kääntäjät ovat harvinaisuus nykyaikaisten ohjelmistotyökalujen joukossa). Lisätietoja nykyaikaisista ohjelmointijärjestelmistä ja niiden organisoinnista on luvussa "Nykyaikaiset ohjelmointijärjestelmät". Nykyään kääntäjät ovat olennainen osa mitä tahansa tietokonejärjestelmää. Ilman niiden olemassaoloa minkä tahansa sovelletun tehtävän ohjelmointi olisi vaikeaa, ellei yksinkertaisesti mahdotonta. Ja erikoistuneiden järjestelmätehtävien ohjelmointi suoritetaan pääsääntöisesti, jos ei korkean tason kielellä (tässä roolissa käytetään tällä hetkellä useimmiten C-kieltä), niin kokoonpanokielellä, joten käytetään sopivaa kääntäjää. Ohjelmointi suoraan konekoodikielillä tapahtuu erittäin harvoin ja vain hyvin kapeiden ongelmien ratkaisemiseksi. Muutama sana kääntäjien ja tulkkien esimerkkitoteutuksista sekä siitä, miten ne liittyvät muihin olemassa oleviin ohjelmisto. Kääntäjät, kuten myöhemmin osoitetaan, ovat yleensä hieman yksinkertaisempia toteuttaa kuin tulkit. Ne ovat myös tehokkuudeltaan ylivoimaisia ​​- on selvää, että käännetty koodi suoritetaan aina nopeammin kuin vastaavan lähdeohjelman tulkinta. Lisäksi kaikki ohjelmointikielet eivät salli yksinkertaisen tulkin rakentamista. Tulkeilla on kuitenkin yksi merkittävä etu - käännetty koodi on aina sidottu sen tietokonejärjestelmän arkkitehtuuriin, johon se on kohdistettu, ja lähdeohjelma on sidottu vain ohjelmointikielen semantiikkaan, joka on paljon helpompi standardoida. Tätä näkökohtaa ei alun perin otettu huomioon. Ensimmäiset kääntäjät olivat muistokoodin kääntäjiä. Heidän jälkeläisensä - nykyaikaiset kääntäjät kokoonpanokielistä - ovat olemassa melkein kaikille tunnetuille tietokonejärjestelmille. Ne ovat erittäin arkkitehtonisesti suuntautuneita. Sitten ilmestyi kääntäjiä kielistä, kuten FORTRAN, ALGOL-68, PL/1. Ne oli suunnattu suurille tietokoneille, joissa oli tehtävien eräkäsittely. Yllä mainituista ehkä vain FORTRAN on edelleen käytössä tähän päivään asti, koska sillä on valtava määrä kirjastoja eri tarkoituksiin. Monet kielet syntyessään eivät koskaan yleistyneet - ADA, Modula, Simula tunnetaan vain kapealle asiantuntijapiirille. Samaan aikaan markkinoilla ohjelmistojärjestelmät hallitsevat kielten kääntäjät, joilla ei odoteta olevan valoisaa tulevaisuutta. Ensinnäkin nyt se on C ja C++. Ensimmäinen heistä syntyi käyttöjärjestelmät tyyppi UNIX, yhdessä sen kanssa voitti "paikkansa auringossa" ja siirtyi sitten muihin käyttöjärjestelmiin. Toinen onnistuneesti sisälsi esimerkin olio-ohjelmointiideoiden toteuttamisesta hyvin todistetusti käytännön pohjalta 1. Voit myös mainita melko laajalle levinneen Pascalin, joka monille yllättäen ylitti yliopistoympäristön puhtaasti opetuksellisen kielen ulottuvuuden.

Tulkkien historia ei ole niin rikasta (vielä!). Kuten jo mainittiin, niille ei alun perin annettu merkittävää merkitystä, koska ne ovat melkein kaikilta osin huonompia kuin kääntäjät. Tunnetuista tulkintaa vaativista kielistä voidaan mainita vain Basic, vaikka useimmat ihmiset tietävätkin nyt sen Microsoftin valmistaman Visual Basicin käännetyn toteutuksen. Nyt tilanne on kuitenkin hieman muuttunut, koska Internetin kehittyessä ohjelmien siirrettävyydestä ja niiden laitteisto-alustariippumattomuudesta tulee yhä tärkeämpää. Tunnetuin esimerkki nykyään on Java-kieli (itse yhdistää kääntämisen ja tulkinnan) ja siihen liittyvä JavaScript. Loppujen lopuksi HTTP-protokollan perustana oleva HTML-kieli, joka antoi sysäyksen näin nopealle World Wide Webin kehitykselle, on myös tulkittu kieli. Kirjoittajan mukaan yllätykset odottavat edelleen kaikkia uusien tulkkien ilmaantumisen alalla, ja ensimmäiset niistä ovat jo ilmestyneet - esimerkiksi C#-kieli ("C-sharp", mutta nimi menee kaikkialla kuin " C Sharp), Microsoft ilmoitti.

NOIN Ohjelmointikielten historiasta ja kääntäjämarkkinoiden nykytilasta voidaan puhua pitkään. Kirjoittaja pitää mahdollisena rajoittua siihen, mitä on jo sanottu, koska tämä ei ole tämän oppaan tarkoitus. Kiinnostuneet voivat tutustua kirjallisuuteen.

Lähetysvaiheet. Kääntäjän toiminnan yleinen kaavio

Kuvassa 13.1 näyttää kääntäjän yleisen kaavion. Siitä se on selvää ъ Yleisesti ottaen kokoamisprosessi koostuu kahdesta päävaiheesta - synteesistä ja analyysistä.

Analyysivaiheessa lähdeohjelman teksti tunnistetaan ja tunnistetaulukot luodaan ja täytetään. Sen työn tuloksena on tietty sisäinen esitys ohjelmasta, joka on kääntäjälle ymmärrettävä.

Synteesivaiheessa ohjelman sisäisen esityksen ja tunnistetaulukon (taulukoiden) sisältämien tietojen perusteella generoidaan tuloksena olevan ohjelman teksti. Tämän vaiheen tulos on objektikoodi.

Lisäksi kääntäjä sisältää virheiden analysoinnista ja korjaamisesta vastaavan osan, jonka tulee, mikäli lähdeohjelman tekstissä on virhe, ilmoittaa käyttäjälle mahdollisimman kattavasti virheen tyypistä ja esiintymispaikasta. Parhaimmillaan kääntäjä voi tarjota käyttäjälle mahdollisuuden korjata virhe.

Nämä vaiheet puolestaan ​​koostuvat pienemmistä vaiheista, joita kutsutaan kokoamisvaiheiksi. Kokoonpanovaiheiden kokoonpano on annettu yleisimmässä muodossa, niiden erityinen toteutus ja vuorovaikutusprosessi

Ensinnäkin se on lähdeohjelman kielen ratkaisija. Sitten hänen on saatava syötteeksi syöttökielen symbolien ketju, tarkistettava, kuuluuko se kieleen ja lisäksi tunnistettava säännöt, joiden mukaan tämä ketju on rakennettu (koska vastaus kysymykseen kuulumisesta "kyllä" ja "ei" "ei kiinnosta juurikaan). On mielenkiintoista, että syöttökieliketjujen generaattori on käyttäjä - syöttöohjelman kirjoittaja.

Toiseksi kääntäjä on tuloksena olevan ohjelman kielen generaattori. Hänen tulee rakentaa lähdössä tuloskielen ketju Opran mukaan; lenaarisäännöt, tarkoitettu koneen opetuskieli tai kieli i näytteenottaja. Tämän ketjun tunnistaja on laskentajärjestelmä, jolle tuloksena oleva ohjelma luodaan.

Leksinen analyysi(skanneri) on kääntäjän se osa, joka lukee ohjelman lähdekielellä ja rakentaa niistä lähdekielen sanoja (tokeneita). Leksikaalisen analysaattorin syöte on lähdeohjelman teksti ja lähtötieto siirretään jatkokäsittelyä varten kääntäjälle jäsennysvaiheessa. Teoreettisesta näkökulmasta leksikaalinen analysaattori ei ole pakollinen, välttämätön osa kääntäjää. On kuitenkin syitä, jotka määräävät sen läsnäolon melkein kaikissa kääntäjissä. Katso lisätietoja kohdasta "Lexical Analyzers". Skannerien rakentamisen periaatteet."

Jäsentäminen- Tämä on kääntäjän pääosa analyysivaiheessa. O suorittaa syntaktisten rakenteiden valinnan lähdeohjelman tekstissä leksikaalisen analysaattorin käsittelemänä. Samassa vaiheessa kääntäjä tarkistaa ohjelman syntaktisen oikeellisuuden. Pääroolissa on syntaktinen jäsentäjä - syöttöohjelmointikielen tekstintunnistimen rooli (katso tämän luvun kohta "Jäsentimet. Syntaktisesti ohjattu käännös".

Semanttinen analyysi- tämä on kääntäjän osa, joka tarkistaa lähdeohjelman oikean* tekstin syöttökielen semantiikan kannalta. KRS tarkistaa suoraan, semanttinen analyysi on suoritettava muuntaminen; Syötekielen semantiikan edellyttämät tekstinimet (kuten implisiittisten tyyppimuunnosfunktioiden lisääminen). Erilaisissa comp. Tors, semanttinen analyysi voidaan sisällyttää osittain syntaktiseen* jäsennysvaiheeseen ja osittain koodin generoinnin valmisteluvaiheeseen.

Valmistaudutaan luomaan koodia- Tämä on vaihe, jossa kääntäjä suorittaa alustavia toimia, jotka liittyvät suoraan tuloksena olevan ohjelmatekstin synteesiin, mutta eivät vielä johda vieraalla kielellä olevan tekstin luomiseen. Tyypillisesti tämä vaihe sisältää toimia, jotka liittyvät kielielementtien tunnistamiseen, muistin varaamiseen jne. (katso osio ”Semanttinen analyysi ja valmistautuminen koodin luomiseen”, luku 14).

Koodin luominen- tämä on vaihe, joka liittyy suoraan kohdekielen lausekomponenttien koomaan ja tuloksena olevaan tekstiin kokonaisuutena

Voi tietysti vaihdella kääntäjän versiosta riippuen. Kuitenkin, tavalla tai toisella, kaikki esitetyt vaiheet ovat lähes aina läsnä kussakin tietyssä kääntäjässä.

Kääntäjä kokonaisuudessaan, muodollisten kielten teorian näkökulmasta, esiintyy "kahdessa muodossa" ja suorittaa kaksi päätehtävää. ohjelmia. Tämä on päävaihe tuloksena olevan ohjelman synteesivaiheessa. Sen lisäksi, että generoidaan suoraan tuloksena olevan ohjelman tekstiä, generointi sisältää yleensä myös optimoinnin - prosessin, joka liittyy jo luodun tekstin käsittelyyn. Joskus optimointi erotetaan erilliseksi käännösvaiheeksi, koska sillä on merkittävä vaikutus tuloksena olevan ohjelman laatuun ja tehokkuuteen (katso kohdat "Koodin luominen. Koodin luontimenetelmät" ja "Koodin optimointi. Perusoptimointimenetelmät", luku 14).

Tunnistetaulukot(jota kutsutaan joskus "symbolitaulukoiksi") ovat erityisesti järjestettyjä tietojoukkoja, jotka tallentavat tietoja lähdeohjelman elementeistä, joita sitten käytetään tuloksena olevan ohjelman tekstin luomiseen. Tietyssä kääntäjätoteutuksessa voi olla yksi tunnistetaulukko tai tällaisia ​​taulukoita voi olla useita. Lähdeohjelman elementit, joista tiedot on tallennettava käännösprosessin aikana, ovat muuttujia, vakioita, funktioita jne. - elementtijoukon erityinen koostumus riippuu käytetystä ohjelmointikielestä. "Taulukon" käsite ei suinkaan tarkoita, että tämä tietovarasto tulisi järjestää tarkasti taulukoiksi tai muiksi tietoryhmiksi - mahdollisia menetelmiä niiden järjestämiseksi käsitellään tarkemmin osiossa Tunnistetaulukot. Tunnistetaulukoiden järjestäminen."

Kuvassa 13.1, kokoamisprosessin jakaminen vaiheisiin palvelee melko metodologisia tarkoituksia, eikä sitä käytännössä välttämättä noudateta niin tiukasti. Tämän käsikirjan alakohdissa tarkastellaan myös erilaisia ​​vaihtoehtoja esitettyjen kokoamisvaiheiden tekniselle järjestämiselle. On myös osoitettu, kuinka ne voivat liittyä toisiinsa. Tässä tarkastelemme vain tämäntyyppisen suhteen yleisiä näkökohtia.

Ensin leksikaalisessa analyysivaiheessa syöttöohjelman tekstistä poimitaan lekseemejä siltä osin kuin ne ovat tarpeen seuraavaa jäsennysvaihetta varten. Toiseksi, kuten alla esitetään, jäsentäminen ja koodin generointi voidaan suorittaa samanaikaisesti. Nämä kolme käännösvaihetta voivat siis toimia yhdessä, ja niiden kanssa voidaan myös valmistautua koodin luomiseen. Seuraavaksi tarkastellaan konseptiin läheisesti liittyviä tärkeimpien käännösvaiheiden toteuttamisen teknisiä kysymyksiä kulku.

Passion käsite. Multi-pass ja single-pass kääntäjät

Kuten jo mainittiin, ohjelmien käännösprosessi koostuu useista vaiheista. Todellisissa kääntäjissä näiden vaiheiden koostumus voi poiketa hieman edellä käsitellystä - jotkut niistä voidaan jakaa komponenteiksi, toiset päinvastoin yhdistetään yhdeksi vaiheeksi. Järjestys, jossa käännösvaiheet suoritetaan, voi myös vaihdella eri kääntäjäversioiden välillä. Yhdessä tapauksessa kääntäjä tarkastelee lähdeohjelman tekstiä, suorittaa välittömästi kaikki käännösvaiheet ja saa tuloksen - objektikoodin. Toisessa versiossa se suorittaa vain osan käännösvaiheista lähdetekstille eikä vastaanota lopputulosta, vaan joukon välitietoja. Nämä tiedot käsitellään sitten uudelleen, prosessi, joka voidaan toistaa useita kertoja.

Todelliset kääntäjät suorittavat pääsääntöisesti lähdeohjelman tekstin käännöksen useissa ajoissa.

Kulku - Tämä on prosessi, jossa kääntäjä lukee peräkkäin tietoja ulkoisesta muistista, käsittelee sen ja sijoittaa työn tuloksen ulkoiseen muistiin. Useimmiten yksi ajo sisältää yhden tai useamman käännösvaiheen suorittamisen. Välilaskujen tulos on lähdeohjelman sisäinen esitys, viimeisen läpimenon tulos on tuloksena oleva objektiohjelma.

Kuten ulkoinen muisti Mitä tahansa tallennusvälinettä voidaan käyttää - tietokoneen RAM-muistia, magneettilevyasemia, magneettinauhoja jne. Nykyaikaiset kääntäjät pyrkivät yleensä hyödyntämään tietokoneen RAM-muistia mahdollisimman paljon tietojen tallentamiseen, ja vain silloin, kun käytettävissä on pulaa muistista, kovat magneettiasemat ovat käytettyjä levyjä. Muita tallennusvälineitä ei käytetä nykyaikaisissa kääntäjissä alhaisen tiedonsiirtonopeuden vuoksi.

Kun jokainen kierros suoritetaan, kääntäjällä on pääsy kaikista aiemmista passeista saatuihin tietoihin. Pääsääntöisesti se pyrkii käyttämään ensisijaisesti vain nykyistä välittömästi edeltäneestä siirrosta saatua tietoa, mutta periaatteessa se pääsee käsiksi aikaisempien läpivientien tietoihin aina ohjelman lähdekoodiin saakka. Kääntäjän passien suorittamisen yhteydessä saamat tiedot eivät ole käyttäjän käytettävissä. Se on joko tallennettu RAM-muisti, jonka kääntäjä julkaisee käännösprosessin päätyttyä, tai se on alustettu väliaikaisiksi tiedostoiksi levylle, jotka myös tuhoutuvat kääntäjän valmistuttua. Siksi kääntäjän kanssa työskentelevä henkilö ei välttämättä edes tiedä kuinka monta siirtoa kääntäjä suorittaa - hän näkee aina vain lähdeohjelman tekstin ja tuloksena olevan objektiohjelman. Mutta suoritettujen passien määrä on tärkeä tekniset tiedot kääntäjä, hyvämaineiset yritykset - kääntäjien kehittäjät yleensä ilmoittavat sen tuotteensa kuvauksessa.

On selvää, että kehittäjät pyrkivät minimoimaan kääntäjien suorittamien läpivientien määrän. Tämä lisää kääntäjän nopeutta ja vähentää sen tarvitseman muistin määrää. Yksikierroskääntäjä, joka ottaa lähdeohjelman syötteenä ja tuottaa välittömästi tuloksena olevan objektiohjelman, on ihanteellinen.

Aina ei kuitenkaan ole mahdollista vähentää passien määrää. Vaadittu läpäisymäärä määräytyy ensisijaisesti lähdekielen kielioppi- ja semanttisten sääntöjen mukaan. Mitä monimutkaisempi kielen kielioppi ja mitä enemmän vaihtoehtoja semanttiset säännöt ehdottavat, sitä enemmän kääntäjä suorittaa (tietysti myös kääntäjien kehittäjien pätevyydet vaikuttavat). Esimerkiksi tästä syystä Pascal-kielen kääntäjät toimivat yleensä nopeammin kuin C-kielen kääntäjät - Pascalin kielioppi on yksinkertaisempi ja semanttiset säännöt tiukemmat. Kertakierroskääntäjät ovat harvinaisia ​​ja ovat mahdollisia vain hyvin yksinkertaisilla kielillä. Todelliset kääntäjät suorittavat tyypillisesti kahdesta viiteen ajoa. Näin ollen todelliset kääntäjät ovat monivaiheisia. Yleisimmät ovat esimerkiksi kaksi- ja kolmivaiheiset kääntäjät: ensimmäinen vaihe on leksikaalinen analyysi, toinen jäsentäminen ja semanttinen analyysi, kolmas on koodin luominen ja optimointi (toteutusvaihtoehdot tietysti riippuvat kehittäjästä). Nykyaikaisissa ohjelmointijärjestelmissä kääntäjän ensimmäinen kierros (koodin leksikaalinen analyysi) suoritetaan usein samanaikaisesti lähdeohjelman koodin muokkaamisen kanssa (tätä kääntäjien rakentamisvaihtoehtoa käsitellään myöhemmin tässä luvussa).

Tulkit. Tulkkien rakentamisen ominaisuudet

Tulkki on ohjelma, joka hyväksyy syöteohjelman lähdekielellä ja suorittaa sen. Kuten edellä mainittiin, tärkein ero tulkkien ja kääntäjien ja kääntäjien välillä on se, että tulkki ei luo tuloksena olevaa ohjelmaa, vaan yksinkertaisesti suorittaa alkuperäisen ohjelman.

Termi "tulkki", kuten "kääntäjä", tarkoittaa "kääntäjä". Terminologian näkökulmasta nämä käsitteet ovat samankaltaisia, mutta muodollisten kielten teorian ja kääntämisen kannalta niiden välillä on suuri perustavanlaatuinen ero. Jos käsitteitä "kääntäjä" ja "kääntäjä" ei voi melkein erottaa toisistaan, niitä ei voida sekoittaa "tulkin" käsitteeseen.

Yksinkertaisin tapa toteuttaa tulkki olisi kääntää lähdeohjelma ensin kokonaan konekäskyiksi ja sitten suorittaa välittömästi. Tällaisessa toteutuksessa tulkki itse asiassa eroaisi vähän kääntäjästä, sillä ainoa ero on, että tuloksena oleva ohjelma ei olisi käyttäjän käytettävissä. Tällaisen tulkin haittapuolena olisi, että käyttäjän olisi odotettava koko lähdeohjelman käännöstä ennen sen suorittamista. Itse asiassa tällaisessa tulkissa ei olisi mitään erityistä järkeä - se ei tarjoa mitään etuja vastaavaan kääntäjään 1 . Siksi suurin osa tulkeista toimii siten, että he suorittavat lähdeohjelman peräkkäin, kun se saapuu tulkin syötteeseen. Tällöin käyttäjän ei tarvitse odottaa, että koko lähdeohjelma on käännetty. Lisäksi hän voi peräkkäin syöttää alkuperäisen ohjelman ja välittömästi tarkkailla sen suorituksen tulosta komentoja syötettäessä.

Tässä tulkin toimintajärjestyksessä ilmenee merkittävä ominaisuus, joka erottaa sen kääntäjästä - jos tulkki suorittaa komentoja niiden saapuessa, se ei voi suorittaa lähdeohjelman optimointia. Näin ollen tulkin kokonaisrakenteessa ei ole optimointivaihetta. Muuten se eroaa vähän samanlaisen kääntäjän rakenteesta. Sinun tulee vain ottaa huomioon, että viimeisessä vaiheessa - koodin luomisessa - koneen komentoja ei kirjoiteta objektitiedostoon, vaan ne suoritetaan sitä mukaa kuin ne luodaan.

Optimointivaiheen puuttuminen määrittää toisen monille tulkeille ominaisen ominaisuuden: he käyttävät hyvin usein käänteistä puolalaista merkintää ohjelman sisäisenä esityksenä (katso osio "Koodin luominen. Koodin luontimenetelmät", luku 14). Tällä kätevällä toimintojen esitystavalla on vain yksi merkittävä haittapuoli - se on vaikea optimoida. Mutta tämä on juuri se, mitä tulkkeilta ei vaadita.

Kaikki ohjelmointikielet eivät salli tulkkien rakentamista, jotka voisivat suorittaa lähdeohjelman komentojen vastaanotettaessa. Tätä varten kielen on sallittava kääntäjä, joka jäsentää lähdeohjelman yhdellä kertaa. Lisäksi kieltä ei voida tulkita käskyjen vastaanottamiseksi, jos se sallii kutsujen esiintymisen funktioille ja tietorakenteille ennen niiden suoraa kuvausta. Siksi kieliä, kuten C ja Pascal, ei voida tulkita tällä menetelmällä.

Optimointivaiheen puuttuminen johtaa siihen, että ohjelman suorittaminen tulkin avulla on vähemmän tehokasta kuin vastaavan kääntäjän käyttäminen. Lisäksi tulkinnassa lähdeohjelma tulee jäsentää uudelleen joka kerta kun se suoritetaan, kun taas käännöksessä se jäsennetään vain kerran ja sen jälkeen käytetään aina objektitiedostoa. Siten tulkit häviävät aina suorituskyvyssään kääntäjille.

Tulkin etuna on, että ohjelman suoritus on riippumaton kohdetietokonejärjestelmän arkkitehtuurista. Kääntämisen tuloksena: saadaan objektikoodi, joka on aina suunnattu tiettyyn arkkitehtuuriin. Jotta voit siirtyä toiseen kohdetietokonejärjestelmän arkkitehtuuriin, ohjelma on käännettävä uudelleen. Ja ohjelman tulkitsemiseen tarvitaan vain sen lähdeteksti ja tulkki vastaavasta kielestä.

Pitkään aikaan tulkit olivat huomattavasti harvinaisempia mikä kuorijat. Tulkkeja oli pääsääntöisesti olemassa rajoitetulle määrälle suhteellisen yksinkertaisia ​​ohjelmointikieliä (kuten Basic. Tehokkaat ammattimaiset ohjelmistokehitystyökalut rakennettiin kääntäjien pohjalta.

Uuden sysäyksen tulkkien kehitykselle antoi globaalin leviäminen Tietokoneverkot. Tällaisissa verkoissa voi olla henkilökohtaisen arkkitehtuurin tietokoneita, jolloin vaatimus alkuperäisen ohjelman tekstin yhtenäisestä suorittamisesta jokaisessa niistä tulee ratkaisevaksi. Siksi Internet ilmestyi maailmanlaajuisten verkkojen kehittymisen ja World Wide Webin leviämisen myötä
Nykyaikaisissa ohjelmointijärjestelmissä on ohjelmistototeutuksia, joissa yhdistyvät sekä kääntäjä- että tulkkitoiminnot - käyttäjän tarpeista riippuen lähdeohjelma joko käännetään tai suoritetaan (tulkitaan). Lisäksi jotkin nykyaikaiset ohjelmointikielet sisältävät kaksi kehitysvaihetta: ensin lähdeohjelma käännetään välikoodiksi (joku matalan tason kieli), ja sitten tämä käännöstulos suoritetaan käyttämällä tämän välikielen tulkkia. Tällaisten järjestelmien vaihtoehtoja käsitellään tarkemmin luvussa ”Modernit ohjelmointijärjestelmät”.

Laajalti käytetty esimerkki tulkitusta kielestä on HTML (Hypertext Markup Language), hypertekstin kuvauskieli. Lähes koko Internetin rakenne toimii tällä hetkellä sen pohjalta. Toinen esimerkki - Java kielet ja JavaScript - yhdistävät käännös- ja tulkintatoiminnot. Lähdeohjelman teksti on käännetty johonkin kohdetietokonejärjestelmän arkkitehtuurista riippumattomaan binäärikoodiin, joka jaetaan verkon yli ja suoritetaan vastaanottavalla puolella - tulkittuna.

Kääntäjät assembly-kielestä ("assemblers")

Kokoonpanokieli - Tämä on matalan tason kieli. Tämän kielen ketjujen rakenne ja yhteenliittäminen ovat lähellä kohdetietokonejärjestelmän konekäskyjä, joissa tuloksena oleva ohjelma on suoritettava. Assembly-kielen käyttö antaa kehittäjälle mahdollisuuden hallita kohdetietokonejärjestelmän resursseja (prosessori, RAM, ulkoiset laitteet jne.) koneen ohjeiden tasolla. Jokainen käsky lähdekokoonpanokieliohjelmassa muunnetaan yhdeksi konekäskyksi kääntämisen tuloksena.

Assembly-kielen kääntäjä on tietysti aina kääntäjä, koska tuloksena olevan ohjelman kieli on konekoodi. Assembler-kääntäjää kutsutaan usein yksinkertaisesti "assembleriksi" tai "assembler-ohjelmaksi".

Kääntäjien toteutus assembly-kielestä

Kokoonpanokieli sisältää tyypillisesti muistokoodeja koneen ohjeille. Englanninkielistä komentomuistotekniikkaa käytetään useimmiten, mutta kokoonpanokielistä on myös muita muunnelmia (mukaan lukien venäjänkieliset variantit). Siksi kokoonpanokieltä kutsuttiin aiemmin "muistokoodikieleksi" (nyt tätä nimeä ei käytännössä enää käytetä). Kaikki mahdolliset komennot kussakin kokoonpanokielessä voidaan jakaa kahteen ryhmään: ensimmäiseen ryhmään kuuluvat tavalliset kielikomennot, jotka muunnetaan konekäskyiksi käännösprosessin aikana; toinen ryhmä koostuu erityisistä kielikomennoista, joita ei muunneta konekäskyiksi, mutta joita kääntäjä käyttää käännöstehtävien suorittamiseen (kuten esimerkiksi muistin varaustehtävä). Kielen syntaksi on erittäin yksinkertainen. Lähdeohjelman komennot kirjoitetaan yleensä siten, että ohjelman yhdellä rivillä on yksi komento. Jokainen kokoonpanokielen käsky voidaan pääsääntöisesti jakaa kolmeen osaan, jotka seuraavat peräkkäin peräkkäin: otsikot, toimintakoodi ja operandikenttä. Perinteisessä kokoonpanokielen kääntäjässä on myös mahdollisuus, että syöttöohjelmassa on kommentteja, jotka erotetaan komennoista tietyllä erottimella.

Tarrakenttä sisältää tarraa edustavan tunnisteen tai on tyhjä. Jokainen tarran tunniste voi esiintyä vain kerran konekieliohjelmassa. Merkin katsotaan kuvattuna missä se on klo keskinkertaisesti havaittu ohjelmassa (tarrojen alustava kuvaus vaaditaan). Tarraa voidaan käyttää ohjauksen siirtämiseen sen antamaan komentoon. Usein nimiö erotetaan muusta komennosta syklisellä erottimella (useimmiten kaksoispiste ":").

Toimintokoodi on aina tiukasti määritelty muistiinpano jollekin mahdollisesta prosessorikomennosta tai myös tiukasti määritelty komento (kääntäjäni. Toimintokoodi kirjoitetaan kielen aakkosmerkein. Useimmiten sen pituus on 3-4, harvemmin - 5 tai 6 merkkiä.

Operandikenttä on joko tyhjä tai se on luettelo yhdestä, kahdesta tai harvemmin kolmesta operandista. Operandien määrä on tiukasti määritelty ja riippuu toimintakoodista - jokainen kokoonpanokielen operaatio tarjoaa tiukasti määritellyn määrän operandejaan. Vastaavasti jokainen näistä vaihtoehdoista vastaa osoitteettomia, uniaddress-, kaksiosoite- tai kolmiosoitekomentoja (suurempaa määrää operandeja ei käytännössä käytetä; nykyaikaisissa tietokoneissa jopa kolmen osoitteen komennot ovat harvinaisia). Kuten oopperat; Ne voivat olla tunnisteita tai vakioita.

Assembly-kielen ominaisuus on, että joukko n:n tunnisteita on varattu nimenomaan prosessorirekistereitä varten. Tällaiset fikaattorit eivät toisaalta vaadi alustavaa kuvausta, mutta D1:n kanssa käyttäjä ei voi käyttää niitä muihin tarkoituksiin. Joukko näitä tunnisteita on ennalta määritetty jokaiselle kokoonpanokielelle.

Joskus kokoonpanokieli sallii operandeina käyttää tiettyjä rajoitettuja rekisterinimikkeiden, tunnisteiden ja vakioiden yhdistelmiä, jotka yhdistetään tietyillä operaattorimerkeillä. Tällaisia ​​lauseita käytetään useimmiten osoittamaan osoitustyyppejä esimerkiksi kohdetietokonejärjestelmän konekäskyissä.

Esimerkiksi seuraava komentosarja

Tämä on esimerkki kokoonpanokielen komentojen sarjasta; Intel 80x86 -perheen prosessorit. Siinä on tietojoukon kuvauskomento (db), nimike (silmukat), toimintakoodit (mov, dec ja jnz) Operandit ovat tietojoukon tunniste (datas), prosessirekisterin nimitykset

(bx ja cx), nimike (silmukat) ja vakio (4). Yhdistelmäoperandidata kartoittaa tietojoukon epäsuoran osoitteen perusrekisteriin bx offsetissa 4.

Tällainen kielen syntaksi voidaan helposti kuvata käyttämällä tavallista kielioppia. Siksi kokoonpanokielen tunnistimen rakentaminen ei ole vaikeaa. Samasta syystä kokoonpanokielen kääntäjissä leksikaalinen ja syntaktinen jäsentäminen yhdistetään yleensä yhdeksi tunnistimeksi.

Assembly-kielen semantiikka määräytyy kokonaan kohdetietokonejärjestelmän mukaan, jolle tämä kieli on suunnattu. Kokoonpanokielen semantiikka määrittää, mikä konekäsky vastaa kutakin kokoonpanokielen käskyä, sekä mitkä operandit ja kuinka monta on sallittua tietylle operaatiokoodille.

Siksi semanttinen analyysi kokoonpanokielen kääntäjässä on yhtä yksinkertaista kuin syntaktinen analyysi. Sen päätehtävänä on tarkistaa kunkin opkoodin operandien kelpoisuus ja myös tarkistaa, että kaikki syöttöohjelmassa kohdatut tunnisteet ja tunnisteet on kuvattu ja niitä osoittavat tunnisteet eivät vastaa ennalta määritettyjä tunnisteita, joita käytetään opkoodien ja prosessorirekisterien merkitsemiseen.

Kokoonpanokielen kääntäjän jäsennys- ja semanttinen analyysi voidaan siten toteuttaa tavanomaisen äärellisen tilakoneen pohjalta. Juuri tämä ominaisuus määritti sen tosiasian, että kokoonpanokielen kääntäjät olivat historiallisesti ensimmäisiä tietokoneille luotuja kääntäjiä. On myös useita muita asennuskielille ominaisia ​​ominaisuuksia, jotka yksinkertaistavat niiden kääntäjien rakentamista.

Ensinnäkin kokoonpanokielen kääntäjät eivät vaadi muuttujien ylimääräistä tunnistamista - kaikki kielimuuttujat säilyttävät käyttäjän niille antamat nimet. Lähdeohjelman nimien ainutlaatuisuus on sen kehittäjän vastuulla; kielen semantiikka ei aseta tälle prosessille lisävaatimuksia. Toiseksi, kokoonpanokielen kääntäjissä muistin varaaminen on erittäin yksinkertaista. Assembly-kielen kääntäjä toimii vain staattisen muistin kanssa. Jos käytetään dynaamista muistia, sen kanssa työskentelemiseen on käytettävä asianmukaisia ​​kirjasto- tai käyttöjärjestelmän toimintoja, ja lähdeohjelman kehittäjä on vastuussa sen allokoinnista. Lähdeohjelman kehittäjä on myös vastuussa parametrien välittämisestä sekä toiminto- ja toimintomuistinäytön järjestämisestä. Hänen on myös huolehdittava tietojen erottamisesta ohjelmakoodista - kokoonpanokielen kääntäjä, toisin kuin korkean tason kielten kääntäjät, ei suorita tällaista erottelua automaattisesti. Ja kolmanneksi, koodin luomisvaiheessa kääntäjässä kokoonpanokieltä, optimointia ei suoriteta, koska lähdeohjelman kehittäjä on itse vastuussa laskelmien järjestämisestä, konekäskyjen järjestyksestä ja prosessorirekisterien jakelusta.

Näiden ominaisuuksien lisäksi kokoonpanokielen kääntäjä on tavallinen kääntäjä, mutta huomattavasti yksinkertaistettu verrattuna mihin tahansa korkean tason kielen kääntäjään. Assembly-kielen kääntäjät toteutetaan useimmiten kaksivaiheisella menetelmällä. Ensimmäisellä kierroksella kääntäjä jäsentää lähdeohjelman, muuntaa sen konekoodiksi ja samanaikaisesti täyttää tunnistetaulukon. Mutta ensimmäisellä kerralla koneohjeissa niiden operandien osoitteet, jotka sijaitsevat RAM:issa, jäävät tyhjiksi. Toisella läpikäynnillä kääntäjä täyttää nämä osoitteet ja havaitsee samanaikaisesti kuvaamattomat tunnisteet. Tämä johtuu siitä, että operandi voidaan ilmoittaa ohjelmassa sen jälkeen, kun sitä on käytetty ensimmäisen kerran. Tällöin sen osoite ei ole vielä tiedossa konekäskyä valmistettaessa, ja siksi tarvitaan toinen läpikulku. Tyypillinen esimerkki tällaisesta operandista on etiketti, joka mahdollistaa hyppäämisen eteenpäin käskysarjassa.

Makrot ja makrot

Ohjelmien kehittäminen assembly-kielellä on melko työvoimavaltainen prosessi, joka vaatii usein yksinkertaista toistamista samat toiminnot, jotka toistetaan yhä uudelleen ja uudelleen. Esimerkkinä voisi olla komentosarja, joka suoritetaan joka kerta pinomuistinäytön järjestämiseksi toimintoa tai toimintoa syötettäessä.

Kehittäjän työn helpottamiseksi luotiin ns. makrokomennot.

Makrokomento on tekstin korvaaminen, jonka aikana jokainen tietyn tyyppinen tunniste korvataan merkkiketjulla jostain tietovarastosta. Makrokomennon suorittamisprosessia kutsutaan makrogeneraatioksi, ja makrokomennon suorittamisesta syntyvää merkkiketjua kutsutaan makrolaajennukseksi.

Makrojen suoritusprosessi koostuu lähdeohjelman tekstin peräkkäisestä skannauksesta, siinä olevien tiettyjen tunnisteiden havaitsemisesta ja niiden korvaamisesta vastaavilla merkkijonoilla. Lisäksi suoritetaan yhden merkkiketjun (tunnisteen) tekstillinen korvaaminen toisella merkkiketjulla (merkkijono). Tällaista substituutiota kutsutaan makrosubstituutioksi.

Makromäärityksiä käytetään määrittämään, mitkä tunnisteet tulee korvata millä merkkijonoilla. Makromääritykset ovat suoraan lähdeohjelman tekstissä. Ne on korostettu erityisillä avainsanoilla tai erottimilla, joita ei voi esiintyä missään muualla ohjelman tekstissä. Käsittelyn aikana kaikki makromääritykset suljetaan kokonaan pois syöttöohjelman tekstistä ja niiden sisältämät tiedot tallennetaan prosessoitavaksi makrokomentoja suoritettaessa.

Makromäärittely voi sisältää parametreja. Tällöin jokaisen sitä vastaavan makrokomennon on kutsuttaessa sisällettävä merkkijono jokaisen parametrin sijaan. Makroa suoritettaessa tämä merkkijono lisätään jokaiseen kohtaan, jossa vastaava parametri esiintyy makromääritelmässä. Makrokomennon parametri voi olla toinen makrokomento, jolloin sitä kutsutaan rekursiivisesti aina, kun parametrin korvaaminen on suoritettava. Periaatteessa makrokäskyt voivat muodostaa sekvenssin

Rekursiiviset kutsut, jotka ovat samankaltaisia ​​kuin proseduurien ja funktioiden rekursiiviset kutsut, mutta laskutoimitusten ja parametrien välittämisen sijaan ne suorittavat vain tekstin korvauksia 1 .

Makrot ja makromääritykset käsitellään erityisellä moduulilla, jota kutsutaan makroprosessoriksi tai makrogeneraattoriksi. Makrogeneraattori vastaanottaa syötteenä lähdeohjelman tekstin, joka sisältää makromäärityksiä ja makrokomentoja, ja sen tuloste näkyy lähdeohjelman makrolaajennuksen tekstinä, joka ei sisällä makromäärityksiä ja makrokomentoja. Molemmat tekstit ovat vain ohjelmatekstejä, muuta käsittelyä ei suoriteta. Se on lähdetekstin makrolaajennus, joka tulee kääntäjän syötteeseen.

Makrokomentojen ja makromääritelmien syntaksia ei ole tarkasti määritelty. Se voi vaihdella asennuskielen kääntäjän toteutuksen mukaan. Mutta periaate makrokorvausten suorittamisesta ohjelmatekstissä on muuttumaton eikä riipu niiden syntaksista.

Makrogeneraattoria ei useimmiten ole erillisenä ohjelmistomoduulina, vaan se sisältyy kokoonpanokielen kääntäjään. Alkuperäisen ohjelman makrolaajennus ei yleensä ole sen kehittäjän käytettävissä. Lisäksi makrokorvaukset voidaan suorittaa peräkkäin, kun jäsennetään lähdetekstiä kääntäjän ensimmäisellä kierrolla, samalla kun jäsennetään koko ohjelmateksti, jolloin lähdeohjelman makrolaajennusta kokonaisuutena ei välttämättä ole ollenkaan sellaisenaan.

Esimerkiksi seuraava teksti määrittelee push_0-makron Intel 8086 -prosessorin asennuskielellä:

Hog ah, ah ■ työnnä kirves endm

Tämän makron semantiikka on kirjoittaa pinoon numero "0" prosessorirekisterin ah kautta. Sitten kaikkialla ohjelmatekstissä, missä makrokäsky näkyy

Se korvataan makron korvaamisen seurauksena komentosarjalla:

Hog ah, ah ■ työnnä kirves

Tämä on makromäärittelyn yksinkertaisin versio. On mahdollista luoda monimutkaisempia makromäärityksiä parametreilla. Yksi tällainen makromääritelmä on kuvattu alla:

Tällaisen rekursion syvyys on yleensä hyvin rajallinen. Makrokomentojen rekursiivisten kutsujen sekvenssi on yleensä huomattavasti tiukempien rajoitusten alainen kuin proseduurien ja funktioiden rekursiivisten kutsujen sekvenssi, jota muistinäytön pinoorganisaatiolla rajoittaa vain parametrien välittävän pinon koko. add_abx-makro xl,x2

Työnnä kirves
endm

Tällöin myös makrokomento on ilmoitettava ohjelmatekstissä sopivalla määrällä parametreja. Tässä esimerkissä makro

Add_abx4,8 korvataan komentosarjalla makron korvaamisen seurauksena:

Lisää ah,4 lisää bx.4 lisää ex,8 työnnä kirves

Monet kokoonpanokielen kääntäjät mahdollistavat vieläkin monimutkaisempia rakenteita, jotka voivat sisältää paikallisia muuttujia ja tunnisteita. Esimerkki tällaisesta rakenteesta on makromäärittely:

Loop_ax makro xl,x2,yl

Hog bx.bx loopax: lisää bx.yl

Tässä tunniste 1 oopax on paikallinen, määritelty vain tässä makromääritelmässä. Tässä tapauksessa makrokomennon yksinkertaista tekstinkorvausta ohjelman tekstiin ei voida enää suorittaa, koska jos tämä makrokomento suoritetaan kahdesti, tämä johtaa siihen, että ohjelmatekstissä ilmestyy kaksi identtistä nimiötä 1 oorax. Tässä suoritusmuodossa makrogeneraattorin on käytettävä monimutkaisempia tekstinkorvaustekniikoita, samanlaisia ​​kuin kääntäjät käyttävät tunnistamaan syöttöohjelman leksikaaliset elementit, jotta kaikille mahdollisille paikallisille muuttujille ja makrotunnisteille annetaan yksilölliset nimet koko ohjelmassa. Makrot ja makrokäskyt ovat löytäneet käyttöä paitsi kokoonpanokielissä myös monilla korkean tason kielillä. Siellä niitä käsittelee erityinen moduuli, jota kutsutaan kielen esiprosessoriksi (esimerkiksi C-kielen esiprosessori on laajalti tunnettu). Käsittelyperiaate pysyy samana kuin konekieliohjelmissa - esiprosessori suorittaa tekstinkorvaukset suoraan itse lähdeohjelman riveillä. Korkean tason kielissä makromääritykset on erotettava itse lähdeohjelman tekstistä, jotta esiprosessori ei voi sekoittaa niitä syöttökielen syntaktisiin rakenteisiin. Tätä varten käytetään joko erikoissymboleita ja komentoja (esikäsittelijän komentoja), joita ei koskaan voi esiintyä lähdeohjelman tekstissä, tai makromäärityksiä

Lähdeohjelman merkityksettömän osan sisällä - ne sisältyvät kommentteihin (sellainen toteutus on olemassa esimerkiksi Borlandin luomassa Pascal-kääntäjässä). Makrokomennot sitä vastoin voivat esiintyä missä tahansa ohjelman lähdetekstissä, ja niiden syntaktinen kutsu ei välttämättä eroa syöttökielen kutsufunktioista.

On muistettava, että huolimatta kutsusyntaksin samankaltaisuudesta, makrokomennot eroavat olennaisesti toimenpiteistä ja funktioista, koska ne eivät tuota tuloksena olevaa koodia, vaan ovat tekstin korvauksia, jotka suoritetaan suoraan lähdeohjelman tekstissä. Tämän vuoksi funktion ja makron kutsun tulos voi erota merkittävästi.

Katsotaanpa esimerkkiä C:stä. Jos funktio on kuvattu

Int fKint a) ( palauttaa a + a: ) ja samanlainen makrokomento

#define f2(a) ((a) + (a)) niin niiden kutsumisen tulos ei aina ole sama.

Todellakin, kutsut j=fl(i) ja j=f2(i) (jossa i ja j ovat joitakin kokonaislukumuuttujia) johtavat samaan tulokseen. Mutta kutsut j=fl(++i) ja j=f2(++i) antavat erilaisia ​​merkityksiä muuttuja j. Tosiasia on, että koska f2 on makromääritelmä, toisessa tapauksessa suoritetaan tekstin korvaaminen, joka johtaa operaattorien sarjaan j=((++i) + (++i)). Voit nähdä, että tässä järjestyksessä ++i-toiminto suoritetaan kahdesti, toisin kuin fl(++i)-funktiokutsu, jossa se suoritetaan vain kerran.

Koska ohjelmointikielellä kirjoitetun ohjelman tekstiä ei ymmärrä tietokone, se on käännettävä konekielelle. Ohjelman kääntämistä ohjelmointikielestä konekoodikieleksi kutsutaan lähettää(käännös - käännös), ja se suoritetaan erityisillä ohjelmilla - lähetystoiminnan harjoittajat.

Kääntäjiä on kahdenlaisia: tulkkeja ja kääntäjiä.

Tulkki kutsutaan kääntäjäksi, joka suorittaa käsky-käsky-käännöksen (käsky-komento) ja sen jälkeen lähdeohjelman käännetyn käskyn suorittamisen. Kaksi tulkintamenetelmän haittaa:

1. tulkkausohjelman on oltava tietokoneen muistissa koko alkuperäisen ohjelman suoritusprosessin ajan, eli sen on vietävä tietty määrä muistia;

2. saman operaattorin käännösprosessi toistetaan niin monta kertaa kuin tämä komento on suoritettava ohjelmassa.

Kääntäjä on ohjelma, joka muuntaa (kääntää) lähdeohjelman ohjelmaksi (moduuliksi) konekielellä. Tämän jälkeen ohjelma kirjoitetaan tietokoneen muistiin ja vasta sen jälkeen suoritetaan.

Kääntämisen aikana käännös- ja suoritusprosessit erotetaan ajallisesti: ensin lähdeohjelma käännetään kokonaan konekielelle (jonka jälkeen kääntäjän läsnäoloa RAM-muistissa ei tarvita), ja sitten käännetty ohjelma voidaan suorittaa monta kertaa. .

Jokainen kääntäjä ratkaisee seuraavat päätehtävät:

1. Analysoi käännetyn ohjelman ja määrittää, sisältääkö se syntaksivirheitä;

2. Luo tulosohjelman tietokoneen komentokielellä;

3. Varaa muistia tulostusohjelmalle, ts. Jokaiselle muuttujalle, vakiolle, taulukoille ja muille objekteille on varattu oma muistiosansa.

Täten, Kääntäjä(Englanti) kääntäjä- kääntäjä, kerääjä) lukee koko ohjelman täysin, kääntää sen ja luo ohjelmasta täydellisen version konekielellä, joka sitten suoritetaan.

Tulkki(Englanti) tulkki- tulkki, tulkki) kääntää ja suorittaa ohjelman rivi riviltä.

Kun ohjelma on käännetty, lähdeohjelmaa tai kääntäjää ei enää tarvita. Samalla tulkin käsittelemän ohjelman täytyy uudelleen siirtää konekielelle aina, kun ohjelma käynnistetään.

Jokainen tietty kieli on suunnattu joko kokoamiseen tai tulkintaan - riippuen tarkoituksesta, jota varten se on luotu. Esimerkiksi, Pascal käytetään yleensä melko monimutkaisten ongelmien ratkaisemiseen, joissa ohjelman nopeus on tärkeä. Siksi tämä kieli toteutetaan yleensä käyttämällä kääntäjä. Toisella puolella, PERUS luotiin kieleksi aloitteleville ohjelmoijille, joille ohjelman rivi riviltä suorituksesta on kiistattomia etuja. Joskus se on yhdelle kielelle ja kääntäjä, ja tulkki. Tässä tapauksessa voit käyttää tulkkia ohjelman kehittämiseen ja testaamiseen ja sen jälkeen kääntää virheenkorjausohjelma sen suoritusnopeuden parantamiseksi.

Koska ohjelmointikielellä kirjoitettu teksti on tietokoneelle käsittämätöntä, se on käännettävä konekoodiksi. Tätä ohjelman käännöstä ohjelmointikielestä konekoodikieleksi kutsutaan käännökseksi, ja sen suorittavat erikoisohjelmat - kääntäjät.

Kääntäjä on palveluohjelma, joka muuntaa syöteohjelmointikielellä tarjotun lähdeohjelman objektikielellä esitettäväksi työohjelmaksi.

Tällä hetkellä kääntäjät jaetaan kolmeen pääryhmään: kokoajat, kääntäjät ja tulkit.

Assembler on järjestelmän apuohjelma, joka muuntaa symboliset rakenteet konekielisiksi komentoiksi. Assemblereiden erityispiirre on, että ne kääntävät sanatarkasti yhden symbolisen käskyn yhdeksi konekäskyksi. Siten kokoonpanokieli (kutsutaan myös autokoodiksi) on suunniteltu helpottamaan tietokoneen komentojärjestelmän havaitsemista ja nopeuttamaan ohjelmointia tässä komentojärjestelmässä. Ohjelmoijan on paljon helpompi muistaa konekäskyjen muistomerkki kuin niiden binäärikoodi.

Samaan aikaan kokoonpanokieli sisältää konekäskyjen analogien lisäksi monia lisädirektiivejä, jotka helpottavat erityisesti tietokoneresurssien hallintaa, toistuvien fragmenttien kirjoittamista ja monimoduuliohjelmien rakentamista. Siksi kielen ilmaisukyky on paljon rikkaampi kuin pelkkä symbolinen koodauskieli, mikä parantaa huomattavasti ohjelmoinnin tehokkuutta.

Kääntäjä on palveluohjelma, joka kääntää lähdeohjelmointikielellä kirjoitetun ohjelman konekieleksi. Aivan kuten kokoaja, kääntäjä muuntaa ohjelman kielestä toiselle (useimmiten tietyn tietokoneen kielelle). Samaan aikaan lähdekielen komennot eroavat merkittävästi organisaatioltaan ja teholtaan konekielisistä komennoista. On kieliä, joissa yksi lähdekielen komento käännetään 7-10 konekäskyksi. On kuitenkin myös kieliä, joissa jokaisessa komennossa voi olla 100 tai enemmän konekäskyä (esimerkiksi Prolog). Lisäksi lähdekielet käyttävät melko usein tiukkaa tietojen kirjoittelua, joka suoritetaan niiden alustavan kuvauksen kautta. Ohjelmointi ei välttämättä perustu algoritmin koodaamiseen, vaan tietorakenteiden tai luokkien tarkkaan miettimiseen. Tällaisista kielistä kääntämistä kutsutaan yleensä kääntämiseksi, ja lähdekielet luokitellaan yleensä korkean tason ohjelmointikieliksi (tai korkean tason kieliksi). Ohjelmointikielen poistaminen tietokoneen komentojärjestelmästä johti itsenäiseen luomiseen monenlaisia ​​kieliä, jotka keskittyivät tiettyjen ongelmien ratkaisemiseen. Kielet ovat ilmestyneet tieteellisiin laskelmiin, taloudellisiin laskelmiin, tietokantoihin pääsyyn ja muihin.

Tulkki - ohjelma tai laite, joka suorittaa operaattorikohtaisen käännöksen ja lähdeohjelman suorittamisen. Toisin kuin kääntäjä, tulkki ei tuota konekielistä ohjelmaa tulosteena. Kun se on tunnistanut komennon lähdekielellä, se suorittaa sen välittömästi. Sekä kääntäjät että tulkit käyttävät samoja menetelmiä ohjelman lähdekoodin analysointiin. Mutta tulkin avulla voit aloittaa tietojen käsittelyn yhden komennon kirjoittamisen jälkeen. Tämä tekee ohjelmien kehittämis- ja virheenkorjausprosessista joustavamman. Lisäksi ulostulokonekoodin puuttuminen mahdollistaa sen, että ulkoisia laitteita ei "täytetä" lisätiedostoilla, ja itse tulkki voidaan melko helposti mukauttaa mihin tahansa konearkkitehtuuriin, koska se on kehitetty vain kerran laajasti käytetyllä ohjelmointikielellä. Siksi tulkitut kielet, kuten Java Script ja VB Script, ovat yleistyneet. Tulkkien haittana on ohjelman alhainen suoritusnopeus. Tyypillisesti tulkitut ohjelmat toimivat 50-100 kertaa hitaammin kuin alkuperäiset ohjelmat.

Emulaattori on ohjelma tai ohjelmisto- ja laitteistotyökalu, joka mahdollistaa ilman uudelleenohjelmointia suorittaa tietyllä tietokoneella ohjelman, joka käyttää koodeja tai menetelmiä toimintojen suorittamiseen, jotka eroavat annetusta tietokoneesta. Emulaattori on samanlainen kuin tulkki siinä mielessä, että se suorittaa suoraan tietyllä kielellä kirjoitetun ohjelman. Useimmiten se on kuitenkin konekieli tai välikoodi. Molemmat edustavat binäärikoodin ohjeita, jotka voidaan suorittaa välittömästi toimintakoodin tunnistamisen jälkeen. Toisin kuin tekstiohjelmissa, ei tarvitse tunnistaa ohjelman rakennetta tai valita operandeja.

Emulaattoreita käytetään melko usein erilaisiin tarkoituksiin. Esimerkiksi uusia laskentajärjestelmiä kehitettäessä luodaan ensin emulaattori, joka ajaa ohjelmia, jotka on kehitetty tietokoneille, joita ei vielä ole olemassa. Näin voit arvioida komentojärjestelmän ja kehittää perusohjelmistoa jo ennen vastaavan laitteiston luomista.

Hyvin usein emulaattoria käytetään vanhojen ohjelmien suorittamiseen uusissa tietokoneissa. Tyypillisesti uudemmat tietokoneet ovat nopeampia ja niissä on paremmat oheislaitteet. Näin voit emuloida vanhempia ohjelmia tehokkaammin kuin ajaa niitä vanhemmissa tietokoneissa.

Transkooderi on ohjelma tai ohjelmistolaite, joka kääntää yhden tietokoneen konekielellä kirjoitetut ohjelmat toisen tietokoneen konekielisiksi ohjelmiksi. Jos emulaattori on tulkin vähemmän älykäs analogi, niin transkooderi toimii samassa kapasiteetissa kääntäjään nähden. Vastaavasti lähdekoodi (ja yleensä binäärinen) konekoodi tai väliesitys muunnetaan toiseksi vastaavaksi koodiksi yhdellä käskyllä ​​ja ilman lähdeohjelman rakenteen yleistä analyysiä. Transkooderit ovat hyödyllisiä siirrettäessä ohjelmia tietokonearkkitehtuurista toiseen. Niiden avulla voidaan myös rekonstruoida korkean tason kieliohjelmatekstiä olemassa olevasta binäärikoodista.

Makroprosessori on ohjelma, joka korvaa yhden merkkisarjan toisella. Tämä on eräänlainen kääntäjä. Se luo tulostekstiä käsittelemällä lähdetekstissä olevia erityisiä lisäyksiä. Nämä lisäykset on suunniteltu erityisellä tavalla ja kuuluvat makrokieleksi kutsutun kielen rakenteisiin. Makroprosessoreita käytetään usein ohjelmointikielten lisäosina, mikä lisää ohjelmointijärjestelmien toimivuutta. Lähes kaikki kokoonpanolaitteet sisältävät makroprosessorin, mikä lisää koneohjelmien kehittämisen tehokkuutta. Tällaisia ​​ohjelmointijärjestelmiä kutsutaan yleensä makrokokoajiksi.

Makroprosessoreita käytetään myös korkean tason kielillä. Ne lisäävät kielten, kuten PL/1, C, C++, toimivuutta. Makroprosessorit ovat erityisen laajasti käytössä C- ja C++-kielissä, mikä helpottaa ohjelmien kirjoittamista. Makroprosessorit parantavat ohjelmoinnin tehokkuutta muuttamatta kielen syntaksia tai semantiikkaa.

Syntaksi on joukko kielen sääntöjä, jotka määräävät sen elementtien muodostumisen. Toisin sanoen tämä on joukko sääntöjä semanttisesti merkittävien symbolijonojen muodostamiseksi tietyllä kielellä. Syntaksi määritetään säännöillä, jotka kuvaavat kielen käsitteitä. Esimerkkejä käsitteistä ovat: muuttuja, lauseke, operaattori, menettely. Käsitteiden järjestys ja niiden hyväksyttävä käyttö säännöissä määrittää syntaktisesti oikeat rakenteet, jotka muodostavat ohjelmia. Syntaksin avulla määritellään objektien hierarkia, ei tapa, jolla ne ovat vuorovaikutuksessa keskenään. Esimerkiksi lause voi esiintyä vain proseduurissa, lauseke käskyssä, muuttuja voi koostua nimestä ja valinnaisista indekseistä jne. Syntaksia ei liitetä sellaisiin ohjelman ilmiöihin kuin "hyppy ei-olemattomaan nimikkeeseen" tai "muuttujaa, jolla on annettu nimi, ei ole määritelty". Tätä semantiikka tekee.

Semantiikka - säännöt ja ehdot, jotka määrittävät kielen elementtien väliset suhteet ja niiden semanttiset merkitykset sekä kielen syntaktisten rakenteiden merkityksellisen merkityksen tulkinnan. Ohjelmointikielen objektit eivät vain sijoiteta tekstiin tietyn hierarkian mukaisesti, vaan ne myös liitetään toisiinsa muiden käsitteiden kautta, jotka muodostavat erilaisia ​​assosiaatioita. Esimerkiksi muuttuja, jolle syntaksi määrittää kelvollisen sijainnin vain ilmoituksissa ja joissakin lausekkeissa, on tietty tyyppi, sitä voidaan käyttää rajoitetulla määrällä operaatioita, sillä on osoite, koko ja se on ilmoitettava ennen kuin se voidaan ilmoittaa. käyttää ohjelmassa.

Jäsentäjä on kääntäjäkomponentti, joka tarkistaa lähdelausekkeiden yhteensopivuuden tietyn ohjelmointikielen syntaktisten sääntöjen ja semantiikan kanssa. Nimestään huolimatta analysaattori tarkistaa sekä syntaksin että semantiikan. Se koostuu useista lohkoista, joista jokainen ratkaisee omat ongelmansa. Sitä käsitellään tarkemmin kuvattaessa kääntäjän rakennetta.

Jokainen kääntäjä suorittaa seuraavat päätehtävät:

Analysoi käännetyn ohjelman ja määrittää erityisesti, sisältääkö se syntaksivirheitä;

Luo tulosohjelman (kutsutaan usein objektiohjelmaksi) konekäskykielellä;

Varaa muistia objektiohjelmalle.