Apakah sigils membuat kode sumber lebih mudah dibaca?

13

Di sebagian besar bahasa pemrograman, variabel tidak memiliki karakter pengidentifikasi seperti yang mereka lakukan di PHP. Di PHP Anda harus awalan variabel dengan $karakter.

Contoh;

 var $foo = "something";
 echo $foo;

Saya sedang mengembangkan bahasa scripting baru untuk aplikasi bisnis, dan target pengguna saya tidak memiliki latar belakang pemrograman. Apakah karakter ini membuat kode lebih mudah dibaca dan digunakan?

Salah satu alasan PHP menggunakan $adalah karena tanpanya PHP tidak dapat memberi tahu apakah nama adalah referensi fungsi atau referensi variabel. Ini karena bahasa memungkinkan referensi aneh untuk fungsi. Jadi $simbol membantu parser memisahkan namespace.

Saya tidak memiliki masalah ini di parser saya. Jadi pertanyaan saya murni pada keterbacaan dan kemudahan penggunaan. Saya telah mengkodekan selama bertahun-tahun dalam PHP sehingga ketika saya melihatnya $foomudah bagi saya untuk mengidentifikasi ini sebagai variabel. Apakah saya hanya memberikan preferensi bias ke pengidentifikasi ini?

Reactgular
sumber
19
IMO, kode lebih mudah dibaca tanpa sigils
John Dvorak
6
@ JanDvorak +1 untuk memberi saya kata baru hari ini. Saya akan mencoba menggunakan sigilstiga kali hari ini dalam percakapan.
Reactgular
6
IMO Tergantung apakah editor Anda memiliki penyorotan sintaksis.
CodeBeard
5
Jika Anda menggunakan var $x = ...atau type $x = ...kemudian saya pikir $ berlebihan. Jika Anda baru saja melakukannya $x = ...maka itu layak dilakukan. Terutama jika Anda tidak ingin mendukung penyorotan sintaks pada editor umum. Namun, sebagai preferensi, saya tidak sukasigils
CodeBeard
5
Sigil seperti notasi Hongaria yang dipaksakan
ratchet freak

Jawaban:

13

Kemungkinan dan keterbatasan teknis yang sebenarnya tidak seperti yang disarankan di seluruh utas ini. Mari kita bersihkan dulu.

Inilah yang dimungkinkan oleh $ dalam PHP:

  • Variabel variabel
  • Variabel dengan nama kata kunci misalnya $returnatau dapat menggunakan nama yang sama untuk variabel dan fungsi misalnya konstanta$__FILE__

Batasan atau fitur yang tidak terkait dengan $ awalan:

  • Implementasi dinyatakan tidak dapat membedakan antara fungsi dan variabel
  • Interpolasi string PHP atau sintaks template
  • Deklarasi variabel yang diperlukan

Itu berarti tidak ada alasan teknis yang tidak bisa Anda miliki

foo = "something";
echo foo;

atau

foo = "something";
echo "foo = $foo";
//would print
//foo = something 

Namun Anda tidak dapat memiliki (dengan asumsi returnkata kunci)

return = "something";

Tanpa komplikasi serius. Jika Anda menggunakan awalan seperti $, maka itu tidak akan menjadi masalah.

Itu pendapat tetapi saya percaya sigil akan layak untuk non programmer karena memungkinkan mereka untuk menggunakan kata kunci sebagai nama variabel, bagi mereka itu akan terlihat seperti batasan sewenang-wenang: P

Esailija
sumber
Tentang return = "something";, C # memiliki "kata kunci kontekstual", yang juga merupakan opsi yang patut dicoba saat merancang bahasa.
luiscubal
1
@luiscubal menulis bahwa dalam C # tidak mengejutkan memerlukan sigil, jadi jika Anda ingin kode itu dikompilasi, Anda perlu menulis @return = "something;". Ada sejumlah kata kunci kontekstual, ya, tetapi membuat semuanya kontekstual akan berarti implementasi yang jauh lebih rumit.
Esailija
7

