Por que o CSS não permite comentários de linha única? [fechadas]

13

Entendo que o CSS suporta apenas comentários de várias linhas como essas

/* foobar */

Por que não há suporte para comentários de linha única.

// foobar

Eles são tão comuns na programação e parecem particularmente úteis para uma linguagem como CSS, em que cada regra está na sua própria linha.

Se não havia uma razão histórica específica para essa decisão, o que impediu que os navegadores passassem a apoiá-la?

Ganso
fonte
3
Essa é uma péssima decisão. Eles devem permitir comentários de linha única.
Tulains Córdova
1
@Goose: você já viu o sass-lang.com ?
Kevin cline
1
@ TulainsCórdova Não endossei as respostas, apenas apontei que essa discussão já havia sido realizada.
Eric King
2
Essa pergunta obteve uma resposta mais técnica do que as respostas aqui. "O CSS trata as novas linhas como todos os outros espaços em branco e não seria capaz de determinar o final do comentário sem um delimitador final".
Goose

Respostas:

8

Compatibilidade com versões anteriores

A introdução de comentários de linha única na sintaxe CSS pode alterar o significado dos arquivos que atualmente usam o token //. Os fornecedores de navegadores são muito relutantes em introduzir alterações que podem quebrar potencialmente as páginas existentes.

