科学・技術
Subleqワンインストラクションセットコンピュータに基づく永続ソフトウェアイニシアチブ
Eternal Software Initiative Based on Subleq One-Instruction-Set Computer (github.com)
要約
Eternal Software Initiative(ESI)は、1000年後でもソフトウェアを実行可能にするという目標を掲げ、非常にシンプルなワンインストラクションセットコンピュータ(Subleqの変種)アーキテクチャを定義しています。このアーキテクチャ向けにLLVMコンパイラバックエンドやLinuxカーネルのポートなどを開発し、既存のソフトウェアを自己完結型の「カプセル」にコンパイルすることで、将来の世代が現代のソフトウェアを理解・実行できるようにすることを目指しています。
全文翻訳
はじめに
これはEternal Software Initiativeのルートリポジトリです。
ESIは、その完全な仕様をナプキンに書き留めることができるほどミニマルなマシンアーキテクチャ(Subleq OISCの修正に基づいたもの)を定義しています。その後、このアーキテクチャ向けのLLVMコンパイラバックエンド、Linuxのポート、C/C++ランタイムライブラリのポート、および既存のソフトウェアから自己完結型の「カプセル」を構築および実行するために必要なその他のツール(約50行のC言語によるリファレンス仮想マシン実装を含む)を提供します。
これのポイントは何でしょうか?
今日のソフトウェアを実行するには、プロプライエタリで不完全に文書化されたハードウェアの上に、コンパイラ、ライブラリ、フレームワーク、OSといった複雑な依存関係のスタックが必要です。これにより、今日のソフトウェアが将来も動作し続けることを保証することが非常に困難になっています。
この「ビットロット」の問題は、数年から数十年という期間でレガシーソフトウェアを保守している人なら誰でも知っていますが、今、1000年後の歴史家が21世紀の生活を理解しようとしていると想像してみてください。その生活の多くはソフトウェアを通じて経験されています。今日のソフトウェアバイナリが保存されていたとしても、それらのバイナリがまだ実行可能であると想像するのは困難です。
QEMUのようなエミュレータは、この問題を回避しますが、解決しません。それらも同様に複雑なソフトウェアとハードウェアの依存関係のスタックを持っており、したがって将来も実行可能ではありません。
ESIは、(1)ナプキンに書き留めることができるほどシンプルでありながら、あらゆるソフトウェアを効率的に表現するのに十分な強力さを持ち、プロプライエタリなハードウェア、ソフトウェア、フレームワークなどの知識を必要としないアーキテクチャを定義し、(2)既存のソフトウェアをこのアーキテクチャ用の自己完結型「カプセル」にコンパイルするためのツールチェーンを実装することによって、この問題を解決します。
これにより、カプセルバイナリとナプキンに書かれた指示が保存されていれば、ソフトウェアは現代のコンピューティングシステムに関する知識を一切仮定することなく、遠い未来で復元され、体験されることが保証されます。
このリポジトリには、ESIマシンを構築・実行し、既存のソフトウェアからESI「カプセル」を構築するために必要なすべてが含まれています。
ESIのミッションの詳細については、以下をご覧ください:https://www.eternal-software.org
チェックアウト
このリポジトリには、サブモジュールとして、LLVMツールチェーン、Linuxカーネル、uClibc-ng、BusyboxのESIフォークが含まれています。これらはすべて一緒にチェックアウトする必要があります。
git clone --recurse-submodules https://github.com/adriancable/eternal
VMのビルドと試用
ESI仮想マシンをビルドするにはSDL3が必要です。例えば apt install libsdl3-dev でインストールしてください。他に依存関係はありません。SDL3は、ピクセルを書き込んだりキーボードイベントをキャプチャしたりするための他の手段で、今でも将来でも簡単に置き換えることができます。
cd eternal/vm
make
xz -d ../capsules/vmlinux.bootimage.xz
./vm ../capsules/vmlinux.bootimage
Linuxが起動したら、例えば以下を試してください:
cd doom
./doom
ツールチェーンのビルド
ESIツールチェーンは、最小限の労力でどのLinuxシステム上でもビルドできるはずです。macOS上でも、いくつかの変更を加えてビルドに成功しています。gcc、python3、CMake、ninja、flex、bisonがインストールされていて動作することを確認してください。
チェックアウトしたeternalフォルダから開始してください。
ステップ1:ESI LLVMのビルド
rm -rf llvm-project/build && mkdir -p llvm-project/build
cmake -G Ninja -S llvm-project/llvm -B llvm-project/build -DLLVM_ENABLE_PROJECTS="clang;lld" -DLLVM_BUILD_TOOLS=ON -DLLVM_ENABLE_ASSERTIONS=OFF -DCMAKE_BUILD_TYPE=Release -DLLVM_TARGETS_TO_BUILD="" -DLLVM_EXPERIMENTAL_TARGETS_TO_BUILD="Subleq" -DLLVM_DEFAULT_TARGET_TRIPLE="subleq-unknown-linux" -DLLVM_FORCE_VC_REPOSITORY="ESI" -DLLVM_FORCE_VC_REVISION=""
cd llvm-project/build
ninja llc clang llvm-mc lld llvm-objcopy llvm-ar llvm-ranlib llvm-nm llvm-readelf llvm-strip llvm-objdump
ステップ2:Linuxカーネルヘッダーのインストール
cd ../../linux
make ARCH=subleq \
CC=../llvm-project/build/bin/clang \
LD=../llvm-project/build/bin/ld.lld \
AR=../llvm-project/build/bin/llvm-ar \
NM=../llvm-project/build/bin/llvm-nm \
OBJCOPY=../llvm-project/build/bin/llvm-objcopy \
INSTALL_HDR_PATH=../runtime/sysroot/kernel-headers \
headers_install
ステップ3:ESI Cランタイム(uClibc-ng)のビルドとインストール
cd ../uclibc-ng
make ARCH=subleq defconfig
make ARCH=subleq \
CC=../llvm-project/build/bin/clang \
LD=../llvm-project/build/bin/ld.lld \
AR=../llvm-project/build/bin/llvm-ar \
NM=../llvm-project/build/bin/llvm-nm \
PREFIX=../runtime/sysroot \
STRIPTOOL=../llvm-project/build/bin/llvm-strip \
DEVEL_PREFIX=/
install_dev
ステップ4:ESIコアランタイム(CPU、FPU、C++)のビルド
cd ../runtime
./build_and_install_runtime.sh
./build_libcxx.sh
ninja -C ./libcxx install
ステップ5:Busyboxのビルド
cd ../busybox
make subleq_defconfig
make CC=../llvm-project/build/bin/clang \
AR=../llvm-project/build/bin/llvm-ar \
STRIP=../llvm-project/build/bin/llvm-strip
mkdir ../initramfs_root/bin
cp busybox ../initramfs_root/bin/busybox
ステップ6:ESI Linuxのビルド
cd ../linux
export KBUILD_BUILD_USER="root"
export KBUILD_BUILD_HOST="eternal"
make ARCH=subleq \
CC=../llvm-project/build/bin/clang \
LD=../llvm-project/build/bin/ld.lld \
AR=../llvm-project/build/bin/llvm-ar \
NM=../llvm-project/build/bin/llvm-nm \
OBJCOPY=../llvm-project/build/bin/llvm-objcopy \
defconfig
make ARCH=subleq \
CC=../llvm-project/build/bin/clang \
LD=../llvm-project/build/bin/ld.lld \
AR=../llvm-project/build/bin/llvm-ar \
NM=../llvm-project/build/bin/llvm-nm \
OBJCOPY=../llvm-project/build/bin/llvm-objcopy
ステップ7:カプセルのビルドとVMの実行
cd ..
python3 tools/make_boot_image.py --stack-size 536870912 linux/vmlinux
./vm/vm linux/vmlinux.bootimage
VMを終了するには、終了時にexitと入力してください。
独自のソフトウェアのコンパイルと実行
標準的なクロスコンパイルワークフローです。
素早く始めるために、環境を設定してclangを呼び出す便利なスクリプト(clang_userspace.sh)を提供しています。
cat << 'EOF' > hello.c
#include <stdio.h>
int main() {
printf("Hello, ESI world!\n");
return 0;
}
EOF
tools/clang_userspace.sh hello.c
cp hello.elf initramfs_root/root
次にinitramfsとカプセルを再ビルドします:
cd linux
make ARCH=subleq \
CC=../llvm-project/build/bin/clang \
LD=../llvm-project/build/bin/ld.lld \
AR=../llvm-project/build/bin/llvm-ar \
NM=../llvm-project/build/bin/llvm-nm \
OBJCOPY=../llvm-project/build/bin/llvm-objcopy
cd ..
python3 tools/make_boot_image.py --stack-size 536870912 linux/vmlinux
VMを起動します:
./vm/vm linux/vmlinux.bootimage
Linuxが起動したら、以下を試してください:
./hello.elf
技術ドキュメント
今日の開発者がアーキテクチャとツールチェーンを理解するために提供されています。
1000年後の人がカプセルを復元して中のソフトウェアを実行するために必要なのは、この(ナプキンを除く)何もありません。
ナプキン
ESIマシンアーキテクチャリファレンス
LLVMバックエンドポートリファレンス
Linuxカーネルポートリファレンス
ESI仮想マシン
ポート
WebAssembly - ブラウザでESI Linuxを試す
ESI仮想マシンを新しいプラットフォームにポートした場合は、Issueを提出してお知らせください。このリストに追加します。
IOCCC
ESI仮想マシンのミニマイズされたバージョン(366バイトのC言語)が、第29回IOCCCコンペティションで受賞しました。