Якою мовою програмування вперше з'явився "нехай"?


24

Мені було цікаво про походження «хай», що використовується в Ліспі, Клуджуре та Хаскеллі. Хтось знає, на якій мові вона з’явилася спочатку?


Assembler використовує MOV замість LET з 1954 року. Чи цього недостатньо?
Gangnus

1
LISP досить стара, щоб бути хорошим кандидатом.
mouviciel

2
на будь-яке запитання "На якій мові програмування з'явився X вперше" lisp - досить гарна здогадка для правильної відповіді
Zachary K

2
нехай джерела походять з математики, а не з інших мов програмування.
Пітер Б

Ви робите неправильне припущення, що перше використання "нехай" в мові програмування є походженням "нехай" -використання в Lisp, Clojure та Haskell.
Пітер Б

Відповіді:


41

Ну, BASIC мав LETпризначити як частину синтаксису з самого початку в 1964 році, так що це передувало б використанню letв Ліспі, яке, як зазначає Кріс Єстер-Янг, з'явилося до 1970-х років згідно з Еволюцією Ліспа .

Я не вірю, що COBOL, Fortran або ALGOL також не мають LETсвого синтаксису. Тому я збираюся їхати з БАЗОВИМ.


11
Але семантика дуже різна - letв основному це не лексично обмежений зв'язок. Отже, правильною відповіддю було б щось на зразок "воно вперше з'явилося англійською мовою, до 12 століття".
SK-логіка

12
Але питання: Яку мову програмування вперше з'явився "нехай"? Я не вважаю англійську мовою програмування (принаймні в цьому контексті).
Грег

7
letв цьому контексті ( letх isщо - то inтакий вираз) вперше з'явився в математичних текстах англійською мовою, і це, де він прийшов в програмування. Я не бачу різниці між формальними системами - математичними мовами, мовами програмування, що б там не було - вони однакові.
SK-логіка

3
"нехай x дорівнює 3" не є належною граматикою. Ви ніколи цього не побачите в жодній книжці з англійської мови. У вас неправильне час дієслова "бути". Це має бути "нехай x буде 3" або "нехай x дорівнює 3". Так чи інакше, семантика чи ні, автор запитань задав мову програмування. Тож якщо ви не знаєте комп’ютера, який бере інструкції з англійської мови, що передували BASIC, я не купую його. В іншому випадку ми могли би просто відповісти на "psuedo-код", і це було б дійсно, але не шанувало духу її питання.
Грег

1
звичайно, я використовував позначення ML, і я мав на увазі equals, ні is. І так, псевдо-код - найкраща відповідь поки що.
SK-логіка

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 : σ.

Ви можете спробувати це самостійно в Haskell. Під час 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]Позначення C - синтаксичний цукор для *(a + i). Стаття у Вікіпедії також має приємне пояснення.
Петро Пудлак

3
цікаві речі, але навряд чи пов’язані letз вступом '
wirrbel

2
Це добре написана відповідь, але не відповідає на початкове запитання.
Йохан Карлссон

1
@JohanKarlsson Я не стверджую, що це пряма відповідь, але я думаю, що це також має відношення до теми. Зокрема, чому було letзапроваджено, оскільки питання починається з того, що я цікавився походженням "хай" ...
Петро Пудлак

22

Lisp - найдавніша з них, яка має LET зараз . Але BASIC був першим, хто отримав це, оскільки Лісп отримав його набагато пізніше.

У аналітичному двигуні Ada Lovelace (1843) - немає LET, програма виглядає так:

N0 6 N1 1 N2 1 × L1 L0 S1  L0 L2 S0 L2 L0 CB?11 '

У Планкалкюль-Зузе (1943-45) програма виглядає так:

P1 max3 (V0[:8.0],V1[:8.0],V2[:8.0]) → R0[:8.0]
max(V0[:8.0],V1[:8.0]) → Z1[:8.0]
max(Z1[:8.0],V2[:8.0]) → R0[:8.0]
END

Короткий кодекс був запропонований Джоном Мохлі в 1949 році

X3 =  (  X1 +  Y1 )  /  X1 * Y1   

Проміжна ПЛ Беркса, 1950, використана для призначення ->

Рутисхаузер у 1952 р. Використовував =>=

Компілятор Böhms, 1952, б / в ->

У Манчестерському університеті Алік Гленні розвивався Autocodeна початку 1950-х. Перший код і компілятор був розроблений в 1952 році для комп'ютера Марк 1 в Манчестерському університеті і вважається першою складеною мовою програмування високого рівня. Знову ->для призначення

Чарльз Адамс, FORTRAN 0 з групи Бекуса, Автокод Брукера 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)

не LET для призначення. Або не було , у випадку LISP.


Dartmouth BASIC - це оригінальна версія мови програмування BASIC. Перша інтерактивна версія була доступна загальним користувачам у червні 1964 року ;

 LET / = — assign formula results to a variable

14

Ну, між цими трьома, Лісп, безумовно, був першим. Haskell з'явився в 80-х, а Clojure в 00-х, і letбув довгий час до будь-якої з цих дат. :-)

Що стосується Лисп мову вигадали це, я не можу поручитися за це, але я буду робити деякі дослідження і подивитися. :-)

Оновлення: Згідно з Evolution of Lisp (див. Стор. 46), вона згадувала, що letбула винайдена у 70-х роках:

LET—Це сам макрос, що був вперше винайдений та заново створений на локальному рівні на кожному сайті - був пізнім відвідувачем світу MacLisp; Згідно з архівом Lisp, він був заднім числом поглинений у PDP-10 MacLisp від Lisp-Machine Lisp у 1979 році одночасно DEFMACROіз складним DEFUNсинтаксисом аргументів Lisp Machine .

Все ще не зовсім відповідає, чи був він винайдений іншою мовою раніше, звичайно, але все ж інша точка даних. :-)


4
ML був також розроблений протягом 70-х років, тому, можливо, ідея була впроваджена в ML та Lisp в той період.
Джорджіо

9

Перший переглянутий звіт схеми AIM-452 від січня 1978 р LET. Сторінка 9.

зауважимо, що Лісп раніше використовував іншу конструкцію PROGдля введення локальних змінних.

(let ((a 1)
      (b 1))
  (+ a b))

було б написано раніше приблизно так

(prog (a b)
  (setq a 1)
  (setq b 1)
  (+ a b))

чи letзавжди лексично охоплювались у ліспських говірках?
wirrbel

1
AIM-452 - це перший переглянутий звіт про схему. Перший звіт - це AIM-349 від 1975 року. AIM-848 - це переглянений переглянений звіт. І той, що пішов після цього, під назвою "переглянутий ^ 3" звіт (тобто перший, який використовує іменування "R ^ nRS"), був першим, який не був AIM, а фактичним мовним специфікацією. Погугливши трохи, ви знайдете PDF-файли всіх цих документів, щоб ви могли їх прочитати самі. Якщо ви хочете піти далі, ви можете знайти старий посібник MacLisp від групи програм збереження програмного забезпечення, і, можливо, ви також зможете знайти кілька звітів LISP 1.5.
TaylanUB

@wirrbel, схоже, letце так само стара, як і лексичне обстеження (схема, 75 р.), і для отримання лексичного обстеження знадобилося певний час, щоб отримати визнання, тому я б здогадався, що перші екземпляри letбули в контексті динамічно оброблених Lisps. Сьогодні Emacs Lisp все ще має динамічну сферу застосування за замовчуванням, lambdaі let(останній цукор для колишнього все одно) динамічно пов'язує свої параметри.
TaylanUB
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.