misle.ru страница 1
скачать файл
Сравнение языков программирования

C, C++, Pascal, Ada, Modula-2, Oberon-2 и Java

A. ЗАЧЕМ ЭТО ДЕЛАЕТСЯ.

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

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

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

Для анализа отбирались языки программирования, зарекомендовавшие себя как инструменты для системного программирования и создания больших систем. Условно их можно поделить на две группы: клоны С (С, С++ и Java) и клоны PASCAL (PASCAL, MODULA-2 и OBERON-2). Особняком стоит ADA, которую нельзя однозначно отнести ни к первой, ни ко второй группе.

При анализе использовались стандарты языков программирования, за одним исключением – для PASCAL использовалась реализация языка в компиляторах фирмы Borland (Objective Pascal системы Delphi). Исключение для PASCAL было сделано потому, что, несмотря на приличный возраст языка, не существует общепринятого стандарта для расширений языка в области объектно-ориентированного программирования. В остальном принцип следования стандарту выдерживался последовательно. Так, скалярный тип (enum) С получил от С++, и при программировании на С он практически не используется, однако было отмечено, что С содержит такую конструкцию, поскольку она есть в ныне действующем стандарте языка.



B. НАБОР ОПЕРАТОРОВ В ЯЗЫКАХ ПРОГРАММИРОВАНИЯ.

Эта группа свойств характеризует наличие в языках основных операторов: присваивания, вызова процедуры, трех видов циклов и двух видов условий. В обзор, помимо них, включены другие удобные операторы, а так же псевдопроцедуры вроде процедур ввода-вывода С (printf/scanf), PASCAL (read/write) и процедур работы с динамическими типами данных.



 

C

C++

Java




Pascal

Modula-2

Oberon-2




Ada 95




1.Присваивание простых типов

++

++

+

 

+

+

+

 

+

 

2.Присваивание любых типов

 

 

+

 

+

+

+

 

+

 

3.Вызов процедуры

+

+

+

 

+

+

+

 

+

 

4.Вызов функции как процедуры

+

+



 



 

 

 

 

 

5.Условный оператор (if)

+

+

+

 

+

++

++

 

++

 

6.Оператор выбора (case,switch)

+

+

+

 

++

++

++

 

++

 

7.Цикл с предусловием (while)

+

+

+

 

+

+

+

 

+

 

8.Цикл с постусловием (repeat,do)

+

+

+

 

+

+

+

 

+

 

9.Цикл с параметром (for) , шаг 1

++

++

++

 

+

+

+

 

+

 

10.Цикл с параметром (for), любой шаг

+

+

+

 

 

+

+

 

 

 

11.Безусловный цикл (loop)

 

 

 

 

 

+

+

 

+

 

12.Оператор перехода (goto)

+

+







+










+




13.Выход/повтор цикла (break.continue)

++

++

++

 

++

+

+

 

+

 

14.Выход из процедуры (return)

+



+

 

 

+

+

 

+

 

15.Блок операторов

+

+

+

 

 

 

 

 

+

 

16.Операторы ввода-вывода (writeln,printf)

+

+

 

 



 

 

 

 

 

17.Оператор работы со структурой (with)

 

 

 

 

+

+

 

 

 

 

18.Оператор new

 

+



 

+

 

+

 

+

 

РЕЙТИНГ ПО ГРУППЕ:

17

18

16

 

16

15

15

 

16

 

 

КОММЕНТАРИИ К ОЦЕНКЕ СВОЙСТВ:

к пункту 1:C и С++ допускают присваивание любому адресному выражению

к пункту 4:PASCAL для использования функции в качестве процедуры требует установки соответствующего ключа компиляции

к пункту 5:оператор if в ADA, OBERON и MODULA имеют закрывающую скобку и раздел elsif

к пункту 6:в C, С++ и Ява нет синтаксически проверяемой границы варианта

к пункту 9:в C++ имеется возможность использовать несколько счетчиков цикла

к пункту 13:в ADA, OBERON и MODULA имеется только оператор выхода из цикла

к пункту 18:оператор new необходим в языках, поддерживающих ООП



КОММЕНТАРИИ К ПРОГНОЗУ:

к пункту 4:вызов функции как процедуры является одним из наиболее простых и наглядных способов варьировать набор параметров

