Trong ngôn ngữ lập trình nào đã làm cho Let để đầu tiên xuất hiện?


24

Tôi đã tự hỏi về nguồn gốc của "cho phép" được sử dụng trong Lisp, Clojure và Haskell. Có ai biết nó xuất hiện trong ngôn ngữ nào đầu tiên không?


Trình biên dịch sử dụng MOV thay vì LET từ năm 1954. Điều đó có đủ không?
Gangnus

1
LISP đủ tuổi để trở thành một ứng cử viên sáng giá.
mouviciel

2
cho bất kỳ câu hỏi nào "Trong ngôn ngữ lập trình nào X đã xuất hiện lần đầu tiên", lisp là một phỏng đoán khá tốt cho một câu trả lời đúng
Zachary K

2
nguồn gốc là từ toán học, không phải từ các ngôn ngữ lập trình khác.
Pieter B

Bạn đưa ra giả định không chính xác rằng lần đầu tiên sử dụng "let" trong ngôn ngữ lập trình là nguồn gốc của "let" -use trong Lisp, Clojure và Haskell.
Pieter B

Câu trả lời:


41

Vâng, BASIC đã được chỉ LETđịnh như là một phần của cú pháp từ đầu năm 1964, do đó, điều đó sẽ có trước việc sử dụng lettrong Lisp, như Chris Jester-Young chỉ ra đã không xuất hiện cho đến những năm 1970 theo Evolution of Lisp .

Tôi cũng không tin rằng COBOL, Fortran hoặc ALGOL có LETcú pháp của họ. Vì vậy, tôi sẽ đi với BASIC.


11
Nhưng ngữ nghĩa là rất khác nhau - letvề cơ bản không phải là một ràng buộc phạm vi từ vựng. Vì vậy, câu trả lời đúng sẽ là một câu như "nó xuất hiện lần đầu tiên bằng tiếng Anh, trước thế kỷ 12".
SK-logic

12
Nhưng câu hỏi là: ngôn ngữ lập trình nào đã "cho phép" xuất hiện đầu tiên? Tôi không thực sự coi tiếng Anh là ngôn ngữ lập trình (ít nhất là trong bối cảnh này).
Greg

7
lettrong bối cảnh này ( letx ismột cái gì đó inbiểu thức sau) lần đầu tiên xuất hiện trong các văn bản toán học bằng tiếng Anh, và đây là nơi nó được đưa vào lập trình. Tôi thấy không có sự khác biệt giữa các hệ thống chính thức - ngôn ngữ toán học, ngôn ngữ lập trình, bất cứ điều gì khác - tất cả đều giống nhau.
SK-logic

3
"Đặt x là 3" không đúng ngữ pháp. Bạn sẽ không bao giờ thấy điều đó trong bất kỳ cuốn sách văn bản tiếng Anh. Bạn có thì sai của động từ "to be". Nó phải là "let x be 3" hoặc "let x bằng 3". Dù bằng cách nào, ngữ nghĩa hay không, tác giả câu hỏi đã yêu cầu một ngôn ngữ lập trình. Vì vậy, trừ khi bạn biết về một máy tính có hướng dẫn tiếng Anh có trước BASIC, tôi sẽ không mua nó. Mặt khác, chúng tôi có thể vừa trả lời "mã psuedo" và điều đó sẽ hợp lệ, nhưng sẽ không tôn trọng tinh thần của câu hỏi của cô ấy.
Greg

1
Tất nhiên tôi đã sử dụng ký hiệu ML, và ý tôi là equalskhông is. Và, vâng, mã giả là câu trả lời tốt nhất cho đến nay.
SK-logic

30

Tôi muốn thêm một quan điểm lý thuyết: Trong tính toán lambda cổ điển, letchỉ là đường cú pháp. Ví dụ

let x = N in M

có thể được viết lại đơn giản như

(λx.M)N

Vì vậy, sự xuất hiện đầu tiên của nó trong các ngôn ngữ (chức năng) sớm không thú vị.

Tuy nhiên, nó trở nên rất quan trọng với việc phát minh ra hệ thống loại Hindley-Milner và thuật toán suy luận kiểu của nó. Trong loại hệ thống letnày là không thể thiếu, bởi vì nó là đa hình (không giống như trừu tượng in trong HM). Ví dụ, hãy xem xét biểu thức đơn giản này:

