LINUX.ORG.RU

Кодогенерация C

 , ,


2

2

Не далее чем вчера, находясь под впечатлением от http://www.computerra.ru/65749/steps/ (в частности, TCP стек в 160 строк), я озаботился поиском вменяемых средств кодогенерации с выводом в сишку и не обнаружил особого разнообразия. Конечно, есть просто обалденные bison, ragel, да тот же protobuf, наконец — но какого-то generic решения я не нашел.

Точнее говоря, есть autogen и m4, но они настолько инопланетными, что идея запилить свой транслятор на сишке, используя bison + flex, не кажется чем-то диким.

Может многоуважаемый all подскажет что-то новое?

P. S. основное пожелание: чтобы входной DSL был легко читаем и модифицируем без изучения тотально нового языка.

Ответ на: комментарий от alexru

Хотя если DSL, то можно и в одну строку:

do_tcp_ip_stuff();

alexru ★★★★
()

Метапрограммирование не сводится к кодогенерации. Вся суть и основная цель построения DSL заключается в том, чтобы решать задачу в терминах модели, с которой работаешь. Это реализация поведения тех абстракций и сущностей, с которыми работаешь в данный момент. То есть, это по-сути и есть Объектно-ориентированное программирование в его изначальной, кеевской интерпретации. Другое дело, что то что подразумевается под ООП сегодня, мало похоже на ту концепцию. Такой подход в нем сильно ограничен тем, что сломана семантика передачи сообщений, и, как следствие, сильно ограничены возможности произвольной реализации поведения объектов.

filequest
()

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

Это, естественно, невозможно. Либо Си, либо TCP на 160 строк.

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

тут дело не в си. Можно это и на си сделать, просто будет еще одна прослойка. То есть на си реализовать интерпретатор, который будет являться DSL-ом для данной области. Поэтому, это возможно, не просто без изучения «тотально нового языка» но и без изучения вообще какого-либо языка.

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

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

тут дело не в си

Тут дело именно в Си.

Можно это и на си сделать, просто будет еще одна прослойка. То есть на си реализовать интерпретатор, который будет являться DSL-ом для данной области.

И мы получим тот самый «тотально новый язык»

P.S. проповедь единственно верного учения Кея-Хьюитта пойдет под снос.

tailgunner ★★★★★
()
Последнее исправление: tailgunner (всего исправлений: 1)
Ответ на: комментарий от tailgunner

Это, естественно, невозможно. Либо Си, либо TCP на 160 строк.

Всего-то надо добавить мутабельные переменные в препроцессор.
Не, ну идиоты, язык сделали с сайдэффектами, зато макросы — чисто функциональщина.

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

Либо Си, либо TCP на 160 строк.

Всего-то надо добавить мутабельные переменные в препроцессор

Подтвердить свои слова можешь или как обычно?

макросы — чисто функциональщина.

Чисто? Фейспалм.

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

У меня хром (с выпиленной поддержкой флэша) повис на просмотре линка компутерры, такое ощущение что погрузился не в шесть строк, а в какой-то изощренный bloat-ware...

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

Подтвердить свои слова можешь или как обычно?

Да это и так понятно)

Чисто?

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

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

Рекурсия невозможна.

Как раз рекурсия-то там возможна. Хотя и не бесконечная, но на практически достаточную глубину можно нарекурсить.
В общем я не совсем тоже прав. Всё же не мутабельные переменные нужны(хотя они бы открыли много новых возможностей), а объявление/переобъявление макросов изнутри макросов(хотя погодите, это и есть мутабельные переменные).

Bad_ptr ★★★★★
()
Последнее исправление: Bad_ptr (всего исправлений: 2)
Ответ на: комментарий от filequest

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

Ну вот смотри: например, у меня есть некие сериализуемые структуры данных, построенные из примитивных типов, для каждого из которых написаны процедуры (де)сериализации. А теперь мне нужно по описанию структуры генерировать код для ее (де)сериализации. В C это можно сделать на весьма примитивном уровне с помощью препроцессора, но хочется большего.

