Dijital Dünyayı İnşa Eden Programlama Dilleri
Fortran ve C'den Python ve Rust'a: yaşayan fikirlerin, değişmeyen mühendislik ödünleşimlerinin ve dünyayı çalıştırmayı sürdüren dillerin etkileşimli tarihi.
Yazılım tarihinin ilginç bir özelliği var: Bir dönemin bitmesi, o dönemde kullanılan araçların ortadan kalktığı anlamına gelmiyor.
Fortran 1957’de ortaya çıktı; yine de onunla yazılmış ve yıllar içinde gelişmiş sistemler bugün ciddi sayısal problemleri çözmeye devam ediyor. C, 1970’lerin başında şekillendi ve yazılımla donanım arasındaki en önemli arayüzlerden biri olmayı sürdürüyor. Python, World Wide Web’in kamuya açılmasından daha eski. Rust ve Swift gibi görece genç diller ise kendilerinden öncekilerin görünür hâle getirdiği sorunlara yeni yanıtlar arıyor.
Asıl ilginç soru hangi dilin en yaşlı olduğu değil. Bazı fikirlerin yetmiş yıl boyunca yaşarken bazılarının neden her yedi yılda bir yeniden icat edildiği.
Bir programlama dili, mühendislik kararlarının toplamıdır. Sözdizimi görünen kısmıdır; altında makineye, programcıya, hataların maliyetine ve yazılmaya değer görülen yazılımlara ilişkin varsayımlar bulunur. Bu kararları zaman içinde izlemek, dilleri yaşlarına göre sıralamaktan çok daha fazlasını anlatır.
Dillerin zaman çizelgesi
Bir dile dokunun. Tarihinin yalnızca ne zaman başladığını değil, hangi problemi çözmeye çalıştığını da görün.
Temeller · 1947–1972
Platformlar ve web · 1984–2000
Yeni dönem · 2010–2014
Çizginin uzunluğu, 1947’den itibaren geçen zamanı gösterir.
Tarihler tek tip “doğum günü” değildir: ilk tasarım, duyuru ve kararlı sürüm farklı tarihler olabilir. Her satırda hangi dönüm noktasının seçildiği belirtilmiştir.
Bir dilin doğum günü gerçekten ne zaman?
Sayılara fazla güvenmeden önce C++‘ı düşünelim. Bjarne Stroustrup, C with Classes üzerinde 1979’da çalışmaya başladı. İlk sürümü AT&T içinde 1983’te kullanıldı. C++‘ın ilk ticari sürümü ise 1985’te çıktı. Hangisi doğum günü? Üçü de gerçek birer dönüm noktası; ama aynı olayı anlatmıyor.
Smalltalk’ın ilk çalışmaları 1972’ye uzanıyor; buna karşılık birçok kişinin tanıdığı etkili sürüm ve geliştirme ortamı Smalltalk-80. Rust 2010’da kamuoyunun dikkatine açıldı, kararlı 1.0 sürümü ise 2015’te yayımlandı. Kotlin 2011’de duyuruldu; halka açık derleyici kilometre taşları daha sonra geldi. Üstelik “Assembly” tek bir gün piyasaya sürülmüş bir ürün değil, farklı makineler için geliştirilmiş diller ailesi.
Yukarıdaki atlasta her tarih belirli bir tarihsel dönüm noktasını gösteriyor. Yaşlar, 2026 ile takvim yılı farkı alınarak hesaplandı; gün ve ay düzeyinde kesin yaşlar değil. Seçilen 22 dil de “tarihin en önemli dilleri” sıralaması değil, öyküyü anlatmak için hazırlanmış örneklem. ALGOL, Simula ve Scheme gibi pek çok dil ayrıca incelenmeyi hak ediyor.
Bu ayrım önemli; çünkü bir başlangıç noktası seçmek editoryal bir karar olsa da zaman çizelgesi ilk bakışta bütünüyle nesnel görünür.
Programlamanın anlamını değiştiren beş dönem
1957 — Derleyiciye güvenmek
Fortran’ın doğduğu dünyada makine zamanı pahalıydı. Programcı her işlemi dikkatle ifade etmek zorundaydı. John Backus ve IBM’deki ekibi farklı bir anlaşma önerdi: Matematiği üst düzey bir dille yazalım, makine komutlarına çevirme işini derleyici yapsın. Zor olan yalnızca çalışan program üretmek değil, deneyimli programcıların kabul edeceği kadar verimli kod oluşturmaktı.
Bu tartışma onlarca yıldır başka biçimlerde sürüyor. Optimizasyon, vektörleştirme, JIT derleme ve üretilen makine kodu üzerine konuşuyoruz; fakat soru tanıdık: Performanstan vazgeçmeden araçlara ne kadar sorumluluk devredebiliriz?
Fortran, kapatılmayı unutmuş eski bir sistem olduğu için yaşamadı. Sayısal yazılımlar yılların doğrulamasını, uzman bilgisini ve dikkatle ayarlanmış algoritmalarını taşıyabilir. Onları yeniden yazmak çok az fayda sağlarken büyük bir yeni risk yaratabilir.
1972 — Makineye yakın, tek bir makineye bağımlı değil
C, Bell Labs’teki Unix çalışmalarının içinde gelişti. Önemi bilgisayarı tamamen gizlemesinde değildi. Sistem yazılımını daha taşınabilir kılacak kadar soyutlama sunarken bellek ve veri gösterimi üzerinde doğrudan kontrolü koruyordu.
Bu tercih hem güçlü hem tehlikeli. Bellek yerleşimini, işaretçileri ve işletim sistemiyle yakın çalışmayı yönetebilirsiniz. Aynı özgürlük, bellek güvenliği ve tanımsız davranış tartışmalarının günümüze taşınmasına neden olur. Modern sistem dilleri bu gerilimi icat etmedi; miras aldı.
Küçük ama çok önemli bir ayrıntı var: C çağrı kuralları ve C uyumlu arayüzler farklı dillerle yazılan bileşenlerin buluşma noktalarından biri oldu. Kaynak dilini değiştirseniz de karşınıza yine C biçiminde bir sınır çıkabilir.
1985 — Soyutlama da bir performans meselesi
C++ bu öyküye yeni bir katman ekledi. Çalışmaları 1979’da başladı, ilk ticari sürümü 1985’te yayımlandı. Güçlü soyutlamaların C’ye yakın verimlilik ve kontrolle birlikte yaşayıp yaşayamayacağını sorguladı. Yanıt tek bir özellik olmadı; yıllar içinde büyüyen bir dil, standart kütüphane ve araç zinciri ortaya çıktı.
Gecikme sınırları dar olan, uzun süre çalışan veya karmaşık arayüzlere sahip yazılımlarla uğraşanlar bu tercihi iyi tanır. Şablonlar, sahiplik kuralları, RAII ve modern tip özellikleri güçlü sistem kodunu yönetilebilir hâle getirmenin farklı yolları. Karmaşıklığı ortadan kaldırmazlar; onu araçların ve insanların daha iyi analiz edebileceği yerlere taşırlar.
Burada güzel bir ironi var: Dil yaşlandıkça onu geliştirenler geleceği daha fazla düşünmek zorunda kalıyor.
1991–1995 — Programlar birbirine bağlanıyor, kullanıcı kitlesi değişiyor
Python’ın ilk halka açık sürümü 1991’de çıktı. Java, JavaScript, PHP ve Ruby ise 1995’te önemli halka açık dönüm noktalarına ulaştı. Bu kümeye tek bir devrim demek kolay; ama her biri başka bir problemi çözmeye çalışıyordu.
Python okunabilir ve üretken genel amaçlı programlamaya ağırlık verdi. Java taşınabilir, yönetilen uygulamaları hedefledi. JavaScript tarayıcıya programlanabilirlik kazandırdı. PHP dinamik web sayfalarının geliştirilmesini ve yayımlanmasını kolaylaştırdı. Ruby ise bir fikri ifade ederken programcının yaşadığı deneyimi özellikle önemsedi.
İnternet ve web, yazılımı kimin yayımlayabileceğini ve yazılımın nerede çalışacağını değiştiriyordu. Yine de 1995 tek merkezden planlanmış bir tasarım hareketi değildi. Farklı topluluklar, birbirinden farklı kısıtlara aynı dönemde yanıt veriyordu. Sonunda bu tercihler aynı uygulamanın içinde buluşabildi.
2010–2014 — Güvenlik ve araçlar tasarımın merkezine geliyor
Rust, Kotlin, TypeScript ve Swift olgunlaşmış yazılım ekosistemlerine verilen dört ayrı yanıtı temsil ediyor. Rust, izlemeli çöp toplayıcı gerektirmeden sahiplik ve bellek güvenliğini merkeze koyuyor. Kotlin, mevcut kütüphanelerle birlikte çalışabilen daha ifade gücü yüksek bir JVM deneyimi arıyor. TypeScript, büyüyen JavaScript projelerine statik analiz ve güçlü araçlar ekliyor. Swift ise Apple platformlarına daha yeni bir dil modeli getirirken eski kodla birlikte çalışmayı geçişin parçası olarak ele alıyor.
Ortak noktaya dikkat edin: Hiçbiri sıfırdan kurulmuş bir dünyaya gelmedi. Tasarımcıları dev kod tabanlarını, üretimdeki hataları, yerleşik kütüphaneleri ve her şeyi yeniden yazmanın gerçekçi olmadığını biliyordu. Modern bir dilin başarısının bir kısmı, nelerin kolayca değiştirilemeyeceğini anlamasına bağlıdır.
Fikirler yalnızca aile ağacında aşağı doğru ilerlemez
Dil soy ağaçları çekicidir. En üste C’yi koyup C++, Java ve C#‘a oklar çizerseniz düzenli bir resim oluşur. Ama önemli bir noktayı gizler: Aynı süslü parantezleri kullanmak, aynı uygulamanın devamı olmak değildir. Nesne yönelimli fikirler Smalltalk ve Simula’dan, fonksiyonel yaklaşımlar Lisp ve Scheme’den taşınabilir. Bir dil bu fikirleri alırken onların çalışma zamanını devralmak zorunda değildir.
Daha dürüst bir gösterim etki haritasıdır: Bazı çizgiler sözdizimini, bazıları programlama modelini, bazıları da mühendislik önceliklerini anlatır. Aşağıdaki çizim bilerek yalnızca seçilmiş ilişkileri gösteriyor. Her dilin tek bir ebeveyni olduğu iddiasında bulunmuyor.
Dillerden çok, fikirlerin izini sürmek
Sözdizimi, nesne modeli ve programlama alışkanlıkları farklı yollardan yayılır. Aşağıdaki örnekler kavramsal etkileri gösterir; katı bir soy ağacı değildir.
C tarzı sözdizimi
C’nin ifade ve blok sözdizimi C++, Java ve C# için güçlü bir referans oluşturdu. Bu diller aynı çalışma zamanı veya bellek modelini paylaşmaz.
Nesneler ve mesajlar
Smalltalk’ın nesne ve mesaj fikirleri özellikle Objective-C’de belirgindir; Ruby de bu geleneğin bazı düşüncelerinden yararlanır.
Fonksiyonel düşünce
Lisp geleneği ve Scheme; fonksiyonları birinci sınıf değerler olarak ele alma ve soyutlama konusunda sonraki dilleri etkiledi.
Örnekler seçilmiştir. Yakınlık, doğrudan kaynak kodu veya derleyici mirası anlamına gelmez.
Eski diller neden hâlâ iş başında?
Yazılımın hafızası, teknoloji pazarlamasının hafızasından çok daha uzundur. Bir bankada, iş kurallarını yanlış aktarmanın maliyeti yüksek olan doğrulanmış bir COBOL sistemi bulunabilir. Bir araştırma grubunun Fortran çözücüsü gerçek gözlemlerle karşılaştırılarak yıllarca sınanmış olabilir. Bir cihazın C kodu, boyut, zamanlama ve donanım varsayımlarıyla defalarca test edilmiş olabilir. Dev bir Java uygulaması, hangi dille yazıldığından çok daha önemli bir işi yürütüyor olabilir.
Bu sistemler bilgi taşır. Kaynak dosyaları o bilginin yalnızca bir bölümüdür; testler, operatörlerin deneyimi, tuhaf uç durumlar, veri biçimleri, arayüzler ve işletim alışkanlıkları da aynı bilginin parçalarıdır. Uygulamayı yeniden yazmak, bu bilginin kendiliğinden taşındığı anlamına gelmez.
Bu nedenle “eski” ile “ömrünü tamamlamış” aynı mühendislik kategorisi değildir. Yaş, bir fikrin ne zaman ortaya çıktığını söyler. Kullanımdan kalkma kararı ise onu korumanın maliyetine karşı yenilemenin maliyetine ve riskine bağlıdır. Bazen yeniden yazmak doğru seçimdir. Bazen de doğru mimari, kararlı bir eski çekirdeği iyi tasarlanmış modern arayüzlerle çevrelemektir.
Yılların mühendislik deneyimi bu soruyu nasıl değiştiriyor?
Hem düşük seviyeli sistemlerde hem uygulama yazılımlarında çalışınca dil tartışmaları bir yarıştan çok sınırlar üzerine yapılan konuşmalara benziyor. Hangi garantiyi derleyici kontrol etmeli? Bir süreç çökerse ne olacak? Bu belleğin sahibi kim? İlk yazarı ayrıldıktan sonra yeni ekip kodu sürdürebilecek mi? Gecikme gerçekten nereden geliyor?
Aynı kod tabanında donanıma yakın kütüphaneler için C, performans gerektiren bileşenler için C++, otomasyon için Python, bir servis için Java ve kullanıcı arayüzü için TypeScript bulunabilir. Bu durum tek başına mimari karmaşa değildir. Arayüzler, derleme sistemi, testler ve sorumluluklar tutarlıysa bilinçli bir görev dağılımı olabilir.
Çekici soru “Hangi dil kazanır?” sorusudur. Daha yararlı olanıysa “Hangi garantilere ihtiyacımız var ve bunların bedelini nerede ödeyeceğiz?”
Kariyerinin başındaysan ve yukarıdaki liste sana bir menü gibi görünüyorsa, pratik bir okuma sırası: temellerden bir dil, makinenin gerçekte ne yaptığını öğrenmek için (alışılmış seçim C); platformlar döneminden bir dil, çünkü ücretli işlerin çoğu hâlâ orada; ve yeni dönemden bir dil, sektörün şu anda hangi eski sorunları kapatmaya çalıştığını görmek için. Üç dil, üç dönem; dördüncüyü, beşinciyi ve altıncıyı görür görmez tanırsın.
Peki, senin dilin kaç yaşında?
Atlas sana bir sayı verebilir. Daha ilginç yanıt, o sayının neyi temsil ettiğinde: Sonraki kuşakların üzerinde çalışarak geliştirdiği başarılı bir mühendislik tercihinin yaşını.
Peki sen onların yanında kaç yaşındasın? Doğum yılında bir dil ortaya çıktıysa o senin ikizin; 1995’in dört ikizi var. Hiçbiri çıkmadıysa iki sakin dönemden birine doğmuşsun demektir, 1973–1983 ya da 2001–2009; sektör o yıllarda elindekini olgunlaştırmakla meşguldü.
İkizini bul
Doğum yılını yaz. Seninle aynı yıl ortaya çıkan dilleri ve kullandığın araçların yanında kaç yaşında olduğunu gör.
Yılı yazınca cevap burada görünür.
Fortran iyi bir soyutlamanın üzerinde çalıştığı donanımdan daha uzun yaşayabileceğini gösterir. C, özgürlükle sorumluluğun çoğu zaman birlikte geldiğini hatırlatır. Smalltalk, geliştirme ortamının fikirleri ne kadar güçlü biçimde etkileyebileceğini anlatır. JavaScript, küçük bir tarayıcı özelliğinin dünyanın altyapısına dönüşmesinin öyküsüdür. Rust, bazı zor problemlerin yeni kurallarla tekrar ele alınmaya değer olduğunu gösterir.
Programlama tarihi bir emekliler kulübü değil. Geriye dönük uyumluluğu çok güçlü olan ve kimsenin değiştirmeye cesaret edemediği birkaç arayüz barındıran çalışan bir sistem.
Araştırma notları ve kaynaklar
Editoryal yöntem: Grafikteki tarihler, adlandırılmış dönüm noktalarını ifade eder; gün ve ay düzeyinde kesin doğum tarihlerini değil. Assembly’nin ilk dönemi özellikle dağınıktır: 1947 işareti, Booth/ARC dönemiyle ilişkilendirilen erken assembly çalışmalarını temsil eder; evrensel bir “1.0” sürümünü değil. Zaman çizelgesi popülerlik ya da güncel kullanım ölçmez.
Yazı ve etkileşimli atlas, aşağıdaki birincil anlatımlar ve kurum tarihleri dikkate alınarak düzenlendi:
- IBM — Fortran’ın tarihi: 1957 ve derleyicinin verimlilik sorunu.
- Computer History Museum — 1972: C ve Smalltalk’ın ilk dönemleri.
- Computer History Museum — Smalltalk at 50: erken araştırma sürümleri.
- Bjarne Stroustrup — C++ tarihçesi: 1979, 1983 ve 1985 arasındaki fark.
- Python belgeleri — Tarih ve lisans: 1991’de başlayan sürüm çizelgesi.
- PHP el kitabı — PHP tarihi: Haziran 1995 kaynak sürümü.
- Mozilla MDN — JavaScript tarihi: 1995’te tarayıcıya eklenmesi.
- Ruby projesi — Ruby hakkında: 1995 halka açık sürümü ve etkilenilen diller.
- Rust projesi — Rust 1.0: ilk görünürlük ile kararlı sürümün ayrılması.
- JetBrains — Kotlin’in tanıtımı (2011): halka açık ilk duyuru.
- Swift projesi — Apple WWDC 2014: ilk tanıtım.
Bu liste eksiksiz bir dil sınıflandırması değil, seçilmiş bir tarih anlatısıdır. Başlangıç noktası için farklı makul ölçütler farklı yaşlar üretebilir. Bu, gizlenmesi gereken bir hata değil; hikâyenin parçasıdır.