Vuonna tietojenkäsittelytiede , eli kääntäjä on ohjelma , joka muuntaa lähdekoodin osaksi kohdekoodilla . Lähdekoodi on yleensä kirjoitettu ohjelmointikielellä ( lähdekielellä ), se on korkean abstraktin tason ja ihmisten helposti ymmärrettävissä. Kohdekoodi kirjoitetaan yleensä alemman tason kielellä (nimeltään kohdekieli ), esimerkiksi kokoonpanokielellä tai konekielellä , koneen suorittaman ohjelman luomiseksi .
Kääntäjä suorittaa seuraavat toiminnot: leksikaalinen analyysi , esikäsittely ( esikäsittely ), syntaktinen analyysi ( jäsentäminen ), semanttinen analyysi ja optimoitu koodin luonti . Kääntämistä seuraa usein linkin muokkausvaihe suoritettavan tiedoston luomiseksi. Kun käännetty ohjelma (kohdekoodi) suoritetaan tietokoneella, jonka prosessori tai käyttöjärjestelmä eroaa kääntäjän prosessista tai käyttöjärjestelmästä, sitä kutsutaan ristikokoelmaksi .
On olemassa kaksi kokoamisvaihtoehtoa:
vastaava kokoonpano koodi
ohjelma käännöksen jälkeen - konekieli näytetään heksadesimaaleina
Varhainen tietokoneohjelmisto kirjoitettiin kokoonpanokielellä . Ohjelmointikielet korkeimmalla tasolla ( abstraktio kerrokset ) ei keksitty vasta hyödyt kyky uudelleenkäyttö ohjelmiston erilaisten prosessorien ovat yhä tärkeämpiä kuin kustannukset kirjallisesti 'kääntäjä. Hyvin rajallinen muisti kapasiteettia varhaisen tietokoneita myös aiheutti useita teknisiä ongelmia kehittämiseen kääntäjät.
1950 - luvun lopulla koneista riippumattomat ohjelmointikielet ilmestyivät ensin. Myöhemmin kehitetään useita kokeellisia kääntäjiä. Ensimmäisen kääntäjän, A-0-järjestelmän (A-0-kieltä varten) kirjoitti Grace Hopper vuonna 1952. FORTRAN- tiimin, jota johti IBM : n John Backus , uskotaan kehittäneen ensimmäisen täyden kääntäjän vuonna 1957. COBOL , kehitetty vuonna 1959 ja perustuu suurelta osin Grace Hopperin ideoihin, on ensimmäinen kieli, joka on koottu useille arkkitehtuureille.
Ajatus korkeamman abstraktiotason kielen käytöstä levisi nopeasti useilla sovellusalueilla . Uudempien ohjelmointikielien tukeman toiminnallisuuden lisääntyessä ja tietokonearkkitehtuurin lisääntyessä monimutkaisuus kääntäjistä on tullut yhä monimutkaisempia.
Vuonna 1962 Tim Hart ja Mike Levin Massachusettsin teknillisessä instituutissa (MIT) loivat Lisp : lle ensimmäisen " itse isännöimän " kääntäjän, joka pystyy kokoamaan kohdekoodiksi oman korkean tason kielellä ilmaistun lähdekoodin . Vuodesta 1970 , se tuli hyvin yleinen kehittää kääntäjä kielellä aiottiin koota, joten Pascal ja C erittäin suosittu kehitys kieltä.
Voimme käyttää myös kääntäjien kehittämiseen erikoistunutta kieltä tai ympäristöä: puhumme metakokoelutyökalujen aikana ja käytämme esimerkiksi kääntäjää . Tämä menetelmä on erityisen hyödyllinen uuden kielen ensimmäisen kääntäjän tekemisessä; mukautetun ja tiukan kielen helpottaa sitten kehitystä ja evoluutiota.
Kääntäjän päätehtävä on tuottaa oikea objektikoodi, joka toimii tietokoneella. Useimmat kääntäjät mahdollistavat koodin optimoinnin, toisin sanoen pyrkivät parantamaan suoritusnopeutta tai vähentämään ohjelman muistin käyttöä.
Lähdekieli on yleensä "korkeampi taso" kuin kohdekieli, eli siinä on korkeampi abstraktiotaso. Lisäksi ohjelman lähdekoodi jaetaan yleensä useisiin tiedostoihin.
Kääntäjä toimii analyysisynteesillä: sen sijaan, että jokainen lähdekielen rakenne korvattaisiin vastaavalla kohdekielen rakenteiden sarjalla, se alkaa analysoimalla lähdeteksti rakentaakseen väliesityksen, jonka se puolestaan kääntää kohdekieleksi. .
Kääntäjä on jaettu vähintään kahteen osaan: etuosa (tai etuosa), jota joskus kutsutaan "tynkäksi", joka lukee lähdetekstin ja tuottaa väliesityksen; ja takaosa (tai loppuosa), joka kulkee tämän esityksen läpi kohdetekstin tuottamiseksi. Ihanteellisessa kääntäjässä etuosa on riippumaton kohdekielestä, kun taas takaosa on riippumaton lähdekielestä. Jotkut kääntäjät suorittavat huomattavan prosessoinnin väliosassa, josta tulee itsenäinen keskusosa riippumatta sekä lähdekielestä että kohdekoneesta. Voimme siis kirjoittaa kääntäjiä useille kielille ja arkkitehtuureille jakamalla keskiosan, johon kiinnitämme etuosan kieltä kohden ja takaosan arkkitehtuuria kohden.
Laatimisvaiheet sisältävät:
Etuosan muodostavat leksikaalinen, syntaktinen ja semanttinen analyysi, välikielen läpi kulkeminen ja optimointi. Koodien luominen ja linkittäminen on viimeinen osa.
Nämä eri vaiheet tarkoittavat, että kääntäjät ovat edelleen tutkimuksen kohteena.
Toteutus (konkreettinen toteutus) ohjelmointikielen voidaan tulkita tai laatia. Tämä toteutus on kääntäjä tai tulkki , ja ohjelmointikielellä voidaan kääntää yksi toteutus ja toinen tulkita.
Puhumme kääntämisestä, jos käännös tehdään ennen suoritusta (silmukan periaate käännetään sitten kerran), ja tulkinnasta, jos käännös on valmis vaihe vaiheelta suorituksen aikana (silmukan elementit tutkitaan sitten jokaiselle käytölle) .
Tulkinta on hyödyllistä virheenkorjauksessa tai jos resurssit ovat rajalliset. Kokoaminen on suositeltavaa toiminnassa.
Ensimmäiset kääntäjät kirjoitettiin suoraan kokoonpanokielellä , alkeellisella symbolikielellä, joka vastasi kohdeprosessorin ohjeita ja joitain hieman kehittyneempiä ohjausrakenteita. Tämä symbolinen kieli on koottava (ei käännetty) ja linkitettävä suoritettavan version saamiseksi. Yksinkertaisuuden vuoksi yksinkertainen ohjelma riittää muuntamaan sen koneohjeiksi.
Nykyiset kääntäjät kirjoitetaan yleensä sillä kielellä, jonka ne on tarkoitettu koottavaksi; esimerkiksi C-kääntäjä kirjoitetaan C-muodossa, SmallTalk SmallTalkissa, Lisp Lispissä jne. Kääntäjän toteutuksessa otetaan ratkaiseva askel, kun X-kielen kääntäjä on riittävän täydellinen kääntääkseen itsensä: silloin se ei enää riipu toisesta tuotettavasta kielestä (jopa kokoajasta).
Kääntäjävirhettä on vaikea havaita. Esimerkiksi, jos C-kääntäjällä on vika, C-ohjelmoijat pyrkivät luonnollisesti kyseenalaistamaan oman lähdekoodinsa, ei kääntäjää. Mikä pahempaa, jos tämä buginen kääntäjä (versio V1) kääntää muun kuin bugisen kääntäjän (versio V2), V2-kääntäjän käännetty suoritettava tiedosto (V1: n toimesta) voi olla viallinen. Silti sen lähdekoodi on hyvä. Bootstrap vaatii siksi kerääjiä ohjelmoijia ohitus viat nykyisten kerääjiä.
Luokittelu kerääjiä lukumäärästä kulkee johtuu puute laitteiston resursseja tietokoneita. Kääntäminen on kallista prosessia, ja varhaisissa tietokoneissa ei ollut tarpeeksi muistia pitämään ohjelmaa, jonka oli tehtävä tämä työ. Kääntäjät jaettiin aliohjelmiin, jotka kukin lukivat lähteestä täydentääkseen leksikaalisen analyysin , jäsentämisen ja semanttisen analyysin eri vaiheet .
Kykyä yhdistää kaikki yhdeksi passiksi pidettiin etuna, koska se yksinkertaistaa kääntäjän kirjoittamista, joka yleensä toimii nopeammin kuin monipäästöinen kääntäjä. Varhaisjärjestelmien rajallisten resurssien vuoksi monet kielet on suunniteltu erityisesti siten, että ne voidaan koota yhdellä kertaa (esimerkiksi Pascalin kieli ).
Ohjelman epälineaarinen rakenneJoissakin tapauksissa tämä tai toinen kielen ominaisuus vaatii sen kääntäjän suorittamaan useamman kuin yhden siirron. Harkitse esimerkiksi lähteen rivillä 20 olevaa lausetta, joka vaikuttaa lauseen käännökseen rivillä 10 . Tällöin ensimmäisen läpikulun tulisi kerätä tietoja ilmoituksista, kun taas varsinainen käännös tapahtuu vasta seuraavan läpikäynnin aikana.
OptimoinnitKääntäjän jakaminen pieniin ohjelmiin on tekniikka, jota tutkijat käyttävät, jotka ovat kiinnostuneita tuottamaan tehokkaita kääntäjiä. Tämä johtuu siitä, että yhden kierroksen kokoamisen haittapuoli on, että se ei salli useimpien korkealaatuisen koodin luomiseen tarvittavien kehittyneiden optimointien suorittamista. Sitten on vaikea laskea tarkalleen optimoivan kääntäjän suorittamien läpikertojen määrää.
Korjauksen esittelyn jakaminenPienien ohjelmien sarjan oikeellisuuden osoittaminen vaatii usein vähemmän vaivaa kuin vastaavan suuremman yksittäisen ohjelman oikeellisuuden osoittaminen.
Kääntäjä-kääntäjä on ohjelma, joka voi luoda minkä tahansa tai kaikki kääntäjän osat. Voit esimerkiksi koota kielen perusasiat ja sitten kääntää loput kielen perusteiden avulla.
Käyttötavasta ja koneesta, joka suorittaa ohjelman, kannattaa ehkä optimoida suorituksen nopeus, muistin käyttö, energiankulutus, siirrettävyys muihin arkkitehtuureihin tai kokoamisaika.
Ristikääntäminen viittaa kääntöketjuihin, jotka pystyvät kääntämään lähdekoodin objektikoodiksi, jonka prosessoriarkkitehtuuri eroaa siitä, missä käännös tehdään. Näitä ketjuja käytetään pääasiassa teollisessa tietotekniikassa ja sulautetuissa järjestelmissä .
Jotkut kääntäjät kääntävät lähdekielen virtuaalikoneen kieleksi (kutsutaan välikieleksi), toisin sanoen virtuaalikoneen suorittamaan koodiin (yleensä binaariseen) : ohjelma, joka jäljittelee tietokoneen päätoimintoja. Tällaisten kielten sanotaan olevan puolittain käännettyjä. Ohjelman siirtäminen vaatii siis vain virtuaalikoneen, joka on itse asiassa joko tulkki tai toinen kääntäjä (monikohdekääntäjille). Siten, kerääjiä kääntää Pascal osaksi P-koodi, Modula 2 M:-koodi, Simula osaksi S-koodi, tai viime aikoina Java-koodi tulee Java bytecode (objekti-koodi).
Lyhyt ohjelma Scalassa.
Tuloksena oleva Java-tavukoodi, joka voidaan suorittaa virtuaalikoneella.
Kun kokoelma perustuu tavukoodiin, puhumme kokoamisesta lennossa . Sitten käytämme virtuaalikoneita, kuten Java-virtuaalikone , jolla voimme erityisesti kääntää Scalan . Joillakin kielillä on mahdollista käyttää kirjastoa, joka sallii käyttäjän kirjoittaman koodin kokoamisen lennossa, esimerkiksi C: ssä libtcc: llä.
Muut kääntäjät kääntävät koodin yhdeltä ohjelmointikieleltä toiselle. Niitä kutsutaan transcompilers , tai jopa anglismi, transpilers tai transpilators. Esimerkiksi LaTeX- ohjelmisto sallii LaTeX : n lähdekoodista hankkia tiedoston PDF- muodossa (esimerkiksi komennolla pdflatex Ubuntun alla ) tai HTML: nä . Toinen esimerkki, LLVM on kirjasto, joka auttaa rakentamaan kääntäjiä, jota AMD käyttää myös kehittämään "HIP", CUDA- koodin kääntäjä (NVIDIA-erityinen kieli ja laajalti käytetty) sen ajamiseksi AMD-grafiikkaprosessoreilla.
Lähdekoodi.
Käännöksen jälkeen saatu koodi.
Esikatselu pdf-dokumentista.
Jotkut kääntäjät kääntävät (käyttäjän syöttämän) lähdeohjelman vähitellen tai vuorovaikutteisesti konekoodiksi. Voimme mainita esimerkkinä joitain Common Lisp -toteutuksia ( kuten SBCL (en) ).