コンピュータ言語設計 において、ストロッピングとは、文字列をキーワード、特定の種類の変数、または記憶場所など、特別な特性を持つものとして明示的にマークし、通常の名前(「識別子」)とは異なる名前空間に配置することで、衝突を回避する手法です。ストロッピングは、ほとんどの現代言語では使用されていません。キーワードは予約語であり、識別子として使用できません。ストロッピングにより、同じ文字列をキーワードと識別子の両方に使用できるようになり、その場合の解析が簡素化されます。例えば、変数名がifキーワードifと衝突することなく使用できます。
ストロッピングは、 1960年代のALGOLおよび関連言語で主に使用されていました。現代でも一部で使用されていますが、表面的には似ている他の類似の手法と混同されやすいです。
ストロッピングの方法と「ストロッピング」という用語は、 1960年代のALGOLの開発で生まれました。出版言語では、ハードウェア言語で直接表現できない印刷上の区別(太字や下線)を表現するために使用されました。タイプライターには太字の文字がありますが、パンチカードのエンコードでは太字の文字はありませんでした。「ストロッピング」という用語は、 ALGOL 60で「アポストロフィ」に由来しており、ALGOL 60の実装によっては、キーワードifを表現するなど、太字を示すためにテキストをアポストロフィで囲んでいたためです[ 1 ] 。ストロッピングはALGOL 68でも重要であり、「ストロッピング方式」と呼ばれる複数のストロッピング方法が使用されています。 ALGOL 60のオリジナルの対応するアポストロフィは広く使用されず、先頭にピリオドまたは大文字が付く方が一般的でした。[ 2 ]またはのように、「ストロッピング」という用語はこれらすべてに適用されました。 'if'.IFIF
ストロッピングにはさまざまな構文が使用されています。
'BEGIN')。'BEGIN)[ 4 ]実際、1つの言語内で複数のストロッピング規約が使用されることがよくありました。例えば、ALGOL 68では、ストロッピング規約の選択はコンパイラ指示子(ALGOL用語では「プラグマット」)によって指定できます。具体的には、POINT、UPPER、QUOTE、またはRESです。
.FOR77 でも同様の規則が使用されており、LOGICAL キーワードは.EQ.次のようにストロップされます(下記参照)。FOR通常の識別子には小文字が使用されます。'for'for予約されており、通常の識別子には使用できません。さまざまなルール体制は、ストラッピングされた文字の語彙仕様ですが、場合によっては、これらには単純な解釈があります。単一のアポストロフィとドットの体制では、最初の文字はエスケープ文字として機能し、一致するアポストロフィの体制では、文字列リテラルの場合と同様に、アポストロフィは区切り文字として機能します。
その他の例:
underlinedキーボードのバックスペースとオーバーストライクを使用して入力するか、 で導入するか、区切り文字なしで入力するか(「uppercasedelimiters」モード。この場合はすべての変数を小文字にする必要があります) でした。%percent %symbolUPPER CASE%percent %symbolプレフィックス規則を継承したが、その他のストロッピングオプションは継承していない。先頭のpr ( pragmatの略)ディレクティブ(それ自体は POINT または引用符スタイルでストロップされています) と¢for コメント (" " から2¢) に注意してください。詳細については、「ALGOL 68: pr & co: Pragmats and Comments」を参照してください。
| Algol68 は、通常公開されている 「厳密な」 | 引用の削除( wikitextなど) | 7ビット文字コードコンパイラ の場合 | 6ビット文字コードコンパイラ の場合 | Algol68 で res stropping (予約語) を使用する |
|---|---|---|---|---|
¢ 下線または太字の書体 ¢モードxint = int ; xint sum sq:=0; for i while 合計平方≠70×70 する 合計 sq+:=i↑2 od | 'pr' 引用符 'pr' 'mode' 'xint' = 'int'; 'xint' 合計平方:=0; 「〜のために」と「〜の間」 合計平方≠70×70 'する' 合計 sq+:=i↑2 「od」 | . PRアッパー.PR モード XINT = INT; XINT 合計平方:=0; しばらくの間 合計平方/=70*70 する 合計 sq+:=i**2 外径 | 。PRポイント.PR .モード.XINT = .INT; 。XINT SUM SQ:=0; 。私のために。 合計平方NE 70*70 。する SUM SQ .PLUSAB I .UP 2 . OD | . PR RES .PR モード .xint = int; . xint合計sq:=0; しばらくの間 合計平方≠70×70 する 合計 sq+:=i↑2 od |
様々な理由から、Fortran 77には以下の「論理」値と演算子があります: .TRUE.、、、、、、、、、、、、、、、[ 5 ].FALSE..EQ..NE..LT..LE..GT..GE..EQV..NEQV..OR..AND..NOT.
.AND..OR.また、JP Softwareの4DOS、[ 6 ] 4OS2、4NT / Take Commandなどのコマンドラインプロセッサで実行されるバッチファイル内のステートメントとステートメントの.XOR.組み合わせテストでも使用されます。 IFIFF
現代のコンピュータ言語のほとんどはストロッピングを使用しません。ただし、一部の言語では、予約語と衝突する識別子や英数字以外の文字を含む 識別子を指定するために、オプションのストロッピングをサポートしています。
例えば、Microsoft .NET共通言語基盤(CLI) で多くの言語を使用する場合、呼び出し元の言語ではキーワードとなる可能性のある変数を、別の言語で使用できるようにする手段が必要です。これは、C# のようにプレフィックスを付けたり、 Visual Basic.NET@のように識別子を括弧で囲んだりすることで実現されることがあります。
2つ目の大きな例は、構造化照会言語(STRC)の多くの実装です。これらの言語では、予約語を語彙的に区切ることで、列名、テーブル名、または変数名として使用できます。標準規格では予約語を二重引用符で囲むことが規定されていますが、実際には実装によって正確な仕組みは異なります。例えばMySQLでは、予約語をバッククォートで囲むことで他のコンテキストでも使用できますが、Microsoft SQL Serverでは角括弧を使用します。
Nim、R、[ 7 ]、Scala [ 8 ]などのいくつかの言語では、予約語や英数字以外の名前をバッククォートで囲むことで識別子として使用することができます。
他にも、より小さな例がいくつかあります。例えば、Web IDLでは、予約語と衝突する識別子を、先頭のアンダースコア_でストロップします。識別子の値によってこの先頭のアンダースコアが削除されるため、これは命名規則ではなくストロップ処理となります。[ 9 ]
コンパイラのフロントエンドでは、アンストロッピングは元々、最初の行再構成フェーズで行われ、これによっても空白が削除されていました。その後、スキャナなしの構文解析(トークン化なし)が続き、これは 1960 年代、特に ALGOL で標準でした。現代の使用では、アンストロッピングは一般に字句解析の一部として行われます。字句解析器をスキャナと評価の 2 つのフェーズに区別すれば、これは明らかです。スキャナはストロッピングされたシーケンスを正しいカテゴリに分類し、評価は値を計算するときにアンストロッピングを行います。たとえば、予約語との衝突を避けるために識別子をストロッピングするために最初のアンダースコアが使用される言語では、シーケンスはスキャナによって_if(予約語ではなく)識別子として分類されif、評価はこれに値 を与えてif、(Identifier, if)トークン型と値 を生成します。
類似の手法は数多く存在し、一般的には識別子の接頭辞または接尾辞を付けることで異なる処理を示しますが、その意味は様々です。厳密に言えば、ストロッピングとは、同じ名前(値)を異なる名前空間で異なる表現にすることであり、トークン化の段階で行われます。例えば、ALGOL 60では、対応するアポストロフィのストロッピングにより、は'if'(キーワード、if)とトークン化されますが、は(識別子、if)とトークン化されます。つまり、if異なるトークンクラスで同じ値であることを意味します。
キーワードに大文字を使用することは、字句解析および構文解析の文法を記述するための規則として引き続き使用されています。予約語をifトークン クラス IF としてトークン化し、if-then-else 節を という句で表します。IF Expression THEN Statement ELSE Statementここで、大文字の用語はキーワードであり、大文字の用語は生成規則内の非終端記号です(終端記号は、整数リテラルの場合はまたは のように小文字の用語で示されます)。 identifierinteger
最も緩い方法としては、衝突を避けるために命名規則if_を使用することもできます。一般的には、または のように、先頭または末尾にアンダースコアを_then付けます。先頭のアンダースコアは、オブジェクト指向プログラミングにおいてプライベートメンバーを示すためによく使用されます。
これらの名前はコンパイラによって解釈され、何らかの効果を持つ場合がありますが、これは通常、トークン化フェーズではなく、意味解析フェーズで行われます。例えば、Pythonでは、先頭に1つのアンダースコアがあると、弱いプライベートインジケータとして扱われ、モジュールのインポート時にどの識別子がインポートされるかに影響します。一方、クラス属性の先頭に2つのアンダースコア(末尾に1つ以下のアンダースコア)があると、名前マングリングが呼び出されます。[ 10 ]
現代の言語では、キーワードと識別子を区別するために、一般的にストロッピングではなく予約語を使用しますが (例: ifreserved を作成します)、識別子の構文クラスをキーワードとして予約することも頻繁に行われ、ストロッピング方式として解釈できる表現が生成されますが、代わりに予約語の意味を持ちます。
これは C で最も顕著で、アンダースコアで始まる識別子は予約済みですが、どの識別子がどのスコープで予約されているかという正確な詳細が関係しており、先頭の二重アンダースコアは任意の用途に予約されています。[ 11 ]同様に C++ では、二重アンダースコアを含む識別子は任意の用途に予約されていますが、アンダースコアで始まる識別子はグローバル空間で予約されています。[注 1 ]fooしたがって、予約語を使用して新しいキーワードを追加できます__foo。これは表面的にはストロッピングに似ていますが、意味が異なります。予約語であるため、文字列は共通の識別子名前空間の__foo識別子を表します__foo。ストロッピング (キーワードの前に を付ける__) では、文字列は別のキーワード名前空間の__fooキーワードを表します。したがって予約語を使用すると、とのトークンは (識別子、__foo) と (識別子、foo) となり、同じカテゴリの異なる値になりますが、ストロッピングでは、とのトークンは(キーワード、foo) と (識別子、foo) となり、異なるカテゴリの同じ値になります。これらは、プログラマーにとっては同じ方法で名前空間の衝突という同じ問題を解決しますが、正式な文法と実装の点では異なります。 foo__foofoo__foofoo
名前マングリングも識別子の名前を変更することで名前の衝突に対処しますが、これはトークン化の段階ではなく、コンパイルのかなり後の段階、つまり意味解析の段階で行われます。これは、スコープと型情報を含む名前を作成することから成り、主にリンカーが使用することで衝突を回避し、名前自体に必要な意味情報を含めることを目的としています。このような場合、元の識別子は同一でもコンテキストが異なる場合があります。たとえば、関数 と ではfoo(int x)、foo(char x)どちらも識別子 は同じfooですがシグネチャが異なります。これらの名前は、たとえばfoo_iやにマングリングされてfoo_c、型情報が含まれるようになります。
構文的には似ているものの、意味的に異なる現象として、変数の特性を示すシギルがあります。シギルはBASIC、Perl、Ruby、その他多くの言語で変数/定数の特性を識別するためによく使用されます。BASIC と Perl では変数の型を指定するために、Ruby では変数と定数を区別するとともにスコープを示すために使われます。ただし、これは変数の意味に影響を与えるものであり、識別子かキーワードかという 構文には影響を与えないことに注意してください。
ストロッピングは、コンピュータプログラミング言語において、コンパイラ(より厳密にはパーサー)の作業を簡素化するために使用されます。これは、20世紀初期のコンピュータ処理能力が比較的小型で低速だったコンピュータの性能範囲内で実現されます。しかし、同様の手法は人間の読解力向上にも広く用いられてきました。例えば、以下のようなものがあります。
「ストロッピング」と呼ばれる、太字テキストとローマン体テキストを区別する手法によって引き起こされます。実装によっては、太字テキストの前後にアポストロフィを必要とするもの(ストロッピングという名称の由来)もあれば、バックスペースと下線を必要とするものもあります。[...]
{{cite journal}}:引用は一般的なタイトルを使用します(ヘルプ)