Şurada okuduğum başlıktan yola çıkarak bu yazıyı yazmak istiyorum. Her zaman savunduğum bir görüş vardır; Bir yazılım geliştirici her ne alanda çalışıyorsa çalışsın çalıştığı alanla ilgili herşeyi çok iyi bilmeli, kendi alanına etki eden şeyleride takip etmelidir. Örneğin, masaüstü yazılımlarıyla ilgilenen bir yazılımcı, bilgisayar dilleriyle, compiler kavramıyla veya Assembly/sembolik makine koduyla ilgili birşeyler -en azından çalışma mantığını- bilmelidir. Ya da web programlamayla ilgilenen birisi (örneğin php) html, http, tcp/ip, güvenlik, internetin çalışma mantığı vs gibi konularıda bilmelidir.
Okuduğum tartışmadan ve etrafımda gördüğüm örneklerden yazılım geliştiricilerin çoğunun bu tip konularda pek birşey bilmediklerini (aslında bilmeleri gerektiğini düşünmediklerini) görüyorum.
Şimdi bunları neden söylüyorum peki? Bir programlama dili ne demektir onu bilmedikten sonra nasıl bu konuda birşeyler yapmayı beklersiniz? Veya script dili ile programlama dili arasındaki farkları bilmek önemli değil midir? Sembolik makine kodu nedir veya bilgisayarlar bizim yazdığımız kodları nasıl anlarlar?
Bir programla dili geliştirmek aslında kod yazmayla ilgili değildir. Programlama dili geliştirmek için bilgisayar başına oturup düşük düzey bir dil ile kod yazmaya başlamazsınız. Bunları geliştirdiğiniz dili anlayabilecek derleyiciler (compiler) geliştirirken kullanırsınız.
Şimdi önce şuradan başlayalım,
Bilgisayarların Çalışma Mantığı ve Programla Dilleri Hakkında Temel Bilgiler
Çok basit anlamda o anda çalışan verileriniz RAM bellekte tutulur ve CPU(iÅŸlemci) aracılığı ile iÅŸlenir. Bunun haricinde birçok adım var tabiiki (daha fazla bilgi için). CPU sonuç olarak elektronik bir ürün olduÄŸundan 1(true – doÄŸru) ve 0(false – yanlış) lardan yani “bit” lerden baÅŸka birÅŸey anlamaz. Bu sayı türüne binary sayı denir.
Åžimdi, bir örnek vermek gerekirse 11001101 komutu assembly’de (bu tarz her bir sembole anlamlı bir kelime verilerek oluÅŸturulmuÅŸ dil) add komutu anlamına gelir.
Buradan anladığımız, bir programlama dili (assembly’de bir dildir) bilgisayara birÅŸeyler anlatmak için oluÅŸturulmuÅŸ bir yapıdır. Programlama dili bir program deÄŸildir, bizim günlük kullanımımızda olan diller gibi bir dildir.Â
Peki bizim yazdığımız dilleri bilgisayar nasıl anlar? İşte o noktada Türkçe bilmeyen bir İtalyan nasıl Türkçe anlayabilirse öyle anlar; yani çevirmen kullanarak!
Bizim yazdığımız komut setlerini bilgisayarın anlayabileceği dile çeviren yazılımlara derleyici (compiler) denir. İşte programla dili geliştiren bir kişi elini bilgisayara ilk kez derleyici yazarken sürer.
Programla dilleri seviyelerine göre gruplandırılırlar. Yanlış anlaşılmasın, en düşük seviye en kötü demek değildir. En düşük seviye makine diline en yakın demektir. Diller seviyeleri düştükçe hızlanır ve güçlenirler. Ama üzerlerinde işlem yapmak zorlaşır. Örnek vermek gerekirse, Assembly düşük seviyeli, C/C++ orta seviyeli, Java/C# yüksek seviyeli dillerden sayılabilir. Aslında bu seviyelendirme biraz göreceli birşeydir, herkesin bu konuda farklı konuştuğuna şahit olabilirsiniz.
Bir Programla Dili GeliÅŸtirmek
Bir programla dili geliştirmek için, bilgisayarların çalışma mantığını çok iyi bilmelisiniz. Ayrıca temel yapıları (örneğin veri yapıları gibi), algoritma geliştirme, diğer dillerdeki yapılar, donanımsal özellikler (örneğin hafıza kullanım bilgileri) gibi şeyleri de çok iyi biliyor olmanız lazım.  Makine kodunuda çok iyi bilmeniz lazım. Sonuçta çevireceğiniz dile göre herşeyi tasarlarsınız.
Matematiksel düşünce yapısı ve matematik bilgisi çok önemlidir. Bütün işler matematiğe çıkacağı için bu konuda uzman olmanız gerekir.
DiÄŸer dillerin eksikliklerine bakabilirsiniz veya tamamen yeni bir yaklaşım geliÅŸtirebilirsiniz (80′lerde Nesneye Yönelik Programlama yaklaşımının geliÅŸtirilmesi gibi).
Kısacası, bir dil geliştirmek için dil bilimci olmanız gereklidir. Peki kabaca neler yapmalıyız?
Öncelikle dilinizin syntax (sözdizimi) yapısını geliÅŸtirmelisiniz. Acaba blokları nasıl tanımlayacaksınız?, satır sonu olacak mı? olacaksa nasıl gösterilecek? vs vs vs. Dilinizdeki komutları (o komutların assembly’e nasıl çevrileceÄŸini gözönünde bulundurarak) geliÅŸtirmelisiniz. Dildeki herÅŸey sözcüklerden (veya komutlardan diyeyim) oluÅŸmayacağı için operatörler ve sembollerede anlamlar yüklemeniz gerekecektir.
Mevcut programlama metodolojilerini (örneğin, nesneye yönelik programlama) çok iyi bilmeli, mümkünse bunları geliştirmelisiniz.
Dilinizin kolay okunması ve yazılması ve güçlü özelliklere sahip olması lazım. Ayrıca olabildiğince hızlı olmalıdır (Bu tamamen söz diziminizi makine diline nasıl çevirdiğinizle alakalı). Yoksa insanları çekemezsiniz.
Bunlardan sonra, iş kütüphane yazımına geçer. Dillerde kullanılan ama çoğu kişinin komut diye bildiği metodlar (fonksiyonlar) aslında komut değil, o dil kullanılarak geliştirilmiş kütüphane metodlarıdır. Bugünlerde bir dilin tutması için kütüphanesininde güçlü olması gerekir. Hemen hemen her sorun için bir metod yazmanız gerekecektir.
Programla Dilinin Altyapısını Geliştirmek
Aslında bu nokta artık dilin geliştirilmesinden sonra gerçekleşmelidir. Programla dilinizi tasarladıktan sonra bunları yapmalısınız (veya başka şirketler/kişiler yapmalı). Zaten eğer açık kaynak camiasına yakın birşeyler yaparsanız sizin yerinize dilin altyapısını hazırlayacak kişiler bulabilirsiniz.
Artık bu noktada elinizi koda sürmeniz gerekecektir. Duruma göre bir çevirici (yorumlayıcı) veya derleyici yazmanız lazım. Belki son zamanlarda moda olduÄŸu üzere bir framework (.Net framework veya Java Runtime Environment gibi) yazarsınız.Â
Çevirici: Sizin dilinizde yazılan kodlardan çalışma zamanında (runtime) bir çıktı (örneğin html) üreten veya yazdığınız kodu kendi iç dinamiklerinde çalıştıran (yani tam karşılamasada makine koduna dönüştüren) yazılımlardır. Örnek olarak web sunucusunun altında çalışan php yorumlayıcısı verilebilir. Bunlar gelen kodları yorumlayarak html koduna dönüştürürler.
Derleyici: Kodunuzu doğrudan makine koduna dönüştüren yazılımdır. Kısacası, tasarladığınız dildeki komutları, yapıları makine koduna dönüştürür ve bundan çalıştırılabilir bir dosya (ve varsa ek dosyalar -örn dll gibi) elde eder.
Framework: Çeviricilerin daha gelişmiş türleridir diyebiliriz. En basit tabirle (yaptıkları işi bununla sınırlandıramayız ama en temelinde bu vardır), yazdığınız kodlar önce bir aradile dönüştürülür, sonra bu aradile dönüştürülmüş dosyalar frameworkler tarafından alt tabandaki işletim sistemine göre yorumlanır. Bu da bize platform bağımsızlık sağlar.
Sonuç
Görüldüğü gibi, programla dili geliştirmek gerçekten çok zor bir iştir ve sanılanın aksine program yazmak demek değildir. Ben bu yazıda bu işe çok kısaca ve kaba hatlarıyla değindim, iş tabiiki bu kadarla sınırlı değil.
Birkaç yıl öncesinde, Türkiye’de geliÅŸtirilen -sanırım bir üniversite bitirme teziydi- bir programa dili görmüştüm. Åžu anda ne olduÄŸunu hatırlamıyorum -eÄŸer hatırlayan varsa ve bana yorum kısmında yardımcı olabilirse çok sevinirim-. Ama bu, bu tip iÅŸlerin yapılabilirliÄŸini kanıtlayan bir geliÅŸmeydi.
Belki siz, mevcut yapıları yıkacak yeni yaklaşımlar getirebilirsiniz.

