Page 1 of 7

Порт LUA (5.2.0)

Posted: Wed Feb 16, 2011 10:53 am
by SoUrcerer
Новые версии на последних страницах. Текущая на сегодня (19.12.2011) - Lua 5.2.0 с командами ввода-вывода через консоль

Портирую Lua потихоньку. Начинать решил с малого, с одной из устаревших версий - Lua 4.0.
Особой разницы между Lua 4 и Lua 5.1 (и даже Lua 5.2a) нет, но код Lua 4 на самом деле несколько понятнее, поэтому сначала потренируюсь на Lua 4, а затем, глядишь, и до Lua 5.1 доберусь.

Вызов интерпретатора обычный:
lua [имя программы]
или же
lua -e "код для выполнения"
Пока что не работает вывод на консоль (потому что stdin/stdout пока что не знают про console.obj, но это пока что). Поэтому stdout идет в stdout.log, а stdin идет из stdin.log.
Spoiler:Не проверял работу с файлами, но, по идее, все должно работать как положено.
Чтобы проверить, как работает интерпретатор, можно запустить его так:
lua -e "print ('Hello, world!')"
Никаких сообщений выведено не будет, окно не создается. Зато создаются три файла - stdin.log, stdout.log и stderr.log. В stdout.log и будет "Hello, world!"

Re: Порт LUA

Posted: Thu Feb 17, 2011 12:17 pm
by SoUrcerer
Пока решил не заморачиваться с перенаправлением стандартного вывода в консоль (боюсь, что сейчас не хватит теоретических знаний для таких правок в libc). Вместо этого немного расширил базовую библиотеку lua для поддержки функций Колибри. Размер исполняемого файла практически не увеличился (менее чем на килобайт).

Добавил следующие команды, аналогичные системным функциям:
redraw(do) -- перерисовать окно. do= 1 - начать, do=2 - закончить
window(x,y,xsize,ysize,color1,color2,color3) -- определить окно, аналогично системной функции 0
textout(x,y,color,text) -- вывести текст. Здесь text это просто строковая переменная
makebutton(x,y,xsize,ysize,id,color) --определить кнопку с кодом id
event=checkevent() -- проверка событий, в переменной event число, определеяющее тип события
event=waitevent() -- ожидание событий
key=getkey() -- получить код нажатой клавиши
button=getbutton() --получить код нажатой кнопки

Не очень густо, но для простых программ, не использующих графику, хватит.
Полное руководство по lua 4.0 есть тут.
Когда будет настроение, перенесу в Колибри и lua 5.1, тем более формат библиотек незначительно поменялся, то есть эти функции по-прежнему будут доступны.

В архиве скомпилированный интерпретатор lua 4 с поддержкой некоторых функций Колибри, и тестовая программа 1.lua (она рисует окно с кнопкой, и при нажатии на кнопку ее цвет меняется).
Отныне в самой Колибри можно писать программы не только на FASM. Правда, быстродействие программ на lua хромает, но для brainware достаточно.

Re: Порт LUA

Posted: Thu Feb 17, 2011 12:35 pm
by SoUrcerer
Внезапно, попробовал свои правила сборки lua 4 на последней на сегодняшний день версии lua - lua 5.2a.
Кто-то заказывал lua в хотелках, помнится? Можете расписаться в получении. Новее некуда. Пока что не перенес библиотеку Колибри (см. предыдущий пост), но это дело времени.

