Dalam bahasa pemrograman apa "biarkan" pertama kali muncul?

24

Saya bertanya-tanya tentang asal-usul "biarkan" yang digunakan dalam Lisp, Clojure, dan Haskell. Adakah yang tahu bahasa mana yang pertama kali muncul?

carinmeier
sumber
Assembler menggunakan MOV, bukan LET dari tahun 1954. Apakah itu tidak cukup?
Gangnus
1
LISP sudah cukup tua untuk menjadi kandidat yang baik.
mouviciel
2
untuk pertanyaan "Dalam bahasa pemrograman apa X pertama kali muncul" lisp adalah tebakan yang cukup bagus untuk jawaban yang benar
Zachary K
2
biarkan asal berasal dari matematika, bukan dari bahasa pemrograman lain.
Pieter B
Anda membuat asumsi yang salah bahwa penggunaan pertama "biarkan" dalam bahasa pemrograman adalah asal dari "biarkan" -menggunakan dalam Lisp, Clojure, dan Haskell.
Pieter B

Jawaban:

41

Nah, BASIC memiliki LETtugas sebagai bagian dari sintaks sejak awal tahun 1964, sehingga akan mendahului penggunaan letdalam Lisp, yang seperti yang ditunjukkan Chris Jester-Young tidak muncul sampai tahun 1970-an menurut Evolution of Lisp .

Saya tidak percaya COBOL, Fortran, atau ALGOL memiliki LETsintaks mereka juga. Jadi saya akan pergi dengan BASIC.

Greg
sumber
11
Tetapi semantik sangat berbeda - letpada dasarnya tidak mengikat secara leksikal. Jadi, jawaban yang benar adalah "pertama kali muncul dalam bahasa Inggris, sebelum abad ke-12".
SK-logic
12
Tetapi pertanyaannya adalah: Bahasa pemrograman apa yang pertama kali "dibiarkan" muncul? Saya tidak menganggap bahasa Inggris sebagai bahasa pemrograman (setidaknya dalam konteks ini).
Greg
7
letdalam konteks ini ( letx issesuatu inungkapan berikut) pertama kali muncul dalam teks matematika dalam bahasa Inggris, dan ini adalah tempat pemrograman. Saya tidak melihat perbedaan antara sistem formal - bahasa matematika, bahasa pemrograman, apa pun yang lain - semuanya sama.
SK-logic
3
"let x is 3" bukanlah tata bahasa yang tepat. Anda tidak akan pernah melihatnya di buku teks bahasa Inggris apa pun. Anda memiliki kata kerja salah dari kata "to be". Itu harus "let x be 3" atau "let x equal 3". Either way, semantik atau tidak, penulis pertanyaan itu meminta bahasa pemrograman. Jadi kecuali Anda tahu komputer yang menggunakan instruksi bahasa Inggris yang ada sebelum BASIC, saya tidak akan membelinya. Kalau tidak, kita bisa saja menjawab "kode psuedo" dan itu akan berlaku, tetapi tidak akan menghormati semangat pertanyaannya.
Greg
1
tentu saja saya menggunakan notasi ML, dan maksud saya equals, tidak is. Dan, ya, kode semu adalah jawaban terbaik sejauh ini.
SK-logic
30

Saya ingin menambahkan sudut pandang teoretis: Dalam kalkulus lambda klasik, lethanyalah gula sintaksis. Sebagai contoh

let x = N in M

dapat ditulis ulang hanya sebagai

(λx.M)N

Jadi penampilan pertamanya dalam bahasa-bahasa awal (fungsional) tidak begitu menarik.

Namun, menjadi sangat penting dengan penemuan sistem tipe Hindley-Milner dan algoritme inferensi tipenya. Dalam sistem jenis letini sangat diperlukan, karena itu polimorfik (tidak seperti λ-abstraksi di HM). Misalnya, perhatikan ungkapan sederhana ini:

let id = λx . x in id id

