Как стать автором
Обновить

Комментарии 34

Десятое правило Гринспена: "Любая достаточно сложная программа на Си содержит заново написанную, неспецифицированную, глючную и медленную реализацию половины языка Lisp"

Вам бы объяснить не мешало этот афоризм. Что имеете ввиду именно вы.
Потому что не все пойдут в первоисточник смотреть толкование.
А поймут как — «твой софт — дерьмо»(с).
Если вы именно это имеете ввиду, обоснуйте тогда.
Круто, но бесполезно. Вы когда-нибудь слышали про asn.1, который действительно имеет смысл подключать к проекту? Или, быть может, вы переделаете свой язык в not yet another shell? Я вот лично устал от этого баша с его неинтуитивными конструкциями.
Про asn.1 не слышал.
Дальше баша не смогу прыгнуть точно, потому что на прикладном уровне нахожусь, то есть сложно сделать что-то оригинальное, не изучая теорию, не сравнивая мду собой разные подходы и тд.
Да и времени (желания) особо нет копать глубоко.
bash вполне даже интуитивный.
Просто баш завязан не на «стандартные библиотеки», а на архитектуру операционной системы и доступные консольные утилиты, в основном gnu tools. При этом сам баш — очень простой.
bash вполне даже интуитивный.

Ага, особенно присвоение в массивах ;)

Если вам в баше нужны массивы, значит либо вы что-то делаете не так, либо вы переросли баш и вам нужен python / perl / whatver. Баш для потоковой обработки, а не для вот этого вот всего. Не зря-ж в POSIX sh никаких массивов нет вообще, как класса.

Хм, зачем тут кошмар ASN.1?
Точнее WTF?

Может использоваться в простых случаях, когда не хочется подключать что-то внешнее, но нужно дать пользователю возможность интерактивно влиять на ход выполнения ПО.


Написал простой интерпретатор, конечно не конкурент lua, но тоже может пригодиться.

Простите, хочется все же понять назначение/сферу применения лучше.

lua:
— подключение к проекту — просто добавить .c файлы в сборку. хоть как.
AddTarget(NO_DEFAULT_GLOB TYPE static NAME lua_static ROOT 3rdparty/lua/src
    SRC
    *.c *.h ../../sol/include/sol/*.hpp
    INCLUDES 3rdparty/lua/include
    )
target_include_directories(lua_static INTERFACE 3rdparty/lua/include)

AddTargetInterface(NAME sol INCLUDES 3rdparty/sol/include DEPS lua_static)

у меня чет такое например, но блин lua ни конфигурить не надо, ничего.

— ваш проект
вашу библиотеку я так же должен добавить в проект в сборку. разницы в сложности 20 c файлов или 1 cpp — не вижу.

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

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

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

приводит либо к полной бесполезности языка в практическом плане, либо к получению нечитаемых портянок на тысячи строк (сталкивался с тем что ваяют инженеры на «ограниченных» скриптах).
управляющие конструкции есть, так что говнокодить более чем можно :) ну это не в упрек автору.
Сам столкнулся с необходимостью использования lua только один раз, и то на самом деле можно было обойтись. Не так много ПО, где нужно давать скрипты пользователям.

Для прототипа (быстро накидать, посмотреть, проверить) я бы его взял.
А в практическом плане, наверно, да, соглашусь с вами, что не вариант.
— Игры. без комментариев)
— SCADA. конфигурации, автоматика (ПАА) и тп
— Пользовательский софт, видеоредактор — фильтры-рюшечки и прочее, дизайнер и продакт пилят фильтры и могут добавлять их после релиза продукта в библиотеку допустим. тоже мощный инструмент.
это только из того что я видел за свою лично карьеру) на самом деле примений скриптов вагон. я крайне не согласен с тем что прям не так много ПО)
Ладно, этот момент на самом деле не важен.

Для прототипа (быстро накидать, посмотреть, проверить) я бы его взял.

Хорошо, предположим так. А какая польза от прототипа? если я не буду работать дальше с этой либой? Мне ж потом все скрипты переписывать, и плюсовую часть тоже)

Я вот когда выбирал между Chai и Lua, например, для последнего проекта, я каждый прототип выкинул полностью после теста по сути.

Прототипировать с вашем решением стоит только если есть шанс что на нем и останешься далее, не?
Не, не стоит того. Надо закрывать лавочку, зря вытащил)

Вот теперь возьмите re2c + lemon, повторите и покайтесь ;)

Инструментов написано масса, на любой вкус, и что. По вашему, можно уже ничего не писать самому. А я пишу, и мне это нравится.

Не хотелось чтобы вы воспринимали мой комментарий негативно.


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


Поэтому, искренне советую повторить решение используя связку re2c + lemon и озвучить впечатление в продолжении этой статьи.

Понял вас теперь.
Повторять не буду, но уверен, что получится не хуже точно, если разобраться в них.
Здесь смысл этой поделки — не в процессе, не в правильно выбранном фундаменте, не в красоте кода.
Смысл — быстрый результат, что я имею ввиду:
— прочитал эту статью;
— взял с полки;
— быстро накидал скрипт;
— захотелось понять что внутри? — быстро понял как это все работает, потому что рабочий код без определений структур, вспом функций и тп — 300 строк кода (с междустроч пробелами еще, если считать).
— захотелось поправить, или добавить свое — без проблем. Повторю — без проблем, потому что код очень простой: парсинг — это одна функция, которая вызывает себя же рекурсивно, выполнение скрипта — 2 функции, работают в паре, то есть одна из другой вызывается, тоже с рекурсией. Вся рекурсия построена на индексе массива операций, больше никаких связей между вызовами, один индекс. Все, больше там ничего нет.

А теперь представьте, что будет если он будет построен на этих двух (re2c + lemon), бесспорно крутых вещах:
— прочитал эту статью

— захотел понять что внутри, чтобы что то изменить. Заглянул внутрь — и припух.

Те, у кого есть время, желание или академ интерес разбираться — сами возьмут re2c или подобное.
Эта вещь для других, для тех кому надо бежать, их основная масса, по моему.

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

Посмотрел в код. Стало грустненько. Что только люди ни делают лишь бы не думать про формальные грамматики. Нy ладно, допустим рекурсивный спуск тоже имеет право на жизнь. Но обязательно было так перемешивать лексический и синтаксический анализ?

Ладно, не тратьте грусть, а то на работе не хватит).
А вот раз тут все начали нападать на автора, предложите «мастадонта» под эти условия:
1. Кроссплатформенность (без WinAPI и пр)
2. Возможность определять свои функции (внутри и снаружи). Ну и там классы хотя бы или структуры.
3. Желательно, чтобы минимальный функционал (как у автора) шел «из коробки», а не как в boost, приходилось писать все правила, даже для оператора сложения, самому с нуля. Это конечно гибко, но с учетом п.5 — было бы супер.
4. «Простой» синтаксис (без особой необходимости изучать)
5. Возможность отключать функционал языка (или не включать) для тех случаев, когда писателям скриптов нельзя давать например функции обращения к диску, сети и пр.
6. Ну и размер всего этого, конечно минимальный. Как в составе приложения на диске, так и в памяти при исполнении.
А чем lua не подходит?
Как, например, отключить доступ к fs/io?
Подключение к своему проекту для разных ОС отличается…
Размерчик не мал…
Как, например, отключить доступ к fs/io?

В Tcl мне в этом плане нравится концепция safe interpreter'а. Но, честно говоря, лично я Tcl никуда не встраивал, поэтому не могу ничего сказать про размер, потребление памяти, и т.д. в сравнении с другими встраиваемыми языками.
Как, например, отключить доступ к fs/io?

Через setfenv


Или даже не подключайте эти библиотеки вовсе

Тоже не понял. я не вызываю luaopen_io, и api не доступно. в случае с sol — это lib::io.
для каждого контекста lua это настраивается.
Во время выполнения заблокировать какой-то определённый api в контексте что ли? А какой вообще интерпретатора такое позволит, интересно) особенно если это api уже было использовано.

Ну вообще в lua можно переопределить глобальное пространство имен (что делает setfenv), можно переопределить require() (который находится в глобальном пространстве имен). Вопрос в том, что делать это надо при создании lua-шного контекста, а не пытаться ограничивать "после", потому что модули смогут сохранить ограниченный модуль в локальной переменной. А через прокси — это геморный, больной, но осуществимый путь.
Ну и никакого ffi, очевидно.

Ненавижу Хабр, потому что здесь сразу начинают чмырить и тыкать готовыми реализациями. Человеку просто было интересно написать собственный минималистичный интерпретатор. Разобраться, как это делается. Молодец! У меня был аналогичный опыт. И когда я писал свой интерпретатор, подсматривал другие реализации. Свой я писал с использованием bison и flex. Конечно же я его не довел до ума, но требуемые функции он выполнял. И это был интересный для меня опыт. Я разобрался, как из исходного кода формировать байт-код и интерпретировать его. Исходный код скрипта компилируется один раз и далее многократно используется в приложении.
Тоже хотел написать статью и описать не очевидные на тот момент вещи, но меня остановил поток говна и минусов, которые я ожидал услышать.
Не, все ок. Это у нас такой менталитет мне кажется (может и не только у нас).
Хабр еще относительно нормальный в этом смысле.
Может это и правильно, надо как то фильтровать поток, а то затопит всяким.., если все будут хлопать и поддерживать любую писанину.
У Дудя помню в его кино про SV, было про это тоже.
Никто не чмырил, ну вы что. Это нормальные вопросы. Я старался максимально корректно расспросить. Я вообще плюс статье поставил)
Я не подготовился, если честно. Да и правда, тяжело выставлять изделие на вид.
Но я давно понял, что «бояться глупо»(с), когда увидел (и сейчас иногда натыкаюсь), что другие выкладывают, и потом еще с пеной у рта защищают.
Да ладно) посмотрите комменты под моей статье о Wuild. тоже самое. «зачем это, если есть distcc»? ну я пытался защитать свое решение, само собой.
А готовиться стоит, это не на Хабре, а вообще у любой аудитории, которой вы презентуете что-то свое)
ничего плохого нет, даже если ничего кроме критики вы не получили)

Вот и ещё один минус Хабра, что голосовать за статьи и комментарии могут только "избранные". Плюсов у статьи всего 14, а в закладки статью добавили 26 человек. Я хочу сказать, что не видно реальной оценки.

Да что ж вы так с этими голосованиями.
Таким «избранным» стать несложно. Для этого даже не надо быть крутым специалистом. Надо просто приложить усилия.
Вы же понимаете, что за статьи могут голосовать и в минус. Так зачем давать право голосам на статьи тем, кто ни разу не прикладывал усилия чтобы написать свое?
Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.