LINUX.ORG.RU

Вышел Kotlin 1.0

 , ,


2

4

После многих лет разработки вышла стабильная версия языка Kotlin 1.0.

Kotlin — это язык программирования, разрабатываемый компанией JetBrains, компилируемый в JVM байткод. Язык комбинирует ОО и функциональные подходы, и фокусируется на интероперабельности c Java, безопасности, ясности кода и инструментальной поддержке.

Kotlin является языком общего назначения и работает везде, где работает Java: серверные приложения, мобильные приложения (Android), десктопные приложения.

От себя можно добавить что Kotlin это «улучшенная Java», язык вобравший в себя полезные элементы из других языков (таких как C#). При переходе на Kotlin, существенно уменьшается объем «java лапши» в коде.

Исходный код проекта доступен на github.

Попробовать язык без установки можно здесь.

>>> Подробности

★★

Проверено: maxcom ()
Последнее исправление: maxcom (всего исправлений: 4)

Ответ на: комментарий от Legioner

А он есть. Например если есть огромный проект на Java и хочется переводить его потихоньку на другой язык.

Не имеет смысла переводить огромный Java-проект как на Scala так и на Kotlin по многим причинам: качество кода в таких проектах очень разное (в основном плохое), огромное количество костылей и другого легаси. В большинстве случаев проще написать с нуля, что и делается в том же опенсорсе постоянно.

Дело не в полноценности, а в том, что Scala переизобретает многое, что уже есть в стандартной библиотеке Java

Я бы сказал, что улучшает. Но в одном ты прав, Scala сильно отличается от Java и если юзать Scala из Java-кода, то ни к чему хорошему это не приведет. Что еще раз показывает что есть что.

Я не специалист по андроиду, но читал, что это реальная проблема из-за каких-то особенностей андроида (вроде не более 65535 методов может быть в приложении) и Scala этот лимит сильно уменьшает.

Не проблема.

Scala считаю непрактичной для 90% проектов из-за её чрезмерной сложности.

Не осилил, ясно.

Судя по популярности Kotlin-а я не один так считаю.

Стая мух не может ошибаться:) Windows тоже популярен.

Насколько я знаю, Scala развивается Мартином Одерски, который является основателем коммерческой компании Typesafe. Я не вижу отличий.

Скажи еще что Linux Foundation развивает Linux kernel:) Почитай хотя бы прежде чем что-то утверждать.

Leviathan941
()
Ответ на: комментарий от Legioner

Естественно в реальности там скорее всего не будет null, но от ошибки никто не застрахован.

kazufukurou
()
Ответ на: комментарий от Legioner

Андроид компилируется в *.class, собирается в *.jar, переформатируется в *.dex, и пакуется в *.apk.

*.dex собирается довольно долго и процессорожруче, и ограничения по числу классов/методов идет именно здесь. Scala не просто понижает лимит, она тупо в него не влезает.

Поэтому для Скалы обязателен Proguard, который выкидывает неиспользованный код, после этого проблема больше не всплывает.

Вторая часть беды, опять же, тормознутость. Тормозит и компилятор (как обычно), и Proguard (надо же разобраться, кто нужен, а кто нет), и *.dex-запаковщик (даже после выкидывания ненужного остается много жира), и кэширование запаковок тоже периодически отваливается, так что весь процесс по новой запускается.

С дебагом стандартные проблемы — компилятор скалы очень умный, и работающий код может сильно отличаться от того, что в тексте написано.

anonymous
()
Ответ на: комментарий от VladimirP

JRuby это ж динамическая типизация, совсем другая тема

maxcom ★★★★★
()
Ответ на: комментарий от anonymous

Может быть я открою Америку для тебя, но чтобы научится создавать качественный софтовый продукт надо прочитать много больше 2к слов.

Leviathan941
()
Ответ на: комментарий от kazufukurou

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

GoodPerson
()
Ответ на: комментарий от qrck

в idea ctl+shift, convert to kotl<enter> - и весь код автоматом сконверчен

А в обратную сторону?

I60R ★★
()
Ответ на: комментарий от Leviathan941

Качественного софта под Андроид на Скале нет. В том числе и потому, что не нужно решать надуманных проблем.

anonymous
()
Ответ на: комментарий от CARS

смелый шаг, значительно приближающий Kotlin к самому уродливому ЯП XXI века

Мне тоже, при просмотре видео, пришел на ум Rust.
Там, как и здесь, прекрасные идеи испоганили отвратительным синтаксисом

I60R ★★
()
Ответ на: комментарий от kazufukurou

Из-за этого выпилили ternary operator, вместо него предлагают юзать уродливый if … else …

I60R ★★
()
Последнее исправление: I60R (всего исправлений: 1)
Ответ на: комментарий от Legioner

Спасибо за пример. Точно такая фича есть в groovy, а вот в Scala нет. Мне не хватало когда я свой DSL писал на Scala. Буду знать что в Kotlin есть.

