11 Nisan 2018 Çarşamba

En Popüler Programlama Dilleri İndeksi

“There are only two kinds of languages: the ones people complain about and the ones nobody uses.”
"Sadece iki tür programlama dili vardır: insanların sürekli şikayet ettikleri ve hiçbir kimse tarafından kullanılmayanlar."
― Bjarne Stroustrup

Onlarca programlama dili ve yüzlerce scripting dili bilişim dünyasında aktif olarak kullanılmakta. Programcılığa yeni başlayan biri olarak hangisinde uzmanlaşmanız gerektiğine karar vermede zorluk çekmeniz kaçınılmaz. Her yıl bir biri ardına tanıtılan diller, mevcut dillere eklenen frameworkler, kütüphaneler, eklentiler. C/C++ ve onlardan türeyen, over-engineered (mühendislik sürecine gereğinden fazla maruz kalmış) Java ve C# gibi ileri seviyeli diller artık programcılar tarafından tercih edilmemeye başladı. Syntax'ı daha az yoran, noktalı virgülle, küme parantez ile uğraştırmayan scripting tarzı dillerin poülaritesi her geçen gün artıyor. Programlama öğrenenler sınıftı, miras almaydı, çok biçimlilikti bu tür işlerle uğraşmak yerine fonksiyonel programlama ile projelerine çözüm üretme derdindeler. 
Dünya çapında bir çok saygın kuruluş yaygınlık, mesleki eğilim ve proje üretimine göre programlama dillerini sıralıyorlar. IEEE (Institute of Electrical and Electronics Engineers ) ise her yıl çeşitli kriterleri baz alarak programlama dillerini sıralandırıyor. IEEE'nin  Spectrum dergisinde yayınlanan araştırmaya göre 2017 yılında Python dili popülerliğini artırmaya devam ediyor. İş bulma indexine göre Java birinciliğini korurken, Spectrumun kendi analizine ve popülerlik indexine göre Python birinci sırada. İş bulma indeksine göre ilk 20 programlama dili aşağıdaki gibidir;
İş bulma endeksine göre ilk 20 program (Kaynak : ieee-spectrum)
İş bulma endeksine göre Java uzun yıllardır liderliğini koruyor; web, mobil ve enterprise yazılımların üçünü de desteklediği ve Java Sanal Makinasının (JVM) bir çok cihazda sorunsuz çalışmasından dolayı yaygınlığını uzun yıllar koruyacak bir programlama dili. C ve C++ özellikle gömülü sistemlere olan desteği sayesinde iş bulma sıralamasında 2 ve 4. sıraları tutmakta. Python ise scripting tarzı kodlama ve eklentileri ile hızlı bir şekilde yaygınlaşmaya devam ediyor. Bir kaç yıl içinde iş alanında da liderliği Java'dan alması bekleniyor. Web programcılığının olmazsa olmaz scripting dili JavaScript 5. sırada. C# ise gerilemeye devam ediyor, multiplatform ve ücretsiz sürümlere geç kalmanın cezasını çekmeye devam ediyor.  PHP ve HTML ise bilmek ise hala iş bulmada önemli bir sırada, her ne kadar PHP frameworkleri artık konvansiyonel PHP anlayışını sarsmış olsada, onu bilmek şart. Ruby'nin kolaylığı, opensource olması büyük bir camia oluşturuyor. Apple'ın iOS programı Swift ise 10. sırada yerini alıyor. İlk 20'de yer alan R ve GO dilleri ise ilerleyen yıllarda ilk 10'a gireceğe benziyor. R'ın özellikle big data üzerinde sağladığı kolaylık dikkat çekici.
Yukarıdaki liste bölgesel ve ülke bazında farklılıklar gösterebilir, mesala Türkiye'de web ağırlıklı diller daha önce sıralarda yer alabilir. Çin'de ya da Avrupa'daki durumda birbirinden farklı olabilir ama dünya ortalaması yukarıdaki gibi seyrediyor.

IEEE Spectrumun kendi değerlendirmesinde ise ilk 20 yazılım dili aşağıdaki gibi görünüyor;
IEEE Spectrum sıralaması

Bu sıralama da Python'ın zirveyi aldığı görülüyor. Yukarıdaki liste sadece iş bulma kriterini baz alırken, bu liste popülerlik, open source olma, kullanıcı sayısındaki artış vb. bir çok kriterin dikkate alınması sonucu ortaya çıkmıştır. İlk 5 de yer alan dillerde çok fazla değişiklik olmazken, R ve GO dillerinin bu listede ilk 10'da yer aldığını görüyoruz.

