Palavra reservada - Reserved word

Em uma linguagem de computador , uma palavra reservada (também conhecida como identificador reservado ) é uma palavra que não pode ser usada como um identificador , como o nome de uma variável, função ou rótulo - é "reservada para uso". Esta é uma definição sintática e uma palavra reservada pode não ter nenhum significado definido pelo usuário.

Uma noção intimamente relacionada e muitas vezes confundida é uma palavra - chave , que é uma palavra com significado especial em um determinado contexto. Esta é uma definição semântica . Por outro lado, os nomes em uma biblioteca padrão, mas não integrados ao idioma, não são considerados palavras ou palavras-chave reservadas. Os termos "palavra reservada" e "palavra-chave" são freqüentemente usados ​​alternadamente - pode-se dizer que uma palavra reservada é "reservada para uso como palavra-chave" - ​​e o uso formal varia de idioma para idioma; para este artigo, distinguimos como acima.

Em geral, as palavras reservadas e as palavras-chave não precisam coincidir, mas na maioria das linguagens modernas, as palavras-chave são um subconjunto de palavras reservadas, pois isso torna a análise mais fácil, uma vez que as palavras-chave não podem ser confundidas com identificadores. Em algumas linguagens, como C ou Python, palavras reservadas e palavras-chave coincidem, enquanto em outras linguagens, como Java, todas as palavras-chave são palavras reservadas, mas algumas palavras reservadas não são palavras-chave - são "reservadas para uso futuro". Em ainda outras linguagens, como as linguagens mais antigas ALGOL , FORTRAN e PL / I , existem palavras-chave, mas não palavras reservadas, com palavras-chave sendo distinguidas dos identificadores por outros meios. Isso torna a análise mais difícil com os analisadores antecipados necessários.

Distinção

Os conjuntos de palavras reservadas e palavras-chave em um idioma geralmente coincidem ou são quase iguais, e a distinção é sutil, portanto, os termos costumam ser usados ​​alternadamente. No entanto, no uso cuidadoso, eles se distinguem.

Fazer com que as palavras-chave sejam palavras reservadas torna a lexing mais fácil, pois uma sequência de caracteres será inequivocamente uma palavra-chave ou um identificador, sem depender do contexto; portanto, as palavras-chave geralmente são um subconjunto de palavras reservadas. No entanto, palavras reservadas não precisam ser palavras-chave - por exemplo, em Java, gotoé uma palavra reservada, mas não tem significado e não aparece em nenhuma regra de produção na gramática. Isso geralmente é feito para compatibilidade futura , portanto, uma palavra reservada pode se tornar uma palavra-chave em uma versão futura sem quebrar os programas existentes.

Por outro lado, as palavras-chave não precisam ser palavras reservadas, com sua função compreendida a partir do contexto, ou podem ser diferenciadas de outra maneira, como por stropping . Por exemplo, a frase if = 1não é ambígua na maioria das gramáticas, uma vez que uma instrução de controle de uma cláusula if não pode começar com um =e, portanto, é permitida em algumas linguagens, como FORTRAN . Alternativamente, no ALGOL 68 , as palavras-chave devem ser eliminadas - marcadas de alguma forma para serem distinguidas - na linguagem estrita, listando em negrito e, portanto, não são palavras reservadas. Assim, na linguagem rigorosa a seguinte expressão é legal, como a palavra-chave em negrito , se não entre em conflito com o identificador comum if:

se se eq 0 então 1 fi

No entanto, no ALGOL 68 há também um regime de stropping em que as palavras-chave são palavras reservadas, um exemplo de como esses conceitos distintos muitas vezes coincidem; isso é seguido em muitas línguas modernas.

Sintaxe

Uma palavra reservada é aquela que "parece" uma palavra normal, mas não pode ser usada como uma palavra normal. Formalmente, isso significa que ele satisfaz a sintaxe lexical usual (sintaxe de palavras) de identificadores - por exemplo, sendo uma seqüência de letras - mas não pode ser usado onde identificadores são usados. Por exemplo, a palavra ifé comumente uma palavra reservada, enquanto xgeralmente não é, então x = 1é uma atribuição válida, mas if = 1não é.

