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

Так выглядит парсер JSON на чистом ассемблере под FreeBSD. Теперь вы видели все.
Так выглядит парсер JSON на чистом ассемблере под FreeBSD. Теперь вы видели все.

Зачем

Вообще говоря эти популярные форматы — XML и JSON давно и повсеместно используются разработчиками без оглядки на такие «мелочи» как потребление памяти или загрузка CPU.

И уж тем более без заморочек с низкоуровневой оптимизацией.

Но тем интереснее посмотреть на то, что может получиться, если реализацию XML/JSON парсера доверить человеку, владеющему черной магией ассемблером.

Хотя наверное описанные ниже проекты уже не несут никакого практического смысла в современных реалиях — зачем вам сверхбыстрая обработка данных, если все остальное у вас в проекте тормозит, падает и глючит?

Так что стоит воспринимать их лишь как образцы хорошего вкуса и остатков инженерной культуры. Чтобы помнили как это было и знали что такое еще возможно.

Тестовый стенд

Понта ради чтобы подсветить возможные проблемы совместимости, в качестве стенда использовалась FreeBSD 14, а не более обыденный Linux.

В зависимости от типа проекта, сборка осуществлялась как с помощью обычного gcc так и с clang и/или nasm, jasm и так далее.

XML.C

https://github.com/ooxi/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 — думаю хотя-бы о части этих знаменитых компьютеров вы точно слышали:

Так выглядела игровая консоль вашего дедушки - Atari 2600.
Так выглядела игровая консоль вашего дедушки - Atari 2600.

Так вот данный проект реализует парсер JSON для всех этих замечательных машин из далекого прошлого.

Как тебе такое, Илон Маск?

Для сборки нужен уже упомянутый кросс-компилятор cc65, исходники которого находятся на Github.

Специфика FreeBSD

Компилятор сс65 присутствует в пакетах, поэтому его можно установить в систему без заморочек со сборкой из исходников:

pkg install cc65

В пакете cc65 идет также симулятор sim65, позволяющий запустить собранное приложение для 6502 процессора.

Так это выглядит в работе с использованием симулятора:

Один из собранных тестовых приложений, в работе на FreeBSD. Слева - исходник.
Один из собранных тестовых приложений, в работе на FreeBSD. Слева - исходник.

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, так что зависимостей от ОС тут нет.

Один единственный файл с исходником на ассемблере и еще один заголовочный, с описанием функций — весь проект.

Часть исходного кода и тестовое приложение в работе:

Так выглядит разбор JSON-строки на ассемблере. Справа - в действии.
Так выглядит разбор JSON-строки на ассемблере. Справа - в действии.

AsmXml

https://tibleiz.net/asm-xml/

108Кб

Следущий проект — реализация парсера XML на чистом ассемблере:

AsmXml is a very fast XML parser and decoder for x86 platforms (Windows, Linux, BSD and Mac OS X).

Проект старый (разработка идет с 2008 года) и довольно известный.

Как-то так выглядит запуск тестового приложения с использованием этой библиотеки:

Так выглядит чтение заголовка DOCTYPE на ассемблере (слева)
Так выглядит чтение заголовка DOCTYPE на ассемблере (слева)

У проекта есть рекорды скорости обработки:

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

Проект относительно новый и я не стал бы тратить на него время, если бы не одно «но»:

Этот самый 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:

Как видите, в пакетах есть даже готовый биндинг для Python.
Как видите, в пакетах есть даже готовый биндинг для Python.

P.S.

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

Эта причина называется отладкой:

битые и кривые данные, неверные кодировки, специально подготовленные «бомбы» для организации DDOS — отлаживать все эти современные радости с такой библиотекой на ассемблере могут позволить себе только самые отбитые проекты.

Или самые богатые.

Поэтому если у вас нет в родственниках арабских шейхов или калифорнийских миллиардеров — не стоит тащить описанные выше библиотеки в ваш реальный продакшн.

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

Поехали.

Комментарии (1)


  1. kxl
    09.11.2025 11:48

    Либо генератор картинок подрос, либо автор наконец-то нашел живую модель :)