Kotlin (язык программирования)

редактировать
Язык программирования общего назначения

Kotlin
Kotlin-logo.svg
Paradigm Мультипарадигма : объектно-ориентированный, функциональный, императивный, блочно-структурированный, декларативный, универсальный, отражающий, одновременный
Разработан JetBrains
Developer JetBrains
Впервые появился22 июля 2011 г.; 9 лет назад (22.07.2011)
Стабильный выпуск 1.4.10 / 10 сентября 2020 г.; 43 дня назад (2020-09-10)
Дисциплина ввода Предполагаемый, статический, сильный
Платформа
OS Межплатформенная
Лицензия Лицензия Apache 2.0
Расширения имен файлов .kt,.kts,.ktm
Веб-сайтkotlinlang.org Измените это в Викиданных
Испытал влияние

Kotlin () - это кроссплатформенный, статически типизированный, язык программирования общего назначения язык программирования с выводом типа . Kotlin разработан для полного взаимодействия с Java, а версия JVM стандартной библиотеки Kotlin зависит от Библиотека классов Java, но вывод типа позволяет сделать ее синтаксис более кратким. Kotlin в основном нацелен на JVM, но также компилируется в JavaScript (например, для веб-приложений ications с использованием React ) или собственного кода (через LLVM ), например для собственных приложений iOS, использующих бизнес-логику с приложениями Android. Расходы на разработку языка несет JetBrains, в то время как Kotlin Foundation защищает товарный знак Kotlin.

7 мая 2019 года Google объявил, что язык программирования Kotlin теперь является предпочтительным языком для Разработчики приложений Android. С момента выпуска Android Studio 3.0 в октябре 2017 года Kotlin был включен в качестве альтернативы стандартному компилятору Java. Компилятор Android Kotlin по умолчанию нацелен на Java 6, но позволяет программисту выбирать целевые Java 8–13 для оптимизации или дополнительных функций.

Содержание

  • 1 История
  • 2 Дизайн
  • 3 Синтаксис
    • 3.1 Стиль процедурного программирования
    • 3.2 Основная точка входа
    • 3.3 Функции расширения
    • 3.4 Распаковка аргументов с оператором распространения
    • 3.5 Деструктуризация объявлений
    • 3.6 Вложенные функции
    • 3.7 Классы по умолчанию являются окончательными
    • 3.8 Абстрактные классы открыты по умолчанию
    • 3.9 Классы открыты по умолчанию
    • 3.10 Первичный конструктор и вторичные конструкторы
    • 3.11 Класс данных
    • 3.12 Интерактивная оболочка Kotlin
    • 3.13 Kotlin как язык сценариев
    • 3.14 Null Safety
    • 3.15 Lambdas
    • 3.16 Пример сложного «hello world»
  • 4 Инструменты
  • 5 Приложения
  • 6 Принятие
  • 7 См. Также
  • 8 Ссылки
  • 9 Внешние ссылки

История

В июле 2011 года JetBrains представила проект Kotlin, новый язык для JVM, который разрабатывался в течение года. Руководитель JetBrains Дмитрий Емеров сказал, что большинство языков не имеют тех функций, которые им нужны, за исключением Scala. Однако он назвал недостатком медленную компиляцию Scala. Одна из заявленных целей Kotlin - компилировать так же быстро, как Java. В феврале 2012 года JetBrains открыла исходный код проекта по лицензии Apache 2.

. Название происходит от острова Котлин, недалеко от St. Петербург. упомянули, что команда решила назвать его в честь острова, точно так же, как Java была названа в честь индонезийского острова Java (хотя язык программирования Java, возможно, был назван в честь кофе).

JetBrains надеется что новый язык будет стимулировать продажи IntelliJ IDEA.

Kotlin v1.0 был выпущен 15 февраля 2016 года. Это считается первым официально стабильным выпуском, и JetBrains взяла на себя долгосрочную перспективу. термин обратная совместимость, начиная с этой версии.

На Google I / O 2017 компания Google объявила о первоклассной поддержке Kotlin на Android.

Kotlin v1.2 был выпущен 28 ноября 2017 года. Совместное использование кода между JVM и функция платформ JavaScript была недавно добавлена ​​в этот выпуск (с версии 1.4 мультиплатформенное программирование является функцией альфа, обновленной с "экспериментальной"). Демонстрация полного стека была сделана с новым плагином Kotlin / JS Gradle.