Trend olma kriterine göre ilk 20 dil aşağıda verilmiştir;
Trend olma durumuna göre diller

Trend olma durumuna göre listelendiğinde Python yine en başta yer alıyor. Apple ve iOS programlama da kullanılmasından dolayı Swift 5. sırada GO ise 7. sırada yer alıyor. C# 'ın ise hızlı bir şekilde kan kaybettiğini görüyoruz.

RedMonk.com sitesinin, web tabanlı yazılım depolama ve paylaşma ortamı olan GitHub ortamından derlediği verilere göre ise ilk 20 Programlama dili şu şekildedir;
Github üzerinden derlenen popülerlik grafiği (kaynak: redmonk.com)

 GitHub üzerinden dağıtılan yazılım eklentilerinden anlaşıldığı üzere birinci sırada JavaScript yer alıyor. Hemen ardından Java, Php, Python geliyor. İlk 10 nerede ise aynı dillerden oluşuyor. Listeyi yukardaki grafikten okumakta zorluk çekiyorsanız;

1 JavaScript
2 Java
3 Python
4 PHP
5 C#
6 C++
7 CSS
8 Ruby
9 C
10 Swift
10 Objective-C
12 Shell
12 R
14 TypeScript
14 Scala
16 Go
17 PowerShell
18 Perl
19 Haskell
20 Lua
 
Kişisel tahminlerime göre bir kaç yıl içinde Python zirveye oturacak. Dil öğrenen insanlar artık dilin yapısallığına bakmıyor ve kolay kod yazmak istiyor, dolayısı ile scripting tarzı diller olan Python, Ruby, Go tarzı dillere yöneliyorlar. C/C++ ve Java yaygınlık ve platform zenginliği sebebiyle daha uzun yıllar ilk sıralarda yer alacaklar, öte yandan C# için aynı durum söz konusu olmayacak, Microsoft'un yanlış politikaları sonucu C# sadece Windows platformlarına sıkışmış durumda ve kan kaybetmeye devam edecek. R dili ise yaygınlığını artıracak, big dataya olan ilgi arttıkça adını daha sık duyacağız. Apple Swift'i çıkararak programcıları Objective-C çilesinden kurtardı, başka bir programlama dilini piyasaya sürene kadar Swift'in popülerliği artmaya devam edecek. Öte yandan Swift'i andıran özellikleri ve Google'ın 2017 de Android için Kotlin'i varsayılan dil yapacağını duyurması insanların ilgisini bir anda bu dile yöneltmesine sebep oldu. Önümüzdeki yıl muhtemelen Kotlin'i de ilk 10 da göreceğiz.

Umarım programcılığa yeni başlayan yada meraklı programcılar için faydalı bir yazı olmuştur.

9 Nisan 2018 Pazartesi

Algoritma Soruları 043 - Armstrong sayılarını bulmak

Seviye : Başlangıç

Tüm basamaklarındaki rakamların sayı değerlerinin küpleri toplamı,kendisine eşit olan sayılara "Armstrong sayı"denir. 100 ve 999 sayıları arasındaki Armstrong sayılarını bulan programı yazınız?

Açıklama: Aşağıda bazı Armstrong sayıları gösterilmiştir;

8 Nisan 2018 Pazar

Kotlin Dersleri - 11 - Sınıf ve nesne kavramı

Kotlin!de sınıflar Java syntaxı ile aynı şekilde tanımlanır. Fakat sınıflar aynı zamanda yapıcı method için parametre de alabilirler. Yapıcı fonksiyon ise init ön eki ile gerçekleştirilir.

class ogrenci(ad : String ){
    var isim : String = ""     
    var soyad : String = ""
     
    fun ekle () : String = this.isim + " " + this.soyad
     
    init {
        println("merhaba $ad")
    }
}

Yukarıda tanımlanan ogrenci sınıfı, ad değişkenini yapıcı fonksiyon için alabilmektedir. Yapıcı fonksiyon ise init ön eki ile tanımlanmış.

fun main(args: Array<String>){
    var ogr = ogrenci("ali")

    ogr.isim = "mehmet"    ogr.soyad = "yasin"
    //println(ogr.isim + " " + ogr.soyad)
    println(ogr.ekle())
}

Main alanında nesne tanımlanırken new komutuna gerek yoktur. Değer ataması yapılacak değişken nesneyi içinde tutmaktadır.

Tüm kodlar;
class ogrenci(ad : String ){
    var isim : String = ""    var soyad : String = ""
    fun ekle () : String = this.isim + " " + this.soyad
    init {
        println("merhaba $ad")
    }
}

