別の記号ではなくセミコロンが行末記号として選択された理由はありますか?
この決定の背景にある歴史を知り、その答えが将来の決定に影響を与える洞察につながることを願っています。
別の記号ではなくセミコロンが行末記号として選択された理由はありますか?
この決定の背景にある歴史を知り、その答えが将来の決定に影響を与える洞察につながることを願っています。
回答:
英語では、ステートメントのリスト内の項目を区切るためにセミコロンが使用されます。たとえば、
彼女は3人の男を見ました。ニュージーランドから来たジェイミー。牛乳屋の息子ジョン。とジョージ、慢な男。
プログラミングするとき、複数のステートメントを分離し、完全なストップを使用することは、小数点と簡単に混同される可能性があります。セミコロンを使用すると、通常の英語の句読点に近いままで、個々のプログラムステートメントを分離する解析しやすい方法が提供されます。
追加して編集
メモリが高価で処理が遅く、最初のプログラミング言語が考案されていた初期には、処理のためにプログラムを個別のステートメントに分割する必要がありました。一部の言語では、キャリッジリターンがステートメント区切り文字として機能できるように、各ステートメントを行に配置する必要がありました。他の言語では、テキストレイアウトにより自由な形式を使用できるため、特定の区切り文字が必要でした。この文字は、おそらく英語での使用との類似性のためにセミコロンとして選択されました(これは推測である必要があります;私は当時そこにいませんでした)そして、それは他の句読点との競合を生じなかったため数学的またはその他の構文上の目的に必要なマークと記号。
もう一度編集する
ターミネーター文字の必要性は、言語テキストを解析するための要件に戻ります。初期のコンパイラは、アセンブリ言語で、または場合によっては直接手作りのバイナリマシン命令で記述されていました。ステートメントの終わりを識別し、処理されるテキストのチャンクを区切る特殊文字を使用すると、処理がはるかに簡単になります。上記で述べたように、他の言語では復帰または括弧が使用されています。Algol、Pascal、Ada、BCPL、B、C、PL / M、およびその他の言語ファミリーでは、たまたまセミコロンが使用されています。誰がこの特定のキャラクターを最初に使用したかについては、私が覚えているほど歴史にさかのぼりません。その選択と採用は、
最後の発言として、これらの回答とコメントに費やした時間は、セミコロンを使用してこの方法で使用する最初の言語を設計するときにステートメントを終了することを決定するよりも多くあったと思います。
多くの言語は、Cをモデルにした構文を使用します(Bをモデルにした-@Crollsterに感謝します)。コメントからわかるように、このような言語の長いチェーンがあります... BはPL / Iに触発され、ALGOL ;
が区切り文字として使用されていました。
Cではステートメントの終了記号はであるため;
、これらの言語はそれに続きます。
なぜそれがCでステートメントターミネーターとして選ばれたのか-おそらく「相互依存ステートメントを示すために」英語での使用のため。
Cは、文字セットに使用できるメモリの量が限られていたPDP-11でも発明されたため、言語の発明者はこれらの制約内で作業する必要がありました。
FORTRANは、キャリッジリターンを使用してステートメントを記述しました。COBOLは期間を使用しました。LISPは何も使用せず、すべてに括弧を使用しました。ALGOLは、セミコロンを使用してステートメントを分離した最初の言語です。PASCALはセミコロンを使用してステートメントを分離し、ALGOLのリードに従いました。
PL / Iはセミコロンを使用してステートメントを終了しました。違いがあり、PASCALで簡単に確認できます。Adaは、ALGOLではなく、この1つの項目でPL / Iのリードに従いました。
ステートメントセパレーターまたはターミネーターとしてのセミコロンは、便利な表記法としてコンピューターサイエンスコミュニティですぐに受け入れられました。私の知る限り、後続のブロック構造化言語はすべて、ALGOLのリードに従い、セミコロンを使用してステートメントを分離または終了しました。
何年も前に、BCPLはセミコロンとキャリッジリターンの両方をステートメントの区切り記号/区切り記号として使用したと言われましたが、自分で言語を使用したことはなく、これを確認できません。ある時点で、ステートメントを分離または終了するためのキャリッジリターンの使用がBCPLの子孫から削除されました。BCPLはBを生み、BはCを生み、CはC ++、Java、Dを生み、PASCALやAdaよりも十分に考え抜かれていないものがたくさんあります。
なぜ他のシンボルはありませんか?
いくつかの言語では他の記号が使用されています。たとえば、古いバージョンのBASICでは代わりにコロンが使用されています。
ただし、いくつかの例外を無視すると、2つの主な理由があると思います。1つ目は、明確なものを単に探していることです。通常のパーサーでは、現在のステートメントの解析を続行できないほど深刻なエラーが発生した場合、通常はステートメントターミネーターまでスキップしてパーサーを再起動することで、パーサーの同期を取り戻そうとします。次のステートメントの始まり。そのためには、通常はコードの他の場所では発生しない何かが必要であり、セミコロンはたまたま他の意味がほとんど付与されていないシンボルであるため、この目的専用にするのは非常に簡単です。
2番目の理由はいくぶん似ていますが、コードを読んだり使用したりする人を対象にしています。繰り返しますが、実際に使用するシンボルはそれほど重要ではないという事実に戻ります。読者が特定の目的のために見慣れている記号を使用することで、可能な場合に、それを使用することで得られる読みやすさには大きな利点があります。これは、Cが完全な構文であることを意味するものではなく、他のすべてがそれに追従する必要があるという意味ではありませんが、その構文のスタイルに十分な人々が精通していることを意味します。ほぼ同じ構文です。
これは、他のほとんどのプログラムを設計するのとよく似ていることに注意してください。何らかのウィンドウを使用するプログラムを作成する場合は、ターゲットプラットフォームのネイティブ機能を使用するようにします。実施する決定の多くは大部分がarbitrary意的であり、機能を大幅に失うことなく異なる方法で行うことができますが、同様に、機能を大幅に向上させずにそれらを変更すると、ユーザーを混乱させるだけで有用なことはできません。同じ基本原則が、「言語のステートメントを終了する(または分離する)もの」に適用されます。「スクロールバーはどのように表示されるべきか」、または「ツリーコントロールはどのように機能しますか?」これらのすべての場合において、決定はほとんどarbitrary意的であり、均一性はそれ自体で実質的な利点を提供します。
プログラミングの前にはほとんどの人が慣れているような方法で、多くの言語で同じことが起こると付け加えます。なぜ誰もが「+」を使用して加算を示し、「-」を使用して減算を示すのですか?シンボルの形状は重要ではありませんが、各シンボルに同じ意味を適用することに同意する全員が重要です。
セミコロンは元々、Algol 60で終端記号ではなくステートメント区切り記号として提案されていました。
Algol 60より前は、存在する唯一の高水準プログラミング言語はFortranでした。Fortranでは、各ステートメントを別々の行に置く必要がありました。doループのように、複数行にわたるステートメントは奇妙と見なされ、「ステートメントブロック」と見なされました。
Algol 60の設計者は、ステートメントが階層構造(if-then-else、do-loop、caseステートメントなど)を必要とし、それらが相互にネストできることを認識しました。したがって、各ステートメントが別々の行にあるという考えは、もはや意味をなさない。フォームS1のステートメントの順次構成。S2; ...; Snはオプションでbegin - end括弧で囲まれ、複合ステートメントと呼ばれ、Algol 60で想定されているステートメントの階層構造に適合します。したがって、ここではセミコロンは明らかにターミネーターではなくステートメントセパレーターです。
これにより、実際に問題が発生しました。Algol 60には、何も記述しないことで示される「空のステートメント」もありました。したがって、セミコロンがS1を終了しているように表示される「begin S1; end」と書くことができます。しかし、Algol 60コンパイラーは、S1とそれに続く目に見えない空のステートメントとの間のセパレーターとして実際にそれを扱いました。これらの微妙さは、実際のプログラマーにとっては少々多かった。AssemblyやFortranのような行指向言語に慣れていた彼らは、セミコロンをステートメントの終止符として本当に考えていました。プログラムが書き出されると、通常、セミコロンがステートメントの最後に置かれます。
a [i]:= 0; i:= i + 1
セミコロンは最初のステートメントの終端文字のように見えました。プログラマーがセミコロンをターミネーターとして扱った場合、次のようなステートメントは構文エラーになります。
i> 0の場合 a [i]:= 0; 他に a [i]:= 1;
セミコロンが「if」を終了するため、「else」がぶら下がります。プログラマーは完全に混乱していました。
そのため、IBMの行指向Fortranの後継であるPL / Iは、セミコロンをセパレーターではなくステートメントターミネーターにすることを決定しました。プログラマーはその選択に満足していました。プログラミング言語の大部分がそれに続きました。(Pascalはこの傾向に抵抗しましたが、後継のAdaはそれをあきらめました。)
[注記追加:プログラミング言語の比較に関するウィキペディアの記事には、さまざまなプログラミング言語でのセミコロンの処理方法をまとめた表があります。]
これはかなり純粋な推測作業ですが、ASCII値に制限された標準のQWERTYキーボードを見ると、終了/分離の自然な文字は。!?、:;になります。およびキャリッジリターン。それらの!?:複数のキーを取得するために直ちに失格する必要があり、ステートメントの終了は非常に一般的なことです。ピリオドは小数点と容易に混同されるため、初期コンピューターのスペースが限られているため、ピリオドは不必要にターミネーターになるために失格になります。コードの行が画面上の1行に表示できる長さよりも長くなる可能性がある場合、キャリッジリターンは失格となります。または、次の行に継続を作成するために追加の文字が必要になるため、再び複雑になります。これは去ります; これらのオプションは、書面でより頻繁に使用されます。セミコロンが選択されるのは、入力が簡単で、意味が制限された文字に意味を追加し、特殊ケースが実際には使用されないので複雑ではないため、混乱が少ないためです。
セミコロンが選ばれたのは、それが怠inessさとシンプルさに基づいた最高のキャラクターだったからです。
それは主にarbitrary意的な選択です。一部の言語は他の選択を行っています。COBOLは、.
文字でステートメントを終了します。FORTRAN、BASIC、およびPythonは通常、ステートメントを改行で終了します(複数行ステートメント用の特別な構文を使用)。そして、Lispはその文を括弧で囲んでいます。
主な理由;
は、ステートメントの区切り記号/終了記号として非常に人気があります。今日の人気のある言語のほとんどは、その規則を使用したALGOLに基づいているからです。
別のシンボルの代わりに?
他にどんなシンボルを選ぶことができますか?
ASCII文字#$ @ [] ^ _ `{|}〜は、ISO 646のような初期の文字エンコーディングに常に存在するとは限りませんでした。
()*+-/<=>
通常、文字は数学演算子として使用され、ステートメントのターミネータとして使用された場合、解析のあいまいさが生じます。
product = a * b * // If '*' were a statement terminator,
c * d * // Are there two factors, or four?
同様の問題はとに適用され'
、"
通常は文字列の区切り文字として使用されます。,
、通常は関数の引数を分離する.
ために使用され、、通常は小数点として(またはのような構造の区切り文字として)使用されsome_struct.some_field
ます。
それは去り!%&:;?
ます。
選択する!
か、?
おそらく技術的な問題を引き起こすことはありませんが、英語の意味はプログラムに間違った雰囲気を与えます。
print(x)? # Yes, you should.
# It's an IMPERATIVE language; stop questioning my commands.
print(x)! # OK! You don't have to shout!
これ&
は、文の区切り記号(終端記号ではない)としてより賢明な選択です。
do_thing_a() &
do_thing_b()
事のAを行うためのコマンドとして読み取ることができますし、次いで事B.しかし、ほとんどの言語を行う&
オペレータは、論理的またはビット単位としてそれを使用すると代わりに。
この%
記号は、(予想されるの代わりにinterest_rate = 2.99%
変数を設定する)などのステートメントで混乱を引き起こす可能性があります。もちろん、よく知られている数学的な意味は、Cを剰余演算子として使用することを止めませんでした。2.99
0.0299
%
だから、葉:
と;
。
:
は賢明な選択であり、実際にBASICのほとんどの方言で行内ステートメント区切り文字として使用されます。
しかし;
、英語の文法は側面にあります。文内の句を区切るために使用できます。
あなたの見出しの質問に答えるのではなく、あなたの暗黙の質問に集中する方が良いと思います:
この決定の背景にある歴史を知り、その答えがプログラミング言語の設計と実装における将来の決定に影響を与える洞察につながることを願っています。
プログラミング言語の設計と実装の歴史について学び、プロセスについてより深い洞察を得たい場合は、プログラミング言語の歴史会議の議事録を始めるのに非常に良い場所です。(ただし、議事録にアクセスするにはACMメンバーシップが必要だと思います。)
多くのプログラミング言語のステートメントがセミコロンで終了するのはなぜですか?別の記号ではなくセミコロンが行末記号として選択された理由はありますか?
あなたの見出しの質問をHOPLの手順を読んで答えたいと思うかもしれない質問の例として、私は次の点を提供したいと思います:新しいプログラミング言語を設計する人々は、彼らが知っているものを考慮するので、通常そうします壊れた/不足している。彼らの新しい言語は、一方で、この欠陥を修正するように設計されています。一方、言語設計者は、他の言語からデザイン要素をコピーすることもできます。または、問題が発生しなかった要素を変更しません。
特にその最後の部分は重要です:代わりに他のプログラミング言語の多くは、あなたはおそらくなかったの言語を見て、多くを学びます、というコピーされた理由は、プログラミング言語は、これまでのターミネータとしてセミコロンを使用する最初の一つであったとされて見つけることを試みるのではないコピーそれ。たとえば、SmalltalkはSimulaから多くのインスピレーションを得ましたが、構文、特にステートメントターミネータとしてのセミコロンの使用をコピーします。ターミネータ(実際にはセパレータ)を完全なストップに変更し、セミコロンを他の何かに使用します。逆に、ステートメントターミネータとしてセミコロンを使用した最初の言語には、それ以前の言語で使用されていたものからこれを変更する理由があった可能性があります。また、ステートメントターミネータの概念全体を導入した(または他の言語とは独立して導入した)最初の言語であり、セミコロンが何らかの理由で使用され、現在では失われている可能性もあります。(他の回答者は誰もセミコロンが良い選択であった理由について改造された仮定を提供するのではなく、セミコロンを導入した人からの引用を掘り下げることができなかったため、後者がここに当てはまると思います。)ポイント、言語デザイナーが物事をコピー/保持した理由ではなく、物事を変更した理由を見ると、もっと学ぶことができると思います。人々がたいてい物事を変更するとき、彼らはたいていその変更を説明する必要がありますが、物事をコピーしたり同じものにしたりするときはそうしません。それがまさにその方法なのです!」
その可視性について。
初期のステートメント区切り文字は「。」でした COBOLおよび改行の場合と同様、FORTRANの復帰改行。
CRは、複数行にわたるステートメントのフローを困難にするという点で制限があります。
完全停止は、より興味深い問題を引き起こしました。脳がサブリミナルレベルでフルストップを処理する英語のテキストを読むとき、文章が終了したことを意識し、息を止めることができますが、実際には気づきません。それが合図した。また、多くのフォントでは「。」は、可能な限り最小の文字であり、単一ピクセルとしてレンダリングされる場合があります。欠落または余分な期間が、COBOLプログラムのエラーの最も一般的な原因になりました。
そのため、初期の誤りから学ぶことで、ALGOLは特定のターミネーターを選択します。このターミネーターは、ステートメントが複数の行にわたって流れることを可能にし、人間の読者が目に見えて簡単に気付くものを選びました。セミコロンは、一般的な英語では無意識に処理されないほど大きく、珍しいものです。
キャリッジリターン/改行以外の明示的なステートメントターミネータが必要なため、選択されたのは私の理解でした。80列の画面の時代には、実際には1行のコードが複数行にまたがっていたため、ステートメントターミネータに\ rまたは\ nを使用しても機能しませんでした。
セミコロンは、ロジック/数学ステートメントで使用されていないため便利です。そのため、それらはステートメントの実際の内容とは大幅に矛盾しません。
個人的には、80文字未満の行を維持するためのスタイル要件とともに、セミコロンの継続的な使用は、率直に言って愚かで時代錯誤だと思います。pythonのような言語は、理解しやすく簡潔なコードをより簡単に記述できることを広く実証しています。また、80文字より長い行に問題がある場合は、より大きなモニターが必要です。
私は間違っているかもしれませんが、これは多くのアセンブラーでコメントを開始するためにセミコロンが使用され、通常は命令の後に置かれたという事実と関係があると思います。aの後のすべて;
はコメントであり、命令自体の一部ではなくなりました。
次に、インタープリターで入力するときに指示を終了する必要があります。Enterキーを押すだけで短い命令(数式など)を終了し、式を計算する準備ができて結果を生成したことをインタープリターに伝えることができます。ただし、命令に複数行のコードを入力したい場合があります。そのための1つの方法は、Enterキーだけに依存するのではなく、特殊文字を命令の終了文字として使用することです。この方法では、Enterはまだインタープリターに送信していないため、ユーザーは一度に複数行のコードを入力できます。インタプリタがEnterで入力された行で終了文字を見つけた場合にのみ、最終的に実行して結果を計算します。
これらの2つのことを組み合わせると、終了文字のセミコロンは明らかな選択のように見えます。命令部分の終了位置とコメント部分の開始位置を示すため、インタープリターが行内で遭遇すると、フラッシュできることを認識しています。命令が終了したばかりなので、これまでバッファリングしていた式のすべての行を実行します。今はコメントになっています(次の行はコードで始まるため、少なくともこの行の最後までです)もう一度モード、新しい式/命令を開始します)。
もちろん、これは、命令ターミネーターとして再利用するというこのアイデアを思いついた人がコメントに使用したのは、実際にはセミコロンだったと仮定しています。それが他のキャラクターだったので、別の命令ターミネーターで終わるかもしれません。
Inb4:いいえ、これは歴史的な説明ではありません。これがセミコロンが生き返った実際の方法であるという証拠はありません。それは私がそれがおそらく起こったかもしれないと想像する方法です。
ほとんどの言語はセミコロンを使用しました。セミコロンはすでにその目的で広く使用されており、変更が意味をなさないためです。
そして、その選択をする最初の言語を考慮して、代替手段を検討する必要があります。言語を設計するとき、必要な文字を使用可能にしたい場合、この時点の文字セットは6ビットでコード化され、多くの場合、いくつかのパターンが予約され、多くの場合、一部の文字がしっかりと定義されていません(これについては、 ISO-646の国家の変異体は-米国のバリアントはよく名前のASCIIの下に知っている- 「共通」などの文字のコードを再利用する[
、#
または$
、唯一の半分のコード位置がある場合のコンテキストで効果を確認します利用可能で、それらの半分以上を予約する文字と数字)。
おそらく他として直感的に文の区切り文字として使用できる文字(ありました.
おそらく既にその基準のための唯一の深刻な候補である)と構文解析と字句の理論は精緻にまだあった時に字句や構文解析の困難を導入せずには(.
今ではありません実数で使用するため問題ありません)。