**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.*lähde?*

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.*lähde?*

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. 

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

Tavukoodi on voidaan kääntää konekielelle suorituksen aikana ajonaikaisella kääntämisellä (engl. *just-in-time compilation*, 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.

Katso myös
----------

* Välikieli

Lähteet
-------

1. ↑  What is "managed code"? *docs.microsoft.com*.  20.6.2016. Viitattu 29.2.2020. (englanniksi)
2. ↑  Common Language Infrastructure (CLI) (PDF) *ecma-international.org*. Viitattu 29.2.2020. (englanniksi)

Aiheesta muualla
----------------

* The JavaTM Virtual Machine Specification
* Java Virtual Machine Online Instruction Reference Manual (Arkistoitu – Internet Archive)
* IBM:n developerWorksin artikkeli Java-tavukoodista