Anonymous
а для ффи типа интерпретатор не нужен?
mva
а, ффи у вас не только на Си распространяется?
при чём тут Си-Не-Си? ffi - позволяет загрузить библиотеку. А потом в c-like виде объявить заголовки. После чего уже можешь на Lua писать. Но зачем питон это не объясняет
mva
а для ффи типа интерпретатор не нужен?
он имел в виду интерпретатор питона. А для ffi, да, он не нужен.
Anonymous
при чём тут Си-Не-Си? ffi - позволяет загрузить библиотеку так а если либа это .pyc файл?
mva
.pyc файл это не библиотека
Snusmumriken
а, ффи у вас не только на Си распространяется?
Cpython можно динамически через ffi подключить как либу и гонять на ней скрипты. Проблемы?
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
Snusmumriken
так разве оно не вызывает код 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.
FFI нужен только для очень определённых вещей, тебе о них на текущем уровне знать не обязательно. Луа (без FFI) спокойно жуёт сишные библиотеки написанные для неё (подключанная Lualib и DLLExport с массивом луашных функций). И есть множество библиотек, расширяющих стандартный функционал луёв. Например, добавляющие сеть (luasocket) или utf8 или json (cjson) или ещё миллиард мелочей. FFI нужен для того чтобы подключить к луа сишную библиотеку, которая не предназначена для луа.
Alex
меня беспокоит overhead на то чтобы запускать C из Lua
Snusmumriken
меня беспокоит overhead на то чтобы запускать C из Lua
0. Оверхед такой же как на вызов луашных функций. Они ВСЕ сишные (даже те которые ты написал на луа, после разогрева, в варианте с ffi).
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
См выше.
mva
The FFI library allows calling external C functions
для использования библиотек ОС, для которых нет готовых модулей-прокладок для Lua
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
Вот так выглядит библиотека, которая компилируется в 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'ы будут выдраны, все конверсии произведены автоматически.
Немного не понимаю зачем нужны всякие манипуляции с lua-стеком? Вот есть библиотека lua-utf8 и функция utf8.upper она на вход принимает указатель на память, считывает и возвращает другой указатель. Зачем здесь манипуляции с lua-стеком, когда можно сделать маллок, записать туда данные и вернуть другой указатель?
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-сообщество слегка разделено на два лагеря.
Snusmumriken
Ну можно эмулировать с помощью асинхронных библиотек
Ты видел где-нибудь асинхронный io.read в виде библиотек? Я - нет.
Alexey
Ну и есть luaffi правда он помедленнее чем просто lua :(
Snusmumriken
Потому что там как раз оверхед, это не "встроенное в язык решение" а надстройка. Такая же как в ноде или питоне. Там тоже есть подобное счастье. Не настолько вырвиглазно магически-крутое, но тем не менее.
Anonymous
когда контроля надо сорсами нет, можно применить
Anonymous
но вообще лучше написать биндинг
Alexey
Ты видел где-нибудь асинхронный io.read в виде библиотек? Я - нет.
Я да :) https://github.com/moteus/lua-lluv/blob/master/src/lua/lluv/cofs.lua
Anonymous
в какой лагерь я попал? :)
Alexey
У luv вроде тоже есть подобное
Alexey
Ну о реализовать такое не сложно на любой библиотеки
Snusmumriken
Блин, у меня как раз на следующем луа-митапе будет мастер-класс по ffi, типа динамически подрубаем winapi прям из венды и начинаем получать координаты мыши/нажатые кнопки, и мутим консольные крестики-нолики с мышиным управлением или змейку с клавиатурным, и поле адаптирующееся под размер окна.
Snusmumriken
Годно, но у меня прекол как раз в отсутствии "сторонних библиотек", всё в чистую на луях, выгребая недостающее из окружения.
Snusmumriken
Потому что так исторически сложилось, спроси дядю Роба : )
Snusmumriken
Своровать из luajit не получится, там хардкорный асм, в котором разбирается только один человек в мире.
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
можно материал дезигн запилит средствами lua-ffi-winapi?
Нет. Точнее, можно, но если всё заменить на картинки.
Revertron
можно материал дезигн запилит средствами lua-ffi-winapi?
Как только винда будет поддерживать его из коробки, так сразу :)
Snusmumriken
так 10 вроде могет🤔
Приложения созданные стандартными виджетами winapi будут выглядеть на все 2000.
Snusmumriken
Потому что всякие вот такие - сделаны не на winapi а на uwp-модулях (universal windows platform).
Alex
а uwp-модули можно подключить через ffi?)
Co(n)stantine👨‍🔬
можно врод
Snusmumriken
Но как-то через жопку.
Snusmumriken
Кстати, если кто может и хочет - есть таска, как способ получить много славы и богатства: накалякать сенсорную swipe-клавиатуру на uwp. Будут рады пользователи вендопланшетов/вендотелефонов.
Anonymous
приложения на винапи могут выглядеть и как в семерке
Anonymous
там просто опции по-моему
Anonymous
панель управления же написана на винапи
Anonymous
+ кастомная графика