Почему в Аде нет операторов (расширенного присваивания), таких как +=, -= или ++?

Мне интересно, почему нет таких операторов, как +=, -=, ++, -=, <<= или же 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 все еще там практически не повреждено.

Другие вопросы по тегам