UPD: Ох, поспешишь - людей насмешишь. :( В этой версии почему-то поломалось открытие файлов, работают только команды, полученные через опцию командной строки "e". Как только исправлю, выложу.

Re: Порт LUA

Posted: Thu Feb 17, 2011 10:14 pm
by SoUrcerer
Написал простой калькулятор для демонстрации возможностей lua в Колибри. Использовать вместе с интерпретатором lua 4.0, слинкованным с библиотекой Колибри.

*чуть было не решил, что библиотека работы со строками не слинковалась, пока писал программу... посмотрел в исходники - а оказывается команды lua 4 и lua 5 очень сильно отличаются. будьте внимательны!*

Re: Порт LUA

Posted: Thu Feb 24, 2011 3:10 pm
by Asper
И со вторым интерпретатором поздравляю. Кажется это была чья-то хотелка, получить LUA в Колибри.

Да и не забываем обновлять http://wiki.kolibrios.org/wiki/Changes_in_0770

Re: Порт LUA

Posted: Tue Mar 08, 2011 7:09 pm
by kogemyaka
Неплохо получилось, всё работает. Ещё бы можно было кнопки удалять и добавить работу со временем.

А вообще трудно было его портировать?

Re: Порт LUA

Posted: Tue Mar 08, 2011 9:05 pm
by SoUrcerer
здорово,что работает.Увы,работает не везде хорошо из-за проблем с crt или чем-то связанным.
Если будет время,и это действительно нужно,могу добавить функции.
С менуэтлибц портировать было очень легко-исправить ссылки на часть функции,подправить заглушки для сигналов и перенаправить вывод. Пробовал использовать ньюлиб,но слишком много функций не хватает пока что-вроде в основном математика.Правда,я мало времени этому уделил.

Re: Порт LUA

Posted: Tue Mar 08, 2011 10:35 pm
by Serge
Sorcerer

Каких функций не хватает ? Кинь лог линковки.

Re: Порт LUA

Posted: Tue Mar 08, 2011 11:19 pm
by SoUrcerer
Вот так:

Code: Select all

lauxlib.o:lauxlib.c:(.text+0x4d2): undefined reference to `__srget_r'
lauxlib.o:lauxlib.c:(.text+0x520): undefined reference to `__srget_r'
lauxlib.o:lauxlib.c:(.text+0x554): undefined reference to `__srget_r'
lauxlib.o:lauxlib.c:(.text+0x589): undefined reference to `__srget_r'
lauxlib.o:lauxlib.c:(.text+0x6cc): undefined reference to `freopen'
lauxlib.o:lauxlib.c:(.text+0x7d9): undefined reference to `fread'
ldblib.o:ldblib.c:(.text+0xc0f): undefined reference to `fgets'
ldo.o:ldo.c:(.text+0x1cf): undefined reference to `setjmp'
ldo.o:ldo.c:(.text+0x436): undefined reference to `longjmp'
liolib.o:liolib.c:(.text+0x2b1): undefined reference to `tmpfile'
liolib.o:liolib.c:(.text+0x36f): undefined reference to `fgets'
liolib.o:liolib.c:(.text+0x4a4): undefined reference to `__srget_r'
liolib.o:liolib.c:(.text+0x4f7): undefined reference to `fread'
liolib.o:liolib.c:(.text+0x57f): undefined reference to `fscanf'
liolib.o:liolib.c:(.text+0x5e5): undefined reference to `fread'
liolib.o:liolib.c:(.text+0x6f3): undefined reference to `_popen'
liolib.o:liolib.c:(.text+0xed6): undefined reference to `setvbuf'
liolib.o:liolib.c:(.text+0xf59): undefined reference to `ftell'
liolib.o:liolib.c:(.text+0xf92): undefined reference to `_pclose'
lmathlib.o:lmathlib.c:(.text+0x204): undefined reference to `srand'
lmathlib.o:lmathlib.c:(.text+0x209): undefined reference to `rand'
lmathlib.o:lmathlib.c:(.text+0x31c): undefined reference to `rand'
lmathlib.o:lmathlib.c:(.text+0x4af): undefined reference to `modf'
lmathlib.o:lmathlib.c:(.text+0x62a): undefined reference to `fmod'
lmathlib.o:lmathlib.c:(.text+0x756): undefined reference to `atan2'
loadlib.o:loadlib.c:(.text+0x3ee): undefined reference to `GetLastError@0'
loadlib.o:loadlib.c:(.text+0x40e): undefined reference to `FormatMessageA@28'
loadlib.o:loadlib.c:(.text+0x4e8): undefined reference to `LoadLibraryExA@12'
loadlib.o:loadlib.c:(.text+0x522): undefined reference to `GetProcAddress@8'
loadlib.o:loadlib.c:(.text+0x86e): undefined reference to `GetModuleFileNameA@12'
loadlib.o:loadlib.c:(.text+0xa86): undefined reference to `FreeLibrary@4'
loslib.o:loslib.c:(.text+0x44): undefined reference to `tmpnam'
loslib.o:loslib.c:(.text+0x2e0): undefined reference to `rename'
loslib.o:loslib.c:(.text+0x316): undefined reference to `remove'
loslib.o:loslib.c:(.text+0x3c2): undefined reference to `exit'
loslib.o:loslib.c:(.text+0x3e0): undefined reference to `system'
loslib.o:loslib.c:(.text+0x448): undefined reference to `difftime'
loslib.o:loslib.c:(.text+0x704): undefined reference to `strftime'
loslib.o:loslib.c:(.text+0x752): undefined reference to `clock'
lstrlib.o:lstrlib.c:(.text+0xa2b): undefined reference to `strpbrk'
lua.o:lua.c:(.text+0x8e): undefined reference to `freopen'
lua.o:lua.c:(.text+0xa8): undefined reference to `freopen'
lua.o:lua.c:(.text+0xc2): undefined reference to `freopen'
lua.o:lua.c:(.text+0x242): undefined reference to `signal'
lua.o:lua.c:(.text+0x25f): undefined reference to `signal'
lua.o:lua.c:(.text+0x2c3): undefined reference to `signal'
lua.o:lua.c:(.text+0x473): undefined reference to `fgets'
lua.o:lua.c:(.text+0xbcf): undefined reference to `_fileno'
lvm.o:lvm.c:(.text+0x3b6): undefined reference to `strcoll'

Re: Порт LUA

Posted: Tue Mar 08, 2011 11:54 pm
by Serge
Часть функций я уже добавил в последнюю сборку (fread fscanf ftell srand rand atan2 fmod modf strcoll setjmp longjmp __srget __srget_r есть точно).

Re: Порт LUA

Posted: Wed Mar 09, 2011 12:16 am
by SoUrcerer
Странно, беру dev-libs из темы Mesa, инклуды из 1902 ревизии, заново компилирую всё:
$ i586-mingw32msvc-gcc -c *.c -fno-builtin-printf -I include
Затем линкую:
$i586-mingw32msvc-ld -o lua.kex -nostdlib -static -T kos.ld --image-base 0 --stack 0x100000 lapi.o lauxlib.o lbaselib.o lbitlib.o lcode.o lcorolib.o lctype.o ldblib.o ldebug.o ldo.o ldump.o lfunc.o lgc.o linit.o liolib.o llex.o lmathlib.o lmem.o loadlib.o lobject.o lopcodes.o loslib.o lparser.o lstate.o lstring.o lstrlib.o ltable.o ltablib.o ltm.o lua.o lundump.o lvm.o lzio.o libc.a

Те же самые ошибки %) А размер нового libc.a совпадает до байта с тем, что был раньше.

Re: Порт LUA

Posted: Wed Mar 09, 2011 1:20 am
by Serge
Sorcerer
Было dev-libs-02.03.2011.7z: libc.a 02.03.2011 356 596 байт
стало dev-libs-08.03.2011.7z: libc.a 08.03.2011 363 568 байт

Re: Порт LUA

Posted: Wed Mar 09, 2011 9:35 am
by SoUrcerer
Моя вина, накосячил где-то. Теперь поменьше список (обновлено):

Code: Select all

freopen
fgets
tmpfile
fscanf
ftell
setvbuf
system
remove
rename
tmpnam
clock
strftime
difftime
exit
strpbrk
Смотрел на код newlib, есть ли смысл мне ковыряться в направлении реализации этих функций, генерируя не ахти какой по качеству код?

Re: Порт LUA

Posted: Wed Mar 09, 2011 9:43 am
by Albom
Sorcerer wrote:

Code: Select all

GetModuleFileNameA@12
GetLastError@0
FormatMessageA@28
FreeLibrary@4
LoadLibraryExA@12
GetProcAddress@8
Это ф-ции WinAPI. Есть ли они в коде? Или может что-то компилятор (линковщик) из других библиотек подтягивает?

Re: Порт LUA

Posted: Wed Mar 09, 2011 10:16 am
by SoUrcerer
Ох я и даю, lua компилировался с целью windows, а не ansi. Спасибо, сейчас поковыряюсь еще..