¿Cuáles son las ventajas de XML sobre la notación de expresiones S (-ish)?

11

Me gustaría hacer una pregunta sobre la notación XML y expresiones S (-ish). Las expresiones S son bastante antiguas; También son muy simples. Podríamos considerar dos formas que son iguales en significado, diferentes en sintaxis:

(código xml tomado de la wikipedia polaca )

<?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>

Versión 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)))

La versión S-Expression es mucho más concisa. Evitamos la redundancia mediante el uso de anotaciones de lista simples, pero aún podemos definir la sintaxis para incluir cosas que queremos tener (por ejemplo, propiedades). Por supuesto, esto es solo un ejemplo, y el estándar real podría haber sido mejor o simplemente diferente; Sin embargo, es más corto y más fácil de analizar. ¿Por qué ganó XML?

MatthewRock
fuente
3
XML no es S-Expressions
Robert Harvey
55
Para los votantes negativos: no voten negativamente si no están de acuerdo con la pregunta, pero si piensan que es de baja calidad (y luego propongan cambios para mejorar la calidad). @RobertHarvey Si cree que es una respuesta, responda mi pregunta en lugar de dejar un comentario.
MatthewRock
1
La información sobre herramientas sobre el botón de voto negativo incluye la frase "esta pregunta no muestra ningún esfuerzo de investigación".
Robert Harvey
1
Intenta recordar que este no es un foro de discusión. Las preguntas reales tienen respuestas, y se espera que los miembros de la comunidad proporcionen respuestas, no opiniones.
Robert Harvey
1
Las expresiones S pueden emular fácilmente los argumentos de redundancia para XML (como tener corchetes de cierre con el nombre del corchete de apertura). Simplemente escribe (para "This is a paragraph " (footnote "(better than the one under there)" "." /footnote) /para).
Andrew

Respuestas:

13

Sabemos que los diseñadores de XML estaban familiarizados con las expresiones S, ya que XML se basa en SGML, y SGML tiene un lenguaje de hoja de estilo, DSSSL, que utiliza la sintaxis de expresión S (y el esquema como lenguaje de script incorporado).

Sin embargo, eligieron una sintaxis diferente a las expresiones S debido a los casos de uso de XML. Inicialmente, XML fue diseñado para admitir datos estructurados generados por máquina y lenguajes de marcado como HTML, que se crean manualmente y contienen contenido mixto (texto entremezclado con elementos con metadatos).

Redundancia

Los documentos de texto marcado suelen ser más largos que una pantalla Si ve a )y no puede ver el comienzo de la estructura, está bastante perdido; no sabes si fue un capítulo o una barra lateral que acaba de terminar. La redundancia de repetir el nombre de la etiqueta en las etiquetas finales en XML </sidebar>hace que esto sea mucho más fácil para el escritor humano. También lo hace más robusto: si elimina accidentalmente una etiqueta final, a menudo puede inferir qué etiqueta final falta.

SGML (el predecesor de XML) le permitió acortar opcionalmente la etiqueta final a un solo carácter, pero esta característica se dejó fuera de XML por simplicidad.

En resumen, XML es más detallado por diseño, porque está diseñado para admitir documentos editables por humanos. Hoy XML se utiliza para una amplia variedad de propósitos, también para la comunicación pura de máquina a máquina, donde esta redundancia no es necesaria.

Contenido mixto

Su sintaxis sugerida no admitiría muy bien el contenido mixto. Tome este ejemplo en HTML:

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

¿Cómo expresarías esto en tu sintaxis? Necesitaría algún tipo de delimitador adicional para distinguir entre atributos y contenido de texto. De repente ya no es tan conciso.

Caracteres especiales

Los corchetes angulares son mucho más raros en el texto ordinario que los paréntesis y los dos puntos.

Compatibilidad

HTML ya tuvo un gran éxito en el momento en que se diseñaron los XML, y tenía sentido elegir una sintaxis similar.

¿Por qué ganó XML?

Las expresiones S nunca fueron una alternativa al XML. La especificación XML es mucho más que corchetes angulares; Define una sintaxis para elementos y atributos y contenido mixto, escape, codificación de caracteres, sintaxis y validación DTD, etc. Nada similar existía para las expresiones s. Por supuesto, puede definir un estándar similar, como propone aquí, pero nadie lo había hecho en ese momento. XML recibió la bendición del W3C y, por lo tanto, fue adoptado por los principales actores y se convirtió en el estándar de facto para el intercambio de datos.

