Por que mais idiomas não suportam comentários recursivos / aninhados? [duplicado]

14

A maioria dos idiomas com os quais trabalhei não tem suporte para comentários recursivos / aninhados.

  1. Existe alguma razão pela qual os designers de linguagem optariam por não implementar isso?
  2. É enganosamente complexo?
  3. Teria resultados indesejados?

Eu sei que pode haver problemas como:

/*
    string Str = "aslfkalfksnflkn/*aslkfasnflkn";

*/

Console.WriteLine("asdoadokn");

No entanto, ainda podemos obter o mesmo problema com os não-recursivos (considere * / em uma string em um comentário), então não acho que seja um bom argumento.

    
por George Duckett 26.10.2011 / 10:27
fonte

7 respostas

25

O problema é que os comentários recursivos forçam você a analisar a seção de comentários, empurrando-a para fora do escopo de um lexer normal e possivelmente introduzindo mais problemas.

Como um atualizador: Um compilador geralmente tem um número de estágios distintos com trabalhos diferentes, e os primeiros estágios são o léxico, que obtém o programa de entrada e o separa em uma sequência de símbolos (cada um deles contém uma palavra-chave e identificador ou operador) e o analisador, que estrutura essa seqüência de tokens em uma árvore de sintaxe abstrata (AST).

Para o escopo de um lexer, lembre-se de que o lexing normalmente pode ser feito por expressões regulares. Estruturas parecidas com colchetes, como comentários recursivos, não podem ser analisadas por expressões regulares (veja gramáticas livres de contexto), portanto, o léxico teria que ter muita complexidade adicional, por exemplo, precisaria ser implementado através de um analisador descendente recursivo.

Além disso, para C e linguagens semelhantes (que usavam a sintaxe / ** / comment), nunca foi necessário comentar grandes blocos de código, pois eles tinham o pré-processador e pedaços de código não utilizados eram apenas quebrados. por

#if 0
....
#endif

que contornou o problema de análise delegando o problema a um segundo compilador muito mais simples (o pré-processador).

Resumindo: como os comentários recursivos tornariam a compilação mais complicada, geralmente não é permitido, e apenas os idiomas com comentários no estilo C, mas sem um pré-processador, realmente precisam disso. Que Java está entre eles é lamentável, claro.

Editar: isso não significa que comentários recursivos seriam impossíveis ou mesmo muito difíceis de fazer. Você poderia usar um léxico de descida recursiva ou poderia ter um pré-processador antes do léxico para filtrar os comentários. No entanto, ambas as abordagens vêm com um custo considerável em comparação com o modelo padrão (use RE para construir automaticamente o lexer e um EBNF para construir automaticamente o analisador), e o ganho é muito pequeno.

    
por 26.10.2011 / 10:46
fonte
8

Estou com você sobre isso. Quando você trabalha com bases de código grandes e antigas, elas estão repletas de comentários sobre hacks, código comentado, e outros detalhes, além de interfaces C documentadas em /*...*/ comments. Se você precisar comentar um pouco disso, usar /*...*/ comentários quase nunca é uma opção, porque eles não aninham.

Eu não acredito que "complicar ainda mais o compilador" seja um motivo, porque comparado à complexidade do C ++, a análise de comentários para /* , */ (e talvez // ) deve ser ridiculamente fácil. Na verdade, parece que me lembro do Borland C ++ (nos anos 90) oferecendo a opção de analisar comentários aninhados - e esse compilador costumava ser conhecido por sua velocidade de iluminação.

Mas o problema com soluções não padrão é que você não pode usá-las se precisar portar seu código posteriormente. (E, em C ++, quem excluiria isso?)

Então eu concordo que seria uma melhoria se isso fosse padronizado.

Enquanto isso, uso // comentários para comentar blocos de código. Felizmente, a maioria dos editores / IDEs modernos tem a opção de aplicar isso a várias linhas de uma só vez.

    
por 26.10.2011 / 11:31
fonte
4

Eu modifiquei um compilador C para fazer isso uma vez, não foi muito difícil. Tudo é resolvido no scanner léxico, para que você não precise se preocupar com as entranhas do analisador. É realmente apenas uma questão de manter o controle do nível de aninhamento e ignorar qualquer coisa dentro dos delimitadores de string.

    
por 26.10.2011 / 13:01
fonte
3

Novilíngua tem comentários estruturados que podem aninhar. E tem uma gramática muito simples, então obviamente não é "enganosamente complexa".

    
por 26.10.2011 / 11:34
fonte
3

Comentários que abrangem várias linhas devem ser a exceção, não a regra.

Mesmo em C, eu uso o estilo C ++ // em vez do padrão /* */ .

Se eu realmente precisar comentar uma grande parte do código, eu uso a diretiva #if 0 preprocessor, que suporta o aninhamento.

    
por 26.10.2011 / 11:08
fonte
1

Isso é recursivo:

public void recursion()
{
    recursion();
}

Não tenho ideia de como seriam os comentários recursivos.

Comentários aninhados, por outro lado, farão sentido e, na verdade, já funcionam até certo ponto. Você pode aninhar comentários de linha única dentro de vários comentários de linha.

/* No longer use this!
// This is a method.
public void method()
{
}
*/

Apoiar o que você está pedindo, do ponto de vista do programador, faria todo o sentido.

/* No longer use this!
// This is a method.
public void method()
{
    /* Disabled!
       doInterestingStuff();
       ...
    */
}
*/

Considerando que as linguagens de programação são apenas ferramentas nas quais os programadores podem expressar suas intenções, o suporte a essa intenção seria um valor agregado.

Eu não posso comentar os aspectos técnicos de cor, mas parece que algumas das outras respostas já forneceram informações sobre isso.

    
por 26.10.2011 / 11:31
fonte
1

Um motivo provavelmente é a compatibilidade com bases de código existentes; As linguagens tipo C normalmente fazem tudo como C, até mesmo coisas estúpidas como 031 == 25 (literais octal, quem precisou delas?)

Outro motivo é mais filosófico: um comentário começa com (por exemplo) / * e termina com o próximo * /, e o que quer que esteja entre esses, não importa de forma alguma . Comentários aninhados também exigem a definição de uma sintaxe para comentários.

BTW, se você não precisar mais desse código, por que não removê-lo completamente e deixar para o VCS manter a versão mais antiga? O código comentado é um cheiro de código.

    
por 26.10.2011 / 18:02
fonte