Почему именно XML называют «языком»?

105

Мне было интересно, почему в названии XML есть буква L.

Сам по себе XML ничего не «делает». Это просто формат хранения данных, а не язык! Языки "делают" вещи.

Чтобы заставить XML «делать» что-то, превращать его в язык, нужно добавить xmlnsатрибуты к его корневому элементу. Только тогда он сообщает окружающей среде, о чем он.
Одним из примеров является XHTML. Он активен, имеет ссылки, гипертекст, стили и т. Д., Все они запускаются xmlns. Без этого XHTML-файл - это просто набор данных в узлах разметки.

Так почему же тогда XML называют языком? Это ничего не описывает, это не интерпретирует, это просто так.

Редактировать: Может быть, мой вопрос должен был быть более широким. Поскольку в настоящее время ответ «потому что XML был назван в честь SGML, который был назван в честь GML и т. Д.», Вопрос должен был быть таким: почему языки разметки (например, XML) называются языками?

Ох, и WRT близкие голоса: нет, я не спрашиваю о X. Я спрашиваю о L!

Мистер листер
источник
128
На чем основано ваше требование о том, что язык должен что-то делать? Я не вижу этого ни в одном из определений на dictionary.com .
kdgregory
10
Также как суахили понимают, только если оба понимают это. Или статья медицинского журнала понимается, если читатель понимает эту часть языка. Это не отличается. И люди составляют определения.
Сами Кухмонен
42
Язык разметки - это общий термин en.wikipedia.org/wiki/Markup_language
папараццо,
37
@MrLister: «Это человеческие языки, а не компьютерные языки» . Язык - это язык. В самом крайнем случае, даже английский требует контекстуальной информации (какой диалект используется), чтобы понять однозначно. Не мешает быть языком. У вашего вопроса просто ложная предпосылка.
Гонки легкости на орбите
68
Языки не делают вещи, они выражают и сообщают вещи
Хаген фон Айцен

Ответы:

238

Реальный ответ заключается в том, что в названии XML есть буква L, потому что парень по имени Раймонд Лори был одним из разработчиков первого «языка разметки» в IBM в 1970-х годах. Разработчики должны были найти название для языка, поэтому они выбрали GML, потому что это были инициалы трех разработчиков (Goldfarb, Mosher и Lorie). Затем они создали общий язык разметки backronym .

Позже это стало стандартизированным как SGML ( стандартизированный общий язык разметки ), и когда XML был создан, разработчики хотели сохранить постфикс ML, чтобы указать семейное отношение к SGML, и они добавили X вперед, потому что они думали, что это выглядело круто. (Несмотря на то, что это на самом деле не имеет смысла - XML ​​- это мета-язык, который позволяет вам определять расширяемые языки, но XML сам по себе не является расширяемым.)

Что касается вашего второго вопроса, можно ли XML по праву назвать языком:

Любой структурированный текстовый (или даже двоичный) формат, который может быть обработан вычислительно, может называться языком. Язык ничего не «делает» как таковой, но некоторые программы могут обрабатывать ввод на языке и «делать» что-то на его основе.

Вы заметите, что XML - это «формат хранения», который является истинным, но текстовый формат хранения можно назвать языком, эти термины не являются взаимоисключающими.

Языки программирования являются подмножеством языков. Например, HTML и CSS - это языки, но не языки программирования , а JavaScript - это настоящий язык программирования. Тем не менее, формального определения языка программирования также не существует, и существует большая серая зона языков, которую можно назвать либо форматами данных, либо языками программирования в зависимости от вашей точки зрения.

Учитывая это, XML явно является языком. просто не язык программирования - хотя он может использоваться для определения языков программирования, таких как XSLT.

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


Изменить: reinierpost указал, что вы могли иметь в виду что-то другое с вопросом, чем то, что я понял. Возможно, вы имели в виду, что определенные словари, такие как XHTML, RSS, XSLT и т. Д., Являются языками, потому что они связывают элементы и атрибуты с определенной семантикой, но сам стандарт XML не определяет никакой семантики для конкретных элементов и атрибутов, поэтому он не выглядит как " настоящий язык ".

Мой ответ на этот вопрос будет то , что XML делает определить как синтаксис и семантику, он просто определяет его на другом уровне. Например, он определяет синтаксис элементов и атрибутов и правила о том, как их обрабатывать. XML - это «метаязык», который все еще является своего рода языком (точно так же, как метаданные по-прежнему являются данными!) В качестве примера EBNF также является языком, но его целью является определение синтаксиса других языков, поэтому он также является метаязыком.

JacquesB
источник
19
@ Снеговик: «формальный язык» не обязательно соответствует тому, что обычно называют языком в вычислительной технике. Например, «формальный язык» не обязательно должен быть текстовым - машинный код такой же формальный язык, как и большинство двоичных форматов и протоколов. Поэтому я бы не сказал, что термин «формальный язык» охватывает то же значение, что и «язык» в вычислительной технике.
JacquesB
15
Я не знаю ни одного требования о том, что язык должен быть текстовым или не текстовым. Идея построения предложения из терминалов не имеет ничего общего с произвольной интерпретацией битов в этих терминалах или того, какие типы компьютеров (на основе кремния или углерода) способны их считывать.
4
@NicolBolas: Хороший вопрос, машинный код определенно является языком. Я просто думаю, что бинарные языки чаще называют «форматами», например, вы говорите, что GIF-формат не GIF-язык.
JacquesB
3
@BenCottrell: Тогда не будет ли это графом, поскольку в нем могут быть циклы?
JacquesB
181