fun main(args: Array<String>){
    var ogr = ogrenci("ali")

    ogr.isim = "mehmet"    ogr.soyad = "yasin"
    //println(ogr.isim + " " + ogr.soyad)
    println(ogr.ekle())
}

 Dersi video olarak da izleyebilirsiniz;

Kotlin Dersleri - 10 - ArrayList

Kotlin'de liste kullanımı Java ile nerdeyse aynı, tanımlama yapılırken ArrayList<Tür adı> şeklindekullanılmaktadır. Oluşturulan listeye add() komutu ile elementler yerleştirilmekte, get(indis) ile elemanlar okunabilmektedir.

var liste = ArrayList<String>()

liste.add("bir")
liste.add("iki")
liste.add("üç")
liste.add("dört")
liste.add("beş")
liste.add(0,"sıfır")

Yukarıda string türünde bir liste tanımlanmış ve get metodu ile elemanlar yerleştirilmiş. get(indis, değer) fonksiyonu ile istenilen indise yerleştirme yapılabilir.

println(liste)

println(liste[2])
println(liste.get(4))

liste.remove("beş")
liste.removeAt(4)
//liste.removeAll()
liste.set(1,"biiiiir")
println(liste)

Köşeli parantez veya get metodu ile elemanlar okunabilir. Remove komutu ile silinebilir, set komutu ile değeri değiştirilebilir.

liste.contains("iki") //trueliste.contains("dört") //false
liste.isEmpty() //false// liste.clear() //listeyi temizler
liste.indexOf("sıfır") // index değeri 0 döndürür
//liste.equals(liste2)

 contains ile belirtilen değişkenin listede olup olmadığı kontrol edilebilir. Listeye değer atanıp atanmadı ise isEmpty komutu ile gerçekleştirilebilir.

Arraylist içindeki elemanlar for yada foreach döngüsü ile alınabilir;

for(str in liste) print(str + " ")

liste.forEach { str -> print(str + " * ") }

Tüm kodlar;
fun main(args: Array<String>){
    var liste = ArrayList<String>()

    liste.add("bir")
    liste.add("iki")
    liste.add("üç")
    liste.add("dört")
    liste.add("beş")
    liste.add(0,"sıfır")

    println(liste)

    println(liste[2])
    println(liste.get(4))

    liste.remove("beş")
    liste.removeAt(4)
    //liste.removeAll()
    liste.set(1,"biiiiir")
    println(liste)

    liste.contains("iki") //true    liste.contains("dört") //false
    liste.isEmpty() //false    // liste.clear() //listeyi temizler
    liste.indexOf("sıfır") // index değeri 0 döndürür
    //liste.equals(liste2)
    for(str in liste) print(str + " ")

    liste.forEach { str -> print(str + " * ")  }
}

Dersi video olarak da izleyebilirsiniz;


Kotlin Dersleri - 09 - Extension ve Infix fonksiyonlar

Bazı durumlarda fonksiyonun başında bir değer olması gerebilir. Bu tür fonksiyonlara eklemeli (extension) fonksiyonlar denir. 

//Extension functions
fun Int.topla(sayi1:Int) : Int = this+sayi1

fonksiyon çağrılırken önüne Int tipinde bir sayı konulabilir. 

var a = 9.topla(8).topla(10) //9 + 8println(a)

Yukarıda main fonksiyonundan çağrılan extension topla fonksiyonu gösterilmiştir. 9.topla(8) ifadesi 17 döndürürken 17.topla(10) durumuna gelir ve sonuç 27 olarak döner. Burada fonksiyon toplama işleminden daha karışık bir işlem seçilebilirdi, örneğin 8 rakamını 9 kere ekrana yaz vb. Extension fonksiyonlar özel işlem durumlarında normal fonksiyonlara göre işleri oldukça kolaylaştırmaktadır.

Infix fonksiyonlar ise daha önceki derslerde anlattığımız in, downto, step gibi sözcük ekleriyle yapılan fonksiyonlardır. Bu fonksiyonlarda program anlaşılırlığını kolaylaştırır. Ayrıca programcının kendi tanımladığı infix fonksiyonlar ile Kotlin çok daha fazla özelleştirilebilir. Infix fonksiyonlar tanımlanırken başına "infix" öneki konulur.

//Infix functions  downto, step
 infix fun String.ekle(s : String) : String = this + s

Bu fonksiyonların kullanımı ise şöyledir;

println("yasin" ekle " hoca")

 Kodların tamamına bakacak olursak;