Kotlin v1.3 был выпущен 29 октября 2018 года, предлагая сопрограммы для асинхронного программирования.

7 мая 2019 года Google объявил, что язык программирования Kotlin теперь является предпочтительным языком для разработчиков приложений Android.

Kotlin v1.4 был выпущен в августе 2020 года, например, небольшие изменения в поддержке платформ Apple, например, в Objective-C /Swift interop.

Дизайн

, сказал руководитель разработки Андрей Бреслав что Kotlin разработан как промышленный объектно-ориентированный язык и «лучший язык», чем Java, но при этом полностью совместим с кодом Java, что позволяет компаниям создавать постепенный переход с Java на Kotlin.

Точка с запятой не обязательна в качестве выражения терминатор ; в большинстве случаев новой строки достаточно для компилятора, чтобы сделать вывод о завершении инструкции.

Kotlin переменная объявления и параметр списки имеют тип данных, идущий после имени переменной (и с разделителем двоеточие ), аналогично BASIC, Pascal и TypeScript.

Переменные в Kotlin могут быть доступны только для чтения, объявлены с ключевым словом val или изменчивы, объявлены с помощью ключевого слова var.

Члены класса по умолчанию являются общедоступными, а классы сами по себе являются окончательными по умолчанию, что означает, что создание производного класса отключено, если базовый класс не объявлен с ключевым словом open.

В дополнение к классам и функциям-членам (эквивалентным методам) объектно-ориентированного программирования, Kotlin также поддерживает процедурное программирование с использование функций. Функции Kotlin (и конструкторы) поддерживают аргументы по умолчанию, аргументы переменной длины списки, именованные аргументы и перегрузку по уникальной сигнатуре. Функции-члены класса являются виртуальными, т.е. отправляются в зависимости от типа среды выполнения объекта, для которого они вызываются.

В Kotlin 1.3 добавлена ​​(экспериментальная) поддержка контрактов (вдохновленная парадигмой программирования Эйфеля по контракту )

Синтаксис

Стиль процедурного программирования

Kotlin ослабляет ограничение Java, разрешающее статическим методам и переменным существовать только в теле класса. Статические объекты и функции могут быть определены на верхнем уровне пакета без необходимости в избыточном уровне класса. Для совместимости с Java Kotlin предоставляет аннотацию JvmName, которая указывает имя класса, используемое при просмотре пакета из проекта Java. Например, @file: JvmName ("JavaClassName").

Основная точка входа

Как и в C, C ++, C #, Java и Go, точка входа в Программа Kotlin - это функция с именем "main", которой можно передать массив, содержащий любые аргументы командной строки. (Это необязательно, начиная с Kotlin 1.3). Perl и Unix shell стиль строковая интерполяция поддерживается. Также поддерживается вывод типа.

1 // Привет, мир! пример 2 fun main () {3 val scope = "World" 4 println ("Hello, $ scope!") 5} 6 7 fun main (args: Array ) {8 for (arg in args) {9 println (arg) 10} 11}

Функции расширения

Подобно C #, Kotlin позволяет пользователю добавлять функции в любой класс без формальностей, связанных с созданием производного класса с новыми функциями. Вместо этого Kotlin добавляет концепцию, которая позволяет функции «приклеивать» к общедоступному списку функций любого класса без формального размещения внутри класса. Другими словами, функция расширения - это вспомогательная функция, которая имеет доступ ко всему общедоступному интерфейсу класса, который она может использовать для создания нового интерфейса функции для целевого класса, и эта функция будет выглядеть точно так же, как функция класса, появляясь как часть проверки завершения кода функций класса. Например:

1 пакет MyStringExtensions 2 3 fun String.lastChar (): Char = get (length - 1) 4 5>>>println ("Kotlin".lastChar ())

Поместив предыдущий код в На верхнем уровне пакета класс String расширен за счет включения функции lastChar, которая не была включена в исходное определение класса String.

1 // Перегрузка оператора '+' с использованием функции расширения 2 operator fun Point.plus (other: Point): Point {3 return Point (x + other.x, y + other.y) 4} 5 6>>>val p1 = Point (10, 20) 7>>>val p2 = Point (30, 40) 8>>>println (p1 + p2) 9 Point (x = 40, y = 60)

Распаковать аргументы с оператором распространения

Подобно Python, оператор распространения звездочка (*) распаковывает содержимое массива как аргументы, разделенные запятыми, в функцию:

