Board.KolibriOS.org
http://board.kolibrios.org/

Порт LUA (5.2.0)
http://board.kolibrios.org/viewtopic.php?f=45&t=1663
Page 1 of 6

Author:  SoUrcerer [ Wed Feb 16, 2011 10:53 am ]
Post subject:  Порт LUA (5.2.0)

Новые версии на последних страницах. Текущая на сегодня (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: Show
Не проверял работу с файлами, но, по идее, все должно работать как положено.
Чтобы проверить, как работает интерпретатор, можно запустить его так:
lua -e "print ('Hello, world!')"
Никаких сообщений выведено не будет, окно не создается. Зато создаются три файла - stdin.log, stdout.log и stderr.log. В stdout.log и будет "Hello, world!"


Attachments:
lua.7z [46.65 KiB]
Downloaded 298 times

Author:  SoUrcerer [ Thu Feb 17, 2011 12:17 pm ]
Post subject:  Re: Порт LUA

Пока решил не заморачиваться с перенаправлением стандартного вывода в консоль (боюсь, что сейчас не хватит теоретических знаний для таких правок в 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 достаточно.

Attachments:
lua-lib.7z [47.58 KiB]
Downloaded 263 times

Author:  SoUrcerer [ Thu Feb 17, 2011 12:35 pm ]
Post subject:  Re: Порт LUA

Внезапно, попробовал свои правила сборки lua 4 на последней на сегодняшний день версии lua - lua 5.2a.
Кто-то заказывал lua в хотелках, помнится? Можете расписаться в получении. Новее некуда. Пока что не перенес библиотеку Колибри (см. предыдущий пост), но это дело времени.

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

Attachments:
lua52.7z [63.25 KiB]
Downloaded 244 times

Author:  SoUrcerer [ Thu Feb 17, 2011 10:14 pm ]
Post subject:  Re: Порт LUA

Написал простой калькулятор для демонстрации возможностей lua в Колибри. Использовать вместе с интерпретатором lua 4.0, слинкованным с библиотекой Колибри.

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

Attachments:
calc.lua.7z [964 Bytes]
Downloaded 255 times

Author:  Asper [ Thu Feb 24, 2011 3:10 pm ]
Post subject:  Re: Порт LUA

И со вторым интерпретатором поздравляю. Кажется это была чья-то хотелка, получить LUA в Колибри.

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

Author:  kogemyaka [ Tue Mar 08, 2011 7:09 pm ]
Post subject:  Re: Порт LUA

Неплохо получилось, всё работает. Ещё бы можно было кнопки удалять и добавить работу со временем.

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

Author:  SoUrcerer [ Tue Mar 08, 2011 9:05 pm ]
Post subject:  Re: Порт LUA

здорово,что работает.Увы,работает не везде хорошо из-за проблем с crt или чем-то связанным.
Если будет время,и это действительно нужно,могу добавить функции.
С менуэтлибц портировать было очень легко-исправить ссылки на часть функции,подправить заглушки для сигналов и перенаправить вывод. Пробовал использовать ньюлиб,но слишком много функций не хватает пока что-вроде в основном математика.Правда,я мало времени этому уделил.

Author:  Serge [ Tue Mar 08, 2011 10:35 pm ]
Post subject:  Re: Порт LUA

Sorcerer

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

Author:  SoUrcerer [ Tue Mar 08, 2011 11:19 pm ]
Post subject:  Re: Порт LUA

Вот так:
Code:
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'

Author:  Serge [ Tue Mar 08, 2011 11:54 pm ]
Post subject:  Re: Порт LUA

Часть функций я уже добавил в последнюю сборку (fread fscanf ftell srand rand atan2 fmod modf strcoll setjmp longjmp __srget __srget_r есть точно).

Author:  SoUrcerer [ Wed Mar 09, 2011 12:16 am ]
Post subject:  Re: Порт LUA

Странно, беру 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 совпадает до байта с тем, что был раньше.

Author:  Serge [ Wed Mar 09, 2011 1:20 am ]
Post subject:  Re: Порт LUA

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 байт

Author:  SoUrcerer [ Wed Mar 09, 2011 9:35 am ]
Post subject:  Re: Порт LUA

Моя вина, накосячил где-то. Теперь поменьше список (обновлено):
Code:
freopen
fgets
tmpfile
fscanf
ftell
setvbuf
system
remove
rename
tmpnam
clock
strftime
difftime
exit
strpbrk


Смотрел на код newlib, есть ли смысл мне ковыряться в направлении реализации этих функций, генерируя не ахти какой по качеству код?

Author:  Albom [ Wed Mar 09, 2011 9:43 am ]
Post subject:  Re: Порт LUA

Sorcerer wrote:
Code:
GetModuleFileNameA@12
GetLastError@0
FormatMessageA@28
FreeLibrary@4
LoadLibraryExA@12
GetProcAddress@8


Это ф-ции WinAPI. Есть ли они в коде? Или может что-то компилятор (линковщик) из других библиотек подтягивает?

Author:  SoUrcerer [ Wed Mar 09, 2011 10:16 am ]
Post subject:  Re: Порт LUA

Ох я и даю, lua компилировался с целью windows, а не ansi. Спасибо, сейчас поковыряюсь еще..

Page 1 of 6 All times are UTC+03:00
Powered by phpBB® Forum Software © phpBB Limited
https://www.phpbb.com/