Palavras-chave têm usos variados, mas principalmente se enquadram em algumas classes: parte da gramática de frase (especificamente uma regra de produção com símbolos não terminais ), com vários significados, muitas vezes sendo usados ​​para controlar o fluxo , como a palavra ifna maioria das linguagens procedimentais, que indica um condicional e leva cláusulas (os símbolos não terminais); nomes de tipos primitivos em uma linguagem que oferece suporte a um sistema de tipos , como int; valores literais primitivos , como truepara Boolean true; ou às vezes comandos especiais como exit. Outros usos de palavras-chave em frases são para entrada / saída, como print.

As definições distintas são claras quando uma linguagem é analisada por uma combinação de um lexer e um analisador, e a sintaxe da linguagem é gerada por uma gramática lexical para as palavras e uma gramática livre de contexto de regras de produção para as frases. Isso é comum na análise de linguagens modernas e, neste caso, as palavras-chave são um subconjunto de palavras reservadas, pois devem ser diferenciadas dos identificadores no nível da palavra (portanto, palavras reservadas) para serem sintaticamente analisadas de forma diferente no nível da frase (como palavras-chave).

Nesse caso, as palavras reservadas são definidas como parte da gramática lexical e cada uma é marcada como um tipo separado, distinto dos identificadores. Na notação convencional, as palavras reservadas ife, thenpor exemplo, são tokenizadas como tipos IFe THEN, respectivamente, enquanto xe ysão ambas tokenizadas como tipo Identifier.

As palavras-chave, ao contrário, aparecem sintaticamente na gramática de frases, como símbolos terminais . Por exemplo, a regra de produção para uma expressão condicional pode ser IF Expression THEN Expression. Neste caso IFe THENsão símbolos terminais, significando "um token do tipo IFou THEN, respectivamente" - e devido à gramática lexical, isso significa a string ifou thenna fonte original. Como exemplo de um valor constante primitivo, truepode ser uma palavra-chave representando o valor booleano "verdadeiro", caso em que deve aparecer na gramática como uma possível expansão da produção BinaryExpression, por exemplo.

Intervalos reservados

Além de reservar listas específicas de palavras, alguns idiomas reservam intervalos inteiros de palavras, para uso como espaços privados para versões linguísticas futuras, dialetos diferentes, extensões específicas do fornecedor do compilador ou para uso interno por um compilador, principalmente na manipulação de nomes .

Na maioria das vezes, isso é feito usando um prefixo, geralmente um ou mais sublinhados . C e C ++ são notáveis ​​a este respeito: C99 reserva identificadores que começam com dois sublinhados ou um sublinhado seguido por uma letra maiúscula, e ainda reserva identificadores que começam com um único sublinhado (nos espaços comuns e de tag) para uso no escopo do arquivo ; com C ++ 03 ainda reserva identificadores que contêm um sublinhado duplo em qualquer lugar - isso permite o uso de um sublinhado duplo como um separador (para conectar identificadores de usuário), por exemplo.

O uso frequente de sublinhados duplos em identificadores internos em Python deu origem à abreviatura dunder; isso foi cunhado por Mark Jackson e independentemente por Tim Hochberg, com poucos minutos um do outro, ambos em resposta à mesma pergunta em 2002.

Especificação

A lista de palavras reservadas e palavras-chave em um idioma são definidas quando um idioma é desenvolvido e ambos fazem parte da especificação formal de um idioma . Geralmente, deseja-se minimizar o número de palavras reservadas, para evitar restringir nomes de identificadores válidos. Além disso, a introdução de novas palavras reservadas quebra os programas existentes que usam essa palavra (não é compatível com versões anteriores), portanto, isso é evitado. Para evitar isso e fornecer compatibilidade com o futuro , às vezes as palavras são reservadas sem ter um uso atual (uma palavra reservada que não é uma palavra-chave), pois isso permite que a palavra seja usada no futuro sem quebrar os programas existentes. Como alternativa, novos recursos de linguagem podem ser implementados como predefineds, que podem ser substituídos, não interrompendo os programas existentes.

