LINUX.ORG.RU
ФорумTalks

Lua - идиотский язык

 , ацтой, ,


2

2

по работе пришлось столкнуться с этим поделием какой-то недоучившийся школоты.

это пипец. спрашиваю многих «почему выбран именно Lua как встраиваемый язык?»

типовые ответы:

  • потому что он самый быстрый, вот дескать бенчмарки
  • потому что его проще всего встроить, вот дескать один хидер и работа со скалярами такая простая

но чухня все это.

любой язык ща встроить в свой код одинаково. что питон что перл.

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

то есть что толку с того что десять присвоений быстрее делаются? вы на реальном коде, реальной задаче посмотрите, а там будет медленнее самого медленного языка, ибо в том хоть хеши есть нормальные, массивы.

ну а уж о магии «эта хрень в lua работает вот так вот что волосы дыбом потому что на C было так проще писать» вообще сплошь.

вот например что выводит программа?:

local tbl = { 1, nil, 2 }
print( unpack(tbl) )

правильно, она выводит:

1 nil 2

а вот что выведется в следующих случаях:

local tbl = { nil, 2, 3 }
print( unpack(tbl) )

и

local tbl = { 1, 2, nil }
print( unpack(tbl) )

можете сказать?

и так в lua все.

★★

Последнее исправление: rsync (всего исправлений: 1)

это пипец. спрашиваю многих «почему выбран именно Lua как встраиваемый язык?»

Потому-что если сравнивать его с perl'ом, то он как бейсик учится на раз-два и код поймет любой овощ. А с пузоном вообще непонятная ситуация, есть ветка 2.7 и есть ветка 3.0, программы пишут и на том и на том, на 3 не могут перейти т.к. обратной совместимости нет, а с 2.7 не могут уйти т.к. не все либы портировали.

Deleted
()
Ответ на: комментарий от Deleted

Потому-что если сравнивать его с perl'ом, то он как бейсик учится на раз-два и код поймет любой овощ

вот про луа не надо. когда таких вот непредсказуемых поведений как вышеприведенное туча тогда он отнюдь не учится на раз два.

а два присвоения овощ и на perl научится на раз два писать

rsync ★★
() автор топика
Ответ на: комментарий от krakatau

перехожу на xmonad.

там до сих пор не включили нормальную поддержку фокуса в явовских прогах — лучше переходить на ставший мэйнстримом i3 :)

Bad_ptr ★★★★★
()
Ответ на: комментарий от Deleted

А с пузоном вообще непонятная ситуация, есть ветка 2.7 и есть ветка 3.0, программы пишут и на том и на том, на 3 не могут перейти т.к.

а у lua 5.2 и 5.1 думаете совместимы? с чего бы тогда в том же Debian тогда бы делали кучу пакетов *lua5.1-что-то и *lua5.2-тоже-самое? вероятно от совместимости?

rsync ★★
() автор топика
Ответ на: комментарий от krakatau

Где-то точно видел решение этих проблем.

решение есть, но либо надо накатывать патч, либо через глючный костыль.
хмонад мне тоже нравится, только вот с поддержкой специфического управления фокусом бида, но всё что мне нужно я смог настроить и на i3. :)

Bad_ptr ★★★★★
()
Ответ на: комментарий от rsync

а у lua 5.2 и 5.1 думаете совместимы? с чего бы тогда в том же Debian тогда бы делали кучу пакетов *lua5.1-что-то и *lua5.2-тоже-самое? вероятно от совместимости?

+1, lua ломает совместимость на каждом минорном релизе, а не раз в 10 лет, как python.

Boba_Fett
()

