LINUX.ORG.RU

Tree как универсальный формат общения программ и людей

 , , , ,


0

2

Есть прикольный формат данных, который может использоваться для простого создания DSL-ей под различные нужды: от конфигов и межсерверной коммуникации, до программирования и логирования.

Он в 2 раза компактнее XML, в 20 раз проще YAML, в 2 раза быстрее JSON.

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

Нативная модель данных у него похожа на XML, но без всех его сложностей и куда более гибкая. Он вообще сам себе AST.

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

  • удобные расширяемые конфиги
  • структурированное логирование
  • коммуникация любых консольных утилит без парсинга текста регулярками

Подробно о нём тут: https://page.hyoo.ru/#!=8i7ao7_xfyxah

А вкратце тут: https://github.com/nin-jin/tree.d

Тут пример использования спец DSL для добавления подсветки синтаксиса для своего DSL за 3 минуты: https://www.youtube.com/watch?v=33k5ryVu0Uc

А тут пример пайплайна его обработки на js: https://page.hyoo.ru/#!=b6c11q_ocy5oh

Ну а здесь онлайн песочница с разными трансформациями: https://tree.hyoo.ru/

Что думаете об этом всём? Пока что есть реализациии лишь на D и TS, почти нет тулинга. Не хотели бы присоединиться к развитию?



Последнее исправление: nin-jin (всего исправлений: 2)

Что думаете об этом всём?

Что для простоты, понятности и расширяемости есть EDN, а для быстроты и компактности есть Transit. Единственное применение, которое я вижу для сабжа — это роль личного велосипеда, польза от которого состоит в радости от катания.

Правда, на соучастников я бы в таком случае не рассчитывал: кататься вдвоем на одном велосипеде — такое себе. Да и зачем помогать кататься на его велосипеде кому-то другому, если можно кататься самому на своем собственном? Правда ведь, ТС? %)

Nervous ★★★★★
()
Последнее исправление: Nervous (всего исправлений: 2)
Ответ на: комментарий от X512

Ну вот я и прошу дать пример XML/JSON который плохо представляется в виде формата ТС.

Представляется, но иерархия определяется отступами.
В небольших текстах их еще как-то можно соблюсти.

Forum0888
()
Ответ на: комментарий от X512

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

У меня давно решен этот вопрос (API для использования метаданных).

Свой формат представления файлов и баз метаданных (бинарный).

В частности все форматы Microsoft Office без проблем конвертируются в этот формат (и для этого имеется API).

Ныне ЯП разрабатываю (будет совместим с стандартом C11 и нативная поддержка метаданных).

Forum0888
()
Последнее исправление: Forum0888 (всего исправлений: 1)

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

Вставка бинарных данных напрямую в текст видится мне проблемной потому что подавляющее чисто текстовых редакторов не могут корректно обрабатывать любые байты.

Например:

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

  2. Другие байты < 0x20 могут также быть испорчены редактором при сохранении.

  3. Последовательность байт интерпретируемая как UTF-8 может быть искажена.

Возможно стоит добавить поддержку значений кодируемых в Base 64. Например:

image
	name \red dot.png
	data
		!iVBORw0KGgoAAAANSUhEUgAAAAUA
		!AAAFCAYAAACNbyblAAAAHElEQVQI12P4//8
		!/w38GIAXDIBKE0DHxgljNBAAO
		!9TXL0Y4OHwAAAABJRU5ErkJggg==
X512 ★★★★★
()

Предыдущие посты были ни к тому, чтобы сказать «формат не нужен».

Хотелось бы посмотреть спецификацию бинарного формата.
Ссылка ТС у меня показывает лишь черный экран.

Forum0888
()
Последнее исправление: Forum0888 (всего исправлений: 1)

Не понятно, чем он лучше JSON. Скорость - не аргумент. Я пока не встречал программу, которая упиралась бы в скорость парсинга JSON. Если такие и есть, то это редкий случай и скорей всего в этом случае есть форматы и получше.

vbr ★★★★
()

По стилю изложения - хочется сразу внятно увидеть про сабж, а не продираться через описание и сравнение других форматов. Тем более что версия tree с 2015го вроде как изменилась?

Про сам формат - любое универсальное решение сливает узкоспециализированным в области их специализации. Это аксиома.

Есть скажем формат pickle, он умеет кольцевые ссылки в тч.

Что касается попытки скрестить DSL с форматом данных, да ещё и сверху удобный парсинг натянуть, я такое пробовал. Биндил питоновскую структуру в шелл, так что бы можно было её настраивать через аргументы командной строки/из файла, да ещё и в файл сохранять, и все одним движением. Не взлетело, неудобно.

