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

Формат SELF превращает исполняемый файл в SQLite-базу данных, что позволяет хранить код, состояние и данные в одном файле. Автор представляет self-httpd — веб-сервер, который работает из одного файла, записывает логи посещений и нажатия кнопок в собственную базу, а также позволяет редактировать сайт на лету с помощью SQL-транзакций. Демонстрация доступна на selfdb.exe.xyz.
Программа — это база данных, а база данных — это программа.
- larodi
>Я поражён тем, как много всего сводится к одной единственной области: SQL.
Возможно, правильнее было бы сказать "все данные, включая код, представимы в виде таблиц, даже если они являются графом" или "всё сводится к таблицам" или даже "реляционная алгебра — это всё, что нужно", но я решительно не согласен с тем, что SQL является областью сам по себе, и что всё (всё) сводится к такой области.
Можно таким же образом свести сегментные таблицы к DATALOG, который также является производным от PROLOG. Так что тогда демонстрируемое здесь — это "всё, возможно, сводится к грамматикам". Это не ново, но есть множество инженерных деталей и прочих нюансов, которые нужно учесть, чтобы такая модель была жизнеспособной для крупномасштабного развёртывания. И проблема в том, что не так-то просто делать выводы о грамматиках, прежде чем их развернуть/вывести.
Не поймите меня неправильно — я люблю SQL и уважаю SQLite и DuckDB за то, чем они являются. То, что мы здесь видим, — это один очень любопытный подход и отличная демонстрация.
- yjftsjthsd-h
> Мы можем свести не только целый дистрибутив, но и всё состояние каждого приложения в один файл, устраняя необходимость в /var/, /tmp/, /home/ или любой другой файловой системе. Программа может хранить своё собственное состояние в том же файле, из которого она запускается, и делать это транзакционно.
С одной стороны: я не думаю, что хочу этого. Включение статического контента в бинарник, безусловно, имеет смысл. Однако хранение изменяемых данных времени выполнения там кажется грязным; я предпочитаю бинарник только для чтения, которому передаётся каталог состояния для записи (стоит сказать, что я провёл много времени с nix и другими неизменяемыми дистрибутивами).
С другой стороны: это самое крутое и забавное, что я видел за долгое время, и я absolutely хочу, чтобы это развили на 1000% дальше. Кому нужны идеально отлаженные неизменяемые развёртывания, когда в воздухе витает дух хакерства?
Готов поспорить, что это можно использовать вместе с другой вещью, которую делает APE: толстые бинарники. Если текст программы живёт в базе данных, что стоит одна дополнительная строка? Просто
SELECT text FROM executable WHERE arch = $(uname -m)
и погнали:)
Изм.: на самом деле, при дальнейшем размышлении это кажется идеальным для Smalltalk; можно поместить VM и образ в один файл.
- rao-v
Это безумно и опасно близко к глупости, что делает это одной из лучших вещей, которые я видел на Hacker News в этом году.
Абсолютно замечательная работа.
- jdub
Вместо постобработки бинарника для добавления схемы приложения (не SELF) можно запускать миграции базы данных перед обработкой запросов. Таким образом, при каждом запуске процесса приложение создаёт и/или обновляет свою собственную схему.
Процесс обновления SELF (хех, самообновление) и отката мог бы выиграть от... более... изящных... манёвров.
В вашем примере новый бинарник копирует старые данные в себя, но затем вам нужно переместить новый бинарник в место развёртывания. Это означает простой из-за остановки сервиса, миграции данных, замены файла и запуска сервиса.
Что если процесс обновления был бы больше похож на... запись новых данных SELF в старый бинарник, отправку SIGHUP, а затем сервис делает fork+exec сам себя, осуществляя передачу файловых дескрипторов с нулевым временем простоя, как в HAProxy?
Замена данных SELF в существующем файле сейчас безопасна, потому что нельзя отображать сегменты в память. Но если вы в конечном итоге придумаете какой-нибудь умный способ с выравниванием BLOB для mmap, вы сможете выполнять обновление SELF как миграцию данных! INSERT сегментов/символов, fork+exec, и миграция данных вычищает старый код. :-D
Обновление схемы SELF для поддержки нескольких наборов сегментов и символов позволило бы использовать этот трюк с обновлением, но также могло бы делать другие причудливые вещи... тонкие мультиархитектурные бинарники, где отличаются только сегменты кода.
Выравнивание BLOB также должно означать более эффективную раздачу статических ресурсов и кучу других приятностей... определённо стоит исследовать.
Однако — очень сильное однако — как бы это ни было забавно, я бы никогда, никогда, никогда не позволил...
- JaumeGreen
Так это как образ программы в Lisp, APL или Smalltalk, но с SQL в качестве движущей силы.
Всё старое снова новое. И я не имею в виду это в уничижительном смысле. Есть много "старых" идей, которые просто великие идеи, не победившие в своё время, но которые могут вернуться с силой в будущем.