В разработке компьютерного языка строппинг — это метод явной маркировки последовательностей букв как обладающих особым свойством, например, ключевым словом или определенным типом переменной или местом хранения, и, таким образом, находящимися в пространстве имен, отличном от обычных имен («идентификаторов»). , чтобы избежать столкновений. Строппинг не используется в большинстве современных языков — вместо этого ключевые слова являются зарезервированными и не могут использоваться в качестве идентификаторов. Строппинг позволяет использовать одну и ту же последовательность букв как в качестве ключевого слова, так и в качестве идентификатора , и в этом случае упрощает синтаксический анализ — например, позволяет использовать переменную if
без конфликта с ключевым словом if .
Строппинг в первую очередь ассоциируется с АЛГОЛом и родственными языками 1960-х годов. Хотя он находит современное применение, его легко спутать с другими похожими методами, которые внешне похожи.
Метод строповки и термин «строппинг» возникли при разработке АЛГОЛА в 1960-х годах, где он использовался для обозначения типографских различий (жирный шрифт и подчеркивание), обнаруженных в языке публикации, которые не могли быть непосредственно представлены на аппаратном языке - На пишущей машинке могли быть жирные символы, но при кодировании на перфокартах жирных символов не было. Термин «стропинг» возник в АЛГОЛе 60 от « апострофа », поскольку в некоторых реализациях АЛГОЛа 60 апострофы использовались вокруг текста для обозначения жирного шрифта, [1] например, 'if'
для обозначения ключевого слова if . Строппинг также важен в АЛГОЛе 68 , где используются несколько методов стропинга, известные как «режимы стропинга»; исходные совпадающие апострофы из АЛГОЛа 60 не получили широкого распространения, причем более распространенными были начальная точка или прописные буквы, [2] как в .IF
или, IF
и ко всем из них применялся термин «стропинг».
Для обрезки использовался ряд различных синтаксисов:
'BEGIN'
).'BEGIN
) [4]На самом деле часто в одном языке могло использоваться несколько соглашений о стропинге. Например, в АЛГОЛе 68 выбор соглашения об ограничении может быть определен директивой компилятора ( в терминологии АЛГОЛА « прагматом »), а именно POINT, UPPER, QUOTE или RES:
.FOR
– аналогичное соглашение используется в FORTRAN 77, где ключевые слова LOGICAL обрезаются как .EQ.
и т. д. (см. ниже)FOR
строчные буквы используются для обычных идентификаторов.'for'
for
зарезервированы и недоступны для обычных идентификаторов.Различные режимы правил представляют собой лексическую спецификацию сокращенных символов, хотя в некоторых случаях они имеют простую интерпретацию: в режимах с одним апострофом и точкой первый символ функционирует как escape-символ , тогда как в режиме совмещенных апострофов апострофы функционируют как разделители , как в строковых литералах .
Другие примеры:
underlined
с использованием возврата и зачеркивания на клавиатуре Flexowriter , они могли вводиться с помощью %percent %symbol
, или их можно было вводить UPPER CASE
без символа-разделителя (режим «разделители в верхнем регистре», и в этом случае все переменные должны были быть быть в нижнем регистре).%percent %symbol
соглашение о префиксе Atlas Autocode, но не другие его параметры обрезки.Обратите внимание на ведущую директиву pr (аббревиатура от pragmat ) , которая сама по себе заключена в стиль POINT или кавычки, а также на for comment (от " ") — подробности см . в разделе ALGOL 68: pr & co: Pragmats and Comments .¢
2¢
По разным причинам в Фортране 77 есть эти «логические» значения и операторы: .TRUE., .FALSE., .EQ., .NE., .LT., .LE., .GT., .GE., .EQV., .NEQV., .OR., .AND., .NOT.[5]
.AND., .OR.а .XOR.также используются в комбинированных тестах IF
и IFF
инструкциях в пакетных файлах , запускаемых под процессорами командной строки JP Software , такими как 4DOS , [6] 4OS2 и 4NT/Take Command .
Большинство современных компьютерных языков не используют строппинг. Однако некоторые языки поддерживают необязательное ограничение для указания идентификаторов, которые в противном случае могли бы конфликтовать с зарезервированными словами или содержать небуквенно-цифровые символы.
Например, использование многих языков в инфраструктуре общего языка .NET (CLI) Microsoft требует способа использования переменных на другом языке, которые могут быть ключевыми словами на вызывающем языке. Иногда это делается с помощью префиксов, например, в C#, или заключения идентификатора в квадратные скобки в Visual Basic.NET .@
Второй важный пример можно найти во многих реализациях языка структурированных запросов . В этих языках зарезервированные слова могут использоваться в качестве имен столбцов, таблиц или переменных путем их лексического разграничения. Стандарт определяет заключение зарезервированных слов в двойные кавычки, но на практике точный механизм зависит от реализации; MySQL , например, позволяет использовать зарезервированные слова в других контекстах, заключая их в обратные кавычки, а Microsoft SQL Server использует квадратные скобки.
В нескольких языках, включая Nim , R , [7] и Scala , [8] зарезервированное слово или небуквенно-цифровое имя можно использовать в качестве идентификатора, заключая его в обратные кавычки .
Есть и другие, более мелкие примеры. Например, Web IDL использует ведущее подчеркивание _
для ограничения идентификаторов, которые в противном случае конфликтуют с зарезервированными словами: значение идентификатора удаляет это ведущее подчеркивание, создавая такое сокращение, а не соглашение об именах. [9]
В Haskell окружение имени функции обратными кавычками приводит к тому, что она анализируется как инфиксный оператор .
Во внешнем интерфейсе компилятора отмена первоначально происходила на этапе начальной реконструкции строки , что также устраняло пробелы. Затем последовал анализ без сканирования (без токенизации); это было стандартом в 1960-х годах, особенно для АЛГОЛА. В современном использовании разблокировка обычно выполняется как часть лексического анализа . Это становится ясно, если разделить лексер на две фазы сканера и вычислителя: сканер относит сокращенную последовательность к правильной категории, а затем вычислитель снимает ограничение при вычислении значения. Например, в языке, где начальное подчеркивание используется для ограничения идентификаторов во избежание конфликтов с зарезервированными словами, последовательность _if
будет классифицирована if
сканером как идентификатор (а не как зарезервированное слово), а затем оценщик присвоит ей значение if
, (Identifier, if)
в качестве типа и значения токена.
Существует ряд подобных методов, обычно с добавлением префикса или суффикса к идентификатору для обозначения другого обращения, но семантика различна. Строго говоря, строппинг состоит из разных представлений одного и того же имени (значения) в разных пространствах имен и происходит на этапе токенизации. Например, в АЛГОЛе 60 с совпадающим удалением апострофов 'if'
токенизируется как (Ключевое слово, if), а if
токенизируется как (Идентификатор, если) — одно и то же значение в разных классах токенов.
Использование прописных букв для ключевых слов по-прежнему используется в качестве соглашения для написания грамматик для лексического анализа и синтаксического анализа – токенизация зарезервированного слова if
как класса токена IF, а затем представление предложения if-then-else фразой, IF Expression THEN Statement ELSE Statement
где термины в верхнем регистре являются ключевыми словами, а термины, написанные с заглавной буквы, являются ключевыми словами. нетерминальные символы в продукционном правиле ( терминальные символы обозначаются строчными буквами, например identifier
или integer
для целочисленного литерала ).
Проще говоря, можно использовать соглашения об именах, чтобы избежать конфликтов, обычно добавляя префикс или суффикс подчеркивания, как в if_
или _then
. Ведущее подчеркивание часто используется для обозначения частных членов в объектно-ориентированном программировании.
Эти имена могут интерпретироваться компилятором и иметь некоторый эффект, хотя обычно это делается на этапе семантического анализа, а не на этапе токенизации. Например, в Python одно ведущее подчеркивание является слабым частным индикатором и влияет на то, какие идентификаторы импортируются при импорте модуля, тогда как двойное ведущее подчеркивание (и не более одного завершающего подчеркивания) в атрибуте класса вызывает искажение имени . [10]
Хотя современные языки обычно используют зарезервированные слова, а не ограничение, чтобы отличить ключевые слова от идентификаторов (например, делая if
зарезервировано), они также часто резервируют синтаксический класс идентификаторов в качестве ключевых слов, создавая представления, которые можно интерпретировать как режим ограничения, но вместо этого имеют семантику зарезервированные слова.
Это наиболее заметно в C, где идентификаторы, начинающиеся с подчеркивания, зарезервированы, хотя точные сведения о том, какие идентификаторы зарезервированы и в какой области задействованы, а ведущие двойные подчеркивания зарезервированы для любого использования; [11] аналогично в C++ любой идентификатор, содержащий двойное подчеркивание, зарезервирован для любого использования, а идентификатор, начинающийся с подчеркивания, зарезервирован в глобальном пространстве. [nb 1] Таким образом, можно добавить новое ключевое слово, foo
используя зарезервированное слово __foo
. Хотя внешне это похоже на строппинг, семантика другая. В качестве зарезервированного слова строка __foo
представляет идентификатор __foo
в пространстве имен общего идентификатора. При обрезке (путем добавления к ключевым словам префикса __
) строка __foo
представляет ключевое слово foo
в отдельном пространстве имен ключевых слов. Таким образом, используя зарезервированные слова, токены для __foo
и foo
являются (идентификатор, __foo) и (идентификатор, foo) – разные значения в одной и той же категории – в то время как при сокращении токенов для __foo
и foo
являются (ключевое слово, foo) и (идентификатор, foo) – одинаковые ценности в разных категориях. Они решают одну и ту же проблему конфликтов пространств имен одинаковым для программиста способом, но различаются с точки зрения формальной грамматики и реализации.
Искажение имен также устраняет конфликты имен путем переименования идентификаторов, но это происходит гораздо позже при компиляции, во время семантического анализа, а не во время токенизации. Это заключается в создании имен, включающих информацию об области действия и типе, в первую очередь для использования компоновщиками, чтобы избежать конфликтов и включить необходимую семантическую информацию в само имя. В этих случаях исходные идентификаторы могут быть идентичными, но контекст различен, как в случае функций foo(int x)
и foo(char x)
, в обоих случаях имеющих один и тот же идентификатор foo
, но разную сигнатуру. Эти имена могут быть изменены на foo_i
и foo_c
, например, для включения информации о типе.
Синтаксически похожее, но семантически другое явление — это сигилы , которые вместо этого указывают свойства переменных. Они распространены в BASIC , Perl , Ruby и различных других языках для определения характеристик переменных/констант: BASIC и Perl для обозначения типа переменной, Ruby для различения переменных от констант и для указания области действия. Обратите внимание, что это влияет на семантику переменной, а не на синтаксис того, является ли она идентификатором или ключевым словом.
Строппинг используется в языках программирования, чтобы облегчить работу компилятора (или, точнее, синтаксического анализатора ), то есть в пределах возможностей относительно небольших и медленных компьютеров, доступных на заре вычислительной техники в 20 веке. Однако подобные методы широко используются и для улучшения понимания прочитанного людьми. Некоторые примеры:
Более серьезные проблемы создает «обрезание» — метод, используемый для различения текста, выделенного жирным шрифтом, от текста, написанного латиницей. Некоторые реализации требуют апострофов вокруг жирного шрифта (отсюда и сокращение имени); другие требуют возврата и подчеркивания; [...]
{{cite journal}}
: Cite использует общий заголовок ( справка )