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?
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.
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
+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:
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 ;
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. :-)
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.
Jawaban:
Nah, BASIC memiliki
LET
tugas sebagai bagian dari sintaks sejak awal tahun 1964, sehingga akan mendahului penggunaanlet
dalam 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
LET
sintaks mereka juga. Jadi saya akan pergi dengan BASIC.sumber
let
pada dasarnya tidak mengikat secara leksikal. Jadi, jawaban yang benar adalah "pertama kali muncul dalam bahasa Inggris, sebelum abad ke-12".let
dalam konteks ini (let
xis
sesuatuin
ungkapan 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.equals
, tidakis
. Dan, ya, kode semu adalah jawaban terbaik sejauh ini.Saya ingin menambahkan sudut pandang teoretis: Dalam kalkulus lambda klasik,
let
hanyalah gula sintaksis. Sebagai contohdapat ditulis ulang hanya sebagai
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
let
ini sangat diperlukan, karena itu polimorfik (tidak seperti λ-abstraksi di HM). Misalnya, perhatikan ungkapan sederhana ini:Berikut
id
adalah polimorfik, ia memiliki tipe∀α.α → α
, dan karenanyaid id
tipe-cek - tipenya adalahid id : τ → τ
untuk τ acak. (Untuk yang pertamaid
kami tetapkanτ → τ
untukα
dan untuk yang keduaid
kami tetapkanτ
untukα
.)Namun, kami tidak dapat menulis ulang menggunakan abstraksi λ dan aplikasi. Ekspresi
tidak mengetik-cek, karena dalam abstraksi λ pertama
id
harus ditugaskan jenis monomorfikid : σ
untuk beberapa σ, dan tidak ada σ sehingga kita bisa berlakuid : σ
untukid : σ
.Anda dapat mencobanya sendiri di Haskell. Saat
let id = \x -> x in id id :: t -> t
mengetik-cek, pengetikan(\id -> id id)(\x -> x)
gagal dengansumber
a[i]
Notasi C adalah gula sintaksis untuk*(a + i)
. Artikel Wikipedia juga memiliki penjelasan yang bagus.let
perkenalanlet
diperkenalkan, sebagai pertanyaan dimulai dengan aku bertanya-tanya tentang asal-usul dari "membiarkan" ...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:
Dalam Plankalkül of Zuse (1943-45) program tersebut terlihat:
Kode Pendek diusulkan oleh John Mauchly pada tahun 1949
PL Menengah Burks, 1950, digunakan untuk penugasan
->
Rutishauser pada tahun 1952 digunakan
=>=
Böhms compiler, 1952, digunakan
->
Di Universitas Manchester, Alick Glennie berkembang
Autocode
pada 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 penugasanCharles 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
danMOVE 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
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 ;
sumber
Nah, di antara mereka bertiga, Lisp pasti yang pertama. Haskell muncul sekitar tahun 80-an, dan Clojure pada tahun 00-an, dan
let
telah 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
let
ditemukan pada tahun 70-an:Masih tidak cukup menjawab apakah itu ditemukan dalam bahasa lain sebelumnya, tentu saja, tetapi masih merupakan data lain. :-)
sumber
Laporan Skema Revisi pertama AIM-452 dari Januari 1978
LET
. Halaman 9.perhatikan bahwa Lisp sebelumnya menggunakan konstruk yang berbeda
PROG
untuk memperkenalkan variabel lokal.akan ditulis lebih awal sebagai
sumber
let
selalu leksikal scoped dalam dialek Lisp?let
sudah setua leksikal pelingkupan (Skema, '75), dan butuh beberapa saat untuk pelingkupan leksikal untuk mendapatkan penerimaan, jadi saya kira contoh pertamalet
dalam konteks Lisps yang dicakup secara dinamis. Hari ini, Emacs Lisp masih memiliki ruang lingkup dinamis secara default, denganlambda
danlet
(gula terakhir untuk yang sebelumnya) mengikat parameter mereka secara dinamis.