Yacc все еще используется в промышленности?
Вопрос
База программного обеспечения, для которой я разрабатываю, использует значительное количество yacc, с которым мне не нужно иметь дело. Иногда я думаю, что было бы полезно понять некоторые проблемы, которые я нахожу, но большую часть времени я могу сойти с рук с полным моим незнанием yacc.
Мой вопрос: достаточно ли новых проектов, в которых все еще используется yacc, чтобы затратить время на его изучение?
Редактировать. Учитывая, что ответ в основном касается изучения Yacc, есть ли такой язык, который вы бы порекомендовали по сравнению с yacc?
Решение
Да, эти инструменты стоит изучить, если вам когда-нибудь понадобится создать или изменить код, который анализирует грамматику. Р>
В течение многих лет де-факто инструментом для генерации кода для разбора грамматики был yacc, или его двоюродный брат GNU, bison.
В последнее время я слышал, что в блоке есть пара новых детей, но принцип тот же: вы пишете декларативную грамматику в формате, более или менее в форме Бэкуса-Наура ( BNF ) и yacc / bison / what генерируют для вас код, который было бы крайне утомительно писать от руки.
Кроме того, принципы, лежащие в основе грамматики, могут быть очень полезны для изучения, даже если вам не нужно напрямую работать с таким кодом. С тех пор, как я прошел курс обучения проектированию компиляторов в колледже, я почти не работал, но понимание стеков времени выполнения, анализаторов упреждающего анализа, оценки выражений и многих других связанных вещей помогло мне очень эффективно эффективно писать и отлаживать мой код. р>
edit: Учитывая ваш дополнительный вопрос о других инструментах, Yacc / Bison, конечно, лучше всего подходят для проектов на C / C ++, поскольку они генерируют C-код. Есть похожие инструменты для других языков. Не все грамматики эквивалентны, и некоторые генераторы синтаксических анализаторов могут использовать только грамматики определенной сложности. Поэтому вам может понадобиться инструмент, который сможет разобрать вашу грамматику. См. http://en.wikipedia.org/wiki/Comparison_of_parser_generators
Другие советы
Я не знаю о новых проектах, использующих его, но я участвую в семи различных работах по техническому обслуживанию, которые используют lex и yacc для обработки файлов конфигурации.
Для меня нет XML, нет-сэр: -).
Решения, использующие lex / yacc, являются шагом вперед по сравнению со старыми файлами конфигурации строк key = val
, поскольку они допускают более совершенные иерархические структуры, такие как:
server = "mercury" {
ip = "172.3.5.13"
gateway = "172.3.5.1"
}
server = "venus" {
ip = "172.3.5.21"
gateway = "172.3.5.1"
}
И да, я знаю, что вы можете сделать это с XML, но это в основном устаревшие приложения, написанные на C, и, честно говоря, я бы, вероятно, использовал lex / yacc для новых (не Java) заданий. р>
Это потому, что я предпочитаю поставлять программное обеспечение вовремя и по бюджету, а не предлагать новейшие технологии с быстрой отдачей - мои клиенты не будут платить за мое образование, они в первую очередь хотят результатов, а я уже эксперт в lex / yacc и иметь весь код шаблона, чтобы сделать это быстро.
Общее правило: код длится долго, поэтому технологии, используемые в этом коде, тоже долго работают. Для замены упомянутой вами кодовой базы потребуется огромное количество времени (на ее создание ушло 15 лет ...), что, в свою очередь, означает, что она будет существовать через 5, 10 или более лет. (Есть даже шанс, что кто-то, кто читает этот ответ, в конечном итоге будет работать над ним!)
Еще одно практическое правило: если технология общего назначения достаточно распространена, и вы уже сталкивались с ней, вероятно, достаточно распространено, чтобы вы ознакомились с ней, потому что однажды вы увидите ее снова. Кто знает: ознакомившись с ним, возможно, вы добавили полезный инструмент в свою панель инструментов ...
Yacc - одна из этих технологий: вы, вероятно, столкнетесь с ней снова, это не так сложно, и принципы, которые вы изучите, применимы ко всему семейству конструкторов синтаксических анализаторов.
PEG - это новое явление, но все еще есть масса проектов, использующих yacc или инструменты более современные, чем yacc. Я бы нахмурился над новым проектом, который решил использовать yacc, но для существующих проектов портирование на более современный инструмент может не иметь смысла. Это делает грубое знакомство с yacc полезным навыком.
Если вы совершенно не знакомы с темой генераторов синтаксических анализаторов, я бы посоветовал вам узнать об одном, любом. Многие понятия переносимы между ними. Кроме того, это полезный инструмент, чтобы иметь в виду: как только вы его узнаете, вы поймете, как часто они могут быть лучше, чем парсеры, написанные с использованием регулярных выражений. Если вы уже знакомы с темой парсеров, я бы об этом не беспокоился. Вы узнаете yacc, если и когда вам нужно, чтобы что-то сделать.
Я работаю над проектами, которые используют Yacc. Не новый код - но если бы они были новыми, они все равно использовали бы Yacc или близкого родственника (Bison, Byacc, ...).
Да, я считаю, что стоит учиться, если вы работаете в Си.
Также рассмотрите возможность изучения ANTLR или других более современных генераторов синтаксического анализатора. Но знание Yacc поможет вам в этом - оно поможет вам освоить и другие подобные инструменты, поскольку многие основные теории похожи.
Я не знаю конкретно о yacc / bison, но я использовал antlr, cup, jlex и javacc. Я думал, что они будут иметь только академическое значение, но, как выясняется, нам нужен язык, специфичный для предметной области, и это дало нам гораздо более приятное решение, чем некоторые "более простые". (на основе регулярных выражений) парсеры там. Однако обслуживание может быть проблемой во многих средах - поскольку большинство программистов в наши дни не имеют опыта работы с инструментами синтаксического анализа.
У меня не было возможности сравнить его с другими системами синтаксического анализа, но я определенно могу порекомендовать ANTLR основанный на моем собственном опыте, а также с его большой и активной базой пользователей.
Еще одним плюсом для ANTLR является ANTLRWorks: среда разработки ANTLR GUI , которая очень помогает разработка и отладка ваших грамматик. Я еще не видел другой системы синтаксического анализа, которая поддерживается такой IDE.
Мы пишем новый код yacc в моей компании для доставки продуктов. Да, этот материал все еще используется.