к пункту 5:расширенная форма оператора if (с закрывающей скобкой) дает возможность точно локализовать синтаксические ошибки

к пункту 9:цикл с несколькими счетчиками не востребован в современных языках программирования

к пункту 15:локальные переменные желательно объявлять в цикле for (счетчик цикла)

к пункту 18:расширенная форма оператора new (с вызовом конструктора) необходима для корректной реализации ООП

 

C. МЕХАНИЗМ ПРОЦЕДУР В ЯЗЫКАХ ПРОГРАММИРОВАНИЯ.

Механизм процедур охватывает различные классы формальных и фактических параметров, способы вариации числа и типа параметров и ряд других особенностей реализации процедур и функций.



 

C

C++

Java




Pascal

Modula-2

Oberon-2




Ada 95




Прогноз

1.Класс параметров VAR (по ссылке)

 

+

 

 

+

+

+

 

++

 

+

2.Параметр “неограниченный массив”

+

+

++

 

 

++

++

 

++

 

+

3.Необязательные параметры

 

+

 

 

 

 

 

 

+

 

+

4.Перегрузка имен процедур

 

+



 

+

 

+

 

+

 

+

5.Перегрузка знаков операций

 

++

 

 

 

 

 

 

+

 

 

6.Локальные переменные класса static

+

+

 

 

+

 

 

 

 

 

 

7.Процедуры inline

+

+

 

 

+

 

 

 

+

 

 

8.Переменные типа procedure

+

+

 

 

+

+

+

 

+

 

+

9.Рекурсия прямая и косвенная

+

+

+

 

+

+

+

 

+

 

+

10.Вложенные процедуры и функции

 

 

 

 

+

+

+

 

+

 

 

РЕЙТИНГ ПО ГРУППЕ:

5

10

4

 

7

6

7

 

11

 

 

 

КОММЕНТАРИИ К ОЦЕНКЕ СВОЙСТВ:

к пункту 1: ADA позволяет использовать три варианта параметров – in, out, и in out

к пункту 2: C и С++ не позволяют определить размер параметра-массива

к пункту 5: С++ позволяет перегружать операции "[]", "." и "*"



КОММЕНТАРИИ К ПРОГНОЗУ:

к пункту 3: необязательные параметры - достаточно простой и наглядный способ варьировать набор параметров процедуры

к пункту 4: перегрузка имен процедур необходима для реализации ООП

к пункту 5: необходимость перегружать знаки операций вызывает у автора серьезные сомнения

к пункту 10: возможность описывать локальные процедуры представляется излишней (здесь, как и в случае с типом “множество”, сильно влияние Вирта, три языка которого присутствуют в рейтинге).

D. КОНСТРУКТОР ТИПОВ В ЯЗЫКАХ ПРОГРАММИРОВАНИЯ.

Эта группа параметров характеризует способность языка создавать новые типы данных на основе имеющихся, а так же реализацию некоторых встроенных типов, таких как строки или множества.



 

C

C++

Java




Pascal

Modula-2

Oberon-2




Ada 95




Прогноз

1.Встроенный тип строк символов

 

 

+

 

++

 

 

 

+

 

+

2.Скалярный тип и отрезок

++

++

 

 

+

+

 

 

++

 

+

3.Запись (структура) с вариантной частью

+

+

 

 

++

++

 

 

+

 

++

4.Массив

+

+

+

 

++

++

++

 

++

 

+

5.Массив с переменной границей

+

+

++  

 

 

 

 

 

+

 

 

6.Указатель

+

+

 

 

+

+

+

 

+

 

+

7.Множество

 

 

 

 

+

+

+

 

 

 

+

8.Вложенность описаний типов

 

 

 

 

+

+

+

 

+

 

+

9.Булевский тип

 

+

++

 

++

++

++

 

++

 

++

РЕЙТИНГ ПО ГРУППЕ:

6

7

6

 

12

10

7

 

11

 

 

 

КОММЕНТАРИИ К ОЦЕНКЕ СВОЙСТВ:

к пункту 1: PASCAL позволяет пользоваться как массивами символов, так и строками ASCIIZ

к пункту 2:в С, C++ и ADA можно произвольно назначать значения констант скалярного типа