voronaam ★★
()
Ответ на: комментарий от maxcom

В случае с Kotlin дело не только в том, что можно не писать «sb.», а в том, что код исполняемый внутри лямбды будет исполняться в определенном контексте, окруженный определенными конкретными элементами.

Например для работы с sqlite базой на андроиде, если мы хотим облегчить обертку в транзакции, вместо Java кода

db.beginTransaction()
try {
   db.delete("users", "first name = ?", new String[] { "Jake" });
   db.setTransactionSuccessful();
} 
finally {
   db.endTransaction();
}

Можно определить extension-метод:

inline fun SQLiteDatabase.inTransaction(func: SQLiteDatabase.() -> Unit) 
{
   beginTransaction()
   try {
      func()
      setTransactionSuccessful()
   } 
   finally {
      endTransaction()
   }
}

И потом использовать его вот так:

db.inTransaction {
   delete("users", "first name = ?", arrayOf("Jake" ));
}

Существенно упрощает жизнь, куда меньше шансы что в одном каком-то конкретном месте будет забыт вызов или случайно порядок выйдет не правильный. При этом в плане байткода скомпилированного код выходит 1-в-1 такой-же что и оригинальный код на Java (для этого inline там).

Или можно например создать класс-враппер, который будет гарантировать что доступ к внутреннему обьекту можно получить только заблокировав его, тем самым исключая случайный доступ без блокировки:


data class Lock<T>(private val obj: T) 
{
   public fun acquire(func: (T) -> Unit)
   {
      synchronized (obj) {
         func(obj)
      }
   }
}

val readerLock = Lock(JsonReader(stream))

readerLock.aquire {
   println(it.readString())
}

от «it» внутри последней лямбды я специально не стал избавлятся, это можно сделать если заменить

public fun acquire(func: (T) -> Unit)

на

public fun acquire(func: T.() -> Unit)
qrck ★★
() автор топика
Последнее исправление: qrck (всего исправлений: 3)
Ответ на: комментарий от qrck

Эти обе задачи в Scala решены через call by name параметры и implicit'в.

maxcom ★★★★★
()
Ответ на: комментарий от VladimirP

JRuby - динамически типизированная тормозня.

anonymous
()

По сравнению с Java 8, есть что-то стоящее?

vertexua ★★★★★
()
Ответ на: комментарий от FRWHate

При переходе на Haskell, существенно уменьшается объем «Java/Kotlin лапши» в коде.

Java / Kotlin лапша исчезает полностью.

anonymous
()
Ответ на: комментарий от anonymous

... и ограничения по числу классов/методов идет именно здесь. Scala не просто понижает лимит, она тупо в него не влезает.

Причем не влезает из-за пристрастия некоторых разработчиков Scala к traits, особенно в библиотеке коллекций. Это при раскрытии traits образуется такое огромное количество методов.

На мой частный взгляд эта библиотека коллекций в Scala - пример плохого дизайна, но в программировании всегда существует множество точек зрения, и кому-то она может даже нравиться) Причем некоторые готовы доказывать свою точку зрения до посинения с пеной у рта, как обычно.

Было забавное видео с Доном Саймом (создателем F#), Джо Армстронгом (создателем Erlang) и Мартином Одерским (создателем Scala). На картинке было очень четко видно, как первые двое разошлись в одном важном вопросе с последним, вплоть до занятия позы психологической защиты, когда человек подсознательно переминает ногу в положение от собеседника, как бы огораживаясь. Вопрос был общий, но туда можно отнести и злоупотребление traits.

dave ★★★★★
()

Абсолютно мертворожденная идея.

Взялись улучшать совершенный ЯП? Но компилируют его под ту же самую кривульку JVM?

Образцовое ненужно.

AVL2 ★★★★★
()
Ответ на: комментарий от AVL2

ту же самую кривульку JVM

Потому что некоторые придурки умудрились написать на этом гавне архиважное АПИ к ОС, обходить которое с jni выйдет еще печальнее, чем терпеть jvm под своим апп. В принципе надо бы попробовать завести на андроиде какуюто иную ВМ с полноценным мостом в jvm, причем так, что не будет виснуть на хеловорлде, как xamarin. Но это из серии фантастики пока. А котлин вот уже есть пожалуйста, для текущих нужд да и внутри java проектов на нем писать можно (если шеф не проведает).

q0tw4 ★★★★
()
Ответ на: комментарий от Legioner

Хрен редьки... Покажи хотяб один ЯП, который не может компилиться в .class, а сразу генерит .dex, причем не потому что афтор идиот, а ради каких-то реальных плюшек.

q0tw4 ★★★★
()
Ответ на: комментарий от q0tw4

Но api это абстракция. А jvm это суровая реальность, деревяные игрушки и скользкие подонники.

AVL2 ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.