РАСШИРЕНИЯ ЯЗЫКОВ Как обычно расширяются возможности языков программирования? Во-первых, с помощью библиотек функций. С появлением ООП, стало возможным расширение типов. В данной работе рассматривается новая альтернативная возможность расширения языков – это расширение их синтаксиса, то есть фактически, расширение транслятора. Для того, чтобы лучше пояснить суть идеи, рассмотрим пример кода на гипотетическом языке с расширяемым синтаксисом. ПРИМЕР Сначала в исходном файле подключается расширение синтаксиса, добавляющее поддержку технологии sql-запросов. Это даёт возможность дальше использовать специфические синтаксические конструкции: в частности, писать sql запросы прямо в исходном коде. Благодаря этому среда разработки может подсвечивать синтаксис sql запроса, а компилятор проверять его корректность прямо на этапе компиляции. В запросе можно использовать локальные переменные, что безусловно очень удобно. И, наконец, созданный запрос можно выполнить. ЧТО ЭТО ДАЁТ? Как было видно из примера, подобный подход даёт несколько преимуществ: Каждое расширение предлагает удобный синтаксис для решения своей конкретной задачи. Многие проверки переносятся с этапа выполнения на более ранний этап компиляции. В нашем примере, это случилось с проверкой корректности sqlзапросов. Всё это даёт возможность гибко и качественно поддерживать множество различных технологий и парадигм прямо на уровне синтаксиса языка. ТРАНСЛЯЦИЯ Расширение синтаксиса означает расширение транслятора. В классической схеме построения транслятора, исходный код программы в виде последовательности символов сначала поступает на вход лексическому анализатору, который выделяет из текста отдельные лексемы. Затем поток лексем преобразуется синтаксическим анализатором в некоторое внутреннее представление программы, с которым потом работают дальнейшие этапы трансляции. Расширение транслятора подразумевает, что каждый из этих этапов станет расширяемым. Само расширение выглядит примерно так. К каждому из этапов подключается модуль расширения, добавляющий поддержку дополнительных возможностей (в нашем примере – поддержку sql) В данной работе рассматриваются вопросы синтаксических и лексических анализаторов. создания расширяемых версий ЛЕКСИЧЕСКИЙ АНАЛИЗАТОР При создании ЛА наиболее распространены два способа. Первый основан на теории регулярных выражений и конечных автоматов. Во втором способе тип очередной лексемы определяется по одному или двум первым символам лексемы. На базе каждого из этих способов мной были разработаны расширяемые версии ЛА-ов. В чём же особенности расширяемых анализаторов? РАСШИРЯЕМЫЙ ЛА. Особенности Лексический анализатор перестаёт быть чем-то монолитным и неизменным, а гибко настраивается и расширяется. В результате расширения, в процессе добавления новой лексемы может возникнуть конфликт с добавленными ранее лексемами. В качестве примера тут приведён знак «меньше либо равно», который может интерпретироваться двояко. Для обоих способов построения ЛА мной были разработаны алгоритмы диагностирования подобных конфликтов и их автоматического разрешения в случаях, когда это возможно. СИНТАКСИЧЕСКИЙ АНАЛИЗАТОР Этап синтаксического анализа обычно управляется формальной грамматикой. Суть расширения синтаксического анализатора – это модификация грамматики. Итак, как же модифицировать грамматику? СИНТАКСИЧЕСКИЙ АНАЛИЗАТОР. Совместимость расширения При расширении важно, чтобы исходной. То есть программы расширенным СА-ом точно в то Вообще говоря, проверка этого неразрешимой задачей. расширенная грамматика оставалась совместимой с исходной грамматики должны преобразовываться же внутреннее представление, что исходным СА-ом. условия в общем случае является алгоритмически СИНТАКСИЧЕСКИЙ АНАЛИЗАТОР. Расширение Для того, чтобы не решать эту неразрешимую задачу, можно поступить так. Расширение можно свести к серии безопасных преобразований грамматики: в результате каждого из таких безопасных преобразований получаются грамматики заведомо совместимые с исходной. Система таких безопасных преобразований мной и была разработана. ПРАКТИЧЕСКИЕ РЕЗУЛЬТАТЫ Теоретические разработки были проверены на практике. А именно, на языке Java были реализованы следующие вещи: • Расширяемый «подглядывающий» ЛА • Расширяемый предсказывающий LL(1) синтаксический анализатор • Для модельного языка Pascal-S разработана грамматика ядра этого языка и несколько независимых расширений этого ядра, которые в совокупности и формируют полную грамматику языка Pascal-S. ВЫВОДЫ В этой работе показано, что столь нетривиальные этапы как лексический и синтаксический анализ допускают расширение. Это означает, что изначальная идея – создание ЯП с расширяемым синтаксисом не является утопией и вполне реализуема на практике. А учитывая свойственные этому подходу преимущества, можно предположить, что будущее промышленного программирования будет именно за этим подходом.