Jump to page: 1 2
Thread overview
April 10, 2013

2.0'ın yapımına başlamış bulunmaktayım.

Salih hocama geçen gün bildirdiğim gibi hız konusunun çok da üzerine gitmeyeceğim(şimdilik). Ama şunu rahatlıkla belirtebilirim 1.sürümden daha hızlı :)

Geçen gün Rust[1] adında yeni bir programlama dili keşfettim. Mozilla geliştiriyormuş ve bu dilden de sentaks konusunda esinlenebileceğimizi düşündüm :)

Dille ilgili yaptığım bazı değişiklikler ve kararlar aşağıdaki gibidir.

  • Register based yerine stack based sanal makine oldu. Assemblynin push ve pop yöntemi kullanıldı.
  • Veriler struct içerisinde tutulmak yerine RhObject sınıfından türetiliyor.

Son değişiklikleri github sayfasına[2] yükledim.

[1] http://www.rust-lang.org/
[2] https://github.com/Rhodeus/Script2.0/

Zekeriya

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

April 10, 2013

Aşağıdaki 1 milyonluk boş bir döngünün çalışma hızı 6 kat arttırıldı.

 i=0
 while(i < 1000000) print(i++)

120 ms içerisinde bu kod çalışıyor.

Ayrıca parsera {} ifadelerini kullanma zorunluluğu kaldırılıyor. {} kullanılmazsa tek bir ifade belirtilebilir.

Zekeriya

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

April 10, 2013

Merhaba Zekeriya,

Hız konusunda fazla oyalanmadan geliştirmeye devam etmek çok iyi bir karar oldu. Belki küçük bir öneri olabilir. Kodlar içerisinde gömülen hız ölçüm satırlarını debug { } kümesine alabilir veya version(test) { } gibi başka bir küme de kullanabiliriz. Böylece o satırlar -release sürümlerde derlenmemiş olacak.

Alıntı (zekeriyadurmus):

>

Dille ilgili yaptığım bazı değişiklikler ve kararlar aşağıdaki gibidir.

  • Register based yerine stack based sanal makine oldu. Assemblynin push ve pop yöntemi kullanıldı.
  • Veriler struct içerisinde tutulmak yerine RhObject sınıfından türetiliyor.

Az önce kodlara baktım ve anladığım gibi olmadığını gördüm. Ben D olanaklarıyla bir stack kurduğunu zannettimiştim. Meğer interpret() işlevi içerisinde assembly'nin pop ve push komutlarını kullanmışsın. Sanırım burada, ushort türünde bir değişkene (enum) sahip sınıfın adresini (içeriğini değil) stack'e atmış oluyorsun.

Peki sonra bunları pop ile aldığında işaretçinin gösterdiği nesneye ve tüm üyelerine erişebiliyor musun?

Bu arada RhOject sınıfında tam olarak ne işlemler yapılacak? Örneğin index() özelliği? Şu an hazır değiller sanırım ve bir tanesi için örnek verebilirsen kurguladığın çalışma sistemi hakkında daha fazla bilgi ipuçları elde edebiliriz.

Başarılar...

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

April 10, 2013

Alıntı:

>

hız ölçüm satırlarını debug { } kümesine alabilir veya version(test) { } gibi başka bir küme de kullanabiliriz. Böylece o satırlar -release sürümlerde derlenmemiş olacak.

Doğru diyorsunuz hocam. Debug içerisine aldım.

Alıntı:

>

Peki sonra bunları pop ile aldığında işaretçinin gösterdiği nesneye ve tüm üyelerine erişebiliyor musun?

Kesinlikle erişebiliyoruz. Sonuçta nesne üzerinde hiçbir işlem yapmıyoruz sadece adresini push/pop ile saklayıp okuyoruz.

Alıntı:

>

Bu arada RhOject sınıfında tam olarak ne işlemler yapılacak? Örneğin index() özelliği? Şu an hazır değiller sanırım ve bir tanesi için örnek verebilirsen kurguladığın çalışma sistemi hakkında daha fazla bilgi ipuçları elde edebiliriz.

