You are currently viewing Kendi Programlama Dilimizi Yapmak

Kendi Programlama Dilimizi Yapmak

Bu yazımda nasıl kendi programlama dilimizi oluşturabileceğimizden ve bu konuda bize yardımcı olabilecek araçlardan bahsetmek istiyorum. Rust, Go, Javascript, Python gibi genel amaçlı programlama dillerinden SQL, Powershell gibi özel ve uygulama spesifik dilleri nasıl geliştirebileciğiniz konusunda fikir sahibi olacaksınız.

Öncelikle programlama dillerini seviyelerine, amaçlarına, yapılarına, çalıştırılma şekillerine göre sınıflandırarak inceleyelim.

Programalama Dillerinin Sınıflandırılması

Seviyelerine Göre:

  • Düşük seviyeli programlama dilleri (low level languages)
  • Orta seviyeli programlama dilleri (mid level languages)
  • Yüksek seviyeli programlama dilleri (high level languages)

Amaçlarına Göre:

  • Genel amaçlı programlama dilleri (general purpose languages)
  • Özel amaçlı programlama dilleri (domain specific languages)

Yapılarına Göre:

  • Prosedürel (procedural) programlama dilleri
  • Fonksiyonel (functional) programlama dilleri
  • Nesne yönelimli (object oriented) programlama dilleri

Çalıştırılma Şekillerine Göre:

  • Derlenen programlama dilleri
  • Yorumlanan programlama dilleri

Kendi Dilimizi Oluşturmak

Kendi dilimizi oluşturmak için öncelikle bu dil ile çözmek istediğimiz problemi belirlememiz gerekiyor. Nasıl bir dil istediğimize karar verdikten sonra dilin yazım kurallarına karar vermemiz gerekiyor. İki çeşit yazım kurallarından bahsedebiliriz. Bunlar:

  • Biçimsel yazım kuralları (syntax rules)
  • Anlamsal yazım kurallarıdır (semantic rules)

Biçimsel yazım kuralları, dilimizdeki sözcük ve sözlüklerin ne biçimde ve sırada bir araya gelebileceğini belirleyen kurallardır.  Bu sözcüklerin oluşturduğu cümlelerin ne anlama geldiği ise anlamsal yazım kurallarını oluşturur.

Örneğin, C dilinde bir fonksiyon şu şekilde tanımlanır:

[geri dönüş tipi] [fonksiyon adı](<parametre listesi>) [fonksiyon gövdesi]

Yukarıdaki yazımda köşeli parantez ([]) içindeki ifadeler yerine yazılması gerek zorunlu kelimeleri, küçüktür (<) ve büyüktür (>) arasındaki ifadeler ise zorunlu olmayan ifadeleri göstermektedir.

Sıradaki hedefimiz ise dilimizde barındırmak istediğimiz özelliklere ve yeteneklere karar vermeliyiz. Bunun için yaygın kullanılan dillerde bulunan sevdiğimiz özellikleri alıp sevmediklerimizi dışarıda bırakarak kendimize has bir sentez yapabiliriz. Bu özelliklere karar verirken sormamız gereken sorular şu şekilde olabilir:

  • Katı ve net bir veri tipi sistemi ya da veri tiplerini çalışma zamanında karar verilen esnek ve dinamik bir tip sistemi mi istiyorum?
  • Dilimde hangi veri tipleri ve veri yapıları olmalı?
  • Nasıl bir paradigma benim dilim için uygun olur?
  • Standart kütüphanesine ne araçlar koymak istiyorum?
  • Performans, dilim için ne kadar kritik?

Bu sorulara verebileceğin her cevabın avantaj ve dezavantaj yaratacağı farklı durumlar olacaktır. Dilimizin kurallarına da karar verdikten sonra bunları nasıl gerçekleştirebiliriz kısmına gelebiliriz. Yalnız önceden söylemeliyim ki; bu bahsettiğimiz kararlar, dili nasıl implemente edeceğimizi etkileyeceğinden bu aşamaya geçmeden önce dilin neye benzeyeceği konusunda net fikirleriniz olması çok önemlidir.

