Derleyici Nasıl Yazılır?

Başlatan Firzen, 23 Eylül 2015, 00:22:52

Firzen

Merhabalar;

Beya uzun zamandır kafama takılan ve gerçekten merak ettiğim bir soruyu size de sormak istedim.

Soru : Bilgisayarlarımızda kullandığımız PIC,STM32,TI hatta FPGA gibi çipleri kodlamak için VIVADO, ISE DESIGN,MikroC,XC8, CCS C gibi bir sürü derleyici kullanıyoruz. Fakat bu derleyiciler nerede yazılıyor biz hiç derleyici yazamaz mıyız? Örneğin ben mikroC gibi bir derleyiciyi Linux işletim sistemi için yazmak istiyorum neler kullanmam gerek ? Yani Linux işletim sisteminde bir derleyici oluşturacak kodumu doğru compile ettikten sonra da HEX kodu verecek?
Kararsız...

Gökhan BEKEN

#1
Önce bir dil belirleyeceksiniz, ya daha önceden standartları olan bir dil, (c,c++,basic,pascal gibi) olacak ya da yeni bir dil oluşturacaksınız. Siz zaten c dilini seçmişsiniz.
C dilinde yazılmış kodları parse edeceksiniz.
mesela
a=5;
while ( --a ){
}

yazıldığında a değişkenin 5 kere eksiltilmesi gerektiğini anlayıp, buna göre assemly kodu üreteceksiniz.

Assembly kodunu ne kadar kısa üretirseniz o kadar iyi.
Ben Türkçe pic programlama dili geliştirmeye çalışmıştım bir aralar, basit komutlarım vardı.
döngü(5){
 port_a(5,1);
}

gibi komutlarım vardı.

IDE ve compiler aynı programdı, aslında ayrı olması lazım.
Neyse sonra aynı işlemleri PHP ile web üzerinden de yaptım, sonra askerlik felan derken, ekmek derdine düştük, bıraktım.

mesaj birleştirme:: 23 Eylül 2015, 00:49:53

Bu arada c# ile yapmıştım projeyi. Şimdi yapacak olsam, c# ile arayüzünü yazarım, c ile derleyiciyi yazarım.
Yapamadığım şey ise, arayüzün adam gibi özelliği yoktu, c#'daki hazır gelen komponentler bu iş için yeterli değil. Mesela satır numaralarını gösterememiştim.
Otomatik tamamlama yapamamıştım. Renklendirme olayı mümkündü ama hiç girmemiştim o konuya.
Özel mesaj okumuyorum, lütfen göndermeyin.

Karamel

Hocam ben forumda boyle bir konu okumustum ama telefondan baglandigimdan. Arayip bulamadim. Sanirim elektroemre hocamiz boyle bir calisma yapmis daha onceden. Birde legend bir isim var ki gerbay hocamiz ::) keske kendiside suan burada olsa.....  :-\

Firzen

Alıntı yapılan: Gökhan BEKEN - 23 Eylül 2015, 00:47:04
Önce bir dil belirleyeceksiniz, ya daha önceden standartları olan bir dil, (c,c++,basic,pascal gibi) olacak ya da yeni bir dil oluşturacaksınız. Siz zaten c dilini seçmişsiniz.
C dilinde yazılmış kodları parse edeceksiniz.
mesela
a=5;
while ( --a ){
}

yazıldığında a değişkenin 5 kere eksiltilmesi gerektiğini anlayıp, buna göre assemly kodu üreteceksiniz.

Assembly kodunu ne kadar kısa üretirseniz o kadar iyi.
Ben Türkçe pic programlama dili geliştirmeye çalışmıştım bir aralar, basit komutlarım vardı.
döngü(5){
 port_a(5,1);
}

gibi komutlarım vardı.

IDE ve compiler aynı programdı, aslında ayrı olması lazım.
Neyse sonra aynı işlemleri PHP ile web üzerinden de yaptım, sonra askerlik felan derken, ekmek derdine düştük, bıraktım.

