"Následně je použita instrukce CALL, která zavolá funkci, jejíž reference je uložena do slotu číslo 0. Operand B má hodnotu 1 a operand C má taktéž hodnotu 1. Tyto hodnoty znamenají: počet parametrů volané funkce = (C-A)-1 = 0, počet návratových hodnot volané funkce = (B-A)-1 = 0"
Takže
0009 CALL 6 1 2 ; volání funkce print()
má -5 parametrů a -6 návratových hodnot?Zdá se, že to '-A' je v popisu navíc.
Takze se na to musi trosku chytreji a vygenerovat si zdrojak takto:
local x=1 print("function func1()") for i=1,40000 do print(" local x"..i.."="..i) x=x+1 if x > 100 then print("end") print("") print("function func"..i.."()") x=0 end end print("end")
Po vygenerovani zdrojaku na nej pustim LuaJIT a tady mame vysledek (jen ta zajimava cast):
-- BYTECODE -- 3.lua:33696-33798 0001 KSHORT 0 32724 0002 KSHORT 1 32725 0003 KSHORT 2 32726 0004 KSHORT 3 32727 0005 KSHORT 4 32728 0006 KSHORT 5 32729 0007 KSHORT 6 32730 0008 KSHORT 7 32731 0009 KSHORT 8 32732 0010 KSHORT 9 32733 0011 KSHORT 10 32734 0012 KSHORT 11 32735 0013 KSHORT 12 32736 0014 KSHORT 13 32737 0015 KSHORT 14 32738 0016 KSHORT 15 32739 0017 KSHORT 16 32740 0018 KSHORT 17 32741 0019 KSHORT 18 32742 0020 KSHORT 19 32743 0021 KSHORT 20 32744 0022 KSHORT 21 32745 0023 KSHORT 22 32746 0024 KSHORT 23 32747 0025 KSHORT 24 32748 0026 KSHORT 25 32749 0027 KSHORT 26 32750 0028 KSHORT 27 32751 0029 KSHORT 28 32752 0030 KSHORT 29 32753 0031 KSHORT 30 32754 0032 KSHORT 31 32755 0033 KSHORT 32 32756 0034 KSHORT 33 32757 0035 KSHORT 34 32758 0036 KSHORT 35 32759 0037 KSHORT 36 32760 0038 KSHORT 37 32761 0039 KSHORT 38 32762 0040 KSHORT 39 32763 0041 KSHORT 40 32764 0042 KSHORT 41 32765 0043 KSHORT 42 32766 0044 KSHORT 43 32767 0045 KNUM 44 0 ; 32768 0046 KNUM 45 1 ; 32769 0047 KNUM 46 2 ; 32770 0048 KNUM 47 3 ; 32771 0049 KNUM 48 4 ; 32772 0050 KNUM 49 5 ; 32773 0051 KNUM 50 6 ; 32774 0052 KNUM 51 7 ; 32775 0053 KNUM 52 8 ; 32776 0054 KNUM 53 9 ; 32777 0055 KNUM 54 10 ; 32778 0056 KNUM 55 11 ; 32779 0057 KNUM 56 12 ; 32780 0058 KNUM 57 13 ; 32781 0059 KNUM 58 14 ; 32782 0060 KNUM 59 15 ; 32783 0061 KNUM 60 16 ; 32784 0062 KNUM 61 17 ; 32785 0063 KNUM 62 18 ; 32786 0064 KNUM 63 19 ; 32787 0065 KNUM 64 20 ; 32788 0066 KNUM 65 21 ; 32789 0067 KNUM 66 22 ; 32790 0068 KNUM 67 23 ; 32791 0069 KNUM 68 24 ; 32792 0070 KNUM 69 25 ; 32793 0071 KNUM 70 26 ; 32794 0072 KNUM 71 27 ; 32795 0073 KNUM 72 28 ; 32796 0074 KNUM 73 29 ; 32797 0075 KNUM 74 30 ; 32798 0076 KNUM 75 31 ; 32799 0077 KNUM 76 32 ; 32800 0078 KNUM 77 33 ; 32801 0079 KNUM 78 34 ; 32802 0080 KNUM 79 35 ; 32803 0081 KNUM 80 36 ; 32804 0082 KNUM 81 37 ; 32805 0083 KNUM 82 38 ; 32806 0084 KNUM 83 39 ; 32807 0085 KNUM 84 40 ; 32808 0086 KNUM 85 41 ; 32809 0087 KNUM 86 42 ; 32810 0088 KNUM 87 43 ; 32811 0089 KNUM 88 44 ; 32812 0090 KNUM 89 45 ; 32813 0091 KNUM 90 46 ; 32814 0092 KNUM 91 47 ; 32815 0093 KNUM 92 48 ; 32816 0094 KNUM 93 49 ; 32817 0095 KNUM 94 50 ; 32818 0096 KNUM 95 51 ; 32819 0097 KNUM 96 52 ; 32820 0098 KNUM 97 53 ; 32821 0099 KNUM 98 54 ; 32822 0100 KNUM 99 55 ; 32823 0101 KNUM 100 56 ; 32824 0102 RET0 0 1
Coz znamena, ze kvuli limitu na max. 200 lokalnich promennych se prekladac nikdy nedostane do problemu s limitem na 32767 konstant, protoze si "constant pool" v kazde funkci resetuje (chova se tedy jinak, nez constant pool v JVM, tam jsou ostatne podobna omezeni na pocet parametru, pocet lokalnich promennych atd.)
Dekuji za vysvetleni.
Mel jsem ale spis na mysli konstanty kterym se nepujde vyhnout, napriklad kdybych mel rekneme kod FFT pocitane ve fixpoint cislech napsany tak ze vsechny cykly budou rozvinute pro nejake velke konstantni N=2**n. Tak ty twiddle faktory budou konstatnty napsane primo do zdrojaku a podle me by bylo od kompilatoru zbabele kdyby mi zacal rikat ze mam prilis mnoho konstant ve funkci.....
to by se musel rozvinout cyklus/cykly o souhrnném počtu 300 iterací. To už mi přijde zbytečné plýtvání. Ostatné luajit na to má nějaké konstanty http://luajit.org/running.html a ta největší je tam 15 (i když se asi dají změnit).
To byl jen nejapny priklad s tou FFT. Jasne ze delat dlouhe funkce se spoustou konstant nesvedci o dobrem programatorskem stylu.
Zajimalo me jestli ten JIT kompilator ma takoveto omezeni nebo ne.
Psat takove funkce je sice osklivost, ale napsat program, ktery nejakou takovou obrovskou funkci vygeneruje uz nemusi byt tak za vlasy pritazene....
Ajo uz asi chapu, takze jsem vyzkousel si vygenerovat programek takovymto zpusobem:
print("local i = nil") for i=0,100000 do print("i="..i) end
Klasicky interpret Luy to schramstnul bez problemu, LuaJIT me (presne podle toho, co ma ve zdrojaku napsany :) vyhodil hlaseni:
main function has more than 65536 constants.
Ale uprimne - je to sice omezeni, ale asi s tim dokazeme zit :D