Berikut idadalah polimorfik, ia memiliki tipe ∀α.α → α, dan karenanya id idtipe-cek - tipenya adalah id id : τ → τuntuk τ acak. (Untuk yang pertama idkami tetapkan τ → τuntuk αdan untuk yang kedua idkami tetapkan τuntuk α.)

Namun, kami tidak dapat menulis ulang menggunakan abstraksi λ dan aplikasi. Ekspresi

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

tidak mengetik-cek, karena dalam abstraksi λ pertama idharus ditugaskan jenis monomorfik id : σuntuk beberapa σ, dan tidak ada σ sehingga kita bisa berlaku id : σuntuk id : σ.

Anda dapat mencobanya sendiri di Haskell. Saat let id = \x -> x in id id :: t -> tmengetik-cek, pengetikan (\id -> id id)(\x -> x)gagal dengan

Terjadi cek: tidak dapat membangun tipe infinite: t0 = t0 -> t0
Pada argumen pertama id, yaitu id
Dalam ekspresi: id id
Dalam ekspresi:\id -> id id

Petr Pudlák
sumber
+1 untuk jawaban yang sangat menarik. Sebagai topik sampingan, jika Anda tahu satu, bisakah Anda memposting (dalam komentar, karena ini tidak terkait dengan pertanyaan utama) referensi ke definisi ketat "gula sintaksis".
Giorgio
3
@Giorgio Mengutip kamus peretas Baru : Fitur ditambahkan ke bahasa atau formalisme lain untuk membuatnya "lebih manis" bagi manusia, fitur yang tidak memengaruhi ekspresifitas formalisme. Khususnya esp. ketika ada terjemahan yang jelas dan sepele dari fitur "gula" ke dalam konstruksi lain yang sudah ada dalam notasi. a[i]Notasi C adalah gula sintaksis untuk *(a + i). Artikel Wikipedia juga memiliki penjelasan yang bagus.
Petr Pudlák
3
hal-hal menarik tetapi hampir tidak ada hubungannya dengan letperkenalan
wirrbel
2
Ini adalah jawaban yang ditulis dengan baik, tetapi tidak menjawab pertanyaan awal.
Johan Karlsson
1
@JohanKarlsson Saya tidak mengklaim itu adalah jawaban langsung, tapi saya pikir ini juga relevan dengan topik. Secara khusus mengapa itu letdiperkenalkan, sebagai pertanyaan dimulai dengan aku bertanya-tanya tentang asal-usul dari "membiarkan" ...
Petr Pudlák
22

Lisp adalah bahasa tertua yang memiliki LET sekarang . Tetapi BASIC adalah yang pertama mendapatkannya, karena Lisp telah mendapatkannya jauh kemudian.

Dalam Ada Lovelace Analytical Engine (1843) - no LET, sebuah program terlihat seperti:

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

Dalam Plankalkül of Zuse (1943-45) program tersebut terlihat:

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

Kode Pendek diusulkan oleh John Mauchly pada tahun 1949

X3 =  (  X1 +  Y1 )  /  X1 * Y1   

PL Menengah Burks, 1950, digunakan untuk penugasan ->

Rutishauser pada tahun 1952 digunakan =>=

Böhms compiler, 1952, digunakan ->

Di Universitas Manchester, Alick Glennie berkembang Autocodepada awal 1950-an. Kode dan kompiler pertama dikembangkan pada tahun 1952 untuk komputer Mark 1 di Universitas Manchester dan dianggap sebagai bahasa pemrograman tingkat tinggi pertama yang dikompilasi. Sekali lagi, ->untuk penugasan

Charles Adams, FORTRAN 0 dari grup Backus, Brooker's Autocode 2, ПП1 dari Lubimsky dan Kamynin; semua pada tahun 1954, lagi=

BACAIC (Grems, Porter), 1954, *untuk penugasan!

Kompiler, ADES, 1955, =

ITU, 1956, <-

FORTRAN, 1957, =

