Assembler verwendet MOV anstelle von LET aus dem Jahr 1954. Reicht das nicht aus?
Gangnus
1
LISP ist alt genug, um ein guter Kandidat zu sein.
Mouviciel
2
für jede frage "in welcher programmiersprache ist x zuerst aufgetaucht" lisp ist eine ziemlich gute schätzung für eine korrekte antwort
zachary k
2
Lassen Sie die Ursprünge aus der Mathematik kommen, nicht aus anderen Programmiersprachen.
Pieter B
Sie gehen fälschlicherweise davon aus, dass die erste Verwendung von "let" in einer Programmiersprache der Ursprung von "let" -use in Lisp, Clojure und Haskell ist.
Pieter B
Antworten:
41
Nun, BASIC musste LETvon Anfang an 1964 als Teil der Syntax zugewiesen werden, damit dies vor der Verwendung letin Lisp stattfand, was laut Evolution of Lisp , wie Chris Jester-Young betont, erst in den 1970er Jahren auftrat .
Ich glaube nicht, dass COBOL, Fortran oder ALGOL LETin ihrer Syntax haben. Also werde ich mit BASIC gehen.
Aber die Semantik ist ganz anders - letim Grunde ist es keine lexikalisch ausgerichtete Bindung. Die richtige Antwort wäre also so etwas wie "es erschien zuerst auf Englisch, vor dem 12. Jahrhundert".
SK-Logik
12
Aber die Frage ist: In welcher Programmiersprache ist das "let" zuerst aufgetaucht? Ich halte Englisch nicht wirklich für eine Programmiersprache (zumindest in diesem Zusammenhang).
Greg
7
letin diesem Zusammenhang tauchte ( letx isetwas inder folgende Ausdruck) erstmals in mathematischen Texten auf Englisch auf, und hier kam es zur Programmierung. Ich sehe keinen Unterschied zwischen formalen Systemen - mathematische Sprachen, Programmiersprachen, was auch immer - sie sind alle gleich.
SK-logic
3
"let x is 3" ist keine richtige Grammatik. Das würde man in keinem englischen Lehrbuch sehen. Sie haben die falsche Zeitform des Verbs "sein". Es sollte "let x be 3" oder "let x equal 3" sein. Wie auch immer, Semantik oder nicht, der Frageautor fragte nach einer Programmiersprache. Wenn Sie also nicht wissen, dass ein Computer englische Anweisungen enthält, die älter sind als BASIC, werde ich ihn nicht kaufen. Andernfalls hätten wir einfach "Pseudocode" beantworten können, und das wäre gültig, würde aber dem Geist ihrer Frage nicht gerecht werden.
Greg
1
Natürlich habe ich die ML-Notation benutzt, und ich meinte equals, nicht is. Und ja, Pseudocode ist die bisher beste Antwort.
SK-logic
30
Ich möchte eine theoretische Sichtweise hinzufügen: In der klassischen Lambda-Rechnung letist es nur syntaktischer Zucker. Beispielsweise
let x = N in M
kann einfach umgeschrieben werden als
(λx.M)N
Daher ist sein erster Auftritt in frühen (funktionalen) Sprachen nicht so interessant.
Es wird jedoch mit der Erfindung des Hindley-Milner- Typ-Systems und seines Typ-Inferenz-Algorithmus sehr wichtig . In diesem Typ System letist unverzichtbar, weil es polymorph ist (im Gegensatz zu λ-Abstraktion in HM). Betrachten Sie beispielsweise diesen einfachen Ausdruck:
let id = λx . x in id id
Hier idist polymorph, es hat Typ ∀α.α → αund daher id idTypprüfungen - sein Typ ist id id : τ → τfür willkürliches τ. (Für den ersten idwir assign τ → τzu αund für die zweiteid wir assign τfür α.)
Wir können es jedoch nicht mit λ-Abstraktion und -Anwendung umschreiben. Ausdruck
(λid . id id)(λx.x)
nicht geben Prüfung, weil innerhalb der ersten λ Abstraktion idmuss einen monomorphen Typ zugeordnet werden id : σfür einige σ, und es gibt keine σ , so dass wir anwenden könnten id : σzu id : σ.
Sie können dies selbst in Haskell versuchen. Während der let id = \x -> x in id id :: t -> tTypprüfung (\id -> id id)(\x -> x)schlägt die Eingabe mit fehl
Tritt ein check: kann den unendlichen Typ nicht konstruieren: t0 = t0 -> t0
Im ersten Argument von id, nämlich id
Im Ausdruck: id id
Im Ausdruck:\id -> id id
+1 für eine sehr interessante Antwort. Wenn Sie ein Nebenthema kennen, können Sie (in einem Kommentar, da dies nicht mit der Hauptfrage zusammenhängt) einen Verweis auf eine strenge Definition des Begriffs "syntaktischer Zucker" veröffentlichen.
Giorgio
3
@Giorgio So zitieren Sie das Wörterbuch des neuen Hackers : Funktionen, die einer Sprache oder einem anderen Formalismus hinzugefügt wurden, um sie für den Menschen "süßer" zu machen. Funktionen, die die Ausdruckskraft des Formalismus nicht beeinträchtigen. Gebraucht esp. wenn es eine offensichtliche und triviale Übersetzung des "Zucker" -Features in andere Konstrukte gibt, die bereits in der Notation vorhanden sind. Die a[i]Notation von C ist syntaktischer Zucker für *(a + i). Der Wikipedia-Artikel hat auch eine schöne Erklärung.
Petr Pudlák
3
interessante Dinge , aber kaum zu verwandten let‚s Einführung
wirrbel
2
Es ist eine gut geschriebene Antwort, die jedoch die ursprüngliche Frage nicht beantwortet.
Johan Karlsson
1
@JohanKarlsson Ich behaupte nicht, dass es eine direkte Antwort ist, aber ich denke, dass dies auch für das Thema relevant ist. Insbesondere, warum wurde leteingeführt, als die Frage mit begann Ich habe mich über die Ursprünge des "let"
gewundert
22
Lisp ist die älteste Sprache von diesen, die LET jetzt hat . Aber BASIC war das erste, das es bekam, denn Lisp hatte es viel später erhalten.
In Ada Lovelace Analytical Engine (1843) - no LET sieht ein Programm folgendermaßen aus:
N0 6 N1 1 N2 1 × L1 L0 S1 L0 L2 S0 L2 L0 CB?11 '
In Plankalkül von Zuse (1943-45) sieht das Programm so aus:
Short Code wurde 1949 von John Mauchly vorgeschlagen
X3 = ( X1 + Y1 ) / X1 * Y1
Intermediate PL of Burks, 1950, für die Zuordnung verwendet ->
Rutishauser 1952 benutzt =>=
Böhms-Compiler, 1952, gebraucht ->
An der Universität von Manchester entwickelte sich Alick Glennie Autocodein den frühen 1950er Jahren. Der erste Code und Compiler wurde 1952 für den Mark 1-Computer an der Universität von Manchester entwickelt und gilt als die erste kompilierte Programmiersprache auf hohem Niveau. Wieder ->für die Zuordnung
Charles Adams, FORTRAN 0 von Backus 'Gruppe, Brookers Autocode 2, ПП1 von Lubimsky und Kamynin; alles wieder im Jahr 1954=
BACAIC (Grems, Porter), 1954, *für den Auftrag!
Kompiler, ADES, 1955, =
IT, 1956, <-
Fortran, 1957, =
AT-3 (1956), wieder Math-Matic (1957) = ,
aber Flow-Matic im Jahr 1957 hatte zwei Aufgaben, und beide sind in Worten
TRANSFER a TO b und MOVE a TO b
Bauer und Samelsons Maschine, 1957: =>
Entschuldigung, ich kann nicht alle Sprachen zwischen 1957 und 1964 behandeln, aber größere Sprachen
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)
habe nicht für die Zuordnung LASSEN. Oder nicht , im Falle von LISP.
Dartmouth BASIC ist die Originalversion der Programmiersprache BASIC. Die erste interaktive Version wurde den allgemeinen Nutzern im Juni 1964 zur Verfügung gestellt .
Nun, zwischen diesen drei hatte es Lisp definitiv zuerst. Haskell entstand in den 80ern und Clojure in den 00ern und letwar in der Nähe gewesen lange vor diesen beiden Daten . :-)
Zur Frage , ob Lisp war die Sprache war, die es erfunden hat, kann ich noch nicht bezeugen, aber ich werde ein bisschen recherchieren und nachsehen. :-)
Update: Laut Evolution of Lisp (siehe Seite 46) wurde erwähnt, dass letes in den 70er Jahren erfunden wurde:
LET- selbst ein Makro, das zuerst vor Ort erfunden und neu erfunden wurde - war ein Spätankömmling in der MacLisp-Welt; Laut Lisp Archive wurde es 1979 von Lisp-Machine Lisp gleichzeitig mit DEFMACROder komplexen DEFUNArgument-Syntax von Lisp Machine rückwirkend in PDP-10 MacLisp aufgenommen .
Immer noch nicht ganz beantwortet, ob es früher in einer anderen Sprache erfunden wurde, aber immer noch ein anderer Datenpunkt. :-)
AIM-452 ist der erste überarbeitete Bericht zu Scheme. Der erste Bericht ist AIM-349 aus dem Jahr 1975. Und AIM-848 ist der überarbeitete überarbeitete Bericht. Und der darauffolgende Bericht mit dem Namen "revised ^ 3" (dh der erste, der die Bezeichnung "R ^ nRS" verwendete) war der erste, der kein AIM, sondern eine tatsächliche Sprachspezifikation war. Wenn Sie ein bisschen googeln, finden Sie die PDFs aller dieser Dokumente, damit Sie sie selbst lesen können. Wenn Sie weiter zurückgehen möchten, finden Sie ein altes MacLisp-Handbuch der Software Preservation Group. Vielleicht finden Sie auch einige LISP 1.5-Berichte.
TaylanUB
@wirrbel, es scheint letungefähr so alt wie das lexikalische Scoping zu sein (Schema, '75), und es dauerte eine Weile, bis das lexikalische Scoping Akzeptanz fand, daher würde ich vermuten, dass die ersten Instanzen von letim Kontext von Lisps mit dynamischem Scoping standen. Emacs Lisp verfügt auch heute noch standardmäßig über einen dynamischen Bereich, bei dem lambdaund let(der letztere ohnehin für den ersteren) die Parameter dynamisch gebunden werden.
Antworten:
Nun, BASIC musste
LET
von Anfang an 1964 als Teil der Syntax zugewiesen werden, damit dies vor der Verwendunglet
in Lisp stattfand, was laut Evolution of Lisp , wie Chris Jester-Young betont, erst in den 1970er Jahren auftrat .Ich glaube nicht, dass COBOL, Fortran oder ALGOL
LET
in ihrer Syntax haben. Also werde ich mit BASIC gehen.quelle
let
im Grunde ist es keine lexikalisch ausgerichtete Bindung. Die richtige Antwort wäre also so etwas wie "es erschien zuerst auf Englisch, vor dem 12. Jahrhundert".let
in diesem Zusammenhang tauchte (let
xis
etwasin
der folgende Ausdruck) erstmals in mathematischen Texten auf Englisch auf, und hier kam es zur Programmierung. Ich sehe keinen Unterschied zwischen formalen Systemen - mathematische Sprachen, Programmiersprachen, was auch immer - sie sind alle gleich.equals
, nichtis
. Und ja, Pseudocode ist die bisher beste Antwort.Ich möchte eine theoretische Sichtweise hinzufügen: In der klassischen Lambda-Rechnung
let
ist es nur syntaktischer Zucker. Beispielsweisekann einfach umgeschrieben werden als
Daher ist sein erster Auftritt in frühen (funktionalen) Sprachen nicht so interessant.
Es wird jedoch mit der Erfindung des Hindley-Milner- Typ-Systems und seines Typ-Inferenz-Algorithmus sehr wichtig . In diesem Typ System
let
ist unverzichtbar, weil es polymorph ist (im Gegensatz zu λ-Abstraktion in HM). Betrachten Sie beispielsweise diesen einfachen Ausdruck:Hier
id
ist polymorph, es hat Typ∀α.α → α
und daherid id
Typprüfungen - sein Typ istid id : τ → τ
für willkürliches τ. (Für den erstenid
wir assignτ → τ
zuα
und für die zweiteid
wir assignτ
fürα
.)Wir können es jedoch nicht mit λ-Abstraktion und -Anwendung umschreiben. Ausdruck
nicht geben Prüfung, weil innerhalb der ersten λ Abstraktion
id
muss einen monomorphen Typ zugeordnet werdenid : σ
für einige σ, und es gibt keine σ , so dass wir anwenden könntenid : σ
zuid : σ
.Sie können dies selbst in Haskell versuchen. Während der
let id = \x -> x in id id :: t -> t
Typprüfung(\id -> id id)(\x -> x)
schlägt die Eingabe mit fehlquelle
a[i]
Notation von C ist syntaktischer Zucker für*(a + i)
. Der Wikipedia-Artikel hat auch eine schöne Erklärung.let
‚s Einführunglet
eingeführt, als die Frage mit begann Ich habe mich über die Ursprünge des "let"Lisp ist die älteste Sprache von diesen, die LET jetzt hat . Aber BASIC war das erste, das es bekam, denn Lisp hatte es viel später erhalten.
In Ada Lovelace Analytical Engine (1843) - no LET sieht ein Programm folgendermaßen aus:
In Plankalkül von Zuse (1943-45) sieht das Programm so aus:
Short Code wurde 1949 von John Mauchly vorgeschlagen
Intermediate PL of Burks, 1950, für die Zuordnung verwendet
->
Rutishauser 1952 benutzt
=>=
Böhms-Compiler, 1952, gebraucht
->
An der Universität von Manchester entwickelte sich Alick Glennie
Autocode
in den frühen 1950er Jahren. Der erste Code und Compiler wurde 1952 für den Mark 1-Computer an der Universität von Manchester entwickelt und gilt als die erste kompilierte Programmiersprache auf hohem Niveau. Wieder->
für die ZuordnungCharles Adams, FORTRAN 0 von Backus 'Gruppe, Brookers Autocode 2, ПП1 von Lubimsky und Kamynin; alles wieder im Jahr 1954
=
BACAIC (Grems, Porter), 1954,
*
für den Auftrag!Kompiler, ADES, 1955,
=
IT, 1956,
<-
Fortran, 1957,
=
AT-3 (1956), wieder Math-Matic (1957)
=
,aber Flow-Matic im Jahr 1957 hatte zwei Aufgaben, und beide sind in Worten
TRANSFER a TO b
undMOVE a TO b
Bauer und Samelsons Maschine, 1957:
=>
Entschuldigung, ich kann nicht alle Sprachen zwischen 1957 und 1964 behandeln, aber größere Sprachen
habe nicht für die Zuordnung LASSEN. Oder nicht , im Falle von LISP.
Dartmouth BASIC ist die Originalversion der Programmiersprache BASIC. Die erste interaktive Version wurde den allgemeinen Nutzern im Juni 1964 zur Verfügung gestellt .
quelle
Nun, zwischen diesen drei hatte es Lisp definitiv zuerst. Haskell entstand in den 80ern und Clojure in den 00ern und
let
war in der Nähe gewesen lange vor diesen beiden Daten . :-)Zur Frage , ob Lisp war die Sprache war, die es erfunden hat, kann ich noch nicht bezeugen, aber ich werde ein bisschen recherchieren und nachsehen. :-)
Update: Laut Evolution of Lisp (siehe Seite 46) wurde erwähnt, dass
let
es in den 70er Jahren erfunden wurde:Immer noch nicht ganz beantwortet, ob es früher in einer anderen Sprache erfunden wurde, aber immer noch ein anderer Datenpunkt. :-)
quelle
Der erste überarbeitete Schemabericht AIM-452 vom Januar 1978 hat
LET
. Seite 9.Beachten Sie, dass Lisp früher ein anderes Konstrukt verwendet hat
PROG
, um lokale Variablen einzuführen.wäre früher ungefähr als geschrieben worden
quelle
let
immer lexikalisch in Lisp Dialekten?let
ungefähr so alt wie das lexikalische Scoping zu sein (Schema, '75), und es dauerte eine Weile, bis das lexikalische Scoping Akzeptanz fand, daher würde ich vermuten, dass die ersten Instanzen vonlet
im Kontext von Lisps mit dynamischem Scoping standen. Emacs Lisp verfügt auch heute noch standardmäßig über einen dynamischen Bereich, bei demlambda
undlet
(der letztere ohnehin für den ersteren) die Parameter dynamisch gebunden werden.