Dilin Yazılma Aşaması

Bir programlama dilinin oluşturulmasında şu aşamalar takip edilir:

  • Kelime analizi (lexical analysis)
  • Sentaks analizi (syntax analysis)
  • Derleme (code generation) / Yorumlama (interpretation)
  • Optimizasyon

Kelime Analizi (Lexical Analysis)

Programalama dillerinin anlamlı en küçük yapı taşlarına atom (atom / lexeme) denmektedir. Başka kaynaklarda Genel amaçlı bir programlama dilinin atomları şunlar olabilir:

  • anahtar kelimeler (keywords)
  • isimler (identifiers)
  • operatörler (operators)
  • ayıraçlar (delimiters)
  • sabitler (constans)

Anahtar Kelimeler

Programlama dillerinde çeşitli amaçlar için rezerve edilmiş kelimelerdir. Örneğin C programalama dilinde; void, int, float, return, forgibi sözcükler anahtar kelime olarak rezerve edilmiştir. Bu kelimeler isim olarak kullanılamazlar

İsimler

Programcı tarafından belirlenen, tanımlanan fonksiyon ve değişkenlere verilen isimlerdir. Genellikle bir harf ile başlarlar; harf, sayı ve alt çizgi (_) içerebilirler, boşluk ( ) karakteri barındırmazlar

Operatörler

Program içerisinde bir işleme neden olacak sembollerdir. Örneğin C dilinde toplama (+), çıkarma (-), mod alma (%) operatörleri bulunmaktadır.

Ayıraçlar

Program içerisineki cümlecikleri ve blokları birbirinden ayırmak için kullanılan özel sembollerdir. Örneğin C dilinde noktalı virgül (;) deyimleri birbirinden ayırmak için kullanılır. C tarzı dillerde blokları belirlemek için süslü parantezler ({}) kullanılırken Python gibi dillerde boşluk(space) veya tab karakterleri blok oluşturmak için kullanılır.

Sabitler

Programlama dilinde bir bir tipinde sabit bir değer belirten ifadelerdir. Örneğin C dilinde “Hello, World” ifadesi string tipinde bir ifade belirtirken 30.2f  ifadesi float tipinde bir ifade belirtir. Çoğu dil örneğin 234e-2 şeklinde bilimsel ifade gösterimlerini de kabul etmektedir.

Kelime analizi aşamasında, girdi olarak verilen kod metni karakter karakter analiz edilerek ifade ettikleri atomlara dönüştürülür. Böylece ilerleyen aşamalarda karakterlerle değil, tanımlamış olduğumuz atom serileriyle çalışırız.

Bu aşama için bir unix aracı olan lex aracı kullanılabilir. Lex aracı hakkında detaylı bilgi için: https://en.wikipedia.org/wiki/Lex_(software) adresini ziyaret edebilirsiniz.

Sentaks Analizi

Bu aşamada atomların anlamlı bir bütün oluşturup oluşturmadığı kontrol edilir. Atomlar bir araya gelerek deyim ve ifadeleri oluştururlar.

Deyimler

Program akışını bir işleme, bir akış değişikliğine veya durum (state) değişikliğine sebep olacak sözcüklerdir. Bir programlama dilinde tipik olarak şu deyimler bulunur.

  • Basit deyimler
    • fonksiyon çağırma
    • atama deyimleri
    • fonksiyon değer döndürme
  • Birleşik deyimler
    • kod blokları
  • Akış kontrol deyimleri
    • şart deyimleri
    • döngü deyimleri

İfadeler

Değer belirten ifadelerdir. Basit ve birleşik olarak iki tipte olduğu söylenebilir. Basit ifadeler doğrudan değeri içerirken karmaşık ifadelerin değerinin hesaplanabilmesi için çeşitli işlemler yapılması gerekebilir.

