![](/user_photo/1549_7W_y5.jpg)
- •1 Общая модель компилятора. Блоки компилятора и их функции
- •2 Общее понятие синтаксиса и семантики языка. Бнф и др. Методы описания синтаксиса и семантики языка.
- •3 Понятие языка. Способы задания языка. Операции над языком
- •4 Регулярные выражения. Способы задания регулярных выражений. Операции над регулярными выражениями.
- •5.Конечные автоматы. Способы задания. Методы построения конечных автоматов. Преобразование конечных автоматов.
- •6 Лексический анализ. Методы и средства построения лексического анализатора.
- •7 Распознавание цепочек символов с помощью конечных автоматов.
- •8 Распознавание цепочек символов с помощью автоматов с магазинной памятью.
- •9 Грамматики языков. Классификация языков по Хомскому.
- •11 Методы представления грамматики в памяти.
- •12 Нисходящий синтаксический анализ. Метод рекурсивного разбора.
- •14 Нисходящий синтаксический анализ. Методы восстановления после ошибок.
- •16 Синтаксический анализ приоритета операторов. Функция приоритета
- •18 Slr-анализаторы. Построение таблиц для slr-анализатора.
- •19 Методы анализа ошибок. Восстановление после ошибок.
- •20 Семантика языка, методы описания и анализа.
- •21 Понятие атрибутивные грамматики
- •22 Синтаксически управляемая трансляция.
- •23 Таблица символов, таблица меток и др. Методы построения, доступа и анализа.
- •24 Генерация промежуточного кода.
- •25 Методы оптимизация промежуточного кода.
- •29 Имена, связывание, проверка типов.
- •30 Область видимости имен. Способы реализации.
- •31 Типы данных. Способы реализации.
- •32 Выражения и операторы присваивания. Способы реализации.
- •36. Абстрактные типы данных. Способы реализации.
- •37 Объектно-ориентированные языки программирования. Способы реализации.
- •38 Обработка исключительных ситуаций. Способы реализации.
- •39 Языки параллельного программирования. Способы реализации.
- •40 Императивные языки программирования. Способы реализации.
- •41 Функциональные языки программирования. Способы реализации.
- •42 Языки логического программирования. Способы реализации.
- •43 Графовые грамматики. Назначение и основные понятия.
- •44 Antlr. Tree grammars.
- •46 Case-средства. Назначение, классификация и основные понятия.
- •47 Case-средства. Направления интеллектуализации.
39 Языки параллельного программирования. Способы реализации.
Основная задача управляющих систем реального времени - сбор и обработка данных от физических устройств и управление физическими устройствами. Введение понятия параллельного процесса отражает тот факт, что физические устройства работают в реальном времени параллельно друг с другом и для естественного, адекватного описания их поведения, программные компоненты также должны работать параллельно (по крайней мере, с точки зрения программиста). Использование для этой цели последовательных языков ведет к неадекватному описанию, так как на последовательном языке приходится в рамках одной последовательности увязывать действия устройств в некоторую неестественную логическую временную цепь, хотя сами устройства такими логическими связями не обладают. Поэтому построение программ реального времени на основе параллельных процессов - это такое же мощное средство структуризации, как и введение процедур и функций в последовательных программах. С более общей точки зрения можно считать понятие параллельного процесса развитием понятий процедуры, функции, класса и рассматривать параллельное программирование не только как специфический тип программирования систем реального времени, но и как достаточно общую методологию разработки программного обеспечения.
40 Императивные языки программирования. Способы реализации.
Императивные языки обычно предусматривают лишь ограниченную поддержку функционального программирования. Недостаток использования императивного языка для функционального программирования в том, что функции в императивных языках имеют ограничения, наложенные на типы значений, которые они возвращают. В таких языках, как FORTRAN и Pascal, функции возвращают только переменные скалярного типа. Еще более важным является то, что они не могут возвращать функции. Такие ограничения сужают круг функциональных форм, поддерживаемых императивным языком. Другая серьезная проблема, относящаяся к функциям в императивных языках, заключается в том, что функции могут иметь побочные эффекты.
41 Функциональные языки программирования. Способы реализации.
Математическая функция — это отображение (mapping) элементов одного множества, называемого областью определения (domain set), в другое множество, называемое множеством значений (range set). В определении функции явно или неявно указываются множество определения и множество значений вместе с самим отображением. Отображение описывается выражением или, в некоторых случаях, таблицей. Функции часто применяются к отдельному элементу множества определения.
Простые функции
Определения функций часто записываются в виде имени функции, за которым следует список параметров в скобках и выражение, задающее отображение. Например, cube(х)=х*х*х, где x - действительное число.
В этом определении областью определения и областью значений является множество всех действительных чисел. Символ = используется в качестве сокращения выражения "определяется как". Параметр х может быть любым элементом из множества определения, но во время вычисления выражения, определяемого функцией, он представляет собой только один конкретный элемент. В этом заключается отличие параметров математических функций от переменных в императивных языках.
Функции более высокого порядка, или функциональные формы (functional forms), отличаются тем, что они либо получают функции в виде параметров, либо некая функция является результатом их работы, либо имеет место и то, и другое. Наиболее распространенным видом функциональных форм является композиция функций (function composition), параметрами которой служат две функции. Результат композиции функций - это функция, значения которой являются, в свою очередь, результатом применения первой функции-параметра к результату работы второй функции-параметра.
Конструкция (construction) — это функциональная форма, получающая в качестве параметра список функций.
Функция применить ко всем (apply-to-all) — это функциональная форма, имеющая в качестве параметра одну функцию.
Основы функциональных языков программирования
Функциональные языки программирования разрабатывались с целью как можно более точной имитации математических функций. В результате возник подход к решению задач, в корне отличающийся от методов, применяемых императивными языками. В императивном языке вычисляется некое выражение, и результат помещается в ячейку памяти, представленную переменной в программе. Необходимость уделять внимание ячейкам памяти приводит к методологии программирования относительно низкого уровня, близкого к машинным командам. Программа на языке ассемблера часто к тому же должна хранить результаты промежуточных вычислений. Например, чтобы вычислить выражение (х+у)/(а-b), значение выражения (х+у) должно быть вычислено первым. Это значение должно быть помещено в память, пока вычисляется значение выражения (а-b). Чтобы облегчить эту задачу, размещение промежуточных результатов вычисления выражений в языках высокого уровня обрабатывается компилятором. Размещение промежуточных результатов в этих языках все еще необходимо, но детали скрыты от программиста.
Чисто функциональный язык программирования не использует ни переменных, ни операторов присваивания. Это освобождает программиста от заботы о ячейках памяти компьютера, на котором будет выполняться программа. Отсутствие переменных делает невозможным использование итеративных конструкций, поскольку они управляются переменными. Повторение должно выполняться только с помощью рекурсии. Программы представляют собой определения функций и спецификаций применения функций, а выполнение заключается в вычислении применений функции. В отсутствие переменных выполнение программы, написанной на чисто функциональном языке, не имеет структуры в смысле операционной или денотационной семантики. Выполнение функции при одних и тех же параметрах всегда приводит к одному и тому же результату. Это явление называется прозрачностью ссылок (referential transparency). Она делает семантику чисто функциональных языков программирования намного более простой, чем семантика императивных языков и функциональных языков, обладающих императивными свойствами.
Функциональный язык содержит набор элементарных функций, набор функциональных форм для построения сложных функций из этих элементарных функций, операцию применения функции и некоторую структуру или структуры для представления данных. Эти структуры используются для представления параметров и значений, вычисленных функциями. Хорошо определенный язык функционального программирования нуждается лишь в небольшом количестве элементарных функций.
Сравнение функциональных и императивных языков
Поскольку императивные языки основаны непосредственно на неймановской архитектуре компьютеров, программисты, используя их, должны иметь дело с управлением переменными и присваиванием значений этим переменным. В результате возрастает эффективность выполнения программ, но затрудняется их создание. В функциональном языке программисту не нужно связываться с переменными, поскольку в нем не требуется абстрактно представлять ячейки памяти. Одним из результатов такого подхода является снижение эффективности выполнения программы. Другой результат, однако, заключается в более высоком уровне программирования, для которого требуется меньше усилий, чем при программировании на императивном языке.
Функциональные языки могут иметь очень простую синтаксическую структуру. Синтаксис императивных языков намного сложнее. Семантика функциональных языков также может быть простой по сравнению с семантикой императивных языков.
Параллельное выполнение программ в императивных языках трудно проектировать и использовать. Функциональные программы могут выполняться путем предварительного перевода их в форму графов. Эти графы затем выполняются с помощью редукции графов, которая осуществляется большей частью параллельно, хотя это не было указано программистом. Представление программ в виде графов естественным образом раскрывает много возможностей для параллельного выполнения. Синхронизация взаимодействия в этом процессе не входит в обязанности программиста.
В императивном языке программирования программист должен выполнить статическое разбиение программы на параллельно выполняемые части, которые затем оформляются в виде задач. Программы на функциональных языках программирования могут динамически разделяться на параллельно выполняемые части системой выполнения программ, что делает этот процесс очень хорошо приспособленным к аппаратному обеспечению, на котором он должен выполняться.