RhObject içerisinde her bir veri türünün sahip olabileceği işlemler var mesela RhInt

a = 1
print(a[0])

Bu işlemi yapmak istediğinde RhInt üzerinde index metodu tanımlanmadığı için RhObject teki index metodu çağırılır ve oradan da ekrana hata mesajı verilir.

Index metodu rharray.d içerisinde aşağıdaki gibidir.

//RhArray.d
	override RhObject index(RhObject obj){
		return val[(cast(RhInt) obj).val];
	}
	override void indexEqual(RhObject key, RhObject value){
		val[(cast(RhInt) key).val] = value;
	}

Ama paraphrase işlemi yapılırken stack yönetimi ile ilgili sorun yaşıyorum. Kimi zaman elemanı stacktan alınması unutuluyor, kimi zaman ise fazladan alınıyor. Yorumlama işlemlerinin tam yapılması gerekiyor.

Zekeriya

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

April 11, 2013

Bir konuda görüşlerinizi almak isterim :)

i = 0
while (i++ <= 10) do
	print(i)
end

while (i++ <= 20) {
	print(i)
}

while (i++ <= 30)
	print(i)

Buradaki gibi 3 farklı while kullanımı olsun mu? Bazı programcılar { gibi özel karakterleri daha az kullanmak istiyorlar ben de onun için { ve } ye alternatif do ve end anahtar kelimelerini ekledim. { yerine do yazılabilir. Şu an bunu mümkün kıldım ama saçma bir fikir değildir umarım. Sizin bu konuda görüşleriniz nelerdir?

Zekeriya

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

April 11, 2013

Hatta biraz daha ileri gidiyorum...

while i++ <= 30
	print(i)

kullanımına da izin vereyim mi?

Zekeriya

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

April 11, 2013

Alıntı:

>

Son gösterdiğinde karışıklık şansı var mı? Satır sonuna kadar while'a dahil olarak mı kabul edeceksin?

Hayır :)

while i++ <= 30 print(i)

Bu kodu bile çok rahat ayrıştırabilirim :)

Alıntı:

>

Eğer öyleyse dilin genelinde nasıl oluyorsa öyle olsun. Satır sonuna kadar diye başka kavramlar varsa tamam; yoksa parantezler daha iyi.

Aslında sentaks şu şekilde olmuş oluyor;
while koşul kod
veya
while koşul { kod... }

Zekeriya

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

April 11, 2013
i=0
while i++ <= 10 print(i) print("değişken")

Yazıldığında { } kullanılmadığı için 1 den 10 a kadarki sayıları ekrana yazdırır daha sonra değişken yazar

i=0
while i++ <= 10 {print(i) print("değişken")}

Bunda ise 1değişken 2değişken şeklinde yazar.

Bu kodu çok rahat bir şekilde ayrıştırıyor şu an.

Zekeriya

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

April 11, 2013

Ya do+end olsun ya da küme parantezleri; ikisi birden olursa karışıklık olabilir. Hangisi olursa olsun, kullanılmasının şart olması daha iyi. Yoksa kod yanlış okunabiliyor.

Son gösterdiğinde karışıklık şansı var mı? Satır sonuna kadar while'a dahil olarak mı kabul edeceksin? Yani aşağıdaki gibi değil tabii:

while (i++) <= 30
   print(i)

Eğer öyleyse dilin genelinde nasıl oluyorsa öyle olsun. Satır sonuna kadar diye başka kavramlar varsa tamam; yoksa parantezler daha iyi.

Tabii bunları bana değil, hedef kitlene sormalısın. :) Onlar ne isterler acaba?

Ali

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

April 11, 2013

Alıntı (zekeriyadurmus):

