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

Зачем
Вообще говоря эти популярные форматы — XML и JSON давно и повсеместно используются разработчиками без оглядки на такие «мелочи» как потребление памяти или загрузка CPU.
И уж тем более без заморочек с низкоуровневой оптимизацией.
Но тем интереснее посмотреть на то, что может получиться, если реализацию XML/JSON парсера доверить человеку, владеющему черной магией ассемблером.
Хотя наверное описанные ниже проекты уже не несут никакого практического смысла в современных реалиях — зачем вам сверхбыстрая обработка данных, если все остальное у вас в проекте тормозит, падает и глючит?
Так что стоит воспринимать их лишь как образцы хорошего вкуса и остатков инженерной культуры. Чтобы помнили как это было и знали что такое еще возможно.
Тестовый стенд
Понта ради чтобы подсветить возможные проблемы совместимости, в качестве стенда использовалась FreeBSD 14, а не более обыденный Linux.
В зависимости от типа проекта, сборка осуществлялась как с помощью обычного gcc так и с clang и/или nasm, jasm и так далее.
XML.C
21.5Кб
Начнем наше (очередное) погружение в мир ультрахардкора высоких инженерных достижений с довольно простого проекта:
Simple XML subset parser comparable to glib's Markup parser, but without any dependencies in one self contained file.
Реализован этот парсер XML на чистом современном С, разумеется без зависимостей, сборка происходит с помощью cmake. Собирается как с помощью gcc так и с clang.
Специфика FreeBSD
В исходном коде есть вот такой блок:
#ifdef XML_PARSER_VERBOSE
#include <alloca.h>
#endif
Заголовочный файл alloca.h это часть проекта ядра Linux и поставляется вместе с ним, т.е. это не какая-то дополнительная библиотека а часть заголовков ядра.
В FreeBSD его разумеется нет, поэтому для сборки я вставил этот простой макрос:
#if defined(__FreeBSD__)
#include <stdlib.h>
#else
#include <alloca.h>
#endif
JSON65
https://github.com/mignon-p/json65
128Кб
Следущий проект — натуральный бальзам для души уставшего от современного технологического ада программиста:
A JSON parser written in 6502 assembly language.
Относительно большой проект, реализующий парсер JSON на чистом ассемблере (и немного С) для.. 8-битных микропроцессоров серии 6502.
Выглядит этот чип как-то так:

