SELF: программа как SQLite-база данных

Queryable Executables

SELF: программа как SQLite-база данных

Формат SELF превращает исполняемый файл в SQLite-базу данных, что позволяет хранить код, состояние и данные в одном файле. Автор представляет self-httpd — веб-сервер, который работает из одного файла, записывает логи посещений и нажатия кнопок в собственную базу, а также позволяет редактировать сайт на лету с помощью SQL-транзакций. Демонстрация доступна на selfdb.exe.xyz.

Программа — это база данных, а база данных — это программа.
  1. larodi

    >Я поражён тем, как много всего сводится к одной единственной области: SQL.

    Возможно, правильнее было бы сказать "все данные, включая код, представимы в виде таблиц, даже если они являются графом" или "всё сводится к таблицам" или даже "реляционная алгебра — это всё, что нужно", но я решительно не согласен с тем, что SQL является областью сам по себе, и что всё (всё) сводится к такой области.

    Можно таким же образом свести сегментные таблицы к DATALOG, который также является производным от PROLOG. Так что тогда демонстрируемое здесь — это "всё, возможно, сводится к грамматикам". Это не ново, но есть множество инженерных деталей и прочих нюансов, которые нужно учесть, чтобы такая модель была жизнеспособной для крупномасштабного развёртывания. И проблема в том, что не так-то просто делать выводы о грамматиках, прежде чем их развернуть/вывести.

    Не поймите меня неправильно — я люблю SQL и уважаю SQLite и DuckDB за то, чем они являются. То, что мы здесь видим, — это один очень любопытный подход и отличная демонстрация.

  2. yjftsjthsd-h

    > Мы можем свести не только целый дистрибутив, но и всё состояние каждого приложения в один файл, устраняя необходимость в /var/, /tmp/, /home/ или любой другой файловой системе. Программа может хранить своё собственное состояние в том же файле, из которого она запускается, и делать это транзакционно.

    С одной стороны: я не думаю, что хочу этого. Включение статического контента в бинарник, безусловно, имеет смысл. Однако хранение изменяемых данных времени выполнения там кажется грязным; я предпочитаю бинарник только для чтения, которому передаётся каталог состояния для записи (стоит сказать, что я провёл много времени с nix и другими неизменяемыми дистрибутивами).

    С другой стороны: это самое крутое и забавное, что я видел за долгое время, и я absolutely хочу, чтобы это развили на 1000% дальше. Кому нужны идеально отлаженные неизменяемые развёртывания, когда в воздухе витает дух хакерства?

    Готов поспорить, что это можно использовать вместе с другой вещью, которую делает APE: толстые бинарники. Если текст программы живёт в базе данных, что стоит одна дополнительная строка? Просто

    SELECT text FROM executable WHERE arch = $(uname -m)

    и погнали:)

    Изм.: на самом деле, при дальнейшем размышлении это кажется идеальным для Smalltalk; можно поместить VM и образ в один файл.

  3. rao-v

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

    Абсолютно замечательная работа.

  4. jdub

    Вместо постобработки бинарника для добавления схемы приложения (не SELF) можно запускать миграции базы данных перед обработкой запросов. Таким образом, при каждом запуске процесса приложение создаёт и/или обновляет свою собственную схему.

    Процесс обновления SELF (хех, самообновление) и отката мог бы выиграть от... более... изящных... манёвров.

    В вашем примере новый бинарник копирует старые данные в себя, но затем вам нужно переместить новый бинарник в место развёртывания. Это означает простой из-за остановки сервиса, миграции данных, замены файла и запуска сервиса.

    Что если процесс обновления был бы больше похож на... запись новых данных SELF в старый бинарник, отправку SIGHUP, а затем сервис делает fork+exec сам себя, осуществляя передачу файловых дескрипторов с нулевым временем простоя, как в HAProxy?

    Замена данных SELF в существующем файле сейчас безопасна, потому что нельзя отображать сегменты в память. Но если вы в конечном итоге придумаете какой-нибудь умный способ с выравниванием BLOB для mmap, вы сможете выполнять обновление SELF как миграцию данных! INSERT сегментов/символов, fork+exec, и миграция данных вычищает старый код. :-D

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

    Выравнивание BLOB также должно означать более эффективную раздачу статических ресурсов и кучу других приятностей... определённо стоит исследовать.

    Однако — очень сильное однако — как бы это ни было забавно, я бы никогда, никогда, никогда не позволил...

  5. JaumeGreen

    Так это как образ программы в Lisp, APL или Smalltalk, но с SQL в качестве движущей силы.

    Всё старое снова новое. И я не имею в виду это в уничижительном смысле. Есть много "старых" идей, которые просто великие идеи, не победившие в своё время, но которые могут вернуться с силой в будущем.

Ещё за этот день

2026-08-26