LuaJIT – Just in Time překladač pro programovací jazyk Lua (6 – překlad programových smyček do mezijazyka LuaJITu)

Pavel Tišnovský 18. 11. 2014

V šesté části článku o Just in Time překladači nazvaném LuaJIT si vysvětlíme, jakým způsobem se překládají programové smyčky typu while, repeat-until i smyčky typu for-each používané jak při procházení běžných polí (s prvky adresovanými s využitím indexů), tak i při procházení všemi prvky asociativních polí.

Obsah

1. LuaJIT – Just in Time překladač pro programovací jazyk Lua (6 – překlad programových smyček do mezijazyka LuaJITu)

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 forfor-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ů

9. Odkazy na Internetu

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 whilerepeat-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*, JMPLOOP, 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 forfor-each

V programovacím jazyku Lua nalezneme kromě výše zmíněných programových smyček typu whilerepeat-until i smyčku reprezentovanou klíčovými slovy for, doend. 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 FORIFORL. 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 ITERCITERL. 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, ITERNITERL (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:

widgety

       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

  1. Wikipedia: Mezijazyk
    http://cs.wikipedia.org/wi­ki/Mezijazyk
  2. The LuaJIT Project
    http://luajit.org/index.html
  3. LuaJIT FAQ
    http://luajit.org/faq.html
  4. LuaJIT Performance Comparison
    http://luajit.org/performance.html
  5. LuaJIT 2.0 intellectual property disclosure and research opportunities
    http://article.gmane.org/gma­ne.comp.lang.lua.general/58908
  6. LuaJIT Wiki
    http://wiki.luajit.org/Home
  7. LuaJIT 2.0 Bytecode Instructions
    http://wiki.luajit.org/Bytecode-2.0
  8. Programming in Lua 9.1 – Coroutine Basics,
    http://www.lua.org/pil/9.1.html
  9. Programming in Lua (first edition)
    http://www.lua.org/pil/contents.html
  10. Programming in Lua: 6 – More about Functions
    http://www.lua.org/pil/6.html
  11. Lua Lanes
    http://kotisivu.dnainternet­.net/askok/bin/lanes/
  12. Programming in Lua: 6.1 – Closures
    http://www.lua.org/pil/6.1.html
  13. Programming in Lua: 9.1 – Coroutine Basics
    http://www.lua.org/pil/9.1.html
  14. Programming in Lua: Numeric for
    http://www.lua.org/pil/4.3.4.html
  15. Programming in Lua: break and return
    http://www.lua.org/pil/4.4.html
  16. Programming in Lua: Tables
    http://www.lua.org/pil/2.5.html
  17. Programming in Lua: Table Constructors
    http://www.lua.org/pil/3.6.html
  18. Programovací jazyk Lua
    http://palmknihy.cz/web/kni­ha/programovaci-jazyk-lua-12651.htm
  19. Lua: Tables Tutorial
    http://lua-users.org/wiki/TablesTutorial
  20. Lua: Control Structure Tutorial
    http://lua-users.org/wiki/ControlStruc­tureTutorial
  21. Lua Types Tutorial
    http://lua-users.org/wiki/LuaTypesTutorial
  22. Goto Statement in Lua
    http://lua-users.org/wiki/GotoStatement
  23. Lua 5.2 sources
    http://www.lua.org/source/5.2/
  24. Lua 5.2 sources – lopcodes.h
    http://www.lua.org/source/5­.2/lopcodes.h.html
  25. Lua 5.2 sources – lopcodes.c
    http://www.lua.org/source/5­.2/lopcodes.c.html
  26. Lambda the Ultimate: Coroutines in Lua,
    http://lambda-the-ultimate.org/node/438
  27. Coroutines Tutorial,
    http://lua-users.org/wiki/CoroutinesTutorial
  28. Lua Coroutines Versus Python Generators,
    http://lua-users.org/wiki/LuaCorouti­nesVersusPythonGenerators
Našli jste v článku chybu?
Root.cz: Podívejte se na shořelé Samsung Note 7

Podívejte se na shořelé Samsung Note 7

DigiZone.cz: Digi Slovakia zařazuje stanice SPI

Digi Slovakia zařazuje stanice SPI

DigiZone.cz: DVB-T2 ověřeno: seznam TV zveřejněn

DVB-T2 ověřeno: seznam TV zveřejněn

DigiZone.cz: Další programatické formáty

Další programatické formáty

Vitalia.cz: 5 důvodů, proč jet na výlov rybníka

5 důvodů, proč jet na výlov rybníka

Měšec.cz: „Ukradli“ jsme peníze z bezkontaktních karet

„Ukradli“ jsme peníze z bezkontaktních karet

Vitalia.cz: Tesco nabízí desítky tun jídla zdarma

Tesco nabízí desítky tun jídla zdarma

Vitalia.cz: dTest odhalil ten nejlepší kečup

dTest odhalil ten nejlepší kečup

Lupa.cz: Proč jsou firemní počítače pomalé?

Proč jsou firemní počítače pomalé?

DigiZone.cz: Regionální tele­vize CZ vysílá "Mapu úspěchu"

Regionální tele­vize CZ vysílá "Mapu úspěchu"

Vitalia.cz: Vodárny varují: Ve vodě z kohoutku jsou bakterie

Vodárny varují: Ve vodě z kohoutku jsou bakterie

DigiZone.cz: Budoucnost TV vysílání ve Visegrádu

Budoucnost TV vysílání ve Visegrádu

DigiZone.cz: Sat novinky: NASA Ultra HD (4K)

Sat novinky: NASA Ultra HD (4K)

Vitalia.cz: Voda z Vltavy před a po úpravě na pitnou

Voda z Vltavy před a po úpravě na pitnou

DigiZone.cz: Nova opět stahuje „milionáře“

Nova opět stahuje „milionáře“

Vitalia.cz: Test dětských svačinek: Tyhle ne!

Test dětských svačinek: Tyhle ne!

Lupa.cz: Jak se prodává firma za miliardu?

Jak se prodává firma za miliardu?

Lupa.cz: Jak levné procesory změnily svět?

Jak levné procesory změnily svět?

Lupa.cz: Blíží se konec Wi-Fi sítí bez hesla?

Blíží se konec Wi-Fi sítí bez hesla?

Podnikatel.cz: Udělali jsme velkou chybu, napsal Čupr

Udělali jsme velkou chybu, napsal Čupr