- Котлин против Свифта: Android и iOS движутся к созданию универсального языка?
- Синтаксис
- Security
- Особенности
- Значение сходства
- Универсальный язык для iOS и Android?
- Kotlin и Swift. Новая эпоха в мобильной разработке?
- Swift for Android: Our Experience and Tools
- Swift Android Compiler
- Introducing the Swift Android Toolchain
- Gradle plugin
- JVM interoperability
- Blueprint project
- Testing
- What’s next?
Котлин против Свифта: Android и iOS движутся к созданию универсального языка?
Друзья, всем привет. На связи Дмитрий Кожевин — преподаватель базового курса «Android-разработчик» в OTUS. Специально для читателей нашего блога я подготовил перевод вот такой отчасти провокационной статьи. Очень интересно ваше мнение, поэтому после прочтения приглашаю всех в комментарии к данной публикации.
Как только Kotlin получил поддержку Google, явное волнение фанатов Kotlin стало не единственной реакцией. Те, кто не знаком с Kotlin, были весьма обеспокоены его уровнем совместимости с Java, средним временем, необходимым для его освоения, а также преимуществами использования Kotlin в целом.
В своих попытках объяснить и представить язык максимально коротким и ясным способом многие разработчики Kotlin ссылались на трехлетнюю параллель между Kotlin и вторым официальным языком iOS — Swift. Называя Kotlin «Swift of Android», все упростило задачу и помогло создать образ для языка. Тем не менее, это изображение также вызвало споры в сообществе iOS, так как некоторые разработчики iOS не сочли сравнение лестным и увидели в Kotlin просто подражателя.
По крайней мере, следует отметить, что хотя Swift появился в 2013 году, Kotlin появился еще в 2011 году. Следовательно, даже если сравнение Kotlin и Swift (в этом точном порядке) может быть удобным из-за более раннего знакомства Swift с широкой аудиторией, любое утверждение, что Котлин подражает — не оправдано.
Тем не менее, стоит ли сравнивать? Если да, то насколько сильно простирается сходство? И намекает ли его существование на тот факт, что выпуск приложений для iOS и Android изначально может стать проще и быстрее в будущем? Огромный опыт ScienceSoft в услугах по разработке мобильных приложений позволяет спекулировать на этом этапе. Давайте посмотрим на это.
Синтаксис
Синтаксис Swift не просто напоминает синтаксис Kotlin — в небольших кусках кода может быть до 77% сходства строк.
Основные различия могут быть сведены к таблице ниже:
Kotlin | Swift |
---|---|
fun | func |
val | let |
null | nil |
trait | protocol |
constructor | init |
: | -> |
Any | AnyObject |
!! | ! |
Основы, классы и функции имеют очень похожие способы выражения. В отличие от Objective-C, вызовы методов Swift похожи на вызовы Java и Kotlin, с их системой пространств имен и стилем точечной нотации. Например, вот как выглядит вызов функции на двух языках:
Kotlin | Swift |
---|---|
fun forecast(day: String, weather: String): String < | func forecast(_ day: String, _ weather: String) -> String < |
return «Today is $day, it’s $weather.» | return «Today is \(day), it’s \(weather).» |
> | > |
forecast(«Monday», «Raining») | forecast(«Monday», «Raining») |
И вот как классы объявлены в обоих:
Kotlin | Swift |
---|---|
class Residence < | class Residence < |
var numberOfRooms = 0 | var numberOfRooms = 0 |
fun Description() = | func Description() -> String < |
«A house with $numberOfRooms.» | return «A house with \(numberOfRooms).» |
> | > |
> |
В этой статье можно найти много других примеров, и если они нам что-то говорят, то это то, что оба языка имеют общую цель — быть максимально краткими и прозрачными, что делает жизнь разработчиков проще. Синтаксические системы Котлина и Свифта довольно эффективны в этом отношении, поскольку команды разработчиков высоко ценят их элегантность.
Security
Хотя Swift и Kotlin сильны и статичны с точки зрения типизирования, они также позволяют работать с динамическими типами. Таким образом, языки остаются краткими и гибкими, позволяя заблаговременно устранять ошибки и несоответствия. Поэтому они считаются очень безопасными и особенно надежными для больших проектов.
Кроме того, эти два языка сочетают в себе подходы к обработке необязательных значений и null/nil безопасности с помощью оператора безопасной навигации «?» или типы опций. Меры предосторожности со знаком «?» выражены почти одинаково как в Kotlin, так и в Swift:
Kotlin | Swift |
---|---|
val example: String? = null | var example: String? = nil |
Особенности
Помимо null (nil) безопасности, функций и классов, Kotlin и Swift обладают множеством схожих функций, включая constants, variables, generics, protocols/traits (trait заменено на interface, прим. переводчика ), enumerated types, any (anyobject) , обработку ошибок и другие. Некоторые функции, реализованные на двух языках, разделяют подход, но называются по-разному из-за оригинального языка, к которому эти функции возвращаются.
Например, в Kotlin можно найти лямбда-выражения Java. В Swift это блоки или замыкания, термины из Objective-C. То, как оба выражения вызываются в код, аналогично тому, как они работают.
Kotlin | Swift |
---|---|
< | < _in |
println(«Lambda Expression») | print(«Closure Expression») |
> | > |
Функция, известная как вычисляемые свойства в Swift, которая является определенным объявлением свойства с вызовом get, также включена в Kotlin:
Kotlin | Swift |
---|---|
class Animal( | class Animal < |
var Genus: String, | var Genus: String |
var Species: String) < | var Species: String |
val binomialName: String | var binomialName: String < |
get() = «$Genus $Species» | get < |
> | return «\(Genus) \(Species)» |
> | |
> | |
> |
Kotlin | Swift |
---|---|
fun daysoff(vacation: Int, weekends: Int): Int = vacation + weekends | func daysoff(vacation: Int, weekends: Int) -> Int < |
return vacation + weekends | |
> | |
daysoff(5, weekends = 8) | daysoff(vacation: 5, weekends: 8) |
На самом деле, вместо перечисления функций, которые существуют на обоих языках, было бы проще перечислить те, которые не имеют. А именно, только Kotlin поддерживает:
- импорт классов
- первичные конструкторы и классы данных
- @annotations
В то же время, в отличие от Котлина, Swift имеет:
Значение сходства
Два языка четко разделяют идеологию, поскольку они решают те же проблемы, которые были созданы языками их предков: они менее многословны и ограничены по функциям, более удобочитаемы и удобны для работы. В то же время и Kotlin, и Swift остаются совместимыми с Java и Objective-C соответственно, что позволяет использовать их как в новых проектах, так и в обслуживании старых.
Более того, сильное сходство двух языков может помочь в разработке собственных приложений для iOS и Android. Разумеется, нельзя сказать, что приложения на обеих платформах могут совместно использовать один код, поскольку языки и библиотеки для конкретных ОС не идентичны. Тем не менее, подходы к логике и функциональности приложения могут быть очень похожими, благодаря синтаксическому и функциональному сходству между Swift и Kotlin. Это может сделать разработку, тестирование и обслуживание быстрее и проще.
Универсальный язык для iOS и Android?
Теоретически, Google мог уже принять Swift в качестве официального языка вместо Kotlin; даже в 2016 году ходили слухи об этой возможности. Такой шаг, возможно, не создал бы ситуацию, когда какие-либо кроссплатформенные инструменты разработки стали бы неактуальными, но разница между этими двумя платформами, несомненно, стала бы размытой.
Однако такой шаг также был бы неразумным, и не только из-за конкурентоспособности бизнеса. Хотя Свифт и Котлин похожи, больше всего они похожи на своих предшественников. Другими словами, Свифт и Котлин преодолевают разрыв между Objective-C и Java. Однако переход с Java на Kotlin все же более естественный и плавный, чем переход с Java на Swift.
В общем, мысль о приспособлении к чему-то новому не всем нравится; некоторые разработчики не торопятся, чтобы начать использовать новый язык, как это было с принятием Swift. Убедиться в том, что переход на новый язык будет не таким тяжелым испытанием, означает, что язык в конечном итоге завоевывает популярность, а для на нового языка это актуально в первую очередь.
Источник
Kotlin и Swift. Новая эпоха в мобильной разработке?
Когда в Google объявили о том, что они теперь официально будут использовать Kotlin для разработки под Android, я, как и многие другие Android-разработчики, вздохнул с облегчением. Я еще раз зашел на официальный сайт Kotlin, чтобы перепроверить функционал/синтаксис и сравнить его с последней версией Swift, на котором сейчас пишу, и вдруг ощутил это: проходит одна эпоха и начинается новая, по крайней мере в мобильной разработке.
В Kotlin, как и в Swift довольно много синтаксического сахара, который снижает объемы обычной рутины (сравнение синтаксиса тут). Но что меня особенно радует — они оба, прям «из коробки», поддерживают новые парадигмы программирования. Особенно функциональное программирование.
Принципы функционального программирования, конечно, не являются чем-то новым в разработке, даже наоборот. Но теперь, когда есть официальная поддержка «из коробки» в разработке под iOS и Android — стоит пользоваться именно ими.
Когда я только начинал свою карьеру в мобильной разработке, все писали циклы как-то так:
Теперь же все используют функциональный подход, чтобы сделать все то же самое за один вызов, и этот подход намного лучше:
Блоки были представлены Apple для Objective-C в 2010 году (iOS SDK 4.0), чтобы улучшить жизнь разработчиков и соответствовать анонимным классам в Java, которые могут быть использованы как коллбэки:
Пример блока в Objective-C:
Пример анонимного класса в Java:
Лямбда-выражения в Java были представлены в 2014, как часть JDK 8, но к сожалению они не были доступны Android-разработчикам, потому что Android SDK поддерживает только JDK версии 7 (поэтому и есть такие библиотеки, как retrolambda).
Теперь же оба языка полностью поддерживают такой подход: в Swift — «замыкания» (то же самое, что блоки в Objective-C), а у Kotlin есть поддержка «лямбд», которая работает в Android SDK:
Пример замыкания в Swift:
Пример лямбды в Kotlin:
Начиная с Xcode 4, где-то с 2011, Objective-C предоставляет однострочную инициализацию для массивов и словарей:
Пример инициализация в Swift:
В JDK доступна только статическая инициализация, но нет способа инициализировать Map в одну строку. Функция Map.of которая позволяет это, была представлена только в JDK 9.
Пример статической инициализации в Java:
Но теперь Kotlin умеет делать так:
Еще одна вещь, которую я хочу выделить — Range операторы, которые делают вашу жизнь намного проще. Теперь вместо использования циклов for для простого обхода:
Вы можете делать в Kotlin так:
Или вот так в Swift:
Стоит еще упомянуть о кортежах (tuples). Они дают определенную свободу во взаимодействии с другими компонентами и помогают избегать создания дополнительных классов.
Итак, глядя на все эти новые «фичи» и многие-многие другие вещи, которые не упомянуты в этой статье — я бы предположил, что новая эпоха уже началась. Теперь всем новичкам, которые начинают свой путь в мобильной разработке, будут доступны все эти функции прямо «из коробки», и они смогут сократить затраты на рутинную разработку бизнес-логики и управление приложением. И это намного важнее, чем писать сотни строк для того чтоб сделать простой кусок работы. Конечно, раньше вы могли просто поставить и настроить дополнительную библиотеку, такую как PromiseKit, ReactiveCocoa, RxJava и т.п. Но я верю, что доступность этих парадигм и принципов — будет побуждать новых разработчиков использовать именно их, что приведет нас к светлому будущему. 🙂
Спасибо за внимание! Я надеюсь вам было интересно или, как минимум, это пост дал вам свежие идеи. Я пытался написать коротко, но если вам нужны более конкретные примеры и/или у вас есть предложения/замечания — пожалуйста, напишите в комментариях!
Источник
Swift for Android: Our Experience and Tools
Jun 19, 2018 · 6 min read
Early last week, we launched Spark for Teams — a revolutionary email client that’s changing the way teams use email. Spark is still an phenomenal email for personal use because it shows what’s important in your inbox.
Spark is one of the most popular email apps available for Free o n iPhone, iPad, Mac, as well as Apple Watch. For the millions of users on the Android platform, the time when Spark helps you love your email isn’t very far. In the meantime, we want to share with you an incredible new toolchain we’ve created that takes the pain and hassles out of working with Swift for Android. This toolchain helps dev teams utilize the code they’ve written for the iOS or Mac platforms to create great Android applications.
The Apple Swift compiler has had the ability to compile code for the Android platform for a few years now, but it hasn’t made many friends in the developer community owing to its complexity. Our toolchain was designed to solve this problem by taking the complexity and headaches out of the process, so you can focus on building great apps for your users.
When we started working on the development of the Android version of Spark, we were looking for a cross-platform language that could be used for both Android & iOS development and would also be easy to migrate from our existing Objective-C codebase.
It was around this time that Swift became an open-source project and after a short while, it also got the ability to compile code for the Android platform. We explored our options and it was pretty obvious to us that we should move in that direction.
Swift Android Compiler
How does Swift Android Compiler work?
The answer to that is simple: Low-Level Virtual Machine.
The LLVM is a compiler infrastructure that is based on the concepts of three-phase design with re-targetability. In simple terms, this means that any language that has a front-end LLVM compiler can be compiled for any target that has a LLVM backend compiler.
Google already makes use of LLVM compilers for native Android development with C/C++. That’s why, from an Android device perspective, there is no difference in libraries compiled from C/C++ or Swift code. Moreover, it’s actually better for developers, because they can re-use most of the instruments that were created for C/C++ development — Android profiling tools or an Android low-level debugger (with a limitation on an evaluation of swift code).
What frameworks are available?
Well…there aren’t many. We only have access to SwiftCore, Dispatch, and SwiftFoundation in our toolchain. SwiftCore and Dispatch are largely identical to iOS and Mac versions. But SwiftFoundation on the other hand is not the same Foundation that Apple uses for its own platforms; it’s a re-implementation of all classes from the original library. That’s why SwiftFoundation is still missing some features, but it covers all basic needs such as performing network requests, parsing JSON/XML, storing data on disk, etc.
Obviously UIKit or any high level frameworks are not available, so your Swift app for iOS cannot magically run on Android — you can use Swift for business logic code, but you will have to re-write all user interface and OS dependent parts specifically for Android.
What are the limitations of the Swift Android Compiler?
- At the moment, the Swift compiler only supports the ARM-v7A Android platform.
- Minimum version of Android supported is v5.0 (Lollipop).
- And one of the most significant limitations is the generation 32MB+ APK files, because build should include SwiftCode, SwiftFoundation, and libDispatch.
Introducing the Swift Android Toolchain
One of the biggest hurdles in using Swift compiler for Android is the lack of official support from Apple, which means no continuous integrations or no official builds. We realized that we could optimize the many of the hassles present in developing in Swift for Android and at the same time, improve the experience for our developers in this area. We wanted to avoid all the headaches that Android developers typically have to suffer when working with these tools.
That’s why we have the Swift Android Toolchain — a collection of tools that gives Android developers the ability to use Swift in their projects comfortably and without any hassles. It is an open-source project based on Apple Swift compiler and SwiftJava and SwiftAndroid projects. You can download the toolchain directly from Bintray (Mac only) or compile on your own from GitHub.
We’re currently using forked version of Swift. Our fork contains option to disable @objc and dynamic features in compiler because it doesn’t work properly on non-Darwin platforms. It also contains some minor fixes. We’re working on being able to use official Swift repository in future.
Furthermore, we use Swift Package Manager (SPM) as the build system for Swift. It is the build system that Apple uses in the compiler and others Swift libraries. This tool provides the ability to connect dependencies, compile code, link artifacts (dynamic libraries or executables) and run tests. Along with our toolchain, we provide scripts for SPM that will automate all processes of development and testing Android apps.
Gradle plugin
Of course, it’s great to build Swift code from the command line, but it’s simply more natural for Android developers to use the Android Studio IDE. Fortunately, the Android IDE uses a very flexible build system called ‘Gradle’.
We created a Gradle plugin for adding a Swift compilation build step. It gives us the ability to build mixed Swift/Java/Kotlin projects with just one button.
JVM interoperability
All Android applications run in the Java Virtual Machine. In case any developer prefers native code (C/C++), they must load the library inside an app and interact with it via the Java Native Interface (JNI). Swift is no exception. Thus, for using Swift code in JVM, we should load the libraries and write a JNI bridge.
It’s entirely up to you what JVM language (Java or Kotlin) you use and how you write the bridging code, but we recommend you take a look at our Swift Annotation Processor that generates all JNI code from the Java classes and interfaces.
Blueprint project
The Android team at Readdle has created a sample Swift application for trying out the Swift Android Toolchain in action. If you want to try Swift for Android, this is an excellent project to start with. The Blueprint project is a simple to-do app with business logic written in Swift, while the UI was done in Java.
Testing
The Swift project already includes a testing framework called XCTest and it can already be used for testing Swift code on Android platform. The Swift Package Manager allows compiling tests in one fat binary executable; after that, developers can upload binary executable on Android devices and run it via the Android shell.
BONUS: Our toolchain automates all stages of this testing process. And the Blueprint project includes few simple tests for you to try.
What’s next?
We still have a lot to do for Swift toolchain:
- ARM64 compiler (tentative deadline: August 2019)
- X86, X86_64 compiler (Chromebooks support)
- LLDB with Swift support: client and server
We hope that our Swift Android Toolchain will help you in making your development process easy and hassle-free. The Swift language has been evolving greatly over the last couple of years and developers who already code for the iOS and Mac platforms using Swift can now easily have Android on their radar too.
Источник