Понимаю, что скорее всего для молодого поколения разработчиков, название 6502 мало о чем говорит, поэтому ниже в качестве иллюстрации список систем, поддерживаемых компилятором cc65, с помощью которого собирается этот проект:
-
the following Commodore machines:
VIC20
C16/C116 and Plus/4
C64
C128
CBM 510 (aka P500)
the 600/700 family
newer PET machines (not 2001).
the Apple ][+ and successors.
the Atari 8-bit machines.
the Atari 2600 console.
the Atari 5200 console.
GEOS for the C64, C128 and Apple //e.
the Bit Corporation Gamate console.
the NEC PC-Engine (aka TurboGrafx-16) console.
the Nintendo Entertainment System (NES) console.
the Watara Supervision console.
the VTech Creativision console.
the Oric Atmos.
the Oric Telestrat.
the Lynx console.
the Ohio Scientific Challenger 1P.
the Commander X16.
the Synertek Systems Sym-1.
Atari, Commodore, Apple II — думаю хотя-бы о части этих знаменитых компьютеров вы точно слышали:

Так вот данный проект реализует парсер JSON для всех этих замечательных машин из далекого прошлого.
Как тебе такое, Илон Маск?
Для сборки нужен уже упомянутый кросс-компилятор cc65, исходники которого находятся на Github.
Специфика FreeBSD
Компилятор сс65 присутствует в пакетах, поэтому его можно установить в систему без заморочек со сборкой из исходников:
pkg install cc65
В пакете cc65 идет также симулятор sim65, позволяющий запустить собранное приложение для 6502 процессора.
Так это выглядит в работе с использованием симулятора:

Jsonx64
https://github.com/mmoeller86/jsonx64/
20Кб
Следующий шедевральный проект:
A fast JSON-parser written in x86-64 assembly
Тестовое приложение из этого проекта (вместе с частью исходников) вы можете наблюдать на заглавном скриншоте к статье.
Из описания:
It supports 64-bit strings, 64-bit memory and 3 input sources:
memory, files and FDs
Так что никаких заморочек со сборкой i386 ELF на 64-битной системе выполнять не придется.
Для сборки необходимо использовать довольно редкий ассемблер JWasm.
Специфика FreeBSD
К великой радости, jwasm также присутствует в пакетах FreeBSD, поэтому можно обойтись без ручной сборки:
pkg install jwasm
Сам факт сборки проекта на чистом ассемблере под FreeBSD — железобетонный пруф переносимости в пределах одной архитектуры и отсутствия каких-либо зависимостей от операционной системы.
Так что библиотеку можно легко собрать и в других BSD и на Windows.
MSXJSON
https://github.com/ricbit/msxjson
15Кб
Наверное самый фантастический проект из всей подборки:
JSON parser for MSX BASIC
MSX BASIC это такая версия языка БЕЙСИК из примерно 1983 года.
Парсер написан на ассемблере для знаменитого микропроцессора Z80 и собирается с помощью специального ассемблера sjasmplus:
Command-line cross-compiler of assembly language for Z80 CPU.
Так выглядит запуск тестов обработки JSON.. в эмуляторе MSX (!):

Специфика FreeBSD
И sjasmplus и openmsx — эмулятор MSX присутствуют в пакетах FreeBSD в готовом виде:

asmjson
https://github.com/MKuranowski/asmjson
21.6Кб
Еще одна реализация парсера JSON на чистом ассемблере, на этот раз под nasm:
JSON parser written in nasm for x86-64 Linux
Несмотря на описание, отлично собирается и работает на FreeBSD, так что зависимостей от ОС тут нет.
Один единственный файл с исходником на ассемблере и еще один заголовочный, с описанием функций — весь проект.
Часть исходного кода и тестовое приложение в работе:

AsmXml
108Кб
Следущий проект — реализация парсера XML на чистом ассемблере:
AsmXml is a very fast XML parser and decoder for x86 platforms (Windows, Linux, BSD and Mac OS X).
Проект старый (разработка идет с 2008 года) и довольно известный.
Как-то так выглядит запуск тестового приложения с использованием этой библиотеки:

У проекта есть рекорды скорости обработки:
To give an idea of the relative speed of AsmXml, the fastest open source XML parsers process between 10 and 30 MBs of XML per seconds while AsmXml processes around 200 MBs per seconds (on an Athlon XP 1800+).
Если вы задаетесь вопросом зачем я это читаю использовать чистый ассемблер когда есть Java и .NET — за этим:

Отдельная шутка юмора в том что Xerces-C это порт с Java одноименной и очень известной библиотеки, созданный когда-то как раз с целью повышения производительности.
А тут как видите из графика, ее уделывают в хвост и гриву.
Специфика FreeBSD
Эта библиотека также присутствует в готовом виде в пакетах FreeBSD:

json-parser
https://github.com/json-parser/json-parser
30Кб
Не смотря на столь банальное название, перед нами действительно эпический проект:
Very low footprint DOM-style JSON parser written in portable C89 (sometimes referred to as ANSI C).
Понимаю, что для современного разработчика сложно будет понять масштаб и всю эпичность этого чуда, поэтом процитирую:
ANSI C also referred to as C89, was the first C Programming Language Standard defined by the American National Standards Institute (ANSI) in 1989. It is officially designated as ANSI X3.159-1989.
Фактически это означает, что сей замечательный парсер JSON можно собрать из палок и желудей вообще любым существующим компилятором С и в самых экзотичных системах.
Так выглядит в работе тестовое приложение:

Еще от этого же автора есть проект генератора JSON — для сериализации в JSON:
https://github.com/json-parser/json-builder
Simple JSON Parser in C
https://github.com/whyisitworking/C-Simple-JSON-Parser
28Кб
Еще один интересный проект, состоящий (как и должно быть) из одного файла исходника на С и еще одного — с заголовком:
Extremely lightweight, easy-to-use & blazing fast JSON parsing library written in pure C
Проект относительно новый и я не стал бы тратить на него время, если бы не одно «но»:
Fully RFC-8259 compliant
Этот самый RFC-8259 описывает стандарт JSON и при этом является ��вежим и актуальным — от декабря 2017 года.
Так что если автор проекта не врет — перед вами полная реализация парсера JSON на чистом С и без внешних зависимостей.
Кроссплатформенная, разумеется.
Зависимостей нет до такой степени, что в проекте нет даже скрипта сборки и тестовое приложение собирается вручную:
gcc -I. json.c example.c -o example
Вот как выглядит собранное тестовое приложение в действии:

Вне рамок
Ниже еще несколько проектов, выходящих за рамки статьи, но настолько отбитых интересных, что просто не мог их пропустить.
json.sh
https://github.com/rcrowley/json.sh
Да это именно оно:
Pure-shell JSON parser
«Pure shell» означает что оно работает далеко не только в любимом bash, но и например в ksh.
Пример использования:
. "lib/json.sh"
json <"tests/mixed.json"
Настоящий праздник консольной любви, короче.
OJG
https://github.com/ohler55/ojg
Следующий интересный проект:
Optimized JSON for Go is a high performance parser with a variety of additional JSON tools. OjG is optimized to processing huge data sets where data does not necessarily conform to a fixed structure.
Быстрый парсер и валидатор JSON для Golang:
Fast JSON validator (7 times faster with io.Reader).
Из интересного, есть поддержка выборки по выражениям JSONPath — некий аналог XPath для XML:
x, err := jp.ParseString("a[?(@.x > 1)].y")
ys := x.Get(obj)
// returns [4]
Есть готовый пакет в официальном репозитории Golang и судя по истории коммитов — проект активно развивается.
simdjson
https://github.com/simdjson/simdjson
Напоследок расскажу про один большой и достаточно известный проект, написанный на C++ 17 и нашедший широкое применение в самых разнообразных движках СУБД, веб-серверах и фреймворках:
Parsing gigabytes of JSON per second : used by Facebook/Meta Velox, the Node.js runtime, ClickHouse, WatermelonDB, Apache Doris, Milvus, StarRocks
Да, теперь вы тоже знаете одну из причин высокой производительности ClickHouse:
Record Breaking Features: Minify JSON at 6 GB/s, validate UTF-8 at 13 GB/s, NDJSON at 3.5 GB/s.
У этой библиотеки есть широчайший набор биндингов для самых разных языков, а также несколько интересных портов на другие языки, например на Zig и Java.
И все это активно развивается.
Разумеется эта библиотека есть в пакетах FreeBSD:

P.S.
Более развернутый и менее цензурный оригинал статьи с примерами кода можно найти в нашем блоге, в качестве эпилога хочу заметить, что есть серьезная причина, по которой подобные низкроуровневые библиотеки не используются массово.
Эта причина называется отладкой:
битые и кривые данные, неверные кодировки, специально подготовленные «бомбы» для организации DDOS — отлаживать все эти современные радости с такой библиотекой на ассемблере могут позволить себе только самые отбитые проекты.
Или самые богатые.
Поэтому если у вас нет в родственниках арабских шейхов или калифорнийских миллиардеров — не стоит тащить описанные выше библиотеки в ваш реальный продакшн.
Оставьте столь тонкий тюнинг компании Netflix с их сказочными бюджетами и просто наслаждайтесь в качестве зрителя.
Поехали.
kxl
Либо генератор картинок подрос, либо автор наконец-то нашел живую модель :)