Quais são as vantagens do XML sobre a notação de expressões S (-ish)?

11

Gostaria de fazer uma pergunta sobre a notação XML e S-expression (-ish). As expressões S são bem antigas; eles também são realmente simples. Poderíamos considerar duas formas com significado igual e sintaxe diferente:

(código xml extraído da wikipedia polonesa )

<?xml version="1.0" encoding="UTF-8"?>
<ksiazka-telefoniczna kategoria="bohaterowie książek">
 <!-- komentarz -->
  <osoba charakter="dobry">
    <imie>Ambroży</imie>
    <nazwisko>Kleks</nazwisko>
    <telefon>123-456-789</telefon>
  </osoba>
  <osoba charakter="zły">
    <imie>Alojzy</imie>
    <nazwisko>Bąbel</nazwisko>
    <telefon/>
  </osoba>
</ksiazka-telefoniczna>

Versão S-Expression (-ish):

(:version "1.0" :encoding "utf-8")
(ksiazka-telefoniczna :category "bohaterowie książek"
  ; komentarz(a comment)
  (osoba :charakter "dobry"
    (imie Ambroży)
    (nazwisko Kleks)
    (telefon 123-456-789))
  (osoba :charakter "zły"
    (imie Alojzy)
    (nazwisko Bąbel)
    (telefon)))

A versão S-Expression é muito mais concisa. Evitamos a redundância usando notações de lista simples, mas ainda podemos definir a sintaxe para incluir as coisas que queremos ter (por exemplo, propriedades). Obviamente, este é apenas um exemplo, e o padrão real poderia ter sido melhor ou simplesmente diferente; no entanto, é mais curto e fácil de analisar. Por que o XML venceu?

MatthewRock
fonte
3
XML não é S-Expressions
Robert Harvey
5
Para votantes negativos: não diminua o voto se você não concordar com a pergunta, mas se você acha que é de baixa qualidade (e, em seguida, proponha mudanças para melhorar a qualidade). @RobertHarvey Se você acha que é uma resposta, responda minha pergunta em vez de comentar.
MatthewRock
1
A dica de ferramenta sobre o botão de voto negativo inclui a frase "esta pergunta não mostra nenhum esforço de pesquisa".
Robert Harvey
1
Tente lembrar que este não é um fórum de discussão. Perguntas reais têm respostas, e os membros da comunidade devem fornecer respostas, não opiniões.
Robert Harvey
1
Os argumentos de redundância para XML (como ter colchetes de fechamento com o nome do colchete de abertura) podem ser facilmente emulados por expressões S. Basta escrever (para "This is a paragraph " (footnote "(better than the one under there)" "." /footnote) /para).
28416 Andrew

Respostas:

13

Sabemos que os designers do XML estavam familiarizados com as expressões S, uma vez que o XML é baseado no SGML, e o SGML possui uma linguagem de folha de estilo, DSSSL, que usa a sintaxe da expressão S (e o esquema como linguagem de script incorporada).

No entanto, eles escolheram uma sintaxe diferente das expressões S devido aos casos de uso para XML. O XML foi inicialmente projetado para oferecer suporte a dados estruturados gerados por máquina e a linguagens de marcação como HTML, que são criados manualmente e contêm conteúdo misto (texto misturado com elementos com metadados).

Redundância

Os documentos de texto de marcação geralmente são mais longos que uma tela cheia. Se você vê um )e não consegue ver o início da estrutura, está bastante perdido; você não sabe se foi um capítulo ou uma barra lateral que acabou de terminar. A redundância de repetir o nome da tag nas marcações finais em XML </sidebar>torna isso muito mais fácil para o escritor humano. Também o torna mais robusto: se você excluir acidentalmente uma tag final, poderá inferir com freqüência qual tag final está faltando.

O SGML (o predecessor do XML) permitiu reduzir opcionalmente a tag final para um único caractere, mas esse recurso foi deixado de fora do XML por simplicidade.

Em resumo, o XML é mais detalhado por design, porque foi projetado para suportar documentos editáveis ​​por humanos. Hoje, o XML é usado para uma ampla variedade de finalidades, também para comunicação pura máquina a máquina, onde essa redundância não é necessária.

Conteúdo misto

Sua sintaxe sugerida não suporta muito bem conteúdo misto. Veja este exemplo em HTML:

<p>Hi! <a href="example.com">Click here</a>!</p>

Como você expressaria isso em sua sintaxe? Você precisaria de algum tipo de delimitador adicional para distinguir entre atributos e conteúdo de texto. De repente, não é mais tão conciso.

Caracteres especiais

Os colchetes angulares são muito mais raros no texto comum do que parênteses e dois pontos.

Compatibilidade

O HTML já tinha um grande sucesso no momento em que o XML foi projetado, e fazia sentido escolher uma sintaxe semelhante.

Por que o XML venceu?

