Tavukoodi

**Tavukoodi** on välivaiheen koodi, jolle ohjelmointikielen kääntäjä voi kääntää ohjelman lähdekoodin kohdejärjestelmän konekielen sijaan.
Joidenkin ohjelmointikielien ohjelmat käännetää tavukoodiksi joko käännöksen välivaiheena (välikielenä) tai virtuaalikoneella suoritusta varten. 
Tavukoodi on konekieltä muistuttavaa, mutta abstraktimpaa ja koneriippumatonta. Tavukoodille voidaan myös tehdä helpommin turvallisuustarkastus ennen suorittamista.

Tavukoodin kohde on yleensä abstrakti kone, joka ei ole minkään tietyn todellisen koneen kaltainen.

Tavukoodissa yleensä operaatiokoodi on yhden tavun mittainen, mutta käskyn kokonaispituus voi vaihdella.

Tavukoodiksi käännettyjä ohjelmia ajetaan tavukooditulkilla, jota kutsutaan usein virtuaalikoneeksi, koska se muistuttaa käyttäytymiseltään tietokonetta. Etuna on siirrettävyys, samaa tavukoodia voidaan ajaa monilla eri laitteistoilla. Sama etu on tulkattavilla  komentosarjakielillä, mutta tavukoodi on yleensä vähemmän abstraktia, pienempää ja laitteistoläheisempää kuin komentosarjat. Tämä johtaa parempaan suoritusnopeuteen.

Java-kieli käännetään tavukoodiksi, jota ajaa Java-virtuaalikone (JVM).

Usein tavukoodi suoritetaan pinopohjaisella ympäristöllä, mutta esimerkiksi Lua käyttää rekisteripohjaista suoritusympäristöä. Androidille kehitetty Dalvik-virtuaalikone käyttää myös rekisteripohjaista suoritusta. Java-virtuaalikone käyttää tyypillisesti pinopohjaista suoritusta.

.NET-alusta kääntää ohjelmat tavukoodiksi, jota Microsoft kutsuu välikieleksi (, CIL), jota suorittaa ajonaikainen ympäristö , CLR). 

Tavukoodi voidaan kääntää konekielelle suorituksen aikana ajonaikaisella kääntämisellä (, JIT). Käännöksen tulos on mahdollista tallentaa seuraavia käyttökertoja varten.

Myös monet komentosarjakielet, mukaan lukien Perl, PHP ja Python käännetään aluksi tavukoodiksi, jota tavukooditulkki ajaa. Käännös tapahtuu täysin huomaamatta ohjelmaa käynnistettäessä. Käännetty tavukoodi voidaan myös tallentaa kiintolevylle uutta suorituskertaa varten.

## Historiaa

Tavukoodi tarkoitti alun perin esimerkiksi BASIC-tulkissa ohjelman tiivistettyä tallennusmuotoa, jossa käskysanat korvattiin yksinkertaisesti numerolla (esimerkiksi "PRINT" → #05). Koska käskysanoja yleensä oli alle 256, yksi tavu riitti korvaamaan käskysanan. Tästä tuli nimitys tavukoodi. Usein näissä tallennusmuodoissa myös numerot korvattiin sisäisellä esitysmuodolla ja merkkijonot tallennettiin vain kerran. Tämä tavukoodi ei muuttanut ohjelman rakennetta mitenkään ja alkuperäinen esitysmuoto (mahdollisesti numeroiden tarkkaa esitysmuotoa lukuun ottamatta) oli palautettavissa täydellisesti tavukoodista.

Ensimmäinen yleisessä käytössä oleva virtuaaliselle pinotietokoneelle käännettävä välikieli oli USCD Pascal -järjestelmän p-koodi. Pitkään kaikki pinon käyttöön perustuvat välikieliratkaisut tunnettiin nimellä p-koodi vaikkei ne olleetkaan samanlaisia kuin alkuperäinen p-koodi.

Aikojen kuluessa (mahdollisesti ensiksi Java-ohjelmointikielessä) p-koodin tyyppistä välikieltä on alettu kutsua yksinkertaisesti tavukoodiksi ja tämä on korvannut vanhentuneen aiemman tavukoodin määritelmän.

## Lähteet

## Aiheesta muualla
*The JavaTM Virtual Machine Specification
*Java Virtual Machine Online Instruction Reference Manual 
*IBM:n developerWorksin artikkeli Java-tavukoodista