к пункту 3:С и С++ позволяют объявить только одно поле в варианте; в ADA вариант записи должен быть определен в момент ее создания

к пункту 4:в С, C++ и Яве нельзя объявлять матрицы вида arr[10,20]; тип индекса всегда целый, нумерация элементов всегда от 0

к пункту 5:в Яве все массивы с переменной границей; в С и С++ нельзя определить фактический размер массива с переменной границей

к пункту 6:в Яве все переменные и объекты являются скрытыми указателями

к пункту 8:здесь оценивается возможность вместо имени типа указать его объявление; С++ допускает вложенные объявления только массива и указателя на тип

к пункту 9:тип bool в С++ автоматически преобразуется в тип int и обратно, так что при создании программ его можно игнорировать

КОММЕНТАРИИ К ПРОГНОЗУ:

к пункту 1: строки – настолько важный тип данных, что для его реализации желательно иметь специальный базовый тип

к пункту 2: необходимость явно присваивать значения константам скалярного типа вызывает серьезные сомнения

к пункту 3: несмотря на возможность реализовать запись с вариантами путем наследования (в языках, поддерживающих ООП), без этого механизма сложно обойтись в системном программировании

к пункту 5: массив с переменной верхней границей как правило, необходим только при описании формальных параметров процедуры

к пункту 7: множество является удобным механизмом, однако его реализация не вполне эффективна; тем не менее множества (ненагруженные) очевидно, сохранятся в будущих языках программирования

к пункту 8: неограниченная вложенность описаний типов - необходимое условие удобства работы программиста

к пункту 9: наличие булевского типа данных позволяет выявить многие семантические ошибки на этапе трансляции



E. СТРОГАЯ ТИПИЗАЦИЯ В ЯЗЫКАХ ПРОГРАММИРОВАНИЯ.

Этот раздел показывает, насколько строгий контроль типов обеспечивает тот или иной язык программирования. Отсутствие или ослабление контроля воспринимается, как недостаток языка.



 

C

C++

Java




Pascal

Modula-2

Oberon-2




Ada 95




Прогноз

1.Контроль оператора присваивания

+

+

++

 

++

++

++

 

++

 

++

2.Контроль фактических параметров

+

+

++

 

++

++

++

 

++

 

++

3.Контроль типа счетчика for

+

+

+

 

+

+

+

 

+

 

+

4.Контроль типа условия в if,while,repeat (do)

 

 

+

 

+

+

+

 

+

 

+

5.Автоматическое преобразование типов

 

 

+

 

+

++

++

 

++

 

++

6.Контроль переключателя в записи

 

 

 

 

 

 

 

 

+

 

 

7.Операции приведения типов

+

+

+

 

++

++

++

 

++

 

++

8.Контроль границ индекса массива

 

 

+

 

 

 

 

 

+

 

 

РЕЙТИНГ ПО ГРУППЕ:

4

4

9

 

9

9

9

 

12

 

 

 

КОММЕНТАРИИ К ОЦЕНКЕ СВОЙСТВ:

к пункту 1:языки “группы С” допускают широкий спектр автоматического преобразования типов при присваивании

к пункту 2:С++ имеет более "мягкие" правила соответствия типов

к пункту 4:С++ требует, чтобы условие в этих операторах имело тип “bool”, однако допускает автоматическое преобразование типа “int” в “bool”

к пункту 5:С и PASCAL допускают автоматическое преобразование числовых типов (это противоречит концепции строгой типизации); С++ автоматически преобразует “int ” в “bool”, В ADA автоматические преобразования числовых типов существуют, но строго контролируются

к пункту 7:в С, С++ и Яве префиксная форма записи операции по преобразованию типов



КОММЕНТАРИИ К ПРОГНОЗУ:

к пункту 2: "жесткие" правила совместимости типов позволяют выявить на этапе трансляции многие семантические ошибки

к пункту 5 : "хорошим тоном" с точки з рения строгой типи з ации считается полный запрет на автоматическое (неявное) преобразование типов ; в языках MODULA, OBERON и ADA допускаются только преобразования типа отрезка к базовому типу и некоторые преобразования целых типов

к пункту 6: контроль значения переключателя в записи во время выполнения программы крайне неэффективен с точки з рения реализации

 