mesaj birleştirme:: 24 Eylül 2015, 00:49:53

Bu arada c# ile yapmıştım projeyi. Şimdi yapacak olsam, c# ile arayüzünü yazarım, c ile derleyiciyi yazarım.
Yapamadığım şey ise, arayüzün adam gibi özelliği yoktu, c#'daki hazır gelen komponentler bu iş için yeterli değil. Mesela satır numaralarını gösterememiştim.
Otomatik tamamlama yapamamıştım. Renklendirme olayı mümkündü ama hiç girmemiştim o konuya.

Hocam görsellik için ayrı bir program dediniz anladım da şu C dili ile nasıl döngü falan yaptınız portlar için ve nasıl ASM koduna dönüştürdünüz?
Kararsız...

Gökhan BEKEN

Benim yaptığım çok basit bir şeydi. Sadece 16f84 için kod üretiyordu ve sadece belli başlı komutları çalıştırıyordu.
sadece 8bitlik değişken tanımlama komutu
if görevi gören bir komut
döngü için bir komut
tris'leri ayarlayabileceğiniz bir komut
portlara çıkış verebileceğiniz bir komut
ve son olarak delay görevi görecek bir komut vardı
başka da hiç bir özelliği yoktu.
c#'ın indexof komutu ile bir çok işi halletmiştim, yani kullanıcının yazdığı komutları anlamak için string komutları ile parantezleri felan anlamanız ve içindeki değerleri öğrenmeniz gerekiyor. Çok zor değil.
Zor olan işlemci ailesi geniş, bütün asm komutlarını tanıyan, optimize kod üreten ve hatasız kod üreten bir derleyici yapmak.
Özel mesaj okumuyorum, lütfen göndermeyin.

Burak B

"... a healthy dose of paranoia leads to better systems." Jack Ganssle

t600

#6
Bende böyle birşey düşünmüştüm .
Bu işi için en önemli şey ilgili mikrodenetliyicinin iç mimarisini çok iyi bilmek  gerekir , Bunun için 8051 i ele alabiliriz , haluk gümüşkaya bu çipin mimarisini çok iyi anlatmış . Bütün regesterları ve asm komutlarını inceledikten sonra bu çipe hakim olunabiliyor . Dil olarak basic in türkçesi seçilmeli . Yani Basic Türkçe .
İf ten else  , goto , loop gibi şeyleri türkçe yapmalıyız ,  eğer , değilse , döngü gibi , saund yerine ses  vbb.
Bu derleyiciyi wisual basic te yazabiliriz .
Bunun yapılabileceğini hayal edebiliyorum .Bence bu işe başlanırsa çok basit olduğu görülür.

Firzen

Alıntı yapılan: t600 - 23 Eylül 2015, 08:39:02
Bende böyle birşey düşünmüştüm .
Bu işi için en önemli şey ilgili mikrodenetliyicinin iç mimarisini çok iyi bilmek  gerekir , Bunun için 8051 i ele alabiliriz , haluk gümüşkaya bu çipin mimarisini çok iyi anlatmış . Bütün regesterları ve asm komutlarını inceledikten sonra bu çipe hakim olunabiliyor . Dil olarak basic in türkçesi seçilmeli . Yani Basic Türkçe .
İf ten else  , goto , loop gibi şeyleri türkçe yapmalıyız ,  eğer , değilse , döngü gibi , saund yerine ses  vbb.
Bu derleyiciyi wisual basic te yazabiliriz .
Bunun yapılabileceğini hayal edebiliyorum .Bence bu işe başlanırsa çok basit olduğu görülür.
Hocam bir basit çalışanı yapılsa hem türkçe hem ingilizcesi yapılır.

@Gökhan BEKEN hocam MAC veya Linux bir bilgisayarda mutlaka deneme yapıp sizlerle irtibat halinde olmak isterim çok merak ettim valla şimdi.

Çünkü c kodunu hem ASM ye ardından da HEX koduna dönüştürecek sistem beya ilginç geldi.

