На сегодняшний день существует уйма языков программирования (ЯП) — от старых и заслуженных, вроде C/C++, до современных и модных, таких как Kotlin. Казалось бы, можно создать один язык, который будет универсальным для всех задач. Но в реальности разные языки используются для разных задач, потому что так эффективнее. И сегодня речь пойдет об одном из современных ЯП и круге его применения, своеобразном апгрейде для Java — Kotlin.
Содержание:
1. Kotlin и основные сведения о нем
2. История возникновения, мотивация создания
3. Зачем понадобился еще один языковой стандарт вместо Java?
4. Преимущества и недостатки Kotlin
5. Синтаксис
6. Примеры кода
7. Перспективы языка Kotlin
Вывод
Языку программирования Kotlin всего несколько лет. Разработкой занимается компания JetBrains, а сам язык позиционируется в качестве вполне успешной альтернативы Java и Scala.
Kotlin — современный, статически типизированный и один из самых быстроразвивающихся языков программирования, который позволяет разрабатывать приложения под мобильные системы — iOS и Android, веб-приложения, серверные и кроссплатформенные решения.
Но это не просто еще один язык, а целая полноценная экосистема. Она включает в себя сам язык, базовый инструментарий и библиотеки. Этот набор называется Common Kotlin. Отметим, что в комплект также входят расширения для языка под конкретные платформы. Это, к примеру, Kotlin/JVM, Kotlin/JS и Kotlin/Native. А еще — специфические для платформы библиотеки, инструменты и так далее. Предполагается, что в будущем все эти элементы войдут в состав Kotlin Multiplatform.
Разработка Kotlin началась недавно, а именно, в 2010 году под руководством Андрея Бреслава. Несколько лет проект находился в стадии альфа и бета, а первая релизная версия была показана на конференции разработчиков Google I/O 2017. Сам язык изначально создавался для работы в рамках виртуальной машины Java Virtual Machine.
Утверждается, что Kotlin работает там, где работает Java. При этом авторы хотели создать именно полезный инструмент разработчика, а не просто еще один язык, которому бы пришлось учиться с нуля.
В языке используются заимствования синтаксических конструкций из JavaScript, Pascal, TypeScript, Haxe, PL/SQL, F#, Go и Scala, C++, Java, C#, Rust и D. Новый язык должен быть быстрее, чем Java и проще, чем Scala, но при этом не терять их преимуществ.
Важный аспект, что язык развивается как opensource-проект, исходный код проекта доступен в открытом репозитории.
На этот вопрос есть два ответа. Официальная версия звучит так — после запуска языка, в 2017 году компания Google сделала его приоритетным языком на Android, утвердив его как стандарт. На такой шаг там пошли из-за того, что уже в 2017-ом де-факто около миллиона программистов использовали именно Kotlin.
Также есть неофициальная версия — Google до сих пор судится с Oracle по поводу использования Java в операционной системе Android. Похоже, что отсюда же «растут уши» и новой системы Fuschia. С 2017 года поисковый гигант постепенно переводит всю Android -инфраструктуру с Java на Kotlin. Этим маневром Google, во-первых, сохраняет всю наработанную кодовую базу для Java (Kotlin совместим с Java), во-вторых, избавляется от самодурства Oracle, которая в последнее время чудит с Java, вставляя палки в колеса конкурентам.
Помимо этой корпоративной возни, есть и объективные причины. Kotlin создает более компактный и защищенный код. Следует отметить, что есть чисто практические задачи, которые куда лучше решаются в рамках Kotlin. Суть в том, что есть куча языков:
И главная проблема здесь в том, что это разные языки, которые приходится с помощью «костылей» объединять в единое целое. У них разный синтаксис и особенности, логика и архитектура. Именно эти проблемы решает Kotlin, который объединяет лучшие аспекты всех систем в одно целое.
Иначе говоря, Kotlin упрощает взаимодействие между частями приложения и, соответственно, упрощает жизнь разработчикам.
В числе плюсов языка отметим полную обратную совместимость его с Java. За счет этого оба языка можно использовать в рамках одного проекта. Для этого Kotlin имеет свой собственный компилятор, который выдает байт-код, совместимый с обычной Java-машиной.
Примерно это выглядит так:
Еще одним плюсом можно назвать выразительность языка Kotlin. В нем избыточность синтаксиса сведена к минимуму.
Вот пример Hello world
на Java и на Kotlin:
А вот так выглядит простая программа на Java и на Kotlin соответственно:
В простых программах у Kotlin проще синтаксис и меньше вспомогательных конструкций:
В результате бывает так, что код на Kotlin может быть в разы короче, чем на Java, хотя это зависит от логики и сложности программы. Однако это тоже можно отнести к плюсам.
Помимо этого, обратим внимание на безопасность языка. Сама среда программирования и язык выпущены одной компанией, которая централизованно исправляет ошибки и уязвимости. Также при компиляции срабатывает null-защита, так что вручную обрабатывать знаменитую уязвимость NullPointerException из Java не нужно.
Разумеется, есть и недостатки. Одним из них называют непредсказуемую скорость компиляции. А быстродействие готовой программы может незначительно уступать Java из-за виртуальной машины JVM.
Как уже сказано выше, синтаксические конструкции языка во многом заимствованы из других языков. Здесь мы приведем примеры того, как можно объявить те или иные конструкции.
Во-многом это похоже на Java, говоря лингвистически — это его близкий диалект.
Чтобы объявить переменную, используем var.
var username: String = "some user name" Чтобы объявить константу, используйте val. val в Kotlin — это как final в Java. val API_DELAY_CONSTANT: Int = 100
Инициализация переменной как null
производится с помощью оператора “?”.
Если этот оператор не указан, то компилятор не даст возможности присвоить переменной значение null
.
var myString: String? = null
Для определения статической переменной используем companion object
. А для отложенной инициализации переменной — lateInit
:
lateinit var user: User // Initialized later in code lateinit var items: List<String> // Initialized later in code
Начнем с условного выражения if.
Kotlin позволяет использовать его разными способами. Один из вариантов идентичен тому, что есть в в Java:
if (x > 0) { println("x больше чем 0") } else { println("x меньше чем 0") }
Помимо этого, if
может выступать в качестве выражения, поскольку оно может возвращать значение и присваивать его переменной. В этом случае обязательно надо использовать else
.
Пример:
val max = if (a > b) { print("возвращаем a") a } else { print("возвращаем b") b }
Каждая условная ветвь возвращает значение, указанное в последней строке. Поэтому ключевое слово return
использовать не нужно.
Так выглядит простая функция в Kotlin:
fun getNumber(): Int { return 1 }
Функция getNumber()
имеет область видимости public
, не имеет параметров и возвращает Int
. Есть также вариант private
с параметрами. Выглядит так:
private fun getStringLength(str1: String, str2: String): Int { return str1.length + str2.length }
Функция getStringLength()
имеет область видимости private
и два параметра, возвращает Int
.
Статическая функция выглядит так:
class MyStringUtil { companion object { fun getOddLengthString(str: String): String? { if (str.length % 2 == 0) return null return str } } }var str: String = MyStringUtil.getOddLengthString("hey")
Здесь getOddLengthString()
принимает параметр и возвращает строку. Тип String
указан с символом “?
”, то есть функция может возвращать значение null
.
В цикле for
для Kotlin используется ключевое слово in
, которое дает доступ к элементам коллекции:
var items: List<String> = ArrayList<String>() for (item in items) { // do something with item }
Аналогично в цикле for
:
for (index in items.indices) { // access items using index // items.get(index) }
Цикл while
в Kotlin такой же, как и в Java:
var i: Int = 0// Some while loop do { // do something i++ } while (i < 5)// Another while loop while (i < 10) { // do something i++ }
Для оператора же switch
есть отличия. Если в Java использовался только этот оператор, то в Kotlin использует when
для переключения между условиями:
// A cool example of when statement fun describe(obj: Any): String? { var res: String? = null when (obj) { 1 -> { res = "One" } // if obj == 1 "Hello" -> res ="Greeting" // if obj == "Hello" is Long -> "Long" // if obj is of type Long !is String -> "Not string" // if obj is not of type String else -> { // execute this block of code } } return res }
В Java, чтобы избежать исключения NullPointerException
, используется блок “if
”. А вот в Kotlin его можно пропустить.
if (person != null && person.department != null) { person.department.head = managersPool.getManager() }
// If either `person` or `person.department` is null, the function is not called: person?.department?.head = managersPool.getManager()
В коде используется оператор безопасного вызова “?
.”, который позволяет избегать NullPointerException
. Также можно использовать “?
:”. Он называется Elvis operator
и позволяет обрабатывать варианты, когда объект равен null
.
Например:
var name = person?.name ?: throw InvalidDataException("Person cannot be null.")
Для наследования класса использует ключевое слово open. Если его нет, то класс аналогичен final
в Java, то есть, его нельзя наследовать.
Пример:
open class Animal { // This class is open and // can be inherited } class Dog : Animal() { // Notice the paranthesis // Class dog is final and // can't be inherited }// Compiler throws error class Labrador : Dog { }
В Kotlin они реализуются с помощью ключевого слова object
(в Java это class
).
Пример:
object Singleton { var name: String = "singleton object" fun printName() { println(name) } }// later in the code Singleton.name Singleton.printName()
Вот так выглядит пример базового интерфейса в Kotlin:
interface Named { fun bar() } interface Person : Named { // Person inherits Named fun foo() } class Employee() : Person { override fun bar() { // do something } override fun foo() { // do something } }
А так выглядит передача интерфейса функции:
// A function that accepts and interface as a parameter private fun setEventListener(listener: EventListener) { // do something }// Passing an interface to the function setEventListener(object : EventListener{ override fun call() { // do something } })
Для проверки, является ли объект экземпляром определенного класса, можно задействовать операторы “is
” и “!is
”.
if (obj is String) { print(obj.length) } if (obj !is String) { print("Not a String") }
Предотвращаем исключения с помощью оператора безопасного приведения “as?
”, который возвращает null
при сбое. Это называется безопасным привидением или safe typecast
.
Выглядит так:
val x: String? = y as? String
В этом случае выбрасывания исключений не будет.
Выбрасывание и обработка исключений практически такие же, как и в Java.
throw Exception("Hi There!")try { // some code } catch (e: SomeException) { // handler } finally { // optional finally block }
Давайте теперь посмотрим на пример кода небольшой программы.
fun main(){ println("Hello Kotlin") }
При запуске она выведет типичное «Hello Kotlin
».
Примеры более сложных математических задач приведены ниже.
Gradle
зависимость:
repositories { maven { url 'https://jitpack.io' } } dependencies { implementation 'com.github.thomasnield:kotlin-statistics:-SNAPSHOT' }
Пример линейной регрессии c применением Kotlin-statistics
:
fun main() { val r = sequenceOf( 1.0 to 3.0, 2.0 to 6.0, 3.0 to 9.0, 4.0 to 11.8 ).simpleRegression() println(r.slope) // 2.9400000000000004 println(r.meanSquareError) // 0.006000000000000227 println(r.predict(5.0)). // 14.8 }
Пример классификации при помощи Наивного байесовского классификатора:
import org.nield.kotlinstatistics.toNaiveBayesClassifier class Email(val message: String, val isSpam: Boolean) fun main() { val emails = listOf( Email("Hey! If you really want to enlarge your ML scores click here", isSpam = true), Email("Earn 50 more points for ML just by visiting this site!", isSpam = true), Email("Still have F grade? Professional help with ML right here", isSpam = true), Email("Hey, I left my phone at home. Email me if you need anything.", isSpam = false), Email("Stay At Home: COVID-19 news", isSpam = false), Email("Please see attachment for notes on today's meeting.", isSpam = false), Email("JetBrains license certificate", isSpam = false), Email("Your Education Pack expires soon ", isSpam = false) ) val nbc = emails.toNaiveBayesClassifier( featuresSelector = { it.message.splitWords().toSet() }, categorySelector = { it.isSpam } ) val spamInput = "your grade is still so bad, but I can help you to get more scores".splitWords().toSet() require(nbc.predict(spamInput) == true) { spamInput } val legitInput = "Thank you for placing the order ".splitWords().toSet() require(nbc.predict(legitInput) == false) { legitInput } } fun String.splitWords(): Sequence<String> = this.split(Regex("\\s")) .asSequence() .map { it.replace(Regex("[^A-Za-z]"), "") } .map { it.toLowerCase() } .filter { it.isNotEmpty() }
Пример работы с регулярными выражениями:
fun main(args: Array<String>) { //regex val month = "(JAN|FEB|MAR|APR|MAY|JUN|JUL|AUG|SEP|OCT|NOV|DEC)" fun getPattern(): String = """\d{2}\h$month\h\d{4}""" val regex = Regex(getPattern()) val str ="12 DEC 1996" val flag = regex.containsMatchIn(str) if (flag) println("{$str} is true!") else println("{$str} is wrong!") //null val listWithNulls: List<String?> = listOf("A", null, "B", "ERROR 404", null) for (item in listWithNulls) { item?.let {println(it)} ?: println("element is empty") } }
Судя по всему, у этого языка весьма неплохие перспективы. Его развитие идет активно, он поддерживается Google (что само по себе удивительно, ведь это сторонний коммерческий продукт), все больше программистов выбирают его для работы. Таким образом, есть шансы, что эта разработка рано или поздно станет стандартом де-факто для мобильных приложений.
Мы рассмотрели основы языка Kotlin, его базовый синтаксис и возможности. Само собой, для тщательного изучения нужно читать документацию и гуглить материалы. Кое-что можно почерпнуть и из видео-примеров ниже:
Прокси (proxy), или прокси-сервер — это программа-посредник, которая обеспечивает соединение между пользователем и интернет-ресурсом. Принцип…
Согласитесь, было бы неплохо соединить в одно сайт и приложение для смартфона. Если вы еще…
Повсеместное распространение смартфонов привело к огромному спросу на мобильные игры и приложения. Миллиарды пользователей гаджетов…
В перечне популярных чат-ботов с искусственным интеллектом Google Bard (Gemini) еще не пользуется такой популярностью…
Скрипт (англ. — сценарий), — это небольшая программа, как правило, для веб-интерфейса, выполняющая определенную задачу.…
Дедлайн (от англ. deadline — «крайний срок») — это конечная дата стачи проекта или задачи…