As razões para a flexibilidade incluem permitir que os fornecedores de compiladores estendam a especificação incluindo recursos não padrão, diferentes dialetos padrão da linguagem para estendê-la ou versões futuras da linguagem para incluir recursos adicionais. Por exemplo, uma linguagem procedural pode antecipar a adição de recursos orientados a objetos em uma versão futura ou algum dialeto, ponto em que alguém pode adicionar palavras-chave como classou object. Para acomodar essa possibilidade, a especificação atual pode fazer essas palavras reservadas, mesmo se elas não forem usadas atualmente.

Um exemplo notável é em Java , onde conste gotosão palavras reservadas - elas não têm significado em Java, mas também não podem ser usadas como identificadores. Ao reservar os termos, eles podem ser implementados em versões futuras do Java, se desejado, sem quebrar o código-fonte Java mais antigo. Por exemplo, houve uma proposta em 1999 para adicionar C ++ - like constà linguagem, o que era possível usando a constpalavra, uma vez que estava reservada, mas atualmente não usada; no entanto, esta proposta foi rejeitada - principalmente porque, embora adicionando o recurso não iria quebrar todos os programas existentes, usando-o na biblioteca padrão (nomeadamente em coleções) iria quebrar a compatibilidade. JavaScript também contém várias palavras reservadas sem funcionalidade especial; a lista exata varia de acordo com a versão e o modo.

Os idiomas diferem significativamente na frequência com que introduzem novas palavras reservadas ou palavras-chave e como as nomeiam, com alguns idiomas sendo muito conservadores e introduzindo novas palavras-chave raramente ou nunca, para evitar quebrar os programas existentes, enquanto outros idiomas introduzem novas palavras-chave com mais liberdade, exigindo que existam programas para alterar identificadores existentes que entram em conflito. Um estudo de caso é fornecido por novas palavras-chave em C11 em comparação com C ++ 11 , ambas de 2011 - lembre-se de que em C e C ++, os identificadores que começam com um sublinhado seguido por uma letra maiúscula são reservados:

O comitê C prefere não criar novas palavras-chave no espaço do nome do usuário, pois geralmente se espera que cada revisão de C evite quebrar programas C mais antigos. Em comparação, o comitê C ++ (WG21) prefere fazer novas palavras-chave com a aparência normal das palavras-chave antigas. Por exemplo, C ++ 11 define uma nova palavra-chave thread_local para designar local de armazenamento estático para um thread. C11 define a nova palavra-chave como _Thread_local. No novo cabeçalho C11 <threads.h>, há uma definição de macro para fornecer o nome de aparência normal:

#define thread_local _Thread_local

Ou seja, C11 introduziu a palavra-chave _Thread_localdentro de um conjunto existente de palavras reservadas (aquelas com um determinado prefixo) e, em seguida, usou um recurso separado (processamento de macro) para permitir seu uso como se fosse uma nova palavra-chave sem qualquer prefixo, enquanto C + +11 introduz a palavra-chave thread_localapesar de não ser uma palavra reservada existente, interrompendo todos os programas que a usavam, mas sem requerer processamento de macro.

Nomes predefinidos

Uma noção relacionada a palavras reservadas são funções, métodos, sub-rotinas ou variáveis ​​predefinidas, particularmente rotinas de biblioteca da biblioteca padrão. Eles são semelhantes no sentido de que fazem parte da linguagem básica e podem ser usados ​​para fins semelhantes. No entanto, eles diferem porque o nome de uma função, método ou sub-rotina predefinida é normalmente categorizado como um identificador em vez de uma palavra reservada e não é tratado de maneira especial na análise sintática. Além disso, as palavras reservadas podem não ser redefinidas pelo programador, mas os predefineds podem frequentemente ser substituídos em alguma capacidade.

