Ingenue

Evet, askerliktir şudur budur çok zaman oldu. Askerde excel dışında kendimi pek geliştiremedim, o dönemi bu kadar kısa bir özetle geçiştireyim 🙂

Ingenue nedir derseniz, tiyatro vb. de olan saf kız karakterlerine verilen isimmiş.

Aynı zamanda yeni (ve çok eski) projemin şu anki kod adı olarak seçtim, neden derseniz az önce Atoms For Peace – Ingenue dinlemekte idim ve projenin gelişme stili de oradaki dansa benzemekte.

Kendisi bir programlama dili olmakta. Dynamic typing bir dil ve şu anda bir interpreter üzerinden çalışmakta. Syntax olarak C ye baya bir benzer. “E neden yazıyorsun” derseniz çoğunlukla eğlence için. Ama dile yeni özelliklerde getirmek istiyorum.

Dediğim gibi, dil dynamic typing olmakta. Tüm değişkenler operatörlere göre tiplerini değiştirebiliyor. mesele a = b + c; gibi bir kodda a nın tip i b ve c ye göre belirleniyor. Şu anlık 3 tip var, integer, float ve string. Ve bunların baskınlık sırasıda integera = b * 2; gibi bir programın sonraki bir aşamasında bu 2 değeri 3 olabilecek. Daha ilginç bir örnek vermek gerekirse yine aynı kodda * operatörü değişebilecek ya da assignment operatörünün hedefi a değil de c olabilecek. Bir nevi hot swapping gibi. Böyle bir şeye izin veren diller var mı bilmiyorum ama fikir ilk kaynak kodunu değiştirmeye izin veren brainfuck interpreterları olduğunu öğrendiğimde aklıma gelmişti.

Ne işe yarayacak derseniz emin değilim 🙂 ama farklı bir programlama stili olacak diye umuyorum.

Nasıl çalışmakta derseniz şu anda 2 aşamadan oluşuyor. Lexer/parser kısmı ve interpreter kısmı. Parsing aşamasında kaynak kodunu alıyorum ve token larına ayırıyorum, bu tokenlarda interpreter tarafından yorumlanıyor ve kod çalışıyor. Mesela

a = 5;
b = 3.0;
c = a + b; 
d = a++; 
if(a > 0) { 
    d = a + b; 
} else d = 0;

gibi bir kod olsun. Parser bunu şöyle bir şeye çeviriyor.

program
    statement
        value
            assignment
                variable a
                value
                    integer 5
                /value
            /assignment
        /value
    /statement
    statement
        value
            assignment
                variable b
                value
                    float 3.0
                /value
            /assignment
        /value
    /statement
    statement
        value
            assignment
                variable c
                value
                    variable a
                    operator +
                    variable b
                /value
            /assignment
        /value
    /statement
    statement
        value
            assignment
                variable d
                value
                    variable_withpost
                        variable a
                        singleoperator ++
                    /variable_withpost
                /value
            /assignment
        /value
    /statement
    statement
        ifcond
            value
                variable a
                operator >
                integer 0
            /value
            statement
                statement
                    value
                        assignment
                            variable d
                            value
                                variable a
                                operator +
                                variable b
                            /value
                        /assignment
                    /value
                /statement
            /statement
            else
            /else
            statement
                value
                    assignment
                        variable d
                        value
                            integer 0
                        /value
                    /assignment
                /value
            /statement
        /ifcond
    /statement
/program

Kodun parse edilmiş hali de interpreter tarafından input olarak alınıyor ve program oluşturuluyor. Interpreter burada biraz tokenların yerlerini ve tree yapısını kendisi için düzenliyor. Interpreter ın yukarıdaki input tan oluşturduğu program şu şekilde.

 0 program
 1   statement
 2     value
 3       assignment
 4         variable a
 5         value
 6           integer 5
 7   statement
 8     value
 9       assignment
