понедельник, 5 ноября 2007 г.

XML как замена всему :-)

А вообще, конечно же, синтаксис надо давить.
Без синтаксиса лучше.
По этой причине Лисп и стоит выше всех прочих, вместе взятых
(Из комментариев)


- Авек плезир! - отозвался Фагот, - но почему же
с вами одним? Все примут горячее участие!
(«Мастер и Маргарита»)



А почему же только Лисп? См. второй эпиграф.
А почему только синтаксис? Почему не задавить заодно и семантику? :-)

Ну, разумеется, рядом с Лиспом по степени, так сказать, отсутствия синтаксиса, поставить почти нечего. В самом деле, если отвлечься от лексических соглашений и немногих технических деталей вроде спецификации параметров или точечной записи, синтаксис Лиспа описывется всего тремя тривиальными правилами :



Program ::= List
List ::= '(' { Element } ')'
Element ::= List | Atom


Весь язык, собственно говоря, «перетек» в семантику – в правила интерпретации списков, которые (правила) определяются в зависимости от первого элемента.

Насколько это упрощает/усложняет программирование и чтение Лисп-программ – давайте не будем касаться этого вопроса. Сейчас мне хочется просто отметить интересное сходство Лиспа и... XML.

В самом деле, XML ведь тоже (опять-таки, если не брать во внимание второстепенные технические детали), предельно прост:



XMLDocument ::= Element
Element ::= StartTag { Content } EndTag
Content ::= Element | NonstructuredText


Те же три (и очень похожие!) правила. (Правда, в StartTag еще и атрибуты можно задавать, но это та деталь, которой хочется пренебречь для элегантности сравнения... :-))

У XML, в отличие от Лиспа, нет собственной семантики – это всего лишь язык разметки. Смысл XML-документу придают агенты, его воспринимающие – либо люди, либо программы, с ним работающие. Но отсутствие семантики парадоксальным образом оборачивается невиданным расширением сфер использования: с помощью XML можно описать практически все на свете; главное – договориться, как именно описывать и как понимать/интерпретировать такое XML-описание. Для первого служат DTD, Schema или различные неформальные соглашения, для второго – шаблоны XSLT плюс смежные технологии, а также стандартизованные программные интерфейсы – DOM, SAX и подобные.

Вообще-то писать на эту тему можно очень много, но сейчас я хочу только лишь указать на проект Superx++ (http://xplusplus.sourceforge.net/), интересный как раз попыткой предложить XML как замену синтаксиса всеми нами любимого языка C++.

Собственно, смысл проекта достаточно прост: предлагается нотация, полностью заменяющая синтаксис C++ эквивалентными XML-конструкциями. Правда, более внимательное чтение примеров не подтверждает полной замены: автор не решился «xml-изировать» язык целиком и синтаксис выражений оставил в исходном виде. Более того, в какой-то момент он, похоже, испугался собственного радикализма и предложил некий «промежуточный» вариант под названием shortx, в котором язык переведен в XML-нотацию только частично...

Вот, полюбуйтесь: объявление класса в XML-нотации. Исходное, «плюсовое» объявление легко восстановить.





<class name="XTree">
  <scope type="public">
    <func name="GetSize" type="int">
      <return>
        <eval member="Size" object="this">
      </return>
    </func>
    <var name="Size" type="int">200</var>
  </scope>
</class>




Отметим, что (само)уверенности автору не занимать: одна из его первых статей на эту тему называется так: x++: The World's First Full XML-Based Programming Language Released!

(Сначала язык назывался X++, но это имя оказалось занято более «авторитетными» компаниями, и автору пришлось сменить его на superx++.)

Что касается собственно проекта Superx++, то его реализация не вышла из беты, а с 2004 года он, кажется, не развивается; по правде говоря, трудно представить себе какое-то реальное практическое применение такого парадоксального подхода... В общем, любопытна только идея как таковая, а также некоторые технические подробности; в частности, такая.

Для superx++ автор сделал интерпретатор, причем написал его на плюсах. А почему не попытаться применить для этой же цели XSLT? Это выглядело бы логично: ведь он как бы хочет по максимуму использовать преимущества XML-технологий? Понятно, что автор хотел сделать эффективный инструмент, так как надеялся найти практическое применение своему проекту (даже фирму специально для этого сделал), но мне кажется, исследователькая ценность проекта от такого выбора только бы возросла, при этом совершенно неважно, в какой мере это ему бы в итоге удалось. Даже отрицательный результат здесь был бы очень интересен; по крайней мере, мы бы лучше себе представляли границы применимости шаблонов XSLT. Я, например, давно хочу эти границы применимости почувствовать...
UPDATE: совершенно случайно вдруг увидел старую статью В.Турчина:
Рефал как язык для обработки xml-документов
Валентин Турчин
Опубликовано в журнале "Компьютерра" №25 от 02 июля 2001 года
Ссылка: http://www.computerra.ru/2001/402/10900/

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

4 комментария:

CyberZX комментирует...

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

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

Но вот для смешивания нескольких языков или для мета-программирования такое могло бы пригодиться и найти серьёзное практическое применение.

Анонимный комментирует...

Использование XML для описания исходного кода программ позволяет не только упростить построение компиляторов, но и спроектировать разнообразные инструменты для работы с проектом на языке программирования, например С++.

Один из важных вопросов сохранения исходных кодов программ на языке программирования звучит так: "А в каком виде необходимо хранить исходные коды программ в базе знаний программиста?" И язык разметки XML является наилучшим на текущий момент.

Создана обработка на макроязыке 1С, которая конвертирует словарь метаданных в XML вид. Исходный код программы на макроязыке 1С включен в XML как обычный текстовый файл (строки программы). На момент создания утилиты не было инструмента преобразования текстов исходного кода языка программирования в промежуточное представление программы и далее в формат XML, как это делается в компиляторе переднего плана языка С++.

Посмотреть результат обработки можно здесь: Файл is-mdatas.xml- ( пример конфигурации метаданных в формате XML 53,29 Кбайта).[url]http://www.robot-ivan.narod.ru/is-mdatas.xml[/url]

Dmitry Shalkhakov комментирует...

Не надо заменять все XMLом, пожалуйста! Лучше заменить все Лиспом.

Анонимный комментирует...

Не прошло и года, как я добрался до сюда... :)

Аналогия между Lisp и XML действительно очень сильная.

Грубо говоря, в Лиспе - одноцветные скобки, а в XML - разноцветные, - вот и вся разница. Если рассматривать первый элемент списка как квалификатор "цвета", то разницы вообще никакой.

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

У меня была даже мысль придумать приложение (производный язык) XML,
на котором можно было бы программировать. И естественно, я взял "за основу" Lisp, и даже попытался построить математическое отображение (биекцию) между этим гипотетическим языком и Lisp. Ну, типа, не разрабатывать интерпретатор, а воспользоваться Лисповским.

Заторомозило меня то, что... плохо знаю Lisp. А потом накатили конкретные проекты, так и повисло все в воздухе.

-----
Кстати, я считаю, что человеку не будет удобно программировать на XML-образном языке. ("Осторожность" superx++ вполне понятна.)

Зато открываются интересные возможности по трансформации программного кода при помощи программного же кода или XSLT.

Вот уж где раздолье для "метапрограммирования" и "ленивых вычислений".

Скажем, будь в таком языке templates, инстанциирование могло бы быть просто XSLT-преобразованием.

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

Представление о связке языка программирования "для людей" (C++, JavaScript) и языка программирования "для машин" (гипотетический XML Programming Language) у меня туманные, но такая связка (биекция?) возможно и ИМХО многое бы упростила.