Jakie są zalety XML-a w porównaniu z notacją wyrażeń S (-ish)?

11

Chciałbym zadać pytanie dotyczące zapisu XML i S-wyrażeń (-ish). Wyrażenia S są dość stare; są również bardzo proste. Możemy rozważyć dwie formy, które są równe w znaczeniu, różne pod względem składni:

(kod xml pochodzi z polskiej wikipedii )

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

Wersja 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)))

Wersja S-Expression jest znacznie bardziej zwięzła. Unikamy redundancji, używając prostych notacji listowych, ale wciąż możemy zdefiniować składnię, aby uwzględnić rzeczy, które chcemy mieć (np. Właściwości). Oczywiście jest to tylko przykład, a faktyczny standard mógłby być lepszy lub po prostu inny; jest jednak krótszy i łatwiejszy do przeanalizowania. Dlaczego wygrał XML?

MatthewRock
źródło
3
XML to nie S-Expressions
Robert Harvey
5
Do downvoters: nie głosuj negatywnie, jeśli nie zgadzasz się z pytaniem, ale jeśli uważasz, że jest złej jakości (a następnie zaproponuj zmiany w celu poprawy jakości). @RobertHarvey Jeśli uważasz, że to odpowiedź, proszę odpowiedz na moje pytanie, zamiast upuszczać komentarz.
MatthewRock
1
Etykietka nad przyciskiem głosowania zawiera wyrażenie „to pytanie nie pokazuje żadnego wysiłku badawczego”.
Robert Harvey
1
Pamiętaj, że to nie jest forum dyskusyjne. Prawdziwe pytanie ma odpowiedzi, a członkowie społeczności powinni udzielać odpowiedzi, a nie opinii.
Robert Harvey
1
Argumenty nadmiarowości XML (takie jak nawiasy zamykające z nazwą nawiasu otwierającego) można łatwo emulować za pomocą wyrażeń S. Po prostu napisz (para "This is a paragraph " (footnote "(better than the one under there)" "." /footnote) /para).
Andrew

Odpowiedzi:

13

Wiemy, że projektanci XML znali wyrażenia S, ponieważ XML jest oparty na SGML, a SGML ma język arkuszy stylów, DSSSL, który wykorzystuje składnię S-wyrażeń (i schemat jako osadzony język skryptowy).

Niemniej jednak wybrali inną składnię niż wyrażenia S ze względu na przypadki użycia XML. XML został początkowo zaprojektowany do obsługi zarówno danych generowanych maszynowo, jak i języków znaczników, takich jak HTML, które są tworzone ręcznie i zawierają mieszaną treść (tekst przeplatany elementami z metadanymi).

Nadmiar

Znaczniki dokumentów tekstowych są często dłuższe niż ekran. Jeśli widzisz a )i nie widzisz początku struktury, jesteś całkiem zagubiony; nie wiesz, czy to był rozdział, czy pasek boczny, który właśnie się zakończył. Nadmiar powtarzania zmiennej w znacznikach końcowych w formacie XML </sidebar>znacznie ułatwia pisarzowi. Dzięki temu jest bardziej niezawodny: jeśli przypadkowo usuniesz znacznik końcowy, często możesz wywnioskować, którego znacznika brakuje.

SGML (poprzednik XML) pozwolił ci opcjonalnie skrócić znacznik końcowy do jednego znaku, ale dla uproszczenia tej funkcji pominięto XML.

Krótko mówiąc, XML jest z założenia bardziej szczegółowy, ponieważ został zaprojektowany do obsługi dokumentu edytowalnego przez człowieka. Obecnie XML jest wykorzystywany do wielu różnych celów, również do czystej komunikacji między maszynami, gdzie ta nadmiarowość nie jest potrzebna.

Mieszana treść

Sugerowana składnia nie obsługiwałaby bardzo dobrze zawartości mieszanej. Weź ten przykład w HTML:

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

Jak wyraziłbyś to w swojej składni? Potrzebujesz rozróżnienia między atrybutami a treścią tekstową. Nagle nie jest już tak zwięzłe.

Znaki specjalne

Nawiasy kątowe są znacznie rzadsze w zwykłym tekście niż w nawiasach i dwukropku.

Zgodność

HTML był już bardzo udany w czasie projektowania XML i sensowne było wybranie podobnej składni.

Dlaczego wygrał XML?

Wyrażenia S nigdy nie były alternatywą dla XML. Specyfikacja XML to znacznie więcej niż nawiasy kątowe; Definiuje składnię elementów i atrybutów oraz mieszaną zawartość, zmiany znaczenia, kodowanie znaków, składnię DTD i sprawdzanie poprawności i tak dalej. Nic podobnego nie istniało dla wyrażeń s. Oczywiście możesz zdefiniować podobny standard, jak tutaj proponujesz, ale nikt tego wtedy nie zrobił. XML został pobłogosławiony przez W3C i dlatego został przyjęty przez głównych graczy i stał się standardem defacto do wymiany danych.

