Sebagian besar bahasa pemrograman tampaknya dirancang untuk tidak memungkinkan seseorang mendeklarasikan pengenal yang dimulai dengan angka. Saya hanya ingin tahu alasannya. Saya sudah mencari di web, tetapi tidak dapat menemukan penjelasan yang memuaskan.
32
Jawaban:
Dalam C / C ++, angka yang diikuti oleh huruf dianggap sebagai konstanta numerik dan string yang mengikuti, memenuhi syarat jenis konstanta. Jadi misalnya (ini VC ++, tidak yakin bagaimana standarnya):
Jadi a) lebih mudah bagi lexer seperti yang dikatakan Daniel tetapi juga b) ia membuat perbedaan eksplisit karena 0y mungkin variabel tetapi 0u tidak akan pernah. Ditambah kualifikasi lainnya, seperti "i64" ditambahkan lebih lambat dari "l" atau "u" dan mereka ingin menjaga opsi terbuka untuk menambahkan lebih banyak jika diperlukan.
sumber
Kenyamanan orang-orang yang mengimplementasikan lexer. (Tidak, serius, itu saja. Berbagai bahasa punya alasan lain, tetapi akhirnya sampai pada itu.)
sumber
0flu
adalah literal dan0glu
pengenal lokal.int 0u = 5; unsigned int x = 0u;
Namun Anda memilih untuk mendefinisikan interpretasi kode ini (kemungkinan baik x == 0 atau x == 5), orang akan menjadi bingung karena ambiguitas. Bahkan jika itu sepele untuk mengimplementasikan kompiler dengan cara ini, seorang desainer yang baik kemungkinan tidak akan melakukannya.Pertimbangkan 2 kasus berikut:
Kasus 1
Mari kita asumsikan bahwa pengidentifikasi dapat dimulai dengan angka.
Jadi pernyataan seperti di bawah ini akan valid (karena pengidentifikasi dapat memiliki 1 atau lebih karakter):
Ketika saya mencoba menggunakan variabel di atas dalam suatu program, itu akan menghasilkan ambiguitas kompiler:
Dalam pernyataan itu
a=3
apa peran 3 (apakah itu variabel dengan nilai 5 atau itu angka 3)?Kasus 2
Berbeda dengan contoh di atas, mari kita asumsikan bahwa bahasa sebenarnya memungkinkan pengidentifikasi dimulai dengan angka sementara masih melarang angka digunakan sebagai pengidentifikasi. Ini dapat menyebabkan masalah berikut:
Aturan bahasa mengenai variabel yang mengatakan bahwa suatu variabel dapat terdiri dari 1 atau lebih karakter harus didefinisikan ulang menjadi aturan yang kompleks seperti: Sebuah variabel dapat memiliki satu atau lebih karakter dan harus unik jika tidak dimulai dengan angka sementara tidak boleh panjang karakter tunggal ketika mulai dengan angka (dll.)
Kompiler harus memeriksa dan melaporkan kasus kesalahan ketika semua angka (mis. 333) dan akhiran alfabet yang valid (mis. 34L) digunakan sebagai nama variabel. Dalam bahasa yang diketik secara longgar seperti Python dan JS di mana Anda dapat menggunakan variabel dengan cepat tanpa mendeklarasikannya, bahkan mungkin tidak mungkin untuk memeriksa kasus-kasus khusus yang melibatkan semua angka misalnya
if (33==5)
33. Tetapi kompiler tidak akan dapat mengidentifikasi ini dan melaporkan kesalahan.Membuat batasan ini akan mencegah programmer menggunakan angka sebagai nama pengidentifikasi.
sumber
int char = float
itu?int
adalah kata kunci dan bukan pengidentifikasi? Nah,int
memiliki prioritas lebih tinggi seperti halnya leksem numikal.int 3,a; 3=5; a=3;
Dalam pernyataan a = 3, apakah 3 ditafsirkan sebagai pengidentifikasi atau sebagai angka? Ini menyebabkan ambiguitas. Semoga ini jelas.Sebagian besar ini tidak ada hubungannya dengan membuatnya mudah bagi penulis kompiler dan efisiensi penguraian, tetapi, lebih berkaitan dengan merancang sintaks yang mendorong kode yang mudah dibaca dan tidak ambigu.
Para desainer bahasanya berpikir akan lebih baik untuk dapat menulis literal angka seperti angka 1 sebagai sekadar 1 .
Sangat mungkin untuk merancang sintaksis bahasa di mana literal numerik dikutip dalam beberapa cara misalnya tildas sehingga literal numerik untuk nomor satu dikodekan sebagai ~ 1 ~ dan segala sesuatu yang bukan kata kunci dan tidak dilampirkan dalam kutipan diperlakukan sebagai nama variabel .
Jadi Anda bisa membuat kode pernyataan seperti:
Tetapi juga:
Sintaks apa pun yang Anda pilih ambigu dan sulit diikuti kode tidak dapat dihindari.
Bahasa C dan sebagian besar bahasa "kurung keriting" diturunkan dari C juga menganggap itu ide yang baik untuk memungkinkan programmer untuk kode Oktal dan Hexadecimal literal secara langsung, dan, untuk menentukan jenis literal jika ini penting. Begitu
Jadi, bahkan jika Anda mengizinkan nama variabel dimulai dengan angka diikuti dengan kombinasi angka dan huruf yang menyertakan setidaknya satu huruf, Anda akan memberikan masalah pada programmer untuk memutuskan apakah suatu kelompok tertentu membentuk nama variabel atau literal numerik sehingga
Ambiguitas seperti itu tidak akan membantu siapa pun menulis atau membaca program.
Untuk contoh dunia nyata yang berhubungan dekat, Anda dapat melihat bahasa PL / 1 yang perancangnya berpikir bahwa menggunakan kata kunci sebagai nama variabel adalah ide yang bagus sehingga:
Adalah kode yang valid yang mengkompilasi dan mengeksekusi.
sumber
Fortran memiliki efek besar pada bagaimana bahasa dirancang nanti. Sejak awal (beberapa dari masalah ini telah diperbaiki) Fortran hampir tidak memiliki aturan yang membatasi nama apa yang dapat Anda berikan kepada pengidentifikasi. Ini membuat bahasa ini sangat sulit untuk diurai baik untuk kompiler maupun untuk programmer. Inilah satu contoh klasik:
Di sini saya telah menandai "kata kunci bahasa" dengan K dan pengidentifikasi (nama variabel) I. Mengingat bahwa tidak ada perbedaan dalam pengejaan, saya pikir Anda mungkin dapat memahami betapa membingungkannya hal ini. Tentu saja, ini adalah contoh ekstrem, dan tidak mungkin ada yang pernah menulis kode seperti ini dengan sengaja. Kadang-kadang orang melakukan "mendaur ulang" kata kunci bahasa sebagai nama pengidentifikasi - dan dalam banyak kasus kesalahan ketik sederhana dapat menghasilkan kode yang spek bahasa katakan harus diuraikan dengan cara ini, meskipun itu tidak dimaksudkan sama sekali. Untuk contoh terkenal lainnya, bandingkan ini:
untuk ini:
Yang pertama adalah do loop - mengulangi blok kode 10 kali. Namun, yang kedua telah mengubah koma ke titik desimal, sehingga memberikan nilai
1.10
ke variabel bernamado 10 i
.Ini juga berarti bahwa menulis parser Fortran relatif sulit - Anda tidak dapat memastikan bahwa
do
pada awal baris benar-benar kata kunci sampai Anda mencapai akhir baris, dan memverifikasi bahwa semua elemen lain dari sebuahdo
lingkaran hadir. Pengurai umumnya harus siap untuk "mundur", mem-parsing ulang garis dari awal untuk sampai pada jawaban yang "benar" (tetapi sering tidak disengaja) dari apa yang benar-benar ada.Setelah beberapa tahun ini, perancang bahasa (kebanyakan dari mereka) pergi ke arah yang berlawanan - membatasi hampir semua hal tentang bahasa sebanyak mungkin tanpa pengguna mengeluh terlalu banyak.
BASIC awal, misalnya, pada dasarnya mengatakan Anda bahkan tidak bisa menggunakan kata kunci sebagai bagian dari pengidentifikasi - misalnya,
fora=1
akan diuraikan sebagaifor a = 1
(yaitu, awal dari sebuahfor
loop, bukan tugas). Yang tampaknya menimbulkan cukup banyak keluhan yang tidak berlangsung lama. Aturan tentang memulai pengidentifikasi dengan digit tampaknya belum menghasilkan banyak keluhan, jadi terus digunakan (setidaknya dalam sebagian besar bahasa).sumber
Kemungkinan konvensi ini telah berevolusi dari keputusan desain bahasa sejarah yang sangat awal, seperti pada mesin awal seluruh kompiler, termasuk analisis leksikal, harus dijalankan dalam beberapa kWords, lebih sedikit memori daripada hanya cache data prosesor tingkat pertama pada perangkat seluler saat ini, jadi nama variabel yang diizinkan sangat terbatas, dan harus mudah dibedakan dari konstanta numerik dalam kode op yang sangat sedikit.
Dengan demikian, konvensi menjadi generasi generasi programmer yang biasa.
sumber
Ini bukan aturan logis yang diperlukan untuk bahasa pemrograman tetapi hanya konvensi yang digunakan oleh banyak perancang bahasa.
Saya dapat merancang bahasa yang sangat berbeda yang memungkinkan semua karakter untuk pengidentifikasi. Untuk semua baris kode, 20 karakter pertama akan menjelaskan tipe pernyataan lalu 20 karakter berikutnya akan menentukan simbol pertama untuk pernyataan, dan 20 karakter berikutnya adalah operan untuk pernyataan. Bahasa ini akan dieksekusi pada prosesor tumpukan.
Kode ini dapat diterjemahkan dalam C seperti di bawah ini:
Itu saja. Ini tidak ada artinya dan aturan no-number-in-identifiers juga tidak ada gunanya secara logis.
sumber
Selain "kenyamanan untuk lexer", saya pikir itu juga layak dipertimbangkan "kenyamanan bagi pembaca".
Saat membaca kode, Anda perlu dengan cepat dan berulang kali mengidentifikasi kata mana yang merupakan pengidentifikasi, dan mana yang angka. Mencari digit di awal lebih mudah pada pencocokan pola visual kami; itu akan menjadi tugas jika kita harus hati-hati memeriksa semua karakter untuk memastikan.
sumber
Jawaban atas pertanyaan ini terletak pada automata atau automata terbatas yang mendefinisikan ekspresi reguler. Aturannya adalah ... kompiler membutuhkan algoritma atau aturan yang tepat untuk memutuskan pada setiap karakter yang diuraikan. Jika pengidentifikasi diizinkan untuk memulai dengan angka maka kompiler akan dalam perbaikan..tentang sifat token yang akan datang ... apakah itu berupa angka atau pengidentifikasi ... dan sebagai kompiler tidak dapat mundur ke posisi sebelumnya .. .so..untuk memperjelas kepada kompiler bahwa token yang datang tepat merupakan pengidentifikasi atau angka ... pembatasan ini ada ... karena ini ... compiler tahu hanya dengan memindai karakter pertama bahwa token yang akan datang adalah pengidentifikasi atau angka.
sumber