Obsah
2. Překlad programové smyčky typu while
2.1 Zdrojový kód příkladu test30.lua
2.2 Překlad příkladu test30.lua do mezijazyka LuaJITu
3. Překlad programové smyčky typu repeat-until
3.1 Zdrojový kód příkladu test31.lua
3.2 Překlad příkladu test31.lua do mezijazyka LuaJITu
4. Programová smyčka typu while a příkaz break
4.1 Zdrojový kód příkladu test32.lua
4.2 Překlad příkladu test32.lua do mezijazyka LuaJITu
5. Programová smyčka typu repeat-until a příkaz break
5.1 Zdrojový kód příkladu test33.lua
5.2 Překlad příkladu test33.lua do mezijazyka LuaJITu
6. Průchod všemi prvky pole ve smyčce while s využitím funkce next()
6.1 Zdrojový kód příkladu test34.lua
6.2 Překlad příkladu test34.lua do mezijazyka LuaJITu
7. Programová smyčka for a for-each
7.1 Počítaná programová smyčka typu for
7.2 Smyčka typu for-each při průchodu polem
7.3 Smyčka typu for-each při průchodu asociativním polem
8. Zdrojové kódy všech pěti dnešních demonstračních příkladů
1. LuaJIT – Just in Time překladač pro programovací jazyk Lua (6 – překlad programových smyček do mezijazyka LuaJITu)
Velmi důležitou součástí mezijazyka používaného Just in Time překladačem LuaJIT jsou instrukce použité při implementaci programových smyček. Autor LuaJITu totiž (velmi správně) usoudil, že většina hot-spotů, tedy těch částí kódu, které se vyplatí překládat JIT překladačem, se nachází právě v programových smyčkách. Kvůli zjednodušení práce JIT překladače tedy mezijazyk LuaJITu obsahuje poměrně velké množství speciálních instrukcí použitých právě při překladu programových smyček, i když mnohé jiné bajtkódy si vystačí s prostými podmíněnými a nepodmíněnými skoky. Konstrukci programových smyček si ukážeme na pěti demonstračních příkladech, v nichž budou implementovány jak jednoduché smyčky typu while a repeat-until, tak i poněkud složitější smyčky, v nichž je použit příkaz break (ten je v programovacím jazyku Lua samozřejmě podporován). V přeložených kódech se setkáme mj. i s následujícími instrukcemi (z nichž většinu již známe):
# | Instrukce | Operandy | Popis |
---|---|---|---|
1 | JMP | adresa | nepodmíněný skok, popř. podmíněný skok, pokud mu předchází instrukce I* |
2 | ISLT | slot, slot | následuje skok provedený při splnění podmínky A < D |
3 | ISGE | slot, slot | následuje skok provedený při splnění podmínky A ≥ D |
4 | ISLE | slot, slot | následuje skok provedený při splnění podmínky A ≤ D |
5 | ISGT | slot, slot | následuje skok provedený při splnění podmínky A > D |
6 | ISEQV | slot, slot | následuje skok provedený při splnění podmínky A = D |
7 | ISNEV | slot, slot | následuje skok provedený při splnění podmínky A ≠ D |
8 | ISEQN | slot, konstanta | následuje skok provedený při splnění podmínky A = konstanta |
9 | ISNEN | slot, konstanta | následuje skok provedený při splnění podmínky A ≠ konstanta |
10 | ISEQP | slot, pri | následuje skok provedený při splnění podmínky A = pri_type |
11 | ISNEP | slot, pri | následuje skok provedený při splnění podmínky A ≠ pri_type |
12 | ISEQS | slot, string | následuje skok provedený při splnění podmínky A = string |
13 | ISNES | slot, string | následuje skok provedený při splnění podmínky A ≠ string |
14 | IST | slot | následuje skok provedený při splnění podmínky A = true |
15 | ISF | slot | následuje skok provedený při splnění podmínky A = false |
16 | ITERC | base, lit, lit | volání iterátoru A s parametry v A+1 a A+2 |
17 | ITERN | base, lit, lit | varianta instrukce ITERC pro funkci next() či pairs() |
18 | LOOP | rbase, jump | použití při JITování a detekci hot-spotů, neprovádí se skok! |
19 | ITERL | base, jump | iterátor pro smyčku typu for-each, kontrola na hodnotu odlišnou od nil a podmíněný skok |
20 | ISNEXT | base, jump | použito se speciální instrukcí ITERN pro podmíněný skok |
Použití těchto instrukcí, především pak instrukcí IS*, JMP a LOOP, si ukážeme na pěti demonstračních příkladech popsaných v navazujících kapitolách.
2. Překlad programové smyčky typu while
Nejjednodušším typem programové smyčky v jazyce Lua je smyčka typu while, tj. taková smyčka, v níž se podmínka pro její ukončení testuje před začátkem každé další iterace. Takto zkonstruovaná smyčka nemusí proběhnout ani jedenkrát (pokud je již před první iterací podmínka neplatná) a současně se jedná o zcela univerzální programovou smyčku. V případě LuaJITu je překlad této smyčky proveden podle jednotné šablony následujícím způsobem:
+---> IS?? ; podmínka odvozená z invertované podmínky zapsané ve zdrojovém kódu | JMP --+ ; podmíněný skok ZA konec programové smyčky | LOOP | ; označení generické programové smyčky (pro detekci hot spotů) | ? | | ? | ; instrukce tvořící tělo smyčky | ? | ; instrukce tvořící tělo smyčky | ? | ; instrukce tvořící tělo smyčky | ? | | ? | ; end loop +---- JMP | ; nepodmíněný skok na začátek programové smyčky <-----+
Pseudoinstrukce IS?? značí jednu ze čtrnácti instrukcí vypsaných v tabulce uvedené v první kapitole. Za povšimnutí stojí otočení podmínky a taktéž použití speciální instrukce LOOP, která sice zdánlivě nemá žádný význam, ve skutečnosti se však jedná o místo v mezijazyku, kam bude možné vložit JITovaný kód.
2.1 Zdrojový kód příkladu test30.lua
Otestování způsobu překladu programové smyčky typu while bude velmi jednoduché:
-- -- LuaJIT: demonstrační příklad číslo 30. -- -- Programová smyčka typu while. -- -- počitadlo smyčky local i = 10 -- programová smyčka typu while while i >= 0 do print(i) i = i - 1 end -- finito
2.2 Překlad příkladu test30.lua do mezijazyka LuaJITu
V přeložené sekvenci instrukcí skutečně můžeme vidět šablonu, o níž jsme se zmínili na začátku této kapitoly:
; Překlad demonstračního příkladu test30.lua ; do IR využívaného virtuálním strojem a JIT ; překladačem LuaJIT. ; metadata se základními informacemi o zdrojovém kódu, ; který byl použit pro vygenerování tohoto IR -- BYTECODE -- test30.lua:0-22 ; počitadlo smyčky ; local i = 10 0001 KSHORT 0 10 ; inicializace počitadla hodnotou 10 ; programová smyčka typu while ; while i>=0 do 0002 => KSHORT 1 0 ; uložit konstantu 0 do proměnné #1 0003 ISGT 1 0 ; porovnání počitadla s konstantou 0 0004 JMP 1 => 0011 ; podmíněný skok ZA konec programové smyčky 0005 LOOP 1 => 0011 ; označení generické programové smyčky (pro detekci hot spotů) ; print(i) 0006 GGET 1 0 ; získání reference na funkci se jménem "print" 0007 MOV 2 0 ; bude se tisknout hodnota proměnné i (proměnná #0) 0008 CALL 1 1 2 ; volání funkce print() ; i = i - 1 0009 SUBVN 0 0 0 ; odečtení jedničky (konstanta #0) od proměnné i (proměnná #0) ; end loop 0010 JMP 1 => 0002 ; nepodmíněný skok na začátek programové smyčky ; každý program je automaticky ukončen následující instrukcí 0011 => RET0 0 1 ; konec
3. Překlad programové smyčky typu repeat-until
Programová smyčka typu repeat-until je zrcadlovým obrazem již výše zmíněné programové smyčky while. Podmínka je zde testována na konci každé iterace (tato smyčka tedy proběhne minimálně jedenkrát) a navíc se při splnění podmínky smyčka ukončí, zatímco u smyčky typu while bylo splnění podmínky příznakem, že se má pokračovat: spustit další iterace (mnemotechnická pomůcka – u obou smyček znamená splnění podmínky pokračování běhu programu směrem dolů). Programová smyčka typu repeat-until se opět překládá podle jednotné šablony:
+---> LOOP ; označení generické programové smyčky (pro detekci hot spotů) | ? | ? ; instrukce tvořící tělo smyčky | ? ; instrukce tvořící tělo smyčky | ? ; instrukce tvořící tělo smyčky | ? | IS?? ; podmínka odvozená z podmínky zapsané ve zdrojovém kódu +---- JMP ; podmíněný skok na začátek programové smyčky
Instrukční kód je zde o jednu instrukci kratší, protože není nutné implementovat (závěrečný) nepodmíněný skok.
3.1 Zdrojový kód příkladu test31.lua
Ukázka použití programové smyčky typu repeat-until je opět velmi jednoduchá (povšimněte si, že výstup tohoto programu se poněkud liší od výstupu programu předchozího – proč?):
-- -- LuaJIT: demonstrační příklad číslo 31. -- -- Programová smyčka typu repeat-until. -- -- počitadlo smyčky local i = 10 -- Programová smyčka typu repeat-until repeat print(i) i = i - 1 until i==0 -- finito
3.2 Překlad příkladu test31.lua do mezijazyka LuaJITu
Po překladu do mezijazyka LuaJITu nalezneme ve vytvořené sekvenci instrukcí jak instrukci LOOP, tak i konec smyčky tvořený podmínkou a podmíněným skokem:
; Překlad demonstračního příkladu test31.lua ; do IR využívaného virtuálním strojem a JIT ; překladačem LuaJIT. ; metadata se základními informacemi o zdrojovém kódu, ; který byl použit pro vygenerování tohoto IR -- BYTECODE -- test31.lua:0-22 ; počitadlo smyčky ; local i = 10 0001 KSHORT 0 10 ; inicializace počitadla hodnotou 10 ; programová smyčka typu repeat-until ; repeat 0002 => LOOP 1 => 0009 ; označení generické programové smyčky (pro detekci hot spotů) ; print(i) 0003 GGET 1 0 ; získání reference na funkci se jménem "print" 0004 MOV 2 0 ; bude se tisknout hodnota proměnné i (proměnná #0) 0005 CALL 1 1 2 ; volání funkce print() ; i = i - 1 0006 SUBVN 0 0 0 ; odečtení jedničky (konstanta #0) od proměnné i (proměnná #0) 0007 ISNEN 0 1 ; porovnání počitadla s konstantou ; until i==0 0008 JMP 1 => 0002 ; podmíněný skok na začátek programové smyčky ; (end loop) ; každý program je automaticky ukončen následující instrukcí 0009 => RET0 0 1 ; konec
4. Programová smyčka typu while a příkaz break
V programovacím jazyku Lua je možné předčasně ukončit smyčku typu while příkazem break, který bývá typicky použit uvnitř nějaké podmínky. Při překladu takto vytvořené smyčky se opět využívá jednotná šablona:
+---> IS?? ; podmínka odvozená z invertované podmínky zapsané ve zdrojovém kódu | JMP --+ ; podmíněný skok ZA konec programové smyčky | LOOP | ; označení generické programové smyčky (pro detekci hot spotů) | ? | | ? | ; instrukce tvořící tělo smyčky | ? | ; instrukce tvořící tělo smyčky | ? | ; instrukce tvořící tělo smyčky | ? | | JMP --+ ; break: nepodmíněný skok ZA konec programové smyčky | ? | | ? | ; instrukce tvořící tělo smyčky | ? | ; instrukce tvořící tělo smyčky | ? | ; instrukce tvořící tělo smyčky | ? | ; end loop +---- JMP | ; nepodmíněný skok na začátek programové smyčky <-----+
4.1 Zdrojový kód příkladu test32.lua
V dnešním třetím demonstračním příkladu si ukážeme podmíněný výskok (ukončení) nekonečné smyčky tvořené příkazem while true:
-- -- LuaJIT: demonstrační příklad číslo 32. -- -- Programová smyčka typu while s příkazem break. -- -- počitadlo smyčky local i = 10 -- programová smyčka typu while while true do print(i) i = i - 1 if i == 0 then break end end -- finito
4.2 Překlad příkladu test32.lua do mezijazyka LuaJITu
Na začátku této kapitoly prezentovaná šablona je v kódu třetího demonstračního příkladu přeloženého do mezijazyka poměrně dobře viditelná:
; Překlad demonstračního příkladu test32.lua ; do IR využívaného virtuálním strojem a JIT ; překladačem LuaJIT. ; metadata se základními informacemi o zdrojovém kódu, ; který byl použit pro vygenerování tohoto IR -- BYTECODE -- test32.lua:0-25 ; počitadlo smyčky ; local i = 10 0001 KSHORT 0 10 ; inicializace počitadla hodnotou 10 ; programová smyčka typu while ; while true do 0002 => LOOP 1 => 0011 ; označení generické programové smyčky (pro detekci hot spotů) ; print(i) 0003 GGET 1 0 ; získání reference na funkci se jménem "print" 0004 MOV 2 0 ; bude se tisknout hodnota proměnné i (proměnná #0) 0005 CALL 1 1 2 ; volání funkce print() ; i = i - 1 0006 SUBVN 0 0 0 ; odečtení jedničky (konstanta #0) od proměnné i (proměnná #0) ; if i == 0 then 0007 ISNEN 0 1 ; porovnání počitadla s konstantou 0 ; "else" 0008 JMP 1 => 0002 ; podmíněný skok na začátek programové smyčky ; break 0009 JMP 1 => 0011 ; nepodmíněný skok ZA konec programové smyčky ; end loop 0010 JMP 1 => 0002 ; nepodmíněný skok na začátek programové smyčky ; každý program je automaticky ukončen následující instrukcí 0011 => RET0 0 1 ; konec
5. Programová smyčka typu repeat-until a příkaz break
Příkazem break je samozřejmě možné ukončit i provádění programové smyčky typu repeat-until. Opět se nejdříve podívejme na to, podle jaké jednotné šablony se zdrojový kód překládá do mezijazyka LuaJITu:
+---> LOOP ; označení generické programové smyčky (pro detekci hot spotů) | ? | ? ; instrukce tvořící tělo smyčky | ? ; instrukce tvořící tělo smyčky | ? ; instrukce tvořící tělo smyčky | ? | JMP --+ ; break: nepodmíněný skok ZA konec programové smyčky | ? | | ? | ; instrukce tvořící tělo smyčky | ? | ; instrukce tvořící tělo smyčky | ? | ; instrukce tvořící tělo smyčky | ? | | IS?? | ; podmínka odvozená z podmínky zapsané ve zdrojovém kódu +---- JMP | ; podmíněný skok na začátek programové smyčky <-----+
5.1 Zdrojový kód příkladu test33.lua
Ve čtvrtém demonstračním příkladu je nekonečná smyčka typu repeat-until ukončena příkazem break při splnění zapsané podmínky:
-- -- LuaJIT: demonstrační příklad číslo 33. -- -- Programová smyčka typu repeat-until s příkazem break. -- -- počitadlo smyčky local i = 10 -- Programová smyčka typu repeat-until repeat print(i) i = i - 1 if i == 0 then break end until false -- finito
5.2 Překlad příkladu test33.lua do mezijazyka LuaJITu
Následuje výpis sekvence vzniklé po překladu tohoto demonstračního příkladu do mezijazyka:
; Překlad demonstračního příkladu test33.lua ; do IR využívaného virtuálním strojem a JIT ; překladačem LuaJIT. ; metadata se základními informacemi o zdrojovém kódu, ; který byl použit pro vygenerování tohoto IR -- BYTECODE -- test33.lua:0-25 ; počitadlo smyčky ; local i = 10 0001 KSHORT 0 10 ; inicializace počitadla hodnotou 10 ; programová smyčka typu repeat-until ; repeat 0002 => LOOP 1 => 0012 ; označení generické programové smyčky (pro detekci hot spotů) ; print(i) 0003 GGET 1 0 ; získání reference na funkci se jménem "print" 0004 MOV 2 0 ; bude se tisknout hodnota proměnné i (proměnná #0) 0005 CALL 1 1 2 ; volání funkce print() ; i = i - 1 0006 SUBVN 0 0 0 ; odečtení jedničky (konstanta #0) od proměnné i (proměnná #0) ; if i == 0 then 0007 ISNEN 0 1 ; porovnání počitadla s konstantou 0 ; "else" 0008 JMP 1 => 0010 ; podmíněný skok za if ; break 0009 JMP 1 => 0012 ; nepodmíněný skok ZA konec programové smyčky ; end 0010 => JMP 1 => 0011 ; nepodmíněný skok NA konec programové smyčky ; until false 0011 => JMP 1 => 0002 ; nepodmíněný skok na začátek programové smyčky ; každý program je automaticky ukončen následující instrukcí 0012 => RET0 0 1 ; konec
6. Průchod všemi prvky pole ve smyčce while s využitím funkce next()
Velmi často se v reálných programech prochází všemi prvky pole či tabulky. Pro tento účel lze využít programovou smyčku typu while a funkci next(), která po svém zavolání vrátí následující prvek v tabulce a současně i index či klíč dalšího prvku. Pokud již další prvek neexistuje, vrátí se namísto indexu/klíče hodnota nil.
6.1 Zdrojový kód příkladu test34.lua
Ukažme si základní použití smyčky while a funkce next(). Jak je ze zdrojového kódu patrné, nejedná se o příliš elegantní řešení:
-- -- LuaJIT: demonstrační příklad číslo 34. -- -- Práce s tabulkami: -- * vytvoření a inicializace neprázdné tabulky -- * programová smyčka typu while využívající -- funkci next použitá pro průchod tabulkou -- -- vytvoření desetiprvkové tabulky local tbl = {10, 9, 8, 7, 6, 5, 4, 3, 2, 1} -- inicializace - získání prvního prvku a jeho indexu z tabulky local index,val = next(tbl, nil) -- programová smyčka typu while while index do print(index,val) index,val = next(tbl, index) end -- finito
6.2 Překlad příkladu test34.lua do mezijazyka LuaJITu
Zajímavé je, že pro překlad demonstračního příkladu test34.lua do mezijazyka není použita žádná speciální „smyčková“ instrukce, samozřejmě kromě instrukce LOOP:
; Překlad demonstračního příkladu test34.lua ; do IR využívaného virtuálním strojem a JIT ; překladačem LuaJIT. ; metadata se základními informacemi o zdrojovém kódu, ; který byl použit pro vygenerování tohoto IR -- BYTECODE -- test34.lua:0-28 ; local tbl = {10, 9, 8, 7, 6, 5, 4, 3, 2, 1} 0001 TDUP 0 0 ; vytvoření a inicializace tabulky (pole) ; local index,val = next(tbl, nil) 0002 GGET 1 1 ; získání reference na funkci se jménem "next" 0003 MOV 2 0 ; prvním argumentem funkce "next" je tabulka 0004 KPRI 3 0 ; druhým argumentem funkce "next" je konstanta nil 0005 CALL 1 3 3 ; zavolání funkce next ; while index do 0006 => ISF 1 ; podmínka pro ukončení programové smyčky 0007 JMP 3 => 0020 ; podmíněný skok ZA konec programové smyčky 0008 LOOP 3 => 0020 ; označení generické programové smyčky (pro detekci hot spotů) ; print(index,val) 0009 GGET 3 2 ; získání reference na funkci se jménem "print" 0010 MOV 4 1 ; bude se tisknout index 0011 MOV 5 2 ; a současně i hodnota prvku 0012 CALL 3 1 3 ; volání funkce print() ; index,val = next(tbl, index) 0013 GGET 3 1 ; získání reference na funkci se jménem "next" 0014 MOV 4 0 ; prvním argumentem funkce "next" je tabulka 0015 MOV 5 1 ; druhým argumentem funkce "next" je index 0016 CALL 3 3 3 ; zavolání funkce next 0017 MOV 2 4 ; uložení návratových hodnot do správných slotů 0018 MOV 1 3 ; uložení návratových hodnot do správných slotů ; end loop 0019 JMP 3 => 0006 ; nepodmíněný skok na začátek programové smyčky ; každý program je automaticky ukončen následující instrukcí 0020 => RET0 0 1 ; konec
7. Programová smyčka for a for-each
V programovacím jazyku Lua nalezneme kromě výše zmíněných programových smyček typu while a repeat-until i smyčku reprezentovanou klíčovými slovy for, do a end. Tuto smyčku lze využít dvěma způsoby – ve funkci klasické počítané smyčky známé již z dob FORTRANU popř. ve funkci smyčky for-each, která se typicky používá pro průchod tabulkami.
7.1 Počítaná programová smyčka typu for
S překladem počítané programové smyčky typu for jsme se již setkali, takže si pouze řekněme, že se v mezijazyku vyskytují instrukce FORI a FORL. Instrukce FORI je skutečně použita na začátku programové smyčky, ještě před jejím tělem, a to pro zjištění, zda již před vstupem do smyčky náhodou nedošlo k situaci typu for i = 10,9 atd. Naopak instrukce FORL na konci smyčky provádí mnoho operací – zvýšení hodnoty počitadla, test na ukončení smyčky a současně i podmíněný skok na začátek smyčky. Jak FORI tak i FORL pracuje se třemi sloty – počitadlem, koncovou hodnotou a krokem:
+---> FORI --+ ; vstup do počítané programové smyčky typu for | ? | | ? | ; instrukce tvořící tělo smyčky | ? | ; instrukce tvořící tělo smyčky | ? | ; instrukce tvořící tělo smyčky | ? | +----- FORL | ; další iterace, skok na začátek programové smyčky <-------+
7.2 Smyčka typu for-each při průchodu polem
Složitější je situace ve chvíli, kdy se ve zdrojovém kódu vyskytuje programová smyčka typu for-each určená pro průchod polem, tj. takovou tabulkou, v níž jsou prvky adresovány s použitím celočíselných indexů. Pro průchod takovým polem se ve zdrojovém kódu využívá iterátoru ipairs() a v přeloženém kódu nalezneme jak volání tohoto iterátoru, tak i dvojici nových instrukcí nazvaných ITERC a ITERL. Instrukce ITERC zavolá znovu iterátor, přičemž parametry tohoto iterátoru jsou většinou již připraveny v rezervovaných slotech po celou dobu „života“ programové smyčky. Vlastní test, zda se má provést další iterace a tím pádem i skok, je představován funkcí ITERL:
GGET ; získání reference na funkci se jménem "ipairs" MOV ; předání iterátoru jako parametru funkce CALL ; zavolání funkce ipairs() JMP --+ ; přímý skok na instrukci ITERC +---> ? | | ? | ; instrukce tvořící tělo smyčky | ? | ; instrukce tvořící tělo smyčky | ? | ; instrukce tvořící tělo smyčky | ? | | ITERC<-+ +---- ITERL ; návrat na začátek smyčky (další iterace)
Podrobnosti si ukážeme příště na několika demonstračních příkladech.
7.3 Smyčka typu for-each při průchodu asociativním polem
Podobným způsobem je přeložena i programová smyčka typu for-each ve chvíli, kdy se prochází všemi prvky asociativního pole, tj. takové tabulky, v níž je každý prvek indexován klíčem (typicky řetězcem). Při překladu do bajtkódu se používají instrukce ISNEXT, ITERN a ITERL (tato instrukce je tedy stejná, jako tomu bylo i v předchozím případě). Instrukce ITERN dokáže spolupracovat (volat) funkce next() či pairs() a tím pádem implementovat jak načtení dalšího prvku z asociativního pole, tak i přípravu pro test, zda se má provést další iterace:
GGET ; získání reference na funkci se jménem "pairs" MOV ; předání iterátoru jako parametru funkce CALL ; zavolání funkce pairs() ISNEXT-+ ; přímý skok na instrukci ITERN +---> ? | | ? | ; instrukce tvořící tělo smyčky | ? | ; instrukce tvořící tělo smyčky | ? | ; instrukce tvořící tělo smyčky | ? | | ITERN<-+ +---- ITERL ; návrat na začátek smyčky (další iterace)
Podrobnosti o překladu této smyčky si taktéž ukážeme příště na několika demonstračních příkladech.
8. Zdrojové kódy všech pěti dnešních demonstračních příkladů
Všechny dnes použité demonstrační příklady jsou, jak je tomu v tomto seriálu již dlouhodobějším zvykem, uloženy do Git (GitHub) repositáře umístěného na adrese https://github.com/tisnik/luajit-examples:
9. Odkazy na Internetu
- Wikipedia: Mezijazyk
http://cs.wikipedia.org/wiki/Mezijazyk - The LuaJIT Project
http://luajit.org/index.html - LuaJIT FAQ
http://luajit.org/faq.html - LuaJIT Performance Comparison
http://luajit.org/performance.html - LuaJIT 2.0 intellectual property disclosure and research opportunities
http://article.gmane.org/gmane.comp.lang.lua.general/58908 - LuaJIT Wiki
http://wiki.luajit.org/Home - LuaJIT 2.0 Bytecode Instructions
http://wiki.luajit.org/Bytecode-2.0 - Programming in Lua 9.1 – Coroutine Basics,
http://www.lua.org/pil/9.1.html - Programming in Lua (first edition)
http://www.lua.org/pil/contents.html - Programming in Lua: 6 – More about Functions
http://www.lua.org/pil/6.html - Lua Lanes
http://kotisivu.dnainternet.net/askok/bin/lanes/ - Programming in Lua: 6.1 – Closures
http://www.lua.org/pil/6.1.html - Programming in Lua: 9.1 – Coroutine Basics
http://www.lua.org/pil/9.1.html - Programming in Lua: Numeric for
http://www.lua.org/pil/4.3.4.html - Programming in Lua: break and return
http://www.lua.org/pil/4.4.html - Programming in Lua: Tables
http://www.lua.org/pil/2.5.html - Programming in Lua: Table Constructors
http://www.lua.org/pil/3.6.html - Programovací jazyk Lua
http://palmknihy.cz/web/kniha/programovaci-jazyk-lua-12651.htm - Lua: Tables Tutorial
http://lua-users.org/wiki/TablesTutorial - Lua: Control Structure Tutorial
http://lua-users.org/wiki/ControlStructureTutorial - Lua Types Tutorial
http://lua-users.org/wiki/LuaTypesTutorial - Goto Statement in Lua
http://lua-users.org/wiki/GotoStatement - Lua 5.2 sources
http://www.lua.org/source/5.2/ - Lua 5.2 sources – lopcodes.h
http://www.lua.org/source/5.2/lopcodes.h.html - Lua 5.2 sources – lopcodes.c
http://www.lua.org/source/5.2/lopcodes.c.html - Lambda the Ultimate: Coroutines in Lua,
http://lambda-the-ultimate.org/node/438 - Coroutines Tutorial,
http://lua-users.org/wiki/CoroutinesTutorial - Lua Coroutines Versus Python Generators,
http://lua-users.org/wiki/LuaCoroutinesVersusPythonGenerators