
Парсер C++ на своем DSL: попытка обогнать компилятор
Adler3D 1 минуту назад Парсер C++ на своем DSL: попытка обогнать компилятор Сложный 22 мин 21 C++ * Компиляторы * Open source * Программирование * C * Проекты растут. Кодовая база растёт. Время компиляции растёт вместе...
<5 — 2026'da uzaya kaç SpaceX Starship fırlatması ulaşacak?
Вот важная новость с фронта ИИ: Adler3D 1 минуту назад Парсер C++ на своем DSL: попытка обогнать компилятор Сложный 22 мин 21 C++ * Компиляторы * Open source * Программирование * C * Проекты растут. Время компиляции растёт вместе с ними и переходит все границы разумного. В какой-то момент я решил: а что если попробовать написать свой компилятор?
Пока только для разработки, не для прода. На замену Clang++/G++/CL. Эта статья — о первом шаге на этом пути.
Технические детали
О парсере C++, который я написал на своём DSL специально сделанном для этого изначально. просто картинка которая понравилась и которая создана/найдена с помощью "компилятора простейших математических формул"(мой предыдущих проект)ИнструментыQapGen - генератор парсеров специально сделанный для того чтобы когда-то написать самый быстрый загрузчик Concrete Syntax Tree" data-abbr="CST">CST(конкретное дерево разбора) С++. QapDSLv2 - язык для QapGen-а на котором описываются грамматики языков программирования.
Про грамматику QapDSLv2 Грамматика — это ветка из лексеров. Лексер состоит из полей, к полям можно привязывать через "=" правила. Поля - это обычно тоже лексеры.
Исключение - это деградировавшие до самого дна лексеры-терминалы которые либо пишут прямо в поля-строки лексера, либо вообще в никуда (когда их задача - это связаться с константной-зашитой последовательностью символов). Пример фрагмента простой грамматики для javascript чтобы понять синтаксис ; // или можно вот так ещё: Во что это развернётся в С++: // надо ли раскрывать спойлеры??? Возможно тут будет немного больно, я предупредил:struct t_js_let_var_stat:public i_stat{ #define DEF_PRO_STRUCT_INFO(NAME,PARENT,OWNER)NAME(t_js_let_var_stat)PARENT(i_stat) #define DEF_PRO_VARIABLE(ADDBEG,ADDVAR,ADDEND)\ ADDBEG()\ ADDVAR(t_name,type,DEF,$,$)\ ADDVAR(t_name,var,DEF,$,$)\ ADDVAR(t_js_expr,expr,DEF,$,$)\ ADDEND() //=====+>>>>>t_js_let_var_stat #include "QapGenStructNoTemplate.
Отраслевые последствия
inl" //<<<<<+=====t_js_let_var_stat public: void Use(i_visitor&A){A. Do(*this);} static SelfClass*UberCast(ParentClass*ptr){return i_visitor::UberCast(ptr);} public: bool go(i_dev&dev){ t_fallback $(dev,"t_js_let_var_stat",nullptr,this,__LINE__); auto&ok=$. ok)return ok; ok=dev.
go_const("let $(ok,",\"l\" if(! ok)return ok; ok=dev. go_const(" $(ok,",\" \" if(!
ok)return ok; ok=dev. go_auto(type);$(ok,"t_name,\"c\" if(! ok)return ok; ok=dev.
Событие, по словам экспертов, усилит конкуренцию в сфере ИИ.




