Yazan: Şadi Evren ŞEKER

Basitçe bir dilde yazılmış olan kodu (kaynak kodu yada source code) istenilen başka bir kod haline dönüştüren programdır. Genelde üretilen bu kod ortama göre çalıştırılabilir kod (executable code) olarak üretilmektedir. Ancak bir derleyicinin daha doğru tanımı bir dildeki kodu başka dile çeviren program olarak yapılabilir. Örneğin C dilinde yazılan bir programı PASCAL diline çeviren programlara derleyici adı verilebilir.
Derleyicinin diğer bir tanımı ise daha üst seviye bir dilden daha alt seviyeli bir dile tercüme olarak kabul edilebilir. Buna göre örneğin C dilinden Assembly veya makine dili gibi daha alt dillere tercüme ile derleyici kavramı daha da sınırlandırılmış olarak kabul edilebilir.
Derleyiciler günümüzde daha çok bir dilde yazılmış koddan, işletim sistemi ve donanım bağımlı kodların üretilmesinde kulllanılmaktadırlar.
Bu üretim sırasında ya doğrudan işletim sisteminin anlayacağı ve çalıştıracağı kodları üretirler ya da işletim sisteminde bulunan veya yine dil bağımlı olarak çalışan bağlayıcı (linker) programların anlayacağı ara kodları üretirler.

Derleyiciler bu kod üretmesi sırasında, üretilen kodun en verimli şekilde üretilmesi için kod iyileştirmesi (optimisation) da yapmaktadırlar. Yani hedef dildeki çalışma süresi ve hafıza ihtiyacı en az olan kodu üretmek bir derleyicinin daha başarılı olma kriterlerinden birisidir.

Aynı zamanda kaynak kodda (source code) bulunan hataların yakalanması bu hataların programcıya bildirilmesi de derleyicilerin diğer görevlerinden birisidir.

Derleyiciler (compiler) ile Yorumlayıcılar (Interpreter) arasındaki farklar:

Basitçe, bir kaynak kodu hedef koda çevirdikten sonra çalıştıran ve dolayısıyla koddaki hataları yakalama işlemini ve kodun iyileştirilmesini daha kod çalıştırmadan yapan çeviricilere derleyici, kodu satır satır veya bloklar halinde çalıştırıp sırası gelmeyen satırları hiç çalıştırmayan bu satırlardaki hataları hiçbir zaman göremeyen ve kodun bütününe ait iyileştirmeleri yapamayan çeviricilere de yorumlayıcı (interpreter) adı verilmektedir.

Genel kanının tersine bir dilin derleyici veya yorumlayıcı özelliği yoktur. Yani C dili için sadece derleyicisi bulunan bir dildir demek yanlış olur. Bu durum bütün diller için geçerlidir. Her dil için bir derleyici veya yorumlayıcı tasarlanabilir. Ama daha genel bir bakışla, her dilin aslında yorumlayıcı (interpreter) yapısında bir çalışması olduğunu söylemek yanlış olmaz. Sonuçta bilgisayarın işlemcisinde anlık olarak tek bir işlem yapılabilmektedir ve çalışması istenen kod, işlemciye sırayla verilecek ve satır satır çalıştırılacaktır.

Genelde bir ortam yazılan dilin çalıştırılmasına kadar geçen sürede ya bir derleyici yada bir yorumlayıcı kullanılmaktadır. Gelişmekte olan teknolojiyle iki programı birden kullanan diller de türemiştir. Örneğin JAVA dilinde kod önce derlenerek byte code adı verilen ve sadece java sanal makinelarında (java virtual machine) çalıştırlabilen bir kod üretilmektedir. Bu üretilen ara kod daha sonra java sanal makinasında bir yorumlayıcı yapısına uygun olarak çalıştırılmaktadır.

Tek geçişli (one pass) ve çok geçişli (multi pass) derleyiciler:

Bu başlıkta geçiş ile kastedilen kavram, bir derleyicinin kaynak kodu baştan sona kadar okumasıdır. Yani tek geçişli derleyicilerde kaynak kod baştan başlanıp sona kadar bir kere okunmakta buna mukabil çok geçişli derleyicilerde (örneğin iki geçişli bir derleycide) birden çok kereler (örneğin iki kere) kaynak kod baştan sona kadar taranmaktadır.
Tek geçişli derleyiciler tahmin edileceği üzere çok geçişlilere göre çok daha hızlı çalışmaktadırlar. Ancak bazı durumlarda dilin tasarımı tek geçişli derleyicilere izin vermemektedir. Örneğin kodun sonlarına doğru kodun başında yapılan bir tanımı etkilyecek bir işlem yapıldığını düşünün bu durumda tek geçişle bu olayın algılanması ve kodun doğru şekilde derlenmesinin yapılması mümkün olamaz.
Tek geçişli derleyicilerin diğer bir eksik yanı ise kod iyileştirmesi sırasında kodun üzerinden sadece bir kere geçtiği için kodun önceki satırlarında bulunan ve daha sonradan anlaşılan iyileştirmelerin yapılamamasıdır.

Sık kullanılan bazı terimler:
kaynaktan kaynağa derleyici (source to source compiler): Bir dilden başka bir dile kod çeviren derleyicilerdir. Örneğin C++ dilinden JAVA diline çevirmek gibi.
çapraz derleyici (crosscompiler):Çalıştığı ortam dışında farklı bir ortam için kod üreten derleyicidir. Örneğin Linux işletim sisteminde, Windows işletim sistemi için kod üretmek gibi.
Tam zamanında derleyici (just in time compiler): Genelde ortam bağımsız ve ara seviye kodların kullanıldığı JAVA veya .NET gibi dil aileleri için kodun son çalıştırıldığı ortamda kodun iyileştirilmesini hedefleyen derleyici grubudur. Yani örneğin java kodu byte koda çevrildikten sonra sanal java makinesi bu kodu zamanında derleyici ile çalıştırarak zamanlamada iyileşmeyi hedeflemektedir.

