Скомпилируйте Swift в WebAssembly

Теперь инфраструктура LLVM поддерживает компиляцию из LLVM IR в WebAssembly (по крайней мере, экспериментально). Swift использует инфраструктуру компилятора LLVM и может быть легко скомпилирована в LLVM IR. Поэтому я подумал, что было бы легко скомпилировать код Swift для LLVM IR, а затем в WebAssembly.

Однако оказалось, что это не так просто. Похоже, что LLVM IR не полностью независима от платформы? Какова бы ни была причина за кулисами, при компиляции Swift в LLVM IR должна быть указана целевая архитектура, а WebAssembly недоступна.

У меня есть два вопроса:

1) Исправляю ли я, что в настоящее время (по состоянию на октябрь 2017 года) нет возможности скомпилировать Swift для WebAssembly?

2) Что потребовалось бы, чтобы сделать WebAssembly поддерживаемой целью для Swift для компиляции LLVM IR?

Ответ 1

1) Насколько мне известно, с начала ноября 2017 года вы правы: нет общедоступного способа компиляции Swift в WebAssembly. Возможно, какой-то предприимчивый хакер где-то сделал это, но если так, она еще не поделилась с нами кодом.

2). Чтобы включить поддержку WASM, вам, вероятно, придется взломать несколько разных частей. Я думаю, вы могли бы сделать это, не зная ничего о внутренних компонентах компилятора (например, анализаторе и оптимизаторах), но вам нужно узнать о том, как работает инструментарий и как он интегрируется с платформой во время выполнения.

Вы можете узнать тонну о том, что вам нужно сделать, изучив, как Swift был перенесен на Android. К счастью, Брайан Гезиак опубликовал очень подробное сообщение в блоге о том, как именно этот порт работал (предупреждение: требуется небольшое пожертвование Patreon):

https://modocache.io/how-to-port-the-swift-runtime-to-android

Серьезно, вы были бы не в состоянии начать этот проект, не прочитав эту статью.

Хотя я НЕ эксперт, основанный на этом порту и моем (базовом) понимании Swift, я думаю, что общий обзор того, где вам нужно взломать, будет:

  • Компилятор Swift
    • Вам нужно научить его "тройному" WASM, используемому LLVM, поэтому он знает, как интегрироваться с остальной частью своей инструментальной цепочки.
    • Вам необходимо настроить платформу WebAssembly, чтобы люди могли писать #if os(WebAssembly) в местах, где требуется условная компиляция
    • Вам также потребуется настроить аналогичные макросы времени сборки. В статье Android это очень хорошо объясняется.
  • Быстрое время выполнения
    • Это написано на С++ и должно выполняться на WASM
    • Поскольку WASM - необычная платформа, здесь, вероятно, будет какая-то работа. Возможно, вам понадобится предоставить совместимые прокладки для различных системных вызовов и тому подобное.
    • Проекты, подобные Emscripten, продемонстрировали множество успешных компиляций С++ на WASM.
  • Стандартная библиотека Swift
    • В теории вы можете написать и запустить Swift-код, который не использует стандартную библиотеку, но кто захочет?
    • Также теоретически это должно "работать", если работает среда исполнения, но вам, вероятно, понадобится использовать функцию #if os(WebAssembly) для работы с неровностями платформы.
  • Бонус: Фонды и Диспетчерские библиотеки
    • Если вы хотите использовать существующий код Swift, эти две библиотеки будут иметь важное значение.

Ссылки:

Ответ 3

По состоянию на май 2019 года существует проект с открытым исходным кодом под названием SwiftWasm, который позволяет скомпилировать код Swift в WebAssembly, предназначенный для WASI SDK. Это означает, что двоичные файлы, создаваемые SwiftWasm, могут выполняться либо в браузерах с полизаполнением WASI, либо в автономных средах выполнения WebAssembly, поддерживающих WASI, таких как wasmtime, lucet или wasmer.

Ответ 4

Цель WebAssembly будет похожа на универсальную цель unix для llvm, поэтому я думаю, что кому-то нужен этот порт.

Обратите внимание, что Swift → WASM в браузере будет практически бесполезным, потому что WASM не имеет доступа к DOM или DOM API, поэтому вам все равно нужен JavaScript, чтобы сделать что-либо значимое, поэтому вопрос: зачем кому-то беспокоиться о создании порта? Похоже, что JavaScript остается единственным веб-языком. Если вам не нравится JavaScript, вам лучше забыть о веб-разработке.

Скорее всего, Swift будет запускаться на Android до того, как он начнет работать в Интернете, поэтому придерживайтесь Swift/iOS, а затем создавайте порт для Android, когда это станет возможным. Люди все равно не используют веб-браузер.