Neyse öncelik olarak şu elimdeki denge robotu , VHDL ve LabVIEW işini bitireyim. :) Ardından bir VirtualBox ile işletim sistemi yükleyip denemeye başlayayım :)
Kararsız...

ByTEK

Pascal,Basic,C,C#,Delphi...vs Bütün yüksek seviyeli dillerde ki alt seviye diller dahil derleyici yazılabilir. Derleyicide önemli olan en sade ve sorunsuz şekilde çıktıyı ASM ye çevirmektir. HEX kısmı ASM ye dönüşüm yapılınca ASM derleyicisi ile çözülebilir.

Bir dönem delphi ile kasarak birşeyler yapmıştım. Fakat ASM yi yiyip bitirmek gerekli diye düşünüyorum. yoksa stabil derleyici yazılamaz. Bence C diline çevirip C ile derlemek daha mantıklı. ama bu sefer derleyici değil araya çevirici yazmış olunur.

işiniz sürekli string parse ile olduğundan ötürü bol bol amacınıza göre string parse amaçlı fonksiyonlar yada prosedurler yazmanız gerek.

engerex

Bu işin bir kaç yolu var.
Eğer MikroElektronika gibi herşeyi kendin yapacaksan C/C++/Pascal/Basic/... gibi dillerden kendi geliştirdiğin ortak bir dile çeviri yaparsın. Bu dili kullanıcının bilmesine ve görmesine gerek yok. Ara dilden sonra işlemciye uygun ASM kodlarını üretirsin. ASM'den sonra direk makina dili. Bu yöntemin avantajı istersen ileride farklı dillerede destek verebilirsin. Kullanıcı fortran/ada/java/C# gibi dillerde bile yazmış olsa sen bunu kendi aradiline çevirdiğin müddetçe problem yok. Ara dili nasıl olsa ASM'ye çevirebiliyordun. Tabi gömülü sisteme uygun programlama olacak.

İşin kolay:
Yada not defterinde de yazdığın bir uygulamayı hazır compiler yardımı ile derleyebiliyorsun. GNU GCC ne için var?

Firzen

Alıntı yapılan: engerex - 23 Eylül 2015, 13:28:13
Bu işin bir kaç yolu var.
Eğer MikroElektronika gibi herşeyi kendin yapacaksan C/C++/Pascal/Basic/... gibi dillerden kendi geliştirdiğin ortak bir dile çeviri yaparsın. Bu dili kullanıcının bilmesine ve görmesine gerek yok. Ara dilden sonra işlemciye uygun ASM kodlarını üretirsin. ASM'den sonra direk makina dili. Bu yöntemin avantajı istersen ileride farklı dillerede destek verebilirsin. Kullanıcı fortran/ada/java/C# gibi dillerde bile yazmış olsa sen bunu kendi aradiline çevirdiğin müddetçe problem yok. Ara dili nasıl olsa ASM'ye çevirebiliyordun. Tabi gömülü sisteme uygun programlama olacak.

İşin kolay:
Yada not defterinde de yazdığın bir uygulamayı hazır compiler yardımı ile derleyebiliyorsun. GNU GCC ne için var?

Peki GNU/GCC çalışma mantığı nedir hocam?
Mesela Bu durum MAC bilgisayarlarda nasıl ayarlanabilir (MAC içinde GNU GCC var biliyorum) XCode'un kendi özelliği var mı? Yazılması gerekli mi?
Kararsız...

Icarus

Derleyici yazmaktaki problem Asm'e çevirmek değil. Problem Ör: C'deki kodu anlamlandırabilen bir program yazmak. Bunun için pek çok teknik var. Konu hakkında artık bible haline gelmiş kitaplar var.
Hepsini web'de bulabilirsiniz.
Tabii Google'da bulduğunuz bilgiler 1970-80 civarını temsil edecektir ama olsun size bir başlangıç yaptırır. Geçtiğimiz 30 yılıda eğer birgün bu işi meslek olarak yapmaya karar verirseniz öğrenirsiniz.

Firzen

