Pergunta

Por exemplo (em C):

int break = 1;
int for = 2;

Por que será que o compilador tem quaisquer problemas em deduzindo que break e for são variáveis aqui?


Então, precisamos de palavras-chave, porque

  • queremos que os programas para ser legível
  • não queremos mais-complicar o trabalho das já complexo compiladores de hoje
  • mas o mais importante, uma língua é muito mais poderosa se alguns 'chave'words são reservados para algumas ações especiais.Então, a língua pode pensar em ser útil em um nível superior ao invés de morrer na tentativa de implementar um loop for em forma inequívoca.
Foi útil?

Solução

Em seguida, o que o computador faz quando ele vem através de uma instrução como:

while(1) {
  ...
  if (condition)
    break;
}

Deve ele realmente quebrar?Ou deve tratá-lo como 1;?

A linguagem seria ambígua, em certos casos, ou você teria que criar uma muito inteligente analisador, pode-se inferir sutil sintaxe, e que só trabalho extra desnecessário.

Outras dicas

Não é necessário -- Fortran não reserva qualquer palavra, então, coisas como:

if if .eq. then then if = else else then = if endif

são jurídica completa.Isso não só torna a linguagem difícil para o compilador para analisar, mas, muitas vezes, quase impossível para uma pessoa ler ou detectar erros.por exemplo, considere clássico Fortran (por exemplo, através Fortran 77 -- eu não tenho usado recentemente, mas pelo menos a esperança de que eles já corrigido algumas coisas como essa na mais recentes padrões).Um Fortran ciclo parecido com este:

DO 10 I = 1,10

Sem eles, estar lado-a-lado, você provavelmente pode ver como você iria perder a forma como isso foi diferente:

DO 10 I = 1.10

Infelizmente, este não é um loop em todos os -- é uma simples atribuição do valor 1.10 para uma variável chamada DO 10 I (sim, ele também permite que os espaços no nome).Desde Fortran também suporta implícito (não declarado) variáveis, isto é (ou era) tudo perfeitamente legal, e alguns compiladores seria mesmo aceitá-lo sem um aviso!

Eles não.PL/1 famosa, não tem palavras-chave;cada "palavra-chave" (INICIAR, FAZER, ...) pode também ser utilizado um nome de variável.Mas deixando isso significa que você pode escrever muito obscuro código:SE NÃO>COMEÇAR, EM SEGUIDA, IMPRIMIR:=CHAMAR-GOTO;Reservando-se a "declaração" palavras-chave" como a linguagem não é, normalmente, uma perda que se defina de nomes é modesta (como o é em qualquer idioma que eu já vi, exceto PL/1 :-).

O APL também famosa não tem palavras-chave.Mas ele tem um conjunto de cerca de 200 incrível símbolos icônicos no que escrever complicado operadores.(o "domino" operador [não pergunte!] é uma caixa quadrada com uma calculadora dividir o sinal no meio), neste caso, a linguagem designers simplesmente o uso de ícones, em vez de palavras-chave.A consequência é que o APL tem uma reputação de ser uma "gravação" apenas na linguagem.

Linha inferior:não é um requisito, mas tende a fazer programas muito mais legível se as palavras-chave são reservadas, identificadores, a partir de um pequeno conjunto conhecido para os programadores.(Alguns idiomas insistiu que "palavras-chave" começam com uma pontuação especial de caracteres como "." para permitir que todos os possíveis identificadores para ser usado, mas isso não vale a pena o extra dificuldade para escrever ou a desordem na página;é muito fácil ficar longe de "identificadores" que palavras-chave de correspondência quando o conjunto de palavras-chave é pequena).

Pois é marcado C, o original da linguagem C foi tal, que, por padrão, qualquer variável foi definida como o tipo de int.

Isso significa que foo; iria declarar uma variável do tipo int.

Digamos que você faça break;.Então, como faz o compilador saber se você quer declarar uma variável chamada break ou use a palavra-chave break?

várias razões:

  • Palavras-chave pode parecer ambíguo em suas amostras.Mas esse não é o único lugar que você iria usar a variável 'break' ou a variável 'para'.

  • escrever parser seria muito mais difícil e propenso a erro para pouco ganho.

  • usando uma palavra-chave como uma função ou um procedimento de nome em uma biblioteca pode ter indesejada, possivelmente relevantes de segurança, efeitos colaterais.

Como os outros disseram, isso faz com que o compilador de análise de seu código-fonte mais fácil.Mas eu gostaria de dizer um pouco mais:ele também pode fazer o seu código fonte mais legível;considere este exemplo:

se (se > 0), então = 10 end if

A segunda, "se" e o segundo", em seguida," são variáveis, enquanto outros não o são.Eu acho que esse tipo de código não é legível.:)

Se estamos falando de C++ - ele já tem muito complicada gramática.Permitindo a utilização de palavras-chave como nome de variável, por exemplo, vai tornar ainda mais complicado.

O compilador iria ter problemas se você escrever algo como isto:

while(*s++);
return(5);

É que um loop ou uma chamada para uma função chamada while?Você deseja retornar o valor 5 da atual função, ou você deseja chamar uma função chamada return?

Muitas vezes simplifica as coisas se constrói com significado especial, simplesmente, têm nomes especiais, que podem ser usados de forma inequívoca para referir-se a eles.

Porque queremos manter o pouco de sanidade pontos temos:

void myfunction(bool) { .. };

funcp while = &myfunction;
while(true); 

Eu acho que olhar muito estranho, se não impossível escrever o analisador.E. g

int break = 1;
while (true) {
   // code to change break
   if (!break) break;   // not very readable code.
}

Dependendo da linguagem de definição de um compilador pode ou não precisar de palavras-chave.Quando ele não sabe o que fazer, pode tentar aplicar regras de precedência ou simplesmente falhar.
Um exemplo:

void return(int i){printf("%d",i);}
public int foo(int a)
{
  if(a > 2)return (a+1)*2;
  return a + 3;
}

O que acontece se um é maior que 2?

  • A especificação da linguagem pode exigir que o compilador falha
  • A especificação da linguagem pode exigir que o compilador usa o retorno função
  • A especificação da linguagem pode exigir que o compilador de retorno

Você pode definir um idioma que dosn não usar palavras-chave.Você pode até mesmo definir um idioma que alowes você para substituir todos os símbolos (já que eles são apenas muito curto palavras-chave themselfes).
O problema não é o compilador, se sua especificação é completa e livre de erros, ele vai trabalhar.O problema é PEBCAD, programas usando esse recurso da linguagem que vai ser difícil de ler, como você tem que manter o controle das definições do símbolo.

FWIW, Tcl não tem palavras reservadas.Você pode ter variáveis e funções com nome "se", "de quebra", etc.A interpretação de um símbolo é totalmente dependente do contexto.O mesmo símbolo pode representar um comando em um contexto, uma variável em outra, ou de um literal de cadeia de caracteres em outra.

Em muitos casos, seria possível para o compilador interpreta palavras-chave como normal identificadores, como no exemplo:

int break = 1;
int for = 2;

Como uma questão de fato, eu escrevi um compilador para uma montagem simples-como brinquedo linguagem que faz isso, mas avisa o usuário em tais casos.

Mas, às vezes, a sintaxe é definida de uma forma que palavras-chave e os identificadores são ambíguos:

int break;

while(...)
{
    break; // <-- treat this as expression or statement?
}

E a razão mais óbvia é que os editores irão enfatizar palavras-chave para que o código fica mais legível para humanos.Permitindo palavras-chave para ser tratada como identificadores de faria realce de código mais difícil, e também poderia levar a má legibilidade do seu código.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top