Почему в Аде нет операторов (расширенного присваивания), таких как +=, -= или ++?
Мне интересно, почему нет таких операторов, как +=
, -=
, ++
, -=
, <<=
или же x ? y : z
(не расширенное назначение...) в Аде? Многие другие языки (C, C++, C#, Java, Perl) имеют их.
- Пример (C / C++ /...):
int a = 3;
a += 4; /* A */
// long: a = a + 4
a++; /* B */
// long: a = a + 1
a = ( a > 3 ? 10 : 5 ); /* C */
// long: ' if a > 3 then a = 10 else a = 5'
- Пример (Ада):
a : integer := 3;
a := a + 4; -- A --
a := a + 1; -- B --
if a > 3 then -- C --
a := 10;
else
a := 5;
end if;
(Пример не имеет смысла - только для демонстрации)
Это потому что...
- Перегрузка операторов (но в C++ тоже есть такой механизм)?
- Читаемость?
- Технические причины / ограничения?
- Это всего лишь уловка для того, чтобы сделать эти выражения короче и не требуется для программирования?
- Оператор присваивания в Аде
:=
и не=
(так+=
->+=:
)?
1 ответ
Потому что дизайн Ады был взят из математики гораздо ближе, чем некоторые другие языки... И так...
Назначение не является оператором
Операторы имеют особые свойства - они работают с количествами, возвращающими результат, оставляя сами величины неизменными.
Это важно - строго придерживайтесь этого понимания "оператора", и вы сделаете много возможных оптимизаций, потому что семантика намного более предсказуема. По сути, операторы не имеют побочных эффектов. Вы можете повторять их или исключать повторяющиеся, и у вас гораздо больше свободы в изменении порядка выражений без изменения их результатов.
Если вы ошиблись в назначении оператора,... ну, в общем, вы облажались. Просто ОДИН "оператор" с побочными эффектами означает, что вы потеряете ценные свойства для ВСЕХ операторов... для чего? некоторое удобство обозначений, чрезвычайно плодородная почва для размножения клопов и отсутствие дополнительной производительности или эффективности.
Кстати, когда мне недавно пришлось поковыряться в GCC, я обнаружил функцию в ее анализаторе выражений, которая явно сломалась (промежуточное представление для) a++
и преобразовал его внутренне в (промежуточное представление для) a = a + 1;
Таким образом, более короткая форма на самом деле не выглядит более эффективной!
То же самое обоснование применяется (менее строго в Ada, чем VHDL) к функциям - они просто операторы в другом облике, и чистые функции (в VHDL, где каждая функция без слова "нечистый" в своем объявлении!) Не имеют побочных эффектов.
Вот почему у Ada есть и функции, и процедуры: функции, операторы и выражения по существу похожи (и в идеале не содержат состояний и не имеют побочных эффектов); процедуры, назначения и операторы - это отдельная категория (вызовы процедур и назначения являются формами операторов).
Разделение понятий и использование подходящего для каждой задачи имеет большое значение для создания четких программ, которые вы можете понять и, вероятно, сделать то, что вы хотели...
Ох, и Ада-2012, наконец, догнала VHDL-2008 и Алгол-W (1963) с выражениями if и case...
a := (if a > 3 then 10 else 5);
-- to my eyes MUCH more readable than ?: especially in multiple if-exprs!
b := (case a is
when 3 => 5;
when 6|7 => 10;
when others => 0);
Очевидно, что назначения здесь все еще заявления...
Просто чтобы убедиться:
Назначение не является оператором
У дизайнеров Ады было впечатляющее и, как правило, ОЧЕНЬ четкое понимание того, что было возможно без ущерба для целостности и что может привести к беспорядку. Несмотря на то, что были добавлены новые функции языка, так как методы компиляции были разработаны достаточно, чтобы сделать их надежными, это всегда был осторожный процесс, и подмножество Ada-83 все еще там практически не повреждено.