Модулі та Self Type
Абстракції Axiom будуються через compile-time contracts та Self Type, а не через vtable-oriented OOP.
Self Type потрібен, щоб один і той самий високорівневий код працював з Linux, Windows, INVARIANT OS або bare-metal implementation без runtime polymorphism.
Інтерфейс файлів
1file_system(Self):2 read(Self self, text path) -> result<bytes, io_error>3 write(Self self, text path, view<const u8> data) -> result<void, io_error>4END file_systemSelf означає concrete implementation type, який буде відомий під час semantic linking.
Інтерфейс описує required operation.
Друга required operation.
Немає hidden vtable або heap object.
Linux implementation
1linux_fs:2 read(linux_fs self, text path) -> result<bytes, io_error>:3 RETURN linux_os.read_file(path)45 write(linux_fs self, text path, view<const u8> data) -> result<void, io_error>:6 RETURN linux_os.write_file(path, data)7END linux_fsConcrete type.
Signature задовольняє Self interface.
OS-specific module робить syscall/ABI lowering.
Те саме для write.
Generic application code
1-- FS enable if file_system(FS)2load_config(FS fs, text path) -> result<config, app_error>:3 const bytes raw = fs.read(path)?4 RETURN config.parse(raw)Generic параметр приймається лише якщо implementation задовольняє interface.
Код не знає, Linux це чи INVARIANT OS.
Static dispatch до concrete read визначиться при linking.
Далі звичайна логіка програми.
Навіщо semantic linking
Звичайний linker знає symbols і relocations, але не знає про Self Type, contracts, generic instantiations чи ownership. Тому Axiom спершу робить semantic/module linking, і лише потім target lowering та binary linking.