let id = λx . x in id id

Đây idlà dạng đa hình, nó có kiểu ∀α.α → αvà do đó id idkiểm tra kiểu - kiểu này là id id : τ → τtùy ý. (Đối với lần đầu tiên idchúng ta gán τ → τcho αvà cho lần thứ hai idchúng ta gán τcho α.)

Tuy nhiên, chúng tôi không thể viết lại bằng cách sử dụng trừu tượng hóa và ứng dụng. Biểu hiện

(λid . id id)(λx.x)

không gõ kiểm tra, bởi vì trong trừu tượng λ đầu tiên idphải được chỉ định một loại monomorphic id : σđối với một số σ, và không có σ như vậy mà chúng ta có thể áp dụng id : σđể id : σ.

Bạn có thể thử điều này trong Haskell. Trong khi let id = \x -> x in id id :: t -> tkiểm tra kiểu, gõ (\id -> id id)(\x -> x)không thành công với

Kiểm tra xảy ra: không thể xây dựng kiểu vô hạn: t0 = t0 -> t0
Trong đối số đầu tiên của id, cụ thể là id
Trong biểu thức: id id
Trong biểu thức:\id -> id id


+1 cho một câu trả lời rất thú vị. Là một chủ đề phụ, nếu bạn biết, bạn có thể đăng bài (trong một bình luận, vì điều này không liên quan đến câu hỏi chính) liên quan đến một định nghĩa khắt khe về "đường cú pháp".
Giorgio

3
@Giorgio Để trích dẫn từ điển của hacker mới : Các tính năng được thêm vào ngôn ngữ hoặc chủ nghĩa hình thức khác để làm cho nó "ngọt ngào" hơn đối với con người, các tính năng không ảnh hưởng đến tính biểu cảm của chủ nghĩa hình thức. Được sử dụng đặc biệt. khi có một bản dịch rõ ràng và tầm thường của tính năng "đường" sang các cấu trúc khác đã có trong ký hiệu. a[i]Ký hiệu C là đường cú pháp cho *(a + i). Bài viết Wikipedia cũng có một lời giải thích tốt đẹp.
Petr Pudlák

3
công cụ thú vị nhưng hầu như không liên quan đến phần letgiới thiệu
wirrbel

2
Đó là một câu trả lời tốt bằng văn bản, nhưng nó không trả lời câu hỏi ban đầu.
Johan Karlsson

1
@JohanKarlsson Tôi không khẳng định đây là câu trả lời trực tiếp, nhưng tôi nghĩ điều này cũng liên quan đến chủ đề này. Cụ thể tại sao được letgiới thiệu, khi câu hỏi bắt đầu với tôi đã tự hỏi về nguồn gốc của "hãy" ...
Petr Pudlák

22

Lisp là ngôn ngữ lâu đời nhất trong số này có LET bây giờ . Nhưng BASIC là người đầu tiên nhận được nó, vì Lisp đã có được nó sau đó rất nhiều.

Trong Ada Lovelace Phân tích Công cụ (1843) - không có LET, một chương trình trông như:

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

Trong Plankalkül of Zuse (1943-45), chương trình có vẻ:

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

Mã ngắn được đề xuất bởi John Mauchly vào năm 1949

X3 =  (  X1 +  Y1 )  /  X1 * Y1   

PL trung gian của Burks, 1950, được sử dụng để chuyển nhượng ->

Năm 1952 được sử dụng =>=

Trình biên dịch Böhms, 1952, được sử dụng ->

Tại Đại học Manchester, Alick Glennie đã phát triển Autocodevào đầu những năm 1950. Mã và trình biên dịch đầu tiên được phát triển vào năm 1952 cho máy tính Mark 1 tại Đại học Manchester và được coi là ngôn ngữ lập trình cấp cao được biên dịch đầu tiên. Một lần nữa, ->cho nhiệm vụ

Charles Adams, FORTRAN 0 trong nhóm của Backus, Autocode 2, Brooks1 của Lubimsky và Kamynin; tất cả vào năm 1954, một lần nữa=