F. РАЗДЕЛЬНАЯ КОМПИЛЯЦИЯ В ЯЗЫКАХ ПРОГРАММИРОВАНИЯ.

Механизм раздельной компиляции должен обеспечивать сборку программы и з ранее написанных модулей. Оценивается полнота и удобство этого механи з ма в каждом я з ыке программирования.



 

C

C++

Java




Pascal

Modula-2

Oberon-2




Ada 95




Прогноз

1. Единицы компиляции

+

+

++

 

++

++

++

 

++

 

++

2. Раздел интерфейса модуля

++

++

++

 

+

++

 

 

++

 

++

3. Импорт модулей

 

+

+

 

+

++

+

 

+

 

+

4.Экспорт идентификаторов

+

+

+

 

+

+

+

 

+

 

+

5.Ограничения видимости

 

+

 

 

 

 

 

 

++

 

 

6. Синонимы

 

 

 

 

 

 

+

 

+

 

 

7. Настраиваемые модули

 

+

 

 

 

 

 

 

+

 

 

8. Произвольная структура модулей

+

+

+

 

+

+

+

 

+

 

+

РЕЙТИНГ ПО ГРУППЕ:

5

8

7

 

6

8

6

 

11

 

 

 

КОММЕНТАРИИ К ОЦЕНКЕ СВОЙСТВ:

к пункту 1:у С и С++ единицей компиляции может быть только файл

к пункту 2:PASCAL не имеет отдельного файла описания интерфе й са модуля; в OBERON экспортируемые имена помечаются специальным знаком прямо в тексте модуля

к пункту 3:С позволяет импортировать модули только с помощью директивы include; MODULA-2 позволяет импортировать не все экспортируемые модулем идентификаторы

к пункту 5:в С++ для ограничения видимости можно использовать конструкцию namespace

к пункту 7:конструкция template из С++ позволяет создавать настраиваемые модули, однако может приводить к ошибкам компиляции в template-функциях (в отличие от конструкций generate из ADA)



КОММЕНТАРИИ К ПРОГНОЗУ:

к пункту 1: выделение специальных скобок для единицы компиляции (UNIT, MODULE или PACKAGE) позволяет избежать некоторых семантических ошибок

к пункту 3: использование для импорта модулей в C механизма include является устаревшим методом и снижает скорость компиляции

к пункту 5: средства для изменения контекста не нашли большого практического применения

к пункту 6: синонимы для импортируемых идентификаторов являются удобным, но не необходимым механизмом для организации межмодульных связей

к пункту 7: настраиваемые модули являются расширением механизма макросов, однако они сложны для реализации и не являются жизненно необходимыми



G. АБСТРАКТНЫЕ ТИПЫ ДАННЫХ И ОБЪЕКТЫ.

Этот раздел характеризует реализацию в современных языках программирования теоретических разработок: абстрактных типов данных и объектно-ориентированного программирования (отчасти механизм абстрактных типов данных рассмотрен в предыдущем разделе).



 

C

C++

Java




Pascal

Modula-2

Oberon-2




Ada 95




Прогноз

1. Инкапсуляция

+

++

++

 

+

+

++

 

+

 

+

2. Полиморфизм

 

++

+

 

 

 

 

 

+

 

+

3. Наследование

 

++

+

 

+

 

+

 

+

 

+

4. Конструкторы и деструкторы

 

++

++

 

+

 

 

 

 

 

 

5. Виртуальные методы

 

+

++

 

+

 

++

 

++

 

++

6. Неявный параметр метода

 

++

++

 

++

 

+

 

 

 

+

7. Доступ к тегам объектов

 

 

 

 

 

 

+

 

+

 

 

РЕЙТИНГ ПО ГРУППЕ:

1

10

10

 

6

1

7

 

6

 

 

КОММЕНТАРИИ К ОЦЕНКЕ СВОЙСТВ:

к пункту 1:С++ и JAVA имеют два уровня инкапсуляции - protected и private; OBERON допускает инкапсуляцию “только для чтения”

к пункту 2:в С++ можно перегружать знаки операций

к пункту 3:С++ допускает множественное наследование

к пункту 4:в PASCAL конструкторы требуется вызывать явно

к пункту 5:в PASCAL и С++ виртуальные методы требуется объявлять явно

