Каковы преимущества XML по сравнению с S-выражениями (-ish)?

11

Я хотел бы задать вопрос о нотации XML и S-выражений (-ish). S-выражения довольно старые; они также очень просты. Мы могли бы рассмотреть две формы, которые одинаковы по значению, разные по синтаксису:

(XML-код взят из польской википедии )

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

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

Версия S-Expression гораздо более краткая. Мы избегаем избыточности, используя простые обозначения списков, но все же мы можем определить синтаксис для включения вещей, которые мы хотим иметь (например, свойства). Конечно, это всего лишь пример, и фактический стандарт мог бы быть лучше или просто отличаться; тем не менее, это короче и легче разобрать. Почему XML победил?

MatthewRock
источник
3
XML - это не S-выражения
Роберт Харви,
5
Для отрицателей: не отрицайте, если вы не согласны с вопросом, но если вы думаете, что он низкого качества (а затем предложите изменения для улучшения качества). @RobertHarvey Если вы считаете, что это ответ, пожалуйста, ответьте на мой вопрос, а не оставляйте комментарий.
MatthewRock
1
Всплывающая подсказка над кнопкой понизить голос включает фразу «этот вопрос не требует каких-либо исследований».
Роберт Харви
1
Постарайтесь запомнить, что это не дискуссионный форум. У реального вопроса есть ответы, и от членов сообщества ожидают ответов, а не мнений.
Роберт Харви
1
Аргументы избыточности для XML (например, наличие закрывающих скобок с именем открывающей скобки) можно легко эмулировать с помощью S-выражений. Просто пиши (para "This is a paragraph " (footnote "(better than the one under there)" "." /footnote) /para).
Андрей

Ответы:

13

Мы знаем, что разработчики XML были знакомы с S-выражениями, поскольку XML основан на SGML, а SGML имеет язык таблиц стилей DSSSL, который использует синтаксис S-выражений (и схему в качестве встроенного языка сценариев).

Тем не менее они выбрали синтаксис, отличный от S-выражений, из-за вариантов использования XML. Первоначально XML был разработан для поддержки как сгенерированных машиной структурированных данных, так и языков разметки, таких как HTML, которые создаются вручную и содержат смешанный контент (текст, смешанный с элементами с метаданными).

избыточность

Текстовые документы с разметкой часто длиннее экрана. Если вы видите a )и не видите начала структуры, вы довольно растеряны; Вы не знаете, была ли глава или боковая панель, которая только что закончилась. Избыточность повторения тэга в endtags в XML, как </sidebar>делает это намного проще для человека-писателя. Это также делает его более надежным: если вы случайно удалили конечный тег, вы часто можете определить, какой конечный тег отсутствует.

SGML (предшественник XML) позволял вам опционально сокращать конечный тег до одного символа, но эта функция была исключена из XML для простоты.

Короче говоря, XML более многословен по своему замыслу, потому что он предназначен для поддержки редактируемого человеком документа. Сегодня XML используется для самых разных целей, а также для чисто межмашинной связи, где такая избыточность не требуется.

Смешанный контент

Предлагаемый вами синтаксис не очень хорошо поддерживает смешанный контент. Возьмите этот пример в HTML:

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

Как бы вы выразили это в своем синтаксисе? Вам понадобится какой-то дополнительный разделитель, чтобы различать атрибуты и текстовое содержимое. Вдруг это уже не так кратко.

Специальные символы

Угловые скобки в обычном тексте встречаются гораздо реже, чем скобки и двоеточие.

Совместимость

HTML был уже чрезвычайно успешным во время разработки XML, и имело смысл выбрать аналогичный синтаксис.

Почему XML победил?

S-выражения никогда не были альтернативой XML. Спецификация XML намного больше, чем угловые скобки; Он определяет синтаксис для элементов и атрибутов и смешанного содержимого, экранирование, кодирование символов, DTD-синтаксис и проверку и так далее. Ничего подобного не существовало для s-выражений. Конечно, вы можете определить аналогичный стандарт, как вы предлагаете здесь, но никто не делал этого в то время. XML получил благословение от W3C и поэтому был принят основными игроками и стал стандартом де-факто для обмена данными.