Sigils sebenarnya jauh lebih masuk akal dalam perl, di mana mereka memberikan sejumlah jenis pemeriksaan. Dalam php mereka tidak banyak membantu di luar templating. Anda bisa merasakan kegunaan dan keterbacaannya dengan melihat-lihat berbagai bahasa. Hampir tidak ada yang menggunakannya.

Dalam bahasa target pengguna akhir yang sedang saya kerjakan, saya bahkan melangkah lebih jauh, membuat pengidentifikasi case sensitif dan memungkinkan spasi dan apostrof. Itu memungkinkan saya membuat nama variabel seperti Karl's heightitu lebih dekat ke bahasa alami.

Karl Bielefeldt
sumber
1
+1 untuk spasi dalam variabel, tapi saya tidak tahu cara mengimplementasikannya. Tidak yakin saya akan menemukan yang lebih mudah dibaca juga. Aku hanya tidak terbiasa dengan itu.
Reactgular
1
Aku suka gagasan itu. Tapi saya akan benci untuk menulis parser untuk bahasa dengan spasi di pengidentifikasi. :-)At Karl's for the night = true;
Martin York
Tetapi akan menarik untuk melihat semua standar ini yang kami tambahkan di bagian atas bahasa untuk membantu kami membacanya. Alih-alih diperiksa secara manual oleh alat eksternal tetapi menjadi bagian dari definisi bahasa. Dengan begitu kita tidak dapat memiliki argumen yang tidak berguna tentang nama pengenal dalam standar pengkodean (sebagaimana dalam bahasa tersebut).
Martin York
2
Ketidaksensitifan kasus memiliki masalah internasionalisasi. Jika Anda mengizinkan karakter dari banyak bahasa, Anda mungkin menemukan nama-nama yang "sama" di beberapa lokal, tetapi tidak di yang lain.
luiscubal
1
Mengizinkan spasi putih dalam variabel bukan masalah besar pada prinsipnya - itu hanya berarti aturan tata bahasa untuk pengidentifikasi yang memungkinkan banyak kata. Namun, itu berarti hal-hal lain tidak mungkin dalam tata bahasa tanpa menciptakan ambiguitas. Misalnya, di Haskell, map sumadalah panggilan fungsi yang diterapkan sebagian - fungsi sumdilewatkan sebagai parameter map. Tetapi keduanya hanyalah nama perpustakaan, jadi dengan pengidentifikasi multi-kata, kompiler tidak dapat mengetahui apakah map sumini merupakan pengenal multi-kata atau aplikasi fungsi berdasarkan pada dua pengenal satu kata.
Steve314
7

Bertahun-tahun yang lalu, saya belajar Applesoft Basic. String selalu sufiks dengan $dan array memiliki sufiks %. Itulah cara kerjanya. Anda melihat sesuatu, Anda tahu apa itu. Saya tidak pernah menyelidiki terlalu jauh ke dalam juru bahasa untuk memahami mengapa ini adalah kasus atau keputusan desain yang membuatnya begitu.


Sigil di php berasal dari pengaruh perlnya (yang dipengaruhi oleh awkdan sh). Sigil dalam perl sedikit lebih dari sekadar $karena dapat mengidentifikasi berbagai jenis:

  • $ skalar
  • @ daftar
  • % hash
  • & kode kunci
  • * typeglob

Sigil mengidentifikasi bagian struktur tabel simbol apa yang Anda lihat. Di belakang layar, entri tabel simbol untuk foo (diakses melalui *foo- typeglob) memiliki semua yang mungkin foo. Ada $foo, @foo, %foo, yang format yang foo , &foo, foo filehandle, dll ...

Ini juga memungkinkan membuat alias dari satu variabel ke variabel lain:

#!/usr/bin/perl

$foo = "foo";
@qux = (1,2);
*bar = \$foo;
*bar = \@qux;

print "$bar @bar\n";

