Assembler usa MOV em vez de LET de 1954. Não é suficiente?
Gangnus
11
O LISP tem idade suficiente para ser um bom candidato.
Mouviciel
2
para qualquer pergunta "Em que linguagem de programação que X aparecem pela primeira vez" lisp é um bom palpite bastante para uma resposta correta
Zachary K
2
vamos origens da matemática, não de outras linguagens de programação.
Pieter B
Você assume incorretamente que o primeiro uso de "let" em um idioma de programação é a origem do uso "let" em Lisp, Clojure e Haskell.
Pieter B
Respostas:
41
Bem, o BASIC tinha LETpara atribuição como parte da sintaxe desde o início de 1964, de modo que seria anterior ao uso do letLisp, que, como Chris Jester-Young aponta, não apareceu até a década de 1970, de acordo com a Evolution of Lisp .
Também não acredito que COBOL, Fortran ou ALGOL tenham LETsua sintaxe. Então, eu vou com o BASIC.
Mas a semântica é muito diferente - letno básico, não é uma ligação com escopo lexicamente. Portanto, a resposta correta seria algo como "apareceu pela primeira vez em inglês antes do século XII".
SK-logic
12
Mas a pergunta é: qual linguagem de programação o "let" apareceu pela primeira vez? Eu realmente não considero o inglês uma linguagem de programação (pelo menos nesse contexto).
8133 Greg
7
letnesse contexto ( letx isalgo que ina expressão a seguir) apareceu pela primeira vez em textos matemáticos em inglês, e foi aí que ele entrou na programação. Não vejo diferença entre sistemas formais - linguagens matemáticas, linguagens de programação, o que quer que seja - são todos iguais.
SK-logic
3
"let x is 3" não é uma gramática adequada. Você nunca veria isso em nenhum livro de texto em inglês. Você tem o tempo errado do verbo "ser". Deve ser "seja x 3" ou "seja x 3". De qualquer maneira, semântica ou não, o autor da pergunta estava pedindo uma linguagem de programação. Portanto, a menos que você conheça um computador que usa instruções em inglês anteriores ao BASIC, não o comprarei. Caso contrário, poderíamos ter respondido "código psuedo" e isso seria válido, mas não honraria o espírito de sua pergunta.
9133 Greg
11
é claro que usei notação ML, e quis dizer equals, não is. E, sim, o pseudo-código é a melhor resposta até agora.
SK-lógica
30
Eu gostaria de acrescentar um ponto de vista teórico: no cálculo lambda clássico, leté apenas açúcar sintático. Por exemplo
let x = N in M
pode ser reescrito simplesmente como
(λx.M)N
Portanto, sua primeira aparição em idiomas iniciais (funcionais) não é tão interessante.
No entanto, tornou-se muito importante com a invenção do sistema do tipo Hindley-Milner e seu algoritmo de inferência de tipo. Nesse sistema de tipos leté indispensável, porque é polimórfico (diferentemente da abstração λ no HM). Por exemplo, considere esta expressão simples:
let id = λx . x in id id
Aqui idé polimórfico, tem tipo ∀α.α → αe, portanto id id, verifica o tipo - é do tipo id id : τ → ττ arbitrário. (Para o primeiro idque atribuímos τ → τa αe para o segundo idque atribuímos τpara α.)
No entanto, não podemos reescrevê-lo usando λ abstração e aplicativo. Expressão
(λid . id id)(λx.x)
não digite-check, porque dentro da primeira abstração λ iddeve ser atribuído um tipo monomórfica id : σpor algum σ, e não há σ tal que pudéssemos aplicar id : σpara id : σ.
Você pode tentar isso sozinho em Haskell. Enquanto let id = \x -> x in id id :: t -> tverifica o tipo, a digitação (\id -> id id)(\x -> x)falha com
Ocorre verificação: não é possível construir o tipo infinito: t0 = t0 -> t0
no primeiro argumento de id, ou seja, id
na expressão: id id
na expressão:\id -> id id
+1 para uma resposta muito interessante. Como um tópico secundário, se você conhece um, poderia postar (em um comentário, uma vez que isso não está relacionado à questão principal) uma referência a uma definição rigorosa de "açúcar sintático".
Giorgio
3
@ Giorgio Para citar o dicionário do novo hacker : Recursos adicionados a um idioma ou outro formalismo para torná-lo "mais doce" para humanos, recursos que não afetam a expressividade do formalismo. Usado esp. quando houver uma tradução óbvia e trivial do recurso "açúcar" em outras construções já presentes na notação. A a[i]notação de C é o açúcar sintático para *(a + i). O artigo da Wikipedia também tem uma boa explicação.
Petr Pudlák
3
coisas interessantes, mas dificilmente relacionadas com let's introdução
wirrbel
2
É uma resposta bem escrita, mas não responde à pergunta original.
9998 Johan
11
@JohanKarlsson Não estou afirmando que seja uma resposta direta, mas acho que isso também é relevante para o tópico. Em particular porque foi letintroduzido, como a questão começa com Eu estava pensando sobre as origens do "vamos" ...
Petr Pudlak
22
Lisp é a língua mais antiga de quem deixou LET agora . Mas o BASIC foi o primeiro a obtê-lo, pois Lisp o obteve muito mais tarde.
No Ada Lovelace Analytical Engine (1843) - sem LET, um programa se parece com:
N0 6 N1 1 N2 1 × L1 L0 S1 L0 L2 S0 L2 L0 CB?11 '
Em Plankalkül de Zuse (1943-45), o programa parece:
PL intermediário de Burks, 1950, usado para atribuição ->
Rutishauser em 1952 usado =>=
Compilador Böhms, 1952, usado ->
Na Universidade de Manchester, Alick Glennie se desenvolveu Autocodeno início dos anos 50. O primeiro código e compilador foi desenvolvido em 1952 para o computador Mark 1 na Universidade de Manchester e é considerado a primeira linguagem de programação de alto nível compilada. Novamente, ->para atribuição
Charles Adams, FORTRAN 0 do grupo de Backus, Brooker Autocode 2, ПП1 de Lubimsky e Kamynin; tudo em 1954, novamente=
BACAIC (Grems, Porter), 1954, *para atribuição!
Kompiler, ADES, 1955, =
IT, 1956, <-
FORTRAN, 1957, =
AT-3 (1956), Math-Matic (1957), novamente =,
mas Flow-Matic em 1957 tinha duas atribuições, e ambas estão em palavras
TRANSFER a TO b e MOVE a TO b
A máquina de Bauer e Samelson, 1957: =>
Desculpe, não posso cobrir todos os idiomas entre 1957 e 1964, mas idiomas maiores
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)
não deixe para atribuição. Ou não , no caso do LISP.
Dartmouth BASIC é a versão original da linguagem de programação BASIC. A primeira versão interativa foi disponibilizada para usuários gerais em junho de 1964 ;
Bem, entre os três, Lisp definitivamente teve primeiro. Haskell surgiu nos anos 80 e Clojure nos anos 2000 e letjá existia muito antes de qualquer uma dessas datas. :-)
Quanto à questão de saber se o Lisp foi o idioma que o inventou, ainda não posso garantir isso, mas vou fazer algumas pesquisas e ver. :-)
Atualização: De acordo com o Evolution of Lisp (na página 46), mencionou que letfoi inventado nos anos 70:
LET- uma macro inventada e reinventada localmente em cada local - era uma das que chegavam tarde ao mundo MacLisp; de acordo com o Lisp Archive, foi absorvido retroativamente no PDP-10 MacLisp do Lisp-Machine Lisp em 1979, ao mesmo tempo em que DEFMACROa complexa DEFUNsintaxe de argumentos da Lisp Machine .
Ainda não responde bem se foi inventado em outro idioma anteriormente, é claro, mas ainda outro ponto de dados. :-)
letsempre foi escopo lexicamente nos dialetos Lisp?
wirrbel
11
O AIM-452 é o primeiro relatório revisado sobre o esquema. O primeiro relatório é o AIM-349 de 1975. E AIM-848 é o relatório revisado. E o seguinte, chamado de relatório "revisado ^ 3" (isto é, o primeiro a usar a nomeação "R ^ nRS") foi o primeiro que não era um AIM, mas uma especificação de linguagem real. Pesquisando um pouco, você encontrará os PDFs de todos esses documentos para que você possa lê-los por si mesmo. Se você quiser voltar mais atrás, pode encontrar um manual antigo do MacLisp no Software Preservation Group, e talvez também seja possível encontrar alguns relatórios do LISP 1.5.
TaylanUB
@ wirrbel, parece que leté tão antigo quanto o escopo lexical (Scheme, '75), e demorou um tempo para o escopo lexical obter aceitação, então eu acho que as primeiras instâncias letforam no contexto de Lisps com escopo dinâmico. Hoje, o Emacs Lisp ainda tem escopo dinâmico por padrão, com lambdae let(o último açúcar para o primeiro de qualquer maneira) vinculando seus parâmetros dinamicamente.
Respostas:
Bem, o BASIC tinha
LET
para atribuição como parte da sintaxe desde o início de 1964, de modo que seria anterior ao uso dolet
Lisp, que, como Chris Jester-Young aponta, não apareceu até a década de 1970, de acordo com a Evolution of Lisp .Também não acredito que COBOL, Fortran ou ALGOL tenham
LET
sua sintaxe. Então, eu vou com o BASIC.fonte
let
no básico, não é uma ligação com escopo lexicamente. Portanto, a resposta correta seria algo como "apareceu pela primeira vez em inglês antes do século XII".let
nesse contexto (let
xis
algo quein
a expressão a seguir) apareceu pela primeira vez em textos matemáticos em inglês, e foi aí que ele entrou na programação. Não vejo diferença entre sistemas formais - linguagens matemáticas, linguagens de programação, o que quer que seja - são todos iguais.equals
, nãois
. E, sim, o pseudo-código é a melhor resposta até agora.Eu gostaria de acrescentar um ponto de vista teórico: no cálculo lambda clássico,
let
é apenas açúcar sintático. Por exemplopode ser reescrito simplesmente como
Portanto, sua primeira aparição em idiomas iniciais (funcionais) não é tão interessante.
No entanto, tornou-se muito importante com a invenção do sistema do tipo Hindley-Milner e seu algoritmo de inferência de tipo. Nesse sistema de tipos
let
é indispensável, porque é polimórfico (diferentemente da abstração λ no HM). Por exemplo, considere esta expressão simples:Aqui
id
é polimórfico, tem tipo∀α.α → α
e, portantoid id
, verifica o tipo - é do tipoid id : τ → τ
τ arbitrário. (Para o primeiroid
que atribuímosτ → τ
aα
e para o segundoid
que atribuímosτ
paraα
.)No entanto, não podemos reescrevê-lo usando λ abstração e aplicativo. Expressão
não digite-check, porque dentro da primeira abstração λ
id
deve ser atribuído um tipo monomórficaid : σ
por algum σ, e não há σ tal que pudéssemos aplicarid : σ
paraid : σ
.Você pode tentar isso sozinho em Haskell. Enquanto
let id = \x -> x in id id :: t -> t
verifica o tipo, a digitação(\id -> id id)(\x -> x)
falha comfonte
a[i]
notação de C é o açúcar sintático para*(a + i)
. O artigo da Wikipedia também tem uma boa explicação.let
's introduçãolet
introduzido, como a questão começa com Eu estava pensando sobre as origens do "vamos" ...Lisp é a língua mais antiga de quem deixou LET agora . Mas o BASIC foi o primeiro a obtê-lo, pois Lisp o obteve muito mais tarde.
No Ada Lovelace Analytical Engine (1843) - sem LET, um programa se parece com:
Em Plankalkül de Zuse (1943-45), o programa parece:
Short Code foi proposto por John Mauchly em 1949
PL intermediário de Burks, 1950, usado para atribuição
->
Rutishauser em 1952 usado
=>=
Compilador Böhms, 1952, usado
->
Na Universidade de Manchester, Alick Glennie se desenvolveu
Autocode
no início dos anos 50. O primeiro código e compilador foi desenvolvido em 1952 para o computador Mark 1 na Universidade de Manchester e é considerado a primeira linguagem de programação de alto nível compilada. Novamente,->
para atribuiçãoCharles Adams, FORTRAN 0 do grupo de Backus, Brooker Autocode 2, ПП1 de Lubimsky e Kamynin; tudo em 1954, novamente
=
BACAIC (Grems, Porter), 1954,
*
para atribuição!Kompiler, ADES, 1955,
=
IT, 1956,
<-
FORTRAN, 1957,
=
AT-3 (1956), Math-Matic (1957), novamente
=
,mas Flow-Matic em 1957 tinha duas atribuições, e ambas estão em palavras
TRANSFER a TO b
eMOVE a TO b
A máquina de Bauer e Samelson, 1957:
=>
Desculpe, não posso cobrir todos os idiomas entre 1957 e 1964, mas idiomas maiores
não deixe para atribuição. Ou não , no caso do LISP.
Dartmouth BASIC é a versão original da linguagem de programação BASIC. A primeira versão interativa foi disponibilizada para usuários gerais em junho de 1964 ;
fonte
Bem, entre os três, Lisp definitivamente teve primeiro. Haskell surgiu nos anos 80 e Clojure nos anos 2000 e
let
já existia muito antes de qualquer uma dessas datas. :-)Quanto à questão de saber se o Lisp foi o idioma que o inventou, ainda não posso garantir isso, mas vou fazer algumas pesquisas e ver. :-)
Atualização: De acordo com o Evolution of Lisp (na página 46), mencionou que
let
foi inventado nos anos 70:Ainda não responde bem se foi inventado em outro idioma anteriormente, é claro, mas ainda outro ponto de dados. :-)
fonte
O primeiro relatório revisado do esquema AIM-452 de janeiro de 1978 possui
LET
. Página 9.note que o Lisp usou anteriormente uma construção diferente
PROG
para introduzir variáveis locais.teria sido escrito anteriormente aproximadamente como
fonte
let
sempre foi escopo lexicamente nos dialetos Lisp?let
é tão antigo quanto o escopo lexical (Scheme, '75), e demorou um tempo para o escopo lexical obter aceitação, então eu acho que as primeiras instânciaslet
foram no contexto de Lisps com escopo dinâmico. Hoje, o Emacs Lisp ainda tem escopo dinâmico por padrão, comlambda
elet
(o último açúcar para o primeiro de qualquer maneira) vinculando seus parâmetros dinamicamente.