21.1. Синтаксис и семантика языков программирования
У каждого языка программирования, как и у любого естественного языка, есть свои синтаксис и семантика.
Синтаксис — совокупность правил некоторого языка, определяющих формирование его элементов. Иначе говоря, это совокупность правил образования семантически значимых последовательностей символов в данном языке. Синтаксис задается с помощью правил, которые описывают понятия некоторого языка. Примерами понятий являются: переменная, выражение, оператор, процедура. Последовательность понятий и их допустимое использование в правилах определяет синтаксически правильные структуры, образующие программы. Именно иерархия объектов, а не то, как они взаимодействуют между собой, определяются через синтаксис. Например, оператор может встречаться только в процедуре, а выражение в операторе, переменная может состоять из имени и необязательных индексов и т.д. Синтаксис не связан с такими явлениями в программе, как «несоответствие типов» или «переменная с данным именем не определена». Этим занимается семантика.
Семантика — правила и условия, определяющие соотношения между элементами языка и их смысловыми значениями, а также интерпретацию содержательного значения синтаксических конструкций языка. Объекты языка программирования не только размещаются в тексте в соответствии с некоторой иерархией, но и дополнительно связаны между собой посредством других понятий, образующих разнообразные ассоциации. Например, переменная, для которой синтаксис определяет допустимое местоположение только в описаниях и некоторых операторах, обладает определенным типом, может использоваться с ограниченным множеством операций, имеет адрес, размер и должна быть описана до того, как будет использоваться в программе.
Текст исходной программы на языке высокого уровня представляет собой обычный тестовый файл. Для его «чтения» и превращения в последовательность машинных команд, прежде всего, выполняется синтаксический анализ текста программы.
Синтаксический анализатор — компонента компилятора, осуществляющая проверку исходных операторов на соответствие синтаксическим правилам и семантике данного языка программирования. Несмотря на название, анализатор занимается проверкой и синтаксиса, и семантики. Он состоит из нескольких блоков, каждый из которых решает свои задачи.
21.2. Структура языков программирования
Языки программирования достаточно сильно отличаются друг от друга по назначению, структуре, семантической сложности, методам реализации. Это накладывает свои специфические особенности на разработку конкретных трансляторов. Структура языка характеризует иерархические отношения между его понятиями, которые описываются синтаксическими правилами. Языки программирования могут сильно отличаться друг от друга по организации отдельных понятий и по отношениям между ними. Например, язык C++ допускает описание переменных в любой точке программы перед первым ее использованием, а в Паскале переменные должны быть определены в специальной области описания. В зависимости от принятого решения, транслятор может анализировать программу за один или несколько проходов, что влияет на скорость трансляции.
Семантика языков программирования изменяется в очень широких пределах. Они отличаются не только по особенностям реализации отдельных операций, но и по парадигмам программирования, определяющим принципиальные различия в методах разработки программ. Специфика реализации операций может касаться как структуры обрабатываемых данных, так и правил обработки одних и тех же типов данных. Даже при выполнении операции сложения двух целых чисел такие языки, как C и Паскаль, могут вести себя по-разному.
Один и тот же язык может быть реализован нескольким способами. Это связано с тем, что теория формальных грамматик допускает различные методы разбора одних и тех же предложений. В соответствии с этим трансляторы разными способами могут получать один и тот же результат (объектную программу) по первоначальному исходному тексту. Существует несколько компиляторов языка Паскаль: Turbo Pascal, MS Pascal, Pascal with Objects, Delphi, Builder. Вместе с тем, все языки программирования обладают рядом общих характеристик и параметров. Эта общность определяет и схожие для всех языков принципы организации трансляторов.
Для любого языка его создателями определяются:
- множество символов, которые можно использовать для записи правильных программ (алфавит);
- множество правильных программ (синтаксис);
- «смысл» каждой правильной программы (семантика).
Рассмотрим пример синтаксического разбора. Пусть в исходном тексте программы встретилась формула a + (b + c) * d. В большинстве языков программирования такая формула определяет иерархию программных объектов, которую можно отобразить в виде дерева (Рис. 21 .79). В кружках представлены символы, используемые в качестве элементарных конструкций, а в прямоугольниках задаются составные понятия, имеющие иерархическую и, возможно, рекурсивную структуру.
Синтаксическая структура, правильная для одного языка, может быть ошибочной для другого. Например, в языке Лисп приведенное выражение не будет распознано. Однако для этого языка корректным будет являться выражение ( * ( + a b c ) d ).
Рис. 21.79. Дерево синтаксического разбора.
Другой характерной особенностью всех языков является их семантика. Она определяет смысл операций языка, корректность операндов. Цепочки, имеющие одинаковую синтаксическую структуру в различных языках программирования, могут различаться по семантике (что, например, наблюдается в C++, Pascal, Basic для приведенного выше фрагмента арифметического выражения). Знание семантики языка позволяет отделить ее от его синтаксиса и использовать для преобразования в другой язык (осуществить генерацию кода). Описание семантики и распознавание ее корректности обычно является самой трудоемкой и объемной частью транслятора, так как необходимо осуществить перебор и анализ множества вариантов допустимых комбинаций операций и операндов.
Основная задача программирования
Основная задача программирования – комплексная задача проектирования системы решения задачи обработки информации. Решение этой задачи осуществляется в рамках определенной методологии и технологии. Технология программирования включает, в частности, работу в конкретной системе проектирования (программирования), основанной на использовании конкретного языка программирования. Современные представления о технологиях программирования ушли далеко вперед от простого описания алгоритма на конкретном ЯП.
Однако Языки программирования нужно знать
Языки программирования как формальные языки описания алгоритмов. Языки программирования высокого уровня играют роль средства связи между программистом и компьютером, а также между программистами. Это обстоятельство накладывает на язык многие обязательства: 1.Язык должен быть близок к тем фрагментам естественных языков, которые обеспечивают конкретную предметную область деятельности человека; (Язык, ориентированный на деловые сферы применений, должен содержать понятия, используемые в этом виде деятельности: документ, счет, база данных и т.п.). 2.Все средства языка должны быть формализованы в такой степени, чтобы их можно было реализовать как машинные программы; (например, предложение “Найти документ X в базе Y“ должно породить программу в машинном языке, осуществляющую требуемый поиск). 3.Язык программирования не только поддерживает предметно-ориентированную деятельность, но и стимулирует ее развитие (понятие базы данных, вычислительной сети привело к революции в деловой деятельности). 4.Язык программирования — нечто большее, чем средство описания алгоритмов: он несет в себе систему понятий, на основе которых человек может обдумывать свои задачи, и нотацию, с помощью которой он может выразить свои соображения по поводу решения задачи. Изучая новый язык программирования, лучше всего к нему относиться, как к любому другому иностранному языку: средства языка принимать как данные от Бога, даже если они нам кажутся непонятными, плохими или ненужными.
2. Краткая история развития языков программирования
- функционального программирования (Lisp),
- логического программирования (Prolog),
- алгебраического программирования (Reduce, APS).
- Развитие языков программирования для мультипроцессорных и мультимашинных систем;
- Развитие декларативных языков программирования, ориентированных на задачи искусственного интеллекта;
- Развитие объектно-ориентированных языков, в которых иерархия абстракций позволяет наращивать средства языка, одновременно меняя архитектуру ЭВМ применительно к рассматриваемому классу проблем.