İlk olarak hangi programlama dilinde “izin” göründü?


24

Lisp, Clojure ve Haskell'de kullanılan "izin" in kökenlerini merak ediyordum. Önce hangi dilde göründüğünü bilen var mı?


Assembler 1954'ten itibaren LET yerine MOV kullanıyor. Yeterli değil mi?
Gangnus

1
LISP iyi bir aday olmak için yeterince eskidir.
mouviciel

2
Herhangi bir soru için "X, hangi programlama dilinde ilk olarak göründü?" lisp, doğru bir cevap için oldukça iyi bir tahmindir
Zachary K,

2
Kökenlerin matematikten gelmesine izin verin, diğer programlama dillerinden değil.
Pieter B

Programlama dilinde "let" in ilk kullanımının Lisp, Clojure ve Haskell'de "let" -use kökeni olduğunu yanlış kabul ediyorsunuz.
Pieter B

Yanıtlar:


41

Eh, TEMEL vardı LETo kullanımını öncesine ait diye, 1964 yılında baştan sözdizimi bir parçası olarak atama için letChris Jester-Young işaret ettiği gibi uygun 1970'lere kadar ortaya çıkmadı ki, Lisp'te Lisp Evrimi .

COBOL, Fortran veya ALGOL'ün de LETsözdiziminde olduğuna inanmıyorum . Bu yüzden BASIC ile gideceğim.


11
Fakat anlambilim çok farklı - lettemelde sözcüksel olarak kapsamalı bir bağlanma değil. Dolayısıyla, doğru cevap "ilk olarak 12. yüzyıldan önce İngilizce olarak göründü" gibi bir şey olurdu.
SK-mantık

12
Ancak soru şudur: "İzin ver" ilk olarak hangi programlama dili çıktı? İngilizceyi gerçekten bir programlama dili olarak görmüyorum (en azından bu bağlamda).
Greg,

7
letBu bağlamda ( letx isşey ino programlama içine geldiği ilk İngilizce olarak matematiksel metinlerde ortaya şu ifade) ve burası. Biçimsel sistemler arasında bir fark görmüyorum - matematiksel diller, programlama dilleri, başka herhangi bir şey - hepsi aynı.
SK-mantık

3
"x 3 olsun" uygun dilbilgisi değildir. Bunu asla herhangi bir İngilizce ders kitabında göremezsiniz. "Olmak" fiilinin yanlış zamanına sahipsiniz. "X 3 olsun" veya "x 3 olsun" olmalıdır. Her iki durumda da, anlamsal ya da değil, soru yazar bir programlama dili için soruyordu. Yani, BASIC'ten önce İngilizce talimatlar alan bir bilgisayar bilmiyorsanız, onu satın almıyorum. Aksi takdirde, "psuedo kodunu" henüz cevaplamış olabilirdik ve bu geçerli olurdu, ancak sorusunun ruhuna uymuyordu.
Greg,

1
Tabii ki ML notasyonu kullandım ve demek equalsistemedim is. Ve evet, sözde kod, şu ana kadarki en iyi cevap.
SK-mantık

30

Teorik bir bakış açısı eklemek isterim: Klasik lambda calculi'de letsadece sözdizimsel bir şekerdir. Örneğin

let x = N in M

olduğu gibi yeniden yazılabilir

(λx.M)N

Bu yüzden erken (işlevsel) dillerdeki ilk görünümü o kadar ilginç değil.

