Ответ 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, эти две библиотеки будут иметь важное значение.
Ссылки:
- Брайан Гесиак: " https://modocache.io/how-to-port-the-swift-runtime-to-android
- Ссылка на запрос на извлечение порта Android: https://github.com/apple/swift/pull/1442
- Интересная статья о проблемах и преимуществах кросс-платформенного Swift: https://medium.com/@ephemer/how-we-put-an-app-in-the-android-play-store-using-swift-67bd99573e3c