к пункту 6:имеется в виду возможность префиксной записи вида “объект.метод(параметры метода)”; в OBERON такая возможность присутствует, однако при описании метода параметр следует указывать явно

к пункту 7:OBERON предоставляет ограниченные возможности для проверки тега объекта с помощью оператора WITH и операции IS



КОММЕНТАРИИ К ПРОГНОЗУ:

к пункту 1: необходимость в двух уровнях инкапсуляции представляется автору излишней

к пункту 2: перегрузка имен процедур необходима для реализации ООП, однако этот механизм ухудшает "читабельность" текста программы и нуждается в некоторых ограничениях

к пункту 3: множественное наследование можно реализовать с помощью других механизмов ООП

к пункту 4: как показал пример ADA, конструкторы и деструкторы не являются обязательными компонентами ООП

к пункту 5: компилятор в состоянии самостоятельно определить “виртуальность” метода



H. ПРОЦЕССЫ И ИСКЛЮЧИТЕЛЬНЫЕ СИТУАЦИИ.

Механизмы реализации параллельных процессов и обработки исключительных ситуаций являются скорее экзотикой, нежели обязательным компонентом современных языков программирования. Однако наличие этих механизмов в нескольких языках требует включить их в анализ для сравнения.



 

C

C++

Java




Pascal

Modula-2

Oberon-2




Ada 95




Прогноз

1. Сопрограммы

 

 

 

 

 

+

+

 

+

 

+

2. Сигналы

 

 

 

 

 

+

+

 

++

 

 

3. Критические участки (мониторы)

 

 

 

 

 

 

 

 

+

 

+

4. Исключительные ситуации

 

+

+

 

 

 

 

 

+

 

 

5. Распространение ситуаций

 

+

+

 

 

 

 

 

+

 

 

РЕЙТИНГ ПО ГРУППЕ:

0

2

2

 

0

2

2

 

6

 

 

КОММЕНТАРИИ К ОЦЕНКЕ СВОЙСТВ:

к пункту 2:ADA имеет специальный оператор приема сигналов when



КОММЕНТАРИИ К ПРОГНОЗУ:

к пункту 1: этот наиболее примитивный механизм параллельных процессов желателен в каждом языке программирования

к пункту 3: критические участки (мониторы) могут выступать альтернативой механизму сигналов

к пунктам 4-5: механизм обработки исключительных ситуаций в общем виде громоздок и трудно реализуем, однако желательно иметь некоторые средства для обработки ошибок времени выполнения

 

I. ПРОЧИЕ ВОЗМОЖНОСТИ.

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







































 1. Инициализация переменных

+

++

++

 

+

 

 

 

+

 

+

2. Константные выражения

+

++

++

 

++

++

++

 

++

 

++

3. Типизированные константы

+

+

+

 

+

++

+

 

++

 

+

4. Макросы

+

+

+

 

 

 

 

 

++

 

 

5. Приоритеты логических операций

+

+

+

 

 

 

 

 

+

 

+

6. Адресная арифметика

+

+

 

 

 

 

 

 

 

 

 

7. Условное выражение

+

+

+

 

 

 

 

 

 

 

 

8. Операция разыменования

+

+

 

 

+

+

+

 

 

 

+

9. Операция “разыменование+доступ к полю”

+

+

 

 

 

++

++

 

++

 

+

РЕЙТИНГ ПО ГРУППЕ:

9

11

8

 

5

7

6

 

11

 

 

 

КОММЕНТАРИИ К ОЦЕНКЕ СВОЙСТВ:

к пункту 1:С++ и Java автоматически вызывают конструкторы при инициализации

к пункту 2:в C для реализации константных выражений применяется механизм макросов

к пункту 3:ADA, MODULA и OBERON позволяют объявлять типизированные константы непосредственно в выражении

к пункту 4:в ADA роль макросов выполняют настраиваемые компоненты языка

к пункту 5:в C++ 11 уровней приоритетов, в ADA отдельные уровни приоритетов выделены для логических операций и операций отношения

к пункту 8:в ADA нет операции разыменования (только вместе с операцией “доступ к полю”), для ее имитации можно применять псевдополе “all”; в С и С++ операция разыменования префиксная, что не всегда удобно