As expressões S nunca foram uma alternativa ao XML. A especificação XML é muito mais que colchetes angulares; Ele define uma sintaxe para elementos e atributos e conteúdo misto, escape, codificação de caracteres, sintaxe e validação DTD e assim por diante. Nada semelhante existia para expressões s. É claro que você pode definir um padrão semelhante, como propõe aqui, mas ninguém havia feito isso na época. O XML foi abençoado pelo W3C e, portanto, foi adotado pelos principais players e se tornou o padrão de troca de dados.

JacquesB
fonte
3
No exemplo dele, dois pontos não são usados ​​para atributos? Por exemplo. (p Olá! (a: href "example.com" Clique aqui)!)? (ou fez ele só edição que depois de sua resposta foi postada?)
Headcrab
Embora isso não afaste sua resposta (excelente), quem em sã consciência cria manualmente documentos XML?
Jared Smith
Olá Jacques, obrigado por esta excelente resposta! Concordo com o Headcrab que o conteúdo misto não é um problema. Também concordo com Jared, embora acho que o XML seja lido / gravado manualmente às vezes de qualquer maneira.
MatthewRock
@ Headcrab: É difícil dizer, já que não há especificações reais, apenas um exemplo hipotético. Mas parece-me que representar o texto como símbolos, em vez de uma string citada, levaria a ambiguidades com espaço em branco. As expressões S não suportam espaços em branco significativos entre os átomos AFAIK, mas você precisa disso para suportar, por exemplo, o <PRE>elemento em HTML. Então, presumi que seriam necessárias aspas.
JacquesB
2
Então, realmente parece que o XML foi criado com todos esses sinos e assobios e sintaxe familiar semelhante ao HTML, que o ajudou a conquistar as expressões s na época. Quando muitos desenvolvedores decidiram que, em seus casos de uso, todos esses recursos não eram realmente necessários para a comunicação máquina a máquina, havia uma alternativa leve diferente na forma de JSON.
Kamilk
9

Pessoalmente, acho que a melhor parte do XML são os recursos de esquema bem definidos, e não a sintaxe. O mecanismo do esquema permite que os usuários publiquem seu formato de documento para compartilhar o que consideram um documento válido. Também existem validadores automatizados. Além disso, tipos e esquemas criados por um usuário podem ser estendidos por outros usuários.

Até onde eu sei, ninguém fez o esforço de padronizar um mecanismo de esquema de propósito geral para expressão s, exceto a própria linguagem LISP (que a amostra na pergunta do OP não está usando).

Erik Eidt
fonte
1
Embora eu não goste da verbosidade do XML, +1 por mencionar os recursos do esquema que quase fazem valer a pena. :-)
user949300
1

Aqui estão duas razões pelas quais eu escolheria XML em vez de algo "S-expression-ish":

Um modelo sintático e semântico bem definido

XML não é simplesmente uma árvore de nós, mas uma árvore de nós categorizados que possuem representação sintática diferente e comportamento diferente. Por exemplo, um atributo com um determinado nome pode aparecer apenas uma vez para um determinado nó, enquanto nós filhos podem aparecer várias vezes.

Você pode definir esse modelo sobre expressões S genéricas. Seus exemplos mostram um esquema para categorizar atributos e elementos filho. Adicione semântica para texto, comentários e instruções de processamento, e você terá algo isomórfico com XML.

Ferramentas

No modelo sintático e semântico padrão, você pode criar ferramentas - e muitas pessoas têm. Você pode encontrar alguma forma de analisador / serializador de XML, processador XPath e XSLT para cada idioma / plataforma comum. E você sabe que todos eles se comportarão da mesma maneira em todas as plataformas.


E aqui estão algumas outras coisas a considerar:

No grande esquema, XML não é tão detalhado

No seu exemplo, o que você realmente eliminou? Enquanto eu leio, você:

  • Eliminada a tag de fechamento para cada expressão.
  • Eliminado o >que normalmente separaria a tag de abertura de seus filhos.
  • Substituído o =que separa o nome e o valor do atributo por a :para indicar que o filho é um atributo; sem economia.

Eu acho que também é importante reconhecer que as representações internas e externas do XML são muito diferentes. Internamente, uma árvore XML é muito compacta. E como os vários elementos já estão categorizados, é muito eficiente manipular. Externamente, bem, sim, você recebe todas essas tags de fechamento, mas elas são compactadas bem.

A "verbosidade" é o verdadeiro problema?

Penso que a verdadeira questão não é se o XML é "detalhado", mas se é mais expressivo do que o necessário para um determinado objetivo. Alguns exemplos:

  • A capacidade de um elemento manter atributos, que são semanticamente diferentes dos elementos filhos. Útil para informações fora da banda, como a descrição do tipo de dados nativo, do conteúdo do elemento. Mas talvez você não precise disso, porque sua especificação externa define o conteúdo.
  • Conteúdo misto, no qual um elemento pode conter elementos filho e texto (além de comentários e instruções de processamento). Útil para marcação, mas talvez não para simples representação de dados.
kdgregory
fonte