Почему $ в именах идентификаторов для многих языков?


15

Многие языки сценариев, такие как Perl, Awk, Bash, PHP и т. Д., Используют знак $ перед именами идентификаторов. Я пытался выяснить, почему, но так и не получил удовлетворительного ответа.


10
Возможно, из-за последнего шага в бизнес-планах большинства программистов - ... прибыль!
Одед

2

Ответы:


4

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

Это, вероятно, вопрос минимизации того, сколько вы должны набрать. В большинстве языков программирования большинство из того, что вы вводите, будут ключевыми словами (из небольшого фиксированного набора) и именами вещей, которые были объявлены; имеет смысл использовать только имя для тех. Строковые литералы заключены в кавычки (одинарные или двойные), чтобы различать их синтаксически.

В интерактивной оболочке большинство набираемых вами вещей будут именами команд и имен файлов, поэтому иметь недекорированную форму для них имеет смысл. Имена переменных используются не так часто, поэтому перед ними $стоит простой способ их различить.

Продольный , $что некоторые основы используют для строковых переменных (в отличие от числовых переменных), вероятно , вдохновения , как хорошо.

Выбор Perl для использования $в качестве скалярных переменных, несомненно, был вдохновлен такими оболочками, как оболочка Bourne, и ранние версии Perl обычно рассматривали голые слова как строковые литералы ( print FOOи print "FOO"были эквивалентны). Это использование голых слов не рекомендуется в более современных версиях Perl, но сигилы остаются и в основном используются для различения различных типов переменных. Возможно, если бы Perl разрабатывался с нуля, скалярные переменные можно было бы обозначить «пустым знаком», но этого не произошло.

(Кстати, Awk не использует сигилы. У него есть $синтаксис, но он относится к номерам полей. NFЭто число полей; $NFэто последнее ( NFth) поле.)



14

Знак $ в имени переменной является частным случаем «Sigil». Еще в первые годы существования BASIC (1964 или около того) $ использовался для обозначения имен строковых переменных. Я предполагаю, что поскольку компиляторам легче отделять имена переменных от остальной части грамматики, используя некоторый символ, и, поскольку это было общим для BASIC, его использование прогрессировало. Тем не менее, это не единственный используемый.


2
$Строк (и %для целых чисел) в Basic был суффикс , а не префикс, по крайней мере , в (нестандартном) вариантах я был нанесен с. Конечно, это не так важно - суффикс и префикс довольно поверхностны, по крайней мере, с точки зрения компиляторов и лексического анализа. Там может быть небольшая разница с точки зрения читабельности.
Steve314

Кстати, одна из причин, по которой он работал в Basic, в том, что там был очень ограниченный диапазон типов, и не было пользовательских типов, поэтому требовался только очень ограниченный диапазон сигил. Использование Perl отличается - хотя для меня это было давно, поэтому я не могу вспомнить детали.
Steve314

@ steve314, вы абсолютно правы A $ = ... Спасибо, что заметили это.
NoChance

5

AWK?

Иногда называется символом , обычно используется для перевода имен переменных (и других) в значения.


5

Похоже, это происходит от BASIC, где суффикс $ указывает на строковую переменную, и также произносится как «строка». Например, INKEY $ произносится как «в ключевой строке».

Но почему знак доллара? Ну, $ выглядит как S для строки. И согласно Википедии :

Поскольку знак доллара является одним из немногих символов, который, с одной стороны, почти повсеместно присутствует в компьютерных наборах символов, но, с другой стороны, редко требуется по своему буквальному значению в компьютерном программном обеспечении, символ $ используется на компьютерах. для многих целей, не связанных с деньгами.

(Соответственно, на несколько долларов больше на телике, когда я набираю это.)


2

Почему нет? Проще написать лексер, который может сказать, что идентификатор будет переменной (и, следовательно, легче написать синтаксический анализатор), особенно для интерпретируемого языка. Что касается того $, почему , это, вероятно, во многом традиция - один из создателей раннего языка, использующего конструкцию (Bash? Или, скорее, предшественник к ней), использовал его по любой причине, и последующие языки приняли его.


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