Soyut Sentaks Ağacı (Abstract Syntax Tree)

Sentaks analizi aşaması sonucu Soyut Sentaks Ağacı (Abstract Syntax Tree – AST) denilen bir veri yapısı elde edilir. Bu ağaçta programda yapılacak her türlü işlem ve bu işlemin gerçekleştirilebilmesi için gereken bilgiler bu ağaca yazılır. Aşağıdaki resimde örnek bir AST görmektesiniz.

Tam versiyon bir senktaks analizinde deryleyici / yorumlayıcı, yazılmış programda bir hata bulması durumunda açıklayıcı ve hatanın giderilmesi konusunda yön gösterici uygun hata mesajları göstermelidir.

Derleme / Yorumlama

Önceki aşamadan elde etmiş olduğumuz AST, bize gerekli programı oluşturabilmemiz için gereken bütün bilgileri sağlamaktadır. Bu ağaç kullanılarak tercihlerimize göre derleme veya yorumlama yapabiliriz.

Derleme

Derleme aşaması, insan tarafından anlamlı ve okunabilir bir kodun makine koduna çevrilmesidir. İşlemciler yalnızca makine kodundan, yani 0 ve 1’lerden anlamaktadır. Gündelik kullandığımız programlar her ne kadar aşırı karmaşık olsa da bu programlar makine dilinde toplama, çıkarma, çarpma, bir veriyi bir yerden bir yere taşıma gibi ilkel operasyonlar dizisidir. Her işlemci üreticisi işlemcilerini belirli bir komut dizisi (instruction set) ve mimariye (archtitecture) göre tasarlamaktadır. Dolayısıyla üretilmesi gereken makine kodları de bu işlemciye özel olacaktır. Günümüzde oldukça popüler mimari ve komut kümeleri şu şekildedir.

Detaylı bilgiler için bu komut kümelerinin ilgili dökünmantasyonlarını okumanız gerekmektedir.

Yorumlama

Bu aşamada, AST gezilerek adım adım okunan program, bir başka program tarafından anlamdırılır ve çalıştırır. Programın etkileri gerçekleştirilir ve çıktılar kullanıcıya gösterilir. Yazılmış program bir bütün olarak alınıp tamamının tek seferde sonuçlandırılacağı gibi, örneğim Python gibi diller Oku-Değerlendir-Yaz-Döngüsü (Read-Evaluate-Print-Loop – REPL) denilen arayüzler de sağlamaktadır. Siz diliniz için böyle bir arayüz geliştirebilirsiniz.

Optimizasyon

Derleyiciler ve yorumlayıcılar daha vermli kod üretebileceğini düşündüğü durumlada yazılmış kodu değiştirmekten çekinmezler. Gereksiz tekrar eden kod parçalarını kaldırma, herhangi bir etkisi bulunmayan veya programın durumunda (state) değişikliğe sebep olmayan kod parçalarını kaldırma, performansı arttıracak şekilde işlemlerin sırasını değiştirme gibi optimizasyonlar yapabilirler.

Bu optimizasyonlar bazen programcının kodlarındaki hatayı bulmasında zorluk çıkarmaktadır. Çünkü yazılan kod derleyici / yorumlayıcı tarafından değişikliğe uğramıştır. Bu zorlukları aşmak adına derleyeciler optimizasyonu kapatıp açabilme seçenekleri sunarlar. Bu modlara hata ayıklama modu (debug mode) ve yayınlama modu (release mode) gibi isimler verilmektedir.

PyCimen

Lisans tezi olarak hayatına başlayan PyCimen projemiz, basit anlaşılır Python sentaksı ile C++ dilinin performansını birleştirmeyi hedefleyen bir yazılım dili. PyCimen dili hakkında detaylı bilgi almak ve denemek için PyCimen web sitesini ziyaret edebilirsiniz.

Bir yanıt yazın