>
> i=0
> while i++ <= 10 {print(i) print("değişken")}
> ```

> Bunda ise 1değişken 2değişken şeklinde yazar.
>
> Bu kodu çok rahat bir şekilde ayrıştırıyor şu an.
Bu 2.'si gerçekten çok hoş görünüyor. Elbette kısalık ve diğer dillere göre özgünlük önemli. Ama bunun ayarını belli kriterlere göre ayarlamalıyız. Yani temelde %50 özgünlük, %50 geleneksellik ise dilin kişiliğine ve yapısına uygun olacak her tür oran kaymaları (bir kefeden alıp diğerine verme) mübahtır...:)

Esprili yaklaştığım bu girişten sonra, konuyu teknik olarak inceleyelim:

Önce güzel parantezlerden bahsedeyim. Elbette her dilde kullanılmayan bu kümeleme olayı gerek D'nin ruhuna gerekse bir çok dile çok güzel yakışıyor. Özellikle OOP mantığında sadece { ... } işaretleri arasına kod yazarak bulunduğu state'in diğerlerini etkilememesi çok hoş bir şey. Bu ve benzeri nedenlerden dolayı bence kümelemeden hiç bir zaman vazgeçmeyelim. Ama bazı istisnaları olabilir:

i = 10
do print(i) while(i--)


Örnek koddan anlaşıldığı gibi, benim bazen while()'yerine do/while ikilisini bilinçli olarak kullandığım ve pratik bir şekilde güzel parantezlere ihtiyaç bıraktırmayan örnek kanımca güzel. Ama dikkat, tek satırda bazı şeyleri pratik şekilde ifade etmek istediğim için bana güzel geliyor olabilir. Ancak çoğunluk için kod okumayı zorlaştırabilir. O yüzden geleneksel kümeleme çoğu yerde abartılarak tek satıra parantez aç kullanılır ya. Belki kod okumayı kolaylaştırıyor olabilir ama pekala bir foreach'i şöyle yazmak da kodun okunabilirliliğini düşürmüyor, haksız mıyım?

foreach(data; datas) {
print(data)
}


En iyisi orta karar sanki ama istisnaları da desteklemek lazım. Örneğin bunlardan biri de yukarıda ilk verdiğim kodda yer alan hem sorgu(if) hem de eksiltme(inc) komutunun olması önemli. Sanırım bu C'nin pratikliğinden gelen güzel bir olanak. Yani derleyici (tabi burada yorumlayıcı) döngü içinde değişkeni önce eksiltip sonra 0 olup olmadığına bakmasını istediğimi anlıyor. Zaten bizim her alan yapmak istediğimiz pratiklik ilkesi ile uyuşmuyor mu? Bu arada aklıma gelmişken:

Dil değişkenden önce ++ işaretleri ile sonraki arasında farkı anlayabiliyor mu? Her ne kadar birinin daha hızlı olduğu sebebiyle gelenekselleşen bir alışkanlık olsa da tek başına (tek satırda) kullanımlarda ikisi arasında hiç bir fark yok. Bunu D'nin assembly kodlarına bakarak tespit etmiştim. Yani her ikisi de tek başına inc i; gibi bir komut oluyor. Ama! Değişkeni ekrana yazarken veya yukarıdaki paragrafta anlattığım örnekteki gibi durumlarda öncesi ve sonrası arasında kritik sayılabilecek farkın ayırt edilmesi gerekiyor.

Özetlersek, kümelemeden ödün vermeyelim ama do/while ikilisinde olduğu gibi kümesiz de kullanabilmeliyiz. Ayrıca değişkenlerin öncesi ve sonrasında konulan dec/inc işaretlerinin farkını ortaya çıkarmalıyız.

**Dip Not:** Aslında D'nin ruhuna yakışan i.print() gibi bir özelliğini (UFCS) de ekleyebilseydik çok iyi olurdu. Hep arzuluyorum ya; RhS D'yi, temsilen de olsa onu yansıtan bir script olabilse. Belki bir süre sonra Ali hocam yurt dışında bunu tanıtarak çoğunluğun kullanımına vesile olur ve hatta dilin geliştiricileri bu script'i sahiplenerek resmi D script'i ilan edebilirler. Bunlar hep hayal ettiğim şeyler, bakarsınız olur...:)

-- 
[ Bu gönderi, <http://ddili.org/forum>'dan dönüştürülmüştür. ]
« First   ‹ Prev
1 2