Snusmumriken
Я пишу большие сложные проекты на много тысяч строчек моего и немного чужого кода. А некоторые даже на лямы.
Snusmumriken
И pcall/xpcall в основном используется или в очень маленьких местах, типа local jsonstr = request(...) local jdata local succ = pcall(function() jdata = json.decode(jsonstr) end) Или в каких-нибудь особо крупных местах, где уже не важно какая конкретно ошибка (лишь бы её записали в лог вместе с трейсбеком), важно что условно тред упал и его надо перезапустить или ещё что-то такое глобальное сделать, а потом чинить уже конкретно. А "средние" места уже обрабатываются вручную: тут недостаток аргументов, тут аргументы не тех типов/не тех свойств, тут сервак вернул ошибку и т.д.
Snusmumriken
Почему в питоне нельзя без обработки исключений — потому что вся стандартная либа только и делает что швыряется исключениями на любой чих, вместо того чтобы вернуть nil и текст/код ошибки. Лично я воспринимаю это как семейное насилие. А в луях вполне себе можно без них даже строить что-то крупное, и работать будет как часы, хоть и потребует некоторого применения мозгов.
Stas
В питоне исключения????
Snusmumriken
Snusmumriken
ИСКЛЮЧЕНИЯ???
Stas
ИСКЛЮЧЕНИЯ???
У меня флешбеки с С++
Anonymous
Ну а ещё минимализм и быстродействие. Ты можешь написать основную часть приложения на луях, предоставив только узкий набор сишных расширений, и не обосраться с быстродействием (кроме настоящего реального времени), особенно с луажытом.
здравствуйте. интерерсно было почитать вашу переписку. подскажите, подойдет ли Луа новичку первым языком программирования для своих домашних нужд (поиграться с автоматизацией браузера, http запросов, каких-то простых веб-нужд) ? мой сегодняшний уровень знаний - завод. не представляю коренных различий одного яп от другого
Dmitry
Товарищи, че-то не могу найти какой-то луа-фреймворк для микросервисов. К примеру как фласк на питоне. Посоветуйте плиз
Snusmumriken
Ещё можно без фреймворков сервачок нафигачить ))
Snusmumriken
Для чего-то более-менее полноценного — openresty (nginx). Для сервисов-обработчиков всяких жысонов с необходимостью в простой БД — tarantool. Для темплейтов отлично заходит resty-template, его можно использовать отдельно от openresty.
Snusmumriken
Вот я тут например с openresty балуюсь. Производительность адовая.
Dmitry
Ещё можно без фреймворков сервачок нафигачить ))
А можешь пример скинуть? Не понимаю как сделать
Snusmumriken
А, без фреймворков?
Dmitry
Мне для научного интереса что-нибудь)) да, чисто луа без фреймворка как написать серверное приложение
Snusmumriken
Ну например вот простенький асинхронный (на корутинах) хттп-сервачок (с зависимостью от luasocket) https://pastebin.com/sJQCK5PJ В конце примерчик
Snusmumriken
А не помню )) По хорошему, для работы с файлами (особенно с их юникодными именами) тут нужна (ffi-версия) lfs. Я хотел ещё впилить выдачу файликов из того же места что и скрипт, и это был микрокостыль для чего-то там. Тут по хорошему должна быть current working directory или месторасположение скрипта.
️ ️️
а ок
Dmitry
Ну например вот простенький асинхронный (на корутинах) хттп-сервачок (с зависимостью от luasocket) https://pastebin.com/sJQCK5PJ В конце примерчик
Кайф спасибо!) А скажи плиз, там первой строчкой сразу идёт импорт либы сокет - она откуда берётся? Это же не стандартная либа
Snusmumriken
Кайф спасибо!) А скажи плиз, там первой строчкой сразу идёт импорт либы сокет - она откуда берётся? Это же не стандартная либа
Кароч, эта либа — простая dll'ка (so-шка), которая расположена там, где луа её найдёт. По умолчанию, луа ищет либы: 1. Рядом с исполняемым файлом 2. По путям 3. По переменным окружения LUA_PATH/LUA_CPATH 4. Во всяких кастомных местах, которые ты прописал внутри луёв в package.path/package.cpath Если у тебя недостаток библиотек, луа говорит тебе, где оно пыталось искать. Пихни куда-нибудь туда где найдёт.
Snusmumriken
Snusmumriken
Ставить либы можно через луарокс (оно автоматом пишется туда где луа потом найдёт), или вручную качать или собирать. Оба варианта норм.
Snusmumriken
Ну например вот простенький асинхронный (на корутинах) хттп-сервачок (с зависимостью от luasocket) https://pastebin.com/sJQCK5PJ В конце примерчик
А, блин, тут ещё используется пара моих штук, uri и ltn. Я что-то забыл что они не сокетовые. Хмм.
Mediator
Когда твои скрипты работают примерно с той же производительностью что и сишка — это много стоит. А ещё когда ты можешь использовать произвольные сишные структуры и подгружать любые сишные либы из самого скрипта, без компиляции биндингов.
Написал один и тот же код на Lua и C++. Luajit быстрее работает. Таблицы в Lua при добавлении новых элементов почему-то быстрее работают, чем сиплюсплюсный vector. Пока не разобрался, почему.
Luсky
LuaVela: реализация Lua 5.1, основанная на LuaJIT 2.0 / IPONWEB / Хабр https://habr.com/ru/company/iponweb/blog/465441/
Luсky
вот ещё бодрая штука для опытов на кошках.
Mediator
заранее память выделяешь под элементы в плюсах? В луажите ffi используешь?
Нет, использую vector как есть. Добавляю по одному элементу, push_back(). Мне казалось, что c++ классы должны быть сами по себе достаточно быстрыми, а оказалось не очень. Впрочем, пробовал даже статаческий массив нужной длины выделить заранее (хотя это нечестно, программа не знает, сколько будет элементов), не сильно помогло, но точных чисел замеров уже не помню. Не знаю, что такое ffi, просто запускаю.
Luсky
Lua+FFI vs. JavaScript / Хабр https://habr.com/ru/post/113804/
Anonymous
Написал один и тот же код на Lua и C++. Luajit быстрее работает. Таблицы в Lua при добавлении новых элементов почему-то быстрее работают, чем сиплюсплюсный vector. Пока не разобрался, почему.
> Таблицы в Lua при добавлении новых элементов почему-то быстрее работают, чем сиплюсплюсный vector Не верю. Какая-то погрешность микробенчмарков, вероятно.
Snusmumriken
Это Айдар. Он ни в чём не раскаялся и не извинялся, но я его разбанил. Если будет незаметно для себя выпендриваться — я ему об этом сообщу.
Wsevolod
Есть подобие godbolt для луа, посмотреть байткод/то, что нагенерил jit?
Vladislav
luajit.me ?
Wsevolod
luajit.me ?
спасибо
mva
> Таблицы в Lua при добавлении новых элементов почему-то быстрее работают, чем сиплюсплюсный vector Не верю. Какая-то погрешность микробенчмарков, вероятно.
иногда такое бывает. У меня как-то имплементация crypt_sha256 (кажется) сделанная на lua работала быстрее референсной имплементации на С
mva
причём, я битовые сдвиги делал умножением :)
Aydar
Написал один и тот же код на Lua и C++. Luajit быстрее работает. Таблицы в Lua при добавлении новых элементов почему-то быстрее работают, чем сиплюсплюсный vector. Пока не разобрался, почему.
Если не резервировать память для элементов вектора заранее, то при каждом добавлении будет выделяться память а это всегда дорого. К тому же многие стандартные контейнеры реализованы так чтобы их было удобно применять в широком диапазоне задач, под конкретный случай можно написать более оптимальную версию вектора. А ещё в плюсах очень много неочевидностей из-за этого высок риск "неправильного" использования даже стандартных возможностей языка. Например https://youtube.com/c/TheChernoProject в одном из видео упоминал про https://github.com/electronicarts/EASTL это либа которая более оптимально реализует стандартные функции/контейнеры для использования в геймдеве.
Luсky
в общем - тщательнее надоть.
Александр
mva
так что никаких "точно" быть не может. Не стоит бросаться безапелляционными заявлениями :)
Александр
Кот простой
С++ собран без оптимизаций что ли? К тому же, tok копируется лишний раз. Ну и не ясно, на каких масштабах бенчмарки проводятся.
Александр
ещё reserve можно сделать же. Но вероятно это про масштабы бенчмарка, да
Можно, но это уже может считаться "оптимизацией алгоритма", а у нас вроде честные условия
anton
так нечестно, в луа строки не копируются вообще, насколько я знаю
anton
Просто в луа cow-семантика для строк
а разве там можно делать write в строку?
Александр
а разве там можно делать write в строку?
Не помню :) Но cow при отсутствии write сводится к иммутабельному значению со счётчиком ссылок, так что копия сводится к инкременту
Александр
anton
и вообще непонятно зачем там tok
Mediator
push_back(std::move(tok))
Я не понимаю.
Александр
Я не понимаю.
Ну правильно, чтобы понять, нужно С++ знать
Lucky
для бенчмарка пишется максимально производительный код
Mediator
и вообще непонятно зачем там tok
Оттого, что убрать, быстрее не станет.
Александр
А потом выходит, что разработчик без знания С++ бенчмаркает и делает выводы 👍
Mediator
А потом выходит, что разработчик без знания С++ бенчмаркает и делает выводы 👍
А ты смог ответить на вопрос, почему что-то копируется два раза, разработчик с опытом?
Александр
А ты смог ответить на вопрос, почему что-то копируется два раза, разработчик с опытом?
Сначала копируется кусок подстроки во временный объект, а потом из этого объекта в вектор.
Mediator
Указатель? Или опять все символы по одному?