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.