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.