JacquesB
источник
3
В его примере, не используются ли двоеточия для атрибутов? Например (p Привет! (a: href "example.com" Нажмите здесь)!)? (или он только что отредактировал это после того, как ваш ответ был опубликован?)
Headcrab
Хотя от вашего (превосходного) ответа ничего не зависит, кто в здравом уме вручную создает XML-документы?
Джаред Смит
Привет, Жак, спасибо за отличный ответ! Я согласен с Headcrab, что смешанный контент не проблема. Я также согласен с Джаредом, хотя я думаю, что XML все равно иногда читается / пишется вручную.
MatthewRock
@Headcrab: Сложно сказать, потому что здесь нет никакой спецификации, только гипотетический пример. Но мне кажется, что представление текста в виде символов, а не строки в кавычках, приведет к неоднозначности с пробелами. S-выражения не поддерживают значительный пробел между атомами AFAIK, но это необходимо для поддержки, например, <PRE>элемента в HTML. Поэтому я предположил, что цитаты будут необходимы.
JacquesB
2
Таким образом, похоже, что XML был создан со всеми этими прибамбасами и знакомым HTML-подобным синтаксисом, который помог ему победить s-выражения в то время. К тому времени, когда многие разработчики решили, что в их случаях использования все эти функции на самом деле не нужны для связи между компьютерами, появилась другая легкая альтернатива в форме JSON.
Камилк
9

Лично я думаю, что лучшая часть XML - это четко определенные возможности схемы, а не ее синтаксис. Механизм схемы позволяет пользователям публиковать их формат документа, чтобы поделиться тем, что они считают действительным документом. Есть также автоматизированные валидаторы. Кроме того, типы и схемы, созданные одним пользователем, могут быть расширены другими пользователями.

Насколько я знаю, никто не предпринимал попыток стандартизировать механизм схемы общего назначения для s-выражений, за исключением самого языка LISP (который не используется в примере в OP).

Эрик Эйдт
источник
1
Хотя мне не нравится многословие XML, +1 за упоминание возможностей схемы, которые почти стоят того. :-)
user949300
1

Вот две причины, по которым я бы выбрал XML вместо чего-то «S-expression-ish»:

Четко определенная синтаксическая и семантическая модель

XML - это не просто дерево узлов, а дерево классифицированных узлов, которые имеют разное синтаксическое представление и разное поведение. Например, атрибут с данным именем может появляться только один раз для данного узла, в то время как дочерние узлы могут появляться несколько раз.

Вы можете определить такую ​​модель поверх обобщенных S-выражений. В ваших примерах показана схема категоризации атрибутов и дочерних элементов. Добавьте семантику для текста, комментариев и инструкций по обработке, и вы получите нечто изоморфное XML.

механическая обработка

Из стандартной синтаксической и семантической модели вы можете создавать инструменты - и многие люди имеют. Вы можете найти некоторую форму анализатора / сериализатора XML, XPath и XSLT-процессора для всех распространенных языков / платформ. И вы знаете, что все они будут вести себя одинаково на каждой платформе.


И вот еще несколько вещей для рассмотрения:

В общей схеме XML не так уж многословен

В вашем примере, что вы на самом деле устранили? Пока я читаю, вы:

  • Исключен закрывающий тег для каждого выражения.
  • Исключено то >, что обычно отделяет открывающий тег от его дочерних элементов.
  • Заменено то, =что разделяет имя и значение атрибута на, :чтобы указать, что дочерний элемент является атрибутом; нет сбережений.

Я думаю, что также важно признать, что внутреннее и внешнее представления XML очень разные. Внутренне дерево XML очень компактно. И поскольку различные элементы уже классифицированы, очень эффективно манипулировать. Внешне, да, вы получаете все эти закрывающие теги, но они хорошо сжимаются.

Является ли "многословие" реальной проблемой?

Я думаю, что реальный вопрос не в том, является ли XML «многословным», а в том, является ли он более выразительным, чем это необходимо для конкретной цели. Несколько примеров:

  • Возможность для элемента содержать атрибуты, которые семантически отличаются от дочерних элементов. Полезно для внеполосной информации, такой как описание собственного типа данных, содержимого элемента. Но, возможно, вам это не нужно, потому что ваша внешняя спецификация определяет контент.
  • Смешанный контент, в котором элемент может содержать как дочерние элементы, так и текст (а также комментарии и инструкции по обработке). Полезно для разметки, но, возможно, не для простого представления данных.
kdgregory
источник