
न्यूनतम मशीन आर्किटेक्चर जिसमें LLVM कंपाइलर बैकएंड, Linux पोर्ट, और वर्चुअल मशीन है, जो स्व-निहित सॉफ्टवेयर कैप्सूल बनाने के लिए है जो जटिल निर्भरताओं के बिना अनिश्चित काल तक चलने योग्य रहते हैं।
यह Eternal Software Initiative के लिए मूल रिपॉजिटरी है।
ESI एक न्यूनतम मशीन आर्किटेक्चर परिभाषित करता है (Subleq OISC के संशोधन पर आधारित) जो इतना सरल है कि इसके पूर्ण विनिर्देश को एक नैपकिन पर लिखा जा सकता है। हम फिर इस आर्किटेक्चर के लिए एक LLVM कंपाइलर बैकएंड, Linux का एक पोर्ट, C/C++ रनटाइम लाइब्रेरी के पोर्ट, और अन्य उपकरण (जिसमें C की ~50 पंक्तियों में एक संदर्भ वर्चुअल मशीन कार्यान्वयन शामिल है) प्रदान करते हैं, जो मौजूदा सॉफ्टवेयर से एक स्व-निहित 'कैप्सूल' बनाने और चलाने के लिए आवश्यक हैं।
इस सबका उद्देश्य क्या है? आज के सॉफ्टवेयर को चलाने के लिए मालिकाना और अपूर्ण रूप से प्रलेखित हार्डवेयर के शीर्ष पर निर्भरताओं (कंपाइलर, लाइब्रेरी, फ्रेमवर्क, OS) का एक जटिल ढेर आवश्यक है, जिससे यह सुनिश्चित करना बहुत मुश्किल हो जाता है कि आज का सॉफ्टवेयर भविष्य में काम करता रहेगा। 'बिट रॉट' की यह समस्या किसी भी व्यक्ति को अच्छी तरह से ज्ञात है जो वर्षों या दशकों में लीगेसी सॉफ्टवेयर का रखरखाव करता है, लेकिन अब एक ऐसे इतिहासकार की कल्पना करें जो 1,000 साल बाद 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
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 फ़ोल्डर में प्रारंभ करें।
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
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
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
cd ../runtime
./build_and_install_runtime.sh
./build_libcxx.sh
ninja -C ./libcxx install
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
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
cd ..
python3 tools/make_boot_image.py --stack-size 536870912 linux/vmlinux
./vm/vm linux/vmlinux.bootimage
समाप्त होने पर VM को समाप्त करने के लिए exit टाइप करें।
मानक क्रॉस-संकलन कार्यप्रवाह। जल्दी शुरू करने के लिए, हम एक सुविधा स्क्रिप्ट (clang_userspace.sh) प्रदान करते हैं जो वातावरण सेट करती है और clang को कॉल करती है।
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
वर्तमान के डेवलपर्स के लिए आर्किटेक्चर और टूलचेन को समझने हेतु प्रदान किया गया है। 1,000 साल बाद किसी व्यक्ति के लिए कैप्सूल को पुनर्जीवित करने और उसमें सॉफ्टवेयर चलाने के लिए इसमें से कुछ भी (नैपकिन को छोड़कर) आवश्यक नहीं है।
यदि आपने ESI वर्चुअल मशीन को किसी नए प्लेटफ़ॉर्म पर पोर्ट किया है, तो कृपया हमें एक Issue दर्ज करके बताएं और हम इसे इस सूची में जोड़ देंगे।
ESI वर्चुअल मशीन का एक संक्षिप्त संस्करण (C के 366 बाइट्स में) 29वीं IOCCC प्रतियोगिता का विजेता था।