AT-3 (1956), Math-Matic (1957), sekali lagi =,

tetapi Flow-Matic pada tahun 1957 memiliki dua tugas, dan keduanya dalam kata-kata

TRANSFER a TO b dan MOVE a TO b

Mesin Bauer dan Samelson, 1957: =>


Maaf, saya tidak bisa mencakup semua bahasa antara tahun 1957 dan 1964, tetapi bahasa yang lebih besar

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)

belum BIARKAN untuk tugas. Atau tidak , dalam kasus LISP.


Dartmouth BASIC adalah versi asli dari bahasa pemrograman BASIC. Versi interaktif pertama dibuat tersedia untuk pengguna umum pada bulan Juni 1964 ;

 LET / = — assign formula results to a variable
Gangnus
sumber
14

Nah, di antara mereka bertiga, Lisp pasti yang pertama. Haskell muncul sekitar tahun 80-an, dan Clojure pada tahun 00-an, dan lettelah ada jauh sebelum tanggal-tanggal tersebut. :-)

Seperti apakah Lisp adalah yang bahasa telah menemukan itu, aku tidak bisa menjamin untuk itu, tapi saya akan melakukan penelitian dan melihat. :-)

Pembaruan: Menurut Evolusi Lisp (lihat halaman 46), disebutkan bahwa letditemukan pada tahun 70-an:

LET—Diri makro yang pertama kali ditemukan dan diciptakan kembali secara lokal di setiap situs — adalah pendatang baru ke dunia MacLisp; menurut Lisp Archive, ia diserap secara surut ke dalam PDP-10 MacLisp dari Lisp-Machine Lisp pada 1979 bersamaan dengan sintaksis argumen DEFMACROLisp Machine yang kompleks DEFUN.

Masih tidak cukup menjawab apakah itu ditemukan dalam bahasa lain sebelumnya, tentu saja, tetapi masih merupakan data lain. :-)

Chris Jester-Young
sumber
4
ML juga dikembangkan selama tahun 70-an sehingga mungkin ide tersebut diperkenalkan pada ML dan Lisp pada periode itu.
Giorgio
9

Laporan Skema Revisi pertama AIM-452 dari Januari 1978 LET. Halaman 9.

perhatikan bahwa Lisp sebelumnya menggunakan konstruk yang berbeda PROGuntuk memperkenalkan variabel lokal.

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

akan ditulis lebih awal sebagai

(prog (a b)
  (setq a 1)
  (setq b 1)
  (+ a b))
Rainer Joswig
sumber
itu letselalu leksikal scoped dalam dialek Lisp?
wirrbel
1
AIM-452 adalah laporan revisi pertama tentang Skema. Laporan pertama adalah AIM-349 dari tahun 1975. Dan AIM-848 adalah laporan revisi yang direvisi. Dan yang setelah itu, disebut laporan "revisi ^ 3" (yaitu yang pertama menggunakan penamaan "R ^ nRS") adalah yang pertama yang bukan AIM tetapi spesifikasi bahasa yang sebenarnya. Googling sekitar sedikit akan menemukan Anda PDF dari semua dokumen ini sehingga Anda dapat membacanya sendiri. Jika Anda ingin melangkah lebih jauh ke belakang, Anda dapat menemukan manual MacLisp lama dari Kelompok Pelestarian Perangkat Lunak, dan mungkin Anda juga dapat menemukan beberapa laporan LISP 1.5.
TaylanUB
@ Wirrbel, sepertinya letsudah setua leksikal pelingkupan (Skema, '75), dan butuh beberapa saat untuk pelingkupan leksikal untuk mendapatkan penerimaan, jadi saya kira contoh pertama letdalam konteks Lisps yang dicakup secara dinamis. Hari ini, Emacs Lisp masih memiliki ruang lingkup dinamis secara default, dengan lambdadan let(gula terakhir untuk yang sebelumnya) mengikat parameter mereka secara dinamis.
TaylanUB