10         variable b
11         value
12           float 3.000000
13   statement
14     value
15       assignment
16         variable c
17         value
18           variable a
19           variable b
20           operator +
21   statement
22     value
23       assignment
24         variable d
25         value
26           variable a
27           operator post++
28   statement
29     ifcond
30       value
31         variable a
32         integer 0
33         operator >
34       statement
35         statement
36           value
37             assignment
38               variable d
39               value
40                 variable a
41                 variable b
42                 operator +
43       statement
44         value
45           assignment
46             variable d
47             value
48               integer 0

Buradaki en bariz değişiklik matematik işlemlerinin postfix e çevrilmesi.

İleride daha ayrıntılı olarak anlatmayı planlıyorum, şimdilik github linkini atmakla bırakacağım.

Sol

Uzun bir aradan sonra uzay projeme döndüm ve güneş sistemi özelliğini getirdim. Şimdilik çok tırt, farklı boyda gezegenler çizmeyi desteklemediğim için böyle tırt duruyor. Güneşin boyunu gezegenlere göre daha büyük yaparsam kim kimin etrafında dönüyor daha iyi anlaşılacaktır. Ayrıca gezegenlere orbit te eklemek istiyorum. O zaman hepten güzel olacaktır. Bir sonraki adım da uzayda ilerledikçe random güneş sistemleri üretmek olacak.

Ayrıca bütün gezegenlere hafif birer renk verdim. Çok belli olmuyor ama normalde de böyle herhalde 🙂 Gerçeğini yapıyor olsam daha renkli yapardım.

p2

Ayrıca quote’nin sahibinin sitesinden bir parça, ilginç bir insan.

Game of Life (WebGL)

WebGL üzerinde geliştirdiğim bir game of life implementasyonu (hemen hemen kullandığım bütün platformlarda/dillerde geliştirdim sanırım :))

Güzel yanı tamamen opengl olması, çizimlerin yanında hesaplamalar da shader’lar ile yapılmakta.

Aslında tahtanın boyu 2048*2048 boyunda, canvas’ın boyu ise 300×300. Sağ tuş işe zoom out yapabilirsiniz. Wrap yaptığı için pek farkedilemeyecektir sınırlar, sanki sonsuza gidiyor gibi ama değil 🙂

İleride önceden tanımlanmış initial state ler falan koyacağım, bir de belki daha smooth geçiş verebilirim pixellere. Ayrıca ana sayfada birden fazla webgl olunca performans sıkıntıları başladı, belki aynı anda sadece bir tane oynatacak şekilde çalışmaları sağlanabilir.

edit: hayalimdeki haline geldi gibi, ayrıca tam ekranda çıkacak şekilde bir sayfa yaptım, buradan ulaşabilirsiniz.

WebGL

Bir süredir WebGL ile ilgileniyorum. WebGL & Html5 canvaslarını kullanarak bir çalışmam var. Şu adresten ulaşabilirsiniz.

webgl
http://enginmercan.com/webgl

Aslında çok eskiden yaptığım bir flash çalışmasının WebGL ile tekrar yapılmış hali. 3D bir uzay ortamı yaratıyorum ve blog contentini bu ortamda paylaşmayı amaçlıyorum.

Grafikler genel olarak WebGL ile yapıldı, ama GUI gibi şeyleri WebGL in önünde bulunan bir canvas ile çiziyorum. Mesela mor scroll bar canvas üzerinde, ünlemlerdir video gezegenlerinin play tuşudur vs hep yine canvas ile çizilmekte. Buradaki amacım webgl in bu şekilde high level çizimler için yetersiz bulmam.

Ayrıca web content i göstermek istediğim zaman da webgl in altında kalan bir div i kullanıyorum. Mesela boş beyaz gezegenlere tıklayınca linux fortune dosyalarında bir quote gösteriyor, bu quote aslında 3d grafiklerin altında kalan bir div içine konuluyor ve beyaz gezegenin ortasını oyarak altını göstermiş oluyorum 😀 Ayrıca video gezegenlerinde de video lar bu şekilde oynatılıyor.

