Asembler używa MOV zamiast LET z 1954 roku. Czy to nie wystarczy?
Gangnus
1
LISP jest wystarczająco duży, aby być dobrym kandydatem.
mouviciel
2
na dowolne pytanie „W jakim języku programowania pojawił się X” seplenienie jest dość dobrym przypuszczeniem prawidłowej odpowiedzi
Zachary K
2
niech pochodzenie pochodzi z matematyki, a nie z innych języków programowania.
Pieter B,
Przyjmujesz błędne założenie, że pierwsze użycie „let” w języku programowania jest początkiem użycia „let” w Lisp, Clojure i Haskell.
Pieter B,
Odpowiedzi:
41
Cóż, BASIC miał LETdo przydzielenia jako część składni od samego początku w 1964 roku, więc to byłoby wcześniejsze niż użycie letw Lisp, które, jak podkreśla Chris Jester-Young, pojawiło się dopiero w 1970 roku, według Evolution of Lisp .
Nie wierzę też, że COBOL, Fortran lub ALGOL mają LETswoją składnię. Więc idę z BASIC.
Ale semantyka jest zupełnie inna - letw zasadzie nie jest powiązaniem o zasięgu leksykalnym. Prawidłowa odpowiedź brzmiałaby więc tak: „po raz pierwszy pojawiła się w języku angielskim przed XII wiekiem”.
SK-logika
12
Ale pytanie brzmi: w jakim języku programowania pojawiło się słowo „let”? Tak naprawdę nie uważam angielskiego za język programowania (przynajmniej w tym kontekście).
Greg
7
letw tym kontekście ( letx iscoś inw poniższym wyrażeniu) po raz pierwszy pojawił się w tekstach matematycznych w języku angielskim i tutaj przyszedł do programowania. Nie widzę różnicy między systemami formalnymi - językami matematycznymi, językami programowania, czymkolwiek innym - wszystkie są takie same.
SK-logika
3
„niech x wynosi 3” nie jest prawidłową gramatyką. Nigdy nie zobaczysz tego w żadnym angielskim podręczniku. Masz niewłaściwy czasownik „być”. Powinno to być „niech x będzie 3” lub „niech x równa się 3”. Tak czy inaczej, semantyka czy nie, autor pytania pytał o język programowania. Więc jeśli nie znasz komputera, który przyjmuje instrukcje w języku angielskim poprzedzające BASIC, nie kupuję go. W przeciwnym razie moglibyśmy właśnie odpowiedzieć na „kod psuedo” i byłoby to prawidłowe, ale nie uszanowałoby ducha jej pytania.
Greg,
1
oczywiście użyłem notacji ML i miałem na myśli equals, że nie is. I tak, pseudo-kod jest jak dotąd najlepszą odpowiedzią.
SK-logika
30
Chciałbym dodać teoretyczny punkt widzenia: w klasycznych obliczeniach lambda letjest po prostu cukrem syntaktycznym. Na przykład
let x = N in M
można przepisać po prostu jako
(λx.M)N
Więc jego pierwsze pojawienie się we wczesnych (funkcjonalnych) językach nie jest tak interesujące.
Jednak stało się to bardzo ważne wraz z wynalezieniem systemu typu Hindley-Milner i jego algorytmem wnioskowania typu. W tym typie system letjest niezbędny, ponieważ jest polimorficzny (w przeciwieństwie do λ-abstrakcji w HM). Rozważmy na przykład to proste wyrażenie:
let id = λx . x in id id
Tutaj idjest polimorficzny, ma typ ∀α.α → α, a zatem id idsprawdza typ - jest typem id id : τ → τdla dowolnego τ. (Na pierwszym idprzypisujemy τ → τdo αi dla drugiego idprzypiszemy τdo α).
Nie możemy go jednak przepisać przy użyciu abstrakcji i aplikacji λ. Wyrażenie
(λid . id id)(λx.x)
nie typ-czek, bo w pierwszym X abstrakcji idmusi być przypisany jednokształtnym rodzaj id : σjakiegoś Ď, a nie ma σ takie, że możemy zastosować id : σdo id : σ.
Możesz tego spróbować w Haskell. Podczas let id = \x -> x in id id :: t -> tsprawdzania typu pisanie (\id -> id id)(\x -> x)kończy się niepowodzeniem
Występuje sprawdzenie: nie można skonstruować typu nieskończonego: t0 = t0 -> t0
W pierwszym argumencie id, mianowicie id
W wyrażeniu: id id
W wyrażeniu:\id -> id id
+1 za bardzo interesującą odpowiedź. Na marginesie, jeśli go znasz, możesz zamieścić (w komentarzu, ponieważ nie jest to związane z głównym pytaniem) odniesienie do ścisłej definicji „cukru syntaktycznego”.
Giorgio
3
@Giorgio Cytując słownik nowego hakera : Funkcje dodane do języka lub innego formalizmu, aby uczynić go „słodszym” dla ludzi, cechy, które nie wpływają na ekspresję formalizmu. Używane esp. gdy istnieje oczywiste i trywialne tłumaczenie cechy „cukru” na inne konstrukty już obecne w notacji. a[i]Notacja C to cukier syntaktyczny *(a + i). Artykuł w Wikipedii ma również dobre wyjaśnienie.
Petr Pudlák
3
ciekawe rzeczy, ale mało związane z letwprowadzeniem
wirrbel,
2
Jest to dobrze napisana odpowiedź, ale nie odpowiada na pierwotne pytanie.
Johan Karlsson
1
@JohanKarlsson Nie twierdzę, że jest to bezpośrednia odpowiedź, ale myślę, że dotyczy to również tematu. W szczególności dlaczego został letwprowadzony, ponieważ pytanie zaczyna się od zastanawiania się nad początkami „let” ...
Petr Pudlák
22
Lisp jest najstarszym językiem tych mającego LET teraz . Ale BASIC był pierwszym, który go otrzymał, ponieważ Lisp uzyskał go znacznie później.
W Ada Lovelace Analytical Engine (1843) - brak LET, program wygląda następująco:
N0 6 N1 1 N2 1 × L1 L0 S1 L0 L2 S0 L2 L0 CB?11 '
W Plankalkül of Zuse (1943-45) program wygląda następująco:
Krótki kod został zaproponowany przez Johna Mauchly'ego w 1949 roku
X3 = ( X1 + Y1 ) / X1 * Y1
Pośredni PL of Burks, 1950, wykorzystany do zadania ->
Używany Rutishauser w 1952 roku =>=
Używany kompilator Böhm, 1952 ->
Na uniwersytecie w Manchesterze Alick Glennie rozwinął się Autocodena początku lat pięćdziesiątych. Pierwszy kod i kompilator został opracowany w 1952 roku dla komputera Mark 1 na University of Manchester i jest uważany za pierwszy skompilowany język programowania wysokiego poziomu. Ponownie, ->do zadania
Charles Adams, FORTRAN 0 z grupy Backusa, Autokod 2 Brookera, ПП1 Lubimskiego i Kamynina; znowu w 1954 roku=
BACAIC (Grems, Porter), 1954, *za zadanie!
Kompiler, ADES, 1955, =
IT, 1956, <-
FORTRAN, 1957 r., =
AT-3 (1956), Math-Matic (1957), ponownie =,
ale Flow-Matic w 1957 r. miał dwa zadania i oba są słowne
TRANSFER a TO b i MOVE a TO b
Maszyna Bauera i Samelsona, 1957: =>
Niestety, nie mogę objąć wszystkich języków między 1957 a 1964 rokiem, ale większych języków
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)
nie LET dla zadania. Lub nie , w przypadku LISP.
Dartmouth BASIC to oryginalna wersja języka programowania BASIC. Pierwsza interaktywna wersja została udostępniona ogólnym użytkownikom w czerwcu 1964 r . ;
Pomiędzy tymi trzema Lisp zdecydowanie miał go pierwszy. Haskell powstał w latach osiemdziesiątych, a Clojure w latach dziewięćdziesiątych i letbył na długo przed którąkolwiek z tych dat. :-)
Czy Lisp był język wymyślili go, nie mogę ręczyć za to jeszcze, ale będę robić jakieś badania i zobaczymy. :-)
Aktualizacja: Według Evolution of Lisp (patrz strona 46) wspomniała, że letzostała wynaleziona w latach 70-tych:
LET- samo makro wymyślone i wymyślone lokalnie w każdym miejscu - spóźniło się ze światem MacLisp; Według Archiwum Lisp został on wstecznie zaabsorbowany do PDP-10 MacLisp z Lisp-Machine Lisp w 1979 roku w tym samym czasie co DEFMACROzłożona DEFUNskładnia argumentów Lisp Machine .
Nadal nie do końca odpowiada, czy został wcześniej wynaleziony w innym języku, ale wciąż inny punkt danych. :-)
letzawsze był w zakresie dialektu Lisp w zakresie leksykalnym?
wirrbel,
1
AIM-452 to pierwszy poprawiony raport na temat programu. Pierwszym raportem jest AIM-349 z 1975 r. A AIM-848 to poprawiony poprawiony raport. A następny, zwany raportem „poprawiona ^ 3” (tj. Pierwszy, który używał nazewnictwa „R ^ nRS”) był pierwszym, który nie był AIM, ale rzeczywistą specyfikacją języka. Google przeglądając trochę, znajdziesz pliki PDF wszystkich tych dokumentów, dzięki czemu możesz je przeczytać samodzielnie. Jeśli chcesz cofnąć się o krok wstecz, możesz znaleźć starą instrukcję MacLisp z grupy Software Preservation Group, a być może uda ci się również znaleźć raporty LISP 1.5.
TaylanUB,
@wirrbel, wydaje się, że letjest prawie tak stary, jak zakres leksykalny (Scheme, '75), i zajęło trochę czasu, zanim zakres zakresu leksykalnego zyskał akceptację, więc zgaduję, że pierwsze przypadki letbyły w kontekście dynamicznie skalowanego Lispsa. Dzisiaj Emacs Lisp nadal ma domyślnie zakres dynamiczny, a lambdai let(ten drugi cukier dla tych pierwszych i tak) wiążą ich parametry dynamicznie.
Odpowiedzi:
Cóż, BASIC miał
LET
do przydzielenia jako część składni od samego początku w 1964 roku, więc to byłoby wcześniejsze niż użycielet
w Lisp, które, jak podkreśla Chris Jester-Young, pojawiło się dopiero w 1970 roku, według Evolution of Lisp .Nie wierzę też, że COBOL, Fortran lub ALGOL mają
LET
swoją składnię. Więc idę z BASIC.źródło
let
w zasadzie nie jest powiązaniem o zasięgu leksykalnym. Prawidłowa odpowiedź brzmiałaby więc tak: „po raz pierwszy pojawiła się w języku angielskim przed XII wiekiem”.let
w tym kontekście (let
xis
cośin
w poniższym wyrażeniu) po raz pierwszy pojawił się w tekstach matematycznych w języku angielskim i tutaj przyszedł do programowania. Nie widzę różnicy między systemami formalnymi - językami matematycznymi, językami programowania, czymkolwiek innym - wszystkie są takie same.equals
, że nieis
. I tak, pseudo-kod jest jak dotąd najlepszą odpowiedzią.Chciałbym dodać teoretyczny punkt widzenia: w klasycznych obliczeniach lambda
let
jest po prostu cukrem syntaktycznym. Na przykładmożna przepisać po prostu jako
Więc jego pierwsze pojawienie się we wczesnych (funkcjonalnych) językach nie jest tak interesujące.
Jednak stało się to bardzo ważne wraz z wynalezieniem systemu typu Hindley-Milner i jego algorytmem wnioskowania typu. W tym typie system
let
jest niezbędny, ponieważ jest polimorficzny (w przeciwieństwie do λ-abstrakcji w HM). Rozważmy na przykład to proste wyrażenie:Tutaj
id
jest polimorficzny, ma typ∀α.α → α
, a zatemid id
sprawdza typ - jest typemid id : τ → τ
dla dowolnego τ. (Na pierwszymid
przypisujemyτ → τ
doα
i dla drugiegoid
przypiszemyτ
doα
).Nie możemy go jednak przepisać przy użyciu abstrakcji i aplikacji λ. Wyrażenie
nie typ-czek, bo w pierwszym X abstrakcji
id
musi być przypisany jednokształtnym rodzajid : σ
jakiegoś Ď, a nie ma σ takie, że możemy zastosowaćid : σ
doid : σ
.Możesz tego spróbować w Haskell. Podczas
let id = \x -> x in id id :: t -> t
sprawdzania typu pisanie(\id -> id id)(\x -> x)
kończy się niepowodzeniemźródło
a[i]
Notacja C to cukier syntaktyczny*(a + i)
. Artykuł w Wikipedii ma również dobre wyjaśnienie.let
wprowadzeniemlet
wprowadzony, ponieważ pytanie zaczyna się od zastanawiania się nad początkami „let” ...Lisp jest najstarszym językiem tych mającego LET teraz . Ale BASIC był pierwszym, który go otrzymał, ponieważ Lisp uzyskał go znacznie później.
W Ada Lovelace Analytical Engine (1843) - brak LET, program wygląda następująco:
W Plankalkül of Zuse (1943-45) program wygląda następująco:
Krótki kod został zaproponowany przez Johna Mauchly'ego w 1949 roku
Pośredni PL of Burks, 1950, wykorzystany do zadania
->
Używany Rutishauser w 1952 roku
=>=
Używany kompilator Böhm, 1952
->
Na uniwersytecie w Manchesterze Alick Glennie rozwinął się
Autocode
na początku lat pięćdziesiątych. Pierwszy kod i kompilator został opracowany w 1952 roku dla komputera Mark 1 na University of Manchester i jest uważany za pierwszy skompilowany język programowania wysokiego poziomu. Ponownie,->
do zadaniaCharles Adams, FORTRAN 0 z grupy Backusa, Autokod 2 Brookera, ПП1 Lubimskiego i Kamynina; znowu w 1954 roku
=
BACAIC (Grems, Porter), 1954,
*
za zadanie!Kompiler, ADES, 1955,
=
IT, 1956,
<-
FORTRAN, 1957 r.,
=
AT-3 (1956), Math-Matic (1957), ponownie
=
,ale Flow-Matic w 1957 r. miał dwa zadania i oba są słowne
TRANSFER a TO b
iMOVE a TO b
Maszyna Bauera i Samelsona, 1957:
=>
Niestety, nie mogę objąć wszystkich języków między 1957 a 1964 rokiem, ale większych języków
nie LET dla zadania. Lub nie , w przypadku LISP.
Dartmouth BASIC to oryginalna wersja języka programowania BASIC. Pierwsza interaktywna wersja została udostępniona ogólnym użytkownikom w czerwcu 1964 r . ;
źródło
Pomiędzy tymi trzema Lisp zdecydowanie miał go pierwszy. Haskell powstał w latach osiemdziesiątych, a Clojure w latach dziewięćdziesiątych i
let
był na długo przed którąkolwiek z tych dat. :-)Czy Lisp był język wymyślili go, nie mogę ręczyć za to jeszcze, ale będę robić jakieś badania i zobaczymy. :-)
Aktualizacja: Według Evolution of Lisp (patrz strona 46) wspomniała, że
let
została wynaleziona w latach 70-tych:Nadal nie do końca odpowiada, czy został wcześniej wynaleziony w innym języku, ale wciąż inny punkt danych. :-)
źródło
Pierwszy raport zmienionego programu AIM-452 ze stycznia 1978 r
LET
. Ma . Strona 9.zauważ, że Lisp użył wcześniej innej konstrukcji
PROG
do wprowadzenia zmiennych lokalnych.zostałby napisany wcześniej mniej więcej jako
źródło
let
zawsze był w zakresie dialektu Lisp w zakresie leksykalnym?let
jest prawie tak stary, jak zakres leksykalny (Scheme, '75), i zajęło trochę czasu, zanim zakres zakresu leksykalnego zyskał akceptację, więc zgaduję, że pierwsze przypadkilet
były w kontekście dynamicznie skalowanego Lispsa. Dzisiaj Emacs Lisp nadal ma domyślnie zakres dynamiczny, alambda
ilet
(ten drugi cukier dla tych pierwszych i tak) wiążą ich parametry dynamicznie.