March 01, 2013

Salih hocam orada yaptığımız işlemi adım adım anlatıyorum.
*OPERAND adreslerini alıp bir dizi içerisinde saklıyoruz.
*Rh.newOp ile byte dizimize veri yazıyoruz.
**Orada yazdığımız veri operand ve operand değeri
***Operand = OP.LOAD (1 yani)
***Operand verileri: Operand 2 parametr alıyor. Bunlar sırasıyla (Register, veri). Operandın veriyi yazacağı yer REG0 yani 1.register bu kodlarda registerlar ile alakalı birşey yok sadece olduğu takdirde işlemlerin ne kadar süreceğini test etmek maksatlı yazdım. Sürekli ++ yapılması ve adresi diziden okumamız hızı olumsuz etkiliyor. Registeri yazdık şimdi ise veriyi yazıyoruz. Esas olay burada önce veri türü yani DT.STRING (2) daha sonra veri string olduğu için string uzunluğu (Daha sonra veriyi tekrar elde etmek için lazım) ve stringin içindeki her charı sırasıyla yazıyoruz. Tabi bunların hepsini byte a çevirerek yapıyoruz.
**Daha sonradan bu byte dizisini compile işlemimiz için kayıt ediyoruz. (Burada yorum satırı)
**Ve byte dizisi işlenmeye başlanıyor. Okunan veri operand yani 1 diziden operand adresi alınıyor ve o adrese gidiliyor. Operand kendisine 2 veri geleceğini biliyor (Başka operanda bir tane gelir başkasına hiç gelmez veriler zaten bu bilinerek yazılıyor) ve ona göre de verileri okuyor. Önce veri türü (string) okunuyor. Sonra ise byte dizisinde char dizisinin başladığı adresten itibaren dilimleme yapılıyor ve uzunluk için de char dizisi başlamadan önceki veri okunuyor o da bu yazdığım kodlarda 8 oluyor. Sonradan cur içerisinde saklanan adresimizin değeri uzunluk için 1, char dizimizin uzunluğu için de direk adresteki uzunluk okunup arttırılıyor.

Salih hocam umarım karışık anlatmamışımdır. Anlamadığınız bir yer varsa tekrar anlatabilirim.

Ali Hocam daha önceki yaptığım yapıyı tamamlamak istedim :) Emplace olayına da geleceğim. Yazdığınız dersi anlamaya çalışıyorum :) Ama okuduğumu anlamayla ilgili bir sıkıntım var :)

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

March 01, 2013

Alıntı:

>

O iş iki taraflı: yazar da sorumlu. Sıra o bölümü İngilizceleştirmeye gelince daha anlaşılır hale getiririm.

Bence anlatımınız gayet güzel. Benim genel anlamda (okulda da) böyle bir sıkıntım var :) Okuyorum ama boş okuyorum. Yada anlamak için birkaç kere daha tekrar etmem gerekiyor.

Hocam sizden bir şey rica etsem yapar mısınız?

Olayı kod üzerinden anlatacağım.

Bu kod çalıştırılırken 1 milyon kere i < 1_000_000 işleminden dönen sonucu içeren değer oluşturuluyor. Yani 1 kere false, 999_999 kere true oluşuyor. Bu oluşturulan değer D de hep aynı adreste oluşturuluyor. Ben ise buradan dönün her sonuç için malloc ile hafızadan yer ayırtıp değeri oraya yazıyorum ve kısaca 1 milyon tane true, false değeri gereksiz yere hafızaya yazılıyor. İstediğime gelirsek eğer bu tarz işlemlerin nasıl yapıldığına dair detaylı bir yazı varsa elinizde (ingilizce olsa da olur) verebilir misiniz? Şimdi hepsini aynı adrese yazabilirim ama bazı durumlarda hafızadan silinmemesi gerekecek şimdi bu şekilde hafıza yönetimiyle ilgili konularda bilgi sahibi olmam gerekiyor. Aksi takdirde çok şişecek bunları öğrenerek başlamak daha iyi olacaktır.

for(i; i < 1_000_000; i++){

}

Teşekkürler.

Zekeriya

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

March 01, 2013

Adım adım gidelim ve bir yandan karşılıklı bir şeylar öğrenelim olur mu?

Alıntı (zekeriyadurmus):

>

OPERAND adreslerini alıp bir dizi içerisinde saklıyoruz.
Öncelikle küçük bir soru, enum ile oturtmuş olduğun id sistemine bir string(dizge) ile neden ek bir tanımlama ve dizi oluşturuyorsun? Biraz uzun bir soru oldu gerçi ama çok şartsa eğer bu ilk bölümde yapabileceğimiz 2 basit şey var:

1.'si to!string yaparak enum isimleri, statik bir şekilde elle yazmadan otomatikleştirilebilir...
2.'si ise madem 1. maddedeki olanak var; tüm adresleri bir döngü içinde öğrenebiliriz...:)