JacquesB
fuente
3
En su ejemplo, ¿no se usan dos puntos para los atributos? P.ej. (p ¡Hola! (a: href "example.com" Haga clic aquí)) (¿o simplemente lo editó después de que se publicara su respuesta?)
Headcrab el
Aunque no le resta nada a su (excelente) respuesta, ¿quién en su sano juicio crea manualmente documentos XML?
Jared Smith
Hola Jacques, gracias por esta excelente respuesta! Estoy de acuerdo con Headcrab en que el contenido mixto no es un problema. También estoy de acuerdo con Jared, aunque supongo que XML se lee / escribe manualmente a veces de todos modos.
MatthewRock
@ Headcrab: Es difícil de decir ya que no hay especificaciones reales, solo un ejemplo hipotético. Pero me parece que representar el texto como símbolos en lugar de una cadena entre comillas generaría ambigüedades con espacios en blanco. Las expresiones S no admiten espacios en blanco significativos entre los átomos AFAIK, pero necesita esto para admitir, por ejemplo, el <PRE>elemento en HTML. Así que supuse que se necesitarían citas.
JacquesB
2
Por lo tanto, parece que XML se creó con todas estas campanas y silbatos y una sintaxis familiar similar a HTML que lo ayudó a ganar expresiones s en ese momento. Cuando muchos desarrolladores decidieron que, en sus casos de uso, todas estas características no son realmente necesarias para la comunicación de máquina a máquina, había una alternativa ligera diferente en forma de JSON.
kamilk
9

Personalmente, creo que la mejor parte de XML son las capacidades de esquema bien definidas, en lugar de su sintaxis. El mecanismo de esquema permite a los usuarios publicar su formato de documento para compartir lo que consideran un documento válido. También hay validadores automatizados. Además, los tipos y esquemas creados por un usuario pueden ser extendidos por otros usuarios.

Hasta donde yo sé, nadie ha hecho ningún esfuerzo por estandarizar un mecanismo de esquema de propósito general para la expresión s, excepto el lenguaje LISP en sí (que la muestra en la pregunta del OP no está usando).

Erik Eidt
fuente
1
Aunque no me gusta la verbosidad de XML, +1 por mencionar las capacidades de esquema que casi hacen que valga la pena. :-)
user949300
1

Aquí hay dos razones por las que elegiría XML sobre algo "S-expression-ish":

Un modelo sintáctico y semántico bien definido.

XML no es simplemente un árbol de nodos, sino un árbol de nodos categorizados que tienen una representación sintáctica diferente y un comportamiento diferente. Por ejemplo, un atributo con un nombre dado solo puede aparecer una vez para un nodo dado, mientras que los nodos secundarios pueden aparecer varias veces.

Podría definir dicho modelo sobre expresiones S genéricas. Sus ejemplos muestran un esquema para clasificar atributos y elementos secundarios. Agregue semántica para texto, comentarios e instrucciones de procesamiento, y tendrá algo que es isomorfo con XML.

Estampación

A partir del modelo sintáctico y semántico estándar, puede crear herramientas, y muchas personas lo han hecho. Puede encontrar algún tipo de analizador / serializador XML, XPath y procesador XSLT para cada lenguaje / plataforma común. Y sabes que todos se comportarán de la misma manera en cada plataforma.


Y aquí hay algunas otras cosas a considerar:

En el gran esquema, XML no es tan detallado

En tu ejemplo, ¿qué has eliminado realmente? Mientras lo leo, has:

  • Se eliminó la etiqueta de cierre para cada expresión.
  • Se eliminó el >que normalmente separaría la etiqueta de apertura de sus elementos secundarios.
  • Se reemplazó el =que separa el nombre y el valor del atributo con a :para indicar que el hijo es un atributo; Sin ahorros.

Creo que también es importante reconocer que las representaciones internas y externas de XML son muy diferentes. Internamente, un árbol XML es muy compacto. Y debido a que los diversos elementos ya están categorizados, es muy eficiente de manipular. Externamente, bueno, sí, obtienes todas esas etiquetas de cierre, pero se comprimen bien.

¿Es la "verbosidad" el verdadero problema?

Creo que la verdadera pregunta no es si XML es "detallado", sino si es más expresivo de lo que se necesita para un propósito determinado. Algunos ejemplos:

  • La capacidad de un elemento de contener atributos, que son semánticamente diferentes de los elementos secundarios. Útil para información fuera de banda, como la descripción del tipo de datos nativo, del contenido del elemento. Pero tal vez no necesite eso, porque su especificación externa define el contenido.
  • Contenido mixto, en el que un elemento puede contener elementos secundarios y texto (así como comentarios e instrucciones de procesamiento). Útil para el marcado, pero tal vez no para la simple representación de datos.
kdgregory
fuente