Jen bych doplnil, ze ADA i PL/SQL se preklada do bytekode kteremu se rika DIANA.
Tento bytekode je sdileny a je vykonavany v kontextu session procesu, stejne jako SQL. Preklad DIANA do nativnich instrukci procesoru je mozny, ale pokud vim tak porad jeste neni v defaltu zapnuty. SQL a PL/SQL jsou dva ruzne jazyky, ktere maji kazdy svoje datove typy.
Vzhledem k tomu jak je to stary(1984), tak bych to tipoval spis na ten AST.
Kdyz jsem to studoval, tak jsem zacal na strankach Pete Finningana
http://www.petefinnigan.com/weblog/archives/00001318.htm
http://www.petefinnigan.com/weblog/archives/00001298.htm
a nakonec jsem skoncil na nejakych cinskych webech. Samotna DIANA je podle me verejny standart. Mnoho procedur v oracle dictionary distribuovano jako DIANA bytecode nebo wrapovany PL/SQL kod. Dekompilace DIANA je zajimava pro ty kdo se zajimaji o vnitrnosti Oracle, k tomu je ovsem potreba jeste umet cinsky nebo alespon rusky.
Kompilace do nativního kódu je až od verze 11.
http://download.oracle.com/docs/cd/B28359_01/appdev.111/b28370/tuning.htm#i48528
Ona je vubec dobra otazka co to vlasne u Oracle znamena ten "nativni kod". Kdyz porovnate obsah catproc.sql pro Linux a AIX tak se podle me moc lisit nebudou. Zadne nativni instrukne neobsahuji. Pokud jde o ulozene procedury, tak tak cely mechanismus funguje tak, ze pomoci OCI vytvorite sdilenou knihovnu .so, tu nekde zaregistrujete, listener spusti externi proces "extproc", ten nacte tu knihovnu a Oracle se bavi v extproc pres IPC. Tzn. ani kdyz si vytvorite ulozenou proceduru v Ccku tak vas Oracle nepusit do sveho adresniho prostoru a nedovoli vam znicit si vlastni databazi. Ve vysledku se muze stat, ze Java stored procedura bude rychlejsi nez "nativni".
Preklad PL/SQL do "nativniho" kodu funguje uz od verze 9i. Je to ale takova divocina, ze neznam nikoho kdo by to realne nasadil. Cely to funguje tak, ze Oracle vezme AST tree, z toho vygeneruje Cckovej zdrojak, ten zkompiluje pomoci gcc a vysledny .so si nahraje k sobe do adresare plsqllib. Od verze 11g uz to snad funguje bez externiho kompilatoru a nativni kod se uklada primo do databaze. Porad to ale jeste neni v defaultu zapnuty.
Interakce mezi PL/SQL interpretrem a enginem databaze probiha pres "well-known" konstanty. Naco jako syscally na Unixu. V oracle ma kazdy object prideleno nejake object_id a kazda tabulka ma navic segment_id. Nektera tahle IDcka jsou pevna a jsou zakompilovana do binarek a zaroven jsou ulozena v katalogu - ve zdrojacich pl/sql baliku.
Včera jsem zkoušel najít ucelenější informace o DIANě, mcode, PVT - bohužel nic moc k dispozici není (minimálně není volně na netu). Diana je něco jako serializované AST + určitá metadata - z DIANY se kód překládá do mcode, který je interpretován v jakémsi virtuálním stroji. Překlad do C ovšem není přímo z DIANy ale z mcode - pokud tomu rozumím správně, a pokud se něco nezměnilo. Tím je to o hodně rychlejší, nicméně stále by to mělo být o dost pomalejší než nativní C kód - což ovšem by pro běžné uložené procedury v PL/SQL nemělo vůbec vadit - hrdlo bývá většinou jinde.