Сравнение языков программирования
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
|
|
|
Достарыңызбен бөлісу: |