Apa asal dari C Preprocessor?

30

Preprosesor C dilampirkan ke C, tetapi memiliki sintaks yang sama sekali berbeda dari bahasa utama:

  • spasi putih signifikan secara sintaksis (ujung garis mengakhiri pernyataan, celah setelah makro menentukan awal daftar pengganti)

  • blok berbasis kata kunci alih-alih blok menguatkan, elifbukanelse if

  • definisi yang dipimpin kata kunci alih-alih deklarasi-mencerminkan-penggunaan, tidak =untuk definisi nilai

  • petunjuk dari sintaks string alternatif ( #include <>vs #include "")

  • evaluasi malas (dari C, jelas; tetapi 6.10.3.1 dapat dibaca sebagai menyiratkan urutan spesifik ekspansi makro juga, di beberapa tempat yang penting)

Ini benar-benar tidak terlihat seperti C sama sekali! Secara teknis itu adalah bahasanya sendiri, tetapi selalu digunakan sebagai bagian yang hampir tidak terpisahkan dari C dan tampaknya sangat aneh bahwa itu tidak akan terintegrasi dengannya secara sintaksis.

Wikipedia tidak berbicara tentang sejarahnya; Repositori Pola Portland memberikannya izin yang lewat , tetapi tidak menjelaskan lebih rinci bahwa itu dirancang oleh orang lain selain situs web C. Dennis Ritchie dengan sejarah C mungkin memiliki jawabannya, tetapi sayangnya tidak ada lebih lama tersedia.

Sebagai mesin makro, itu jelas memiliki semantik sangat berbeda dari bahasa runtime, yang akan menjelaskan beberapa perbedaan, tetapi bukan aspek desain visual (itu juga tidak jelas untuk mata yang modern apakah itu awalnya ditujukan sebagai mampu dari jenis dari menyenangkan bahwa yang sistem penggantian memungkinkan, atau apakah itu "hanya" cara yang bijaksana untuk fungsi sebaris dalam waktu sebelum pengoptimal yang kuat). Rasanya seperti sesuatu yang lebih dekat dengan apa yang akhirnya menjadi template C ++ akan menjadi evolusi yang lebih logis terhadap makro, jika semantik seperti C benar-benar menjadi titik awal, tetapi ada bukti konkret yang lebih sedikit daripada sintaksinya.

Apakah kita punya catatan mengapa itu dirancang seperti ini, atau apa pengaruh pencipta?

Leushenko
sumber
5
archive.org/details/dmr-grab
Mike Mendukung Monica
@Mike omg terima kasih, saya benar-benar berpikir konten situs hilang selamanya karena tidak ada entri yang dapat dijelajahi dalam arsip.
Leushenko
@MikeSupportsMonica Saya baru saja akan bertanya apakah seseorang memiliki tautan. Terima kasih.
klutt

Jawaban:

17

Dari http://www.jslint.com/chistory.html ("Pengembangan Bahasa C" oleh Dennis M. Ritchie):

Banyak perubahan lain terjadi sekitar tahun 1972-3, tetapi yang paling penting adalah pengenalan preprosesor, sebagian atas desakan Alan Snyder [Snyder 74], tetapi juga sebagai pengakuan atas utilitas mekanisme file-inklusi yang tersedia di BCPL dan PL / I. Versi aslinya sangat sederhana, dan hanya menyediakan file dan penggantian string sederhana: #include dan #define dari macro parameterless. Segera setelah itu, diperpanjang, kebanyakan oleh Mike Lesk dan kemudian oleh John Reiser, untuk menggabungkan makro dengan argumen dan kompilasi bersyarat. Preprosesor pada awalnya dianggap sebagai tambahan opsional untuk bahasa itu sendiri. Memang, selama beberapa tahun, itu bahkan tidak dipanggil kecuali program sumber berisi sinyal khusus pada awalnya. Sikap ini bertahan, dan menjelaskan integrasi sintaksis preprosesor yang tidak lengkap dengan seluruh bahasa dan ketidaktepatan deskripsi dalam manual referensi awal.

Tampaknya dari akun di bagian 4 dari referensi [Snyder 74] yang ditautkan dalam kutipan di atas bahwa Alan Snyder telah mengerjakan kompiler C portabel (sekarang orang mungkin mengatakan "retargetable") C. Mungkin ini adalah motivasi untuk meminta preprosesor.

Saya belum dapat menemukan detail tambahan, pada desain preprocessor C itu sendiri, sebagai bahasa.

James Youngman
sumber
1
Perhatikan bahwa Snyder datang ke Bell Labs dari MIT, di mana assembler MIDAS memiliki pernyataan DEFINE, IFDEF, dan IFNDEF. Kebetulan?
Lars Brinkhoff
0

Saya mungkin hanya menambahkan bahwa itu sangat umum untuk bahasa assembly untuk memiliki pra-prosesor assembler makro yang terlihat sangat mirip dengan CPP.

Tuntable
sumber