SELF: 실행 파일을 SQLite 데이터베이스로 만드는 '실제로 쿼리 가능한 실행 파일'
Queryable Executables

fzakaria의 SELF 포맷은 실행 파일 자체를 SQLite 데이터베이스로 만든다. binfmt_misc를 통해 커널이 파일을 해석하고, 프로그램은 자신의 코드와 상태를 같은 파일에 저장할 수 있다. proof-of-concept인 self-httpd는 단일 파일로 웹서버 역할을 하며, 방문자 로그와 버튼 클릭 수를 SQL로 조회할 수 있다. 배포는 파일 하나를 scp하는 것과 같고, 데이터 마이그레이션은 SQL INSERT로 처리된다. 이는 Justine Tunney의 redbean에서 영감을 받았지만, ZIP 대신 데이터베이스를 컨테이너로 사용한다.
프로그램이 데이터베이스이고, 데이터베이스가 프로그램이다.
HN 토론
86- punnerud
저는 이 비유를 염두에 두고 Rust로 SQLite 클론을 만들었습니다. SQLite와 달리 파일에 각각 별도의 세그먼트를 부여하여 여러 작성자를 지원합니다. 이 프로그래밍 '언어'를 PySpell이라고 부르며, Python을 AST로 변환한 다음 Rust로 변환합니다. 데이터베이스와 프로그래밍 언어가 같은 공간에 있을 때 활성화할 수 있는 멋진 기능이 많이 있습니다.
- larodi
>SQL이라는 단일 도메인으로 얼마나 많은 것이 압축되는지 놀랍습니다.
아마도 '코드를 포함한 모든 데이터는 그래프임에도 불구하고 테이블로 표현 가능하다' 또는 '모든 것이 테이블로 귀결된다' 또는 '관계 대수만 있으면 된다'고 말하는 것이 더 정확할 것입니다. 그러나 SQL이 그 자체로 하나의 도메인이고 모든 것이 그 도메인으로 압축된다는 주장에는 강하게 동의하지 않습니다.
세그먼트 테이블을 DATALOG로도 압축할 수 있는데, DATALOG는 PROLOG의 파생물이기도 합니다. 그렇다면 여기서 보여주는 것은 '모든 것이 어쩌면 문법으로 압축된다'는 것이 될 텐데, 이는 새로운 것이 아닙니다. 그러나 그러한 모델을 대규모 배포에 viable하게 만들기 위해 고려해야 할 엔지니어링 세부 사항과 기타 사항이 많습니다. 그리고 문제는 문법에 대해 설명하거나 추론하기 전에는 문법에 대해 추론하기가 쉽지 않다는 것입니다.
오해하지 마세요. 저는 SQL을 사랑하고 SQLite와 DuckDB가 무엇인지 존중합니다. 여기서 보는 것은 매우 흥미로운 접근 방식이자 훌륭한 데모입니다.
- yjftsjthsd-h
> 우리는 완전한 배포판뿐만 아니라 모든 애플리케이션의 모든 상태를 단일 파일로 압축하여 /var/ 또는 /tmp/ 또는 /home/ 또는 다른 파일 시스템의 필요성을 없앨 수 있습니다. 프로그램은 자신의 상태를 실행 중인 파일에 저장할 수 있으며, 트랜잭션 방식으로 그렇게 할 수 있습니다.
한편으로는: 저는 그것을 원하지 않는다고 생각합니다. 바이너리에 정적 콘텐츠를 포함하는 것은 확실히 말이 됩니다. 그러나 쓰기 가능한 런타임 데이터를 거기에 저장하는 것은 지저분하게 느껴집니다. 저는 쓰기 가능한 상태 디렉토리를 전달받는 읽기 전용 바이너리를 선호합니다 (저는 nix 및 다른 불변 배포판과 많은 시간을 보냈다고 말할 가치가 있습니다).
다른 한편으로는: 이것은 오랜만에 본 가장 멋지고 재미있는 것이며, 저는 이것이 1000% 더 발전하는 것을 절대적으로 보고 싶습니다. 완벽하게 운영화된 불변 배포가 무슨 상관이겠습니까, 해커 정신이 공중에 떠 있을 때?
APE가 하는 또 다른 일인 팻 바이너리와 함께 이것을 사용할 수 있을 것이라고 장담합니다. 프로그램 텍스트가 데이터베이스에 있다면, 행 하나 더 추가하는 것이 무엇이겠습니까? 그냥
SELECT text FROM executable WHERE arch = $(uname -m)
하면 끝입니다:)
편집: 사실 더 생각해 보면 이것은 스몰토크에 완벽하게 어울립니다. VM과 이미지를 단일 파일에 넣을 수 있으니까요.
- rao-v
이것은 정신 나간 것이고, 어리석은 것에 아슬아슬하게 가까워서, 올해 해커 뉴스에서 본 것 중 최고 중 하나입니다.
정말 멋진 일입니다.
- jdub
애플리케이션(비-SELF) 스키마를 추가하기 위해 바이너리를 후처리하는 대신, 요청을 처리하기 전에 데이터베이스 마이그레이션을 실행할 수 있습니다. 따라서 프로세스를 시작할 때마다 앱이 자신의 스키마를 생성하거나 업그레이드합니다.
SELF 업그레이드(헤, 셀프 업그레이드) 및 롤백 프로세스는 좀 더... 화려한... 발놀림의 혜택을 받을 수 있습니다.
귀하의 예시에서는 새 바이너리가 이전 데이터를 복사하지만, 새 바이너리를 배포 위치로 이동해야 합니다. 이는 서비스 중지, 데이터 마이그레이션, 파일 교체, 서비스 시작을 통한 중단을 의미합니다.
업그레이드 프로세스가... 이전 바이너리에 새 SELF 데이터를 쓰고, SIGHUP을 보낸 다음, 서비스가 fork+exec를 수행하면서 haproxy와 같은 제로 다운타임 FD 핸드오버를 수행하는 것은 어떨까요?
기존 파일의 SELF 데이터를 교체하는 것은 현재 안전합니다. 메모리에 mmap 세그먼트를 매핑할 수 없기 때문입니다. 그러나 영리한 BLOB 정렬 mmap 작업을 알아낸다면 SELF 업그레이드를 데이터 마이그레이션처럼 수행할 수 있습니다! INSERT 세그먼트/심볼, fork+exec, 그리고 데이터 마이그레이션이 이전 코드를 정리합니다. :-D
SELF 스키마를 업데이트하여 여러 세그먼트 및 심볼 세트를 허용하면 이 업그레이드 트릭이 가능해지지만, 다른 멋진 일들도 할 수 있습니다... 코드 세그먼트만 다른 얇은 멀티 아치 바이너리.
BLOB 정렬은 또한 더 효율적인 정적 자산 제공과 다른 많은 이점을 의미해야 합니다... 확실히 조사할 가치가 있습니다.
그러나 -- 매우 강한 그러나 -- 이것이 재미있는 만큼, 나는 절대, 절대, 절대 int [...]을 허용하지 않을 것입니다.