fun main(args: Array<String>){

    var a = 9.topla(8).topla(10) //9 + 8    println(a)

    println("yasin" ekle " hoca")

}

//Extension functions
fun Int.topla(sayi1:Int) : Int = this+sayi1


//Infix functions  downto, stepinfix fun String.ekle(s : String) : String = this + s

Bu dersi video olarak izleyebilirsiniz;

7 Nisan 2018 Cumartesi

Kotlin Dersleri - 08 - Fonksiyonlar

Kotlin'de tüm fonksiyonlar "fun" kelimesi ile başlar. Fonksiyon tanımlarken aşağıdaki yapı kullanılır.

fun  fonksiyon_adi(giriş parametleri) : dönüş_türü {işlemler}

Root alanına tanımlanan fonksiyonlar main fonksiyonu veya diğer fonksiyonlardan çağrılabilirler.

fun topla(sayi1:Int, sayi2:Int) :Int{
    return sayi1+sayi2
}

sayi1 ve sayi2 'yi toplayıp integer tipinde geri döndüren fonksiyon yukarıda tanımlanmıştır.

Fonksiyon değer döndürmüyorsa türü "Unit" olarak tanımlanabilir. Java ve C de kullanılan void ile aynıdır.

fun carp(sayi1: Int,sayi2: Int) : Unit{println(sayi1*sayi2)}
//unit değer döndürmeyen fonksiyonlarda, void

Fonksiyonlarda yapılan işlem kısa ise {} parantez kullanımına gerek yoktur.

fun cikar(sayi1: Int,sayi2: Int) : Int = sayi1-sayi2

Aşağıda çeşitli fonksiyonlar ve bunların main fonksiyonundan çağrılması gösterilmiştir.

fun main(args: Array<String>){
    var sonuc = topla(3,8)
    println(sonuc)

    sonuc = cikar(5,13)
    println(sonuc)

    println("İsminizi giriniz :")
    var isim : String
    isim = readLine()!!.toString()
    println(merhabaYaz(isim))

    println(bol(5.0f,3.0f))

}

fun topla(sayi1:Int, sayi2:Int) :Int{
    return sayi1+sayi2
}

fun cikar(sayi1: Int,sayi2: Int) : Int = sayi1-sayi2

fun merhabaYaz(isim : String) : String = "Merhaba " + isim

fun carp(sayi1: Int,sayi2: Int) : Unit{println(sayi1*sayi2)}
//unit değer döndürmeyen fonksiyonlarda, void
fun bol(sayi1: Float,sayi2: Float=1.0f) : Float = (sayi1/sayi2).toFloat() // (float) a/b

Dersi video olarak da izleyebilirsiniz;


Kotlin Dersleri - 07 - Diziler

Kotlinde sabit değerli diziler "arrayOf()" komutu ile tanımlanıyor. Başlangıç değerleri parantez içine belirtildiğinde kotlin tür tanımlamasını kendisi yapıyor.

val dizi = arrayOf(1,2,3,4,5,6)

burada tanımlanan dizi değişkeni içine number türü veri aktarıldığı için tür otomatik olarak integer olarak atanıyor.

Dizi elemanları okunurken köşeli parantez [] yada get komutu kullanabilirsiniz.

println(dizi[0])
println(dizi.get(5))

 Yine dizi elmanlarına değer atarken köşeli parantez yada set komutu kullanabilirsiniz.

dizi[0] = 25println(dizi[0])
dizi.set(1,35)
println(dizi[1])

Dizi tanımında tür belirtilecekse yada dizi başlangıç elemanları aynı tanımlanacaksa aşağıdaki kodları kullanabilirsiniz.

val rakam = Array<Int>(5){0} //{0,0,0,0,0}

5 elemanlı dizinin tamamı 0 ile tanımlanmış. <Int> şeklinde integer tipinde dizi tanımlanmış. Bu alana String, Boolean vb. tür ismi belirtebilirsiniz.

rakam[0] = 100        //{100,0,0,0,0}rakam.set(2,150)      //{100,0,150,0,0}rakam.set(4,300)      //{100,0,150,0,300}

atama işlemleri ve dizinin son durumu yanında verilmiştir.

Dizi elemanları for döngüsü ile kolayca alınabilir. Burada "değişken: tür in dizi" diyerek dizinin tamamını bir range gibi kullanabiliriz.

for(x:Int in rakam){
    print("$x - ")
}

Dersi video olarak da izleyebilirsiniz;



Kotlin Dersleri - 06 - Do-While Döngüsü

