January 29, 2013

Bu durumda Racih'in derle'sine uygulanabilir:

Gerçi "regular expression" kullanarak pekala bunu D içinde de yapabilir ve Sezar'ın hakkını Sezar'a vermiş oluruz...:)

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

January 29, 2013

Evet, şablon ve mixin kullanılabilir ama galiba asm blokları içinde 'opcode'dan başka bir şeye izin verilmiyor. (?)

Soruyu genel olarak şöyle yanıtlayabiliriz: C'nin makroları bütünüyle önişlemci olanağıdır. Kod derlenmeye başlanmadan önce önişlemci bütün makroların yerine metin karşılıklarını yerleştirir.

O açıdan bakınca önişlemcisi olmadığı için #define'ın D'de tam karşılığı yok ama kullanım amaçlarına bakınca hemen hemen hepsi var.

Ali

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

January 30, 2013

Ali hocam bu cpp programını gcc kullanmadan kullanabilme imkanımız var mı?

Racih'in projesini inceledim gayet hoş güzel. Dediğiniz gibi uygulanabilir ama kafama takılan bir soru oldu.

Derleme esnasındaki oluşacak hataları görme konusunda sıkıntı çıkartmasın?

Zekeriya

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

January 29, 2013

Tabii bu iş için gcc ile gelen önişlemciyi de kullanabiliriz. Onun adı cpp (C++ ile karışmasın; ilgisi yok! :)).

Utana sıkıla :) şöyle bir kod yazın. İsmi bu denemede 'preprocess.d' olsun:

import std.stdio;

#define ABC 10

#define HESAPLA(x, y) ((x) + (y)*3)

void main()
{
   writeln(ABC);
   writeln(HESAPLA(2, 3));
}

Sonra onu cpp'den (ve onun eklediği '#' satırlarından kurtulmak için sed'den) geçirin ve sonucu 'preprocess.out.d' dosyasına yazın:

'$ cpp preprocess.d | sed '/^#/d' > preprocess.out.d'

Sonuçta elde edilen 'preprocess.out.d' dosyası dmd'ye derlemesi için vereceğimiz kaynak dosya olacak:

import std.stdio;




void main()
{
   writeln(10);
   writeln(((2) + (3)*3));
}

Ali

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

January 30, 2013

cpp'yi gerektirmeyen bir çözüm bulmalı... D.learn haber grubunda sordum. Bakalım başkaları ne yapıyor.

Ali

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

January 30, 2013

Bir çözüm varmış:

mixin("
asm {

...

asıl kod

}");

Tabii sen makro açılımı istediğin için aşağıdaki expandNexts gibi bir işlev gerekiyor. Amaç, dizgi içindeki "Next;"leri istediğin kodla değiştirmek. Aşağıdaki ctRegex kullanan çözüm ne yazık ki derleme zamanında çalışmıyor. Onun için senin yazman gerek.

Onu yaptıktan sonra aşağıdaki writeln yerine mixin yazarsan çalışacaktır:

import std.stdio;
import std.regex;

string expandNexts(string input)
{
   enum e = ctRegex!("Next;", "g");
   // NOT: Tabii ki makro açılımının yerine doğru kodlar da gelmeli.
   return replace(input, e, "cmp EAX,0;");
}

void main()
{
   writeln (expandNexts(q{
       asm
       {
           mov EAX, 10000;
           Next;
           Next;
           Next;
           Next;
           Next;
       }
   }));
}

Bu haliyle çıktıya şunu yazdırıyor:
'
asm
{
mov EAX, 10000;
cmp EAX,0;
cmp EAX,0;
cmp EAX,0;
cmp EAX,0;
cmp EAX,0;
}
'

Ali

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

February 02, 2013

Hocam bu kodun amacı nedir ?

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

February 02, 2013

Ali hocam cevabınızı şimdi gördüm kusura bakmayın :(

Bununla ilgili şöyle bir sıkıntı çıkar bence regex işlemi yaptığı için txt içindeki bütün Next; leri değiştirir.

Eğer kodlar arasında yorum satırı olarak veya string olarak Next; yazarsa o zaman sıkıntı çıkartır.

Veya komutNext; gibi bir kullanım olduğunda aynı şekilde sıkıntı çıkartır.

Daha iyi bir çözümü olabilir bence

Zekeriya

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

February 02, 2013

Alıntı:

>

Hocam bu kodun amacı nedir ?

Bana sormamış olsanız da cevaplayayım.

Aynı kodları en az 50 kere farklı yerlerde kullanmayı istiyoruz. Bunu fonksiyon çağırarak yapabiliriz ama bu bize hız kaybettirir. Bu projede en önemli şey hız olduğu için bunu başka bir yolla yapmaya çalışıyoruz. Bu yazılan kodlar oldukça uzun kodlar olacak isteğimiz bu uzun kodlar yerine sadece Next; yazarak derleme öncesinde Next; görülen yere o uzun kodları yerleştirilmesini sağlamak.

expandNexts fonksiyonu burada RegEx ile bu işlevi yapıyor.

Zekeriya

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

March 01, 2013

1 ay önceki konuyu hortlatmış gibi olsam da hız konusunda ve Talha'nın Rhodeus Script (RhS)'i ile alakalı küçük bir endişemi paylaşmak istiyorum...

Bilmiyorum diğer yorumlamalı diller böyle mi:

Biz bir takım temel işleç çarklarının (operand) assemby karşılıklarını koda yerleştiriyoruz. Sonra bunların adreslerini okuyup akıllı bir düzen içerisinde istediğimiz zaman çağrılıp iş görecek halde kullanıyoruz. Tıpkı yazılım ürettiğimiz sırada işlevleri ve değişkenleri belli yapılara (class, struct, union vb.) bölmemiz ve bunları istediğimiz zaman kurup kullanmamız gibi.

Peki call ve ret komutları ile dolu bir yorumlayıcı (öyle ya her işleç çarkı arasında gidip gelecek) ne kadar hızlı olabilir? Yani derlemeli bir dilde tüm komutlar akıllı bir şekilde ardı ardına yerleştirilirken biz RhS'de, belki de belleğin farklı bölümlerinde olan komutlara veriyi taşıp işlemelerini isteyeceğiz ve geri dönüp sırada hangi komutun olduğunu öğrendikten sonra bir sonrakine geçeceğiz...

Bunlar bana biraz, sağ elimiz ile kafamızın diğer tarafındaki sol kulağımızı tutmak kadar zor geliyor. Haksız mıyım?

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