Eu tenho procurado por uma linguagem de programação prática que não tenha palavras-chave reservadas, mas não tive sorte em encontrar uma.
Estou trabalhando em uma linguagem de programação para minha própria edificação e entretenimento e ainda não precisei incluir nenhuma palavra-chave, foi isso que me levou à minha pesquisa e à pergunta:
Não vejo conveniência para o escritor do compilador como sendo importante para o usuário final do idioma. Os computadores são poderosos o suficiente nos dias de hoje para poder inferir significados do contexto. Assim como um escritor não precisa rotular substantivos, verbos e outros itens ao escrever um romance, por que um programador deve rotular funções e variáveis com function x() {}
or set x = 1
ou var x = 1
etc; quando posso deduzir do contexto das declarações que é uma declaração de função ou uma invocação ou que um rótulo é uma atribuição a um valor ou uma referência a esse valor de rótulos?
Aqui está um exemplo concreto do que meu analisador atual está fazendo, sem necessidade de palavras-chave reservadas para suportar coisas comuns que normalmente teriam muito barulho, como func
ou function
ou dec
não.
Declaração de Função
sum3(a,b,c) -> a + b + c.
Invocação de Função
x = sum3(1,2,3).
Função anônima nomeada x
x = (a,b,c) -> a + b + c.
y = x(1,2,3).
Gostaria de saber por que as palavras-chave são importantes para uma linguagem de programação bem-sucedida?
Respostas:
O MUMPS é altamente bem-sucedido, sendo amplamente utilizado em seguros e assistência médica e não possui palavras reservadas. Eu diria que eles ajudam em termos de código mais claro, mas não são estritamente necessários. APL é outro exemplo. A APL vê o uso de scripts pontuais na indústria nuclear, entre outros. J , um membro da família APL também não possui palavras-chave.
As palavras-chave ajudam os escritores do compilador a implementar a análise mais facilmente. A APL é notoriamente associativa. Eles também ajudam a reforçar convenções e melhorar a legibilidade. O APL não é conhecido por ser extremamente legível para a maioria.
fonte
Um idioma conhecido sem palavras-chave é Lisp. O que há de mais próximo das palavras-chave são as chamadas formas especiais - seu número pode variar entre os dialetos - que recebem tratamento especial do intérprete. Além disso, eles são indistinguíveis das funções regulares em termos de como são usados, com a exceção de que não podem ser redefinidos (pelo menos em Lisps eu estou familiarizado).
Isso resulta em uma sintaxe simples (mas pesada) e é uma das coisas que permitiram ao Lisp ter um sistema de macro tão poderoso. Por outro lado, costuma-se dizer que Lisp é difícil de ler. APL e MUMPS, mais ainda, já vi ambos descritos a meio caminho do Brainf * ck. As palavras-chave ajudam nesse departamento e tornam a leitura de código mais fácil para nós, humanos também.
Portanto, não diria que as palavras-chave são necessárias para um idioma bem-sucedido, mas elas certamente ajudam um idioma a ter sucesso.
fonte
if
em C seria um identificador válido se não fosse definido como especial (uma palavra-chave). Isso significa queif
não é um identificador eif = 10
gera um erro de sintaxe. Se não me engano, a sintaxe mínima de Lisp não faz distinçãodefun
def
,x
,y
e+
no(defun f (x y) (+ x y))
.if
é um nome de variável válido em Common Lisp (e outros Lisp-2s)(defparameter if nil)
não vai quebrar nada e ele pode ser usado em formas como(unless if (setf if t))
(defun if ...)
falhará. Levou em consideração as anotações dos comentários e editou a resposta. Posso concordar que formulários especiais não são palavras-chave no mesmo nível que em C, por exemplo, ainda são a coisa mais próxima que o Lisp tem.O TCL não possui palavras-chave e, de fato, apenas 12 regras de sintaxe. Embora não seja tão popular como era antes, ele tem seu nicho de expectativa e está incorporado no ECAD e nos roteadores, por isso certamente conta como uma prática para mim.
Também acho que pode mostrar por que muitos idiomas não seguem esse caminho. Sim, é perfeitamente possível escrever um analisador TCL (sem dúvida mais fácil do que muitos outros idiomas), no entanto, você não pode escrever uma gramática BNF muito útil para o idioma e muitas pessoas parecem ter problemas para aprender o idioma. Eu suspeito que isso seja pelo menos em parte devido à falta de palavras-chave.
fonte
Isso significa que você deseja uma gramática que não seja livre de contexto? Boa sorte.
Não se trata de ser poderoso ou não. Existem regras eternas e imutáveis sobre as línguas - as matemáticas. Isso e o fato de uma linguagem de programação ser sintaticamente fácil fará com que os CFGs governem nas próximas décadas.
Aliás, em Haskell como sintaxe, basta escrever algo como
para definir uma função. Mas observe que a "palavra-chave" neste caso é o '='. Se você errar, coisas terríveis acontecerão no analisador.
Mas este é um ponto em que concordo com você; acho isso muito mais intuitivo do que todas as palavras-chave def, dcl, fun, fn, function ou outras palavras-chave que introduzem funções em outros idiomas.
No entanto, essa gramática pode ser escrita na antiga LALR (1), nenhum significado é "inferido a partir do contexto" aqui.
fonte
{ int x = 0; x = "HELLO"; }
deve produzir uma árvore de análise, mas quando o compilador procura x na segunda atribuição, ele vê que foi declarado como int e emite um erro de tipo. Portanto, o programa é rejeitado, mesmo que sua estrutura de CF esteja correta.Até onde eu sei, Smalltalk é o idioma que tem menos palavras-chave (se eu não estiver contando idiomas como Brainfuck). Smalltalk palavras-chave são
true
,false
,nil
,self
,super
ethisContext
.Eu projetei um idioma, inspirado em smalltalk, que não tinha palavras-chave. Mas, após algum tempo de uso, acabei adicionando algumas palavras-chave, principalmente para açúcar sintático.
Portanto, minha opinião é que o idioma sem palavras-chave é possível, mas não é muito prático e é por isso que todos os idiomas populares têm palavras-chave.
fonte
true
,false
enil
poderia ser definido como métodos nesse receptor implícito e, dadas as capacidades de reflexão, provavelmente os outros três também.true
,false
enil
são valores conhecidos fornecidos pelo ambiente eself
,super
ethisContext
são variáveis que você não pode definir, mas cujos valores mudam como resultado da execução.Você parece estar trabalhando sob uma suposição falsa, de que as palavras-chave existem para facilitar as coisas para o compilador. Enquanto eles facilitam as coisas para o compilador, eles têm um benefício muito mais importante: facilitam as coisas para quem lê o código .
Sim, você pode olhar para um monte de contexto e descobrir que está vendo uma declaração de função ou uma declaração de variável, mas dependendo do contexto e da complexidade do código envolvido, isso pode levar muito tempo para descobrir . Ou então, você pode ter uma palavra-chave útil, como function ou var , e saber imediatamente o que está vendo.
Sim, eles tornam o código mais complicado de escrever , mas considerando que os programas gastam muito mais tempo em manutenção do que em produção e que o código é lido, depurado e mantido muito mais do que é criado, tentando projetar seu idioma para tornar mais fácil escrever em vez de fácil ler é um caso clássico de otimização prematura prejudicial.
Além disso, não despreze os conceitos que facilitam o trabalho do compilador. Quanto mais fácil é analisar, mais rápido seu código será compilado, o que significa que os ciclos de edição, construção e depuração ficam mais rápidos, o que significa que sua produtividade aumenta.
Quando você tem uma base de código grande e complexa, isso pode resultar em uma diferença não trivial de produtividade. Por exemplo, onde trabalho, temos um programa em funcionamento que é de cerca de 4 milhões de linhas de Delphi. Temos outro módulo que é cerca de 300.000 linhas de C ++. Ambos levam aproximadamente o mesmo período de tempo para compilar. (Cerca de 3 minutos.) Se tivéssemos 4 milhões de linhas de C ++, levaria uma hora para construir!
fonte
Existem alguns exemplos raros.
O APL usa apenas símbolos - mas muitos! Você precisa de um teclado especial para usar o idioma.
Veja este artigo da Wikipedia
CORAL 66 - tinha palavras-chave, mas só as reconheceu se citadas com aspas simples.
O PL / 1 também tinha palavras-chave - mas você também pode usá-las como nomes de variáveis ou procedimentos.
Em suma, sua pergunta é como perguntar "por que as línguas faladas têm palavras?".
fonte
A principal razão é que é mais fácil analisar humanos e computadores. Desambiguar uma linguagem complexa sem palavras-chave exigiria muitos símbolos como sintaxe, e seria massiva e desnecessariamente confusa. É muito mais fácil ler do
function
que$!{}
. E o contexto não resolve todas as ambiguidades.fonte