AntonI ★★★★★
()
Ответ на: комментарий от Forum0888

В Tree и нет никаких строк. Есть только сырые данные. Что вы туда засунете, то и вынете. Строка обычно сериализуется в utf8 бинарник. И как любой бинарник нарезается на список чанков, которые выводятся как есть. Если вам нужно хранить всякие нечитаемые бинарники, но при этом хочется редактировать любым текстовым редактором, то, конечно, лучше на уровне DSL предусмотреть упаковку бинарника в base64.

nin-jin
() автор топика
Ответ на: комментарий от Forum0888

Какая ссылка и что в ней?

Нет, я понемаю, что по чужим ссылкам ходить не принято, но свои-то собственные ссылки надо хоть раз открыть? %)

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

Nervous ★★★★★
()
Ответ на: комментарий от einhander

Комментарии и дефолты можете добавить на свой вкус. Например:

; \Точность чего-то там, по умолчанию 16
precision 14

; \Настройки сжатия
zlib
	; \Разрешено ли сжатие выходного потока, по умолчанию выключен
	output_compression +

; \Настройкии рантайма
zend
	; \Включён ли сборщик мусора, по умолчанию включён
	enable_gc +
	;
	; \И так далее
	exception_ignore_args -

Формат INI, разумеется, тоже надо изучать. Описанию формата как раз и посвящён пролог php.ini

nin-jin
() автор топика
Ответ на: комментарий от alysnix

Ко грамматикам формат представления AST не имеет никакого отношения, но если вас интересуют грамматики, то есть пара DSL-ей для их описания в этом формате:

https://github.com/nin-jin/tree.d/wiki/grammar.tree - тут в качестве примера можете увидеть грамматику самого tree.

https://github.com/nin-jin/tree.d/wiki/schema.tree - а тут схема языка описания схем.

nin-jin
() автор топика
Ответ на: комментарий от mydibyje

Попробуйте в JSON без костылей продублировать ключ объекта, написать комментарий, указать предикат отличный от «равно», или добавить список тегов к строке. Всё это вынуждает изобретать свои микроформаты поверх базового.

nin-jin
() автор топика
Ответ на: комментарий от X512

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

nin-jin
() автор топика
Ответ на: комментарий от Forum0888

У TN есть фундаментальная проблема - он парсит сырые данные. Это значит, что вместо строки на 200 байт, из него выйдет дерево на 40 узлов по 5 байт в среднем, единственное предназначение которых - быть потом сериализованными в строку на 100 байт. Это всё крайне не эффективно и дорого по памяти. В Tree такой проблемы нет благодаря разделению на структурные узлы и узлы данных.

nin-jin
() автор топика
Ответ на: комментарий от AntonI

В Tree, наоборот, формат отделён от языков. Так же как в XML. Один раз написал парсер/сериализатор формата, а далее просто бегаешь по AST, обрабатывая языки на его базе как хочешь, без возни с грамматиками.

nin-jin
() автор топика
Ответ на: комментарий от nin-jin

Я не про это а про универсальность. Еще раз, я пытался сделать такую универсальную (и даже более универсальную) шню, и мне самому оказалось с ней работать неудобно.

Отделено оно от ЯП или нет это детали реализации, а я про идеологию.

Кроме того микст из бинарных и текстовых данных это как правило ужасно (такой опыт у меня тоже был). Хотя бы потому, что открыв такое файло в редакторе (он же текстовый местами) можно превратить его в тыкву. Да и разбиение по переносам строки такое себе… Бинарный блоб пишется как длина фрагмента + фрагмент, не надо вводить никаких терминальных символов

Если хочется скорости однозначно надо брать чисто бинарный формат, он легко делается на коленке для всех актуальных контейнеров STL. Если хочется удобства и читабельности для конфигов, то надо брать чисто текстовый формат. А скрещивать ужа с ежом…

AntonI ★★★★★
()
Последнее исправление: AntonI (всего исправлений: 1)
Ответ на: комментарий от nin-jin

Понятно, благодарю за ответ.

Тем не менее, лучше писать, что в 2 раза быстрее, нежели std.json, т.к. на данный момент формулировка может, к примеру, быть отнесена к какому-нибудь высокоскоростному jsoniter

dikey0ficial
()
Ответ на: комментарий от dikey0ficial

В статье есть пояснение, почему парсер Tree концептуально быстрее JSON. То есть условный treeniter был бы ещё более высокоскоростным. Можете реализовать такой и прославиться.