Os idiomas variam quanto ao que é fornecido como palavra-chave e ao que é predefinido. Algumas linguagens, por exemplo, fornecem palavras-chave para operações de entrada / saída, enquanto em outras são rotinas de biblioteca. Em Python (versões anteriores a 3.0) e em muitos dialetos BASIC , printé uma palavra-chave. Em contraste, os equivalentes de C, Lisp, e Python 3,0 printf, formate printsão funções da biblioteca padrão. Da mesma forma, em Python antes de 3.0, None, True, e Falseforam pré-definidos variáveis, mas não palavras reservadas, mas em Python 3.0 que foram feitas em palavras reservadas.

Definição

Alguns usam os termos "palavra-chave" e "palavra reservada" alternadamente, enquanto outros distinguem o uso, digamos, usando "palavra-chave" para significar uma palavra que é especial apenas em determinados contextos, mas "palavra reservada" para significar uma palavra especial que não pode ser usada como um nome definido pelo usuário. O significado das palavras-chave - e, de fato, o significado da noção de palavra - chave - difere amplamente de idioma para idioma. Concretamente, no ALGOL 68, as palavras-chave são eliminadas (na linguagem estrita, escritas em negrito) e não são palavras reservadas - a palavra não delimitada pode ser usada como um identificador comum.

A " Especificação da linguagem Java " usa o termo "palavra-chave". O padrão ISO 9899 para a linguagem de programação C usa o termo "palavra-chave".

Em muitas linguagens, como C e ambientes semelhantes como C ++ , uma palavra - chave é uma palavra reservada que identifica uma forma sintática. As palavras utilizadas no fluxo de controlo de construções, tal como se , thene elsesão palavras-chave. Nessas linguagens, as palavras-chave também não podem ser usadas como nomes de variáveis ​​ou funções.

Em alguns idiomas, como ALGOL e Algol 68 , as palavras-chave não podem ser escritas literalmente, mas devem ser eliminadas . Isso significa que as palavras-chave devem ser marcadas de alguma forma. Por exemplo, citando-os ou prefixando-os com um caractere especial. Como consequência, as palavras-chave não são palavras reservadas e, portanto, a mesma palavra pode ser usada como um identificador normal. No entanto, um regime de strop era não strop as palavras-chave e, em vez disso, fazer com que fossem simplesmente palavras reservadas.

Algumas linguagens, como PostScript , são extremamente liberais nessa abordagem, permitindo que palavras-chave centrais sejam redefinidas para propósitos específicos.

Em Common Lisp , o termo "palavra-chave" (ou "símbolo de palavra-chave") é usado para um tipo especial de símbolo ou identificador. Ao contrário de outros símbolos, que geralmente representam variáveis ​​ou funções, as palavras-chave são auto- citadas e auto-avaliadas : 98 e estão internadas no pacote KEYWORD . Palavras-chave são geralmente usadas para rotular argumentos nomeados para funções e para representar valores simbólicos. Os símbolos que nomeiam funções, variáveis, formulários especiais e macros no pacote denominado COMMON-LISP são basicamente palavras reservadas. O efeito de redefini-los é indefinido no ANSI Common Lisp. Vinculá-los é possível. Por exemplo, a expressão (if if case or)é possível, quando ifé uma variável local. O mais ifà esquerda refere-se ao ifoperador; os símbolos restantes são interpretados como nomes de variáveis. Como há um namespace separado para funções e variáveis, ifpode ser uma variável local. No Common Lisp, entretanto, existem dois símbolos especiais que não estão no pacote de palavras-chave: os símbolos te nil. Quando avaliados como expressões, eles avaliam a si mesmos. Eles não podem ser usados ​​como nomes de funções ou variáveis, portanto, são de fato reservados. (let ((t 42)))é uma expressão bem formada, mas o letoperador não permitirá o uso.

Normalmente, quando um programador tenta usar uma palavra-chave para um nome de variável ou função, um erro de compilação será acionado. Na maioria dos editores modernos, as palavras-chave são definidas automaticamente para ter uma cor de texto específica para lembrar ou informar aos programadores que são palavras-chave.