Alıntı (zekeriyadurmus):

>

Rh.newOp ile byte dizimize veri yazıyoruz.
Bu sefer küçük bir soru...:)

Neden static sınıf?

Bu arada madem bu işlevleri bir sınıf içine aldın, veridizisi hatta onun adresini veren ptr() isimli bir işlevi de sınıfı içine almalısın. Bak o zaman daha güzel görünecek her şey...

-DEVAMI GELECEK-

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

March 01, 2013

Serialization'ı şöyle özetleyebilirim: Veriyi daha sonradan tekrar eski haline getirmek için bir seri bayt haline dönüştürmek. Programlar arasından veri aktarırken çok kullanılır. Veri tabanlarına yazarken, yedeklerken, vs. yapılan işlemlerde de olabilir.

Örneğin, "merhaba" dizgisi üç parça olarak saklanabilir: tür (string), uzunluk (7), ve harfler.

Zekeriya'nın Rhs.newOp işlevleri de bunu yapıyor. Veriyi alıp veridizisi'ne bayt bayt yerleştiriyor.

Aslında ben emplace()'i önermiştim ama Zekeriya göstergeden dilim elde etme olanağından yararlanmış. :)

Ali

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

March 01, 2013

Alıntı:

>

Adım adım gidelim ve bir yandan karşılıklı bir şeylar öğrenelim olur mu?

Olur :)

Alıntı:

>

Öncelikle küçük bir soru, enum ile oturtmuş olduğun id sistemine bir string(dizge) ile neden ek bir tanımlama ve dizi oluşturuyorsun?

Sorunuzu tam olarak anlayamadım :( Ama sanırım opnames den bahsediyorsunuz. opnames kalkacak oradan sadece adreslerin doğru yüklenip yüklenmediğini kontrol amacıyla adres isimlerini tutuyorum. Kalkacak yani o kod.

Alıntı:

>

2.'si ise madem 1. maddedeki olanak var; tüm adresleri bir döngü içinde öğrenebiliriz...

Nasıl?

Alıntı:

>

Neden static sınıf?

Üye işlevler daha hızlı olsun diye (sanırım daha hızlı oluyor :) ) static yaptım. Yapmışken class da öyle olsun dedim. Yani özel bir sebebi yok. Belki de hatalı bir kullanım bilmiyorum. Sizin veya Ali hocamın bu konuda bir bilgisi var mı?

Alıntı:

>

Bu arada madem bu işlevleri bir sınıf içine aldın, veridizisi hatta onun adresini veren ptr() isimli bir işlevi de sınıfı içine almalısın. Bak o zaman daha güzel görünecek her şey...

Tamam aldım :) Profesyonel kod yazımı hakkında pek bir bilgim yok kodları bildiğim gibi yazıyorum bu da sorun çıkartıyor. Beni uyarın hatalarımı düzelteyim :)

Zekeriya

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

March 01, 2013

Alıntı (zekeriyadurmus):

>

okuduğumu anlamayla ilgili bir sıkıntım var :)

O iş iki taraflı: yazar da sorumlu. :) Sıra o bölümü İngilizceleştirmeye gelince daha anlaşılır hale getiririm.

Ali

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

March 02, 2013

Bu arada hocam kodlarda birkaç değişiklik yaptım. (Gite atmadım çünkü ayrı bir proje dosyası açtım.)

Operandları aşağıdaki şekilde saklıyorum ve istediğim gibi cast yapıyorum veri saklamayla ilgili bir sorun çıkartmayacak sanırım :)

struct op{
	void* adres;
	ubyte[]	veriler;
}

Zekeriya

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

March 03, 2013

Alıntı (zekeriyadurmus:1362208313):

>

Bu oluşturulan değer D de hep aynı adreste oluşturuluyor.

O sayaç için bellek adresi kullanıldığını sanmıyorum. Mikroişlemcilerin sayaç amaçlı yazmaçları vardır. Onları kullanıyordur. (Assembly çıktısına bakmayacak kadar eminim. :))

Alıntı:

>

Ben ise buradan dönün her sonuç için malloc ile hafızadan yer ayırtıp değeri oraya yazıyorum ve kısaca 1 milyon tane true, false değeri gereksiz yere hafızaya yazılıyor.

Bu işi asm bloğunda yaptığın için mi? Sen de yazmaç kullanabiliyor musun?

Alıntı:

>

Şimdi hepsini aynı adrese yazabilirim ama bazı durumlarda hafızadan silinmemesi gerekecek

Bu kadarına bakınca bir bool dizisi görüyorum:

for(i; i < 1_000_000; i++){
   if (birKoşul) {
       depo ~= true;
   }
}

Daha az yer kullanmak için bit vector denen topluluklar var. Onlara da bakabilirsin. std.container.Array'in bool özellemesi aynen öyle işler.

Ali

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

1 2
Next ›   Last »