А написать на тему бага, или спросить у создателей языка не захотелось? А то что ты говоришь медленно - пиши патчи, тебе только скажут спалибо.
lua действительно просто интерфейсить с сишным кодом, да и на голом железе он здорово ворочается. с патчем lua-tinyram в 5.2к влезает, емнип, а pymyte тот же самый меньше чем на 64к не взлетит.
А отсутствие биндингов скорее следствие того, что ниша lua это либо эмбеддед типа luci на опенврт (хотя luci'вый фреймворк для веба таки вкусен), либо внутриигровой скриптинг, где биндинги не особо нужны, и делаются к движку самими девелоперами.

AiFiLTr0 ★★★★★
()
Ответ на: комментарий от Boba_Fett

+1, lua ломает совместимость на каждом минорном релизе, а не раз в 10 лет, как python.

говорю же - школота какая-то делала. о понятии хеш и не слышавшая даже

rsync ★★
() автор топика
Ответ на: комментарий от AiFiLTr0

да и на голом железе он здорово ворочается

не здорово. на реальных задачах совсем не здорово. когда сконкатенировать два массива - по ним бегать, это, извините, не скриптовый язык.

и когда a > '10' надо типы приводить. это извините. в XXI-м веке такой муйней заниматься моветон

rsync ★★
() автор топика

Lua, конечно, говно. Но, поскольку его единственная ниша - встраиваемый язык, для него обратная совместимость и не важна: никто не станет менять script engine в выпущенном продукте.

tailgunner ★★★★★
()
Ответ на: комментарий от Deleted

Ну я лично lua юзаю для быстрого прототипирования на голом stm32 (elua), и более чем уверен, что ТС если и сможет придумать альтернативу - максимум forth, остальное там не взлетит. И здесь это вещь незаменимая.
Аналогично lua+libusb для быстрого написания утилит для работы с самодельными усб девайсами и скриптинга железа. Опять таки, потому что просто и быстро интерфейсить с сишным кодом. И не надо ляля про одинаковую сложность, я для этих целей пробовал php, python и java jni. Остановился в итоге на lua как на единственном языке, ге это сделано вменяемо.

AiFiLTr0 ★★★★★
()
Ответ на: комментарий от tailgunner

Lua, конечно, говно. Но, поскольку его единственная ниша - встраиваемый язык, для него обратная совместимость и не важна: никто не станет менять script engine в выпущенном продукте.

встраивается и питон отлично и перл

а script engine вынуждены обновлять все кто продолжает поддерживать продукт. по крайней мере все живые продукты на lua5.1 а то и 5.2 перебрались потихоньку. noSQL-и те же

rsync ★★
() автор топика
Ответ на: комментарий от AiFiLTr0

Ну напиши патч, блин

УГ исправить нельзя.

Или предложи годную замену, раз такой умный

perl, python, да хоть руби. любой из них встраивается ровно таким же количеством телодвижений. и будет быстрее в реальной жизни, а не на глупых бенчмарках. потому что и в перле и в питоне и в руби хеши есть, с массивами и строками работать умеют. итп

rsync ★★
() автор топика
Ответ на: комментарий от AiFiLTr0

Остановился в итоге на lua как на единственном языке, ге это сделано вменяемо.

пример вменяемого кода в первом посте

rsync ★★
() автор топика
Ответ на: комментарий от rsync

А ты сравни сколько тебе надо телодвижений сделать чтобы встроить в приложение питон/перл/пхп. Особенно если надо делать очень много интерфейсов с сишным кодом. Мне тоже луа не особо приглянулся поначалу из-за его begin/end'ов и синтаксиса, но вот все альтернативы оказались полным гавном.

AiFiLTr0 ★★★★★
()
Ответ на: комментарий от tailgunner

PHP пробовал потому что его все еще хорошо знал, java jni потому что один хрен под андройд писать надо, джаву пришлось освоить и jni. Еще пробовал java script, но V8 совершенно упоротый апи для встраивания, а еще при кросскомпайле С x64 на арм оно вылетает по #error мол де сие неподдерживается.

AiFiLTr0 ★★★★★
()
Ответ на: комментарий от rsync

пример вменяемого кода в первом посте

В первом посте я только вижу, что человек напоролся на особенность языка, не успев освоиться, и это породило баттхерт.
Узкие места, да указаны верно, но опять таки если не можешь исправить - не используй луа на проектах, где такая скорость критично. У меня, например, я точно знаю, размер массива для конкатенации когда это даже ри такой реализации будет заметно тормозить в сотни раз превышает размер RAM'а. А python perl и ruby там не смогут работать в принципе.

Теперь, приведи пример такого: http://p.ncrmnt.org/show.php?id=7
Но для питона или перла, например.

AiFiLTr0 ★★★★★
()
Ответ на: комментарий от AiFiLTr0
#include <Python.h>

int
main(int argc, char *argv[])
{
  Py_Initialize();
  PyRun_SimpleString("from time import time,ctime\n"
                     "print 'Today is',ctime(time())\n");
  Py_Finalize();
  return 0;
}
wota ★★
()
Ответ на: комментарий от wota

Да, выглядит неплохо. С питоном это еще ничего в принципе, но вот на голом stm32 его не запустишь нормально, до памяти прожорлив. Выше пример я привел не совсем корректно. Питон меня больше бесит своими угребищными отступами для группировки операций.

AiFiLTr0 ★★★★★
()
Последнее исправление: AiFiLTr0 (всего исправлений: 1)

А что такое unpack и почему он должен возникать в коде на луа?

PolarFox ★★★★★
()

ассоциативном массиве есть элемент его надо обойти это быстро?

Да, а где не так? В массиве вам тоже все элементы прийдется обходить.

сконкатенировтаь два массива их опять обойти

Да, такое лишь в linked lists делается быстро.

frozenix ★★★
()

Lua разработан подразделением Tecgraf Католического
университета Рио-де-Жанейро.

«поделием какой-то недоучившийся школоты.»

Думай что говоришь - так и 2 года колонии за хулиганство схлопотать недолго.

Anonymous ★★★★★
()
Ответ на: комментарий от wota

А такой же пример - вызов питоновской функции заданной в определенном файле где есть другие функции из сишного кода?

Tark ★★
()
Ответ на: комментарий от AiFiLTr0

А ты сравни сколько тебе надо телодвижений сделать чтобы встроить в приложение питон/перл/пхп

ровно столько же сколько нужно чтобы встроить lua. ровно столько же. один инклюд, одна инициализация, один вызов.

rsync ★★
() автор топика
Ответ на: комментарий от rsync

Это пока тебе не нужно туда добавить характерные для программы api.

PolarFox ★★★★★
()
Ответ на: комментарий от AiFiLTr0

В первом посте я только вижу, что человек напоролся на особенность языка, не успев освоиться, и это породило баттхерт

какая же это особенность?.....

имеется массив. а реверс от этого массива сделать - получим другой массив. а реверс от реверса - получим третий. это... да, ты прав, баттхерт. у разработчиков этого УГ

rsync ★★
() автор топика
Ответ на: комментарий от Tark

PyImport_Import + PyObject_GetAttrString + PyObject_CallObject, кода будет побольше, но его можно завернуть в функцию

wota ★★
()
Ответ на: комментарий от AiFiLTr0

Теперь, приведи пример такого: http://p.ncrmnt.org/show.php?id=7

Но для питона или перла, например.

для питона такой же пример (такого же размера примерно) в книжке Ларри Уолла с верблюдом на обложке

rsync ★★
() автор топика
Ответ на: комментарий от AiFiLTr0

до памяти прожорлив

на реальных приложениях нет. в питоне не нужно циклами по массивам ходить чтобы их поклеить. и чтобы значение найти в хеше в перле не нужно массивом идти. и реверс массива это реверс, а не черте че

rsync ★★
() автор топика
Ответ на: комментарий от frozenix

Да, а где не так? В массиве вам тоже все элементы прийдется обходить.

ассоциативный массив - хеш в категории perl, таблица в категории lua

rsync ★★
() автор топика
Ответ на: комментарий от Anonymous

Lua разработан подразделением Tecgraf Католического

университета Рио-де-Жанейро

у них религиозное помрачение было когда они таблицы писали?

вот у тебя есть таблица

local tbl = { 1, 2, 3 }

тебе надо ее в виде аргументов отдать функции. ты что делаешь? правильно

foo( unpack(tbl) )

а вот теперь у тебя их две. и что первое в голову приходит нормальному человеку? правильно

foo( unpack(tbl1), unpack(tbl2) )

работает? нет

и так все. пример с nil в таблицах выше

rsync ★★
() автор топика
Ответ на: комментарий от rsync

блин, напиши задачу, не знаю почему вы попу чешете рукой через гланды... нужен массив - array['something'] = true и у вас будет быстрый поиск элемента

frozenix ★★★
()
Ответ на: комментарий от rsync

на реальных приложениях нет. в питоне не нужно циклами по массивам ходить чтобы их поклеить.

К слову отчасти потому что в питоне не нужно ходить циклами по массивам чтобы их поклеить он и прожорлив.

Tark ★★
()

быстродействие говорите? а чтобы узнать что в ассоциативном массиве есть элемент его надо обойти это быстро?

Чего? my_table[«key»] ищется, конечно, с использованием хэшей (если верить описанию Иерусалимски; код интерпретатора я все еще внимательно не читал). Или что имеется в виду?

а сконкатенировтаь два массива их опять обойти - снова быстро?

Не массива, а ассоциативных массива.

local tbl = { nil, 2, 3 }
print( unpack(tbl) )

Она выведет «nil 1 2». Поскольку tbl[1] == nil, tbl[2] == 2, tbl[3] == 3.

local tbl = { 1, 2, nil }
print( unpack(tbl) )

Она выведет «1 2», поскольку tbl[1] == 1, tbl[2] == 2, больше элементов в tbl нет.

Эта твоя проблема оттого, что ты никак не возьмешь в голову, что в Lua элемент, равный nil, то же, что отсутствующий, нет никакого значения undefined, ни команды delete, ничего. А «максимальный индекс» в таблице (table.maxn) - это такое число i, что для всякого m > 0 tbl[i+m] == nil. А unpack, ЕМНИП, выводит элементы с первого по maxn. Синтаксис этих примеров вполне прямолинейный.

//Ой, блин, table.maxn в 5.2 устарел... Хотя он все равно линейно обходил таблицу.

И, кстати, команда «print», ЕМНИП, задумывалась скорее для вывода при отладке.

proud_anon ★★★★★
()
Ответ на: комментарий от PolarFox

О, в луа появились массивы? Я думал там только таблицы. Таблицы {1, 2, nil} и {1, 2} идентичны.

а ты наверное в курсе что код

table = { 1, 2, 3 } и код table = { a = 1, b = 2 }

создает разные по методу доступа «таблицы»?

rsync ★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.