Em linguagens com macros ou avaliação preguiçosa , as construções de fluxo de controle ifpodem ser implementadas como macros ou funções. Em linguagens sem esses recursos expressivos, geralmente são palavras-chave.

Comparação por idiomas

Nem todos os idiomas têm o mesmo número de palavras reservadas. Por exemplo, Java (e outros derivados C ) tem um complemento bastante esparso de palavras reservadas - aproximadamente 50 - enquanto COBOL tem aproximadamente 400. Na outra extremidade do espectro, Prolog puro e PL / I não têm nenhum.

O número de palavras reservadas em um idioma tem pouco a ver com o quão “poderoso” o idioma é. O COBOL foi projetado na década de 1950 como uma linguagem de negócios e foi feito para ser autodocumentado usando elementos estruturais semelhantes ao inglês, como verbos, orações, sentenças, seções e divisões. C, por outro lado, foi escrito para ser muito conciso (sintaticamente) e para colocar mais texto na tela. Por exemplo, compare os blocos de código equivalentes de C e COBOL para calcular os ganhos semanais:

      // Calculation in C:
      
      if (salaried)
              amount = 40 * payrate;
      else
              amount = hours * payrate;
      *> Calculation in COBOL:
      
      IF Salaried THEN
              MULTIPLY Payrate BY 40 GIVING Amount
      ELSE
              MULTIPLY Payrate BY Hours GIVING Amount
      END-IF.
      *> Other example of calculation in COBOL:
      
      IF Salaried 
              COMPUTE Amount = Payrate * 40
      ELSE
              COMPUTE Amount = hours * payrate
      END-IF.

A lógica pura do Prolog é expressa em termos de relações, e a execução é disparada executando consultas sobre essas relações. Construções como loops são implementadas usando relacionamentos recursivos.

Todas as três linguagens podem resolver os mesmos tipos de “problemas”, embora tenham diferentes números de palavras reservadas. Esse “poder” está relacionado ao fato de pertencerem ao conjunto de linguagens completas de Turing .

Desvantagens

A definição de palavras reservadas em um idioma levanta problemas. O idioma pode ser difícil para novos usuários aprenderem por causa de uma longa lista de palavras reservadas para memorizar que não podem ser usadas como identificadores. Pode ser difícil estender a linguagem porque a adição de palavras reservadas para novos recursos pode invalidar programas existentes ou, inversamente, "sobrecarregar" de palavras reservadas existentes com novos significados pode ser confuso. A transferência de programas pode ser problemática porque uma palavra não reservada por um sistema / compilador pode ser reservada por outro.

Palavras reservadas e independência de linguagem

A especificação .NET Common Language Infrastructure (CLI) da Microsoft permite que códigos escritos em mais de 40 linguagens de programação diferentes sejam combinados em um produto final. Por causa disso, as colisões de identificador / palavra reservada podem ocorrer quando o código implementado em um idioma tenta executar o código escrito em outro idioma. Por exemplo, uma biblioteca Visual Basic.NET pode conter uma definição de classe como:

' Class Definition of This in Visual Basic.NET:

Public Class this
        ' This class does something...
End Class

Se isto for compilado e distribuído como parte de uma caixa de ferramentas, um programador C # , desejando definir uma variável do tipo “ this”, encontrará um problema: 'this'é uma palavra reservada em C #. Portanto, o seguinte não será compilado em C #:

// Using This Class in C#:

this x = new this();  // Won't compile!

Um problema semelhante surge ao acessar membros, substituir métodos virtuais e identificar namespaces.

Isso é resolvido por stropping . Para contornar esse problema, a especificação permite que o programador (em C #) coloque o símbolo de arroba antes do identificador, o que o força a ser considerado um identificador em vez de uma palavra reservada pelo compilador:

// Using This Class in C#:

@this x = new @this();  // Will compile!

Para consistência, esse uso também é permitido em configurações não públicas, como variáveis ​​locais, nomes de parâmetros e membros privados.

Veja também

Referências