Egzistencinis trykšsmas apie Lua baitkodą

Posted: 2017-06-03 in Pezalai
Žymos:, , ,

Lua | Programavimas | Darau, blėAš, suprantate, esu buvęs Java koderis. Javos meistru taip ir netapau, nes profesionaliai su šita kalba kodijau kokį pusmetį. Neprofesionaliai tai pasikrapštinėju iki šiol, bet nebaisiai rimtai. Todėl turiu nuomonę ir apie tokį dalyką, kaip bytecode: kompiliuojamos kalbos dvejetainį atvaizdą. Python baitkodas irgi nepriklausomas nuo platformos (nors priklausomas nuo VM versijos, bet čia px).

Tad įsivaizduokite mano šoką vieną dieną, kai aš paėmiau Lua projektą, jį susquishinau, sukompiliavau, pridaviau ir gavau atsakymą: нивалит! Šitągikaipjįten, ta prasme? A va tąjį: lua: <….>: bad header in precompiled chunk! Nu, нихуя себе.

Ir štai atėjo suvokimas. Kas tas yr: Lua? Lua yra netipizuota interpretuojama kalba. Jos luac kompiliatorius gali suinterpretuoti kodą ir padaryti jį greičiau užkraunamu. Tačiau, kad jį kur, tas sukompiliuotas baitkodas yra priklausomas nuo CPU architektūros! T.y. nuo size_t struktūros, nuo endianness’o ir dar krūvelės kitų faktorių. Pvz. atminties išskyrimo blokais.

Tai čia jau dabar aš žinau, kad taip yra. O patikėkite, tas suvokimas ir supratimas atėjo ne taip jau ir greitai, kaip norėjosi. Endianness yra viena iš tų problemų, kurias net ir gan patyręs programuotojas suvokia tik labai miglotai. Aš tai suvokiu labai gerai, nes esu iš tų keistų programuotojų, kurie velniškai gerai suvokia front-end’ą ir apačioje gulinčią silicio architektūrą. Bet nesu labai geras full-stack C koderis ar kažką tai. Gal tiesiog patirties nėra.

Bet nepaisant viso to, atėjęs suvokimas, kad baitkodas gali būti priklausomas nuo platformos, kažkaip tai sukrėtė. Tada pradėjau gilintis.

Man reikia palaikyti MIPS ir ARM architektūras. Su MIPS viskas ok… išskyrus vieną dalį. MIPS man yra OpenWRT, kur vykdomas kroskompiliavimas: t.y. universalus C kodas kompiliuojamas ant x64 kompo į MIPS-32 architektūrą. Papildymas prie to: Lua taip pat kompiliuojama į su MIPS suderinamą baitkodą…

Kaip jie tai padaro? OpenWRT kažkaip tai pasikompiliuoja Lua interpretatorių, kad tas generuotų teisingą baitkodą MIPS architektūrai? Ne, nė velnio. Nes yra ir ARM architektūros rūterių, ant kurių tas pats Lua kodas sukompiliuotas irgi sukasi.

OpenWRT vaikinai yra gudrūs. Jie pasidarė Lua kalbos variklio patchus, kurie baitkodą padaro nepriklausomą nuo platformos. Kažkaip ten išsisprendžia ir endianų problema, nors nesiknisau iki galo. Tik išbandžiau, kad su OpenWRT tiunintu luac sukompiliuotas baitkodas sėkmingai laidosi tiek ant MIPS, tiek ant ARM, tiek ant x64 (jeigu laidomas su ta pačia tiuninta VM).

Pradėjom rimtai galvoti apie OpenWRT patchų pritaikymą kitiems (ne OpenWRT) divaisams, kuriuose mums Lua reikalinga. Nes vargas skirtingiems procesoriams skirtingus baitkodus ruošti visgi. Ant durniaus buvau netgi nusenusį MIPS Debian’ą ant QEMU pasileidęs ir bandžiau ten Lua baitkodą kompiliuot. Veikia, ant kitų MIPS pereina. Bet tai negi darysi kelias QEMU virtualkes ir jose laidysi baitkodo kompiliavimą? Per daug terlionės ir automagizuot sunku. Aišku, skaitinėjau, žmonės ir taip daro. Na, bet neorganiška kažkaip…

 

Advertisements
Komentarai
  1. entdx parašė:

    Little Endian or BTFO.

Parašykite komentarą

Įveskite savo duomenis žemiau arba prisijunkite per socialinį tinklą:

WordPress.com Logo

Jūs komentuojate naudodamiesi savo WordPress.com paskyra. Atsijungti / Keisti )

Twitter picture

Jūs komentuojate naudodamiesi savo Twitter paskyra. Atsijungti / Keisti )

Facebook photo

Jūs komentuojate naudodamiesi savo Facebook paskyra. Atsijungti / Keisti )

Google+ photo

Jūs komentuojate naudodamiesi savo Google+ paskyra. Atsijungti / Keisti )

Connecting to %s