По сути, нужно взять код, который «почти как C» и сгенерировать из него несколько кусков «настоящего сишного кода». И вот тут-то и проявляется инопланетность autogen, m4 и прочего.

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

Рекурсия невозможна.

Возможна. Есть прикольные библиотеки функционального программирования для Си-препроцессора. Но это всё кунштюки, ни для чего полезного не пригодные.

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

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

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

и это не отменяет факта твоего злоупотребления положением

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

Есть прикольные библиотеки функционального программирования для Си-препроцессора

Ты про P99? Как только тебе понадобится выбирать аргументы парами, придется самому писать аналогичные костылики.

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

более того наличие ссылки на омету(которую я через http://www.vpri.org/html/writings.php ища пуматру)в исходной посте делает изначально твой поход против ссылки на ioccc а в дальнейшем на «а если топить за Алана Кея то на http://www.vpri.org/html/work/NSFproposal.pdf можно разглядеть о походе через мету2»

явным злоупотреблением и стремлением самоутвердится.

qulinxao ★★☆
()
Ответ на: комментарий от kawaii_neko

Есть прикольные библиотеки функционального программирования для Си-препроцессора

Ты про P99?

Нет. Я натыкался на пару библиотек, которые реализовывали свой функциональный язык поверх CPP. Вспомню - напишу.

tailgunner ★★★★★
()

я озаботился поиском вменяемых средств кодогенерации с выводом в сишку и не обнаружил особого разнообразия

Ian Piumarta http://piumarta.com/software/peg/

qulinxao ★★☆
()
Ответ на: комментарий от beastie

Вместо приложений, в которых реализованы собственный интерфейс и функции, здесь присутствуют компоненты, имеющие сложные взаимосвязи.

все программы, в которых изначально присутствует бардак и нет чёткого разделения объектов, интерфейсов и прав доступа, рано или поздно превращаются (собственно, они правильно назвали это своё поделие) во франкенштейнов. именно так это и назвают программисты. видимо, кто-то им уже высказал своё мнение об их поделке - отсюда и название. и с точки зрения программирования никто не хочет получить в поддержку такое месиво из непонятных и сильно переплетённых сущностей, когда внесение даже мелких изменений в одном компоненте может привести к непредсказуемым последствиям в других, а попытки наращивания функционала только усложняют и запутывают работу всего поделия в целом. и самое страшное, что в таких случаях уже никакой рефакторинг не поможет. только выбросить и переписать заново.
а TCP/IP стек в 160 строк - это сказки для детей. либо чувак вообще не знает, что такое TCP/IP, либо это случай так называемого вранья.

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

там нет ничего похожего на TCP/IP стек. даже близко. в случае с одной сессией без обработки ошибок - это детсад, штаны на лямках. TCP/IP стек предполагает как минимум множество сессий и обработку ошибок. ну и плюс, например, роутинг, поддержку всяких там NAT, фильтрацию и всё такое.
дьявол скрывается в деталях и системное программирование целиком состоит из возни с этими деталями. пока ковыряешься в скриптиках для детей - это может казаться забавным, можно не учитывать реальность. но когда нужно обрабатывать поток данных в системе - это совсем другой уровень.

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

Вы почти правы - но нет.

как пример E=mc2 - всего 6 символов однако общеизвестная трактовка - есть следствие общего контекста.

далее сама мера в 160 строк очень лукава. ибо сколько кода и какого можно уместить в 1 строку. - т.е. какова теоретически максимальная плотность кода(?)

так же давно ведь общее(с середины 60ых в прогр, а в мануалах уж точно несколько веков) место - что создание жаргона(новые буквосочетания либо придача общеизвестным словам узкоспециального значения) делает текст информативней/лаконичней.

так же когда сама спецификация берётся как есть и реализуются интерпретатор спецификации - а не транслируется в низкий(т.е. в далёких от спецификации абстракциях)-

поэтому реализация на бесконечно быстром проце полного стека тсп на 160 строках возможно.

qulinxao ★★☆
()

если по скаутишь по именам победителей иоссс как раз таки увидишь оригинальные работы по кодогенерации

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

Только вот проблема... Названные движения сильно повышают требования к качеству программистов. И оно может расти только до определённого потолка. Поэтому подход Кея - игрульки.

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

повышают требования к качеству программистов

именно , поэтому то и golang в продакшен именно таковым выпустили - как инструмент который годен для применения не эйнштейнами.

qulinxao ★★☆
()

да тот же protobuf

«еще один IPC» (с). «Кококодогенерация» в таком виде есть у любой современной миддлвари — это ORM и сериализация с всасыванием либо атрибутов на полях дата-классов («мессаг»), либо JSON/XML, сгенереных по ним).