1 fun main (args: Array ) {2 val list = listOf ("args:", * args) 3 println (list) 4}

Деструктурирующие объявления

Деструктурирующие объявления разбивают объект сразу на несколько переменных, например объект с 2D координатами может быть преобразован в два целых числа x и y.

Например, объект Map.Entryподдерживает деструктуризацию для упрощения доступа к его полям ключа и значения:

1 для ((ключ, значение) на карте) {2 println ( "$ key: $ value") 3}

Вложенные функции

Kotlin позволяет объявлять локальные функции внутри других функций или методов.

1 класс User (val id: Int, val name: String, val address: String) 2 3 fun saveUserToDb (user: User) {4 fun validate (user: User, value: String, fieldName: String) {5 require (value.isNotEmpty ()) {"Невозможно сохранить пользователя $ {user.id}: empty $ fieldName"} 6} 7 8 validate (user, user.name, "Name") 9 validate (user, user. address, "Address") 10 // Сохраняем пользователя в базе данных 11... 12}

Классы являются окончательными по умолчанию

В Kotlin, чтобы получить новый класс из базового типа, базовый класс должен быть явно отмечен как «открытый». Это контрастирует с большинством объектно-ориентированных языков, таких как Java, где классы открыты по умолчанию.

Пример базового класса, открытого для создания от него нового подкласса.

1 // открыть в классе означает, что этот класс позволит производным классам 2 открыть класс MegaButton {3 4 // запретить открытие функции означает, что 5 // полиморфное поведение отключено, если функция переопределена в производном классе 6 fun disable () {...} 7 8 // открытие функции означает, что 9 // полиморфное поведение разрешено, если функция переопределена в производном классе 10 open fun animate () {...} 11} 12 13 class GigaButton: MegaButton {14 15 // Явное использование ключевого слова override, необходимого для переопределения функции в производном классе 16 override fun animate () {println ("Giga Click!")} 17}

Абстрактные классы открыты по умолчанию

Абстрактные классы определить абстрактные или «чисто виртуальные» функции-заполнители, которые будут определены в производном классе. Абстрактные классы открыты по умолчанию.

1 // Здесь ключевое слово open не нужно, оно уже открыто по умолчанию 2 абстрактный класс Animated {3 4 // Эта виртуальная функция уже открыта по умолчанию также 5 abstract fun animate () 6 7 open fun stopAnimating () {} 8 9 fun animateTwice () {} 10}

Классы по умолчанию являются общедоступными

Kotlin предоставляет следующие ключевые слова для ограничения видимости для объявления верхнего уровня, такого как классы, и для членов класса:

общедоступный, внутренний, защищенный и частный.

При применении к члену класса:

public (по умолчанию): Виден везде Internal: Виден в защищенном модуле: Виден в подклассах private: Виден в классе

Когда применяется к объявлению верхнего уровня

public (по умолчанию): Виден везде internal: Виден в модуле private: Виден в файле

Пример:

1 // Класс виден только в текущий модуль 2 внутренний открытый класс TalkativeButton: Focusable {3 // метод виден только для текущего класса 4 private fun yell () = println ("Hey!") 5 6 // метод виден для текущего класса и производных классов 7 protected fun Whisper () = println («Давайте поговорим!») 8}

Первичный конструктор и вторичные конструкторы

Kotlin поддерживает спецификацию «первичного конструктора» как часть самого определения класса, состоящего из список аргументов после имени класса. Этот список аргументов поддерживает расширенный синтаксис списков аргументов стандартных функций Kotlin, который позволяет декларировать свойства класса в основном конструкторе, включая атрибуты видимости, расширяемости и изменчивости. Кроме того, при определении подкласса свойства в супер-интерфейсах и суперклассах могут быть переопределены в основном конструкторе.

1 // Пример класса, использующего синтаксис основного конструктора 2 // (Для этого класса требуется только один конструктор) 3 открытый класс PowerUser: User (4 защищенных псевдонима val: String, 5 окончательное переопределение var isSubscribed: Boolean = true) 6 {7... 8}

Однако в случаях, когда для класса требуется более одного конструктора, можно использовать более общий конструктор, называемый синтаксис вторичного конструктора, который очень похож на синтаксис конструктора, используемый в большинство объектно-ориентированных языков, таких как C ++, C # и Java.

1 // Пример класса с использованием синтаксиса вторичного конструктора 2 // (для этого класса требуется более одного конструктора) 3 class MyButton: View {4 5 // Конструктор №1 6 конструктор (ctx: Context): super (ctx) {7 //... 8} 9 10 // Конструктор # 2 11 конструктор (ctx: Context, attr: AttributeSet): super (ctx, attr) {12 //... 13} 14}

Данные Класс

Kotlin предоставляет классы данных для определения классов, хранящих только свойства. В программировании на Java классы, хранящие только свойства, не являются чем-то необычным, но для этой цели используются обычные классы. Kotlin предоставил возможность исключительно определять классы, которые хранят только свойства. Эти классы данных не обязаны объявлять какие-либо методы, только свойства. Класс данных обычно не содержит тела, в отличие от обычного класса. Переопределения по умолчанию для методов объекта, таких как equals ()или toString (), генерируются во время компиляции. Ключевое слово dataиспользуется перед ключевым словом classдля определения класса данных.

1 fun main (args: Array) {2 // создаем объект класса данных, как и любой другой объект класса 3 var book1 = Book ("Kotlin Programming", 250) 4 println (book1) 5 // вывод: Book ( name = Kotlin Programming, price = 250) 6} 7 8 // класс данных с параметрами и их необязательными значениями по умолчанию 9 класс данных Book (val name: String = "", val price: Int = 0)

Интерактивная оболочка Kotlin

$ kotlinc-jvm type: help for help; : quit for quit>>>2 + 2 4>>>println ("Hello, World!") Привет, мир!>>>

Kotlin как язык сценариев

Kotlin также можно использовать как язык сценариев. Скрипт - это исходный файл Kotlin (.kts) с исполняемым кодом верхнего уровня.

1 // list_folders.kts 2 импортировать java.io.File 3 val папки = File (args [0]). ListFiles {файл ->file.isDirectory ()} 4 папки?.ForEach {folder ->println ( folder)}

Скрипты можно запустить, передав компилятору параметр -scriptи соответствующий файл скрипта.

$ kotlinc -script list_folders.kts "path_to_folder_to_inspect"

Null Safety

Kotlin различает типы данных, допускающие значение NULL, и типы данных, не допускающие значения NULL. Все объекты, допускающие значение NULL, должны быть объявлены с помощью знака "?" постфикс после имени типа. Операции с объектами, допускающими значение NULL, требуют особой осторожности со стороны разработчиков: перед использованием значения необходимо выполнить проверку NULL. Kotlin предоставляет нулевые безопасные операторы в помощь разработчикам:

1 удовольствие sayHello (возможно: String ?, neverNull: Int) {2 // использование оператора elvis 3 val name: String = might be?: "stranger" 4 println ("Hello $ name") 5}

Пример использования оператора безопасной навигации:

1 // возвращает null, если... 2 // - foo () возвращает null, 3 // - или если foo () не равно null, но bar () возвращает null, 4 // - или если foo () и bar () не равны нулю, но baz () возвращает null. 5 // наоборот, возвращаемое значение не равно нулю тогда и только тогда, когда foo (), bar () и baz () не равны нулю 6 foo () ?. bar () ?. baz ()

Lambdas

Kotlin обеспечивает поддержку функций высшего порядка и анонимных функций или лямбда-выражений.

1 // следующая функция принимает лямбду, f, и выполняет f, передавая ее строка "lambda" 2 // обратите внимание, что (s: String) ->Unit указывает лямбда с параметром String и типом возврата Unit 3 fun executeLambda (f: (s: String) ->Unit) {4 f (" lambda ") 5}

Лямбды объявляются с использованием фигурных скобок, {}. Если лямбда принимает параметры, они объявляются в фигурных скобках и сопровождаются оператором ->.

1 // следующий оператор определяет лямбду, которая принимает один параметр и передает его функции println 2 val l = {c: Any? ->println (c)} 3 // лямбды без параметров можно просто определить с помощью {} 4 val l2 = {print ("no parameters")}

Пример сложного "hello world"

1 fun main ( args: Array ) {2 greet {3 to.place 4}.print () 5} 6 7 // Встроенные функции высшего порядка 8 встроенные функции fun greet (s: () ->String): String = приветствие andAnother s () 9 10 // Инфиксные функции, расширения, вывод типов, типы, допускающие значение NULL, 11 // лямбда-выражения, помеченные this, оператор Элвиса (? :) 12 инфиксный fun String.andAnother (other: Any?) = buildString () 13 {14 добавить (это @ andAnother); добавить (""); append (other?: "") 15} 16 17 // Неизменяемые типы, делегированные свойства, ленивая инициализация, строковые шаблоны 18 val приветствие от ленивого {val doubleEl: String = "ll"; "he $ {doubleEl} o"} 19 20 // Запечатанные классы, сопутствующие объекты 21 запечатанный класс для {сопутствующего объекта {val place = "world"}} 22 23 // Расширения, модуль 24 fun String.print () = println (this)

Инструменты

  • IntelliJ IDEA поддерживает подключаемый модуль для Kotlin. IntelliJ IDEA 15 была первой версией, которая объединила плагин Kotlin в IntelliJ Installer и предоставила поддержку Kotlin из коробки.
  • JetBrains также предоставляет плагин для Eclipse.
  • интеграции с общей сборкой Java поддерживаются инструменты, включая Apache Maven, Apache Ant и Gradle.
  • Android Studio (на основе IntelliJ IDEA) имеет официальную поддержку Kotlin, начиная с Android Studio 3.
  • Emacs имеет режим Kotlin в своем репозитории пакетов Melpa.
  • имеет подключаемый модуль, поддерживаемый на Github.

Приложения

Kotlin широко используется на стороне сервера и Android разработка. На Android платформа на какое-то время застряла на Java 7 (с некоторыми современными языковыми функциями, доступными с помощью Retrolambda или набора инструментов Jack), а Kotlin предлагает множество улучшений для программистов, таких как безопасность нулевого указателя, функции расширения и инфиксная нотация. Вместе с полной совместимостью с Java и хорошей поддержкой IDE (Android Studio) он призван улучшить читаемость кода, упростить расширение классов Android SDK и ускорить разработку.

Kotlin был объявлен официальным языком разработки Android на Google I / O 2017. Он стал третьим языком, полностью поддерживаемым для Android в дополнение к Java и C ++.

Spring официально добавила поддержку Kotlin с версией 5 4 января 2017 г. до объявления Android, сделанного Google на Google I / O 2017. Часть официальной поддержки Kotlin в Spring включает документацию, поддержку библиотек и видеопрезентации. Многие другие серверные библиотеки / фреймворки, такие как Ktor и Vert.x, предоставляют официальную поддержку Kotlin. Облачная платформа Google официально поддерживает Kotlin, однако другие облачные платформы, такие как AWS (Amazon Web Services) и Azure, официально не предоставляют поддержку Kotlin, хотя Kotlin, как известно, работает на этих платформах.

Kotlin в основном используется в новых проектах (96%) и в основном используется в рабочих проектах (75%), за ним следуют личные проекты (68%). Следующие типы программного обеспечения разрабатываются с использованием Kotlin:

  • Mobile (56%)
  • Web Backend (47%)
  • Библиотека / фреймворк (28%)
  • Tooling (20%)

Linux - основная цель, используемая в проектах Kotlin Native (74%), за ней следуют Android (48%) и MacOS (47%).

Принятие

В 2018 году Kotlin был самым быстрорастущим языком на GitHub с количеством разработчиков в 2,6 раза по сравнению с 2017 годом. Это четвертый по популярности язык программирования согласно опросу разработчиков Stack Overflow 2020 года.

Kotlin также был удостоен награды O'Reilly Open Source Software Conference Breakout Award за 2019 год.

Многие компании и организации использовали Kotlin для разработки серверных приложений:

  • Google
  • Норвежский Налоговая администрация
  • Gradle
  • Amazon
  • Square
  • JetBrains
  • Flux
  • Allegro
  • OLX
  • Shazam
  • Pivotal
  • Rocket Travel
  • Meshcloud
  • Zalando

. Некоторые компании / организации использовали Kotlin для веб-разработки :

  • JetBrains
  • Data2viz
  • Fritz2
  • Barclay's Bank

. Ряд компаний публично заявили, используя Kotlin:

См. также

  • Портал бесплатного программного обеспечения с открытым исходным кодом
  • icon Портал компьютерного программирования

Ссылки

  • Эта статья содержит цитаты из руководств Kotlin которые выпущены под лицензией Apache 2.0.

Внешние ссылки

Последняя правка сделана 2021-05-25 13:40:36
Содержание доступно по лицензии CC BY-SA 3.0 (если не указано иное).
Обратная связь: support@alphapedia.ru
Соглашение
О проекте