Quali sono i vantaggi della notazione XML over S-expressions (-ish)?


11

Vorrei porre una domanda sulla notazione XML e S-expressions (-ish). Le espressioni S sono piuttosto vecchie; sono anche molto semplici. Potremmo considerare due forme uguali nel significato, diverse nella sintassi:

(codice xml tratto da Wikipedia in polacco )

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

Versione 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 versione S-Expression è molto più concisa. Evitiamo la ridondanza utilizzando semplici notazioni di elenco, ma possiamo ancora definire la sintassi per includere le cose che vogliamo avere (ad esempio proprietà). Ovviamente, questo è solo un esempio e lo standard reale avrebbe potuto essere migliore o semplicemente diverso; tuttavia, è più breve e più facile da analizzare. Perché ha vinto XML?



5
Ai votanti: non sottovalutare se non si è d'accordo con la domanda, ma se si ritiene che sia di scarsa qualità (e quindi, proporre modifiche per migliorare la qualità). @RobertHarvey Se pensi che sia una risposta, per favore, rispondi alla mia domanda invece di lasciare un commento.
Matthew Rock

1
La descrizione comando sopra il pulsante downvote include la frase "questa domanda non mostra alcuno sforzo di ricerca".
Robert Harvey,

1
Cerca di ricordare che questo non è un forum di discussione. La vera domanda ha risposte e ci si aspetta che i membri della comunità forniscano risposte, non opinioni.
Robert Harvey,

1
Gli argomenti di ridondanza per XML (come avere parentesi di chiusura con il nome della parentesi di apertura) possono essere facilmente emulati dalle espressioni S. Basta scrivere (para "This is a paragraph " (footnote "(better than the one under there)" "." /footnote) /para).
Andrew,

Risposte:


13

Sappiamo che i progettisti di XML avevano familiarità con le espressioni S, poiché XML si basa su SGML e SGML ha un linguaggio di fogli di stile, DSSSL, che utilizza la sintassi delle espressioni S (e schema come linguaggio di scripting incorporato).

Tuttavia hanno scelto una sintassi diversa rispetto alle espressioni S a causa dei casi d'uso per XML. Inizialmente, l'XML è stato progettato per supportare sia i dati strutturati generati dalla macchina sia i linguaggi di markup come HTML, che sono creati manualmente e contengono contenuti misti (testo mescolato con elementi con metadati).

Ridondanza

I documenti di testo di markup sono spesso più lunghi di uno schermo. Se vedi un )e non riesci a vedere l'inizio della struttura, sei piuttosto perso; non sai se era un capitolo o una barra laterale appena terminata. La ridondanza di ripetere il tagname in endtags in XML come </sidebar>rende molto più facile per lo scrittore umano. Inoltre lo rende più robusto: se si elimina accidentalmente un tag di fine, spesso si può dedurre quale tag di fine manca.

SGML (il predecessore di XML) ti ha permesso di abbreviare facoltativamente il tag di fine a un singolo carattere, ma questa funzionalità è stata lasciata fuori da XML per semplicità.

Quindi, in breve, XML è più dettagliato in base alla progettazione, perché è progettato per supportare documenti modificabili dall'uomo. Oggi l'XML viene utilizzato per un'ampia varietà di scopi, anche per la pura comunicazione machine-to-machine, dove questa ridondanza non è necessaria.

Contenuto misto

La sintassi suggerita non supporta molto bene i contenuti misti. Prendi questo esempio in HTML:

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

Come lo esprimeresti nella tua sintassi? Avresti bisogno di una sorta di delimitatore aggiuntivo per distinguere tra attributi e contenuto del testo. All'improvviso non è più così conciso.

Personaggi speciali

Le parentesi angolari sono molto più rare nel testo ordinario rispetto alle parentesi e ai due punti.

Compatibilità

L'HTML aveva già un enorme successo al momento della progettazione dell'XML ed era logico scegliere una sintassi simile.

Perché ha vinto XML?

Le espressioni S non sono mai state un'alternativa all'XML. Le specifiche XML sono molto più che parentesi angolari; Definisce una sintassi per elementi e attributi e contenuto misto, escape, codifica dei caratteri, sintassi e convalida DTD e così via. Nulla di simile esisteva per le espressioni s. Ovviamente puoi definire uno standard simile, come proponi qui, ma nessuno lo aveva fatto al momento. XML è stato benedetto dal W3C ed è stato quindi adottato dai principali attori ed è diventato lo standard defacto per lo scambio di dati.


