"C hangi dilde yazılmış?"
Başka bir açıdan bakıldığında, durum şu: C dili çalışmadan önce derlenmesi gerekir, peki C dili derleyicisi nereden geliyor? Hangi dilde yazılmış? Eğer C harfi ile yazıyorsa, önce yumurta mı yoksa tavuk mu var?
1
Dünyada derleyici olmadığını varsayalım, makine diliyle başlayalım, nasıl yapılacağını görelim.
Makine dili, derleyiciye ihtiyaç duymadan doğrudan CPU tarafından çalıştırılabilir.
Sonra assembly dili vardır, ancak assembly dili sadece makine dili için bir hattılık olarak kullanılır, ancak çalıştırmak için makine diline derlenmesi gerekir, bu yüzden bu ilk derleyiciyi (gelecekte kullanılmayacak) makine diliyle yazmaktan başka seçenek yoktur.
Assembly dili sorunu çözüldü ve bu büyük bir ilerleme oldu; şu anda assembly diliyle C dili derleyicisini yazmak mümkün oldu; biz bunun C derleyicisinin atası olduğunu söylemiyoruz.
Bu atayla herhangi bir C dili programını derleyebilirsiniz, yani C dilinde bir derleyici yazabilir misiniz? Sadece atalarla derleyin.
Tamam, böyle bir katmandan sonra sonunda C dilinde yazılmış bir derleyici buldum, bu gerçekten sorunlu.
Bu noktada, önceki paket tarafından yazılmış C derleyicisi terk edilebilir.
Elbette, C'den önce Pascal gibi başka yüksek seviyeli diller varsa, Pascal C derleyicisi yazmak için kullanılabilirdi.
İlk Pascal'ın derleyicisinin Fortran ile yazıldığı söylenir. İlk yüksek seviyeli dil olarak, Fortran'ın derleyicisi assembly dilinde yazılmalıdır.
2
İşte derleyici hakkında ilginç bir efsane:
Efsaneye göre, Unix'in mucitlerinden biri olan Ken Thompson, Bell Labs'taki herhangi bir Unix makinesine gururla gelir, kullanıcı adını ve şifresini girmiş ve root yolundan giriş yapabiliyordu!
Bell Labs yetenekle dolu ve bazı büyük adamlar bu zafiyeti bulmaya yemin etti, Unix'in C kaynak kodunu okudular ve sonunda giriş arka kapısını buldular, arka kapıyı temizledikten sonra Unix'i derleyip çalıştırdılar ama Thompson yine de giriş yapabildi.
Bazı kişiler derleyicide bir sorun olabileceğini düşünüyor ve Unix derlenirken bir arka kapı yerleştirilmiş, bu yüzden C dilinde bir derleyici yeniden yazılmış ve Unix'i yeni bir derleyiciyle tekrar derlemişler.
Ama yine de çalışmıyor, Thompson root ile giriş yapabiliyor, bu gerçekten yıkıcı!
Daha sonra Thompson sırrı bizzat açtı, bu sorun yaşayan ilk C derleyicisiydi, bu derleyici elbette Unix kaynak kodu derlerken arka kapıya yerleştirilecek, bu yeterli değil, daha da iyisi, eğer C dilinde yeni bir derleyici yazarsanız, kesinlikle ikili kod olarak derlemeniz gerekir, ne derlemelisiniz, sadece Thompson tarafından yazılmış ilk derleyiciyi kullanarak derleyin, tamam, yazdığınız derleyici kirlenmiş olacak, derleyiciniz tekrar Unix derleyecek, Ayrıca bir arka kapı da takacağım :-)
Bu arada, birkaç yıl önceki XcodeGhost olayı hatırlıyor; bu sadece Xcode'a (resmi olmayan kanallardan indirilmiş) bir Truva atı yerleştirildiği anlamına geliyor; böylece XCode tarafından derlenen iOS uygulamaları kirlenmişti ve bu uygulamalar hackerlar tarafından yasa dışı şeyler yapmak için kullanılabiliyordu.
Bu XCodeGhost Thompson'unkinden çok uzak olsa da, yazılım indirirken resmi kanalları kullanmanız, resmi web sitesinden indirmeniz, sitenin HTTPS standardını aramanız ve hatta kontrol toplamını doğrulamanız gerektiğini hatırlatıyor.
3
Bazı insanlar şunu sorabilir: Ben Hui'yi Hello World paragrafı için kullanıyorum, ama biri karmaşık bir derleyici yazmak için bunu kullanabilir? Bu mümkün mü?
Tabii ki, Unix'in ilk nesli geliştirildiğinde C dili yoktu ve Ken Thompson ile Dennis Ritchie Unix'i montaj hatlarıyla yazıyordu. WPS'nin ilk versiyonu Qiu Bojun tarafından Hui'de yazılmıştır ve Turbo Pascal'ın derleyicisi de Anders tarafından Hui'de yazılmıştır; tanrıların yetenekleri sıradan insanlar için hayal edilemez.
Derleyiciler için ayrıca "kar topu" şeklinde geliştirmek de mümkündür:
C dilini örnek alarak, ilk sürüm C dilinin bir alt kümesini seçebilir; örneğin sadece temel veri türleri, süreç kontrol ifadeleri ve fonksiyon çağrılarını destekleyebilir...... Buna C0 diyoruz.
Sonra assembly dilinde bir derleyici yazın ve bu dilin sadece bir alt kümesini C0 alır, böylece yazmak çok daha kolay olur.
C0 dili çalışıyor ve ardından bu alt kümeyi structs, pointer, ...... ekleyerek genişletiyoruz ve yeni dili C1 çağırıyoruz.
C1 dili için derleyiciyi kim yazıyor? Doğal olarak, C0.
C1 çalışırken, dil özelliklerini tekrar genişletin, derleyiciyi C1 ile yazın ve C2'yi alın.
Sonra C3, C4 var...... Son olarak, tam C dili elde ediliyor.
Bu sürece bootstrapping denir ve Çince'de bootstrapping denir.
|