Go Programlama Diline Genel Bakış
Yazılım dünyasında yeni bir teknoloji öğrenirken geliştiricinin ilk görmek istediği şey teknolojiye yukarıdan bir bakış atmaktır. Bu nedenle ilgili teknolojiye giriş ve genel bir bakış eğitim materyalleri önemlidir. Bu makalemde bir süredir üzerine video eğitimleri ve makaleler oluşturduğum Go programlama diline genel bir bakış yapmaya çalışacağız. Bu genel bakış sırasında pek kod görmeyeceksiniz. Sadece teorik olarak inceleyip, size bu dilin ne olduğunu, hangi amaçla kullanılabileceğini, nerelerde tercih edilmemesi gerektiği aktarıp, çeşitli kaynak ve önerilerde bulunacağım.
Go Nedir ve Neden Geliştirilmiştir?
Google gibi bir teknoloji ve yazılım devinin kendi iç sistemlerinde yıllardır kullandığı C, C++, Java, Python vb. bir çok farklı programlama dili ve teknolojinin farklı farklı avantaj ve dezavantajları var. Bunları küçük ya da az yük altındaki projelerde fark edemeyebilirsiniz, ancak büyük projelerde mutlaka kendini hissettirir. Bunlar performans, derleme(büyük projelerde kaynak kodun derlenmesi saatler sürebilir), güvenlik, uyumluluk, zaman yönetimi, kaynak(donanım, para, enerji vb.) yönetimi gibi bir çok başlıkta sıralanabilir. Ve tabi ki yüzlerce geliştiriciniz varsa ilgili etki alanı için yeni bir uzman alımı yaparken bilmesi veya öğrenmesi gereken bir çok teknolojiyi de beraberinde getirir. Yani sorun hem teknik hem de mentaldir.
Google bunlar gibi bir çok sorununu çözmek için yıllardır hem iç sistemleri için işletim sistemi hem de bir çok teknoloji ve algoritma üretmektedir. Go programlama dili de bunlardan biridir. Go programlama dili Google tarafından kendi sorunlarını çözmek için başlatılmıştır. Bu nedenle Go’ya eklenen ya da eklenmeyen tüm özellikler tamamen yılların “büyük projelerdeki yazılım tecrübeleri” ile belirlenmiş ve alınmış kararlardır. Mesela Go’yu biraz incelediğinizde “Go’da neden jenerikler(generics) yok?” gibi bir soru aklınıza gelebilir ki bunu soran ilk kişi değilsiniz. Buna Go geliştirici ekibinin verdiği yanıt ise özetle şöyle; “Jenerikler performanslı-hızlı değil, henüz bu şartlarda bir çözüm bulamadık, bulduğumuzda ekleriz”. Go ile ilgili bakış açısı bu kadar net aslında. Amaç, az dil özelliği ve kuralıyla esnek, hızlı, performanslı ve güçlü bir dil oluşturmaktır!
Go tamamen açık kaynaklı bir dildir. Yani Go kaynak kodunu satır satır inceleyebilirsiniz. Ve Google içerisinde Go’yu geliştirmekle sorumlu ekip bu dile kendileri katkı yaptığı gibi piyasada bu teknoloji kullanan bazı teknoloji devlerinin de dil hakkındaki görüş ve önerileri doğrultusunda çeşitli ek yetenekler üzerinde çalışmaya devam ediyorlar. Tabi ki bizim gibi sıradan geliştiricilerin de görüşlerini geliştirici toplulukları üzerinden takip ediyorlar.
Go dili Ken Thompson, Rob Pike, Robert Griesiemer tarafından 2007 tarihinde geliştirilmeye başlandı. İlk sürümünü yayınlamak için epey bir süre geliştirme ve iç sistemlerde testler yapıldı ve kullanılabilir ilk sürüm 10 Kasım 2009’da, ilk kararlı sürüm 1.0 versiyonu(1.0 versiyonu yazılımda olgunlaşmış ilk sürüm olarak kabul edilir) ise 28 Mart 2012’de Go 1.0 olarak yayınlanmıştır.
Go dili söz dizimini öğrenmek basittir. Ancak programlama gücünü C/C++ ile yarışacak kadar ispatlamıştır. Bu performans testleriyle ilgili bir çok kıyas(benchmark) makalesi yayınlanmaktadır. Go’nun “C gibi güçlü” hedefiyle geliştirilmeye başlanmasına karşın, web tarafında da hızla gelişmiş ve bir çok Framework çalışmasıyla şuan küresel çapta ciddi diyebileceğimiz bir çok proje tarafından tercih edilmektedir(Docker, Koding, Google vb.). Aynı zamanda basit ama güçlüdür ve ancak web yeniliklerine uyumlu olarak geliştirilmiştir. Mesela bir paketi ister lokal olarak oluşturup kod sayfanıza ekleyin, isterseniz de github.com gibi bir versiyon sistemi üzerinden doğrudan kod sayfanıza import kısmında linkini ekleyerek(tabi ‘go get’ ile lokal ortama kurulumu yapıldıktan sonra) kullanabilirsiniz.
Go dili geliştirici ekibinin temel prensiplerinden biri de “bir işi yapmanın en iyi yolunu bulursan farklı yöntemlere gerek yoktur” üzerine kuruludur. Bu nedenle farklı dillerde bir iş için bile her geliştiricinin farklı yöntemler kullanması olasıyken, Go dilinde o bir iş için genellikle bir yol vardır. Ancak o bir yolun performansı için belki binlerce profesyonel geliştiricinin geri bildirimleri alınmıştır.
Go tek bir dosyaya derlenir. Bu da tek bir binary dosyası üzerinde taşıma ve yönetim gerçekleştirebileceğiniz anlamına gelir ki, Java ve C# gibi dillerde taşıma-kopyalama işlemleri ciddi sorunlar ve vakit kayıplarına neden olabilir.
Go dilinde söz dizimi anlaşılır ve basittir. Go dili 25 adet keyword içerir. C(37 keyword), C++(84 keyword), C#, Java, Rust gibi bir çok dilde çok daha fazla keyword vardır.
Go uygulamanızın içerisinde C, Python gibi farklı dilleri doğrudan kodunuzu yazarak çalıştırabilirsiniz. (Örn; cgo)
Go dili kendi içinde gömülü olarak concurrency(eş zamanlılık) destekler. Ve bunu yüksek performanslı olarak gerçekleştirir. Alt seviye işlem yapmanıza gerek duymayacak şekilde thread mantığını da kendisi mimari olarak yönetir. Siz sadece farklı farklı goroutines’ler oluşturarak alt katmanda tek bir thread üzerinde yüzlerce-binlerce goroutines’ler uygulamanızı eş zamanlı hale getirebilirsiniz.
Go dili söz dizimi kurallarına çok önem verir ve dikkat eder! Yazılım dünyasındaki farklı söz dizimi alışkanlıklarından kaynaklı bir çok sorunu da böylelikle çözer. Örneğin import ile projenize bir paket dahil edip uygulama içerisinde o paketin referanslarını kullanmazsanız derleme aşamasında hata verecektir. Aynı şey basit bir değişken için bile geçerlidir. Değişkeni tanımladıysanız kullanmak zorundasınız, aksi halde Go derleme hatası verecektir. Bu konu ileri yazılım ve performans ile hafıza yönetimine doğrudan etkisi olan bir konudur. Hatta öyle ki, bir metodun scope’unu belirleyen süslü parantelerinin açılış kısmının tanımın altında mı yoksa metod imzasının yanında mı olduğuna bile dikkat eder. Tabi bu söz dizimi kurallarını yönetmek için de bir aracı vardır; ‘go fmt’
Doğru;
func add(x int, y int) int {
return x + y
}
Yanlış;
func add(x int, y int) int
{
return x + y
}
Go Programlama Dili Hangi Amaçla Kullanılabilir?
Go dili sistem programlama odağıyla geliştirilmiştir. Yani sunucu ve alt sistemler yazmak için ideal bir çözüm olarak düşünülebilir. Ancak bunun yanında web için de hem hızlı geliştirme hem de yüksek performansıyla kaliteli projeler üretmenizi sağlayabilir. Aynı zamanda native olarak henüz tam uyumlu kullanılabilir olmasa da Google, Android işletim sistemi üzerinde Go kullanılabilmesi için bir mobil proje yürütmektedir. Go’nun github sayfası üzerinden mobil çalışma kaynaklarına ulaşabilir, internetten Go ile geliştirilen Android uygulama örneklerine inceleyebilirsiniz.
Go dili gömülü sistemler için de kullanılabilmektedir. Ancak genel olarak bu alan için henüz yeterli görülmemektedir. Gene ancak, Go’nun bu alanda da bir başarı hedeflediğini ve zamanla gömülü sistemler için de kendini genişleteceğini söyleyen otoriteler mevcuttur. Kaldı ki, gömülü(embedded) sistemler için C mi, C++ mı gibi bir soru bile C/C++ geliştiricileri arasında yıllardır tartışılan bir konudur.
Go programlamayla ilgili örnek embedded ve benzeri IoT ortam frameworkleri;
- EMBD: http://embd.kidoman.io/
- Gobot: https://gobot.io/ Robotic ve IoT
Go Programlama Dilinin Hangi Amaçla Kullanılması Tavsiye Edilmez?
Python ve Ruby gibi bir betik dili değildir. Yani Python’un yerini alması düşüncesi yerine Go’nun C ve Python gibi farklı alanlarda güçlü olan dillerle birlikte çalışabilmesi hedeflenmektedir.
Hemen yukarıda belirttiğim gibi gömülü sistemler için henüz yeterli değildir. Bu alanda C’nin gücü devam etmektedir. Ancak Go ile C iç içe kullanıldığında harika gömülü alt sistem uygulamaları geliştirilebilir.
Go Programlama Dili Kullanıcıları
Go dili yakın bir tarihte geliştirilmiş olsa da büyük projeler için ciddi tercih edilen bir teknoloji haline gelmesi uzun sürmedi. Bu girişim ve firmalardan bazıları şunlardır;
Docker, Koding, Google, Apple, Twitter, Amazon, Github, Ubuntu, Dropbox, Facebook vb.
Daha geniş bir kullanıcı listesine ulaşmak için; https://github.com/golang/go/wiki/GoUsers
Go Programlama Geliştirme Araç ve Ortamları
Go dili genel olarak açık kaynak kültüründe olduğu gibi bir çok araç ve geliştirme ortamı sunmaktadır. Bunlar şöyledir;
Araçlar;
Go tool: Go dilinin en temel aracıdır. Go uygulamanızın derleme esnasındaki işlemleri konsol üzerinden parametrik olarak yönetmenizi sağlar.
Godoc: Kod içerisinde, örneğin bir metod üzerinde yazdığınız açıklama satırına göre bir belgelendirme-dökümantasyon üretmeyi sağlar. godoc.org sitesi üzerinden de github ya da dilin gömülü özelliklerinin dökümanlarına online olarak ulaşmak mümkündür.
Örn; http://godoc.org/fmt#Println
Gofmt: Go dili söz dizimi kurallarını(bazıları katıdır) yöneten bir orkestra şefidir. Go kodu söz dizimi standartlarını uygular.
Geliştirme Ortamları(IDE’s);
- Vim: https://github.com/fatih/vim-go
- Emacs: https://github.com/dominikh/go-mode.el
- SublimeText: https://github.com/DisposaBoy/GoSublime
- IntelliJ: https://github.com/go-lang-plugin-org/go-lang-idea-plugin
- Eclipse: https://github.com/GoClipse/goclipse
- LiteIDE: https://github.com/visualfc/liteide
- Visual Studio Code: https://github.com/Microsoft/vscode-go
- Atom: https://atom.io/packages/go-plus
Go Programlama Dili Kurulum ve Site Tanıtımı
Go dilinin ‘official’ web sitesi golang.org‘dur.
- Go’yu bilgisayarıma nasıl indiririm? https://golang.org/dl/
- Go dökümantasyonuna erişim; https://golang.org/doc/
- Go paketlerine online erişim; https://golang.org/pkg/
- Online Go IDE; https://play.golang.org/
Yaygın Kullanılan Framework ve Araç Setleri
- Beego (Web)
- Gin (Web)
- Gorilla Toolkit (Web)
- Revel (Web)
- Martini (Web)
- GORM (ORM)
- Gobot (Robotik ve IoT)
Not : Bu saydığım araç ve Framework’ler genel olarak kendi kullanmış olduğum ya da gözlemlediğim araçlardır. Ancak daha fazlası için Awesome Go‘yu ziyaret edebilirsiniz.
Önerilen Kaynaklar;
- Türkçe Go Turu; http://tur.golang.org.tr/
- Go Geliştirci Bloğu: http://goder.co
- Cihan Özhan #Go: http://www.cihanozhan.com/category/golang/
- Cihan Özhan Go Programlama Eğitim Seti: Blog & Youtube PlayList
- Cihan Özhan Go Programlama Eğitim Seti: Dijibil Online Kurs
- Go dilinin tüm özellikleri anlatan bir site; https://gobyexample.com/
- Orta ve ileri seviye örnekler; https://golang.org/doc/effective_go.html
- http://awesome-go.com/ ~ https://github.com/avelino/awesome-go
- http://go-talks.appspot.com/github.com/fatih/talks/go-giris/giris.slide
- http://talks.golang.org/2012/splash.article
- http://go-talks.appspot.com/github.com/golang/talks/2012/simple.slide
- https://github.com/golangmedellin/gotalks
- https://talks.golang.org/2012/concurrency.slide
- https://talks.golang.org/2014/taste.slide
Go Geliştirci Camiaları
- Go Geliştirci Bloğu: http://goder.co
- Türkçe mail listesi: https://groups.google.com/forum/#!forum/golang-tr
- Ingilizce mail listesi: https://groups.google.com/forum/#!forum/golang-nuts
- Türkçe Go Medium: https://medium.com/go-tr
- Freenode’de #go-nuts
- Twitter’de hash tag: #golang
Bu Go programlama başlangıç makalesini güncel tutmaya gayret edeceğim.
İyi çalışmalar.
Cihan Özhan
5 Comments
Zoax_uo
9 Şubat 2017 at 09:19Güzel bir yazı teşekkürler.
Emir Karsiyakali
11 Şubat 2017 at 16:28Bugün ilk kez JetBrains’in Gogland IDE’sini denedim, oldukça başarılı. Henüz stable sürümü çıkmadı, EAP 5’de ama Geliştirme Ortamı için öneririm: https://www.jetbrains.com/go/
Akin Kaldiroglu
8 Nisan 2017 at 14:43Aydinlatici yazi icin tesekkur ederim. Go’un sadece 27 keyworde sahip olmasi muthis bir sey. Bu rakam acik bir sekilde Go’yu kucuk tutmak icin gayret edildigini gosteriyor. Acikcasi bunu nasil yaptiklarini merak ediyorum.
Ufak bir duzetme, Java’da 50 tane keyword vardir. Ve bu haliyle bile pek cok dilden, C++ ve C# mesela cok daha ufaktir.
Kolay gelsin.
Akin Kaldiroglu
9 Nisan 2017 at 00:47Tekrar merhaba.
Açıkçası Go’da sadece 25 tane keyword olması beni çok şaşırtmıştı. Çünkü sadece built typelar 8-10 tane tutardı. Nitekim specificationa bakınca 25 tane keyword diyor ama dildeki tüm reserved wordler bunlar değiller. Go’da int, int8, bool gibi 36 tane daha “pre-built identifier” var. (Bu idenfitierlar ya da belirtecler/isimler aslında reserved word degiller ve bu yüzden şöyle “var int int = 4″ bir tanım garip ama geçerli!) Dolayısıyla, bu 36 tane kelimenin keyword ya da reserved olmaması, Go’yu kücük dil yapmaz. (Aksi taktirde C# ya da Java’daki int, boolean vb. kelimeleri de listeden cıkarmak gerekir) Reserved word/keyword/predefiend idenfier sadece farklı dillerin farklı yogurt yeme sekilleri. Uzun lafın kısası, Go’Nun kücük bir dil olmasına bu 25 keywordü örnek ya da kanıt gösteremeyiz. Diğer yapılara bakmak lazım, anlamamız gereken şey hakikatten dilin nasıl kücük olduğudur. Tekrar teşekkürler.
Orhan Gazi Dizdaroğlu
10 Eylül 2017 at 02:05Bu guzel makale icin tesekkurler.