nin-jin
() автор топика
Ответ на: комментарий от AntonI

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

nin-jin
() автор топика
Ответ на: комментарий от nin-jin

Я не говорю что это невозможно - я говорю что ИМНО такой подход имеет существенную родовую травму.

Многие уже пользуются Tree и получают удовольствие…

Вообще не аргумент вот ни разу. Многие много чего творят (скажем удовольствие от наркоты получают) - айда все ширятся?;-)

Это самый наглядный и гибкий среди бинарных форматов, и при этом самый компактный и шустрый среди текстовых.

Это очень сильное, и скорее всего неверное утверждение. Так говорить не надо (это не агрессия а добрый совет):

Вы не рассматривали ВСЕ текстовые и бинарные форматы, Вы взяли четыре. Кроме того понятия наглядности и гибкости зависит от человека и задачи. Мне скажем надо сериализовать данные с кольцевыми ссылками, tree из коробки этого делать не умеет. Комментарии через ; \ и переносы строк для бинарных данных для меня абсолютно ненаглядны. И далее по списку.

AntonI ★★★★★
()
Ответ на: комментарий от Nervous

Нет, я понемаю, что по чужим ссылкам ходить не принято, но свои-то собственные ссылки надо хоть раз открыть? %)
Про краденый велосипед шучу, конечно,

Ходил и «не узрел кражи».

Forum0888
()

Без обид, но я не понял нафиг оно нужно. Как свой фонфиг под себя ок, почему бы и нет как новый стандарт хз даже, я вот себе свой придумал и транслирую его в lua выглядит так

!key {42}
!key.subkey{"42"}
!key
{
  !subkey{42.42}
  !message.one{'oneline str'}
  !message.twoo{" multi
  line
  str"}
  !arrays {
    !str{"a","b":"c"|""} -- три вида разделителей
    !num{1,2,3,4,5,6}
    !flt{-0.1,+0.2,1}
    !hexbin{0xff,0b111}
  }
}

Всё везде явно начинается и заканчивается типы только одного вида, либо значение в подключах либо ключи, все ключи начинаются на ! явно. Легко конвертируется в json/lua/xml портянкой в три строчки, типы примитивные, сложные просто строкой, пусть программа разбирает всякие даты и IP и прочее. Это максимально топорный, но наглядный,явный и гибкий формат который я для себя смог придумать. Имя ему effconf или sec. Я придумал я молодец :D

LINUX-ORG-RU ★★★★★
()

Это из разряда когда вконтактовские макаки вместо UTF-8 используют однобайтовую Windows-1251. Там экономия покруче твоей - в джва раза

uwuwuu
()
Ответ на: комментарий от LINUX-ORG-RU

Оно имело бы смысл для какого-то говнораста под соусом самого безопасного формата данных. Если сравнивать с попсовыми языками, то у них у всех есть свой формат сериализации (PHP - serialize, Python - pickle, JS/Node.js - JSON (ага объектная нотация яваскрипт))

uwuwuu
()
Ответ на: комментарий от nin-jin

А вы где территориально? У нас сервер в России, может быть не ото всюду доступен.

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

Forum0888
()
Ответ на: комментарий от uwuwuu

Я в такие глуби не вдаваюсь. =) Вон большинство конфигов в системе просто blabla lala tutu tata строкой и парсятся обычным sscanf и всё нормально 99% случаев. nginx вон тоже взял под себя сделал фонфигурацию и норм всем никто не требует ничего. И так везде, это всякие ТОМЛЫ себя пиарят ини на стероидах, мы везде мы всё, мы вся. А нафига? Берушь что удобнее/эффективнее и всё, не нравится сам придумываешь один хрен сереализовать дополнительно на уровне приложения придётся всё. Ладно. Пускай химичит, химичить весело, почему нет.

LINUX-ORG-RU ★★★★★
()
Ответ на: комментарий от LINUX-ORG-RU

Самому велосипедить с нуля много мороки. Вот, гляньте доклад, где рассказываться, как за считанные минуты сделать свой DSL, который транслируется в программный код с сорсмапами, точными координатами ошибок, подсветкой синтаксиса, авторефакторингами и тд.

nin-jin
() автор топика
Ответ на: комментарий от LINUX-ORG-RU

И так везде, это всякие ТОМЛЫ

Это go-шный, а yaml стал популярен благодаря ruby on rails. В XML все пихают сейчас только джависты…

А нафига? Берушь что удобнее/эффективнее и всё

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

uwuwuu
()