Файл: Международные и отечественные стандарты языков программирования. Сходство и отличия стандартов (Понятие «язык программирования»).pdf

ВУЗ: Не указан

Категория: Курсовая работа

Дисциплина: Не указана

Добавлен: 01.04.2023

Просмотров: 104

Скачиваний: 1

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

Программист должен уметь не только использовать готовые стандарты, но и разрабатывать новые. Так, например, правила однотипного оформления исходного текста программы определяются стандартом проекта, который может быть изменен при начале разработки нового проекта. Однако в течение выполнения одного проекта оформление всех частей программы должно быть однотипным. Поэтому зачастую перед началом нового проекта конкретным программистам следует разрабатывать свои стандарты, которые не нарушают ГОСТ, ОСТ и СТП и действуют в пределах конкретного проекта.

2.2. Сходства и различия международных и отечественных стандартов языков программирования

Сравнивая между собой конструкции современных языков программирования и выделив их общую составляющую, можно описать (не создать, а именно описать уже существующий de facto!) «универсальный» язык программирования (правда, только на семантическом уровне).

Существующая ныне система стандартизации языков программирования не способствует выполнению этой задачи. Главная проблема состоит в том, что при описании стандарта семантическая составляющая не отделена от синтаксиса и лексики. Кроме того, при модернизации стандартов комитеты ISO/ANSI предпочитают скорее добавлять в язык новые возможности, чем исключать редко используемые, что приводит к неоправданному синтаксическому расширению языков [10].

На мой взгляд, необходимо предпринять несколько радикальных шагов, изменяющих создавшуюся ситуацию. Первое, что надо сделать, – отделить семантику каждой языковой конструкции (т. е. то, что она делает) от синтаксиса и лексики (т. е. от того, как она выглядит).

Второе – разработать единые правила описания семантики языка программирования (подобно тому, как с помощью БНФ описываются синтаксис и лексика языка). Можно предположить, что описание семантики конструкции языка должно содержать перечень ее обязательных компонент и описание действий. Порядок следования компонент и их внешний вид должны быть оставлены за пределами семантического описания. Ниже приведены примеры описания конструкций с разделением их семантической и синтаксической составляющих.

Семантическое описание оператора while. Цикл С Предусловием должен содержать следующие обязательные компоненты:


Условие Продолжения Цикла

Тело Цикла

Условие Продолжения Цикла представляет собой выражение логического (булевого) типа [8].

Тело Цикла – оператор или список операторов языка программирования.

Условие Продолжения Цикла вычисляется всякий раз перед началом цикла. Если его значение «истина», то выполняются операторы, входящие в ТелоЦикла. В противном случае управление передается оператору, следующему за оператором Цикл С Предусловием.

В семантическом описании ничего не говорится о том, как выглядит оператор, каков порядок следования его компонент. Внешний вид оператора содержится в синтаксическом стандарте конкретного языка программирования.

Синтаксическое описание оператора while. Цикл С Предусловием выглядит следующим образом в разных языках программирования:

Цикл С Предусловием PASCAL::=

?while? Условие Продолжения Цикла ?do?

Тело Цикла

Цикл С Предусловием C::=

?while? ?(? Условие Продолжения Цикла ?)?

Тело Цикла

Цикл С Предусловием MODULA::=

?while? Условие Продолжения Цикла ?do?

Тело Цикла ? end?

Семантическое описание типа «указатель». Подобная конструкция содержится в любом современном языке программирования (кроме Java, где указатели используются неявно) [4].

Тип Указатель должен содержать следующие обязательные компоненты:

Имя Типа

Базовый Тип

Имя Типа представляет собой идентификатор.

Базовый Тип – имя встроенного или ранее описанного типа языка программирования.

Тип Указатель – это адрес конструкции Базовый Тип. Его размер фиксирован и зависит от платформы программирования (для Win32 он составляет 4 байта).

Принципы построения семантического стандарта не зависят от того, какую конструкцию он описывает – оператор языка или тип данных.

Синтаксическое описание типа «указатель». Синтаксические стандарты типа Тип Указатель есть в различных языках программирования (в Java указатели формально отсутствуют, но на самом деле все типы данных являются указателями).

Тип Указатель PASCAL::=

Имя Типа ?=? ?^? Базовый Тип

Тип Указатель C::=

?typedef? Имя Типа ?*? Базовый Тип

Тип Указатель MODULA2::=

Имя Типа ?=? ?pointer? ?to? Базовый Тип

Синтаксические описания этой конструкции в разных языках похожи друг на друга. Везде новому имени типа (идентификатору) ставится в соответствие имя другого типа (базового).

Содержание семантического и синтаксического стандартов языка

На основании приведенного выше можно в общих чертах описать способы задания семантического и синтаксического стандартов любого языка программирования. Семантическое описание любой конструкции языка (оператора, типа данных, процедуры и т. д.) должно содержать не менее трех обязательных частей [12]:


Список компонент, из которых состоит конструкция (в Тип Указатель это компоненты Имя Типа и Базовый Тип)

Описание каждой компоненты

Описание конструкции в целом

Для синтаксического описания достаточно привести формальное определение конструкции, например, в виде БНФ. Следует отметить, что со времен Алгола полное синтаксическое описание языка всегда присутствует в его стандарте. Раньше оно было вспомогательным средством, облегчающим работу разработчиков компиляторов, сейчас же это описание должно, во–первых, стать частью стандарта языка и, во–вторых, тесно интегрироваться с семантическим описанием.

Описание единой семантической базы современных языков программирования даст уникальную возможность создания «универсального» компилятора, который мог бы работать с любым существующим языком, имеющим общую с другими семантическую базу [11].