BACAIC (Grems, Porter), 1954, *để chuyển nhượng!

Máy xúc lật, ADES, 1955, =

CNTT, 1956, <-

FORTRAN, 1957, =

AT-3 (1956), Math-Matic (1957), một lần nữa =,

nhưng Flow-Matic năm 1957 có hai bài tập và cả hai đều bằng chữ

TRANSFER a TO bMOVE a TO b

Máy của Bauer và Samelson, 1957: =>


Xin lỗi, tôi không thể bao gồm tất cả các ngôn ngữ trong khoảng thời gian từ 1957 đến 1964, nhưng các ngôn ngữ lớn hơn

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)

chưa LET cho nhiệm vụ. Hoặc không , trong trường hợp LISP.


Dartmouth BASIC là phiên bản gốc của ngôn ngữ lập trình BASIC. Phiên bản tương tác đầu tiên được cung cấp cho người dùng phổ thông vào tháng 6 năm 1964 ;

 LET / = — assign formula results to a variable

14

Chà, giữa ba người đó, Lisp chắc chắn đã có nó trước. Haskell xuất hiện vào những năm 80 và Clojure vào những năm 00, và letđã tồn tại rất lâu trước một trong những ngày đó. :-)

Là để cho dù Lisp là các ngôn ngữ đã phát minh ra nó, tôi không thể xác minh cho rằng chưa, nhưng tôi sẽ làm một số nghiên cứu và xem. :-)

Cập nhật: Theo Evolution of Lisp (xem trang 46), nó đã đề cập đến việc letđược phát minh vào những năm 70:

LETChính mình là một macro đầu tiên được phát minh và phát minh lại tại địa phương tại mỗi trang web, đó là một người đến muộn trong thế giới MacLisp; theo Lisp Archive, nó đã được hấp thụ hồi tố vào PDP-10 MacLisp từ Lisp-Machine Lisp vào năm 1979 cùng lúc với cú pháp đối số DEFMACROphức tạp của Lisp Machine DEFUN.

Vẫn không hoàn toàn trả lời liệu nó đã được phát minh bằng ngôn ngữ khác trước đó, tất nhiên, nhưng vẫn là một điểm dữ liệu khác. :-)


4
ML cũng được phát triển trong những năm 70 nên có thể ý tưởng đã được giới thiệu trong cả ML và Lisp trong giai đoạn đó.
Giorgio

9

Báo cáo Đề án sửa đổi đầu tiên AIM-452 từ tháng 1 năm 1978 đã có LET. Trang 9.

lưu ý rằng Lisp đã sử dụng trước đó một cấu trúc khác PROGđể giới thiệu các biến cục bộ.

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

sẽ được viết sớm hơn khoảng

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

đã letluôn lexically scoped trong phương ngữ Lisp?
wirrbel

1
AIM-452 là báo cáo sửa đổi đầu tiên về Đề án. Báo cáo đầu tiên là AIM-349 từ năm 1975. Và AIM-848 là báo cáo sửa đổi sửa đổi. Và báo cáo sau đó, được gọi là báo cáo "đã sửa đổi ^ 3" (tức là lần đầu tiên sử dụng cách đặt tên "R ^ nRS") là báo cáo đầu tiên không phải là AIM mà là một đặc tả ngôn ngữ thực tế. Tìm kiếm một chút sẽ tìm cho bạn các tệp PDF của tất cả các tài liệu này để bạn có thể tự đọc chúng. Nếu bạn muốn quay lại xa hơn, bạn có thể tìm thấy hướng dẫn sử dụng MacLisp cũ từ Nhóm Bảo quản Phần mềm và có thể bạn cũng có thể tìm thấy một số báo cáo LISP 1.5.
TaylanUB

@wirrbel, có vẻ như nó đã letcũ như phạm vi từ vựng (Scheme, '75), và phải mất một thời gian để phạm vi từ vựng để được chấp nhận, vì vậy tôi đoán rằng những trường hợp đầu tiên letlà trong bối cảnh của Lisps có phạm vi động. Ngày nay, Emacs Lisp vẫn có phạm vi động theo mặc định, lambdalet(đường sau cho đường trước dù sao) ràng buộc các tham số của chúng một cách linh hoạt.
TaylanUB
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.