Сравнение АЛГОЛА 68 и C++
Эта статья включает список литературы , связанную литературу или внешние ссылки , но ее источники остаются неясными, поскольку в ней отсутствуют встроенные цитаты . ( июнь 2013 г. ) |
В С++ нет:
- PROC первого класса — вложенные функции (эмуляция за счет локальных определений типов классов, которые могут быть функторами ; также в C++11 есть лямбда-функции ),
- OP и PRIO – определяемые символы и приоритеты оператора,
- сбор мусора (можно эмулировать с помощью умных указателей ),
- использовать перед определением ,
- форматированный транспорт с использованием сложных объявлений форматирования,
- := – символ операции присваивания (во избежание путаницы со знаком равенства),
- массив (и операции среза над ним, но в многоуровневых библиотеках),
- автоматические СОЮЗЫ ,
- CASE-выражения ,
- нелокальный GOTO
- происхождения из C. интуитивно понятный синтаксис объявления из-за его
В Алголе 68 нет:
- защита доступа к общедоступным/частным элементам структуры,
- перегруженные процедуры (в отличие от операторов),
- явное освобождение памяти,
- форвардные объявления (разрешено использовать до определения)
- текста предварительная обработка (например, макросы),
- отдельные типы ссылок и указателей,
- строки комментариев (только комментарии в квадратных скобках),
- наследование структуры, функции-члены структуры, виртуальные функции .
- деструкторы, исключения, шаблоны, пространства имен, выходы из структурированного цикла
Сравнение операторов присваивания и равенства
[ редактировать ]Намерение | АЛГОЛ 68 | С++ |
---|---|---|
Определить константу | int x=888; |
const int x = 888;
|
Инициализировать переменную | int x:=888; |
int x = 888;
|
Присвойте значение 888 переменной x. | x:=888; |
x = 888;
|
Сравните два значения | if x = 888 then ... fi |
if (x == 888) { ... }
|
Выделить переменную из кучи | ref int x = heap int; или просто: heap int x; |
int* x = new int;
|
Сравнить адрес двух указателей | ref int x, y; if x :=: y then ... fi |
int* x; int* y;
|
Сравнить значение, на которое ссылаются два указателя | ref int x, y; if x = y then ... fi |
int* x; int* y;
|
Назовите новый тип | mode longreal = long real; |
typedef double longreal; или (начиная с C++11): using longreal = double;
|
Назовите новый тип записи | mode cust = struct(string name, address); |
struct cust { std::string name, address; };
|
Назовите новый тип объединения | mode taggedu = union(string s, real r); |
union u { std::string s; float f; };
|
Назовите процедуру или функцию | proc f = (real x) real: ( code; result ); |
float f(float x) { code; return result; }
|
Параметры процедуры по умолчанию | proc p = (union (real, void) in x)void:
|
void p(float x=888) { code; }
|
Назовите нового оператора | op ↑ = (real x,y) real: x**y; |
— |
Установите приоритет нового оператора | prio ↑ = 9; |
— |
Назначение переменных цепочки | a:=b:=c:=d; |
a = b = c = d;
|
Оператор смещения - АЛГОЛ 68C только | a:=:=b:=:=c:=:=d; |
a = b; b = c; c = d;
|
Добавить «substr» к переменной str | str +:= "substr"; |
str += "substr";
|
Префикс «substr» к переменной str | "substr" +=: str; |
str = "substr" + str;
|
Примеры кода
[ редактировать ]Декларация Союза и использование
[ редактировать ]Присвоение значений в A68 union
переменная автоматическая,
тип «прикреплен» к переменной, но вытащить значение обратно
синтаксически неудобно, поскольку условие соответствия требуется .
Пример Алгола 68:
union(int, char) x:=666; printf(($3d l$, (x|(int i):i) ))
Пример С++:
union { int i; char c; } x = { 666 };
std::cout << x.i << std::endl;
Конечным эффектом «маркировки типов» является то, что строгая типизация Algol68
«половина» вторгается в union
.
Объявление режима
[ редактировать ]Новый режим (тип) может быть объявлен с использованием mode
декларация:
int max=99; mode newtype = [0:9][0:max]struct ( long real a, b, c, short int i, j, k, ref real r );
Это имеет тот же эффект, что и следующий код C++:
const int max=99;
typedef struct {
double a, b, c; short i, j, k; float& r;
} newtype[9+1][max+1];
Обратите внимание, что в АЛГОЛе 68 слева от равенства появляется только имя нового типа, и, что особенно важно, конструкция создается (и может быть прочитана) слева направо без учета приоритетов.
Внешние ссылки
[ редактировать ]- Сравнение PASCAL и ALGOL 68 - Эндрю С. Таненбаум - июнь 1977 г.
- Ортогональный языковой дизайн - апрель 2004 г. - получено 10 мая 2007 г.
- Как решить висячее еще? - апрель 2004 г. - получено 10 мая 2007 г.
- Сравнение Pascal, C, C++ и Algol68: типы, продолжение Система типов, проверка типов, безопасность типов, преобразование типов, примитивные типы, агрегатные типы: массивы - апрель 2004 г. - получено 10 мая 2007 г.
- Массивы в Algol68 - апрель 2004 г. - получено 10 мая 2007 г.
- Сравнение массивов в ALGOL 68 и BLISS - Майкл Уокер - 21 февраля 2000 г. - получено 21 декабря 2015 г.