Kotlin (programlama dili) - Kotlin (programming language)
paradigma | Çoklu paradigma : nesne yönelimli , işlevsel , zorunlu , blok yapılı , bildirimsel , genel , yansıtıcı , eşzamanlı |
---|---|
Tarafından tasarlandı | JetBrain'ler |
geliştirici | JetBrain'ler |
İlk ortaya çıktı | 22 Temmuz 2011 |
kararlı sürüm | |
Önizleme sürümü | build-1.6.20-dev-107 / 26 Ağustos 2021
|
Yazma disiplini | Çıkarsanmış , statik , güçlü |
Platformu |
|
işletim sistemi | Çapraz platform |
Lisans | Apache Lisansı 2.0 |
Dosya adı uzantıları | .kt, .kts, .ktm |
İnternet sitesi |
kotlinlang |
Tarafından etkilenmiş | |
Kotlin ( / k ɒ t l ɪ n / ) a, platformlar arası , statik olarak yazılan , genel amaçlı bir programlama dili ile tür kesmesi . Kotlin, Java ile tam olarak birlikte çalışacak şekilde tasarlanmıştır ve Kotlin'in standart kitaplığının JVM sürümü , Java Sınıf Kitaplığına bağlıdır , ancak tür çıkarımı, sözdiziminin daha kısa olmasını sağlar. Kotlin esas olarak JVM'yi hedefler, ancak aynı zamanda JavaScript'i (örneğin, React kullanan ön uç web uygulamaları için ) veya yerel kodu ( LLVM aracılığıyla ) derler ; örneğin, yerli için iOS paylaşım uygulamaları iş mantığını ile Android uygulamaları. Dil geliştirme maliyetleri JetBrains tarafından karşılanırken , Kotlin Vakfı Kotlin ticari markasını korur.
7 Mayıs 2019'da Google, Kotlin programlama dilinin artık Android uygulama geliştiricileri için tercih edilen dil olduğunu duyurdu . Android Studio 3.0'ın Ekim 2017'de piyasaya sürülmesinden bu yana Kotlin, standart Java derleyicisine alternatif olarak dahil edilmiştir. Android Kotlin derleyicisi varsayılan olarak Java 8 bayt kodu üretir (daha sonraki herhangi bir JVM'de çalışır), ancak programcının optimizasyon için Java 9'u 16'ya kadar hedeflemeyi seçmesine izin verir veya daha fazla özelliğe izin verir; Java 16'da tanıtılan ve Kotlin 1.5'ten itibaren kararlı kabul edilen JVM için çift yönlü kayıt sınıfı birlikte çalışabilirlik desteğine sahiptir .
Doğrudan JavaScript'e derleme için Kotlin desteği (yani klasik arka uç), geliştiricileri tarafından Kotlin 1.3'ten beri kararlı olarak kabul edilirken, yeni Kotlin/JS(IR) 1.5.30 sürümünden itibaren beta aşamasındadır. Kotlin/JVM(IR) ve Kotlin/JS'nin ( IR tabanlı) yeni optimize edilmiş uygulamaları 1.4 sürümünde tanıtıldı. Kotlin/JVM(IR), sürüm 1.5 sürümünden itibaren kararlı olarak kabul edilir. Kotlin/Native (örneğin Apple silikon desteği için) 1.3 sürümünden beri beta olarak kabul edilmiştir.
Tarih
Temmuz 2011'de JetBrains , bir yıldır geliştirilmekte olan JVM için yeni bir dil olan Project Kotlin'i tanıttı. JetBrains lideri Dmitry Jemerov, Scala dışında çoğu dilin aradıkları özelliklere sahip olmadığını söyledi . Ancak, Scala'nın yavaş derleme süresini bir eksiklik olarak gösterdi. Kotlin'in belirtilen hedeflerinden biri, Java kadar hızlı derlemektir. Şubat 2012'de JetBrains, projeyi Apache 2 lisansı altında açık kaynaklı hale getirdi .
Adı , St. Petersburg yakınlarındaki Kotlin Adası'ndan geliyor . Andrey Breslav , ekibin, tıpkı Java'nın Endonezya'nın Java adasından sonra adlandırılması gibi (ancak Java programlama dili belki de kahveden sonra adlandırılmış olsa da) bir adanın adını vermeye karar verdiğini belirtti .
JetBrains, yeni dilin IntelliJ IDEA satışlarını artıracağını umuyor .
Kotlin v1.0, 15 Şubat 2016'da yayımlandı. Bu, resmi olarak ilk kararlı sürüm olarak kabul ediliyor ve JetBrains, bu sürümden başlayarak uzun vadeli geriye dönük uyumluluk taahhüdünde bulundu.
At Google I / O 2017 Google üzerinde KOTLIN için birinci sınıf destek açıkladı Android .
Kotlin v1.2 28 Kasım 2017'de yayınlandı. JVM ve JavaScript platformları arasında kod paylaşma özelliği bu sürüme yeni eklendi (versiyon 1.4'ten itibaren çok platformlu programlama "deneysel"den yükseltilmiş bir alfa özelliğidir). Bir tam-yığın demo yeni KOTLIN / JS Gradle tapa ile yapılmıştır.
Kotlin v1.3, 29 Ekim 2018'de yayımlandı ve eşzamansız programlama için eşyordamlar getirdi.
7 Mayıs 2019'da Google, Kotlin programlama dilinin artık Android uygulama geliştiricileri için tercih edilen dil olduğunu duyurdu.
Kotlin v1.4, örneğin, Apple platformlarının desteğinde, yani Objective-C / Swift birlikte çalışmasında bazı küçük değişikliklerle birlikte, Ağustos 2020'de piyasaya sürüldü .
Kotlin v1.5, Mayıs 2021'de piyasaya sürüldü.
Tasarım
Geliştirme lideri Andrey Breslav, Kotlin'in endüstriyel güçlü bir nesne yönelimli dil ve Java'dan "daha iyi bir dil" olacak şekilde tasarlandığını , ancak yine de Java koduyla tamamen birlikte çalışabilir ve şirketlerin Java'dan Kotlin'e kademeli bir geçiş yapmasına olanak tanıdığını söyledi. .
Noktalı virgül , ifade sonlandırıcı olarak isteğe bağlıdır ; çoğu durumda , derleyicinin ifadenin sona erdiğini anlaması için yeni bir satır yeterlidir .
Kotlin değişken bildirimleri ve parametre listeleri sahip veri tipi değişken adı sonra gelen (ve bir ile kolon benzer ayırıcı) TEMEL , Pascal , typescript ve Rust .
Kotlin'deki değişkenler salt okunur olabilir, val anahtar sözcüğüyle bildirilebilir veya mutable , var anahtar sözcüğüyle bildirilebilir .
Sınıf üyeleri varsayılan olarak geneldir ve sınıfların kendileri varsayılan olarak nihaidir, yani temel sınıf open anahtar sözcüğüyle bildirilmediği sürece türetilmiş bir sınıf oluşturma devre dışı bırakılır .
Ek olarak sınıfları ve eleman fonksiyonlarının nesne yönelimli programlama (yöntem eşdeğer), Kotlin da destekler prosedürel programlama kullanımı ile fonksiyonları . Kotlin işlevleri (ve yapıcıları) varsayılan argümanları , değişken uzunluklu argüman listelerini, adlandırılmış argümanları ve benzersiz imza ile aşırı yüklemeyi destekler. Sınıf üyesi işlevleri sanaldır, yani çağrıldıkları nesnenin çalışma zamanı türüne göre gönderilir.
Kotlin 1.3, sözleşmeler için (stdlib'de kararlı; kullanıcı tanımlı sözleşmeler deneysel) desteği ekler ( Eiffel'in sözleşme programlama paradigmasıyla tasarımından esinlenmiştir )
Kotlin geliştiricilerine göre, Kotlin'den JavaScript kodunu çağırabilirsiniz , örneğin tam, tür güvenli React uygulamaları yazabilir veya ön uçla doğrulama mantığını paylaşan tam yığın web uygulamalarını yazabilir ve sürdürebilirsiniz ya da "Kotlin kodunuzdan aşağıdakileri içeren kitaplıklar oluşturabilirsiniz." JavaScript veya TypeScript ile yazılmış herhangi bir kod tabanından modüller olarak tüketilebilir .
Sözdizimi
Prosedürel programlama stili
Kotlin, Java'nın statik yöntemlere ve değişkenlere yalnızca bir sınıf gövdesi içinde var olmasına izin verme kısıtlamasını gevşetir . Statik nesneler ve fonksiyonlar, fazlalık bir sınıf seviyesine ihtiyaç duymadan paketin en üst seviyesinde tanımlanabilir. Java ile uyumluluk için Kotlin JvmName
, paket bir Java projesinden görüntülendiğinde kullanılan sınıf adını belirten bir açıklama sağlar . Örneğin, @file:JvmName("JavaClassName")
.
Ana giriş noktası
Olduğu gibi C , C ++ , C # , Java ve Git , giriş noktası bir Kotlin için programın herhangi birini içeren bir dizi aktarılabilir "ana" adında bir fonksiyon olduğunu komut satırı argümanları. Bu, Kotlin 1.3'ten beri isteğe bağlıdır. Perl , PHP ve Unix kabuk stili dize enterpolasyonu desteklenir. Tür çıkarımı da desteklenir.
// Hello, World! example
fun main() {
val scope = "World"
println("Hello, $scope!")
}
fun main(args: Array<String>) {
for (arg in args)
println(arg)
}
Genişletme işlevleri
C#'a benzer şekilde Kotlin, yeni işlevlerle türetilmiş bir sınıf oluşturma formaliteleri olmaksızın herhangi bir sınıfa bir uzantı işlevi eklemeye izin verir . Bir uzantı işlevinin, bir hedef sınıfa yeni bir işlev arabirimi oluşturmak için kullanabileceği bir sınıfın tüm genel arabirimine erişimi vardır. Bir uzantı işlevi, tam olarak sınıfın bir işlevi gibi görünecek ve sınıf işlevlerinin kod tamamlama incelemesinde gösterilecektir. Örneğin:
package MyStringExtensions
fun String.lastChar(): Char = get(length - 1)
>>> println("Kotlin".lastChar())
Önceki kodu bir paketin en üst düzeyine yerleştirerek, String sınıfı, String sınıfının lastChar
orijinal tanımında yer almayan bir işlevi içerecek şekilde genişletilir .
// Overloading '+' operator using an extension function
operator fun Point.plus(other: Point): Point {
return Point(x + other.x, y + other.y)
}
>>> val p1 = Point(10, 20)
>>> val p2 = Point(30, 40)
>>> println(p1 + p2)
Point(x=40, y=60)
Yayılma operatörü ile argümanları açın
Python'a benzer şekilde, yayılma operatörü yıldız işareti (*), bir dizinin içeriğini bir işleve virgülle ayrılmış bağımsız değişkenler olarak açar:
fun main(args: Array<String>) {
val list = listOf("args: ", *args)
println(list)
}
yıkım beyanları
Strüktür kırıcı bildirimleri , örneğin, bir 2 boyutlu nesne olabilir koordinat seferde birden çok değişken bir nesne dekompoze bozunmamış iki tam sayı, x ve y içine.
Örneğin, Map.Entry
nesne, anahtar ve değer alanlarına erişimi basitleştirmek için yıkımı destekler:
for ((key, value) in map)
println("$key: $value")
İç içe işlevler
Kotlin, yerel işlevlerin diğer işlevlerin veya yöntemlerin içinde bildirilmesine izin verir.
class User(val id: Int, val name: String, val address: String)
fun saveUserToDb(user: User) {
fun validate(user: User, value: String, fieldName: String) {
require(value.isNotEmpty()) { "Can't save user ${user.id}: empty $fieldName" }
}
validate(user, user.name, "Name")
validate(user, user.address, "Address")
// Save user to the database
...
}
Sınıflar varsayılan olarak kesindir
Kotlin'de, bir temel sınıf türünden yeni bir sınıf türetmek için, temel sınıfın açıkça "açık" olarak işaretlenmesi gerekir. Bu, sınıfların varsayılan olarak açık olduğu Java gibi çoğu nesne yönelimli dilin aksine.
Kendisinden yeni bir alt sınıf türetmeye açık olan bir temel sınıf örneği.
// open on the class means this class will allow derived classes
open class MegaButton {
// no-open on a function means that
// polymorphic behavior disabled if function overridden in derived class
fun disable() { ... }
// open on a function means that
// polymorphic behavior allowed if function is overridden in derived class
open fun animate() { ... }
}
class GigaButton: MegaButton {
// Explicit use of override keyword required to override a function in derived class
override fun animate() { println("Giga Click!") }
}
Soyut sınıflar varsayılan olarak açıktır
Soyut sınıflar , türetilmiş bir sınıfta tanımlanacak olan soyut veya "saf sanal" yer tutucu işlevleri tanımlar. Soyut sınıflar varsayılan olarak açıktır.
// No need for the open keyword here, it’s already open by default
abstract class Animated {
// This virtual function is already open by default as well
abstract fun animate()
open fun stopAnimating() { }
fun animateTwice() { }
}
Sınıflar varsayılan olarak herkese açıktır
Kotlin, sınıflar gibi üst düzey bildirimler ve sınıf üyeleri için görünürlüğü kısıtlamak için aşağıdaki anahtar sözcükleri sağlar: public
, internal
, protected
, ve private
.
Bir sınıf üyesine uygulandığında:
Anahtar kelime | görünürlük |
---|---|
public (varsayılan) |
Her yer |
internal |
Bir modül içinde |
protected |
alt sınıflar içinde |
private |
Bir sınıf içinde |
Bir üst düzey bildirime uygulandığında:
Anahtar kelime | görünürlük |
---|---|
public (varsayılan) |
Her yer |
internal |
Bir modül içinde |
private |
Bir dosya içinde |
Örnek:
// Class is visible only to current module
internal open class TalkativeButton : Focusable {
// method is only visible to current class
private fun yell() = println("Hey!")
// method is visible to current class and derived classes
protected fun whisper() = println("Let's talk!")
}
Birincil kurucu ve ikincil kurucular
Kotlin, sınıf adının ardından bir bağımsız değişken listesinden oluşan sınıf tanımının bir parçası olarak bir "birincil kurucu" belirtimini destekler. Bu argüman listesi, Kotlin'in standart fonksiyon argüman listelerinde, görünürlük, genişletilebilirlik ve değişkenlik nitelikleri dahil olmak üzere birincil kurucuda sınıf özelliklerinin bildirilmesini sağlayan genişletilmiş bir sözdizimini destekler. Ek olarak, bir alt sınıf tanımlanırken, süper arabirimlerdeki ve süper sınıflardaki özellikler, birincil kurucuda geçersiz kılınabilir.
// Example of class using primary constructor syntax
// (Only one constructor required for this class)
open class PowerUser(
protected val nickname: String,
final override var isSubscribed: Boolean = true)
: User(...) {
...
}
Ancak, bir sınıf için birden fazla kurucunun gerekli olduğu durumlarda, C++, C# ve Java gibi çoğu nesne yönelimli dilde kullanılan kurucu sözdizimine çok benzeyen ikincil kurucu sözdizimi olarak adlandırılan daha genel bir kurucu kullanılabilir .
// Example of class using secondary constructor syntax
// (more than one constructor required for this class)
class MyButton : View {
// Constructor #1
constructor(ctx: Context) : super(ctx) {
// ...
}
// Constructor #2
constructor(ctx: Context, attr: AttributeSet) : super(ctx, attr) {
// ...
}
}
Veri sınıfları
Kotlin'in data class
yapısı, birincil amacı veri depolamak olan sınıfları tanımlar. Bu yapı equals
, toString
, ve anahtar işlevlerinin hashCode
sınıf özelliklerinden otomatik olarak oluşturulması dışında normal sınıflara benzer . Java'da, bu tür sınıfların, bunlar gibi standart bir işlev çeşitliliği sağlaması beklenir. Her birinin en az bir özelliği olması gerekse de, veri sınıflarının herhangi bir yöntem bildirmesi gerekmez. Bir veri sınıfı genellikle bir gövde olmadan yazılır, ancak bir veri sınıfına herhangi bir başka sınıf için geçerli olan herhangi bir yöntem veya ikincil oluşturucu vermek mümkündür. data
Kelime önce kullanılır class
veri sınıfını tanımlamak için anahtar kelimenin.
fun main(args: Array) {
// create a data class object like any other class object
var book1 = Book("Kotlin Programming", 250)
println(book1)
// output: Book(name=Kotlin Programming, price=250)
}
// data class with parameters and their optional default values
data class Book(val name: String = "", val price: Int = 0)
Kotlin etkileşimli kabuk
$ kotlinc-jvm
type :help for help; :quit for quit
>>> 2 + 2
4
>>> println("Hello, World!")
Hello, World!
>>>
Bir betik dili olarak Kotlin
Kotlin ayrıca bir betik dili olarak da kullanılabilir. Komut dosyası, üst düzey yürütülebilir koda sahip bir Kotlin kaynak dosyasıdır (.kts).
// list_folders.kts
import java.io.File
val folders = File(args[0]).listFiles { file -> file.isDirectory() }
folders?.forEach { folder -> println(folder) }
Komut dosyaları, -script
seçeneği ve ilgili komut dosyası dosyasını derleyiciye ileterek çalıştırılabilir .
$ kotlinc -script list_folders.kts "path_to_folder_to_inspect"
sıfır güvenlik
Kotlin, null yapılabilir ve null olamaz veri türleri arasında bir ayrım yapar. Tüm null yapılabilir nesneler bir "?" ile bildirilmelidir. tür adından sonra postfix. Null yapılabilir nesneler üzerindeki işlemler, geliştiricilerin özel dikkatine ihtiyaç duyar: değeri kullanmadan önce null denetimi gerçekleştirilmelidir. Kotlin, geliştiricilere yardımcı olmak için null güvenli operatörler sağlar:
- ?. ( güvenli gezinme operatörü ) olası bir boş nesnenin bir yöntemine veya özelliğine güvenli bir şekilde erişmek için kullanılabilir. Nesne null ise, yöntem çağrılmaz ve ifade null olarak değerlendirilir.
- ?: ( boş birleştirme operatörü ) genellikle Elvis operatörü olarak anılır :
fun sayHello(maybe: String?, neverNull: Int) {
// use of elvis operator
val name: String = maybe ?: "stranger"
println("Hello $name")
}
Güvenli navigasyon operatörünün kullanımına bir örnek:
// returns null if...
// - foo() returns null,
// - or if foo() is non-null, but bar() returns null,
// - or if foo() and bar() are non-null, but baz() returns null.
// vice versa, return value is non-null if and only if foo(), bar() and baz() are non-null
foo()?.bar()?.baz()
Lambdalar
Kotlin, üst düzey işlevler ve anonim işlevler veya lambdalar için destek sağlar .
// the following function takes a lambda, f, and executes f passing it the string, "lambda"
// note that (s: String) -> Unit indicates a lambda with a String parameter and Unit return type
fun executeLambda(f: (s: String) -> Unit) {
f("lambda")
}
Lambda'lar parantezler kullanılarak bildirilir, { } . Bir lambda parametre alırsa, parantez içinde bildirilir ve ardından -> operatörü gelir.
// the following statement defines a lambda that takes a single parameter and passes it to the println function
val l = { c : Any? -> println(c) }
// lambdas with no parameters may simply be defined using { }
val l2 = { print("no parameters") }
Karmaşık "merhaba dünya" örneği
fun main(args: Array<String>) {
greet {
to.place
}.print()
}
// Inline higher-order functions
inline fun greet(s: () -> String) : String = greeting andAnother s()
// Infix functions, extensions, type inference, nullable types,
// lambda expressions, labeled this, Elvis operator (?:)
infix fun String.andAnother(other : Any?) = buildString()
{
append(this@andAnother); append(" "); append(other ?: "")
}
// Immutable types, delegated properties, lazy initialization, string templates
val greeting by lazy { val doubleEl: String = "ll"; "he${doubleEl}o" }
// Sealed classes, companion objects
sealed class to { companion object { val place = "world"} }
// Extensions, Unit
fun String.print() = println(this)
Aletler
- IntelliJ IDEA , Kotlin için eklenti desteğine sahiptir. IntelliJ IDEA 15, Kotlin eklentisini IntelliJ Installer'da paketleyen ve kutudan çıktığı gibi Kotlin desteği sağlayan ilk sürümdü.
- JetBrains ayrıca Eclipse için bir eklenti sağlar .
- Apache Maven , Apache Ant ve Gradle dahil olmak üzere yaygın Java oluşturma araçlarıyla entegrasyon desteklenir .
- Android Studio (IntelliJ IDEA tabanlı), Android Studio 3'ten başlayarak Kotlin için resmi desteğe sahiptir.
- Emacs , Melpa paket deposunda bir Kotlin Moduna sahiptir.
- Vim , GitHub'da tutulan bir eklentiye sahiptir.
- Json2Kotlin üretir POJO web hizmeti yanıt haritalama stil yerli Kotlin kodu.
Uygulamalar
Kotlin, Mayıs 2017'de Google I/O'da resmi Android geliştirme dili olarak duyurulduğunda , Java ve C++'a ek olarak Android için tam olarak desteklenen üçüncü dil oldu. 2020 itibariyle, Kotlin hala en yaygın olarak Android'de kullanılmaktadır ve Google, Play Store'daki en iyi 1000 uygulamanın %70'inin Kotlin'de yazıldığını tahmin etmektedir. Google'ın kendisi, Haritalar ve Drive da dahil olmak üzere Kotlin'de yazılmış 60 uygulamaya sahiptir. Google'ın Ana Sayfası gibi birçok Android uygulaması Kotlin'e taşınma sürecindedir ve bu nedenle hem Kotlin'i hem de Java'yı kullanır. Android'deki Kotlin, boş işaretçi güvenliği ve daha kısa, daha okunabilir kod sağlayan özellikleri için faydalı olarak görülüyor.
Android'de öne çıkan kullanımına ek olarak, Kotlin sunucu tarafı geliştirmede de ilgi görüyor. Bahar Çerçeve fazla destek KOTLIN, Bahar için 4 Ocak 2017 tarihinde Sürüm 5 ile resmen eklendi Kotlin destek KOTLIN için tüm belgeleri tercüme ve yerleşik birçok Kotlin-özgü desteği değiş tokuş eden kavramlar gibi özellikler ekledi. Spring'e ek olarak JetBrains, web uygulamaları oluşturmak için Ktor adlı Kotlin'in ilk çerçevesini üretti.
2020'de JetBrains, Kotlin'i kullanan geliştiricilerin yaptığı bir ankette, %56'sının Kotlin'i mobil uygulamalar için, %47'sinin ise web arka ucu için kullandığını tespit etti. Tüm Kotlin geliştiricilerinin üçte birinden biraz fazlası, başka bir dilden Kotlin'e geçiş yaptıklarını söyledi. Çoğu Kotlin kullanıcısı Android'i (veya başka bir şekilde JVM'de) hedefliyordu, yalnızca %6'sı Kotlin Native kullanıyordu.
Benimseme
2018'de Kotlin, 2017'ye kıyasla 2,6 kat daha fazla geliştiriciyle GitHub'da en hızlı büyüyen dil oldu. 2020 Stack Overflow Geliştirici Anketi'ne göre en sevilen dördüncü programlama dili.
Kotlin ayrıca 2019 için O'Reilly Açık Kaynak Yazılım Konferansı Breakout Ödülü'ne layık görüldü.
Birçok şirket/kuruluş, arka uç geliştirme için Kotlin'i kullandı:
- Norveç Vergi İdaresi
- kepçe
- Amazon
- Meydan
- JetBrain'ler
- akı
- Allegro
- OLX
- Shazam
- önemli
- Roket Seyahati
- ağ bulutu
- Zalando
Bazı şirketler/kuruluşlar web geliştirme için Kotlin'i kullandı:
- JetBrain'ler
- Data2viz
- Fritz2
- Barclays bankası
Bazı şirketler Kotlin'i kullandıklarını kamuoyuna açıkladı:
- DripStat
- ana kamp
- Kursra
- Netflix
- Uber
- Meydan
- Trello
- Duolingo
- Tanınmış bankalardan oluşan bir konsorsiyum ( Goldman Sachs , Wells Fargo , JP Morgan , Deutsche Bank , UBS , HSBC , BNP Paribas , Société Générale gibi ) tarafından geliştirilen dağıtılmış bir defter olan Corda, kod tabanında %90'ın üzerinde Kotlin koduna sahiptir.
Ayrıca bakınız
Referanslar
- Bu makale, Apache 2.0 lisansı altında yayınlanan Kotlin eğitimlerinden alıntılar içermektedir.