Bir kaç ufak eklentiden sonra blog contentini oraya taşımaya başlayacağım. Kullanışlı olmayacak ama güzel olacak diye umuyorum 😀

BF Üzerinde GUI geliştirme!

Brainfuck için yazdığım bir eklentiyi kendi js compiler’ıma taşıdım. Bazı özel memoryleri system call gibi kullanarak grafiksel bir şeyler yapabiliyorsunuz. Örneğin hello world.

@gui@
>++++++>>+>->->>>>>>+>+++>+++++++>>>++>>++++>>>+>>>>++>++>++>>>>+>>>>++>++>>++++>>>+>++>>>>++>++>>>>+>>>>++++>++>>>++>>++>>++++>>>+>>>>++>++>+>>>>+>+++>>>>+>>>>++>++>>++++>>>++>++>>>>+>++>>>>++>++>>>>+>>>++>>++>>>>++++>+>++++>>>>++>++>>>>++>>++++>>>++>>>++>>++>>>>++++>+>>++++++>++++++++++++++++>>++>>++++>>>++>+>>>>++>>>>++>++>>++>>>++>+>>>>++>>>>++++>+>++>>>>++>++>>>>++>>++++>>>++>>>++>>++>>>>++++>+>++++>>>>++>>++++>>>+>>>>++++>++>++>>>>++>>++>>>++>>>++>>+>+>>>>++>>+>>>++>+>>>>++>>+>>>+>++++>>>>++>>>++>>++>>>>++++>+>++>>>>+>++>>>>++>++>>>>++>>++++>>>++>>>++>>++>>>>++++>++>>>>><<<<<[<<<<<]>>>>>[[-<+>]<<<<<[<<<<<]<<<<<<[-]>>>>>>>>>>>[>>>>>]<-[[-]><<<<<[<<<<<]<<<<<<[-]+>>>>>>>>>>>[>>>>>]<]>>[-<<<<<<[<<<<<]<<<<<++++++++++>>>>>>>>>>[>>>>>]>]>[-<<<<<<<[<<<<<]<<<<++++++++++>>>>>>>>>[>>>>>]>>]>[-<<<<<<<<[<<<<<]<<<<<---------->>>>>>>>>>[>>>>>]>>>]>[-<<<<<<<<<[<<<<<]<<<<---------->>>>>>>>>[>>>>>]>>>>]<<<<+>>>>>].

BF Test

WordPress üzerinde BF eklentisi, ısrarla isteyiniz.

++++++++++[>+++++++>++++++++++>+++>+<<<<-]>++.>+.+++++++..+++.>++.<<+++++++++++++++.>.+++.------.--------.>+.>.
>,[>,]<[.<]
+++++++++++>+>>>>++++++++++++++++++++++++++++++++++++++++++++>++++++++++++++++++++++++++++++++<<<<<<[>[>>>>>>+>+<<<<<<<-]>>>>>>>[<<<<<<<+>>>>>>>-]<[>++++++++++[-<-[>>+>+<<<-]>>>[<<<+>>>-]+<[>[-]<[-]]>[<<[>>>+<<<-]>>[-]]<<]>>>[>>+>+<<<-]>>>[<<<+>>>-]+<[>[-]<[-]]>[<<+>>[-]]<<<<<<<]>>>>>[++++++++++++++++++++++++++++++++++++++++++++++++.[-]]++++++++++<[->-<]>++++++++++++++++++++++++++++++++++++++++++++++++.[-]<<<<<<<<<<<<[>>>+>+<<<<-]>>>>[<<<<+>>>>-]<-[>>.>.<<<[-]]<<[>>+>+<<<-]>>>[<<<+>>>-]<<[<+>-]>[<+>-]<<<-]