C İşlemcisinin kökeni nedir?


30

C önişlemcisi C'ye eklidir, ancak ana dilden tamamen farklı bir sözdizimine sahiptir:

  • sözdizimsel olarak anlamlı boşluk (satırın sonu bir ifadeyi sonlandırır, makro değiştirme listesinin başlangıcını belirledikten sonra boşluk)

  • parantezli bloklar yerine anahtar kelime tabanlı bloklar elif,else if

  • beyan yerine yansıtan anahtar kelimeli tanımlamalar-yansıtır-kullanım, =değer tanımı için hayır

  • alternatif bir dize sözdiziminin ipuçları ( #include <>vs #include "")

  • tembel değerlendirme (açıkça, C; ancak 6.10.3.1 , önemli olan birkaç yerde, belirli bir makro genişleme düzenini ima ettiği şeklinde okunabilir )

Gerçekten C'ye hiç benzemiyor! Teknik olarak ise kendi dil, ama her zaman C neredeyse-ayrılmaz bir parçası olarak kullanılmaktadır oldu ve o sözdizimsel onunla entegre olmaz çok garip görünüyor.

Wikipedia tarihi hakkında konuşmuyor; Portland Pattern Repository , geçici bir söz veriyor , ancak diğer insanlar tarafından C. dışında kalanlar tarafından tasarlanmasının ötesinde ayrıntıya girmiyor. Dennis Ritchie'nin C tarihine sahip web sitesinin büyük olasılıkla cevabı vardı ama ne yazık ki hayır. daha uzun

Makro motoru olarak, belli ki çok farklı açıklıyor zamanı diline gelen anlamsal sahip bazı o aslen olarak düşünülmüştü olsun, modern gözlere de belirsiz (farklılıkları değil, görsel tasarım yönlerini yetenekli bir tür içinde eğlenceli ki onun değiştirme sistemi, ya da güçlü optimize edicilerden önceki bir zamanda satır içi işlevler için uygun bir yöntem olup olmadığını “yalnızca” olarak kabul eder). Sonunda C ++ şablonlarının, başlangıç ​​noktası olsaydı C-benzeri anlambilim gerçekte başlangıç ​​noktası olsaydı, makrolara karşı daha mantıklı bir evrim olacağına daha yakın bir şey gibi görünüyor, ancak bunun sözdizimi için olduğundan daha az somut kanıt var.

Neden bu şekilde tasarlandığına veya yaratıcıların etkilerinin ne olduğuna dair bir kayıt var mı?



@Mike omg teşekkür ederim , arşive göz atılabilir bir girişi olmadığı için site içeriğinin sonsuza dek kaybolduğunu düşündüm.
Leushenko

Yanıtlar:


17

Gönderen http://www.jslint.com/chistory.html (Dennis M. Ritchie tarafından "C Dil Gelişimi"):

Diğer birçok değişiklik 1972-3 yıllarında meydana geldi, ancak en önemlisi, kısmen Alan Snyder'in çağıran önişlemcinin tanıtılmasıydı [Snyder 74], ancak aynı zamanda BCPL ve PL / I’de mevcut olan dosya dahil etme mekanizmalarının kullanımının tanınmasında. Orijinal sürümü son derece basitti ve yalnızca içerdiği dosyalar ve basit dize değişimleri sağladı: #include ve #define, parametresiz makroların. Bundan kısa bir süre sonra, çoğunlukla Mike Lesk ve daha sonra John Reiser tarafından makroları argümanlarla ve koşullu derleme ile birleştirecek şekilde genişletildi. Önişlemci başlangıçta dilin kendisine bağlı isteğe bağlı bir yardımcı olarak kabul edildi. Nitekim, bazı yıllar boyunca, kaynak program başında özel bir sinyal içermediği sürece bile çağrılmadı. Bu tutum devam etti ve hem ön işlemcinin sözdiziminin dilin geri kalanıyla tamamlanmamış entegrasyonunu hem de ilk başvuru kılavuzlarında tanımının kesinliğini açıklamıyor.

Alan Snyder'ın bir portatif üzerinde çalıştığı (bugün bir "geciktirilebilir" diyebilir) C derleyicisinin üzerindeki alıntıya bağlanan [Snyder 74] referansının 4. bölümündeki hesaptan görünüyor. Belki de bu bir önişlemci isteme motivasyonuydu.

C önişlemcisinin tasarımında bir dil olarak, ek bir detay bulamadım.


1
Snyder, MIDAS meclisinin DEFINE, IFDEF ve IFNDEF ifadelerini aldığı MIT'den Bell Labs'e geldiğine dikkat edin. Tesadüf?
Lars Brinkhoff

0

Assembly dillerinin CPP'ye çok benzeyen makro birleştirici ön işlemcilerine sahip olmasının çok yaygın olduğunu ekleyebilirim.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.