
- •Теория языков программирования и методы трансляции
- •1. Языки и кризис программирования.
- •2. Математические методы описания языков программирования.
- •3. Основные понятия и определения.
- •1. S→ab→aAb→aaAb→aaaB→aaabB→aaabbB→aaabbbB→aaabbbb.
- •2. S→ab→AbB→AbbB→AbbbB→Abbbb→aAbbbb→aaAbbbb→aaabbbb
- •Load a mult b
- •4. Этапы построения транслятора.
- •5. Основные методы поиска ошибок в исходных текстах программ.
- •Устройство управления
- •6. Современное состояние и перспективы развития программирования трансляторов.
- •7. Лексический анализ. Интуитивный подход.
- •8. Классы лексем и их особенности.
- •9. Формирование таблиц лексем и построение дескрипторного текста исходной программы.
- •На основании составленных таблиц можно записать входной текст через введённые дескрипторы (дескрипторный текст):
- •10. Синтаксический анализ. Метод рекурсивного спуска.
- •11. Пример грамматики упрощенного языка Паскаль.
- •12. Пример программы на упрощенном Паскале.
- •Var sum, sumsq, I, value, mean, variance : integer;
- •13. Алгоритм синтаксического анализа по методу рекурсивного спуска.
- •Void read()
- •Void idlist()
- •Void assign()
- •15. Лексический анализ, регулярные грамматики и конечные автоматы.
- •17. Грамматики типа ll(k). Алгоритмы построения магазинных анализаторов.
- •18. Детерминированный синтаксический анализ сверху вниз.
- •19. Правила определения детерминированного мп-разпознавателя по ll(1) грамматике.
- •20. Заключение.
- •Литература
5. Основные методы поиска ошибок в исходных текстах программ.
Поиск ошибок в текстах программ одна из неотъемлемых задач транслятора. Основой для поиска ошибок является грамматика языка программирования. Основная идея в том, что любая строка программы может быть получена из аксиомы языка с помощью использования необходимых продукций грамматики. Если строку нельзя вывести из аксиомы, то эта строка не соответствует данному языку программирования. Это обстоятельство применяется в нисходящих методах поиска синтаксических ошибок. Возможен и другой подход. Любую строку языка можно преобразовать в аксиому языка с помощью продукций грамматики. Если это не возможно, то строка языку не соответствует. Практическое использование этих идей сопряжено с множеством проблем. Главная из них состоит в формализации процесса поиска ошибок. Поскольку интуитивные подходы не гарантируют 100% обнаружения ошибок, допускаемых программистом по объективным и субъективным причинам.
Формализация методов поиска ошибок производится на математической модели, отражающей работу транслятора.
#
├Устройство управления
Допустить Отвергнуть
Рис.5.1. Магазинный автомат (анализатор).
Эта модель представляет собой магазинный автомат (МА). Он имеет структуру, изображённую на рис.6.
Принцип работы МА следующий. На входной ленте размещают текст программы. В конце ставится маркер, конца текста ├. В магазинную память в начальный момент наверх магазина заносится маркер дна магазина # или аксиома языка и маркер дна магазина S#. Устройство управления переносит лексемы с входной ленты в магазинную и анализирует текущее состояние автомата по управляющим таблицам. При определённом сочетании символов на входной ленте и наверху магазина выбирается одна из двух команд: «Отвергнуть», если текст содержит ошибку, или «Допустить», если ошибок нет.
Автомат строится достаточно просто, но основная сложность в построении управляющих таблиц МА. Чтобы избежать этой сложности поступают следующим образом. КС грамматики, описывающие язык программирования приводят к нормальным формам, например, Хомского или Грейбах. Процедуры приведения для произвольных КС грамматик формализованы и поэтому это всегда возможно.
Для нормальных форм разработаны общие процедуры заполнения управляющих таблиц МА. Т.е. процесс полностью формализован, хотя и достаточно сложен. После того как МА построен, достаточно запрограммировать команды управляющей таблицы и получить готовый фрагмент транслятора.
6. Современное состояние и перспективы развития программирования трансляторов.
Программирование не возможно без алгоритмических языков. Перед программистами постоянно возникают новые задачи, которые требуют новых программных решений. А те в свою очередь требуют расширения возможностей языков программирования. В последнее время широкое развитие в программировании получили интегрированные среды, в которых на принципах объектного программирования объединяются усилия многих программистов. Универсальные языки высокого уровня стали очень сложны. В них, как правило, можно выделить, достаточно простое ядро, которое достаточно быстро осваивается программистом, но дальнейшее погружение в язык требует многолетних усилий.
Сложность трансляторов, при этом, многократно возросла. Нечего и думать об их «ручной» реализации. И тем более о нахождении все 100% возможных ошибок программирования при интуитивном подходе к их построению.
На начальном этапе развития языков высокого уровня трансляторы составлялись на основе интуитивных походов. Сложность реализации, которого ограничивало развитие языков программирования. Поскольку язык программирования без работающего транслятора практической ценности не имеет.
С переходом к формальным моделям и применению формальных методов построения трансляторов их быстродействие возросло вдвое. А сложность при этом стала просто не сопоставимой с прежней. Одновременно с этим не сопоставимо возросли возможности программ написанных на новых языках. В 60 годы прошлого столетия прорывным в этом отношении оказался язык «Паскаль». Транслятор для него строился на базе формальных грамматик. В частности использовались грамматики простого предшествования, разработанные Виртом.
Развитие теории формальных языков и грамматик позволяет в большей степени применять формальные методы построения трансляторов для языков с расширенными возможностями для программирования. Перспективным является разработка автоматизированной системы проектирования трансляторов САПР трансляторов, что обеспечивается полной формализацией методов их построения.
Перспективным является разработка языков параллельного программирования, позволяющих распараллеливать отдельные программы пользователей и за счёт этого существенно повышать производительность вычислительных систем. Проблема в том, что нельзя требовать от программиста написания параллельных программ. Такое требование не перспективно, так как людское мышление последовательностное, параллельность в мышлении и действиях практически не возможны для одного человека. Программист может писать программы, в которых все действия следуют один за другим, а не одновременно. В реальности как раз наоборот, всё происходит одновременно. В перспективе и программы отражающие реальность должны быть параллельными. Единственный выход – распараллеливание программ должно производиться на уровне транслятора. Это освободит программиста от необходимости писать и отлаживать параллельные программы.
Параллельное программирование актуально особенно в настоящем, поскольку перспектива за многопроцессорными и многомашинными вычислительными системами, в которых реализация распараллеленных программ реально возможна.