«язык описания сообщений и данных, предложенный Google, как эффективная двоичная альтернатива текстовому формату XML. Разработчики сообщают, что Protocol Buffers проще, компактнее и быстрее чем XML.[1]» (с) Разработчики больные NIH-синдромом игнорят факты, что этот XML обычно никто руками не пишет (он тоже генерится :)), а поддержка бинарного формата передачи у других тоже есть.

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

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

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

далее сама мера в 160 строк очень лукава. ибо сколько кода и какого можно уместить в 1 строку. - т.е. какова теоретически максимальная плотность кода(?)

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

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

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

В TCP перепосылок нет?

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

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

у Кея(как представителя его и его окружения взглядов) и остальных дядек идея фикс что индустрии уже стоит «перейти от римских к арабским числам и нотации» т.е на уже имеющихся системах постараться перереализовать конечный продукт - «pda»|смартфон|таблет|

«цифровая революция ещё не случалась» вот это вот всё - и в процессе этого переустановить некоторые стандарты которые имеют кучу особых случаев и по этой причине их и не возможно реализовать простыми алгоритмами как можно было бы не будь этих эволюционных наслоений.

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

у Кея(как представителя его и его окружения взглядов) и остальных дядек идея фикс что индустрии уже стоит «перейти от римских к арабским числам и нотации»

Ты опять всё перепутал.

Object-oriented design is the roman numerals of computing.

Rob Pike (2004)

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

Да нормально все с golang. Уж сильно тоже не надо драматизировать, уровень интеллекта и скиллов разработчика очень слабо связан с языком.

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

В TCP перепосылок нет?

в реализации приведённого кода из песочницы его нет. а я как раз про реальную жизнь толкую. пришёл дядька из мира теоретического программирования и начал, типа, операционную систему писать (ну, что-то вроде). и вот у него TCP стек на 160 строк получился, сферический, в вакууме.

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

у Кея(как представителя его и его окружения взглядов) и остальных дядек идея фикс что индустрии уже стоит «перейти от римских к арабским числам и нотации» т.е на уже имеющихся системах постараться перереализовать конечный продукт - «pda»|смартфон|таблет|

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

Iron_Bug ★★★★★
()
Последнее исправление: Iron_Bug (всего исправлений: 1)
Ответ на: комментарий от Iron_Bug

в мире железа есть много факторов, отнюдь не теоретических, а вполне себе физических и измеримых

А почему Вы думаете, что они реализуют свою систему на стандартном железе?

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

пришёл дядька из мира теоретического программирования

Вы немного попутали. Этот дядька занимался реальным программированием, более того, он является пионером во многих вещах. Например оконный интерфейс — это его изобретение.

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

слушай. прекрати позорица

как тот шлимазл который не пошёл на Карузо ибо ему рабинович напел.

и Пайк и Кей стороники разных но совместимых парадигм.

у Пайка(долгое беллабствование не проходит даром) - большая практика в датадрайвен а затем опыт использования хоаровой алгебры процессов ...

у Кея взгляд на всю выч. систему как систему взаимодействующих клеток(Кей по первому образованию биолог)

и тот и другой как ты можешь заметить уже давным давно (к концу 1970ых точны) озадачены как эффективно рулить конкурентымми(в смысле отсутсвия всеведующего проца-вседержеателя который между итерациями общитывает весь мир)системами с локальностями как у акторов Хьюита.

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