Чому в іменах ідентифікатора $ настільки багато мов?


15

Багато мов сценаріїв, такі як Perl, Awk, Bash, PHP тощо, використовують знак $ перед іменами ідентифікаторів. Я намагався шукати, чому, але ніколи не мав задовільної відповіді.


10
Можливо, через останній крок у бізнес-планах більшості програмістів - ... прибуток!
Одід

2
Цікавий допис про ТА щодо того ж питання: Чому змінні Perl потрібно починати з $,%, @ (sigils)
Бред Крісті

Відповіді:


4

Шкаралупа Борна або його попередник, ймовірно, був джерелом конвенції. Оболонки, як правило, використовують $fooдля позначення змінної оболонки або змінної середовища, тоді як просто fooприймається як буквальна рядок (яка може бути ім'ям команди, ім'ям файлу або просто словом, яке передається іншій команді).

Мабуть, справа в тому, щоб мінімізувати, скільки потрібно вводити. У більшості мов програмування більшість того, що ви вводите, буде ключовими словами (з невеликого фіксованого набору) та назвами речей, які були оголошені; має сенс використовувати лише ім’я для тих. Лінійні рядки вкладаються у лапки (одинарні чи подвійні), щоб їх синтаксично розрізнити.

В інтерактивній оболонці більшість речей, які ви вводите, будуть іменами команд та іменами файлів, тому мати необмежену форму для них має сенс. Імена змінних використовуються не так часто, тому передувати їх $- це простий спосіб їх розрізнення.

Наслідком того, $що деякі BASIC використовують для рядкових змінних (на відміну від числових змінних), ймовірно, було також натхненням.

Вибір Perl використовувати $для скалярних змінних, безсумнівно, був натхненний оболонками, такими як оболонка Борна, та ранніми версіями Perl, що зазвичай розглядаються баревами як строковими буквами ( print FOOі print "FOO"були еквівалентними). У сучасних версіях Perl це використання перехідних мов було вимкнено, але сигіли залишаються і в основному використовуються для розрізнення різних типів змінних. Можливо, якби Perl розроблявся з нуля, скалярні змінні можуть бути позначені "порожнім знаком", але цього не сталося.

(BTW, Awk не використовує sigils. У нього є $синтаксис, але він посилається на номери полів. NFЦе кількість полів; $NFце останнє (це NF) поле.)


3
Просто сторонне позначення: оболонка Борна (1977) , BASIC (1964) .
Стівен Євріс

14

Знак $ у назві змінної - це особливий випадок "Sigil" , ще в перші дні BASIC (1964 або більше) $ використовувався для позначення імен змінних рядків. Я думаю, оскільки компіляторам полегшує відокремлення імен змінних від решти граматики, використовуючи якийсь символ, а оскільки це було загальноприйнято для BASIC, його використання прогресувало. Однак це не єдине, що використовується.


2
Строки $для (і %для цілих чисел) у Basic були суфіксом, а не префіксом, принаймні у (нестандартних) варіантах, які мені завдавали. Зрозуміло, що це не так важливо - суфікс проти префікса є досить поверхневим, принаймні, що стосується компіляторів та лексичного аналізу. Можливо, є незначна різниця в частині читабельності.
Steve314

BTW - одна з причин, що вона працювала в Basic, полягає в тому, що існував дуже обмежений діапазон типів, і не було визначених користувачем типів, тому потрібен був лише дуже обмежений діапазон сигіл. Використання Perl відрізняється, хоча зараз пройшло багато часу для мене, тому я не можу реально згадати деталі.
Steve314

@ steve314, ви абсолютно правильні A $ = ... Дякую, що помітили це.
NoChance

5

awk?

Іноді називається sigil , зазвичай використовується для перекладу імен змінних (та інших) у значення.


5

Це, мабуть, бере початок у BASIC, де суфікс $ вказує на змінну рядка, а також вимовлявся як "рядок". Наприклад, INKEY $ вимовляється "у рядку ключів".

Але чому знак долара? Ну, $ виглядає трохи як S для рядка. А згідно з Вікіпедією :

Оскільки знак долара є одним з небагатьох символів, який, з одного боку, майже повсюдно присутній у комп’ютерних наборах символів, але, з іншого боку, рідко потрібен у їх буквальному значенні в межах комп'ютерного програмного забезпечення, символ $ використовується на комп'ютерах для багатьох цілей, не пов'язаних з грошима.

(Відповідно, на кілька доларів більше , ніж на телевізорі, коли я це набираю.)


2

Чому ні? Простіше написати лексер, який може сказати, що ідентифікатор буде змінною (і, отже, простіше написати парсер), особливо для інтерпретованої мови. Щодо того $, це, мабуть, багато в чому традиція - хтось із творців ранньої мови, що використовує конструкцію (Баш? Або, швидше за все, її попередник), використовував її з будь-якої причини і наступні мови її прийняли.


1
Це може не зробити лексери та аналізатори набагато простішими для написання, але це виключає вимогу до зарезервованих слів.
TomG
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.