Herkese Selamlar,
mobilhanem.com üzerinden yayınladığımız Kotlin derslerimize Genel Dil Yapısı ve Özellikleri konusuyla devam ediyoruz. Daha önce yayınladığımız İlk Kotlin Programı dersimize bu link‘ten ulaşabilirsiniz. Bu dersimizde sizlere genel bir programlama dilleri bilgisi verip Kotlin dilinin yapısı ve özelliklerinden bahsedeceğiz.
Bilgisayarlara Buyruk Vermek
Bilgisayarlara(bilgisayar derken buna günümüzde akıllı telefonlar, televizyonlar, tabletler, arabalarımızdaki çoklu ortam sistemleri vs. pek çok şey dahil) emir verebilmemiz için onun dilini konuşmamız gerekir. Bir bilgisayar dilinin kelimelerine buyruk(instruction) ve bu buyruklardan oluşan bilgisayarın anlayıp işleyebildiği dile ise buyruk kümesi(instruction set) adı verilir.
Günümüzdeki masaüstü ve dizüstü bilgisayarlarımızın hemen hemen hepsi(AMD işlemcili olsalar bile) Intel x86 buyruk kümesinden türetilmiş buyruk kümelerini kullanırlar. Hemen hemen tüm mobil cihazlarımız ARM buyruk kümesinin türevlerini kullanırlar. Başka değişik işlemci mimarilerinde kullanılan pek çok farklı buyruk kümesi bulunmaktadır.(Ör: MIPS)
İşlemcinin anlayabildiği buyruklarla yapılan bu programlama işlemine işlemci buyruk setine bağlı olmaksızın genel bir isim olarak Assembly denir, yani Assembly çalıştığı işlemcinin buyruk setine göre değişkenlik gösteren işlemci buyruklarıyla(instruction) programlamanın genel ismidir.
Bilgisayar programcılığının ilk yıllarında tüm programcılar bilgisayarların anlayabildiği bu buyruk kümelerini kullanarak(Assembly ile) programlar yazmaktaydılar, fakat zaman ilerleyip bilgisayarların güçleri arttıkça ve bilgisayar programlarından beklenen işlemler karmaşıklaştıkça; bunu yapabilmek oldukça zor ve çoğunlukla imkansız bir hale geldi. İşte bu noktada daha programcı dostu programlama dilleri yaratılmaya başlandı fakat programcıların bilgisayara buyruk vermesini kolaylaştıran ve hızlandıran bu programlama dilleri bilgisayarlar tarafından anlaşılamazdı. İşte bu insanların okuyabildiği programlama dillerinde yazılmış programları bilgisayarların anlayabileceği buyruklara çevirebilmek için derleyici(compiler) adı verilen programlar yaratıldı.
Örneğin C dili ile yazılmış bir programın Intel’in 8086 işlemcisini kullanan bir bilgisayarda çalışabilmesi için C dilini 8086 işlemcisinin kullandığı buyruklara çeviren bir derleyici’den geçirilmesi gerekir, aynı şekilde eğer C dili ile yazılmış aynı programı MIPS buyruk kümesiyle çalışan bir başka işlemciye sahip bir bilgisayarda çalıştırmak istersek o işlemciye uygun bir derleyici kullanmamız gerekir.
Programcıların işlerini daha da kolaylaştırıp; farklı işlemciler için farklı derleyiciler kullanma zorunluluğundan kurtarmak amacıyla 1995 yılında Java dili geliştirildi. Java dilinde geliştirilen programlar direkt olarak işlemcinin anlayabildiği buyruklara derlenmezler. JRE(Java Runtime Environment) adı verilen bir ara programın anlayabildiği Bytecode denilen bir ara koda derlenirler. Daha sonra JRE bunu çalıştığı işlemcinin buyruk kümesine göre çalıştırır. Yani burada işlemci mimarisine bağlı derlenmesi gereken JRE’dir, programcının işi bir nebze kolaylaşmıştır. Dersimizin konusu olan Kotlin dili de aynı Java gibi JRE üzerinde çalıştığı için, burada bahsettiğimiz durum aynen Kotlin için de geçerlidir.
Kotlin Dilinin Özellikleri ve Geliştirilme Amacı
Kotlin önceki bölümde biraz bahsettiğimiz Java platformunda çalışan yeni bir dil. Hemen hemen Java’nın kullanabildiği tüm alanlarda kullanılabiliyor(sunucu programlama, web programlama ve bu derslerimizde yoğunlaşacağımız Android programlama gibi)
Kotlin dili Nesne Yönelimli(Object Oriented) bir programlama dilidir. Kotlin’de Nesne yapısı vb. konuları önümüzdeki derslerde detayıyla gireceğiz, fakat temel olarak Nesne Yönelimli programlama dili nedir sorusuna cevap aramalıyız.
Kotlin Nesne Yönelimli(Object Oriented) Bir Programlama Dilidir
Nesne yönelimli programlama dillerini anlayabilmemiz için öncelikle böyle bir ihtiyacın neden doğduğunu anlamalıyız. Mesela C gibi nesne yönelimli olmayan prosedürel bir programa dilini örnek alırsak, bu tarz dillerde program her ne kadar farklı dosyalara bölünebilse, içinde fonksiyonlar veya alt yordamlar(sub routine) bulundursa bile temelde arka arkaya yazılmış koskoca bir satırlar öbeğidir ve programcının kodu okuyup anlaması nispeten daha zordur. Kotlin gibi nesne yönelimi bir programlama dilinde ise, programı oluşturan alt yapılar kendi kendine yeten nesnelere bölünür, adeta program içinde küçük birer ayrı programcık gibi oluşturulurlar. Her nesne uygulamamızın farklı bir kısmını temsil eder. Her nesne kendi verilerini ve mantıksal işlemlerini barındırır ve nesneler kendi aralarında iletişim halindedirler.
Çoğu nesne yönelimli programlama dilinde nesneleri gruplayabilmek için Sınıf(Class) denilen yapılar bulunmaktadır. Sınıfları nesnelerin ortak özellikleri barındıran ve nesnelerin oluşturulması için tarif görevi gören yapılar olarak düşünebilirsiniz. Kotlin dili de sınıf yapısı ile çalışan nesne yönelimli bir dildir. Nesne yönelimli programlama dillerinin geliştirilme amacı ise tamamen programlama işini kolaylaştırmak ve yazılan kodun anlaşılılabilirliğini arttırmaktır.
Kotlin Değişmez Türlü(Statically typed) Bir Programlama Dilidir
Kotlin aynı Java gibi değişmez türlü(statically typed) bir dildir. Bir kotlin programındaki tüm ifadelerin hangi türde(type’ta) olacağı daha Kotlin kodu JRE’nin anlayacağı bytecode’a çevrilirken(derlenirken), derlenme anında bellidir, çalışma esnasında(run time) tür(type) belirlenmesi ve değişimine izin verilmez. Bu her ne kadar programcıyı bazı yerlerde kısıtlayan bir yapı olsa da, çalışma esnasında(run time) programın çökmesine(crash) dahi sebebiyet verebilecek bazı basit hataların engellenmesinde oldukça kullanışlıdır. Ayrıca çalışma esnasında tür(type) hesaplama yapılması gerekmeyeceğinden Kotlin’e performans avantajı sağlamaktadır.
Kotlin diline tür çıkarımı(type inference) yeteneği eklenmiştir. Bu yetenek sayesinde Kotlin derleyicisi derleme anında bağlamdan(context) tür(type) çıkarımı yapabilir. Örneğin var x = 100 şeklinde bir değişken tanımı yaptığımızda derleme esnasında x değişkenin sayı(integer) türünde bir değişken olduğu çıkarımı yapılır ve böylece değişmez türlü dillerdeki yazım zorluğunun bir bölümü engellenmiş olur.
Kotlin Fonksiyonel(Functional) Programlamayı Destekler ve Kolaylaştırır
Kotlin direkt olarak(out of the box) fonksiyonel programlamayı destekler ve kolaylaştırır. Fonksiyonel programlamanın 3 temel özelliği vardır, bunlar
- Birinci sınıf fonksiyonlar(first-class-functions): Fonksiyonları değişkenlerde tutabilme, parametre olarak verebilme ve diğer fonksiyonların dönüş değeri olarak kullanabilme yeteneği
- Değişmezlik(Immutability): değişmez(Immutable) nesnelerle çalışma desteği, bu nesneler yaratıldıktan sonra değiştirilemezler
- Yan etkisizlik(No-side-effects): Aynı girdilere(input) hep aynı çıktıları(output) veren, diğer nesnelerin durumunu değiştirmeyen ve dış dünyadan bağımsız tamamen saf fonksiyonlarla çalışma desteği
Kotlin’de fonksiyonel tarzda kod yazabilmemiz özellikle kodun okunabilirliğini oldukça arttırması açısından çok önemlidir. Fonksiyonel programlada kullanılan lambda ifadeleri(lambda expressions) vb. teknikleri önümüzdeki derslerde bolca kullanacağız, böylece Kotlin’e eklenen bu özelliklerin program yazmayı nasıl daha okunabilir hale getirdiğini görebileceksiniz.
Fonksiyonel kodun ikinci büyük avantajı ise çok izlekli çalışım(multithreading) – yani birden fazla izleğin(thread) birbirine paralel çalışması- tekniğiyle yazdığımız programlarda farklı izlekler(thread’ler) arası verinin eşlenmesi(senkronizasyon, synchronization) hatalarından kaynaklanan sorunların engellenmesidir. Değişmez(immutable) nesneler kullanarak bu tarz durumlarda işimizi oldukça kolaylaştırabiliriz. İlerleyen derslerde çok izlekli çalışım konusuna detayıyla değineceğiz.
Son olarak fonksiyonel şekilde yazılan kodun test edilmesi(özellikle unit test‘ler ile) daha kolaydır. mobilhanem.com üzerinden unit test konusunda bir ders serisi hazırlamayı planlıyoruz, orada bu konulardan detayıyla bahsedeceğiz.
Kotlin fonksiyonel programlama yaklaşımını destekleyip kolaylaştırmasına rağmen zorunlu kılmamaktadır. Programcı istediği yerde değiştirilebilir(mutable) nesneler kullanarak istediği işlemleri gerçekleştirme özgürlüğüne sahiptir, bu da Kotlin’i bu bağlamda çok yönlü bir dili yapmaktadır.
Kotlin Mümkün Olduğu Kadar Tehlikesiz(Safe) Programlama Hedefler
Yazımızın başında bahsettiğimiz işlemci buyruklarıyla programlama yapma işinin en büyük zorluklarından biri hafıza yönetimi vb. konuların tamamen programcı tarafından yapılması gerekliliğidir. Bu durum programcıya daha çok sorumluluk yükler ve hata yapma tehlikesini yükseltir. JRE alt yapısı, C gibi dillere göre hafıza güvenliği, ara bellek aşırı yüklemesi(buffer overload) vb. konularda tehlikesizlik(safety) garanti ettiğinden zaten Kotlin dili bu konularda oldukça programcı dostudur, bu tarz konuları programcı olarak biz düşünmeyiz.
Daha önce Java ile kod yazmış arkadaşlar hemen anımsayacaktır, Java’da çalışma esnasında(run time) muhtemelen en çok görülen NullPointerException yani olmayan bir değer üzerinde işlem yapma hatası, programcıların en çok canını sıkan hatalardan biridir. Kotlin dilinde bu hatanın engellenmesi için bir yapı geliştirilmiştir, böylece NullPointerException gelmesi ihtimali bulunan kod parçaları derleme esnasında(compile time) programcıya gerekli önlemleri alması için gösterilir ve bu hatalar engellenir. Sonraki yazılarımızda bu özelliğin nasıl kullanıldığını detayıyla anlatacağız.
Kotlin Açık Kaynak Kodlu ve Özgür bir Programlama Dilidir
Derleyicisi, kütüphaneleri ve tüm araçlarıyla Kotlin Apache 2 lisansıyla lisanslanmış açık kaynak kodlu bir programlama dilidir. Kotlin’in tüm kodları herkese açıktır. github.com/jetbrains/kotlin git kod ambarından(repository) Kotlin kodunu indirebilirsiniz.
Bu yazımızda Kotlin dilinin genel yapısı ve özelliklerini anlatmaya çalıştık, burada anlattığımız bazı kavramlar aklınızda tam yerli yerine oturmamış olabilir, ilerleyen derslerde Kotlin programlama dilinde uygulamalar yazmaya başladığımızda bu kavramları çok daha iyi kavrayacaksınız.
Sonraki derslerimizde görüşmek üzere, selamlar.
Tüm Kotlin Dersleri için tıklayınız.
61