Duonkodo aŭ bajtkodo estas intera kodo - pli abstrakta ol maŝinkodo sed malpli abstrakta ol programlingvo.
Kutime estas traktita kiel la duuma dosiero kiu enhavas ruligelban programon simila al objekta modulo, kiu estas dosiero por la kompililo kaj kies enhavo estas la objekkodo aŭ maŝinkodo.
La duonkodo estas fojfoje nomita bajtkodo (de angla byte) ĉar kutime ĉiu operaciokodo havas longon de unu bajto, eble sekvata de parametroj. Ĉiu instrukcio havas instrukcion inter 0 kaj 255 sekvita de parametroj kiel la registroj aŭ la memorodirektoj. Tiu estus la priskribo de tipa kazo, sed la precize priskribo de duonkodo ege dependas de la lingvo.
La programoj en duonkodo devas esti interpretitaj de interpretilo (ĝenerale nomita virtuala maŝino, pro tio ke ĝi estas analoga al komputilo). Ĝia avantaĝo estas ĝia portebleco: la sama binara kodo eblas ekzekutita en diversaj platformoj kaj arkitekturoj. Estas la sama avantaĝo kiun prezentas la interpretitaj lingvoj. Tamen, ĉar la duonkodo estas ĝenerale malpli abstrakta, pli kompakta kaj pli orientita al la maŝino, ĝia rapideco estas pli bona ol tiu de la interpretitaj lingvoj. Pro tiu plibonigo de la rapideco, multaj interpretitaj lingvoj, fakte estas kompilitaj por konverti ilin al duonkodo kaj poste estas ekzekutitaj de interpretilo de duonkodo. Inter tiuj lingvoj trovas Perl, PHP kaj Python. La kodo de Javo estas disponigita kiel duonkodo al la maŝino, kiu uzas kompililon laŭbezone (angle: just-in-time) por traduki bajtkodo al maŝinkodo ĵus antaŭ ĝia ruliĝo.