bilgi için teşekkürler.bu konu hakkında bilgilendim yeterince sağolun aklımdaki soru işaretleri kalktı:)
Güzel bir yazı olmuÅŸ, hem verdiÄŸin bilgileri hem de anlatım tarzını beÄŸendim. Yazılım geliÅŸtiriciler hakkındaki tespitlerine katılıyorum, aslında bunu sadece yazılım geliÅŸtiriciler için deÄŸil hemen her sektörü ve iÅŸ kolu için söyleyebiliriz. Türkiye’nin kronik sorunlarından biri de bu deÄŸil mi zaten?
Sanırım Türkiye’de geliÅŸtirilen programlama dilinin adı YUNUS (.yns) ‘ydi.Tabi yanlış hatırlamıyorsam.
Bunlara ek olarak makalenizi çok beğendim.Benim gibi daha bu işin başında olan yazılım mühendisliği adayları için yol gösterebilecek bir yazı diye düşünüyorum.
Teşekkür ederim.
Bilgilendirici ve güzel bir yazı yazmışsınız, tebrik ederim. Programlama dillerinin yaptıkları iÅŸi bırakın, seviyelerinin ne anlama geldiÄŸini bilmeyen, ama kendilerine “yazılımcı” ya da “programcı” diyenlerle karşılaşıyorum ne yazık ki.
Bana kalırsa her yazılım geliştiricinin biraz da olsa elektronik ve işlemci donanımı bilgisi alması gereklidir. Donanım kontrolüne daha yakın diller ise alt seviye dillerdir, örn: assembly
Bu nedenle iÅŸletim sistemlerinin çekirdekleri alt seviye dillerde yazılır ki donanıma daha hakim, daha az sorunlu temeller inÅŸa edilebilsin. İşlemcinin “Stack Segment” i nedir bilmeden çekirdek yazılamaz, yazılsa da güvenli olmaz.