コンピュータ言語の設計
において、ストロッピングとは、文字列がキーワード、特定の種類の変数、またはストレージ場所などの特別なプロパティを持つように明示的にマークし、通常の名前 (「識別子」) とは異なる名前空間に存在するようにすることで、衝突を回避する方法です。ストロッピングはほとんどの現代言語では使用されていません。代わりに、キーワードは予約語であり、識別子として使用できません。ストロッピングにより、同じ文字列をキーワードと識別子の両方として使用できるようになります。その場合の解析が簡単になります。たとえば、変数の名前がifキーワードifと衝突しないようにできます。
ストロッピングは、主に 1960 年代のALGOLおよび関連言語に関連付けられています。現代でも使用されていますが、表面上は似ている他の類似のテクニックと混同されやすいです。
歴史
ストロッピングの方法と「ストロッピング」という用語は、1960年代のALGOLの開発中に生まれました。当時は、ハードウェア言語で直接表現できない出版言語の印刷上の区別(太字と下線)を表現するために使用されていました。タイプライターは太字の文字を使用できますが、パンチカードのエンコードでは太字の文字はありません。「ストロッピング」という用語は、 ALGOL 60で「アポストロフィ」に由来しています。ALGOL 60の実装によっては、キーワードif を表現するために、太字を示すためにテキストをアポストロフィで囲んだためです。 [1]ストロッピングはALGOL 68でも重要であり、そこでは「ストロッピング方式」と呼ばれる複数のストロッピング方法が使用されています。ALGOL 60の元の一致するアポストロフィは広く使用されておらず、先頭のピリオドまたは大文字がより一般的でした。
[2]または'if'.IFIF
構文
ストロッピングにはさまざまな構文が使用されています。
- ALGOL 60 では、一般的にはアポストロフィとして単語を一重引用符で囲む規則のみが使用されていたため、「ストロッピング」という名前が付けられました (例
'BEGIN')。 - ALGOL 68 [3] [2]のいくつかの実装では、一重引用符 ' で始まる文字列をキーワードとして扱います(例:
'BEGIN)[4]
実際、1 つの言語内で複数のストロッピング規則が使用される場合がよくありました。たとえば、ALGOL 68では、ストロッピング規則の選択は、コンパイラディレクティブ(ALGOL 用語では「プラグマット」)、つまり POINT、UPPER、QUOTE、または RESによって指定できます。
- 6 ビットの場合は POINT (小文字には文字数が足りない)
.FOR。FORTRAN 77 でも同様の規則が使用されており、LOGICAL キーワードは.EQ.次のようにストロップされます (下記参照)。 - UPPERは7ビット、つまり
FOR通常の識別子には小文字を使用する。 - ALGOL 60のQUOTEのように、
'for' - RES予約語は、現代の言語で使用されているように、
for予約されており、通常の識別子には使用できません。
さまざまなルール レジームは、ストロップされた文字の語彙仕様ですが、場合によっては、解釈が単純になります。単一のアポストロフィとドットのレジームでは、最初の文字がエスケープ文字として機能しますが、一致するアポストロフィのレジームでは、アポストロフィは、文字列リテラルの場合のように、区切り文字として機能します。
その他の例:
- Atlas Autocode には 3 つの選択肢がありました。キーワードは、Flexowriter
underlinedキーボードのバックスペースとオーバーストライクを使用して入力するか、 で開始するか、区切り文字なしで入力するか(「大文字区切り」モード。この場合、すべての変数を小文字にする必要があります) です。%percent %symbolUPPER CASE - Elliott 803およびElliott 503コンピュータのALGOL 60では下線が使用されていました。フレキソライター (パンチ紙テープを生成) には非移動キー (下線 _) があり、_b_e_g_i_n と入力すると非常に読みやすいbeginが生成されました。縦棒 | も非移動キーであったため、|= と入力すると ≠ によく似た値が生成されました。
- English Electric KDF9上のALGOL 60用の Kidsgrove コンパイラは、引用符に加えて、感嘆符とパーセント文字という少なくとも 2 つの他のストロッピング規則を使用していたようです。
- ALGOL 68RSプログラムでは、1 つの言語プロセッサ内であっても、複数のストロッピング バリアントの使用が許可されています。
- Edinburgh IMPはAtlas Autocodeの
%percent %symbolプレフィックス規則を継承しましたが、その他のストロッピングオプションは継承していません。
さまざまなALGOL 68スタイルの例
先頭のpr ( pragmatの略)ディレクティブ(それ自体は POINT または引用符スタイルでストロップされています) と¢for コメント (" " から2¢) に注意してください。詳細については、「ALGOL 68: pr & co: Pragmats and Comments」を参照してください。
その他の言語
様々な理由により、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 つ目の大きな例は、 Structured Query Languageの多くの実装です。これらの言語では、予約語を語彙的に区切ることで、列名、テーブル名、または変数名として使用できます。標準では予約語を二重引用符で囲むように指定されていますが、実際には正確なメカニズムは実装によって異なります。たとえば、 MySQLでは、予約語をバックティックで囲むことで他のコンテキストで使用できます。Microsoft SQL Server では角括弧を使用します。
Nim、R、[7]、Scala [8]などのいくつかの言語では、予約語や英数字以外の名前をバックティックで囲むことで識別子として使用することができます。
他にも、よりマイナーな例があります。たとえば、Web IDL では、予約語と衝突する識別子をストロップするために先頭のアンダースコアを使用します_。識別子の値によって先頭のアンダースコアが削除され、これが命名規則ではなくストロップになります。[9]
その他の目的
Haskellでは、関数名をバッククォートで囲むと、関数名が中置演算子として解析されます。
コンパイラによるアンストロッピング
コンパイラのフロントエンドでは、アンストロッピングは元々、最初の行再構築フェーズで行われ、これによっても空白が削除されていました。その後、スキャナなしの解析(トークン化なし)が続き、これは 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つ以下)は、名前マングリングを呼び出します。[10]
予約語
現代の言語では、キーワードと識別子を区別するために、一般的にストロッピングではなく予約語を使用しますが (たとえば、if予約語を作成する)、識別子の構文クラスをキーワードとして予約することも頻繁に行われ、ストロッピング方式として解釈できる表現が生成されますが、代わりに予約語の意味を持ちます。
これはCで最も顕著で、アンダースコアで始まる識別子は予約されていますが、どの識別子がどのスコープで予約されているかという正確な詳細が関係しており、先頭の二重アンダースコアは任意の用途に予約されています。[11]同様にC++では、二重アンダースコアを含む識別子はすべて任意の用途に予約されていますが、アンダースコアで始まる識別子はグローバル空間で予約されています。[注 1]fooしたがって、予約語 を使って新しいキーワードを追加することができます__foo。これは表面的にはストロッピングに似ていますが、意味は異なります。予約語として、文字列 は共通識別子名前空間の__foo識別子を表します。__fooストロッピング(キーワードの前に を付ける__)では、文字列は別のキーワード名前空間の__fooキーワードを表します。したがって、予約語を使用すると、と のトークンは(識別子、__foo) と (識別子、foo) であり、同じカテゴリの異なる値ですが、ストロッピングでは、と のトークンは (キーワード、foo) と (識別子、foo) であり、異なるカテゴリの同じ値です。これらは、プログラマーにとっては同じ方法で名前空間の衝突という同じ問題を解決しますが、正式な文法と実装の点では異なります。
foo__foofoo__foofoo
名前のマングリング
名前マングリングも、識別子の名前を変更することで名前の衝突に対処しますが、これはコンパイルのかなり後の方、トークン化の際ではなく、意味解析のときに行われます。これは、主にリンカーが使用するためのスコープと型情報を含む名前を作成することで構成され、衝突を回避するとともに、名前自体に必要な意味情報を含めます。これらの場合、元の識別子は同一でもコンテキストが異なります。たとえば、関数foo(int x)とではfoo(char x)、どちらも同じ識別子 を持ちますが、シグネチャが異なります。これらの名前は、たとえば、型情報を含めるため
に やにfooマングリングされることがあります。foo_ifoo_c
シジル
構文的には似ているものの、意味的に異なる現象として、変数のプロパティを示すシギルがあります。これらは、 BASIC、Perl、Ruby、およびさまざまな他の言語で変数/定数の特性を識別するためによく使用されます。BASIC と Perl では変数の型を指定し、 Ruby では変数と定数を区別してスコープを示すために使用されます。これは変数の意味に影響するものであり、識別子であるかキーワードであるかの 構文には影響しないことに注意してください。
人間の言語における類似点
ストロッピングは、コンピュータープログラミング言語で、コンパイラー(またはより厳密にはパーサー) の作業を容易にするために、つまり、20 世紀のコンピューターの初期の頃に利用可能だった比較的小型で低速なコンピューターの能力の範囲内で使用されます。ただし、同様の手法は、人間の読解力を助けるためにも一般的に使用されています。いくつかの例を次に示します。
- 重要な単語を太字で表示します。[12]たとえば、このページの冒頭にあるストロッピングの最初の言及などです。これは、ストロッピングを定義することがまさにこのページの目的だからです。
- 新しい単語がテキストに初めて登場するときには、イタリック体[13]で書式設定します。これは、SFやファンタジーで架空の植物、食べ物、生き物を紹介するとき、旅行記や歴史書で馴染みのない外国語を説明するときなどによく使用されます。また、ドイツ語の単語にはゴシック体[14]フォントを使用するなど、その言語に関連付けられている可能性のある特別なフォントを使用することもあります。
- 技術用語を表すために、通常はラテン語やギリシャ語などの別の言語を使用します。これは予約語の使用に似ていますが、読みやすくするために通常は斜体のテキストと組み合わせられます。例:
- 植物や動物の典型的な二名法[15]または「ラテン語名」は、読者が「Erithacus rubecula 」がErithacus rubeculaの特別な学名であることを理解するのに役立ちますが、「Red-breasted European thrush」ではそうではありません。
- 多くの法律用語では、短いラテン語のフレーズが、 habeas corpus、sub judice、in loco parentisなどのように、膨大な法律や判例を指す。[16]
- QED、アプリオリ、その逆などの論理および数学用語...
- 日本語の書き言葉では、漢字に加えて、同じ音を表す2つの異なる文字(より厳密には音節文字)であるひらがな[17] [18]とカタカナ[19] が、それぞれ音声的に綴られた日本語の単語と外来語を区別するために使用されています。また、カタカナは英語のイタリック体のように強調にも使用されます。
参照
注記
- ^ アンダースコアで始まり大文字が続く識別子など、他の制限もあります。
参考文献
- ^ King, Peter R. 編 (1974-06-18)。「(不明)」。ALGOL 68 実装に関する国際会議の議事録。マニトバ大学コンピュータサイエンス学部、ウィニペグ: マニトバ大学、コンピュータサイエンス学部: 148。ISBN 9780919628113.
より深刻な問題は、太字テキストとローマン テキストを区別するために使用される手法である「ストロッピング」によって発生します。実装によっては、太字の前後にアポストロフィが必要です (ストロッピングという名前はここから来ています)。他の実装では、バックスペースと下線が必要です。 [...]
{{cite journal}}:引用は一般的なタイトルを使用します (ヘルプ) - ^ ab van Wijngaarden、アドリアン;バリー・ジェームス・マイルー;ジョン・エドワード・ランスロット・ペック;コルネリス・ヘルマナス・アントニウス・コスター;シンツォフ、ミシェル[フランス語] ;チャールズ・ホジソン・リンジー;ランベール・ギョーム・ルイ・テオドール・メルテンス;フィスカー、リチャード G. 編(1976年)。 「セクション 9.3 表現」(PDF)。アルゴリズム言語 ALGOL 68 に関する改訂レポート。スプリンガー・フェルラーグ。 94、123ページ。ISBN 978-0-387-07592-1. OCLC 1991170. 2019年4月19日にオリジナルからアーカイブ(PDF)されました。2019年5月11日閲覧。
- ^ http://www.fh-jena.de/~kleine/history/languages/Algol68-RR-HardwareRepresentation.pdf [リンク切れ]
- ^ リンジー、チャールズ・ホジソン;ファン デル ムーレン、シエツェ G. (1977)。ALGOL 68 の非公式の紹介。北オランダ。 348–349ページ。ISBN 978-0-7204-0726-6. OCLC 230034877.
- ^ 「論理構造」。
- ^ Brothers, Hardin; Rawson, Tom ; Conn, Rex C .; Paul, Matthias R.; Dye, Charles E.; Georgiev, Luchezar I. (2002-02-27). 4DOS 8.00 オンライン ヘルプ。
- ^ R コア チーム、引用: 引用、R Foundation for Statistical Computing。
- ^ Odersky, Martin (2011-05-24)、Scala 言語仕様バージョン 2.9
- ^ Web IDL、「3.1. 名前」。[...] これらのすべての構成要素において、識別子は、先頭の U+005F LOW LINE ("_") 文字 (アンダースコア) を 1 つ削除した識別子トークンの値です。[...] 注 [...] 先頭の "_" は、識別子が予約語のように見えないようにするために使用されます。これにより、たとえば、"interface" という名前のインターフェイスを定義できます。先頭の "_" は、識別子をエスケープ解除するために削除されます。[...]
- ^ PEP 008: 記述的: 命名スタイル
- ^ C99標準、7.1.3 予約済み識別子
- ^トワイマン、マイケル。「大胆なアイデア : 19世紀における大胆な書体の使用」。印刷歴史協会誌。22 (107–143)。
- ^ トラス、リン(2004)、Eats、Shoots & Leaves:The Zero Tolerance Approach to Punctuation、ニューヨーク:Gotham Books、p. 146、ISBN 978-1-59240-087-4
- ^ 「手書きのスタイル」。デンマーク国立公文書館。2017年3月26日閲覧。
- ^ 「生物の学名の書き方」(PDF)、Competition Science Vision 、 2011年6月20日閲覧。
- ^ Google ブックスで分類され、図解された法格言集
- ^ Dual 大辞典
「平」とは何気なかった、やさしいという意図で、当時普通に使用する文字体系で意味することを意味する。 漢字は書簡文や重要な文章などを書く場合に置かれる公的な文字であるのに対して、平仮名はあった漢字の知識に乏しい人々
などがいる私的な性格のもので。当時(名前が付けられた当時)、それは日常的に使用される文字体系でした。漢字は手紙や重要な文書に使用される公式の体系でしたが、ひらがなは漢字の知識が限られている人々による個人的な使用に使用されていました。 - ^ 「日本の書道」ブリタニカ百科事典。 2017年6月22日閲覧。
- ^ 「ひらがな、カタカナ、漢字」。日本語の単語の文字。2010年9月8日。 2011年10月15日閲覧。
さらに読む
- Hansen, WJ; Boom, HJ (1978). 「改訂版 ALGOL 68 の標準ハードウェア表現に関するレポート」. Acta Informatica . 9 (2): 105–119. doi :10.1007/BF00289072. S2CID 34231916.
- リンゼイ、チャールズ・ホジソン(1970 年 3 月)、「ALGOL 68 の ISO コード表現」、ALGOL 速報(31)、ACM:37–60、AB31.3.6
