Скомпилируйте 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, когда это станет возможным. Люди все равно не используют веб-браузер.