Bununla birlikte, Hindley-Milner tipi sistemin icadı ve onun tip çıkarım algoritması ile çok önemli hale geldi . Bu tip sistemde letvazgeçilmezdir, çünkü polimorfiktir (HM'deki ab-soyutlamanın aksine). Örneğin, bu basit ifadeyi göz önünde bulundurun:

let id = λx . x in id id

İşte idpolimorfik, türüne sahip ∀α.α → αve bu nedenle id idtür denetimleri - türü id id : τ → τkeyfi τ içindir. (İlk için idbiz assign τ → τetmek α, ikincisi için idbiz assign τiçin α.)

Ancak λ soyutlama ve uygulama kullanarak tekrar yazamayız. ifade

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

tip-çek vermez, çünkü ilk λ soyutlama içinde idbir monomorfik türü atanmalıdır id : σbazı σ için ve biz geçerli olabilir böyle hiçbir σ yoktur id : σiçin id : σ.

Bunu Haskell'de deneyebilirsiniz. let id = \x -> x in id id :: t -> tYazma kontrolleri yaparken , yazarken (\id -> id id)(\x -> x)başarısız

Kontrol oluşur: sonsuz türünü oluşturamaz: t0 = t0 -> t0
İlk argümanda id, yani id
ifadede: id id
İfadesinde:\id -> id id


Çok ilginç bir cevap için +1. Bir yan konu olarak, bir tanesini biliyorsanız, (ana soruyla ilgili olmadığı için bir yorumda) "sözdizimsel şeker" in titiz bir tanımına gönderme yapabilir misiniz?
Giorgio

3
@Giorgio Yeni bilgisayar korsanının sözlüğünden alıntı yapmak : Bir dile ya da başka bir biçimciliğe eklenen, insanlar için onu "daha tatlı" kılan özellikler, biçimciliğin dışavurumunu etkilemeyen özellikler. Kullanılan esp. “şeker” özelliğinin, gösterimde zaten mevcut olan diğer yapılara açık ve önemsiz bir çevirisi olduğunda. C'nin a[i]gösterimi, sözdizimsel şekerdir *(a + i). Wikipedia makalesinin de güzel bir açıklaması var.
Petr Pudlák

3
ilginç şeyler ama pek ilişkin letbireyin tanıtım
wirrbel

2
İyi yazılmış bir cevaptır, ancak orijinal soruyu cevaplamaz.
Johan Karlsson

1
@JohanKarlsson Doğrudan bir cevap olduğunu iddia etmiyorum, ancak bunun konuyla da alakalı olduğunu düşünüyorum. Özellikle neden oldu letsorusu başlar başlamaz, tanıtılan ile ... Ben "let" nin kökeni hakkında merak
Petr Pudlac

22

Lisp, şimdi LET'e sahip olanların en eski dilidir . Fakat bunu ilk yapan BASIC oldu, çünkü Lisp daha sonra elde etti.

Ada Lovelace Analitik Motorunda (1843) - LET yok, bir program şöyle görünür:

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

Zuse Plankalkül'de (1943-45) program şöyle görünür:

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

Kısa Kod, 1949'da John Mauchly tarafından önerildi.

X3 =  (  X1 +  Y1 )  /  X1 * Y1   

Intermediate PL of Burks, 1950, ödev için kullanılır. ->

1952'de Rutishauser kullanılmış =>=

Böhms derleyicisi, 1952, kullanılmış ->

Manchester Üniversitesi'nde Alick Glennie Autocode, 1950'lerin başında gelişti . İlk kod ve derleyici, 1952'de Manchester Üniversitesi'ndeki Mark 1 bilgisayarı için geliştirildi ve ilk derlenmiş yüksek seviye programlama dili olarak kabul edildi. Yine, ->ödev için

Backus grubunun FORTRAN 0'ından Charles Adams, Brooker's Autocode 2, Lubimsky ve Kamynin'den ПП1; hepsi 1954’te tekrar=

BACAIC (Grems, Porter), 1954, *ödev için!

Kompiler, ADES, 1955, =

Bilişim, 1956, <-

FORTRAN, 1957, =

AT-3 (1956), Math-Matic (1957), yine =,

ancak 1957’deki Flow-Matic’in iki görevi vardı ve her ikisi de kelimelerdeydi

TRANSFER a TO b ve MOVE a TO b

Bauer ve Samelson'ın makinesi, 1957: =>


Maalesef 1957 ve 1964 arasındaki tüm dilleri kapsayamıyorum, ancak daha büyük dilleri

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)

atamak için LET almamış. LISP durumunda da yoktu .


Dartmouth BASIC , BASIC programlama dilinin orijinal sürümüdür. İlk interaktif versiyon Haziran 1964’te genel kullanıcılara sunuldu ;

 LET / = — assign formula results to a variable

14

Eh, bu üç arasında, Lisp kesinlikle önce sahipti. Haskell 80'lerde, Clojure 00'larda ortaya çıktı ve bu tarihlerden herhangi birinden çok önce letvardı . :-)

Lisp'in onu icat eden dil olup olmadığına gelince, bunun için henüz kefil olamıyorum ama biraz araştırma yapacağım ve göreceğim. :-)

Güncelleme: Lisp'in Evrimine göre (bkz. Sayfa 46), let70'lerde icat edildiğinden bahsetti :

LET- önce her sitede yerel olarak icat edilen ve yeniden icat eden bir makro - MacLisp dünyasının son zamanlarıydı; Lisp Arşivi'ne göre, 1979'da Lisp-Machine Lisp'ten PDP-10 MacLisp'e DEFMACROve karmaşık Lisp Machine DEFUNargüman sözdizimi ile aynı anda geriye dönük olarak absorbe edildi .

Elbette daha önce başka bir dilde icat edilip edilmediğine henüz cevap vermedi elbette, ama yine de başka bir veri noktası. :-)


4
ML 70'lerde de geliştirildi, bu yüzden fikir o dönemde hem ML hem de Lisp'te tanıtıldı.
Giorgio

9

İlk Revize Edilmiş Şema raporu Ocak 1978'den AIM-452'ye sahiptir LET. Sayfa 9.

Lisp'in daha önce PROGyerel değişkenleri tanıtmak için farklı bir yapı kullandığını unutmayın .

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

yaklaşık olarak önceden yazılmış

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

oldu lethep lexically Lisp lehçelerinde kapsamlı?
wirrbel

1
AIM-452, Program ile ilgili ilk revize edilmiş rapordur. İlk rapor 1975'ten AIM-349'dur. AIM-848 revize edilmiş rapordur. Ve bundan sonra "revize ^ 3" raporu ("R ^ nRS" ismini kullanan ilk isim), AIM değil, gerçek bir dil belirtimidir. Biraz dolaşmak, tüm bu belgelerin PDF'lerini bulacaktır, böylece bunları kendiniz okuyabilirsiniz. Daha ileriye gitmek istiyorsanız, Yazılım Koruma Grubundan eski bir MacLisp kılavuzu bulabilirsiniz ve belki de bazı LISP 1.5 raporlarını da bulabilirsiniz.
TaylanUB

@wirrbel, görünüşe göre letsözcüksel kapsamlaştırma kadar eski (Scheme, '75) ve sözcüksel kapsamlamanın kabul görmesi biraz zaman aldı, bu yüzden ilk örneklerinin letdinamik olarak kapsamda olan Lisps bağlamında olduğunu tahmin ediyorum. Bugün, Emacs Lisp hala varsayılan olarak dinamik kapsamını sahiptir lambdave letdinamik parametrelerini bağlayıcı (eski için yine de ikinci şeker).
TaylanUB
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.