Ассемблер использует MOV вместо LET с 1954 года. Разве этого недостаточно?
Гангнус
1
LISP достаточно взрослый, чтобы быть хорошим кандидатом.
Мувисиэль
2
на любой вопрос «На каком языке программирования впервые появился Х», Lisp - довольно удачное предположение для правильного ответа
Захари К
2
пусть происхождение от математики, а не от других языков программирования.
Питер Б
Вы делаете неверное предположение, что первое использование «let» в языке программирования является источником «let» -use в Lisp, Clojure и Haskell.
Питер Б
Ответы:
41
Что ж, BASIC имел LETназначение в качестве части синтаксиса с самого начала в 1964 году, так что это было бы до использования letв Лиспе, который, как указывает Крис Джестер-Янг, не появлялся до 1970-х годов, согласно Evolution of Lisp .
Я не верю, что COBOL, Fortran или ALGOL также имеют LETв своем синтаксисе. Так что я собираюсь пойти с Бейсиком.
Но семантика очень разная - letпо сути, это не лексически ограниченная привязка. Таким образом, правильным ответом будет что-то вроде «оно впервые появилось на английском языке до 12 века».
SK-logic
12
Но возникает вопрос: на каком языке программирования впервые появилось слово «let»? Я не считаю английский язык программирования (по крайней мере, в этом контексте).
Грег
7
letв этом контексте ( letx isчто- inто следующее выражение) впервые появилось в математических текстах на английском языке, и именно здесь оно пришло в программирование. Я не вижу разницы между формальными системами - математическими языками, языками программирования, чем угодно - все они одинаковы.
SK-logic
3
«пусть х 3» не является правильной грамматикой. Вы никогда не увидите этого ни в одном учебнике на английском языке. У вас неправильное время от глагола "быть". Это должно быть «пусть х будет 3» или «пусть х будет равно 3». Так или иначе, семантика или нет, автор вопроса задавал вопрос о языке программирования. Так что, если вы не знаете компьютер, который использует инструкции на английском языке, предшествующий бейсику, я не куплю его. В противном случае мы могли бы просто ответить на «псевдо-код», и это было бы правильно, но не удовлетворило бы дух ее вопроса.
Грег
1
конечно, я использовал обозначение ML, и я имел в виду equals, нет is. И да, псевдокод - лучший ответ на данный момент.
SK-logic
30
Я хотел бы добавить теоретическую точку зрения: в классическом лямбда-исчислении letэто просто синтаксический сахар. Например
let x = N in M
можно переписать просто как
(λx.M)N
Так что его первое появление на ранних (функциональных) языках не так уж интересно.
Однако это стало очень важным с изобретением системы типов Хиндли-Милнера и ее алгоритма вывода типов. В этом типе система letнезаменима, потому что она полиморфна (в отличие от λ-абстракции в HM). Например, рассмотрим это простое выражение:
let id = λx . x in id id
Здесь idполиморфно, у него есть тип ∀α.α → α, и поэтому id idпроверки типов - это тип id id : τ → τдля произвольного τ. (Для первых idмы относим τ → τк αи во вторых idмы относим τк α.)
Однако мы не можем переписать его, используя абстракцию и приложение. выражение
(λid . id id)(λx.x)
не тип-чека, потому что в первом Л абстракции idдолжны быть присвоен мономорфическим типом id : σдля некоторых а, и нет σ такого , что мы могли бы применить id : σк id : σ.
Вы можете попробовать это сами в Хаскеле. Во время let id = \x -> x in id id :: t -> tпроверки типа ввод (\id -> id id)(\x -> x)не выполняется с
Происходит проверка: невозможно создать бесконечный тип: t0 = t0 -> t0
в первом аргументе id, а именно id
в выражении: id id
в выражении:\id -> id id
+1 за очень интересный ответ. В качестве дополнительной темы, если вы ее знаете, не могли бы вы опубликовать (в комментарии, поскольку это не связано с основным вопросом) ссылку на строгое определение «синтаксического сахара».
Джорджио
3
@Giorgio Процитировать словарь «Новый хакер» : функции, добавленные к языку или другому формализму, чтобы сделать его «более сладким» для людей, функции, которые не влияют на выразительность формализма. Используется ESP. когда есть очевидный и тривиальный перевод «сахарного» признака в другие конструкции, уже присутствующие в обозначениях. a[i]Обозначение Си является синтаксическим сахаром для *(a + i). Статья в Википедии также имеет хорошее объяснение.
Петр Пудлак
3
интересные вещи, но вряд ли связанные letс введением в России
wirrbel
2
Это хорошо написанный ответ, но он не отвечает на первоначальный вопрос.
Йохан Карлссон
1
@JohanKarlsson Я не утверждаю, что это прямой ответ, но я думаю, что это также относится к теме. В частности, почему был letвведен, так как вопрос начинается с того, что мне было интересно
узнать
22
Лисп является самым старым языком этих Выпустив в настоящее время . Но Бейсик был первым, кто получил его, потому что Лисп получил его намного позже.
В Ada Lovelace Analytical Engine (1843) - нет LET, программа выглядит так:
N0 6 N1 1 N2 1 × L1 L0 S1 L0 L2 S0 L2 L0 CB?11 '
В Plankalkül of Zuse (1943-45) программа выглядит так:
Короткий кодекс был предложен Джоном Мочли в 1949 году
X3 = ( X1 + Y1 ) / X1 * Y1
Промежуточный ЛП Буркс, 1950, используется для назначения ->
Рутишаузер в 1952 году использовал =>=
Böhms compiler, 1952, используется ->
В Манчестерском университете Алик Гленни развивался Autocodeв начале 1950-х годов. Первый код и компилятор был разработан в 1952 году для компьютера Mark 1 в Университете Манчестера и считается первым скомпилированным языком программирования высокого уровня. Опять же ->для назначения
Чарльз Адамс, FORTRAN 0 группы Бакуса, Autocode 2 Брукера, ПП1 Любимского и Камынина; все снова в 1954 году=
BACAIC (Гремс, Портер), 1954, *для назначения!
Компилер, ADES, 1955, =
IT, 1956, <-
Фортран, 1957, =
AT-3 (1956), Math-Matic (1957), опять - таки =,
но Flow-Matic в 1957 году имел два назначения, и оба на словах
TRANSFER a TO b а также MOVE a TO b
Машина Бауэра и Самельсона, 1957 г .: =>
Извините, я не могу охватить все языки между 1957 и 1964 годами, но больше языков
1957 - COMTRAN (forerunner to COBOL)
1958 - LISP
1958 - ALGOL 58
1959 - FACT (forerunner to COBOL)
1959 - COBOL
1959 - RPG
1962 - APL
1962 - Simula
1962 - SNOBOL
1963 - CPL (forerunner to C)
не давай для назначения. Или нет , в случае LISP.
Dartmouth BASIC - оригинальная версия языка программирования BASIC. Первая интерактивная версия была доступна для обычных пользователей в июне 1964 года ;
Ну, между этими тремя Лисп определенно имел это первым. Haskell появился в 80-х, а Clojure - в 00-х, и letсуществовал задолго до любой из этих дат. :-)
Что касается ли Лисп язык выдумали это, я не могу поручиться за это, но я буду делать некоторые исследования и посмотреть. :-)
Обновление: Согласно Evolution of Lisp (см. Стр. 46), упоминалось, что оно letбыло изобретено в 70-х годах:
LET- сам макрос, впервые изобретенный и заново изобретенный локально на каждом сайте, - опоздал в мир MacLisp; Согласно Lisp Archive, он был задним числом поглощен в PDP-10 MacLisp из Lisp-Machine Lisp в 1979 году одновременно DEFMACROсо сложным DEFUNсинтаксисом аргументов Lisp Machine .
Конечно, до сих пор не совсем понятно, было ли оно изобретено ранее на другом языке, но это еще одна точка данных. :-)
был letвсегда лексически ограничен в диалектах Лисп?
wirrbel
1
AIM-452 - это первый пересмотренный отчет по схеме. Первый отчет - AIM-349 от 1975 года. А AIM-848 - это пересмотренный пересмотренный отчет. А тот, который после этого назывался «пересмотренный отчет ^ 3» (т. Е. Первый, который использовал именование «R ^ nRS»), был первым, который был не AIM, а реальной спецификацией языка. Погуглив немного, вы найдете PDF-файлы всех этих документов, чтобы вы могли прочитать их сами. Если вы хотите пойти еще дальше, вы можете найти старое руководство по MacLisp в Software Preservation Group, и, возможно, вы сможете найти и некоторые отчеты LISP 1.5.
TaylanUB
@wirrbel, кажется let, примерно так же стар, как лексическая область видимости (Scheme, '75), и потребовалось некоторое время, чтобы лексическая область видимости получила признание, поэтому я предполагаю, что первые экземпляры letбыли в контексте динамически ограниченного Лиспа. На сегодняшний день Emacs Lisp по-прежнему имеет динамическую область видимости по умолчанию, lambdaи and let(последний сахар для первого в любом случае) динамически связывает свои параметры.
Ответы:
Что ж, BASIC имел
LET
назначение в качестве части синтаксиса с самого начала в 1964 году, так что это было бы до использованияlet
в Лиспе, который, как указывает Крис Джестер-Янг, не появлялся до 1970-х годов, согласно Evolution of Lisp .Я не верю, что COBOL, Fortran или ALGOL также имеют
LET
в своем синтаксисе. Так что я собираюсь пойти с Бейсиком.источник
let
по сути, это не лексически ограниченная привязка. Таким образом, правильным ответом будет что-то вроде «оно впервые появилось на английском языке до 12 века».let
в этом контексте (let
xis
что-in
то следующее выражение) впервые появилось в математических текстах на английском языке, и именно здесь оно пришло в программирование. Я не вижу разницы между формальными системами - математическими языками, языками программирования, чем угодно - все они одинаковы.equals
, нетis
. И да, псевдокод - лучший ответ на данный момент.Я хотел бы добавить теоретическую точку зрения: в классическом лямбда-исчислении
let
это просто синтаксический сахар. Напримерможно переписать просто как
Так что его первое появление на ранних (функциональных) языках не так уж интересно.
Однако это стало очень важным с изобретением системы типов Хиндли-Милнера и ее алгоритма вывода типов. В этом типе система
let
незаменима, потому что она полиморфна (в отличие от λ-абстракции в HM). Например, рассмотрим это простое выражение:Здесь
id
полиморфно, у него есть тип∀α.α → α
, и поэтомуid id
проверки типов - это типid id : τ → τ
для произвольного τ. (Для первыхid
мы относимτ → τ
кα
и во вторыхid
мы относимτ
кα
.)Однако мы не можем переписать его, используя абстракцию и приложение. выражение
не тип-чека, потому что в первом Л абстракции
id
должны быть присвоен мономорфическим типомid : σ
для некоторых а, и нет σ такого , что мы могли бы применитьid : σ
кid : σ
.Вы можете попробовать это сами в Хаскеле. Во время
let id = \x -> x in id id :: t -> t
проверки типа ввод(\id -> id id)(\x -> x)
не выполняется систочник
a[i]
Обозначение Си является синтаксическим сахаром для*(a + i)
. Статья в Википедии также имеет хорошее объяснение.let
с введением в Россииlet
введен, так как вопрос начинается с того, что мне было интересноЛисп является самым старым языком этих Выпустив в настоящее время . Но Бейсик был первым, кто получил его, потому что Лисп получил его намного позже.
В Ada Lovelace Analytical Engine (1843) - нет LET, программа выглядит так:
В Plankalkül of Zuse (1943-45) программа выглядит так:
Короткий кодекс был предложен Джоном Мочли в 1949 году
Промежуточный ЛП Буркс, 1950, используется для назначения
->
Рутишаузер в 1952 году использовал
=>=
Böhms compiler, 1952, используется
->
В Манчестерском университете Алик Гленни развивался
Autocode
в начале 1950-х годов. Первый код и компилятор был разработан в 1952 году для компьютера Mark 1 в Университете Манчестера и считается первым скомпилированным языком программирования высокого уровня. Опять же->
для назначенияЧарльз Адамс, FORTRAN 0 группы Бакуса, Autocode 2 Брукера, ПП1 Любимского и Камынина; все снова в 1954 году
=
BACAIC (Гремс, Портер), 1954,
*
для назначения!Компилер, ADES, 1955,
=
IT, 1956,
<-
Фортран, 1957,
=
AT-3 (1956), Math-Matic (1957), опять - таки
=
,но Flow-Matic в 1957 году имел два назначения, и оба на словах
TRANSFER a TO b
а такжеMOVE a TO b
Машина Бауэра и Самельсона, 1957 г .:
=>
Извините, я не могу охватить все языки между 1957 и 1964 годами, но больше языков
не давай для назначения. Или нет , в случае LISP.
Dartmouth BASIC - оригинальная версия языка программирования BASIC. Первая интерактивная версия была доступна для обычных пользователей в июне 1964 года ;
источник
Ну, между этими тремя Лисп определенно имел это первым. Haskell появился в 80-х, а Clojure - в 00-х, и
let
существовал задолго до любой из этих дат. :-)Что касается ли Лисп язык выдумали это, я не могу поручиться за это, но я буду делать некоторые исследования и посмотреть. :-)
Обновление: Согласно Evolution of Lisp (см. Стр. 46), упоминалось, что оно
let
было изобретено в 70-х годах:Конечно, до сих пор не совсем понятно, было ли оно изобретено ранее на другом языке, но это еще одна точка данных. :-)
источник
Первый пересмотренный отчет об отчете AIM-452 от января 1978 года
LET
. Страница 9.обратите внимание, что Lisp ранее использовал другую конструкцию
PROG
для представления локальных переменных.было бы написано ранее примерно как
источник
let
всегда лексически ограничен в диалектах Лисп?let
, примерно так же стар, как лексическая область видимости (Scheme, '75), и потребовалось некоторое время, чтобы лексическая область видимости получила признание, поэтому я предполагаю, что первые экземплярыlet
были в контексте динамически ограниченного Лиспа. На сегодняшний день Emacs Lisp по-прежнему имеет динамическую область видимости по умолчанию,lambda
и andlet
(последний сахар для первого в любом случае) динамически связывает свои параметры.