Derleyici Tasarımı -1

Derleyici Nedir?

Bir derleyici, kaynak dildeki programları hedef dilde buna eşdeğer bir programa çevirir.

 

Bir program çalıştırılabilir olmadan önce, bir çok çevirim işlemlerine tabi tutularak hedef çalıştırılabilir kodlar oluşturulur. Bu çevrim işlemini yapan programın özel adına derleyici (compiler) denir. Derleyici kendisinin anlayacağı bir dilde kaynak kodlarını alır ve çıkışta çalıştırılabilir kodlar üretir. Bu çalıştırılabilir kodlar Windows’da exe, dll, Linux’de elf, so gibi dosyalar olabileceği gibi, derleyiciler .net, java gibi sanal makinalar için de çalıştırılabilir kodlar üretebilir.

 

Derleyicilerin Temel Kısımları

Bir derleyici 2 temel kısımdan oluşur

  1. Analiz
  2. Sentez

Analiz-Yorumlama aşamasında, verilen kaynak programdan orta düzey bir gösterim oluşturulur. Sözcüksel Analiz, Sözdizimsel Analiz ve Anlamsal Analiz bu aşamada yapılır.

Sentez-Kod Üretimi aşamasında, bu orta düzey gösterime eşdeğer hedef program oluşturulur. Orta Düzey Kod Üretimi, Kod Üretimi ve Kod Optimizasyonu bu aşamada yapılır.

Ayrıca bu kısımlar “Front-End” ve “Back-End” olarak da isimlendirilir. Tablo olarak göstermek gerekirse aşağıdaki gibidir.

 

Lexical Analiz

Program metninin okunduğu ve analiz edildiği ilk kısımdır. Kaynak kod derleyiciye geldiği zaman ilk olarak, kaynak kodun harfleri teker teker işlenir ve tanımlanarak token denilen nesnelere dönüştürülür. ( Token, değişken adı, anahtar kelime yada sayı gibi programlama dilindeki bir sembolü gösterir.) Lexical Analiz kısmını gerçekleştiren kısma ise Lexer denilir.Lexer kaynak kodun ifade ettigi anlam ile ugraşmaz. Token listesini çıkartır ve Parser kısmına yönlendirir. Parser oluşan bu kısmı alır ve Parse ağacını oluşturur. Parse agacı oluşurken gramer kuralına göre oluşturur. Gramer kuralına uymayan bir yapı ile karşılaşırsa hata verir. Aşağıda bir Parse ağacı örneği verilmiştir.

Anlamsal Analiz(Semantik analiz)

Parse ağacı oluştuktan sonra bu ağaç, Semantik Analiz’e (Semantic Analysis) tabi tutulur. Bu kısımda artık bizim tokenlarımız anlam kazanmaya başlar. Örneğin İnteger olan değişkenimiz integer olarak anlam kazanır.

 

Proje anlatımına geçilmesi

Buraya kadar derleyici tasarımı hakkında kısa bilgilendirmeler yaptım. Bundan sonra hesap makinesi yazmak isteğimizde bunu tokenlarına nasıl ayıracağız? Lexical Analizini ve Anlamsal analizini nasıl yapacağız? Bu sorular üzerinde duracağız.

Hesap makinesi programında Java Programlama dili kullanıldı. Lexical Analiz kısmında da JAVACC kullanıldı. Hesap makinesi class yapısına ve işleyişine geçmeden JAVACC hakkında kısa bir bilgilendirme yapmakta fayda vardır.

JAVACC

JavaCC(Java Compiler Compiler) parser ve lexer analizer ilemlerini yapar.JavaCC kendine özgü bir syntax yapısı vardır. Parser başlama ve sonu kısımlarını içerir. Burada programımızın main kısımlarını içerir. Daha sonra token kısımı ve parser ağacının oluşturulması kısımları vardır. Token kısmında bizim yapımızda bulunan her bir ifade burada token olarak tanımlanır. Örneğin Sin, Cos, + gibi. Parser ağacı oluşturma işleminde ise bizim gramer yapımıza özgü bir parse ağacı çıkartılır.

 

Bu işlemleri yaptığımız zaman .jj uzantılı bir dosya elimizde olur. Bu dosyayı derlendiğinde bize .java uzantılı bir takım classlar verir. Biz bu dosyaları derledigimizde programımızın parse ve Lexical kısmı hallolmuş olur.

Proje grameri ve Class yapıları

Hesap makinesi programımızda gramer yapımıza göre işlemlerimizi yapacağız. Grammer yapımız aşağıdaki gibidir.

SE $T′ →* P T
ET ET′ → / P T
E′ → + T ET′ →
E′ →− T EP->FP’
E′ →P’->^ F P’
TPTP’->
F → idF->sin 30
F → numF → €
F->( E )  

 

Bu gramer yapımızda sadece Sin fonksiyonu gösterilmiştir. Çünkü diğer cos, ln,cosh gibi ifadelerimizde sin ile aynı mantıkta çalışmaktadır.

Bizim programımızda EvalExp.jj isimli dosyamız mevcuttur. Bu dosyanın class yapısı aşağıdaki gibidir.

Burada bizim main fonksiyonumuz EvalExp içerisinde bulunmaktadır. EvalExp derlenmesi ile programımız başlar. Daha sonra visitor ve AST denilen interpreter kısımlarımız gelmektedir. Bunların class diyagramı aşağıdaki gibidir.

 

Yanda EvalVisitor sınıfı ve içerisinde yer alan methodlar bulunmaktadır. Bu methodlar içerinde bizim Accept metodununun çağırılması sonucun hesaplanması yapılmıştır. Sin methodu içerisinde bir sonraki gelen değerin alınması ve sin değerinin hesaplanması işlemi yapılmıştır.

Yukarıda yapmış olduğum projenin UML class diyagramı yer almaktadır.Şimdi bu projenin biraz daha iç mimarisine gireyim ve kodların önemli kısımlarını vererek anlatayım.

 

Mehmet Salih Deveci

I am Founder of IT Tutorial and Certified Expert about Oracle & SQL Server database, Goldengate, Exadata Machine, Oracle Database Appliance administrator with 10+years experience.I have OCA, OCP, OCE RAC Expert Certificates I have worked 100+ Banking, Insurance, Finance, Telco and etc. clients as a Consultant, Insource or Outsource.I have done 200+ Operations in this clients such as Exadata Installation & PoC & Migration & Upgrade, Oracle & SQL Server Database Upgrade, Oracle RAC Installation, SQL Server AlwaysOn Installation, Database Migration, Disaster Recovery, Backup Restore, Performance Tuning, Periodic Healthchecks.I have done 2000+ Table replication with Goldengate or SQL Server Replication tool for DWH Databases in many clients.If you need Oracle DBA, SQL Server DBA, APPS DBA,  Exadata, Goldengate, EBS Consultancy and Training you can send my email adress mehmetsalih.deveci@outlook.com.-                                                                                                                                                                                                                                                 -Oracle DBA, SQL Server DBA, APPS DBA,  Exadata, Goldengate, EBS ve linux Danışmanlık ve Eğitim için  mehmetsalih.deveci@outlook.com a mail atabilirsiniz.

Leave a Reply

Your email address will not be published. Required fields are marked *