Cetakan ini foo 1 2- di perl, ini adalah apa yang sigils yang benar-benar untuk, tidak bahwa Anda harus melakukan ini melainkan bahwa ada ini di balik hal adegan yang mereka lakukan.

Sigil tidak begitu banyak untuk dibaca, melainkan agar seseorang dapat memiliki $foodan @footanpa tabrakan di namespace (bandingkan bahasa lain di mana seseorang tidak dapat memiliki keduanya int foo; int[] foo;)


Sigils untuk keterbacaan adalah sesuatu yang dipelajari sebagai bagian dari bahasa apa pun - membaca sintaksis. Anda dapat, secara hipotetis, menegakkan tipe itu sendiri (sebagai notasi hungaria) untuk menjadi bagian dari pengidentifikasi.

Sesuatu dalam lex di sepanjang baris:

typeChar  [is]
capLetter [A-Z]
letter    [a-z]
digit     [0-9]
%%
{typeChar}{capLetter}(letter}|{digit})* { prientif("iddentifier");}
%%

Dan kemudian Anda dapat memiliki kode seperti

iFoo = 42;
sFoo = "a string";
iBar = iFoo * 2;

Saya tidak mengatakan ini adalah ide yang baik, tetapi seseorang yang terbiasa dengan bahasa akan dapat membaca ini secara asli dan berpikir bahwa itu meningkatkan keterbacaan sementara seseorang yang tidak terbiasa dengan bahasa mungkin berpikir bahwa itu hanya menambah banyak suara ke bahasa.

Namun, setelah bekerja dengan bahasa yang didefinisikan seperti ini, saya mungkin bisa membacanya tanpa kesulitan.

Beberapa orang menyukai mereka, beberapa orang tidak. Ada banyak perang suci di berbagai forum yang memperdebatkan hal ini dan itu benar-benar memengaruhi seberapa banyak Anda telah menggunakannya.

Orang bisa mendesain bahasa baru untuk non-programmer yang menggunakan sigils dan siapa pun yang belum pernah memprogram sebelumnya tidak akan pernah mengeluh sedikit pun tentang mereka. Di sisi lain, Anda tidak dapat memilikinya sebagai bagian dari bahasa dan kemudian memiliki programmer ruby ​​atau perl mengeluh bahwa mereka kehilangan beberapa informasi penting.

Itu tidak masalah. Yang penting adalah bagaimana sigils akan cocok dengan bahasa jika Anda menggunakannya atau tidak. Apakah Anda ingin dapat melakukan "123 $foo 456"atau harus melakukannya "123 " + foo + " 456"? Di sinilah keputusan harus dibuat.


