Каковы причины использования Ragel для разбора строк в кодовой базе C++?
Я унаследовал проект C++, который использует Ragel для разбора строк.
Это первый раз, когда я видел, как это делается, и я хотел бы понять, почему кто-то использует Ragel вместо C++ для анализа строки?
1 ответ
Генераторы синтаксических анализаторов (неправильно называемые "компиляторы-компиляторы") очень удобны в использовании и создают надежный и эффективный код C++ или C (особенно потому, что теория синтаксического анализа хорошо понятна).
В целом, использование генераторов исходного кода может быть разумным решением. Иногда, особенно в больших проектах, имеет смысл написать свой собственный (читайте о метапрограммировании, особенно SICP и даже блоге J.Pitrat). Хорошие инструменты автоматизации сборки, такие как GNU make или ninja, могут быть легко настроены для запуска генераторов кода C или C++ и использования их во время сборки.
Прочитайте вступление Ragel. Посмотрите также на flex, bison, ANTLR, rpcgen, Qt moc, swig, gperf как общие примеры генераторов C или C++.
В некоторых программах вы даже можете использовать библиотеку JIT-компиляции (например, libgccjit или LLVM) для динамического генерирования кода во время выполнения и его использования. В системах POSIX вы также можете сгенерировать во время выполнения временный файл C или C++, скомпилировать его как плагин и загрузить этот временный плагин, используя dlopen & dlsym. Хорошая культура компиляторов и интерпретаторов (например, через " Книгу Дракона") имеет смысл.
Встраивание некоторого интерпретатора (например, lua или guile) в ваше приложение также является интересным подходом. Но это сильное архитектурное решение.
Во многих случаях генерировать исходный код проще, чем писать его вручную. Конечно, это не всегда возможно.
PS. Я никогда не слышал о Ragel, прежде чем читать ваш вопрос!