어떤 프로그래밍 언어에서 "let"이 처음 나타 났습니까?


24

나는 Lisp, Clojure 및 Haskell에서 사용 된 "let"의 기원에 대해 궁금해하고있었습니다. 누구가 처음에 어떤 언어를 사용했는지 알고 있습니까?


어셈블러는 1954 년의 LET 대신 MOV를 사용합니다. 충분하지 않습니까?
Gangnus

1
LISP는 좋은 후보자가되기에 충분한 나이입니다.
mouviciel

2
어떤 질문에 대해서 "X는 처음으로 어떤 프로그래밍 언어로 나타 났습니까?"lisp는 정답을위한 좋은 추측입니다
Zachary K

2
기원은 다른 프로그래밍 언어가 아닌 수학에서 나온 것입니다.
Pieter B

프로그래밍 언어에서 "let"을 처음으로 사용하는 것은 Lisp, Clojure 및 Haskell에서 "let"을 사용하는 것으로 잘못 가정합니다.
Pieter B

답변:


41

음, 기본이 있었다 LET즉의 사용을 앞선 것이다, 그래서 1964 년 시작부터 구문의 일부로서 지정을 위해 let크리스 광대 - 영 지적대로에 따라 1970 년대까지 나타나지 않았다, 리스프에서 리스프의 진화 .

COBOL, Fortran 또는 ALGOL도 LET구문에 있다고 생각하지 않습니다 . 저는 BASIC과 함께 갈 것입니다.


11
그러나 의미론은 매우 다릅니다 let. 기본적으로 어휘 범위 바인딩이 아닙니다. 따라서 정답은 "12 세기 이전에 영어로 처음 나온 것"과 같습니다.
SK-logic

12
그러나 문제는 : "let"이 어떤 프로그래밍 언어로 처음 나타 났는가? 나는 영어를 프로그래밍 언어로 생각하지 않습니다 (적어도이 맥락에서는).
그렉

7
let이러한 맥락 (에 letX의 is뭔가 in가 프로그램에 출처 첫번째 영어 수학 교과서에 나타난 다음과 같은 표현)이있다. 공식 시스템 (수학적 언어, 프로그래밍 언어 등)의 차이점은 전혀 없습니다.
SK-logic

3
"x x 3"은 올바른 문법이 아닙니다. 어떤 영어 교과서에서도 볼 수 없습니다. 당신은 동사가 "하다"라는 잘못된 시제를 가지고 있습니다. "let x be 3"또는 "let x equal 3"이어야합니다. 어느 쪽이든, 의미 론적이든 아니든, 문제의 저자는 프로그래밍 언어를 요구하고있었습니다. 따라서 BASIC 이전의 영어 지시를받는 컴퓨터에 대해 알지 못한다면 나는 그것을 구입하지 않습니다. 그렇지 않으면, 우리는 방금 "가상 코드 (psuedo-code)"로 대답 할 수 있었으며 그것이 유효 할 것이지만 그녀의 질문의 정신을 존중하지는 않을 것입니다.
그렉

1
물론 나는 ML 표기법을 사용하고, 나는 의미 equals하지 is. 그리고 지금까지 의사 코드가 가장 좋은 답입니다.
SK-logic

30

이론적 인 관점을 추가하고 싶습니다. 고전적인 람다 계산법에서는 let단지 구문 설탕입니다. 예를 들어

let x = N in M

간단하게 다시 쓸 수 있습니다

(λx.M)N

따라서 초기 (기능적) 언어로 처음 등장한 것은 그리 흥미롭지 않습니다.

그러나 Hindley-Milner 타입 시스템과 타입 추론 알고리즘 이 발명되면서 매우 중요해 졌습니다. 이 유형의 시스템 let은 다형성이기 때문에 필수 불가결합니다 (HM의 λ-abstraction과 달리). 예를 들어 다음과 같은 간단한 표현을 생각해보십시오.

let id = λx . x in id id