3
Nel suo esempio, i due punti non sono usati per gli attributi? Per esempio. (p Ciao! (a: href "example.com" Fai clic qui)!)? (o l'ha appena modificata dopo che la tua risposta è stata pubblicata?)
Headcrab

Anche se non toglie nulla alla tua (eccellente) risposta, chi nella loro mente giusta crea manualmente documenti XML?
Jared Smith,

Ehi Jacques, grazie per questa eccellente risposta! Sono d'accordo con Headcrab sul fatto che i contenuti misti non sono un problema. Sono anche d'accordo con Jared, anche se credo che l'XML sia letto / scritto manualmente a volte comunque.
Matthew Rock

@Headcrab: è difficile da dire poiché non ci sono specifiche reali, solo un esempio ipotetico. Ma mi sembra che rappresentare il testo come simboli piuttosto che una stringa citata porterebbe ad ambiguità con spazi bianchi. Le espressioni S non supportano spazi bianchi significativi tra gli atomi AFAIK, ma questo è necessario per supportare ad esempio l' <PRE>elemento in HTML. Quindi ho pensato che sarebbero state necessarie delle citazioni.
Jacques B

2
Quindi sembra davvero che l'XML sia stato creato con tutte queste campane e fischietti e una sintassi familiare simile all'HTML che lo ha aiutato a vincere sulle espressioni s all'epoca. Quando molti sviluppatori decisero che, nei loro casi d'uso, tutte queste funzionalità non erano realmente necessarie per la comunicazione machine-to-machine, esisteva una diversa alternativa leggera sotto forma di JSON.
kamilk,

9

Personalmente, penso che la parte migliore di XML siano le capacità dello schema ben definite, piuttosto che la sua sintassi. Il meccanismo dello schema consente agli utenti di pubblicare il loro formato di documento per condividere ciò che considerano un documento valido. Ci sono anche validatori automatici. Inoltre, i tipi e gli schemi creati da un utente possono essere estesi da altri utenti.

Per quanto ne so nessuno ha fatto nulla di simile allo sforzo di standardizzare un meccanismo di schema per scopi generali per s-expression, ad eccezione del linguaggio LISP stesso (che l'esempio nella domanda del PO non utilizza).


1
Anche se non mi piace la verbosità di XML, +1 per menzionare le capacità dello schema che ne valgono quasi la pena. :-)
user949300


1

Ecco due motivi per cui sceglierei XML rispetto a qualcosa di "S-espressione-ish":

Un modello sintattico e semantico ben definito

XML non è semplicemente un albero di nodi, ma un albero di nodi classificati che hanno una diversa rappresentazione sintattica e comportamenti diversi. Ad esempio, un attributo con un determinato nome può apparire una sola volta per un dato nodo, mentre i nodi figlio possono apparire più volte.

È possibile definire un modello del genere in cima alle espressioni S generiche. I tuoi esempi mostrano uno schema per categorizzare gli attributi e gli elementi figlio. Aggiungi la semantica per testo, commenti e istruzioni di elaborazione e avrai qualcosa di isomorfo con XML.

Tooling

Dal modello sintattico e semantico standard, puoi costruire strumenti - e molte persone lo hanno. È possibile trovare una forma di parser / serializzatore XML, XPath e processore XSLT per ogni linguaggio / piattaforma comune. E sai che si comporteranno tutti allo stesso modo su ogni piattaforma.


E qui ci sono alcune altre cose da considerare:

Nel grande schema, XML non è così prolisso

Nel tuo esempio, cosa hai effettivamente eliminato? Mentre lo leggo, hai:

  • Eliminato il tag di chiusura per ogni espressione.
  • Eliminato >ciò che normalmente separerebbe il tag di apertura dai suoi figli.
  • Sostituito il =nome e il valore dell'attributo che separa con a :per indicare che il figlio è un attributo; nessun risparmio.

Penso che sia anche importante riconoscere che le rappresentazioni interne ed esterne di XML sono molto diverse. Internamente, un albero XML è molto compatto. E poiché i vari elementi sono già classificati, è molto efficiente da manipolare. Esternamente, beh, sì, hai tutti quei tag di chiusura, ma si comprimono bene.

La "verbosità" è il vero problema?

Penso che la vera domanda non sia se XML sia "dettagliato", ma se sia più espressivo di quanto sia necessario per un determinato scopo. Qualche esempio:

  • La capacità di un elemento di contenere attributi, che sono semanticamente diversi dagli elementi figlio. Utile per informazioni fuori banda, come la descrizione del tipo di dati nativo, del contenuto dell'elemento. Ma forse non ne hai bisogno, perché le tue specifiche esterne definiscono il contenuto.
  • Contenuto misto, in cui un elemento può contenere sia elementi figlio che testo (nonché commenti e istruzioni di elaborazione). Utile per il markup, ma forse non per la semplice rappresentazione dei dati.
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.