Kotlin'de While  ve do/while döngüleri Java da olduğu gibi kullanılabiliyor. Her iki döngüde de döngü adımlarını tutacak olan indisleri kendimizin artırıp azaltması gerektiğini unutmayalım. While ve Do-While döngüleriin tek farkı ilk adımın çalışma şeklidir, Do döngüsünde en az bir adım döngü çalışırken, while döngüsünde şart sağlanırsa döngü çalışmaya başlar.

var i : Int = 0while (i<30){
    if(i%7==0) print("$i - ")
    i++
}

0'dan 30'a kadar devam eden döngü, döngü başında i indisi sıfırlanmalı yada döngü hangi adımdan başlayacaksa o adımdan devam etmeli. Burada i++ ile her adımda i birer artırılmıştır, istenirse i+=2 yada daha büyük sayı verilerek adımlar tıpkı step komutunda olduğu gibi ayarlanabilir.

i=0
do {
    if(i%5==0) print("$i - ")
    i++
}while (i<30)

Benzer şekilde do while döngüsünde de aynı işlem gerçekleşitirilebilir. Yukardaki örnekte 7'ye bölünen sayılar yazdırılırken aşağıda 5'e bölünen sayılar yazdırılmıştır.

Dersi video olarak da izleyebilirsiniz;



6 Nisan 2018 Cuma

Kotlin Dersleri - 05 - For döngüsü ve Range

Kotlin'de for döngüsü, C ve ondan türeyen dillerde kullanılandan biraz farklıdır. Range olarak tabir edilen ve sayı aralığı yada herhangi bir sequence belirten ifadelerler yapılır. Bu ifadeler örneğin 1 - 100 arasındaki sayılar için 1..100 şeklindedir.

Aşağıda for döngüsü örneği mevcuttur;

//for(i=0;i<10;i++) c türevi dillerde kullanılan genel for döngüsü
var i : Int
for(i in 1..10){ //1..10 buna RANGES deniyor    print("$i - ")
}

Döngü adımları birden fazla olacaksa step ifadesi kullanılır. "1..100 step 2" burada adımlar 1-3-5-7.... şeklinde yüze kadar devam edecektir. Aşağıdaki örenği inceleyelim;

//birden 100'e kadar tek sayıların toplamı?var toplam : Int = 0
for(i in 1..100 step 2){
    toplam += i    //toplam = toplam +i}

println("\n1'den 100'e kadar sayıların toplamı = $toplam")

Aşağıya doğru ters döngü ise downto komutu ile gerçekleştirilir;

//aşağıya doğru döngülerfor(i in 10 downTo 1 step 2) {
    print("$i - ")
}
a

Bir aralıkta döngü kurulacaksa örnek olarak 20 ile 30, burada ya range kullanılacaktır 20..30 yada until ifadesi;
//until komutufor(i in 10 until 20){
    print("$i - ")
}

println()

//range'ler değişken olarak tanımlanabilirval a = 30..40
for(i in a){
    print("$i - ")
}

Aralıklar (range) if ile de kullanılabilir;
//range'ler if ile kullanılabilirval b = 35if(b in a) println("\n30 ve 40 arasında")

val az = "a".."z"val karakter = "h"if(karakter in az) println("alfabetik karakterdir")

 Dersi video olarak da izleyebilirsiniz;


Kotlin Dersleri - 04 - When şart bloğu

Kotlin dilinde switch-case yapısı yerine WHEN bloğu kullanılmaktadır. Değerlendirelecek değişken when(değişken) olarak işleme alınır. Değişken değerinin eşitliği kontrol edilir ve yapılacak işlem karşısına tanımlanır. 

print("1-5 arasında sayı giriniz : ")
var sayi : Int = readLine()!!.toInt()

when (sayi){
    1 -> {println("bir")}
    2 -> {println("iki")}
    3 -> {println("üç")}
    4 -> {println("dört")}
    5 -> {println("beş")}
    else -> {
        println("aralık dışında sayı")}
}

Yukarıdaki örnekte kullanıcının girdiği sayısal değer yazı ile ifade edilmiştir.

Eğer aralık sorgulanacakca 1..10 şeklinde range kullanılabilir. Aşağıdaki örneği inceleyiniz;

print("1-20 arasında sayı giriniz : ")
var a : Int = readLine()!!.toInt()

when(a){
    in 1..10 -> {
        println("Bir ve on arasında")}
    in 11..20 -> {
        println("on ve 20 arasında")}
    else -> {
        println("aralık dışında")}
}

Bu dersi video olarak da izleyebilirsiniz;