여기 id에 다형성이 있고 type이 ∀α.α → α있으므로 id idtype- id id : τ → τchecks-임의의 τ에 대한 유형입니다 . (첫 번째에 대한 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입니다. 부수적 인 주제로서, 당신이 하나를 안다면, "구문 설탕"의 엄격한 정의에 대한 언급을 (주요 질문과 관련이 없기 때문에) 주석으로 게시 할 수 있습니다.
Giorgio

3
@Giorgio 새로운 해커의 사전 을 인용하기 위해 : 언어 나 다른 형식주의에 추가되어 인간에게 "달콤하게"만들어지는 형식, 형식주의의 표현성에 영향을 미치지 않는 기능. 사용 된 esp. "설탕"기능이 다른 표기법으로 명백하고 사소한 번역이있을 때 C의 a[i]표기법은에 대한 구문 설탕입니다 *(a + i). Wikipedia 기사 에도 좋은 설명이 있습니다.
Petr Pudlák

3
흥미로운 것들이지만 let소개 와 거의 관련이 없음
wirrbel

2
잘 작성된 답변이지만 원래 질문에 대한 답변은 아닙니다.
Johan Karlsson

1
@JohanKarlsson 나는 그것이 직접적인 답변이라고 주장하지는 않지만 이것이 주제와 관련이 있다고 생각합니다. 질문이 시작될 때 특히 도입 된 이유"let"의 기원에 대해 궁금했습니다.let
Petr Pudlák

22

리스프는 지금 LET이있는 가장 오래된 언어입니다 . 그러나 Lisp가 그것을 훨씬 나중에 얻었 기 때문에 BASIC은 그것을 얻은 첫 번째 제품이었습니다.

Ada Lovelace Analytical Engine (1843)-LET이 없으면 프로그램은 다음과 같습니다.

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

Zuse의 Plankalkül (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 년 John Mauchly에 의해 제안되었습니다.

X3 =  (  X1 +  Y1 )  /  X1 * Y1   

1950 년 Burks의 중간 PL ->

1952 년 Rutishauser 사용 =>=

Böhms 컴파일러 (1952) ->

맨체스터 대학교에서 Alick Glennie는 Autocode1950 년대 초에 개발 되었습니다. 첫 번째 코드 및 컴파일러는 1952 년 맨체스터 대학교의 Mark 1 컴퓨터 용으로 개발되었으며 최초의 컴파일 된 고급 프로그래밍 언어로 간주됩니다. 다시 ->할당

Charles Adams, Backus 그룹의 FORTRAN 0, Brooker 's Autocode 2, Lubimsky의 ПП1 및 Kamynin; 다시 1954 년=

1954 년 BACAIC (Grems, Porter), *배정!

1955 년 ADES Kompiler =

1956 년 IT <-

포트란, 1957 =

AT-3 (1956), Math-Matic (1957), 다시 =,

1957 년 Flow-Matic에는 두 가지 과제가있었습니다.

TRANSFER a TO bMOVE 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

14

글쎄, 그 세 가지 사이에서, Lisp는 분명히 그것을 먼저 가지고있었습니다. Haskell은 80 년대에, Clojure는 00 년대에 let왔으며 , 그 어느 날짜보다 오래 전에 사용 되었습니다 . :-)

Lisp가 그것을 개발 언어 인지에 관해서 는 아직 그것을 보증 할 수는 없지만 조사하고 볼 것입니다. :-)

업데이트 : Lisp의 진화 (46 페이지 참조) let에 따르면 70 년대에 발명 되었다고 언급했습니다 .

LET그 자체가 각 사이트에서 처음으로 로컬에서 발명되고 재창조 된 매크로는 MacLisp 세계의 후발주였습니다. Lisp Archive에 따르면 1979 년 DEFMACROLisp Machine DEFUN인수 구문 과 동시에 Lisp-Machine Lisp의 PDP-10 MacLisp에 소급 적용되었습니다 .

물론 아직 다른 언어로 발명되었는지 여부에 대해서는 아직 답이 없지만 여전히 다른 데이터 포인트입니다. :-)


4
ML은 70 년대에 개발되었으므로 아이디어가 그 기간에 ML과 Lisp에 모두 도입되었을 수 있습니다.
Giorgio

9

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))

let항상 어휘 리스프 방언의 범위?
wirrbel

1
AIM-452는 제도에 대한 첫 번째 개정 보고서입니다. 첫 번째 보고서는 1975 년의 AIM-349이며 AIM-848은 수정 된 보고서입니다. 그 후 "수정 된 ^ 3"보고서 (즉, "R ^ nRS"명명을 사용하는 첫 번째 보고서)라고하는 것은 AIM이 아닌 실제 언어 사양 중 첫 번째였습니다. 인터넷 검색을 통해 이러한 모든 문서의 PDF를 찾을 수 있으므로 직접 읽을 수 있습니다. 더 되돌아 가려면 Software Preservation Group에서 오래된 MacLisp 설명서를 찾을 수 있으며 LISP 1.5 보고서도 찾을 수 있습니다.
TaylanUB

@ wirrbel, 그것은 let어휘 범위 (Scheme, '75)만큼 오래 된 것으로 보이며 어휘 범위가 수용되기까지 시간이 걸렸으므로 첫 번째 인스턴스 let는 동적 범위 Lisps의 맥락에 있다고 생각합니다 . 오늘날 Emacs Lisp는 기본적으로 여전히 동적 범위를 가지고 있으며 lambda, let(과 후자의 설탕은) 매개 변수를 동적으로 바인딩합니다.
TaylanUB
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.