Yorumlar

  1. cem-1905

    hocam öncelikle merhaba ,java ile ilgili bir sorum olacak.C++ ile basit bir java editörü yapıyorum.Yazılanları javac ile derleyip java …test ile de run etcek bir basit program.Herşeyi yaptım ama javac ile compile ettiğim çıktıyı dos ekranından bilgisayar kopyalıp programın alt kısmında göstermesini istiyorum.Dos ekranına WinExecute() ile erişiyorum.Bu dediğimi yapmak için ekran çıktısını bi klasöre kopyalıp sonra o klasörden okuma yaparak programn alt kısmındaki text kısmına bastırcam.Bunun için şunu kullanıyorum…

    javac deneme.java >cem.txt

    Yukarıdakini yapıyorum,ama txt dosyasına birşey bastırmıyor.Diğer msdos komutlarının çıktısını alıyorum ama yukarıdakini yaparken alamıyorum.Yardım ederseniz çok sevinirim.Kolay gelsin…

  2. Şadi Evren ŞEKER Article Author

    Anladım. problemin derleyici ile ilgisi yok ama yaptığınız iş gerçekten emek gerektiren ve elbette derleyici ile ilgili. Öncelikle emeğinizden dolayı tebrik edelim.

    Konu basitçe, yönlendirme (redirecting) işleminin hata mesajlarını yönlendirme özelliği olmamasıdır.

    Örneğin “javac > sadi.txt” şeklindeki bir komut, bu komutun sonucunu sadi.txt dosyasına yazar. Bu yazma işleminin gerçekleşmesi için komutun hatasız çalışması gerekir.

    Komut hata verirse bu durumda sonuç stderr çıktısına yazılır (C++ kodladığınız için stdout ile stderr farkını bileceğinizi düşünüyorum, ikisi de ekran (monitor) olarak ayarlıdır ama ikisi farklı çıktılardır)

    Bu durumda sizin vereceğiniz komut şu şekilde olabilir:

    javac > sadi.txt 2 > hata.txt

    bu komuttan sonra, çalışmanın sonucu sadi.txt dosyasına, hata olması halindeki çıktı ise hata.txt dosyasına yazılır.

    şayet iki sonucu da tek dosyada görmek istiyorsanız, ikinci yönlendirmeyi (redirection) ekleme şeklinde (append mode) kullanın:

    javac > sadi.txt 2 >> sadi.txt

    şeklinde.

    umarım yardımcı olur.

  3. R Busra Mutlu

    merhaba hocam

    ben KTO Karatay üniversitesinde bilgisayar mühendisliği 2. sınıf öğrencisiyim. Programming Language dersi adı altında Fortran Compiler projemiz var Java da yapmaya başladık yanlız fikir almak istemiştim projede olması gerekenler aşağıda:

    •A Loop statement
    •Conditional Statement(if)
    •Assignment Statements
    •Variable Declerations
    •Nested Statements

  4. Şadi Evren ŞEKER Article Author

    Derleyici tasarımı kapsamında, genelde sık verilen ödev ve proje tipleri bu şekilde bir dilin yazılması.Genelde C dilinde yazılması daha yaygın ve C dili için hazırlanmış lexical analysis ve syntactic analysis seviyeleri için iki araç bulunuyor:

    http://www.bilgisayarkavramlari.com/2008/12/12/lex/
    http://www.bilgisayarkavramlari.com/2008/12/12/yacc/

    Bu araçları kullanarak dilinizdeki lexeme tanımlarını yapıp söz dizilim kurallarınızı belirlemeniz mümkün olabiliyor. Ardından da size C dilinde kaynak kod üretiyor ve derlediğinizde bir diliniz oluyor.

    Şimdi sizin durumunuzda aynı işlemi JAVA diliyle yazmanız istenmiş.

    JAVA dili için yazılmış çok sayıdaki benzer aracın yanında benim tavsiyem javacc kullanmanız olur.

    https://javacc.java.net/

    Yukarıdaki adres javacc’nin ana sayfası sayılabilir. Ayrıca istanbulda da bir iki üniversitede sablecc üzerinden projeler veriliyordu (sanırım hala devam ediyor). GNU tarafından desteklenen bu proje’nin ise farklı avantajları bulunuyor. (yani javacc’nin yacc benzeri olmak gibi bir şartlanmışlığı var ve bu bir yandan iyi bir yandan ise kötü, sablecc ise mesela daha fazla nesne yönelimli kodlamaya imkan sağlıyor). Aradaki seçim size kalmış.

    http://sablecc.org/

    Diğer bir sık kullanılan alternatif ise PCCTS ve ANTLR ikilisini kullanmak. Ne yazık ki bu araçları birkaç yerde görmeme rağmen deneme imkanım olmadı, ama sık kullanıldıklarını biliyorum.

    İlk başta biraz zor veya dolambaçlı gelebilir. Yani öğrenci psikolojisi gereği hemen bir dosyayı açıp içindeki döngü veya değişken tanımlama komutlarını bulmaya çalışmak ve ardından da kod üretmek çok daha hızlı gibi görülebilir ancak emin olun bu şekilde sistemli çalışmazsanız çok sıkıntı yaşarsınız, derste ne kadar detaylı gösterildi bilmiyorum ama teorik bilgiye de ihtiyacınız olacak (örneğin sembol tablolarını (symbol tables) bu projenizde kullanmanız gerekiyor).

    Başarılar

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir