Şimdi Ara

C'de Kendi Programlama Dilinizi Oluşturun : Simpletron

Daha Fazla
Bu Konudaki Kullanıcılar: Daha Az
1 Misafir - 1 Masaüstü
5 sn
24
Cevap
1
Favori
4.725
Tıklama
Daha Fazla
İstatistik
  • Konu İstatistikleri Yükleniyor
0 oy
Öne Çıkar
Sayfa: 12
Sayfaya Git
Git
sonraki
Giriş
Mesaj
  • Merhaba arkadaşlar.
    Bloğumda paylaşmıştım, size yararı olsun diye burada da paylaşıyım dedim. Alıntı değildir. Bloğumdan direkt kopyala, yapıştır yapıyorum.
    EKLEME - Blogdan kopyala/yapıştır yapınca resimler gitmiş ve biraz dağınık olmuş. Kusura bakmayın müsait olunca düzenlemeye çalışacağım. 
    Kaynak :http://furkantokac.blogspot.com/2013/08/c-kendi-programlama-diliniz-simpletron.html


     C'de Kendi Programlama Dilinizi Oluşturun : Simpletron


    Kodlamayla uğraşanların çoğu, bir programlama dilinin nasıl yazıldığını kesinlikle merak etmiştir. Bu örnek ile bir programlama dilinin nasıl yazıldığını en kolay biçimde kavrayacaksınız.

    Açıklama
    Örnek üzerinden gidelim.
    Not : Kod 4 rakamı, komut ilk 2 rakamı, konum son 2 rakamı temsil etmektir.
    Ör/ Kod : 4251 -- Komut 42 -- Konum 51
     C'de Kendi Programlama Dilinizi Oluşturun : Simpletron

    Programımızı başlattığımızda karşımıza en üstteki uyarılar çıkıyor ve program bizden kod almaya hazır bir şekilde bekliyor. (“0 ? (girilecekKod)”)
    Yazdığımız her kod, integer bir dizide tutuluyor. “0 ?” ifadesindeki 0, o an yazdığımız kodun dizinin kaçıncı elemanında tutulacağını belirtiyor. Yani “DiziElemanı ?” şeklinde. Aslında burada yazdığımız kodların dizide değil RAM’de tutulduğunu düşünmelisiniz. Dizi, bu programda RAM görevi görüyor. Dizinin elemanlarını ise RAM’in konumu olarak düşünün. Sonuçta sıfırdan bir programlama dili yazıyoruz. Ortada dizi yok RAM var :)
    Şimdi bu kodlardan bahsedeyim.
    0 ? --- Mesela resimdeki ilk kod olan “1010” kodunu ele alalım. Buradaki yapı şu şekilde : Kod,ramKonumu. 3254 kodunda 32 rakamı komut, 54 ise bu komutun uygulanacağı RAM konumudur. Şimdi “1010” koduna geri dönelim. 10 komutu, bir değişken atamak için kullanılıyor. Yani bu kodumuzda kullanıcıdan bir değişken alıp bunu 10 konumuna atamışız.
    1 ? --- Daha sonra “1110” kodu geliyor. 11 komutu, yazının aşağısında da göreceğiniz gibi belirtilen konumdaki değişkeni okumaya yarıyor. Yani bu kodda 10 konumundaki değişkeni oku demişiz.
    2 ? ---- Daha sonra ise “9999” kodu geliyor. 99 komutu programı bitirmeye yarıyor. Programı bitirmek için bir konum belirtmek gerekmiyor. Bu yüzden ister 9934 yazın ister 9900 yazın. 99 komutunu kullanacaksanız önemli olan koddaki ilk 2 rakam.
    3 ? ---- "-9999" ile de kod girişini kesiyoruz. Şimdi diyeceksiniz “99 komutunu girdikten sonra zaten programı bitirmiş oluyoruz. Neden bir daha -9999 giriyoruz ?” Açıkçası ben de programı ilk başta 99 komutunu gördüğü an kod girişini kesecek şekilde yazmıştım fakat daha sonra fark ettim ki, -9999 ile yaparsam program daha esnek oluyor. Şuan 2’den fazla 99 komutu girebiliyorum. Bir de bilmenizde yarar var, -9999 RAM’e(diziye) kayıt edilmiyor.

    Bu Programlama Dilini Nasıl Yazdık ?
    Program “kodGir” ve “calistir” adında iki ana fonksiyondan oluşuyor.
    İlk olarak “kodGir” fonksiyonu çalışıyor ve bu sayede programı çalıştırdığımızda integer dizimize kodlarımızı teker teker giriyoruz. (Burada bazı ek fonksiyonlar konsol ekranında kod girerken kolaylık sağlıyor ve girdiğimiz kodları kontrol ediyor.)
    Daha sonra “calistir” fonksiyonu çalışıyor ve bu dizimizdeki kodları okuyarak, gerekli “case” içeriğini çalıştırıyor. Mesela dizimizde “1011” kodu bulunuyor. Bu kodun ilk iki rakamı komut, son iki rakamı ise konumdur. Bunlara ayrı ayrı ihtiyacımız olduğu için ayırmamız gerekiyor. Bunu da ufak bir matematik sihri ile hallediyoruz. İlk olarak komutRegister değişkenine, dizimizdeki kodu aktarıyoruz. Daha sonra kod değişkenine komutRegister / 100 yaparak ilk iki rakamı aktarıyoruz. Düşünün. 1011/100 = 10 + 11 ediyor ama değişkenimiz integer türünde olduğu için kalanı ihmal ediyor. Dolayısıyla “kod” değişkenimize kodumuzu aktarabiliyoruz. “konum” değişkenine de aynı mantıkla komutRegister % 100 yaparak ilk 2 rakamı aktarıyoruz. 1011 % 100 = 11 çıkıyor. Burada birşeyi ihmal etmemiz gerekmiyor :) Her döngüde komutSayici’yı 1 arttırarak dizimizdeki bir sonraki elemana, dolayısıyla bir sonraki komuta geçiyoruz. Burada şöyle bir istisna karşımıza çıkıyor. Dallanma yapacaksak komutSayici’yi 1 arttırmamız, mantık hatasına neden oluyor çünkü “dallan” komutu ile direkt olarak gitmek istediğimiz kodu yazıyoruz. Bu durumu düzeltmezsek gitmek istediğimiz konum yerine, gitmek istediğimiz konumdan bir sonraki konuma gitmiş oluyoruz. Bu yüzden dallanma kodlarından sonra "komutSayici--" yaptım ki, 1 artırıldıktan sonra istediğim kod yerine istediğim kodun 1 sonraki koduna gitmesin.

    Akümülatör Nedir ?
    Komutlara geçmeden önce kısaca değineyim ki aklınız karışmasın.
    Akümülatör, RAM'de sabit bir konumda tutulan değişkendir. Mesela Simpletron(Yazdığımız dil)'da toplama işlemi yapacaksanız algoritmanız şu şekilde olacak :
    0 ? Kullanıcıdan alınan sayıyı belirtilen konuma yaz.
    1 ? Kullanıcıdan alınan sayıyı belirtilen konuma(Öncekinden farklı bir konum) yaz.
    2 ? Kullanıcıdan alınan sayılardan bir tanesini (istediğinizi) akümülatöre yaz.
    3 ? Akümülatördeki sayı ile belirtilen konumdaki sayıyı topla ve sonucu akümülatöre yaz.
    4 ? Akümülatördeki sayıyı belirtilen konuma yaz.
    5 ? Akümülatördeki sayıyı yazdığımız konumu ekrana yazdır.

    Peki neden direk "1. sayı ile 2. sayıyı topla" demedik ? Çünkü yazacağımız kodlar 4 rakamlı olmak zorunda ve bu işlemi de 4 rakamla yapmamız olanaksızdır.

    Tüm Komutlar
    Şimdi gerekli bilgileri öğrendiğinize göre tüm komutları inceleyebilir, istediğiniz gibi komut ekleyip, çıkartarak dilinizi daha da geliştirebilirsiniz.

    10 //Belirtilen konuma değişken ata
    1052 : 52 konumuna kullanıcıdan aldığı değeri depolar.

    11 //Belirtilen konumdaki değişkeni oku
    1152 : 52 konumundaki değeri ekrana yazdırır.

    20 //Akümülatör = belirtilenKonumdakiDeğer
    2052 : Akümülatöre 52 konumundaki değeri yükler.

    21 //Akümülatördeki değeri belirtilen konumda sakla
    2125 : Akümülatördeki değeri 25 konumuna yazar.

    30 //akümülatör = akümülatördekiDeğer + belirtilenKonumdakiDeğer
    3015 : 15 Konumundaki değer ile yukarıdaki işlemi yapar ve sonucu akümülatöre yazar.

    31 //akümülatör = akümülatördekiDeğer – belirtilenKonumdakiDeğer
    3115 : 15 Konumundaki değer ile yukarıdaki işlemi yapar ve sonucu akümülatöre yazar.

    32 //akümülatör = akümülatördekiDeğer / belirtilenKonumdakiDeğer
    3215 : 15 Konumundaki değer ile yukarıdaki işlemi yapar ve sonucu akümülatöre yazar.

    33 //akümülatör = akümülatördekiDeğer * belirtilenKonumdakiDeğer3315 : 15 Konumundaki değer ile yukarıdaki işlemi yapar ve sonucu akümülatöre yazar.

    34 //akümülatör = akümülatördekiDeğer % belirtilenKonumdakiDeğer
    3422 : 22 Konumundaki değer ile yukarıdaki işlemi yapar ve sonucu akümülatöre yazar.

    35 //akumulatör = akümülatör^belirtilenKonumdakiDeğer
    3536 : 36 konumundaki değeri üs, akümülatörü iste taban yaparak üs alır ve sonucu akümülatöre yazar.

    38 //belirtilenKonumundakiDeger--
    3821 : 21 konumundaki değeri 1 azaltır.

    39 //belirtilenKonumundakiDeger++
    3920 : 20 konumundaki değeri 1 arttırır.

    40 //Belirtilen konuma git/dallan
    4012 : 12 konumunu gider.

    41 //Akümülatör negatifse belirtilen konuma dallan
    4130 : Akümülatör negatifse 30 konumuna gider.

    42 //Akümülatör pozitifse belirtilen konuma dallan
    4230 : Akümülatör pozitifse 30 konumuna gider.

    43 //Akümülatör sıfır ise belirtilen konuma dallan
    4330 : Akümülatör sıfır ise 30 konumuna gider.

    99 //Programı bitir
    9900

    Program Kodu
    Programın kaynak kodu için : Simpletron Kaynak Kod

    Simpletron açıklamalı örnek programlar (açmak için tıklayın)
    1- Programın amacı, kullanıcı tarafından girilen sayıların en büyüğünü bulmak.



    < Bu mesaj bu kişi tarafından değiştirildi furkant1 -- 17 Mart 2016; 4:44:03 >







  • Deitel de var bu. Nasıl alıntı değildir ?
  • quote:

    Orijinalden alıntı: asdfg_1453

    Deitel de var bu. Nasıl alıntı değildir ?

    Deitel'de alıştırma olarak var efendim. Programı yazıp örneklerle anlatmıyor. Ayrıca alıntı demek, bir yazıyı bir yerden kopyalayarak yayınlamak veya üzerinde değişiklikler yaparak yayınlamak demektir. Bu yazı ise bana ait.
  • Buna benzer birşeyi qbasic ile yapmıştım ve çok yavaş çalışıyordu. Bunda olaylar nasıl gelişiyor? Yazdığın programlama dili kendi döngüsü üzerinde mi çalışıyor yoksa yorumlayıcı mantığıyla mı çalışıyor?
  • quote:

    Orijinalden alıntı: Tugrul_512bit

    Buna benzer birşeyi qbasic ile yapmıştım ve çok yavaş çalışıyordu. Bunda olaylar nasıl gelişiyor? Yazdığın programlama dili kendi döngüsü üzerinde mi çalışıyor yoksa yorumlayıcı mantığıyla mı çalışıyor?

    Bu C ile yazıldığı için C kadar hızlı çalışıyor. Yani gayet hızlı. Programi çalıştırdığınızda sizde kodları girmenizi istiyor. Bütün kodları girip en sona -9999 yazdıktan sonra yazdığınız kodlar çalışmaya başlıyor.



    < Bu mesaj bu kişi tarafından değiştirildi furkant1 -- 29 Ağustos 2013; 11:01:29 >
    < Bu ileti mobil sürüm kullanılarak atıldı >
  • C ile yazildi diye, C kadar hizli olacak diye bir durum yok. Yanlis anlasilmasin. Compiled mi yok Interpreted mi acaba dil?

    Yacc, flex, bison kavramlari vs. vardir bir dilin olusum surecinde. Lexical analiz ve Semantic analiz surecleri de olmalidir. Parsing islemi de gerekiyor. Tokenizer islemini basit gordum acikcasi. Lexical ve Sematic analiz olayinin olmadigi bir dilin olmasi imkansiz bence..

    Yanlis anlama sakin kotu demiyorum ben bu islemi yapman, bu fikrinin olmasi bence mukemmel iyi ki de olusmus daha da gelisir umarim bunlar gerekli seyler.

    Ama demek istedigim dil davranisi diye bir olay var. Burada turler devreye girerler iste senin buradaki analizin onemli. Dil icin bir kural tanimi koyulmali. Interpreted dil olsa dahi interpreter'ı yine bu analizleri yapmaya programlanmis. Akümülator'den bahsetmissiniz bu cok guzel ancak bellek icin basit islemler var.

    Yuk boyutu yuksek programlar olunca bellek bunu kendisi geri veremiyor. Bunlari dikkate almanizi oneririm.

    basarilar dilerim.



    < Bu mesaj bu kişi tarafından değiştirildi X-1 -- 29 Ağustos 2013; 5:23:51 >




  • Efendim benim bu ornegi yapmak ve yayinlamaktaki amacım bir dil nasıl oluşuyor, bunun mantığını kabaca kavrayabilmek ve kavratabilmektir. Yani bir dilim olsun, insanlar bunu kullansın vs. diye bunlari yapmadım. Yanlış anlaşıldım galiba

    < Bu ileti mobil sürüm kullanılarak atıldı >
  • Olaya yanlış girilmiş ve yanlış anlaşılmış. Bu alıştırma Deitel ın kitabında var. Simpletron bir programlama dili değil sanal bir makina yani bir işlemci. O girilen sayılar ise işlemcinin instruction kodları (opcode). Kullanıcıdan istenen bu makina için bir simulator yazmak yani bu makinanın kodunu kendi bilgisayarımızda çalıştırmak. İleriki bölümlerde bu işlemci için assembler ve basic benzeri bir dili bu makina kodlarına derleyen bir derleyici de yazılmasını istiyor.
  • quote:

    Orijinalden alıntı: elektro_gadget

    Olaya yanlış girilmiş ve yanlış anlaşılmış. Bu alıştırma Deitel ın kitabında var. Simpletron bir programlama dili değil sanal bir makina yani bir işlemci. O girilen sayılar ise işlemcinin instruction kodları (opcode). Kullanıcıdan istenen bu makina için bir simulator yazmak yani bu makinanın kodunu kendi bilgisayarımızda çalıştırmak. İleriki bölümlerde bu işlemci için assembler ve basic benzeri bir dili bu makina kodlarına derleyen bir derleyici de yazılmasını istiyor.

    Yahu benim buna karşı çıktığım yok ki. Ben bir programlama dili nasıl yapılır inceledim ve bu alıştırmayla mantığını kavradım. Bu yüzden başka arkadaşlara da yardımcı olabilir diye düşündüm. Neden polemiğe giriyorsunuz anlamıyorum. Büyütülecek birşey yok ki.
  • quote:

    Orijinalden alıntı: furkant1

    Yahu benim buna karşı çıktığım yok ki. Ben bir programlama dili nasıl yapılır inceledim ve bu alıştırmayla mantığını kavradım. Bu yüzden başka arkadaşlara da yardımcı olabilir diye düşündüm. Neden polemiğe giriyorsunuz anlamıyorum. Büyütülecek birşey yok ki.

    Ben onu sana yazmadım ki. Prog. dili zannedip ona göre yorum yapanlar var, o hatayı düzeltmek için yazdım.
  • Güzel fikir fakat hergün yeni bir dil ortaya çıkıyor ne farkı olacak diğer dillerden ?

    Sanırım ciddi bir uğraşı değil sadece denemek için arkadaş yapmış.
  • Sanırım hata ısrarla programlama dili denmesinde.

    Sonuçta başlangıç seviyesindekiler için farklı bir çalışma olmuş. Eğer amacın eğitici olmaksa kaynak kodunu da paylaşırsan ilgilenenler asıl o zaman daha kolay öğrenebilirler.
  • qamyoncu Q kullanıcısına yanıt
    Kaynak kodu yazıda mevcut.
  • Program güncellenmiştir
  • Her ne kadar soylenmis olsa da, burada yazdiginiz sey bir 'programlama dili' degil, dolayisiyla bilmeyenlerin bir dil nasil yazilir gormesine yarayacak hic bir sey yok.

    Ha yok eger ki insanlar java, c# gibi bytecode'a derlenmis dillerin sanal makinasinin nasil calistigini anlasin diyorsaniz o ayri ama o amacla da yazilmis gibi durmuyor zira VM konseptleri, interpretetion yada jit ile alakali bir sey goremedim.

    Sonuc olarak, yazdiginiz sey bir programlama dili degil, derlenen bir programlama dilinin hedefi olabilecek bir instruction seti.

    Onun disinda, C ile yazildigi icin C kadar hizli olmasi da eglenceliymis.

    Edit: niye hortlatilir ki bu topic...



    < Bu mesaj bu kişi tarafından değiştirildi Fatih513 -- 17 Mart 2016; 14:08:33 >
  • Fatih513 kullanıcısına yanıt
    Hocam ben bunu eğitici amaçla yazmıştım ve yazdığımda registerların nasıl çalıştığını, programımızda tanımadığımız değişkenlerin vs. nerede saklandığı vs. somut olarak görüp anlamıştım. Bunun yazılış amacı "Bir dil olsun da insanlar kullansın" değildir. Program geliştirilebilir.

    "Niye hortlanttın ki bu konuyu" demekle ne amaçladınız bilmiyorum. Forumun amacı insanlara yararlı olmaktır bu örneğin de bana çok yararı dokundu diğer arkadaşlara da çok yarari dokunacağına inanıyorum. Agresif bir yorum ile şekilde konu baltalamakatansa sizin de yararlı bir paylaşım yaparak veya yapıcı bir yorum yaparak insanlara yardımcı olmanızi yeğlerdim.

    < Bu ileti mobil sürüm kullanılarak atıldı >
  • quote:

    Orijinalden alıntı: furkant1

    Hocam ben bunu eğitici amaçla yazmıştım ve yazdığımda registerların nasıl çalıştığını, programımızda tanımadığımız değişkenlerin vs. nerede saklandığı vs. somut olarak görüp anlamıştım. Bunun yazılış amacı "Bir dil olsun da insanlar kullansın" değildir. Program geliştirilebilir.

    "Niye hortlanttın ki bu konuyu" demekle ne amaçladınız bilmiyorum. Forumun amacı insanlara yararlı olmaktır bu örneğin de bana çok yararı dokundu diğer arkadaşlara da çok yarari dokunacağına inanıyorum. Agresif bir yorum ile şekilde konu baltalamakatansa sizin de yararlı bir paylaşım yaparak veya yapıcı bir yorum yaparak insanlara yardımcı olmanızi yeğlerdim.

    Insanin hatali oldugu bilinen 2 yillik bir konunun hortlatilmasindan beklentisi, yazarin en azindan yanlislari duzeltmis olmasi oluyor, sondaki editin sebebi buydu acikcasi.

    Bunun disinda, amacinizin insanlara bir seyler anlatmak olmasi konusunda kimsenin itirazi yok ancak bilgi kirliliginin cok yuksek oldugu bizim gibi alanlarda insanlara bir seyler ogretecegim diyip yanlis seyler yazilmasi son derece rahatsiz edici. Amaci insanlara yardim etmek olan biri olarak eminim ki bahsettigimiz seyi anlarsiniz.

    Ortada bir emek var, yanlis haliyle 2-3 yil tutup israrla 'benim oyle bir iddiam yok', 'sadece egitim amacli' kacamaklardansa biraz daha calisma yapip, post ve konuyu editleyerek cok daha faydali bir hale getirebilirsiniz.




  • Fatih513 kullanıcısına yanıt
    Ya hocam kod orada anlatım orada siz nasıl olur da yanlış bilgi kirliliği ithamında bulunabilirsiniz kod mu çalışmıyor anlatım mı yanlış Forumda paylaşım yapanların paylaşımlarını baltalamak yerine siz doğru ve bilgi kirliliği olmayanını yapın da nasıl oluyormuş görelim faydalanalım boş boş konuşuyoruz sizin yüzünüzden asıl şuan yaptığımız şey bilgi kirliliği neyse daha yazmıyorum bir şey olursa whatsapp grubundan yazarsınız burayı daha kirletmeyelim

    Ya da programı geliştirmek için vs. yapıcı bir yorumunuz olursa seve seve beklerim.

    < Bu ileti mobil sürüm kullanılarak atıldı >




  • Kodlara baktım. Yorumlarım:

     
    int akumulator = 0000, //gecici hafiza
    komutSayici = 00, //bulunulan satir
    komutRegister = 0000, //bulunulan satirdaki komut
    kod = 00, //Komut--sol iki
    konum = 00; //hafiza konumu--sag iki


    int değerler 0000 ile 0 arasında bir fark görmez. Dolayısıyla hep 0 alacaktır.


    Simpletron yazınca Deitel'in örneği çıkt:

    https://github.com/clamiax/misc/blob/master/exercises/deitel/ch7/simpletron.c



    Assembly gibi instruction'ların olduğu bir dil simüle edilmeye çalışılmış. İlginçmiş. İlk defa duydum.




  • 
Sayfa: 12
Sayfaya Git
Git
sonraki
- x
Bildirim
mesajınız kopyalandı (ctrl+v) yapıştırmak istediğiniz yere yapıştırabilirsiniz.