Введение

Формат сериализации данных

В компьютерном программировании S-выражение (или символическое выражение, сокращенно sexpr или sexp) — это выражение в нотации, подобной именованной, для представления вложенных списков (данных, имеющих древовидную структуру). S-выражения были изобретены и получили распространение благодаря языку программирования Lisp, который использует их как для исходного кода, так и для данных.

Анализ

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

Стандартизация

Стандарты для некоторых языков программирования, производных от Lisp, включают спецификацию их синтаксиса S-выражений. К ним относятся Common Lisp (стандартный документ ANSI INCITS 226 1994 (R2004)), Scheme (R5RS и R6RS) и ISLISP. В мае 1997 года Рон Ривест представил проект для Интернета на рассмотрение в качестве RFC. Проект определял синтаксис, основанный на S-выражениях Lisp, но предназначенный для хранения и обмена данными общего назначения (подобно XML), а не конкретно для программирования. Он так и не был утвержден как RFC, но впоследствии был процитирован и использован в других RFC (например, RFC 2693) и ряде других публикаций. Изначально он предназначался для использования в SPKI. Формат Ривеста определяет S-выражение как последовательность октетов (серию байтов) или конечный список других S-выражений. В нем описаны три формата обмена данными для представления этой структуры. Один из них – "продвинутый транспорт", который очень гибок в плане форматирования и синтаксически похож на выражения в стиле Lisp, но не идентичен им. Например, продвинутый транспорт позволяет представлять последовательности октетов буквально (длина строки, двоеточие и вся необработанная строка), использовать экранированные формы, шестнадцатеричное представление, Base64 или помещать их непосредственно как "токены", если они соответствуют определенным условиям. (Токены Ривеста отличаются от токенов Lisp тем, что первые служат только для удобства и эстетики и обрабатываются точно так же, как и другие строки, в то время как вторые имеют конкретное синтаксическое значение.) Проект Ривеста определяет каноническое представление "для целей цифровой подписи". Оно предназначено для компактности, простоты разбора и уникальности для любого абстрактного S-выражения. Он допускает только буквальные строки и запрещает использование пробелов для форматирования вне строк. Наконец, существует "базовое транспортное представление", которое представляет собой либо каноническую форму, либо кодировку Base64, заключенную в фигурные скобки. Последнее предназначено для безопасной передачи канонически закодированного S-выражения в системе, которая может изменять интервалы (например, в почтовой системе с 80-символьными строками, где строки длиннее обрезаются). Этот формат не получил широкого распространения за пределами SPKI (некоторые пользователи – GnuPG, libgcrypt, Nettle и GNU lsh). Веб-страница S-выражений Ривеста предоставляет исходный код на C для парсера и генератора (доступный по лицензии MIT), который можно адаптировать и встраивать в другие программы. Кроме того, нет ограничений на независимую реализацию этого формата.