9

作为一名使用 Swift 编码的 iOS 开发人员,我发现必须将使用 Swift 编写的相同代码与使用 JavaScript 编码的前端开发人员协调起来越来越烦人。在一个地方实现通用功能然后翻译成 JS 会更整洁,对吧?

我开始怀疑 Swift to JS 编译器是否可行?也许不分享完整的代码,但至少有一些通用的常用功能。

我在网上找到了这个转译器:SwiftJS。可悲的是,这个并没有真正削减它。

以下代码:

let a = [1, 2]
print(a.count)

Invalid Swift code在演示中返回。这不会灌输信心。别介意更复杂的部分,比如选项或函数重载。

我想知道是否要开始一个转译器项目,但后来我意识到有很多陷阱。例如这段代码:

var a = [1, 2]
var b = a
b.append(3)

应该a等于[1, 2]b等于[1, 2, 3]。在 JavaScript 中,两者[1, 2, 3]都是通过引用而不是值传递的。

是否有可能编写一个合适的转译器?

4

4 回答 4

16

任何两种图灵完备语言之间的转译器总是 可能的。这并不意味着它容易、实用或值得

至少,您可以保证 Swift 到 JS 的转换是可能的,因为您可以将 Swift 编译为 x64 机器代码,并使用 JS 反汇编器/反编译器来生成 JS。但是,生成的代码将是非常糟糕的 JS。

要进行良好的转换,您需要考虑一种语言的所有错综复杂的最佳实践,以及它们在另一种语言中的等效项。这是一项艰巨的任务,对于您想要转换的任何两对语言,必须执行两次(每个方向一次)。转译器如此罕见是有原因的,而且通常都是废话。

于 2017-01-15T19:20:27.143 回答
6

人们不得不怀疑编写一个 Swift 到 JavaScript 的转译器是否有意义,因为这些语言不是 1:1 映射的。除了您提到的那些(例如输入输出参数或函数重载)之外,还有许多陷阱。已经有一些可行的替代方案,例如使用 Haxe/Kotlin 转换为 JavaScript 和 Swift,或者在 Xamarin/React Native 中开发跨平台应用程序。

话虽如此,这两种语言共享许多常见的最佳实践,并且具有相当大的功能重叠(例如闭包/将函数分配给变量)。我不认为有任何特性是不可能转换的,尽管一些生成的代码可能非常混乱。

与使用 Kotlin 相比,还有一个明显的优势 - 您可以获取现有的 Swift 项目并将其转换为 JS,而无需事先决定用 Kotlin 编写。而且它是您需要学习的一种语言。

我自己开始了一个带有实时预览的转译器项目,我认为这是对 ShiftJS 的改进。它确实会处理您提到的情况(包括按值传递数组/字典)。

尽管如此,它仍在进行中,因为我什至还没有开始实施对类的支持。该inout参数是困扰我的事情之一,尽管可能有一个(丑陋的)解决方案。

var a = 2
func incr(_ a: inout Int) {
    a += 1
}
incr(&a)//a now equals 3

可以转换成类似的东西

var a = 2
function incr(a) {
    a.set(a.get() + 1)
}
incr({get: a => a, set: val => a = val})//a now equals 3!

黑客怎么办!

是否可以编写一个 1:1 的 Swift 到 JS 转译器?我倾向于是的,但是陪审团已经出局了——我很可能最终会遇到一个无法在 JS 中复制的功能。

于 2017-01-15T20:46:31.007 回答
6

Swift 被编译为 LLVM。LLVM 可以转换为 Javascript: https ://github.com/emscripten-core/emscripten

于 2019-07-06T22:36:37.503 回答
0

可以设计一个通过 WebAssembly 将 Swift 转换为 JavaScript 的编译器,因为已经有两个编译器可以用于此目的:

  • 可以使用SwiftWasm将 Swift 编译为 WebAssembly ,并且
  • WebAssembly 可以使用wasm2js编译成 JavaScript 。
于 2021-09-25T22:47:41.003 回答