Потому что это язык. Разметки язык, а не язык программирования.

Обратите внимание, что естественные человеческие языки, такие как английский и испанский, тоже ничего не «делают». Фактически, технически C ++, Java и тому подобное ничего не «делают», пока они не будут переданы в компилятор, и результат не будет выполнен. Делать вещи и быть языком в значительной степени ортогональны друг другу.

Ixrec
источник
43
Замените «интерпретатор» на «компилятор». То, что они передаются компилятору, тоже не заставляет их «делать», а просто переводит их на другой язык, который, опять же, ничего не «делает». Все исполнение является интерпретацией. Иногда интерпретатор может быть чрезвычайно простым и реализованным в кремнии, и в этом случае мы называем его «исполнительной единицей», но это все же интерпретатор. </nitpick>В любом случае, хороший ответ!
Йорг Миттаг
8
@ JörgWMittag Хороший вопрос. Поскольку я случайно выбрал языки, которые обычно компилируются, добавлено «и вывод будет выполнен».
Ixrec
1
Расширяемый язык разметки, если вы будете.
Doppelgreener
1
Я бы сказал, что человеческие языки «делают» вещи. См. Теорию Речи-Акта ...
Рэй
2
Сладкая, сладкая ортогональность. Выполните язык в другой алгебре, и развернется новый набор действий. По теории все равно.
Кеногу Лабз
103

Пусть Σ - непустое конечное множество символов, называемое алфавитом . Тогда Σ * - счетное бесконечное множество конечных слов, которое может быть образовано путем конкатенации нуля или более символов из Σ. Любое четко определенное подмножество L ⊆ Σ * является языком .

Давайте применим это к XML. Его алфавит - это набор символов Unicode U , который не является пустым и конечным. Не каждая конкатенация из нуля или более символов Юникода является правильно сформированным XML-документом, например, строкой

<tag> soup &; not <//good>

явно нет. Подмножество XML ⊂ U *, которое формирует правильно сформированные XML- документы, разрешимо (или «рекурсивно»). Существует машина (алгоритм или компьютерная программа), которая принимает в качестве входных данных любое слово wU * и по истечении конечного промежутка времени выводит либо 1, если w ∈ XML, и 0 в противном случае. Такой алгоритм является подпрограммой любого программного обеспечения для обработки XML. Не все языки разрешимы. Например, набор допустимых программ на C, которые заканчиваются за конечное время, не является (это известно как проблема остановки). Когда кто-то разрабатывает новый язык, важно принять решение о том, должен ли он быть настолько мощным, насколько это возможно, или лучше ограничить выразительность в пользу решимости.

Некоторые языки могут быть определены с помощью грамматики, которая, как говорят, производит язык. Грамматика состоит из

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

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

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

  1. Литералы грамматики являются цифры 1, 2, 3, 4, 5, 6, 7, 8, 9, и 0.
  2. Переменные являются символами S и D .
  3. S является начальным символом.
  4. Любое вхождение переменной S может быть заменено
    • с буквальным 0или
    • любой из других литералов , чем с 0последующей переменной D .
  5. Любое вхождение переменной D может быть заменено
    • любым из литералов, за которыми следует другой экземпляр переменной D или
    • по пустой строке.

Вот как мы получаем 42:

S - (применить правило 4, 2- й вариант) → 4 D - (применить правило 5, 1- й вариант) → 42 D - (применить правило 5, 2- й вариант) → 42.

В зависимости от того, насколько сложные правила вы допускаете в своей грамматике, требуются различные сложные машины, чтобы доказать, что данное слово действительно может быть создано грамматикой. Приведенный выше пример представляет собой обычную грамматику, которая является самой простой и наименее мощной. Следующий мощный класс грамматик называется контекстно-свободным . Эти грамматики также очень просто проверить. XML (если я не пропускаю какую-то непонятную функцию, о которой я не знаю) может быть описан с помощью контекстно-свободной грамматики. Классификация грамматик образует Хомскую иерархию грамматик (и, следовательно, языков). Каждый язык, который может быть описан грамматикой, по крайней мере, полуразрешим(или «рекурсивно перечислимый»). То есть существует машина, которая, учитывая слово, которое на самом деле принадлежит языку, получает доказательство того, что оно может быть создано грамматикой в ​​течение конечного времени, и никогда не выдаст неверного доказательства. Такая машина называется верификатором . Обратите внимание, что машина может никогда не остановиться, если ей дается слово, которое на самом деле не принадлежит языку. Ясно, что мы хотим, чтобы наши языки программирования описывались менее мощными грамматиками, чтобы иметь возможность отклонять недопустимые программы в течение ограниченного времени.

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

<?xml version="1.0" encoding="utf-8" ?>
<root>all evil</root>

является правильно сформированным документом XML, но не является действительным документом XHTML. Существуют схемы для XHTML , SVG , XSLT и чего-либо еще. Проверка схемы также может быть выполнена с помощью алгоритма, который гарантированно останавливается после конечного количества шагов для каждого входа. Такая программа называется валидатором или валидирующим парсером. Схемы определяются так называемыми языками определения скем , которые являются способом формального определения грамматик. XSD является официальным языком определения схемы для XML и сам по себе основан на XML. RELAX NG - более элегантная, намного более простая и немного менее мощная альтернатива XSD.

Поскольку вы можете определять свои собственные схемы, XML называется расширяемым языком, который является источником «X» в «XML».

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

5gon12eder
источник
7
@ Джорджио: В математике «четко определенные» в значительной степени просто интенсификатор: все, что существует математически, уже четко определено.
Кевин
9
@Giorgio Под «четко определенным» я подразумеваю, что существует формальный предикат, который сообщает, принадлежит ли элемент к набору или нет. Этот предикат в общем случае не будет вычисляемым, но он должен быть четко определен без противоречий. В противном случае могут случиться плохие вещи . «Пары строк ( w , M ), где M - наименьшее описание машины Тьюринга, которая выводит w, а затем останавливает» - это четко определенный, но невычислимый (см. Колмогоровскую сложность ) предикат. …
5gon12eder
2
@ 5gon12eder: этот набор не существует в ZFC (потому что аксиомная схема разделения недостаточно сильна, чтобы описать ее); если вы используете какую-то другую теорию множеств, вы должны указать ее.
Кевин
5
@ 5gon12eder: «Набор, содержащий все строки, которые не содержатся в наборе» не существует. Термин «четко определенный» по иронии судьбы не является четко определенным.
Кевин
3
Хорошо сформированные собственности или проверки осуществляется с помощью грамматики . Этот ответ был бы идеальным, если бы вы упомянули это.
Тибо Д.
31

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

Обратите внимание, что это означает, что все, что нужно языку - это синтаксис , язык не должен описывать, что означает каждая действительная строка (это называется семантикой ).

Теперь это означает, что языки программирования являются формальными языками, которые также имеют семантику, которая описывает некоторые вычисления. Например, XHTML - это формальный язык, семантика которого (грубо и неформально) описывает, как выглядит и ведет себя гипертекстовый документ.

XML по-прежнему является языком, хотя сам по себе не имеет семантики (но многие языки, производные от XML, используют, например, XHTML и XAML).

Технически, двоичные форматы также являются языками, но они так не называются. Термин «язык» зарезервирован для удобочитаемых форматов.

svick
источник
10
@MrLister Потому что они не читаются человеком. Когда они не читаются человеком, мы склонны называть их форматами или форматами данных .
Мейсон Уилер
3
@JamesSnell Конечно, не следует путать с другой языковой семьей ML. Yay для переполненных сокращений!
Мейсон Уилер
3
Если кто-то использует формальные инструменты для создания синтаксического анализатора (или особенно валидатора) для JFIF и т. Д., То инженеры действительно могут называть его «языком». Скорее всего, как "грамматика".
JDługosz
3
@MrLister: Ну, это языки, но поскольку они определяют многократно используемые структуры данных, у них есть специальное имя: форматы . Но да, это тоже языки.
Гонки легкости на орбите
4
@MrLister: Наименование формата - это больше вопрос маркетинга. Специалисты по XML назвали XML для XML, потому что «* ML» указывает на семейное отношение к формату предшественника, такому как GML и SGML, и потому, что они думали, что это здорово смотрится с X впереди. И GML назывался GML, потому что это был обобщенный язык разметки, а также потому, что это были инициалы трех языковых дизайнеров. Так что в основном L в XML объясняется тем, что парень по имени Raymond L orie был одним из разработчиков первого языка разметки.
JacquesB
12

Язык - это метод передачи информации.

Язык программирования - это метод передачи алгоритмов.

Язык разметки, такой как XML, является языком для передачи данных.

Philipp
источник
... и эти данные вполне могут быть описанием алгоритма.
Луаан
@Luaan ... и язык программирования также может использоваться для передачи данных. Как с JSON, например.
Филипп
2
Вы даже можете отказаться. Я видел сценарии NAnt (язык на основе XML), которые содержали код C #, который использовался только для хранения данных. Использование строковых литералов, содержащих XML. Да, это то, что заставляет взрослых плакать: P
Luaan
2

XML - это метаязык. Вы используете его для определения конкретных языков. Языки никогда ничего не делают, они просто позволяют нам выражать вещи. Кроме того, неверно, что XML является «языком хранения». Наоборот, на самом деле. Вы можете хранить документы XML, как вам угодно. XML лучше рассматривать как язык передачи. PS. Если вы не думаете, что XML «делает» что-либо, вам придется объяснить, почему многие системы (например, Jetty) используют XML как (плохой) язык программирования. Это грустное злоупотребление XML, но оно существует в дикой природе, и это только один из многих примеров.


источник