Bir Derleyici Nasıl Yapılır

Başlatan erkan614, 10 Mayıs 2018, 10:16:11

erkan614

İyi günler
Merak ettim Bir derleyici nasıl yapılır?
Mesela C ile çalışan bir derleyici?

Firzen

forumda araştır bende çok sordum. Sonra bir kitap satın almıştım sanırım burada da paylaştım.
Kararsız...

boreas

Tam olarak ihtiyaç nedir ? Derleyici yapımındaki syntax işleme bile başlıbaşına programlama konusu

kimlenbu

Hangi ortam için derleme yapacaksın ? İlk önce bunu belirlemen gerekecek. "Basit" olsun diye 8051'i ele alalım.

Önce C-> Assembly dönüşümünü yaparsın, arkasından da assembly opcode dönüşümünü yaparsın. Bunları yapmak için hedef mimariyi yalayıp yutmuş olman gerekiyor. Bu oldukça yüzeysel bir anlatım oldu. Ara adımları yapmak için dünyanın emeğinin verilmesi gerekiyor.

Ayrıca optimizasyon özelliği, debug özelliği derken ekip çalışması olmadığı sürece işler içinden çıkılmaz hal alır.

sayangku

hocam programın windows ortamında çalışmasını istiyorsan eger anahtar kelimen bu mingw birde aşağıdaki linki oku birde  codeblock ve GNU GCC  bir araştır fikir versin sana.
https://kaanhas.wordpress.com/2014/09/09/windows-icin-mingw-kurulumu/


boreas

Anladığım kadarıyla c derlemek ya da derleyiciyi derlemek istemiyor. Derleyicinin kendini yapmak istiyor.

MC_Skywalker

Temel olarak C derleyicilerin nasıl çalıştığını yazarsak derleyicinin nasıl yapıldığını anlama konusunda ilk adımı atmış oluruz.

C komut dizimini yani *.c ve *.h dosyaları obje dosyasına çevrilir. daha sonraki aşamada tüm dosyalar birbirine bağlanır bu esnada daha önceden hazırla(nana)dığınız *.lib dosylarınız da bu bağlama işlemine dahil edilerek çalışacak kod elde edilir.

öncelikli olarak hangi işlemci mimarisi için derleyici yapılacaksa o mimarinin çok iyi bilmek gerekli.

şu adresten ARM M sersi mimarisi fikir vermesi açınsında inceleyerek başlaya bilirsiniz.  https://developer.arm.com/products/architecture/m-profile/docs/100688/latest/the-armv8-m-programmers-model

brandice5

Bu derleyici denen şey tüm diller için aşağı yukarı aynı iş yaptığı için (lexical analiz, parser, ara kod oluştuma vs..) bunun bile bir kütüphanesini yapmışlar. Adı da LLVM.

https://llvm.org/

Bunu kullanarak kendi derleyicini çok derinlere inmeden yapabilirsin. Çünkü LLVM bir derleyicide olması gereken çoğu şeyi kendisi yapıyor. Nasıl ki yazılım yapılırken her zaman kullanılan işler için kütüphaneler varsa (lcd ye yazı yazmak, seri porttan veri göndermek) derleyici yazmak içinde artık bunu kullanıyorlar.

OptimusPrime

https://donanimveyazilim.wordpress.com || Cihân-ârâ cihân içredir ârâyı bilmezler, O mâhîler ki deryâ içredir deryâyı bilmezler ||

baran123

Şu kitabı duymuştum. (Dragon Book)
Hatta Marmara Üniversitesi'nin kütüphanesinde 2 adet görmüştüm.


foseydon

herkes kitap tavsiyesi vermiş, ben farklı birşey önereyim. compiler yazacağın dilin standardı yalayıp yutman lazım. C için mi yazmak istiyorsun? C standardını açıp güzelce öğrenmen lazım, bana göre birisi C hakkında birşey sorduğunda abi C standardına şöyle oluyor diyebiliyorsan iş tamamdır. ben diyemem misal.

bir diğer hususta şu, amerika'yı yeniden keşfetmeye gerek yok. Amaç derleyicinin nasıl çalışmak olduğunu öğrenmekse, açık kaynak kod bir derleyicisi varsa(misal c için gcc) onun kodunu açıp incelemek daha az zahmetli olur. Zaten kendinde yazmaya niyetliysen bunu yapman yine fayda sağlayacaktır. Belki, kendin yazmaya niyetliysen bile bu aşamadan sonra vazgeçebilirsin bile :)

yas

Bence İlk başlangıç aşamasında @boreas ın dediği gibi syntax algılamaları bile insanı yıldırabilir. Hazır bir IDE kullanılarak derleyici çalışır hale geldikten sonra istenilen yeteneklere sahip bir IDE nin ayrıca geliştirilmesi daha verimli olur diye düşünüyorum.
-Derleyici den kasıt mcu düzeyinde olacaksa hedef olarak seçilen mcu ailesini çok iyi tanımak gerekli
-Yukarıda da söylendiği gibi bilinen kabul görmüş bir programlama dili ile kod yazılacaksa o dilin standartları yalanıp yutulmalı.
-Farklı bir programlama dili yazılacaksa diğer dillerin avantajları ve dezavantajları karşılaştırılarak gidiş yolu belirlenmeli.
Nasıl yapılır sorusuna tam bir yanıt olmasa da yapılması istenen derleyicinin mcu hedefli olduğunu düşünerek;
-Bence direk hex üretmeden asm kodu üretilmeli ve elde edilen asm kod üreticinin asm derleyicisine gönderilmeli. Örneğin picbasic, protonun ve daha bir çok derleyicinin mpasm yi kullandığı gibi.
-Mcu hedefli bir derleyici olduğunu düşünerek kod içerisinde kullanılan "asm" kodu sorunsuz işlemeli.
-Kütüphane eklemek çok pratik olamalı. Oturmuş yapıdaki sorunsuz kütüphaneler ana kütüphane database inde olmalı ve kullanıcı burayı değiştirememeli. Ancak user kütüphaneye ekleme çıkartma yapılabilmeli ve ayrı bir database de tutulmalı.
-Mcu registerlarının adreslerinin tanımlandığı kütüphane dosyaları oluşturulmalı. Örneğin Bit name file dosyaları gibi.
-Hafıza optimizasyonun sağlanması için birbirinin aynı olup tekrar eden kodlar belirlenip ayrı bir alt rutinde çağıracak metotlar derleyicinin yetenekleri arasında olmalı, fakat bunu yaparken başka şeyleri bozmadan becermeli.
-İnterruptların yönetilmesi bence en önemli konulardan. Donanımı çok iyi kavramış olmak gerekli ve ilgili seri mcu ların bütün silicon hataları eratta yayınları takip edilmeli ve tavsiye önlemler kullanılmalı.
-Eğer hazır asm derleyici kullanılırsa yazılan kodda hata bulunması err dosyaları sayesinde daha pratik olacaktır. Yoksa kendi derleyicinize ayrıca error tesbiti yapacak yordamlar hazırlamak gerekecek.
-Değişken tipleride önemli uğraşması meşakatli fakat bence float tip mutlaka olmalı.
-İleri aşamalar için IDE ye entegre Bootloader ve DEBUG özelliği de büyük önem arz etmekte.


Firzen

Ben hala kod nasıl C dilinden HEX formata dönüştürülür oradayım :) Yoksa CLANG veya LLVM ile diğer kısımlar rahat bir şekilde çözülüyor. Hatta Tutorial'da Kaleidoskop diye bir örnek program üzerinden gidiyorlar.
Kararsız...