JacquesB
źródło
3
W jego przykładzie nie używa się dwukropków dla atrybutów? Np. (p Cześć! (a: href "example.com" Kliknij tutaj)!)? (czy też właśnie to edytował po opublikowaniu Twojej odpowiedzi?)
Headcrab
Chociaż nic nie odbiera (doskonałej) odpowiedzi, kto przy zdrowych zmysłach ręcznie tworzy dokumenty XML?
Jared Smith
Hej Jacques, dziękuję za tę doskonałą odpowiedź! Zgadzam się z Headcrab, że mieszane treści nie stanowią problemu. Zgadzam się również z Jaredem, chociaż i tak czasami czasami czytam / piszę XML.
MatthewRock
@Headcrab: Trudno powiedzieć, ponieważ nie ma żadnej konkretnej specyfikacji, tylko hipotetyczny przykład. Ale wydaje mi się, że reprezentowanie tekstu jako symboli, a nie cytowanego ciągu, prowadziłoby do niejednoznaczności z białymi spacjami. Wyrażenia S nie obsługują znaczących spacji między atomami AFAIK, ale potrzebujesz tego do obsługi np. <PRE>Elementu w HTML. Więc założyłem, że potrzebne będą cytaty.
JacquesB
2
Wygląda więc na to, że XML został stworzony z tymi wszystkimi dzwonkami i gwizdkami oraz znaną składnią podobną do HTML, która pomogła mu w tym czasie pozyskać wyrażenia s. Zanim wielu programistów zdecydowało, że w swoich przypadkach użycia wszystkie te funkcje nie są tak naprawdę konieczne do komunikacji między maszynami, istnieje inna lekka alternatywa w postaci JSON.
kamilk
9

Osobiście uważam, że najlepszą częścią XML jest dobrze zdefiniowane możliwości schematu, a nie jego składnia. Mechanizm schematu umożliwia użytkownikom opublikowanie formatu dokumentu w celu udostępnienia tego, co uważają za prawidłowy dokument. Istnieją również automatyczne weryfikatory. Ponadto typy i schematy utworzone przez jednego użytkownika mogą być rozszerzane przez innych użytkowników.

O ile wiem, nikt nie poczynił wysiłku w celu standaryzacji mechanizmu schematu ogólnego zastosowania dla ekspresji s, z wyjątkiem samego języka LISP (którego próbka w pytaniu OP nie używa).

Erik Eidt
źródło
1
Chociaż nie lubię gadatliwości XML, +1 za wzmiankę o możliwościach schematu, które prawie sprawiają, że warto. :-)
user949300
1

Oto dwa powody, dla których wybrałbym XML zamiast czegoś „S-expression-ish”:

Dobrze zdefiniowany model składniowy i semantyczny

XML nie jest po prostu drzewem węzłów, ale drzewem skategoryzowanych węzłów, które mają różne reprezentacje składniowe i różne zachowanie. Na przykład atrybut o podanej nazwie może pojawić się tylko raz dla danego węzła, a węzły potomne mogą pojawić się wiele razy.

Można zdefiniować taki model na podstawie ogólnych wyrażeń S. Twoje przykłady pokazują schemat kategoryzacji atrybutów i elementów potomnych. Dodaj semantykę do tekstu, komentarzy i instrukcji przetwarzania, a będziesz mieć coś, co jest izomorficzne z XML.

Obróbka

Ze standardowego modelu składniowego i semantycznego możesz budować narzędzia - i wiele osób je ma. Możesz znaleźć jakąś formę parsera / serializatora XML, XPath i procesora XSLT dla każdego wspólnego języka / platformy. I wiesz, że wszyscy będą zachowywać się tak samo na każdej platformie.


A oto kilka innych rzeczy do rozważenia:

W wielkim schemacie XML nie jest taki szczegółowy

Co w twoim przykładzie wyeliminowałeś? Jak czytam, ty:

  • Wyeliminowano tag zamykający dla każdego wyrażenia.
  • Wyeliminowano to >, co normalnie oddzielałoby znacznik otwierający od jego elementów potomnych.
  • Zamieniono nazwę =oddzielającą nazwę i wartość atrybutu na, :aby wskazać, że dziecko jest atrybutem; bez oszczędności.

Myślę, że ważne jest również, aby uznać, że wewnętrzne i zewnętrzne reprezentacje XML są bardzo różne. Drzewo XML jest wewnętrznie bardzo zwarte. Ponieważ różne elementy są już podzielone na kategorie, manipulowanie nimi jest bardzo skuteczne. Zewnętrznie, cóż, tak, wszystkie te znaczniki zamykające są dobrze kompresowane.

Czy „gadatliwość” jest prawdziwym problemem?

Myślę, że prawdziwym pytaniem nie jest to, czy XML jest „pełny”, ale czy jest on bardziej wyrazisty niż jest potrzebny do określonego celu. Kilka przykładów:

  • Zdolność elementu do przechowywania atrybutów, które są semantycznie różne od elementów potomnych. Przydatne w przypadku informacji pozapasmowych, takich jak opis rodzimego typu danych, zawartości elementu. Ale może tego nie potrzebujesz, ponieważ twoja zewnętrzna specyfikacja określa treść.
  • Zawartość mieszana, w której element może przechowywać zarówno elementy potomne, jak i tekst (a także komentarze i instrukcje przetwarzania). Przydatne do znaczników, ale może nie do prostej reprezentacji danych.
kdgregory
źródło