Alıntı yapılan: Icarus - 23 Eylül 2015, 22:03:19
Derleyici yazmaktaki problem Asm'e çevirmek değil. Problem Ör: C'deki kodu anlamlandırabilen bir program yazmak. Bunun için pek çok teknik var. Konu hakkında artık bible haline gelmiş kitaplar var.
Hepsini web'de bulabilirsiniz.
Tabii Google'da bulduğunuz bilgiler 1970-80 civarını temsil edecektir ama olsun size bir başlangıç yaptırır. Geçtiğimiz 30 yılıda eğer birgün bu işi meslek olarak yapmaya karar verirseniz öğrenirsiniz.

Hocam örnek bir kitap önerebilir misiniz acaba?
Kararsız...

mufitsozen

#13
Alıntı yapılan: Firzen - 23 Eylül 2015, 23:10:27
Hocam örnek bir kitap önerebilir misiniz acaba?

Sayin @Icarus'dan ve sizden ozur dileyerek araya giriyorum, benimde bir kac onerim olacak. umarim isinize yarar.

Aho'nun priciples of compiler design kitabi bu isin incilidir (tabiri caizse) Dragon Book diyede bilinir. Hem icerik hemde fiziksel olarak biraz "kalindir!"
http://www.amazon.com/Compilers-Principles-Techniques-Tools-2nd/dp/0321486811

Birde "Engineering a Compiler" kitabi var biraz daha guncel teknikler iceren http://www.amazon.com/gp/product/012088478X/ref=pd_lpo_sbs_dp_ss_1?pf_rd_p=1944687762&pf_rd_s=lpo-top-stripe-1&pf_rd_t=201&pf_rd_i=0321486811&pf_rd_m=ATVPDKIKX0DER&pf_rd_r=17B1KCVKX3Q66T4QQ55K

Benim size esas onerecegim kitap ise Vladimir O. Safonov'un kitabidir. Keske 30 yas genc olsaydim demistim okudugumda :-) http://www.amazon.com/Trustworthy-Compilers-Vladimir-O-Safonov/dp/0470500956

bunlarin disinda parsing, optimization ve code generation safhalarindan bahseden daha bir cok kitap bulabilirsiniz.

Referans verdigim kitaplari ebook(pdf yada epub) olarak webde bulabilirsiniz.
Aptalca bir soru yoktur ve hiç kimse soru sormayı bırakana kadar aptal olmaz.

Firzen

Alıntı yapılan: mufitsozen - 24 Eylül 2015, 01:13:02
Sayin @Icarus'dan ve sizden ozur dileyerek araya giriyorum, benimde bir kac onerim olacak. umarim isinize yarar.

Aho'nun priciples of compiler design kitabi bu isin incilidir (tabiri caizse) Dragon Book diyede bilinir. Hem icerik hemde fiziksel olarak biraz "kalindir!"
http://www.amazon.com/Compilers-Principles-Techniques-Tools-2nd/dp/0321486811

Birde "Engineering a Compiler" kitabi var biraz daha guncel teknikler iceren http://www.amazon.com/gp/product/012088478X/ref=pd_lpo_sbs_dp_ss_1?pf_rd_p=1944687762&pf_rd_s=lpo-top-stripe-1&pf_rd_t=201&pf_rd_i=0321486811&pf_rd_m=ATVPDKIKX0DER&pf_rd_r=17B1KCVKX3Q66T4QQ55K

Benim size esas onerecegim kitap ise Vladimir O. Safonov'un kitabidir. Keske 30 yas genc olsaydim demistim okudugumda :-) http://www.amazon.com/Trustworthy-Compilers-Vladimir-O-Safonov/dp/0470500956

bunlarin disinda parsing, optimization ve code generation safhalarindan bahseden daha bir cok kitap bulabilirsiniz.

Referans verdigim kitaplari ebook(pdf yada epub) olarak webde bulabilirsiniz.
Hocam çok teşekkür ederim bu kitaplara bakacağım mutlaka.
Kararsız...