Anonymous
а для ффи типа интерпретатор не нужен?
Anonymous
при чём тут Си-Не-Си? ffi - позволяет загрузить библиотеку
так а если либа это .pyc файл?
mva
.pyc файл это не библиотека
Anonymous
а, понял
mva
это скомпилированный в питонобайткод питоноскрипт
Anonymous
интересно, а если питон скомпилировать с флагом -rdynamic то ффи больше функций оттуда увидит?
Anonymous
а, хотя это не шаред обжект хз
Alex
какой ffi?
так разве оно не вызывает код c через ffi?
http://luajit.org/ext_ffi.html
The FFI library allows calling external C functions and using C data structures from pure Lua code.
Anonymous
Доброе утро.
Не силен в луа, кто может подсказать, что происходит на 177 стр? - https://github.com/diegonehab/luasocket/blob/master/src/http.lua
Alex
меня беспокоит overhead на то чтобы запускать C из Lua
Alex
То есть, например если я запускаю сишную функцию из файбера tarantool (почти как корутина), то не происходит смена контекста и небольшой lock главного треда?
Snusmumriken
Хех, корутины не дают тебе многопоточности : )
Все локи луёвых или сишных функций - всё равно локи.
Snusmumriken
Когда ты делаешь:
str = io.open('file.txt'):read('*all') - ты блокируешь исполнение, пока файл не будет прочитан, а если файл недоступен или диск в бедблоках - оно может довольно долго читать и долго блокировать.
Snusmumriken
И кстати, луашный io.open() - это прямая связка с сишным io. Дёргая это ты дёргаешь функции из стандартной сишной либы.
Alex
Многое проясняется :) тогда зачем ffi?
Alex
The FFI library allows calling external C functions
Snusmumriken
См выше.
Snusmumriken
Многое проясняется :) тогда зачем ffi?
Вот так выглядит библиотека, которая компилируется в dll/so-либу, которую жуёт любая версия Lua, хоть с ffi хоть без.
https://github.com/starwing/luautf8/blob/master/lutf8lib.c
Написана по данной технологии:
https://www.lua.org/pil/26.2.html
А вот так написана типичная сишная библиотека. Что-то не видно никаких манипуляций с луа-стеком, да и вообще ничего в луа не выгружается! Как так? Как её подключать? Что с ней делать?
https://github.com/carterjones/hello-world-dll/blob/master/hello-world.cpp
Вариантов два:
1. Переписывать под адаптацию к Lua.
2. Если в проекте используется luajit, воспользоваться грязным ffi-хаком и подрубить напрямую. Все symbol'ы будут выдраны, все конверсии произведены автоматически.
Anonymous
Пока в коде библиотеки не встретится __stdcall
Anonymous
:)
Snusmumriken
Ну такое. Адаптировать нужно будет чуть больше, только и всего.
Anonymous
Концепция ффи насколько я помню пришла из лиспов/смл. Там как раз для этой цели использовали
Anonymous
но везде был один ABI - юникс сис 5
Anonymous
сдекл по современному
Snusmumriken
Это избыточная информация даже для меня : )
Anonymous
лiл)
Alex
Anonymous
когда можно сделать маллок, записать туда данные и вернуть указатель?
этим занимается сама либа
Anonymous
а чтобы "вернуть" как минимум уже надо класть на луашный стек
Anonymous
если он отличается чем то от колстека
Snusmumriken
Это если бы мы были в мире сишки.
А луашка хочет чтобы сишка взяла луа-строчку и доп-аргументы, провернула с ней какие-то манипуляции и вернула бы в стек.
Пользование этой либой выглядит так:
utf8 = require'lua-utf8'
newstr = utf8.sub('Текст на русском с жопными символами длиной больше одного байта ▼▲▼▲▼', 2, -3)
Snusmumriken
То есть, в луа должна быть выгружена сишная функция sub, которая вытаскивает cchar * переданный первым аргументом, вытаскивает int'ы переданные вторым и третьим, делает с ними грязь и выплёвывает обратно в луа.
Alex
а почему ffi - это грязный хак? Он дает большой overhead?
Snusmumriken
Потому что это нормально работает только в одном месте: в luajit.
Snusmumriken
Ffi-биндинг или либа на ffi-методах (использующая сишные структуры, например) не работает в lua 5.1-5.4 потому что там нет ffi, а они сами довольно активно используются много где. Поэтому она почти одноразовая или "для избранных" у которых оно есть. Поэтому lua-сообщество слегка разделено на два лагеря.
Alexey
Alexey
Ну и есть luaffi правда он помедленнее чем просто lua :(
Snusmumriken
Потому что там как раз оверхед, это не "встроенное в язык решение" а надстройка. Такая же как в ноде или питоне. Там тоже есть подобное счастье. Не настолько вырвиглазно магически-крутое, но тем не менее.
Anonymous
когда контроля надо сорсами нет, можно применить
Anonymous
но вообще лучше написать биндинг
Anonymous
в какой лагерь я попал? :)
Snusmumriken
Alexey
У luv вроде тоже есть подобное
Alexey
Ну о реализовать такое не сложно на любой библиотеки
Snusmumriken
Блин, у меня как раз на следующем луа-митапе будет мастер-класс по ffi, типа динамически подрубаем winapi прям из венды и начинаем получать координаты мыши/нажатые кнопки, и мутим консольные крестики-нолики с мышиным управлением или змейку с клавиатурным, и поле адаптирующееся под размер окна.
Co(n)stantine👨🔬
Snusmumriken
Годно, но у меня прекол как раз в отсутствии "сторонних библиотек", всё в чистую на луях, выгребая недостающее из окружения.
Alex
Snusmumriken
Потому что так исторически сложилось, спроси дядю Роба : )
Snusmumriken
Своровать из luajit не получится, там хардкорный асм, в котором разбирается только один человек в мире.
Co(n)stantine👨🔬
Snusmumriken
Да, это тоже знаю и тоже использовал в грязных целях.
Snusmumriken
Snusmumriken
Вот тут окошко с полем создано средствами lua-ffi-winapi из пакета luapower, а окошко с кружочком - love2d-opengl.
Co(n)stantine👨🔬
Co(n)stantine👨🔬
окошко с полем как из 2000
Snusmumriken
Но суть не в этом, а показать нороду что такое существует и как с ним работать.
Co(n)stantine👨🔬
можно материал дезигн запилит средствами lua-ffi-winapi?
Snusmumriken
окошко с полем как из 2000
Ох. Ты хочешь чтобы я всегда сразу (даже в тестовых целях) мутил ультра-графен с иконками-переливающимися картинками и полной перестройкой интерфейса ещё при наведении мыши? ))
Snusmumriken
Co(n)stantine👨🔬
Snusmumriken
так 10 вроде могет🤔
Приложения созданные стандартными виджетами winapi будут выглядеть на все 2000.
Snusmumriken
Потому что всякие вот такие - сделаны не на winapi а на uwp-модулях (universal windows platform).
Alex
а uwp-модули можно подключить через ffi?)
Co(n)stantine👨🔬
можно врод
Snusmumriken
Но как-то через жопку.
Snusmumriken
Кстати, если кто может и хочет - есть таска, как способ получить много славы и богатства: накалякать сенсорную swipe-клавиатуру на uwp. Будут рады пользователи вендопланшетов/вендотелефонов.
Anonymous
приложения на винапи могут выглядеть и как в семерке
Anonymous
там просто опции по-моему
Anonymous
панель управления же написана на винапи
Anonymous
+ кастомная графика