к пункту 9:в MODULA, OBERON и ADA операция “доступ к полю” и комплекс “разыменование+доступ к полю” допустимо обозначать одним знаком (точка)



КОММЕНТАРИИ К ПРОГНОЗУ:

к пункту 4: использование макросов для определения констант и реализации inline-процедур в C снижает скорость компиляции и ухудшает читабельность программ

к пункту 5: наличие отдельных уровней приоритетов для операций отношения и логических операции позволяет записывать условия в удобной и естественной форме

к пункту 6:в настоящее время адресная арифметика считается низкоуровневым элементом языка, зависящим от реализации, и в описание языка не включается

к пункту 8:условное выражение ухудшает читабельность текста программы (вместо него желательно применять условный оператор)

J. СРАВНЕНИЕ МОЩНОСТИ ЯЗЫКОВ ПРОГРАММИРОВАНИЯ.

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



 

C

C++

Java




Pascal

Modula

Oberon




Ada

1. НАБОР ОПЕРАТОРОВ

17

18

16

 

16

15

15

 

16

2. МЕХАНИЗМ ПРОЦЕДУР

5

10

4

 

7

6

7

 

11

3. КОНСТРУКТОР ТИПОВ

6

7

6

 

12

10

7

 

11

4. СТРОГАЯ ТИПИЗАЦИЯ

4

4

9

 

9

9

9

 

12

5. РАЗДЕЛЬНАЯ КОМПИЛЯЦИЯ

5

8

7

 

6

8

6

 

11

6. АБСТРАКТНЫЕ ТИПЫ И ОБЪЕКТЫ

1

10

10

 

6

1

7

 

6

7. ПРОЦЕССЫ И ИСКЛЮЧЕНИЯ

0

2

2

 

0

2

2

 

6

8. ПРОЧИЕ ВОЗМОЖНОСТИ

9

11

8

 

5

7

6

 

11

ОБЩИЙ РЕЙТИНГ:

47

70

62

 

61

58

59

 

84

 

Первый сюрприз рейтинга – уверенное последнее место С. Главный инструмент профессионального программиста, вопреки распространенному заблуждению, достаточно “слабый” язык. Впрочем, последнее место С говорит и о том, что для создания программ любой степени сложности необязательно привлекать мощные языки программирования. С этой точки зрения борьба Вирта и его последователей за простоту языков программирования приобретает дополнительный аргумент “за”. Неудивительно, что все три его языка (PASCAL, MODULA и OBERON) показали примерно одинаковый средний результат. Это - свидетельство хорошей сбалансированности набора конструкций этих языков программирования.

В верхней части рейтинга оказались два языка-“тяжеловеса” – ADA и С++. При создании обеих языков программирования была предпринята попытка включить в них все наиболее значимые теоретические наработки. “Старичок” ADA победил, возможно, потому, что создавался “с чистого листа”, в то время как создателей С++ сдерживала необходимость сохранить совместимость с С.

Самый “молодой” из рассматриваемых языков – Java, получил пристойную среднюю оценку, примерно такую - же, как и у языков Вирта. Однако, учитывая ярко выраженную “объектную ориентированность” Java, следует признать, что как инструмент системного программиста этот язык недостаточно мощен.



K. КРАТКИЙ ОБЗОР СОВРЕМЕННЫХ ЯЗЫКОВ ПРОГРАММИРОВАНИЯ.

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



Си.

Главный инструмент системного программиста на сегодняшний день. Си создавался программистами Bell laboratories для себя как инструмент для разработки ОС UNIX и получил первоначальное распространение как базовый язык этой операционной системы. Си имеет очень приятный набор операторов (исключение составляет неструктурный switch) и неудачный конструктор типов. Серьезный недостаток (для языка системного программирования) – почти полное отсутствие механизмов раздельной компиляции. Поскольку Си доминирует на американском рынке средств разработки ПО, ему гарантирована долгая жизнь, несмотря на многочисленные попытки модернизировать его (например, такие, как С++ или Java).



С++.

Наиболее популярный клон С, в котором реализован наиболее полный (на сегодняшний день) механизм объектно-ориентированного программирования. При создании языка делались так же попытки модернизировать С, введя в его состав такие современные конструкции, как скалярный тип (enum), передача параметра по ссылке (&) или логический тип (bool). К сожалению, последовательными эти попытки назвать нельзя. Получился очень объемный (по этому показателю с ним может соперничать только ADA) и очень несистемный, “рыхлый” язык программирования, где наряду с суперсовременными понятиями класса соседствует адресная арифметика, доставшаяся в наследство от С.



