Apa sejarah penamaan konstanta di semua huruf besar?

20

Apa sejarah di balik konvensi penamaan konstanta di semua huruf besar?

Intuisi saya adalah bahwa itu dimulai dengan preprocessor C, di mana orang mengembangkan praktik untuk memberi nama macro preprocessor di semua huruf besar sehingga mereka akan secara efektif hidup di ruang nama yang terpisah dan menghindari tabrakan nama. Keyakinan saya adalah bahwa praktik ini kemudian disalahpahami dan dibastardisasi untuk diterapkan pada konstanta non-preprosesor ( variabel enum, const).

Memberi nama makro preprocessor di semua huruf besar tampaknya benar-benar berguna bagi saya. Penamaan konstanta umum seperti itu, tidak terlalu banyak (dan kontraproduktif jika itu menciptakan tabrakan dengan nama makro).

Apakah saya kehilangan basis? Apakah praktik mengkapitalisasi konstanta mendahului C?

jamesdlin
sumber
3
Saya pikir kamu ada di sini. Bahasa awal memiliki hampir semuanya dalam huruf besar, dengan penggunaan huruf kecil menjadi modis nanti. Buku C awal biasanya menunjukkan constpengidentifikasi menjadi huruf kecil dan #definesatas. Jawa meskipun mengadopsi huruf besar untuk konstanta dan bahasa lain diikuti, tapi aku bisa salah sedikit terakhir. Dibutuhkan lebih banyak penelitian! :)
David Arno
Saya setuju dengan @vidarno mungkin karena sifat baik C atau assembler.
Mengintip

Jawaban:

13

Untuk C, edisi pertama Bahasa Pemrograman C (alias K&R) menunjukkan bahwa intuisi Anda tentang macro preprocessor benar:

Nama konstanta simbolis biasanya ditulis dalam huruf besar sehingga mudah dibedakan dari nama variabel huruf kecil.

Dalam banyak hal, ini adalah peninggalan dari bahasa assembly, di mana makro didefinisikan dalam huruf besar bersama dengan label, opcode, nama register dan yang lainnya. Munculnya perakitan AT&T mengubah hal itu pada beberapa platform, tapi saya pikir itu sangat dipengaruhi oleh fakta bahwa terminal yang mendukung huruf kecil menjadi sesuatu dan Unix adalah apa yang saya sebut "sistem operasi huruf kecil."

Pada dua poin lainnya, Anda memukul 0,500:

Enum

Pada saat edisi kedua diterbitkan, enumtelah didefinisikan, mereka disebut sebagai konstanta enumerasi dan dibahas dalam bagian konstanta. Karena konstanta yang didefinisikan oleh suatu enumdiwakili oleh simbol, yang membuatnya konstanta simbolik, yang, jika Anda akan mengikuti konvensi yang disarankan, harus dinamai dalam huruf besar. (Seperti macro preprocessor, tidak ada yang menghentikan Anda dari melakukan sebaliknya.)

Implikasinya di sini adalah bahwa tidak seperti beberapa bahasa yang mengikuti, C tidak memperlakukan enumsebagai tipe kelas pertama di mana jenis itu sendiri berbeda, nilai enumerasi spesifik untuk setiap jenis dan dapat digunakan kembali pada yang lain. Alih-alih, ini secara efektif merupakan istilah praktis #defineyang menghasilkan urutan bilangan bulat dengan pengidentifikasi terlampir. Ini membuat

enum foo  { BAR, BAZ };
enum quux { BLETCH, BAZ };

tidak valid karena semua simbol berbagi lingkup dan BAZdidefinisikan ulang. (Ini merupakan peningkatan dari preprosesor yang, pada saat itu, tidak memperingatkan tentang satu #defineclobbering yang lain.) Selanjutnya, C tidak peduli apakah Anda mencampurnya karena mereka semua hanya bilangan bulat, membuat

enum foo  { BAR, BAZ };
enum quux { BLETCH, BLRFL };

enum foo variable = BLETCH;

sepenuhnya valid bahkan pada kompiler modern dengan semua peringatan dihidupkan.

Const

NB: Kata constkunci berasal pada tahun 1981 dengan C Dengan Kelas Stroustrup (yang berevolusi menjadi C ++) dan akhirnya diadopsi oleh C. Pilihan nama sangat disayangkan, karena bertabrakan dengan penggunaan K & R dari konstanta istilah untuk mengartikan apa yang sekarang kita sebut sebagai literal (misalnya 38,, 'x'atau "squabble"). Teks dalam edisi kedua tidak ditulis ulang untuk mencerminkan hal itu.

Variabel yang dideklarasikan constadalah cerita yang berbeda karena mereka masih variabel. Mereka tidak seharusnya dimodifikasi, tetapi apakah gagasan tentang variabel konstan lebih masuk akal daripada, katakanlah, udang jumbo adalah makanan untuk diskusi lain. Apa pun masalahnya, C tidak pernah benar-benar serius tentang hal itu karena standar hanya mensyaratkan bahwa kompiler memancarkan diagnostik ketika Anda mencoba mengubahnya. Perilaku aktual tidak terdefinisi jika modifikasi dikompilasi dan dieksekusi.

Menjadi variabel, masuk akal bahwa apa pun constakan mengikuti konvensi diberi nama dalam huruf kecil. Menggunakannya untuk mewakili literal memang memiliki beberapa keunggulan keamanan jenis tetapi tidak membuat optimasi yang baik jika Anda harus mencapai antara unit kompilasi untuk mendapatkan nilai.

Yang bukan mereka adalah konstanta dalam arti K&R, dan untuk alasan itu pengidentifikasi mereka tidak boleh huruf besar. Beberapa orang menggunakannya seperti itu, tetapi ini bukan praktik yang saya rekomendasikan kecuali dalam beberapa kasus tertentu.

Blrfl
sumber
Saya akan menerima ini, dan sementara saya menghargai jawabannya, enumparagraf tentang tidak menjadi tipe kelas dan tentang konflik redefinisi tampaknya tidak relevan. Bahwa edisi pertama K&R menggambarkan praktik menjadi "konstanta simbolik" sudah cukup. (Juga, setelah memeriksa salinan K&R edisi kedua, saya melihat bahwa contoh mereka semua adalah enumkonstanta nama semua huruf besar, sehingga semakin memvalidasi jawaban Anda.)
jamesdlin