Forum: D Programlama Dili RSS
Global Değişken Kullanımları
Avatar
zekeriyadurmus #1
Kullanıcı başlığı: Talha Zekeriya Durmuş
Üye Eki 2012 tarihinden beri · 701 mesaj · Konum: Samsun/Türkiye
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Konu adı: Global Değişken Kullanımları
Halen daha çözemediğim bir şey var.

__gshared, static, shared veya bunların hiçbirini kullanmadan global bir değişken tanımlamak arasındaki farklar tam olarak ne? Üretilen asm çıktısı, performans, stabilite vs vs.

Eğer sadece tek 1 seferlik yazılacak ve bütün program içerisinde geçerli olacak bir verimiz var ise. Ayrıca bu veriye ulaşma süresi daha öncelikliyse ne yapmalıyız? Bu veri aynı zamanda threadler tarafından eşzamanlı olarak erişilebilir olacak ama sadece okunabilir(read-only). Yazma işlemi program açılırken 1 defaya mahsus olacak.

İnternette çok ilginç bir yazı serisi buldum aslında http://c2.com/cgi/wiki?GlobalVariablesAreBad

Laravel kullanırken Dependency Injection, Singleton gibi kavramlarla bunları hallediyorduk. Ama benim her şeyden çok önceliğim hız.

Bir aralar bunu sormaya çalışıyordum ama bir türlü ifade edememiştim (bilmediğiniz bir şeyi ifade etmeye hatta soru sormaya çalışmak gerçekten zor :) ) Elimde yarım yamalakta olsa bir kaç kavram ve bir kaynak var ama daha detaylı bilgi istiyorum ayrıca kesin yargılardan ziyade şu durumda bunun kullanılması daha doğru olur şeklinde yargılar da yardımcı olabilir.

Umarım fazla kafa bulandırmamışımdır :)

Ek olarak:

Bütün bunları derinlemesine inceleyen bir kitap, kaynak harika olurdu.

code.dlang.org adresinde https://github.com/mbierlee/poodinis gibi bazı kütüphaneler var.

Zekeriya
Bilgi meraktan gelir...
Bu mesaj zekeriyadurmus tarafından değiştirildi; zaman: 2015-10-28, 09:16.
acehreli (Moderatör) #2
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4527 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Öncelikle, işin güzeli, D'de değişkenler öncelikle iş parçacığına özel (thread-local). Ek olarak, modül düzeneği bulunduğundan, global değişkenler isim çakışmalarına da neden olmuyorlar çünkü aslında hiçbir değişken global değil, hepsi mutlaka bir modüle ait.

zekeriyadurmus:
__gshared, static, shared veya bunların hiçbirini kullanmadan global bir değişken tanımlamak arasındaki farklar tam olarak ne?

Modül düzeyinde tanımlarsan thread-local bölgede yaşıyor. Dolayısıyla, birden fazla iş parçacığı başlatıldığında o değişkenin bir çok kopyası yaşıyor.

Bütün programda tek adet istiyorsak shared olmalı.

C kütüphanelerinde tanımlanan global değişkenleri bildirmek (veya kendimiz o kütüphaneler gibi tanımlamak) için __gshared kullanmak gerekiyor. __gshared ile shared arasında bağlayıcı (ve loader) açısından fark var. Zamanında okuduğum tartışmalara göre __gshared daha hızlı. (Herhalde shared için bir tane daha indirection oluyordur; ayrıntısını hatırlamıyorum.)

static'in durumunu denemeden bilemem. (Denemedim. :p)

Akılda tutulması gereken bir şey: Bu iş parçacığının değişkenlerini ilklemek için static this, programda tek olan (shared ve __gshared) değişkenler için shared static this:

  http://ddili.org/ders/d/es_zamanli_shared.html#ix_es_zaman…

Bu veri aynı zamanda threadler tarafından eşzamanlı olarak erişilebilir olacak ama sadece okunabilir(read-only). Yazma işlemi program açılırken 1 defaya mahsus olacak.

O zaman __gshared immutable olarak dene ve shared static this bloğunda ilkle. (Evet, immutable bile olsa o blokta ilklenebiliyor ama pure bir işlev çağırman gerekebilir: değişken = ilkleme_işlevi() gibi...)

İnternette çok ilginç bir yazı serisi buldum aslında http://c2.com/cgi/wiki?GlobalVariablesAreBad

Evet, global değişkenler C, C++, vs. baş belası olabilirler! :) Dediğim gibi; neyse ki D, Python, vs. gibi dillerde tam anlamıyla global değiller.

Ali
Avatar
zekeriyadurmus #3
Kullanıcı başlığı: Talha Zekeriya Durmuş
Üye Eki 2012 tarihinden beri · 701 mesaj · Konum: Samsun/Türkiye
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Web sürümündeki dersleri okudum ama tam anlamıyla yeterli gelmedi açıkçası. Biraz daha fazla detay, örneklemeler, karşılaştırmalar vs vs gerekti.

Örneğin shared ve __gshared tam olarak nasıl implemente ediliyorlar.

Açıkçası bütün bunlardan da öte programın tam anlamıyla nasıl çalıştığını anlamak istiyorum. Derleyicinin çalışma prensibinden, linklenmesine, runtime esnasında neler olduğuna kadar. Derlemeli dillerin eğlencesi benim için burada.

Örneğin try-catch mekanizmasının setjmp ve longjump adı verilen fonksiyonlarla yapıldığını öğrenmiştim. High-level'a çıktıkça bazı şeyleri kaçırıyor olmak ve soru işaretleri kalması hoşuma gitmiyor.

Vizelerim başladığı için şu sıra bakamayacağım ama fırsat bulduğumda "design patterns" olaylarına bakacağım. Hatta belki üniversitede dersimiz olur bununla alakalı. Eğer yeni bir şeyler öğrenirsem haberdar ederim.

Teşekkür ederim :)

Zekeriya
Bilgi meraktan gelir...
Doğrulama Kodu: VeriCode Lütfen resimde gördüğünüz doğrulama kodunu girin:
İfadeler: :-) ;-) :-D :-p :blush: :cool: :rolleyes: :huh: :-/ <_< :-( :'( :#: :scared: 8-( :nuts: :-O
Özel Karakterler:
Bağlı değilsiniz. · Şifremi unuttum · ÜYELİK
This board is powered by the Unclassified NewsBoard software, 20100516-dev, © 2003-10 by Yves Goergen
Şu an: 2017-11-18, 22:38:36 (UTC -08:00)