Java.

Самый “молодой” из включенных в обзор языков программирования и основной инструмент программирования для Internet. Создатели Java безжалостно удалили из С все несовременные конструкции, и в то же время сумели удержаться от излишнего “раздувания” языка включением в него новых теоретических разработок. В результате получился не очень объемный, но стройный, “крепко сбитый” язык программирования с ярко выраженной идеологией. К сожалению, ориентация на Internet не дает возможности использовать Java как язык системного программирования, однако это хороший пример реформы С. Клоном С он является только внешне. Идеологически это хороший пример европейской языковой школы (к которой можно отнести клоны PASCAL и ADA).



PASCAL.

Ветеран европейской языковой школы, первый и самый популярный из языков Вирта. В языке реализован классический набор операторов и идеальный конструктор типов. Языку очень вредит отсутствие стандартных механизмов раздельной компиляции и ООП. В отличие от своего сверстника и конкурента С, PASCAL создавался одномоментно, что и предопределило его малые размеры и идеологическую стройность. С появлением MODULA и OBERON PASCAL можно считать устаревшим языком, однако консервативность программного обеспечения не позволяет считать такой вывод окончательным.



MODULA-2.

Наиболее известный клон PASCAL и любимый язык автора этой статьи. Классический набор операторов и конструктор типов. Хорошо разработанные механизмы раздельной компиляции (конкуренцию MODULA в этом классе может составить только ADA). Маленький и удобный язык с точки зрения разработчика компилятора (как и все языки Вирта, видимо, сказывается то обстоятельство, что Вирт сам пишет компиляторы для своих языков). Недостатком языка можно считать полное отсутствие механизмов ООП.



OBERON-2.

Последний из языков Вирта и клонов PASCAL. OBERON позиционировался как MODULA + ООП, однако при создании языка Вирт выбросил из MODULA много приятных возможностей (часть из которых была добавлена при создании OBERON-2, считающегося современным вариантом языка). К сожалению, необратимо пострадал механизм раздельной компиляции (крайне важный для языка системного программирования). С точки зрения идеологии OBERON скорее наследник MODULA-1 (был такой очень маленький язык, не содержавший даже чисел с плавающей точкой), чем MODULA-2. Реализации ООП сделана очень красиво и с минимальными издержками для разработчика компилятора.



ADA-95.

Самый мощный из используемых сегодня языков программирования, ADA вызывает противоречивые чувства. С одной стороны, это самый яркий представитель европейской школы языков программирования, в котором реализовано множество теоретических наработок. С другой стороны, бюрократические методы создания языка (тоже, возможно, впервые опробованные на практике) привели к такому его “разбуханию”, что создание компиляторов для него стало крайне трудоемким и дорогостоящим делом. Неудачей можно считать и попытку реализации ООП в ADA. Писать ООП - программы на ADA-95 конечно, можно, но крайне неудобно. В каком-то смысле этот вывод можно перенести и на весь язык в целом. Единственным несомненным плюсом ADA можно считать наиболее полную и подробную стандартизацию, вследствие чего переносимость программ на ADA наиболее лучшая по сравнению с другими языками программирования.

 

L. ВЫВОДЫ.

Главный вывод, который можно сделать на основе изложенного материала – несомненное сходство языков программирования в основных компонентах, таких, как набор операторов, конструктор типов, механизм процедур и ООП. Различия проявляются только в деталях, семантически современные языки программирования практически идентичны. Поэтому насущной задачей становится описание стандартов семантической составляющей языков программирования и создание семейств компиляторов с общей семантической базой (этой теме была посвящена статья “Современные языки программирования”).



Что такое языки с общей семантической базой, можно посмотреть на примере компилятора “Странник”, поддерживающего три языка (MODULA-2, PASCAL и Си), которые полностью эквивалентны друг другу на уровне семантики (компилятор можно бесплатно получить на сайте home.perm.ru/~strannik ). Электронный адрес автора статьи strannik@mail.perm.ru
скачать файл


Смотрите также: