Comments 34
Десятое правило Гринспена: "Любая достаточно сложная программа на Си содержит заново написанную, неспецифицированную, глючную и медленную реализацию половины языка Lisp"
Дальше баша не смогу прыгнуть точно, потому что на прикладном уровне нахожусь, то есть сложно сделать что-то оригинальное, не изучая теорию, не сравнивая мду собой разные подходы и тд.
Да и времени (желания) особо нет копать глубоко.
Просто баш завязан не на «стандартные библиотеки», а на архитектуру операционной системы и доступные консольные утилиты, в основном gnu tools. При этом сам баш — очень простой.
bash вполне даже интуитивный.
Ага, особенно присвоение в массивах ;)
Может использоваться в простых случаях, когда не хочется подключать что-то внешнее, но нужно дать пользователю возможность интерактивно влиять на ход выполнения ПО.
Написал простой интерпретатор, конечно не конкурент 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 — не вижу.
производительность, поддержка, документация, обучение людей в проекте новому синтаксису — вот по этим показателям вроде ваше решение не выигрывает. (вы вроде честно сказали что развивать не собираетесь).
с точки зрения обучения коду — ваш проект тоже… очень не очень. исходники как учебный материал я бы не советовал читать людям.
А, да, идеологически подход
Либо в случаях, когда не хочется давать пользователю в руки весь арсенал скриптовых языков, а ограничиться простым набором команд.
приводит либо к полной бесполезности языка в практическом плане, либо к получению нечитаемых портянок на тысячи строк (сталкивался с тем что ваяют инженеры на «ограниченных» скриптах).
управляющие конструкции есть, так что говнокодить более чем можно :) ну это не в упрек автору.
Для прототипа (быстро накидать, посмотреть, проверить) я бы его взял.
А в практическом плане, наверно, да, соглашусь с вами, что не вариант.
— SCADA. конфигурации, автоматика (ПАА) и тп
— Пользовательский софт, видеоредактор — фильтры-рюшечки и прочее, дизайнер и продакт пилят фильтры и могут добавлять их после релиза продукта в библиотеку допустим. тоже мощный инструмент.
это только из того что я видел за свою лично карьеру) на самом деле примений скриптов вагон. я крайне не согласен с тем что прям не так много ПО)
Ладно, этот момент на самом деле не важен.
Для прототипа (быстро накидать, посмотреть, проверить) я бы его взял.
Хорошо, предположим так. А какая польза от прототипа? если я не буду работать дальше с этой либой? Мне ж потом все скрипты переписывать, и плюсовую часть тоже)
Я вот когда выбирал между Chai и Lua, например, для последнего проекта, я каждый прототип выкинул полностью после теста по сути.
Прототипировать с вашем решением стоит только если есть шанс что на нем и останешься далее, не?
Вот теперь возьмите re2c
+ lemon
, повторите и покайтесь ;)
Не хотелось чтобы вы воспринимали мой комментарий негативно.
Напротив, я считаю обязательно необходимым уметь самостоятельно разрабатывать и собирать "велосипеды". Но при этом не менее важно пользоваться крестовой отверткой для шурупов, а не только забивать их самодельными молотками.
Поэтому, искренне советую повторить решение используя связку re2c
+ lemon
и озвучить впечатление в продолжении этой статьи.
Повторять не буду, но уверен, что получится не хуже точно, если разобраться в них.
Здесь смысл этой поделки — не в процессе, не в правильно выбранном фундаменте, не в красоте кода.
Смысл — быстрый результат, что я имею ввиду:
— прочитал эту статью;
— взял с полки;
— быстро накидал скрипт;
— захотелось понять что внутри? — быстро понял как это все работает, потому что рабочий код без определений структур, вспом функций и тп — 300 строк кода (с междустроч пробелами еще, если считать).
— захотелось поправить, или добавить свое — без проблем. Повторю — без проблем, потому что код очень простой: парсинг — это одна функция, которая вызывает себя же рекурсивно, выполнение скрипта — 2 функции, работают в паре, то есть одна из другой вызывается, тоже с рекурсией. Вся рекурсия построена на индексе массива операций, больше никаких связей между вызовами, один индекс. Все, больше там ничего нет.
А теперь представьте, что будет если он будет построен на этих двух (re2c + lemon), бесспорно крутых вещах:
— прочитал эту статью
…
— захотел понять что внутри, чтобы что то изменить. Заглянул внутрь — и припух.
Те, у кого есть время, желание или академ интерес разбираться — сами возьмут re2c или подобное.
Эта вещь для других, для тех кому надо бежать, их основная масса, по моему.
И все что я пишу в опенсорс — для этой категории людей — кому нужен результат быстро, без заморочек. Посмотрите ради интереса остальные мои проекты на гитхабе — они все подобны этому — просты, работают сразу, разбираться долго не надо.
Посмотрел в код. Стало грустненько. Что только люди ни делают лишь бы не думать про формальные грамматики. Нy ладно, допустим рекурсивный спуск тоже имеет право на жизнь. Но обязательно было так перемешивать лексический и синтаксический анализ?
1. Кроссплатформенность (без WinAPI и пр)
2. Возможность определять свои функции (внутри и снаружи). Ну и там классы хотя бы или структуры.
3. Желательно, чтобы минимальный функционал (как у автора) шел «из коробки», а не как в boost, приходилось писать все правила, даже для оператора сложения, самому с нуля. Это конечно гибко, но с учетом п.5 — было бы супер.
4. «Простой» синтаксис (без особой необходимости изучать)
5. Возможность отключать функционал языка (или не включать) для тех случаев, когда писателям скриптов нельзя давать например функции обращения к диску, сети и пр.
6. Ну и размер всего этого, конечно минимальный. Как в составе приложения на диске, так и в памяти при исполнении.
Подключение к своему проекту для разных ОС отличается…
Размерчик не мал…
Как, например, отключить доступ к fs/io?
В Tcl мне в этом плане нравится концепция safe interpreter'а. Но, честно говоря, лично я Tcl никуда не встраивал, поэтому не могу ничего сказать про размер, потребление памяти, и т.д. в сравнении с другими встраиваемыми языками.
Как, например, отключить доступ к fs/io?
Через setfenv
Или даже не подключайте эти библиотеки вовсе
для каждого контекста lua это настраивается.
Во время выполнения заблокировать какой-то определённый api в контексте что ли? А какой вообще интерпретатора такое позволит, интересно) особенно если это api уже было использовано.
Ну вообще в lua можно переопределить глобальное пространство имен (что делает setfenv), можно переопределить require() (который находится в глобальном пространстве имен). Вопрос в том, что делать это надо при создании lua-шного контекста, а не пытаться ограничивать "после", потому что модули смогут сохранить ограниченный модуль в локальной переменной. А через прокси — это геморный, больной, но осуществимый путь.
Ну и никакого ffi, очевидно.
Тоже хотел написать статью и описать не очевидные на тот момент вещи, но меня остановил поток говна и минусов, которые я ожидал услышать.
Хабр еще относительно нормальный в этом смысле.
Может это и правильно, надо как то фильтровать поток, а то затопит всяким.., если все будут хлопать и поддерживать любую писанину.
У Дудя помню в его кино про SV, было про это тоже.
Но я давно понял, что «бояться глупо»(с), когда увидел (и сейчас иногда натыкаюсь), что другие выкладывают, и потом еще с пеной у рта защищают.
А готовиться стоит, это не на Хабре, а вообще у любой аудитории, которой вы презентуете что-то свое)
ничего плохого нет, даже если ничего кроме критики вы не получили)
Вот и ещё один минус Хабра, что голосовать за статьи и комментарии могут только "избранные". Плюсов у статьи всего 14, а в закладки статью добавили 26 человек. Я хочу сказать, что не видно реальной оценки.
Таким «избранным» стать несложно. Для этого даже не надо быть крутым специалистом. Надо просто приложить усилия.
Вы же понимаете, что за статьи могут голосовать и в минус. Так зачем давать право голосам на статьи тем, кто ни разу не прикладывал усилия чтобы написать свое?
Интерпретатор скрипта на С++