Programlama Dili Nasıl Yazılır
-
evet hacılar sıfırdan bir programlama dili nasıl yazılır nelere ihtiyaç duyulur
-
adam akıllı bir şeyden bahsediyorsan:
İşletim sistemi yazmaktan zordur o kadarını söyliyeyim.
(native kod destekli bir dilden bahsediyorum)
Zira programlama dili yazmak artık eskisi gibi değil:
Dil bilimcisi ayrı
derleyici yazarı ayrı
Platform desteklemek ayrı
bir mesele haline geldi.
-
geç kaldın yiğenim
-
Programlama dili ,kağıt üzerinde oluşturulmuş bir kurallar topluluğudur, kendi dilini yazmak için beynin dışında herhangi bir araca ihtiyacın yok.
Hülasa, dili kağıt üzerinde yaratırsın, ister kendin, ister başka bir programcı, istediğin platform için derleyicisini yazar. Derleyici yazmak ve programlama dili tasarlamak tamamen farklı alanlardır.
Programlama dili tasarımı bir sanat gibi görülebilir, örneğin C dilinin operatörleri, pointerlari , fonksiyon çağırma biçimi vs. makina dili ile mükemmel bir uyum içindedir, ancak C derleyicisi sıradan bir programdır ve C kodunu belirli aşamalardan geçirip (atomlarına ayırma, syntax semantic analiz, optimizasyon, kod üretimi vb) makina koduna dönüştürür.
DrKill, hiç işletim sistemi programlama ve programlama dili tasarımı konularıyla ilgilendin mi, eğer ilgilenmediysen böyle bir karşılaştırma yapmanı doğru bulmuyorum.
Zira bir işletim sisteminin yazımı sanıldığı kadar kolay değil. Siz program yazarken doğrudan işlemci kodlarını kullanıyorsunuz, her işi işletim sistemi hallediyor.
Oysa işletim sistemi programlarken bilgisayardaki tüm çipleri programlamanız gerekiyor, irq lar için 8259 interrupt controller'i (PIC) , process geçişleri için 8253 timer (PIT), hdd ve cd rom vb veri alışverişi için DMA yı , hatta keyboard için 8042 keyboard controlleri ve daha birsürü aygıtı programlaman gerekiyor. Kaldıki bu kernelin en temel donanım bölümü. Birsürü veri yapısını (bağlı liste, ikili ağaç , kuyruk ) adından iyi bilmen ve uygulayabilmen, çok iyi teorik bilgi vs. gerekiyor.
Ayrıca korumalı mod mimarisi, sistem registerleri , bellek ve process yönetimine ve işin en önemli kısmı grafik sistemine hiç girmeyelim.
Onur, eğer programlama dili yazmak istiyorsan ilk iş, turing makinasını araştır, daha sonra brainfucker dilini araştır, bu dil, teoride tüm programlama dillerinin yaptıklarını yapabilen, turing makinasının pc versiyonudru. Hatta bu dilin birkaç kb boyutunda derleyicileri var, bende zamanında bir derleyicisini yazmıştım.
-
Programlama dili yazıyorsan öncelikle hangi platformda çalıştığı önemli
ASP, PHP, javascript gibi diller script dilleridir.bunlar runtimeda compile olur hızlıca hazır bir apache, IIS interface i uzerine oturan bişeye çevrilir.
C++, delphi gibi diller native kod üretir işlemcinin anlayacağı şekildedir yani
asp.net , java gibi diller virtual machine altında çalışır, işlemcinin anlayacağı assembly tarzı değil msil tarzı ara bir dile çevrilir platform independent olması açısından.
arkadaşın bahsettiği brainfuck dili de bambaşka bir kategoride tuhaf bişey, kurcalamıştım.
En yaygın olan c++ tarzı bir dili anlatayım. Öncelikle dilin anladığı temel komutlar vardır if , for , while, include zart zurt gibi bu dilin kurallarını anlayacak bir motor yazılır. bu motor kodu compile ederken Logic of nested containment dediğimiz parantez içinde parantez kullanımı, fazla parantez kapama varmi ? fonksiyonlara gerektiği tipte gerektiği sayıda parametre gönderilmişmi gibi şeyleri de kontrol eder.
C++ gibi bir dil Bu temel kodları onlara karşılık gelecek assembly instructionlarına çevirir (örn while in assemblysi nasil oldugunu bilmektedir, kurallar zincirine gore uzuun bir assembly oluşturur) . Çevirdiği kodu mov ax, 1000 falan gibi insanın göreceği formatta değil de PCnin anlayacağı sayısal formda save eder. (her assembly komutunun bir sayısal karşılığı vardır ve alması gereken parametre boyutu bellidir). dosyanın başına sonuna gerekli headerları, resourceları, degisken tablolarını yazar.
Birde temel olmayan komutlar dışında librarylerin içinden gelen komutlar vardır mesela #include yazarsan cout komutunu kullanabilirsin. burada #include komut değil compiler directivedir. Compiler directiveler derlenecek kodun derlenmeden onceki compiletimedaki modifikasyonunda kullanılır. yani gerçekte compiler kodunu uzuuun tek bir c dosyası gibi hafızasında oluşturup diğer aşamaları bundan sonra gerçekleştirecektir.
İşlemcinin anladığı tek dil assemblydir, onun için c++ dosyalarının temel komutları dışında donanım erişimi gibi işler için mutlaka içinde assembly blokları olmalıdır. C++ derleyicisi oluşturduğu assemblynin içine bunları katmasını da bilir. PC donanımının anladığı tek dil olan assemblye bir binary converterdır aslında compiler dediğimiz şey. Fakat moderen compilerlar debug da yapabiliyor bu kadar basitse o nasıl oluyor dicen, bende dicem ki işlemcilerin sadece o iş için bacakları var donanımsal olarak durdurur, breakpoint koyar, o an isleneni cekip okutabilirsiniz.
Buraya kadar yazdımda şimdi anladım ki tamamını anlatmam sayfalar sürer acaip özet geçiorum zaten. ama işin donanım tarafıda var siktir et abi üzümü ye bağını sorma =)
İşin özeti bu tip şeyler hepsi kendi alanında anormal uzman 100 lerce kişi tarafından yazılır. Olayın tamamını anlamak için donanım üreticisinden yazılımcısına, kernel yazandan os yazanına hepsinin az çok ne işle uğraştığını anlaman lazım anca o zaman bu işin nasıl yapıldığı ile ilgili bişey oturabilir kafanda.
-
Ben de sana yol gösterecek bazı temel bilgileri vereyim, tabi derleyici yazabilmen için çok sağlam assembly bilgisi şart, çünkü derleyicinin amacı kaynak kodunu makina diline çevirmektir.
Derleyiciler , kodu direkt makina koduna çevirmezler, linux ve windows derleyicileri önce kodu assembly diline çevirir ve ayrı bir programla (assembler) makina diline çevrilir. Son olarak linker ile bölümler (kod , data vs) ayrı ayrı çıktı dosyasına (windows da .exe ) yazılır. Mesela gcc derleyicisi kendi içinde önce cc1 i çağırır, bu kaynak kodun asm çıktısını üretir.
Derleme aşamasında şunlar gerçekleşir.
lexical analysis:
Burda kaynak kod atomlarına ayrılır. Atom kodun daha fazla bölünemeyecek en küçük birimidir. Örnek, sabit sayılar, stringler, anahtar sözcükler, operatörler vb.
C dili için if ( a == 0) return 1; ifadesinin atomlarına ayrılmış hali : if , ( , a , == , 0 , ), return , 1, ; şeklindedir.
Kod atomlarına ayrıldıktan sonra syntax analysis aşamasına geçilir.
syntax analysis :
Bu aşamada ifadelerin , dilin sözdizimi kurallarına uyup uymadığı kontrol edilir, mesela if anahtar sözcüğü görüldüyse sonraki atom ( olmalıdır. return ve 1 atomlarından sonra ise ; atomu gelmelidir.
Eğer gelmezse derleyici syntax error verir.. Syntax analysis aşamasında dil kuralları kontrol edilmez. Sadece dilin sözdizimine uygunluk kontrol edilir. Daha sonra semantic analysis aşamasına geçilir.
semantic analysis :
Burada dilin sözdizimine uyan ancak dil kurallarına uymayan ifadeler tespit edilir, örneğin tanımlanmamış bir değişken kullanıldığında, ya da sadece 2 parametresi olan bir fonksiyon 3 parametre ile çağırıldığında bunu syntax analyzer farkedemez. işte bu tür kontroller semantic analyzer in görevidir.
tüm kontroller bittikten sonra artık optimizasyon yapılır ve kod üretimine geçilir. Kod üretimi sırasında, derleyici ,kodları, daha önce kendisine belirtildiği şekilde assembly koduna çevirir.
Assembly koduna çevrildikten sonra bu kodların gerçek koda dönüşmesi gerekir, ancak bu da hemen olmaz. Önce assembler ile obj modülü yaratılır. bu modülde kod için text, veriler için data, sabit veriler için bss, gibi bölümler ayrı ayrı bulunur.
Ayrıca .obj (yada linux da .o ) modülünde, sabit değişkenlerin isimleri , fonksiyon isimleri gibi isimler bulunur. Linker , tüm bu bölümleri çıktı dosyasında (win. için .exe) ayrı ayrı yerlere koyar, bağlama işlemi kodu , datayı vs. uç uca bağlamaktan biraz daha karmaşıktır, özellikle dinamik kütüphane fonksiyonları kod içinde kullanılıyor ise başka olaylar olur.
Aslında link aşamasını ayrıntılı olarak anlatmıştım bir yerde, eğer onu da merak ediyorsan ordan okuyabilirsin, tamamını buraya kopyalamak istemedim.
-
@HolyOne ve @Tugberk verdiğniz bilgiler için teşekürler
baya bi karışık bişeymiş bu dil yazmak en iyisi ben var olanlanı kulanayım
-
Türkçede okunduğu gibi yazılır
Programlama Dili
şeklinde
İngilizcesi
Programming Language
şeklinde yazılır
progreaming leğengüıc
şeklinde telaffuz edilebilir
:F
intihar edesim var
-
@HolyOne
Şeyhim LUA konusunda engin bilgileriniz var mı?
Türkçe kaynak bulamadım pek... LUA kasmak istiyorum...
