
Друзья, всем привет. На связи Дмитрий Кожевин — преподаватель базового курса «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 имеет:
- кортежи
- typealias
- guard statement
Значение сходства
Два языка четко разделяют идеологию, поскольку они решают те же проблемы, которые были созданы языками их предков: они менее многословны и ограничены по функциям, более удобочитаемы и удобны для работы. В то же время и Kotlin, и Swift остаются совместимыми с Java и Objective-C соответственно, что позволяет использовать их как в новых проектах, так и в обслуживании старых.
Более того, сильное сходство двух языков может помочь в разработке собственных приложений для iOS и Android. Разумеется, нельзя сказать, что приложения на обеих платформах могут совместно использовать один код, поскольку языки и библиотеки для конкретных ОС не идентичны. Тем не менее, подходы к логике и функциональности приложения могут быть очень похожими, благодаря синтаксическому и функциональному сходству между Swift и Kotlin. Это может сделать разработку, тестирование и обслуживание быстрее и проще.
Универсальный язык для iOS и Android?
Теоретически, Google мог уже принять Swift в качестве официального языка вместо Kotlin; даже в 2016 году ходили слухи об этой возможности. Такой шаг, возможно, не создал бы ситуацию, когда какие-либо кроссплатформенные инструменты разработки стали бы неактуальными, но разница между этими двумя платформами, несомненно, стала бы размытой.
Однако такой шаг также был бы неразумным, и не только из-за конкурентоспособности бизнеса. Хотя Свифт и Котлин похожи, больше всего они похожи на своих предшественников. Другими словами, Свифт и Котлин преодолевают разрыв между Objective-C и Java. Однако переход с Java на Kotlin все же более естественный и плавный, чем переход с Java на Swift.
В общем, мысль о приспособлении к чему-то новому не всем нравится; некоторые разработчики не торопятся, чтобы начать использовать новый язык, как это было с принятием Swift. Убедиться в том, что переход на новый язык будет не таким тяжелым испытанием, означает, что язык в конечном итоге завоевывает популярность, а для на нового языка это актуально в первую очередь.
Прощальная мысль
Поскольку мобильная разработка постоянно развивается, развиваются и технологии. Вот почему через 5-10 лет и Котлин, и Свифт могут стать чем-то совершенно другим. Пока неизвестно, будут ли языки продолжать устранять разрыв между собой. Тем не менее, поскольку iOS и Android ищут наиболее удобный, безопасный и быстрый инструмент для мобильной разработки, они смогут в конечном итоге говорить на одном языке в один прекрасный день.
