web-dev-qa-db-ja.com

「let」が最初に登場したプログラミング言語はどれですか。

LISP、Clojure、Haskellで使用されている「let」の起源について疑問に思っていました。最初に登場した言語を知っている人はいますか?

25
carinmeier

まあ、 [〜#〜] basic [〜#〜] は、164年の初めから構文の一部として割り当て用にLETがあったため、letはLISPで、Chris Jester-Youngが指摘したように、 Evolution of LISP によると1970年代まで現れませんでした。

COBOL、Fortran、またはALGOLの構文にもLETがあるとは思いません。だから私はBASICで行くつもりです。

41
Greg

理論的な視点を追加したいと思います。古典的なラムダ計算では、letは単なる構文上の砂糖です。例えば

let x = N in M

簡単に書き直すことができます

(λx.M)N

したがって、初期の(関数)言語での最初の登場はそれほど興味深いものではありません。

しかし、それは Hindley-Milner 型システムとその型推論アルゴリズムの発明で非常に重要になります。この型システムでは多形性があるため、letは不可欠です(HMのλ抽象化とは異なります)。たとえば、次の単純な式を考えます。

let id = λx . x in id id

ここでidは多態性であり、型は∀α.α → αであるため、id id型チェック-任意のτの型はid id : τ → τです。 (最初のidの場合はτ → ταに割り当て、2番目の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

30
Petr Pudlák

LISPは、LET nowを持つ最も古い言語です。しかし、BASICが最初に入手したのは、LISPが後で入手したためです。

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   

割り当てに使用されるバークスの中間PL、1950、->

1952年にRutishauserが使用した=>=

ベームスコンパイラ、1952年、使用済み->

マンチェスター大学では、1950年代初頭にAlick GlennieがAutocodeを開発しました。最初のコードとコンパイラは、1952年にマンチェスター大学のMark 1コンピュータ用に開発され、最初にコンパイルされた高水準プログラミング言語と見なされています。繰り返しますが、->割り当て用

チャールズアダムス、バッカスグループのFORTRAN 0、ブルッカーズオートコード2、ルビムスキーとカミニンのПП1。すべて1954年に再び=

バカイック(グレムス、ポーター)、1954年、*割り当て用!

Kompiler、ADES、1955、=

IT、1956年、<-

FORTRAN、1957年、=

AT1956)、Math-Matic(1957)、再び=

しかし、1957年のFlow-Maticには2つの割り当てがあり、どちらも言葉で

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年6月;に一般ユーザーに提供されました。

 LET / = — assign formula results to a variable
22
Gangnus

まあ、これらの3つの間で、LISPは間違いなく最初にそれを持っていました。 Haskellは80年代に登場し、Clojureは00年代に登場しました。letはこれらの日付の前にlong前後でした。 :-)

LISPがそれを発明したthe言語であったかどうかについては、まだ保証できませんが、調査して確認します。 :-)

更新: Evolution of LISP (46ページを参照)によれば、letは70年代に発明されたと述べています:

LET —それ自体が最初に発明され、各サイトでローカルに再発明されたマクロ—は、MacLispの世界に遅れをとっていました。 LISP Archiveによれば、DEFMACROおよび複雑なLISP Machine DEFUN引数構文と同時に、1979年にLISP-Machine LISPからPDP-10 MacLispに遡って吸収されました。

もちろん、それが以前に別の言語で発明されたかどうかについてはまだ完全には答えていませんが、まだ別のデータポイントです。 :-)

14

1978年1月の最初の改訂スキームレポートAIM-452にはLETがあります。 9ページ。

lISPは以前に別の構文PROGを使用してローカル変数を導入したことに注意してください。

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

以前はほぼ次のように書かれているでしょう

(prog (a b)
  (setq a 1)
  (setq b 1)
  (+ a b))
9
Rainer Joswig