Общая семантика позволит пользоваться единым семантическим анализатором и единым генератором исполняемого кода для всех используемых языков. Синтаксический анализатор также можно сделать универсальным с помощью формул БНФ. Лексика же всех современных языков почти идентична (например, правила записи числовых и строковых констант в таких разных языках, как Си и Паскаль, совпадают практически полностью).

Наличие общей семантической базы сделает перевод с одного языка программирования на другой тривиальным, поскольку изменения будут касаться только внешнего вида программы, а не ее содержания. На базе универсального компилятора может быть создана многоязыковая интегрированная среда разработки программ, в которой в качестве внутреннего представления программ будут использоваться не тексты, а семантические конструкции. В такой среде понятие языка разработки превратится в условность, поскольку переключение с одного языка на другой можно осуществить в любой момент выбором соответствующего пункта меню.

Наконец, описание единой семантики современных языков программирования есть не что иное, как описание «универсального» (или, если угодно, «идеального») языка программирования, на создание которого потрачено столько сил, времени и средств в прошлом. Достаточно вспомнить работы IBM по созданию PL/1 или последний по времени проект министерства обороны США по созданию языка Ада. Непомерные амбиции потерпели фиаско, а искомый «универсальный» язык тем временем образовался сам по себе без каких–либо организационных усилий и финансовых вложений [13].


Хотя современные языки программирования похожи друг на друга, идентичность их далеко не полная. Каждый содержит конструкции, присущие только ему. Если мы попытаемся начертить схему пересечения семантики языков программирования, то можем получить изображение, приведенное на рис. 1. На нем видно, что существует общая семантическая зона, в которую входят конструкции, принадлежащие всем языкам программирования (или большинству из них). Таким образом, семантику каждого языка программирования можно условно поделить на «область пересечения» (конструкции общие для всех языков) и «область объединения» (конструкции специфические для данного языка). Поэтому создание входного языка для многоязычного компилятора можно произвести двумя различными способами:

1. Использовать только общие конструкции (область пересечения), отбросив все «особенные» конструкции языков, как не необходимые. Это приведет к усечению всех языков программирования.

2. Использовать все имеющиеся в языках конструкции (область объединения). В этом случае каждый из языков должен быть дополнен конструкциями, имеющимися в других языках программирования. Этот подход чреват чрезмерным расширением семантической базы [6].

Разумеется, ни один из этих подходов не должен применяться «в чистом виде», но более правильным представляется первый вариант, поскольку в «области пересечения» содержится исторически наработанный необходимый минимум семантических конструкций. Приведем несколько примеров из «области пересечения» и «области объединения» языков.

«Область пересечения», цикл с параметром

Цикл с параметром присутствует в любом языке программирования. Исторически это наиболее «старый» из операторов цикла – он существовал уже в ранних версиях Фортрана. Несмотря на огромное количество вариантов, он до сих пор сохранил свои основные черты. В нем имеется переменная–параметр (как правило, целого типа; в Паскале, Модуле 2 и современных версиях Си допустимо также использовать переменную скалярного типа), которая пробегает значения от начального до конечного с шагом 1 или более [4].

В языках, созданных под влиянием Паскаля (Модула 2, Ада), параметр цикла может изменяться только с шагом 1. В Си–подобных языках семантика цикла с параметром допускает не только любой шаг переменной, но и вообще любой оператор, произвольно изменяющий значение параметра. Кроме того, условие окончания цикла в Си может быть любым логическим выражением (а не только достижением переменной порогового значения). Иными словами, цикл с параметром в Си может вообще не содержать параметра (в этом случае он становится аналогом цикла while). Ниже приведены примеры одного и того же цикла:


Паскаль: for i:=0 to max do inc(j);

Си, Си++, Java: for(i=0; i<=max; i++) j++;

Модула 2: for i:=0 to max do inc(j) end;

В данном случае граница между «областью пересечения» и «областью объединения» языка программирования может проходить внутри самой конструкции. Так, циклы с параметром из Си, имеющие целочисленный параметр и шаг 1, принадлежат к «области пересечения», а все другие варианты – к «области объединения».

«Область объединения», директива define в Си

Директива define присуща только языку Си. Она перекочевала из макроассемблера и задает макроподстановку, присваивая идентификатору некоторый текст (фрагмент программы). Это очень мощный инструмент (в сфере языков программирования мощность – не всегда положительное качество), используемый для нескольких различных целей. Упомяну следующие области использования define:

задание констант (наиболее распространенный вариант)

задание inline–функций

создание настраиваемых модулей (из других языков они есть только в Аде)

Директива define – безусловный анахронизм. Неслучайно в современных вариантах Си (Си++ и Java) ее область действия стараются ограничить, вводя дополнительные конструкции (директиву const и скалярные типы) [9].

«Область объединения», тип «множество» в Паскале

Тип «множество» присутствует во всех языках Вирта – Паскале, Модуле и Обероне. В эту конструкцию можно добавлять элементы (целочисленные переменные) или удалять их, а также проверять наличие в ней любого элемента. Несмотря на очевидную полезность этой конструкции в определенных ситуациях, необходимым компонентом языка тип «множество» все же не является (он отсутствует не только во всех клонах Си, но и в Аде, созданном под сильным влиянием Паскаля).

Набор конструкций языка программирования будущего.

Анализ «области пересечения» современных языков программирования может дать ответ на вопрос, какие конструкции наиболее жизнеспособны и, следовательно, сохранятся в дальнейшем.

Несомненно, ряд конструкций из «области объединения» также будет востребован в будущем, однако конкретный их перечень сможет определить только практика [15].

Стандартизация семантики языков программирования помимо возможности создания многоязычных компиляторов открывает и другие, не менее впечатляющие перспективы перед разработчиками. В частности, нужно уйти от написания текста программ, заменив текстовый редактор структурным. Язык программирования – не естественный язык.

Выводы по второй главе