Git | ||
İlk sürüm tarihi | 10 Kasım 2009 | |
---|---|---|
paradigma | Derlenmiş dil , eşzamanlı , zorunlu ve yapılandırılmış programlama | |
Yazar |
Robert Griesemer (içinde) Rob Pike Ken Thompson |
|
Son sürüm | 1.16.5 (3 Haziran 2021) | |
Geliştirme sürümü | 1.16beta1 (17 Aralık 2020) | |
Yazıyor | Güçlü , statik , yapısal | |
Tarafından etkilenmiş |
C Python Oberon-2 ( tr ) Araf Aktif Oberon ( tr ) Sıralı süreçleri iletme Pascal Oberon Smalltalk Newsqueak ( tr ) Modula-2 Alef APL BCPL Modula ( tr ) Occam |
|
İşletim sistemi | Windows , GNU / Linux , Mac OS X , FreeBSD , OpenBSD , DragonflyBSD , Solaris , Plan 9 | |
Lisans | BSD lisansı , patentli | |
İnternet sitesi | golang.org | |
Dosya uzantısı | Git | |
Go , C ve Pascal'dan ilham alan derlenmiş ve eşzamanlı bir programlama dilidir . Bu dil, Google tarafından Robert Griesemer , Rob Pike ve Ken Thompson'ın ilk konseptinden geliştirilmiştir . Go'nun iki uygulaması vardır: ilki , Go derleyicisi olan gc'yi kullanır ; ikincisi gccgo , C++ ile yazılmış “ ön uç ” GCC'yi kullanır . Go, 1.4 sürümüne kadar ayrıştırma için yacc ve GNU Bison kullanılarak C dilinde ve sonraki sürümler (1.5) için Go'nun kendisinde yazılmıştır .
Bir Go hedefi, deneyimsiz geliştiriciler hakkında şunları söyleyen üç yaratıcısından biri olan Rob Pike tarafından verilir:
“Harika bir dili anlayamıyorlar ama biz onların iyi programlar yapmalarını istiyoruz. Bu nedenle onlara verdiğimiz dilin anlaşılması ve benimsenmesi kolay olmalıdır ” dedi.
Go, büyük ölçekli programlamayı kolaylaştırmak ve hızlandırmak istiyor: basitliği nedeniyle, uygulamalar, komut dosyaları veya büyük sistemler yazmak için de kullanılması düşünülebilir . Bu basitlik, programların birkaç nesil geliştiriciler boyunca bakımını ve gelişimini sağlamak için de gereklidir.
Sistem programlaması için gerekli olan yürütme hızını da hedeflerken, "gaz fabrikaları" oluşturmaktan kaçınmak için bağımsız olarak yürütülen basit görevleri ayırarak bakımı kolaylaştırırken, mevcut işlemcilerde bu hızı sağlamanın en sağlam yolu olarak çoklu iş parçacığını görür. Bu tasarım aynı zamanda ilgili güç artışından anında yararlanarak çok çekirdekli mimarilerde yazma gerektirmeyen çalışmayı da sağlar .
İşte Go'da yazılmış tipik bir Merhaba dünya programı örneği :
package main import "fmt" func main() { fmt.Printf("Hello, world\n") }Go dili, sistem programlaması için oluşturuldu ve o zamandan beri C ve özellikle C ++ ile aynı hedef olan uygulamalara genişletildi. Zorunlu ve rekabet eden bir dildir . Derleme hızı (sözdiziminin basitliği nedeniyle) bazen onu bir betik dili olarak kullanılmasını sağlar.
Go, Java gibi eşzamanlı kod işlemeyi doğrudan entegre eder . Anahtar sözcük go, bir işlev çağrısının geçerli goroutine ile rekabet halinde çalışmasına izin verir . Coroutines ile uzak benzetmeyle adlandırılan bir goroutine , çalışma zamanına dahil edilen zamanlayıcı tarafından denetlenen bir yürütme dizisidir . Program daha sonra yararlanmak olacaktır topoloji iyi mutlaka yeni bir iş parçacığı, goroutines gerçekleştirmek için bilgisayarın ancak goroutines bir grup olması da mümkündür çoğullanmış ipliği gruplarının üzerine.
f fonksiyonunu çağırmak için f() yazarız . Bunu bir goroutine olarak adlandırmak için, call f görevine çok benzeyen go f () yazmamız yeterlidir ; 1970'den beri çoklu görevleri de yöneten bir dil olan PL / I.
Goroutinler birbirleriyle mesaj ileterek , kanallar üzerinden mesaj göndererek veya alarak iletişim kurarlar .
Bu mesajlar , yazarlar tarafından çok iş parçacıklı modelden daha sezgisel olarak kabul edilen CSP modeline göre goroutinleri birbirleriyle senkronize eder ( kilitleri içeren semaforlarla senkronizasyon ile , yine Dijkstra tarafından tanıtılan bir kavram ).
Mevcut dil durumunda (2018)
Dil, Pascal ve C'nin özelliklerini içerir, ancak bir an için ne Pascal'da ne de C'de olduğumuzu unutursak, kendimizi birçok hataya maruz bırakırız. Bu nedenle, a:=bbir a değişkenini, ona b'nin değerini ve türünü atayarak tahsis edin, ancak eğer değişken zaten tahsis edildi, sadece yazmanız gerekecek a=b. a==b(değerlerin eşitliği) ile karıştırılmamalıdır . a'nın arkasındaki ifade ifparantez gerektirmez, ancak test başarılı olursa yürütülecek ifade parantez içine alınmalıdır . Şu anki durumunda, derleyici beyan edilen bir değişkenin kullanılmamasına müsamaha göstermez, bu da kesinlikle iyi uygulamaları teşvik eder, ancak programlarda hata ayıklamayı çok zahmetli hale getirir.
Go, skaler türleri (integers intveya int64, floats float, strings string), 0'dan başlayan tamsayılarla indekslenen dizileri, anahtarlarla indekslenen nesnelerin koleksiyonları olan haritaları ( diğer dillerde sözlükler , karmalar veya ilişkisel diziler olarak adlandırılır ) ve dinamik bir genelleştirme olan dilimleri bilir. diziler.
İster satır ister karakter modunda olsun, ister os ve io paketleri aracılığıyla tüm dosyayı emerek okuma ve yazma dosyalarına kolayca erişir .
Go, açık bir yazım kullanma olasılığı ile tür çıkarımına dayalı , güçlü bir şekilde yazılmış , yapısal ve güvenli bir statik tür sistemine sahiptir .
Bir örnek vermek gerekirse, s := "Camélia"bildiren, tahsis eden ve başlatan syazma mümkündür ve yazmayı zorlamaz var s string = "Camélia", ancak kabul edilir.
Bileşik tür uyumluluğu , isimden çok özelliklere dayalıdır . Yani, özellikleri eşdeğerse iki bileşik türü eşdeğer olacaktır: özellik için aynı ad ve tür denkliği. Bu yapısal tiplemedir .
Bu, dilin klasik anlamda nesne olmadığı sonucunu doğurur ( sınıflarla veya prototip ile ), ancak dil tasarımcıları statik bir dil için daha özgün bir seçim yapmışlardır. Bir nesnenin davranışını tanımlayan yöntemleri taşıyan arabirimler tanımlamak mümkündür (birkaç arabirimi tek bir arabirimde karıştırmak da kolayca mümkündür). Go işlevleri, bu arabirimden bir argümanı kabul ettiğini bildirebilir . Bu arabirimin tüm yöntemlerini aynı imzayla bildiren bir nesne, bu yöntemin argümanı olarak iletilebilir. Tip kontrolü derleyici tarafından statik olarak yapılır.
Go'nun klasik anlamda bir nesne olmaması, Go'nun tür kalıtımı ve alt sınıflaması olmadığı anlamına gelir . Bu sayede örneğin bu sistemlerin getirdiği sorunları aşmak mümkün kılar çoklu miras onu (içinde izin dilde C ++ örneğin) ya da (basit miras Java örneğin). Özellik tabanlı tür eşdeğerliği ile Go, tür devralmaya ihtiyaç duymaz. Alt sınıflama, "tip yatılı" ile taklit edilir. Bu, ortak türleri paylaşmak zorunda kalmadan bağımsız olarak tasarlanmış iki kod tabanını karıştırmayı kolaylaştırır.
Onların beyan paketinin dışında yapılar, nitelikler, değişkenler, sabitler, yöntemler, üst düzey türleri ve fonksiyonları görünürlüğü ile tanımlanır durumda onların ilk karakterinin tanımlayıcıları .
Go, hem kaynak kodu hem de dizelerin işlenmesi için Unicode'da çalışır . Ancak literatürü , rünlerin kısaltması için ifade kodu noktalarını terk eder . Prosedürler, karakter temsillerini rünlere (sabit bir boyut kaplayan herhangi bir rün) dönüştürmeyi ve standart prosedürlerle bir dizi Unicode karakterini bir dizinin rünlerine (eleman başına bir rün) ve bunun tersini, hokkabazlık yapmak zorunda kalmadan dönüştürmeyi mümkün kılar. değişken uzunluk gösterimleri veya makinenin küçük endian mı yoksa büyük endian mı olduğu konusunda endişe . Bu nedenle taşınabilirlik garanti edilir.
Bahsedersek rünleri ile mevcut belirsizlikleri ortadan kaldırır karakteri veya byte . Bir zinciri keşfetmek için ya doğrudan zincir işlevlerini kullanırız ya da ründen rünlere göz atarız.
Ulusal karakterlerin büyük harf kullanımı (örneğin "è" ⇒ "È") ile yapılır unicode.ToUpper(r rune) rune. Rünler, APL dili de dahil olmak üzere herhangi bir Unicode, Tayca, Çince, Yunanca karakterde ve ayrıca orada bulunan herhangi bir ifadede belirtmenize izin verir .
Go'da bellek yönetimi bir çöp toplayıcı tarafından gerçekleştirilir .
Dilin tasarımcıları bunu düşünse bile henüz genel bir programlama yok . Yöntem aşırı yüklemesi veya işaretçi aritmetiği yoktur . Son olarak, hiçbir iddia veya istisna yoktur . Bu ikisini değiştirmek için, GB anahtar kelimeler sağlar defer, panicve recoverörneğin, C taşıma sistemleri dil istisna benzer mekanizmalar sağlayan ++ ve Java (anahtar kelimeler try, catch, finallyve throw).
Go, SDL ve MySQL için zaten bağlamalar geliştirmiş olan üçüncü taraf geliştiriciler olan C/C++ kitaplıkları ile arayüz oluşturabilir .
Go, standart bir kod formatı tanımlar (girintiler ve kontrol yapılarının sunumu açısından) ve bunu uygulamak için bir araç sağlar (go fmt).
Go ayrıca kod tabanlı bir dokümantasyon sistemi ve test çerçevesi sunar.
go'nun derleme birimi, standart uygulamada bir dizin ve doğrudan bu dizinde bulunan dosyalar tarafından temsil edilen pakettir.
Bir paketin içe aktarımı, içe aktarma yolu tarafından yapılır ve standart bir kitaplık veya uzak kaynak havuzlarında kurulu üçüncü taraf paketleri belirtebilir (şu anda desteklenmektedir: svn , git , mercurial ve bazaar altında depo ).
Go başlangıçta kullanıcı programları değil, sağlam sistem uygulamaları üretmeyi amaçlasa da, OpenGL'ye bağlantılar deneysel olarak geliştirilmektedir.
C gibi Go, hangi kitaplıkları kullanacağınızı belirtmenizi gerektirir. Bu kütüphane ise C aksine, bu hata derleme gördüğü değil kullandı. Go derleyicisi aslında tasarımcıların seçimine göre herhangi bir uyarı mesajı içermemektedir: "Neyin düzeltilmesinin gerekli olmayacağını belirtmek şart değildir".
Ana kütüphaneler:
Kütüphaneler bazen bağımsız, bazen bağımlıdır. Benzer şeyleri yapmanın birkaç yolu da vardır. Örneğin, bir dosyayı okumak için ioutil.ReadAll , file.Read() veya bufio.NewScanner() kullanabilirsiniz .
Kitaplıkların listesini komut satırından go list all.
Go, aşırı hız kaybı olmadan bazen onları daha okunaklı hale getirebilen programların özyinelemeli olarak çağrılmasına izin verir:
package main import "fmt" import "time" var s [61]int func fib(n int) int { if n < 3 { return 1 } if s[n] != 0 { return s[n] } s[n] = fib(n-1) + fib(n-2) return s[n] } func main() { var i int t0 := time.Now() for i = 1; i <= 60; i++ { fmt.Printf("fib(%d) = %-15d\t", i, fib(i)) } println() println("Durée :", time.Since(t0).Seconds()) }Bu program, gofmt yardımcı programı tarafından -s (mümkünse kodu basitleştirin) ve -w (değiştirilen kodu yerinde yazın ) seçenekleriyle standart şekilde biçimlendirilmiştir . Bu yardımcı program, programın derinlik seviyelerini hizalayarak, özellikle birden fazla geliştiricinin aynı kodu sürdürmesi gerekiyorsa bakımı kolaylaştırır. Açılış ve kapanış parantezlerini dikey olarak hizalamadığını unutmayın, mevcut editörlerin çoğu (2018), düzenleme modunda eşleşmeleri görsel olarak bildirmekten sorumludur.
Go'nun sözdizimsel seçimleri oybirliğiyle değil. Dil, yazımında basit olduğunu iddia ederse, bazıları, diğerleri arasında alıntı yaparak, sözdizimini kafa karıştırıcı ve sorgulanabilir katılık derleyicisi olarak nitelendirerek, bu bağlamda çok etkili ve dogmatik önyargılara sahip olduğu için eleştirir:
Dil, "Ford T gövdesinde bir Ferrari motoru" olduğu için eleştirildi.
Öte yandan, git arkasında sözdizimsel gereksiz parantez kaldırarak, örneğin geriye uyumluluğu sağlamak için kasıtlı C ++ tutulan C'nin sözdizimi, basitleştirmek için önermektedir ifve forbir de sonbahar-through varsayılan önererek switch, vb Bu değişiklikler daha okunabilir programlar sağlayabilir.
Go'da yazılmış kayda değer ücretsiz uygulamaların listesi: