2017-01-15 10 views
3

Являясь разработчиком программного обеспечения iOS в Swift, мне все больше и больше раздражает необходимость координировать один и тот же код, написанный в Swift, с кодировками разработчиков на JavaScript. Было бы намного опрятно реализовать единую функциональность в одном месте, а затем перевести на JS, правильно?Быстро перейти на JavaScript-транспилер - возможно?

Я начал задаваться вопросом, возможно ли компилятор Swift для 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], поскольку они передаются по ссылке, а не по значению.

Возможно ли было бы написать правильный транспилер?

+0

Да, это было бы, но вам придется перекрыть не только синтаксис, но и семантику. Lambdas, массивы, словари, объекты и почти все языковые конструкции ведут себя по-другому на другом языке, поэтому решить эту проблему очень сложно и сложно. Не говоря уже о том, что потребуется много времени. –

+0

есть транслятор, который довольно зрелый, я думаю, https://www.sitepoint.com/getting-started-emscripten-transpiling-c-c-javascript-html5/. Возможно, вы могли бы использовать его, если бы вы использовали obj-c вместо быстрого – chiliNUT

ответ

3

Нужно задаться вопросом, имеет ли смысл писать транспилятор Swift для JavaScript, поскольку языки не отображают 1: 1. Есть много подводных камней, кроме тех, о которых вы упоминали (например, inout параметры или перегрузка функций). Есть уже некоторые жизнеспособные альтернативы, такие как использование Haxe/Kotlin для перевода как на JavaScript, так и на Swift или разработку кросс-платформенных приложений в Xamarin/React Native.

Это говорит о том, что оба языка имеют множество общих передовых практик, а также имеют довольно существенное перекрытие функций (например, замыкания/назначение функций переменным). Я не думаю, что есть какие-либо функции, которые невозможно было бы перекрыть, хотя какой-то полученный код может быть довольно запутанным.

Существует также четкое преимущество перед использованием, например, Kotlin - вы могли бы захватить существующий проект Swift и перевести его в JS, не принимая решение заранее написать в Котлин. И это один язык, который вам нужно учиться.

Я начал transpiler project с live preview сам, что я считаю улучшением по сравнению с ShiftJS. Он действительно будет обрабатывать упомянутые вами случаи (включая передачу массивов/словарей по значению).

Тем не менее, это незавершенное производство, так как я еще не успел реализовать поддержку классов. Параметр inout - это одна из вещей, которые меня подталкивают, хотя может быть (уродливое) решение.

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

может быть transpiled к чему-то вроде

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

Как это для хака!

Можно ли написать 1-скоростной трансилер Swift в JS? Я склоняюсь к да, но жюри отсутствует - и вполне возможно, что я в конечном итоге столкнусь с особенностью, которую невозможно воспроизвести в JS.

4

Транспортер между любыми двумя языками полного обучения всегдавозможно. Это не значит, что это просто, практично или стоит.

На минимальном минимуме вы можете гарантировать, что возможна пересылка Swift в JS, поскольку вы можете скомпилировать машинный код Swift to x64 и использовать JS дизассемблер/декомпилятор для создания JS. Тем не менее, полученный код будет действительно дерьмом JS.

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