← На главную

SwiftII: урезанный Swift уместился в 40 704 байта на Apple II

25.06.2026 08:26 · hackernews

Инженер Йео Кок Мин портировал современный язык Swift на Apple II — машину 1977 года с 8-битным процессором MOS 6502 на частоте 1 МГц. Проект называется SwiftII. Это не полноценный Swift, а сильно урезанный диалект, в духе Embedded Swift. Цель — чтобы синтаксис оставался узнаваемым, но код помещался в 64 КБ ОЗУ. Фактически исполняемый файл SwiftII укладывается всего в 40 704 байта — от адреса $2000 до $BEFF. Всё, что выше, занято ProDOS и системными областями.

SwiftII работает через виртуальную машину: компилятор превращает исходный код в байткод .swb, который затем исполняет интерпретатор. Это почти точная копия подхода Apple Pascal 1979 года. На самой машине доступен REPL для интерактивной работы и полноценный файловый менеджер с редактором на одной загрузочной дискете. Редактор поддерживает два режима: «cooked» с автоподстановкой спецсимволов и «raw» для обычных текстовых файлов.

Ограничения жёсткие. Int — только 16-битный знаковый (от −32 768 до 32 767), ни Double, ни Float нет. String — просто байты ASCII. Идентификаторы не длиннее 11 символов. Компилятор однопроходный, использует Pratt-парсер без построения AST — байткод генерируется на лету. Никаких замыканий, словарей, throws или async/await. Всё рассчитано на экономию каждого байта.

Из-за хитрой работы с банками памяти (Apple II не умеет адресовать больше 64 КБ линейно) проект разбит на 9 дисковых образов. Семейство A (4 диска) содержит REPL, но он затирает код ProDOS MLI, поэтому не может читать файлы после запуска. Семейство B (4 диска) — компилятор и раннер с полным вводом-выводом и расширенными функциями вроде switch, random(in:), tone и файловых операций. Девятый диск — общий, с примерами и тестами. Разница в дисках внутри семейства — объём доступного байткода (от 1,8 КБ на плоской машине до ~36 КБ с картой расширения Saturn 128K или дополнительной 64 КБ памятью на IIe).

Для ввода на оригинальной клавиатуре Apple II Plus (только заглавные, нет \, {, [) используется слой трансляции: 'INT превращается в Int, ??/ — в обратную косую черту, Ctrl-W — в подчёркивание. На Apple IIe всё печатается как есть. Весь проект написан на C90, собирается через cc65 для 6502 и clang для тестов на современном Mac. Для проверки поднят автоматизированный acceptance-тест на эмуляторе izapple2, который прогоняет все аппаратные конфигурации одной командой.

Читать оригинал →