Почему языки программирования начали использовать = для назначения?

13

В большинстве ранних книг по алгоритмам <-упоминается назначение и =сравнение. Но в настоящее время единственными языками, которые не используются =для присваивания, являются Pascal ( :=) и игрушечные языки, такие как COOL . Что привело к тому, что современные языки программирования превратились =в присвоение значения вместо его математического значения равенства?

Сики Лин
источник
8
Не заставляй меня начинать ===...
Охотник на оленей
1
остается распространенным в работе алгоритмов; это один из трех общих обозначений для назначения при написании алгоритма (другие :=и =). То, что все программисты используют =, не означает, что математики все отбросили .
cpast
@DeerHunter ===в порядке.
Дарт Егрегиус
1
У меня была девушка из средней школы, воющая: «Как х может равняться х плюс один?» во вступлении я учил. Это основная странность компьютеров: переменные не существуют в природе, они не похожи ни на что другое во вселенной.
1
User251748: Мой кошелек - это переменная реального мира, содержащая множество монет, банкнот и случайных кусочков бумаги.
gnasher729

Ответы:

14

Согласно Википедии , использование equals для назначения восходит к языковому суперплану Хайнца Рутисхаузера, разработанному с 1949 по 1951 год, и особенно популяризировался Fortran:

Печально известным примером плохой идеи был выбор знака равенства для обозначения назначения. Он восходит к Фортрану в 1957 году и был слепо скопирован армиями языковых дизайнеров. Почему это плохая идея? Потому что это опровергает вековую традицию: «=» обозначает сравнение на равенство, предикат, который является либо истинным, либо ложным. Но Фортран сделал это, чтобы означать назначение, обеспечение равенства. В этом случае операнды находятся в неравном положении: левый операнд (переменная) должен быть равен правому операнду (выражению). х = у не означает то же самое, что у = х.

- Никлаус Вирт, хорошие идеи, сквозь зеркало

Конрад Цузе также использовал знак равенства для Планкалкула , который вдохновил Суперплан Рутишосера, хотя для него так и не был разработан компилятор. Почему он выбрал знак равенства? Я думаю, вы должны спросить его.

Роберт Харви
источник
4
Ну, конечно, были худшие идеи. В конце концов, математические тексты используют =как предикат, так и для определения переменных, например, в «Пусть x = 4. Тогда √ (x - y) равно нулю, если y = 4». Это работает, потому что математические обозначения следует понимать декларативно, а не обязательно. Функциональные языки программирования (например, семейство ML) по умолчанию имеют неизменяемые переменные и поэтому могут продолжать использовать их =в своей двойной роли без каких-либо проблем. Точнее, =является одновременно оператором и частью letсинтаксиса.
Амон
2
@amon: я не согласен по поводу двойственного значения в математике. «Пусть 4 = x» так же верно, как «Пусть x = 4».
Приходите с
4
@COMEFROM «Let 4 = x» примерно такой же неестественный, как оператор INTERCAL, из которого вы берете свое имя пользователя. Когда «x» никогда не упоминалось ранее, «Пусть x = {что-то}» или «Пусть x будет {widget}» вводит переменную в дополнение к указанию ее значения, и это ставит переменную на первое место по соглашению. Это именно потому, что, по крайней мере, с точки зрения интуиции, это не то, что просто сказать «значение равно ...».
3
@delnan «Пусть x = 4» - это просто сокращение для «Пусть x ∈ ℤ и x = 4». Контекст вводит новую переменную и =затем является просто предикатом, как и везде, где он используется. Обратите внимание, что в зависимости от контекста «Пусть x = 4» также могло означать «Пусть x ∈ ℝ и x = 4».
Доваль
2
@RobertHarvey Мы говорим о математическом написании, а не о программировании на Си. ПРИХОДИТ ОТ: Я допускаю, что это не так ясно, как я говорил раньше, но поскольку математическая проза основана на соглашениях, и нет никакой спецификации, которую можно было бы адвокатом разрешить "let 4 = x", нет, указанное утверждение не так верно, как «пусть х = 4». По крайней мере, это сбивает с толку читателей и, следовательно, не соответствует основной цели прозы .
7

Но когда я сделал математику в школе "пусть х = 123"

была обычная формулировка. Ранние версии Basic настаивали на ключевом слове «let» перед равным. Таким образом, это в основном кипит, чтобы "позволить" это понять.

Ключевой драйвер, обычно не рассматриваемый, но очень важный в то время, когда вы печатали.

Было два возможных устройства ввода,

  • «Телетайп», при котором вы можете использовать стандартный телетайп, чтобы пробить маленькие дырочки в бумажной ленте, которые затем могут быть прочитаны компьютером. Это было не так уж и плохо, так как он поддерживал стандартный aplphabet в верхнем и нижнем регистре плюс большинство символов в верхнем ряду вашей клавиатуры.
  • Перфокарты - вокруг было много машин для перфокарт, поскольку использование сортировщиков, табуляторов и принтеров было распространено в крупных корпорациях. Они поддерживали очень ограниченный набор символов Только верхний регистр алфавита и ограниченное количество «специальных» символов.

Телетайпы, как правило, использовались в академических и военных магазинах, карточные удары в более коммерческих магазинах. Следовательно, академические языки, такие как Pascal, поддерживают строчные идентификаторы и «разумные» нотации, такие как «: =» для назначения. Языки, нацеленные на более коммерческую аудиторию, предполагали, что перфокарты будут основной формой ввода, поэтому языки только в верхнем регистре, такие как FORTRAN и COBOL, с ограниченной поддержкой символов ":;> <", которые были недоступны при стандартном нажатии клавиш.

Между прочим, не было никакой двусмысленности относительно того, что "=" использовалось для назначения в раннем FORTRAN, поскольку сравнение было сделано с использованием ".LT.", ".LE.", ".EQ.", ".GE." и ".GT." синтаксис.

Джеймс Андерсон
источник
Я нахожу let x = 123более аналогичным, assert(x == 123)чем любое другое назначение, хотя.
AKHolland
1
PS Если вы становитесь педантичным, то синтаксис COBOL «MOVE» является наиболее точным описанием того, что на самом деле делает компьютер. Хотя «КОПИЯ» была бы еще точнее.
Джеймс Андерсон
@AKHolland для больших значений 123.
С тех пор как C ++ изобрел конструкторы перемещений, COBOLs «MOVE» звучит намного страннее.
gnasher729
Я всегда думал, что LET должен был оставаться обязательным в BASIC, так как это сделало бы выделение задания отдельным от проверки на равенство. В некотором роде сокращение от COBOL. Проблема в том, что это заняло бы еще один токен в источнике, еще один драгоценный байт в крошечных ПК того времени. Так что они бросили это.
Чак Адамс