Класс обязан явно объявить, какие интерфейсы он реализует. Компилятор проверяет соответствие по имени
Тип считается реализующим интерфейс, если предоставляет нужные методы — без явного объявления
Выражения читаются слева направо, операторы работают со стеком значений
Int, Nat, Real, Dict, List, Tuple, Code, Ref и Meta-типы нулевого размера
Интроспекция структур, статическая рекурсия, прямое управление памятью
ucall · статическая рекурсияcallField · интроспекция полейstorageAddress · работа с памятьюvirtual · значения нулевого размераЯвные интерфейсы уже реализованы без модификации mplc. Неявные — следующий логичный шаг
В литературе описаны либо «Go изнутри», либо подходы, встроенные в компилятор (Rust-трейты, C++-concepts). Промежуточный путь — через инструменты языка — остаётся белым пятном
Меньше обязательных зависимостей между модулями — легче масштабировать и сопровождать большие проекты
implements)impl Trait for Type)dyn Trait — динамическаяinterface / implementinterface формирует vtable и CALL-кодблок. implement связывает интерфейс с конкретным типом. Префикс памяти интерфейсной и реализационной частей совпадает — приведение типа реализации к базовому работает автоматическиУ класса ровно один base из-за совпадения префикса памяти
После implement объект уже не интерфейс — нельзя построить иерархию «b реализует a, c реализует b»
DIE, нет INITИнтерфейс умеет освобождать память, но не инициализировать объект — не работает напрямую с Array
OwnerУниверсальная обёртка владения с захардкоженным .lower
Постоянные .lower, .init, дополнительные подключения в каждом файле
.wrapСделать интерфейсы «прозрачными» — перегрузить встроенные set (побайтовое копирование) и same (проверка типов). Тогда контейнеры сами бы оборачивали объекты
implicitInterface.mpl во всех файлах — это модификация стандартных контейнеровset, ложные same, трудноуловимые ошибки.wrap
implicitInterface и оживление заглушекINTERFACE_DATA — указатель на реальные данныеINTERFACE_SIZE — размер блока данныхmethod.i_IMPL — codeRef-заглушки с суффиксом _IMPLCALL_IMPL / CALL — если интерфейс CallableDESTRUCT, DIE, INIT — управление временем жизни.wrap оживляет заглушки_IMPL-заглушки.wrapINTERFACE_DATA к конкретному типуcallField — имитация vtableimplicitInterfaceОбёртка создаётся внешним кодом, не фиксируется в типе. Один класс можно обернуть в несколько интерфейсов
Объекты после .wrap помещаются в Array, HashTable — без Owner, .lower и прочей обвязки
Класс-реализация может не знать о существовании интерфейса — ключевая идея структурной типизации
Интерфейс содержит собственные INIT, DIE, DESTRUCT. Управление временем жизни — внутри интерфейса
Array и HashTableТипичное расширение проекта без изменения структуры
Дубликаты getName, нигде не вызываются
Разные имена одной и той же реализации
time.perf_counter(), монотонный wall clockos.path.getsize для .ll и бинарникаmplc → .ll → clang++ → binimplement · Owner-обёртка массиваimplement · прямой Potion ArrayOwner, interface, interfaces/Mob), сняли обвязку implement и Owner Array — то же поведение, но файл больше не зависит от инфраструктуры интерфейсов_IMPL — сократить деградацию по числу методов