O CSS é definido com regras de análise "tolerantes a erros" muito precisas, o que significa que, mesmo se você escrever algo sintaticamente ilegal, existem regras precisas sobre como a análise deve ocorrer. Se uma sequência ilegal de caracteres (como //) for detectada dentro de uma declaração, a declaração atual será descartada e tudo até o próximo ponto e vírgula ser ignorado.

O CSS foi projetado assim para permitir a introdução de nova sintaxe sem interromper os navegadores antigos. Navegadores antigos apenas ignoram as declarações que contêm sintaxe não suportada e continuam depois.

Mas essa lógica assume que a "unidade" a ser processada ou ignorada é a declaração. Se comentários de linha única forem introduzidos, isso significa que a análise posterior //deve pular até a próxima quebra de linha em vez de até o próximo ponto e vírgula, que altera quais regras são analisadas e quais são ignoradas. Isso pode potencialmente alterar o significado dos arquivos CSS existentes de maneiras surpreendentes.

Um exemplo:

P { font: 12px//16px; }
... hundreds of additional lines of CSS...

Aqui, por engano, dobrei a barra. A conseqüência é que a declaração da fonte é ignorada, mas todo o resto funciona bem. Se o suporte para //comentários fosse introduzido, de repente a chave de fechamento seria comentada, potencialmente quebrando todo o resto da folha de estilos.

Agora você pode dizer que é minha culpa desde que cometi um erro, mas isso não muda, pois um número desconhecido de páginas na Internet pode quebrar ou renderizar estranhamente por motivos obscuros.

Qualquer alteração que interrompa a compatibilidade com versões anteriores deve ser considerada com muito cuidado, e os comentários de linha única provavelmente não são suficientemente atraentes para o risco, pois o único benefício é que você economiza algumas teclas.

Portanto, se o CSS deveria ter comentários em uma única linha, provavelmente deveria ter sido introduzido desde o início. Mas o CSS começou como uma linguagem muito simples e ter duas sintaxes de comentários diferentes seria vista como uma complexidade desnecessária na época. (Mesmo o ANSI C não tinha comentários de linha única.)

JacquesB
fonte
Ah, // é um token em CSS? Diga.
22716 Michael Michael
Atualmente //, será analisado em dois "tokens delim" e, por sua vez, não é permitido em nenhum lugar da gramática. Consulte w3.org/TR/css-syntax-3/#tokenization para obter detalhes.
precisa saber é o seguinte
+1 no MainMa pelo motivo de começar /**/, mas aceitar este porque também aborda o motivo de não ter sido alterado.
Goose
8

O suporte a outro elemento de sintaxe não é tão fácil: existem muitas ferramentas que devem ser capazes de lidar com ainda mais estilos de comentários. Na verdade, não ficaria surpreso ao ver que a maioria dos tokenizadores / analisadores simplesmente ignora novas linhas, provavelmente substituindo-as por ;.

Se seria essencial para a linguagem, ou seja, tornar a vida dos desenvolvedores muito mais fácil, isso poderia ser feito. Por exemplo, não ter nenhum tipo de comentário em CSS seria uma porcaria, e valeria a pena o esforço de adicionar elementos de sintaxe específicos que delimitam comentários. //comentários de estilo, por outro lado? ... Não vejo o ponto. Veja /* Hello, World! */: um comentário de uma linha.

Na verdade, você provavelmente espera //comentários no estilo porque está acostumado a eles em C ++ ou linguagens semelhantes. No entanto, o CSS não herda do C ++, portanto, esperar recursos de sintaxe semelhantes é bastante estranho.

Da mesma forma, um programador Python alegaria que o CSS também deveria ter #comentários no estilo; então agora, precisamos suportar os dois estilos? Então um cara do mundo Haskell pedia para incluir --e {- -}também, e você se pergunta por que não reconhece mais o código CSS.

O pequeno benefício //disso é que você não precisa digitar mais três caracteres no final do seu comentário de linha única (na verdade, se começarmos a contar caracteres, o CSS deve usar comentários no estilo Python). No entanto, se você usar um editor de texto decente, comente / descomente o texto simplesmente pressionando um atalho de qualquer maneira.

Eles parecem [...] particularmente úteis para uma linguagem como CSS em que cada regra está em sua própria linha.

Como expliquei, eles são apenas um pouco úteis para um pequeno subconjunto de programadores, usando um pequeno subconjunto de editores de texto. Quanto à sua observação sobre cada regra em sua própria linha (discordo da sua observação, a propósito), isso me fez pensar em outro ponto: como os comentários são realmente usados.

Aqui está o uso dos comentários CSS que consigo pensar:

  • Como cabeçalho de arquivo (informações sobre direitos autorais, itens personalizados, etc.)
  • Como delimitador de um grupo de estilos.
  • Como uma explicação de um hack.
  • Como um detalhe sobre um estilo ou propriedade em particular.

Nos três primeiros casos, você usará comentários de várias linhas de qualquer maneira. Isso é óbvio para o cabeçalho do arquivo e a explicação de um hack (a maioria dos hacks requer pelo menos uma frase e um hiperlink para o StackOverflow ou um artigo de blog); quanto aos delimitadores:

/**
 * Footer and sitemap styles.
 */

O comentário no estilo C é muito mais visível do que:

// Footer and sitemap styles.

enterrado no texto.

Arseni Mourzenko
fonte
O JavaScript também suporta //comentários de linha única .
Tulains Córdova
Eu diria que isso //é muito comum em muitas línguas e o conceito por trás disso é que é mais do que sintaxe, mas também funciona de maneira diferente. Dito isto, esta é a resposta mais profunda ainda.
Ganso
Eu não acho que seja um pequeno subconjunto. Qualquer pessoa que escreva CSS no formato bruto seria mais fácil adicionar comentários com //. Mas o ponto de compatibilidade com versões anteriores torna discutível.
O'Rooney
-5

O problema é que a maioria das linguagens com comentários (por exemplo, C #, Java) são linguagens compiladas e o compilador retira TODOS os comentários antes de apresentar o conteúdo ao consumidor (a CPU). CSS não é compilado; geralmente o arquivo é enviado inalterado conforme o designer o desenvolveu, portanto não há oportunidade de remover os comentários. O comentário de estilo // requer o símbolo // E um avanço de linha para manter a correção sintática.

Sim, existem minificadores e, sim, o javascript permite esse tipo de comentário. Javascript também permite eval (), então não acho que queremos tomá-lo como modelo.

Michael Blackburn
fonte
3
Esta resposta não faz nenhum sentido. "Não há oportunidade de retirar o comentário" - é claro que existe, o comentário é retirado pelo analisador exatamente como em qualquer outro idioma. Caso contrário, como o CSS poderia ter os /* */comentários?
precisa saber é o seguinte
Eu quis dizer intermediário de terceiros entre o designer e o consumidor. O compilador é esse intermediário em linguagens compiladas. O "analisador" a que você se refere é um subsistema do navegador, o consumidor final do conteúdo.
Michael Blackburn
Então, por que o analisador não retira os //comentários quando pode remover /* */?
precisa saber é o seguinte
1
Poderia, mas é preciso procurar o // e o feed de linha, e o feed de linha é predominantemente conteúdo semântico, não sintático. CSS como projetado trata todos os espaços em branco da mesma forma. Para suportar // agora você tem espaço em branco "especial" e, além disso, esse espaço em branco "especial" pode ter um caractere (\ n) e dois (\ r \ n).
Michael Blackburn
3
@ MichaelBlackburn: DSSSL (que é um antecessor do CSS usando a sintaxe da expressão S) também possui comentários de linha única. Não tem nada a ver com linguagens imperativas versus declarativas.
precisa saber é o seguinte