sumber
1
Interpolasi string seperti "123 $foo 456"tidak diaktifkan oleh awalan sigil dan sepenuhnya ortogonal untuknya.
Esailija
1
Ini bagian dari interpolasi variabel dan tergantung pada bagaimana seseorang mem-parsing sebuah string. Sigils dapat membuatnya lebih mudah (dapat dilakukan dengan cara lain seperti yang ditunjukkan oleh Cara terbaik untuk melakukan interpolasi variabel dalam javascript? Tetapi itu bukan bagian dari bahasa inti. Sigils, bisa dibilang, membuatnya jauh lebih mudah untuk menulis dan memahami hal ini.
1
@MichaelT Tidak, fakta bahwa variabel memiliki awalan tidak membuat implementasi interpolasi string lebih mudah atau lebih sulit. Mereka hanya 2 hal yang sama sekali tidak terkait. Untuk pembaca manusia, itu mungkin pilihan yang baik untuk digunakan $asddalam sintaksis interpolasi string jika $sudah digunakan untuk awalan variabel, tetapi itu tidak ada hubungannya dengan kemungkinan aktual penerapan interpolasi string di tempat pertama.
Esailija
2
@Esailija dapatkah Anda menggambarkan bagaimana mereka tidak terkait? Sebagai tambahan, dari en.wikipedia.org/wiki/Variable_interpolation - "Bahasa yang mendukung interpolasi variabel termasuk Perl, PHP, Ruby, Tcl, Groovy, dan sebagian besar shell Unix. Dalam bahasa ini, interpolasi variabel hanya terjadi ketika string literal adalah kutip ganda, tetapi tidak ketika kutip tunggal. Variabel dikenali karena variabel dimulai dengan sigil (biasanya "$") dalam bahasa ini. "
@MichaelT Simbol dolar yang digunakan dalam awalan variabel dan interpolasi string sepenuhnya pilihan dangkal (yang hanya memiliki argumen keterbacaan, tidak ada hubungannya dengan implementasi, mungkin juga #yang digunakan dalam coffeescript misalnya. Dan coffeescript tidak awalan variabel dengan #- sebenarnya tidak awalan variabel sama sekali)
Esailija
3

Saya tidak setuju bahwa PHP menggunakan $ untuk membedakan vars dari funcs. Setidaknya karena PHP memiliki sintaks mirip C, dan funcs () memiliki parens setelah nama.

Baca posting ini di stack overflow tentang mengapa $ ada di PHP.

Banyak bahasa populer, seperti C, C ++, C #, Java tidak menggunakan $ dan kami dapat membedakan var dari fungsinya.

Dalam PHP $ help, misalnya, ketika Anda menulis: echo "var = $ var"

Tanpa $ trik seperti itu tidak akan mungkin.

Ruslan Zasukhin
sumber
+1 ah itu lebih masuk akal. Terima kasih.
Reactgular
3
Bahasa yang memiliki sigils tidak ada hubungannya dengan itu memiliki interpolasi string seperti pada contoh Andaecho "var = $var"
4
-1. Keanehan sintaksis PHP bukan karena beberapa batasan aktual tetapi karena aturan tata bahasa dirancang dengan sangat buruk, jika dirancang sama sekali. Inilah sebabnya mengapa mereka membutuhkan peretasan untuk mengaktifkan di fn()[]mana seperti dengan tata bahasa yang masuk akal yang akan bekerja di luar kotak tanpa memikirkannya.
Esailija
@viden Ya. Anda tidak dapat melakukan interpolasi string dengan aman tanpa cara untuk menunjukkan bagian string mana yang seharusnya dipetakan ke suatu variabel. Bahasa lain berakhir dengan apa yang saya anggap mengganggu / tidak perlu, seperti pemformatan string Python. Namun, ada beberapa keuntungan lain dalam PHP: RuslanZasukhin salah dalam mengatakan bahwa fungsi akan selalu ditunjukkan dengan parens, karena mereka juga dapat digunakan sebagai referensi.
Izkata
@Izkata Cara Anda menggunakan variabel dalam bahasa tidak ada hubungannya dengan sintaksis interpolasi string. Tapi itu tersirat dalam jawaban ini, maka -1 ...
Esailija
3

Setelah semua jawaban ini, saya ingin memberikan beberapa poin lagi kepada Mathew Foscarini.

  • Anda menganggap masalah sekarang sebagai "konstruktor bahasa". Anda mencoba memahami mengapa bahasa lain memiliki fitur ini atau itu untuk dipilih jika menggunakan sesuatu dalam bahasa Anda sendiri. Saya berada di posisi yang sama bertahun-tahun, karena mengembangkan parser SQL untuk Database Valentina kami.
  • Saya menyarankan Anda melihat antlr.org dan bahkan membaca buku dari Terence. Ini memiliki banyak hal bagus untuk pengembang bahasa.
  • Saya masih belum setuju dengan "alasan" yang diungkapkan oleh jawaban lain. Mereka berasumsi bahwa penulis PHP di kepala telah memutuskan untuk menggunakan $ untuk dapat menggunakan kata kunci yang dipesan dan lebih baik membedakan variabel dari non-variabel. Saya tidak berpikir begitu ... walaupun buktinya hanya bisa menjadi kisahnya sendiri.
  • Kemungkinan besar mereka hanya mengikuti perl dan lebih banyak bahasa awal. Seperti yang digarisbawahi Terrence, sebagian besar bahasa serupa, terutama di bagian LEXER. Dan biasanya konstruktor bahasa baru hanya dapat memilih bahasa apa yang akan ia kembangkan dan kemudian mengambil lexer dari tata bahasa itu. Dan inilah yang harus Anda lakukan sekarang. Tidak perlu menemukan dari awal. Dan saya bertaruh juga penulis PHP.
  • Semua yang disebutkan orang:
    • membedakan variabel dari yang bukan variabel
    • kata reserver sebagai nama variabel
    • kemampuan untuk menempatkan variabel di dalam string
    • mungkin yang lain (saya bukan ahli PHP)

adalah efek samping dari LEXER ini , karena ia mampu mengenali token.

Ambil contoh: dalam SQL kita menggunakan "" untuk dapat menggunakan pengidentifikasi dengan kata-kata yang dicadangkan dan bahkan pengidentifikasi dengan spasi "Nama Depan", "Nama Grup". GROUP adalah kata kunci. Ada masalah - ada solusi khusus.

PS Komentar yang sangat bagus dari MichaelT.

Ruslan Zasukhin
sumber
+1 terima kasih atas tautannya. Saya akhirnya menggunakan ini, tetapi tautan Anda terlihat jauh lebih baik. goldparser.org
Reactgular
Terima kasih juga atas tautan Anda. Saya belum pernah melihat parser emas ini sebelumnya. Terlihat juga menarik.
Ruslan Zasukhin
@RuslanZasukhin jika Anda membuat referensi untuk jawaban saya, saya tidak pernah mengatakan itu adalah niat pengembang untuk mengaktifkan kata kunci. Saya hanya mengatakan bahwa menggunakan kata kunci sebagai nama variabel menjadi mungkin secara teknis ketika variabel diawali dengan simbol seperti $. Juga "kemampuan untuk menempatkan variabel di dalam string" bukan karena variabel diawali dengan simbol seperti $. Artinya, "123 $foo 456"akan berfungsi jika bahkan jika sintaks variabel suka foo = 3atau @foo = 3. Mereka tidak berhubungan satu sama lain.
Esailija
3

... sigil memungkinkan untuk:

  • Lebih baik membedakan variabel dari non-variabel . Orang yang masih mempelajari konsep dasar mungkin mengalami kesulitan mencari tahu kata mana yang variabel dan mana yang tidak. Mereka sering memulai dengan membaca contoh atau kode orang lain tanpa latar belakang yang memadai.

  • Gunakan kata kunci yang dipesan atau nama fungsi sebagai nama variabel . Kadang-kadang saya menemukan beberapa nama-nama itu menjadi yang tepat untuk suatu variabel (yaitu $countketika ada count()fungsi yang ditentukan) dan berterima kasih kepada sigils karena mengizinkan saya untuk menggunakannya.

Saya juga sering melakukan itu menggunakan nama fungsi berulang kali, untuk memegang hasil fungsi dalam variabel throwaway, misalnya:

$isdir=isdir($dir);

if(/* complex condition implying $isdir */) {
/* etc */
}

ZJR
sumber
1
ZHR, apa artinya lebih baik? Dalam C ++ kami menulis semua variabel kami tanpa $ dan kami membedakannya dengan sempurna dan mudah. Contoh: {int z = 0; z = 55; z (z); } Dan di C ++ kita juga bisa menggunakan nama fungsi jika perlu menetapkan, misalnya pointer ke fungsi.
Ruslan Zasukhin
@RuslanZasukhin, Komputer buta huruf, Anda tahu? Coba ajari mereka C ++, Anda akan kagum.
ZJR
Juga: Saya tidak berpikir sigil harus selalu menjadi $pertanda. Saya ingat tanda dolar membingungkan saya ketika saya masih kecil karena asosiasi uang yang melekat. %mungkin menjadi alternatif yang layak.
ZJR