理論的ではない実用的なプログラミング言語には予約キーワードがありませんか?


22

予約済みのキーワードを持たない実用的なプログラミング言語を探してきましたが、見つけることができませんでした。

私は自分の教育とエンターテイメントのためにプログラミング言語に取り組んでおり、まだキーワードを含める必要はありません。それが私の検索と質問につながった理由です。

コンパイラの作成者にとっては、この言語のエンドユーザーにとって重要であるとは思いません。コンピュータは、コンテキストから意味を推測できるほど強力になりました。作家が小説を書くときに名詞や動詞などにラベルを付ける必要があるのは、プログラマが関数や変数にfunction x() {}or set x = 1またはvar x = 1etcなどのラベルを付ける必要がある理由だけです。ステートメントのコンテキストから、それが関数宣言または呼び出しである、またはラベルが値への割り当てまたはそのラベル値への参照であると推測できる場合

ここに私の現在のパーサーが何をしているかの具体的な例として、通常の束だろう一般的な事柄をサポートするために予約されたキーワードが不要で、ノイズのようなfuncまたはfunctionまたはdecまたはものではありませんが。

関数宣言

sum3(a,b,c) -> a + b + c.

関数呼び出し

x = sum3(1,2,3).

xという名前の匿名関数

x = (a,b,c) -> a + b + c.
y = x(1,2,3).

成功するプログラミング言語にとってキーワードがなぜ重要なのか知りたいのですが。


8
Forthは非常に実用的であり、キーワードはありません。
SKロジック

4
@JamesAnderson、いいえ、それらは単なる言葉であり、他のすべての言葉と同じです。特別な意味はまったくありません。
SKロジック

7
演算子と句読点は「キーワード」としてカウントされますか?はいの場合、構文を定義できないため、言語が存在しない可能性があります。
エミリオ

2
@ SK-logic:通常。しかし、まだトークン化しない場合の「識別子」とは何ですか?トークンは「認識可能な文字列」であるため、構文規則が与えられる前は、「int」、「myvalue」、および「+」は違いません。「+」が演算子として定義されていない場合、他のユニコードの単一文字列のようなものの単なる名前になります。演算子は、純粋な構文の観点では、「単一文字のキーワード」にすぎません。
エミリオガラヴァリア

2
この文脈で、キーワードとは何ですか?コンパイラにとって特別な意味を持つ識別子ですか?プログラマーが変数などとして使用すべきではない識別子ですか?キーワードを特別に指定する必要がある場合、キーワードなしとしてカウントされますか?(ずっと前に、キーワードをキーワードとして引用する必要があるALGOLシステムを見ました。)
デイヴィッドソーンリー

回答:


12

MUMPSは非常に成功しており、保険や医療で広く使用されており、予約語はありません。より明確なコードを書くという点では役立つと思いますが、必ずしも必要というわけではありません。APLは別の例です。APLは、とりわけ原子力産業での1回限りのスクリプトの使用を見込んでいます。APLファミリーのメンバーであるJにもキーワードがありません。

キーワードは、コンパイラライターが解析をより簡単に実装するのに役立ちます。APLは有名な正しい連想です。また、規則を強化し、読みやすくします。APLは、ほとんどの人にとって非常に読みやすいことで知られていません。


2
「キーワードは、コンパイラの作成者が構文解析をより簡単に実装できるようにする」ための+1 これでほぼだと思います。コンパイラ全体とそのワーキングセットが1ダースのRAMに収まらなければならなかったときに、パーサーがメモリに保持する必要があるコンテキストの量を削減するためにキーワードが考案されました。
ヨルグWミットタグ

2
他のほとんどの言語よりもAPLのパーサーを書くのが簡単です!APLインタープリターの最初の実装は、トランジスタとダイオードを使用して行われたと考えてください。
ジェームス・アンダーソン

2
キーワードの主な理由は、人間が言語をより簡単に解析できるようにすることだと思います。言語がマシンコードのように数字とビットパターンだけで構成されていれば、コンピューターはより幸せになります。
ジェームズアンダーソン

6
APLがキーワードに欠けているものは、独自のフォントを要求することで補う以上です。
Blrfl

@Blrfl J、K、およびQのポイントです。これらはすべて、ある程度はASCIIのAPLです。
ワールドエンジニア

9

キーワードのないよく知られた言語の1つがLispです。キーワードに最も近いものは、特別な形式と呼ばれるもので、その数は方言ごとに異なる場合があり、通訳者から特別な扱いを受けます。それとは別に、それらは再利用できないという例外を除いて、(少なくとも私がよく知っているLispでは)使用方法の点では通常の関数と区別できません。

これは単純な(しかし重心な)構文をもたらし、Lispがこのような強力なマクロシステムを持つことを可能にしたものの1つです。一方、Lispは読みにくいとよく言われます。APLとMUMPS、さらには、両方ともBrainf * ckの中間と説明されています。キーワードはこの部門で役立ち、人間にとってもコードを読みやすくします。

だから、私はキーワードが成功した言語に必要だとは言いませんが、それらは確かに言語が成功するのを助けます。


1
IIRC Lispにはキーワードがありません。特殊形式はコンパイラーによって特別に扱われる必要がありますが、それらの名前は通常のシンボルです。
ジャン・ヒューデック

2
キーワードは、Lispにもない構文の機能です。Lispでキーワードについて話すのは理にかなっていないと思う。
ヨルグWミットタグ

2
私はヨルクに同意します。同様の構造を持つトークンと区別するために、言語に明示的に特別なものとして定義する必要があるトークンがある場合、キーワードについて話すことができると思います。トークンが異なると、構文ツリーも異なります。たとえばif、C では、特別なキーワード(キーワード)として定義されていない場合、有効な識別子になります。これはif、識別子ではなく、if = 10構文エラーが発生することを意味します。私は間違っていないよ場合は、Lispの最小限の構文は区別されませんdefunからfxyおよび+(defun f (x y) (+ x y))
ジョルジオ

@Giorgio if 、特にCommon Lisp(および他のLisp-2)の有効な変数名であり、(defparameter if nil)何も壊さず、次のような形式で使用できます(unless if (setf if t))
-tobyodavies

ただし、同じメモで(defun if ...)は失敗します。コメントからメモを取り、回答を編集しました。特別な形式は、たとえばCと同じレベルのキーワードではないが、それでもLispに最も近いものであることに同意できます。
scrwtp

8

TCLにはキーワードがなく、実際には12の構文規則しかありません。かつてほど人気はありませんでしたが、期待通りのニッチを持ち、ECADとルーターに組み込まれているため、確かに実用的と考えられます。

また、多くの言語がこのルートに進まない理由を示していると思います。はい、TCLパーサーを書くことは完全に可能です(他の多くの言語よりも間違いなく簡単です)。これは少なくとも部分的にはキーワードがないためだと思う。


2
Tclは、この点でLispと非常に似ていますが、「すべてがリスト」ではなく「すべてが文字列」である点が異なります。リストは空白を含む単なる文字列であり、プロシージャ呼び出しは、最初の要素がプロシージャの名前として解釈され、残りが引数として解釈される単なるリストです。それは本質的にLisp S-Expressionです。
ヨルグWミットタグ

はい、どちらも洗練された表記法を使用しており、ホモ-イコニックなので、かなり似たセマンティクス
jkを

5

コンピュータは、コンテキストから意味を推測できるほど強力になりました。

これは、文脈に依存しない文法が欲しいという意味ですか?がんばろう。

強力であるかどうかについての質問ではありません。言語については永遠の不変のルールがあります-数学的なルールです。これと、プログラミング言語が構文的に簡単でなければならないという事実は、CFGが今後数十年間支配することになるでしょう。

ところで、Haskellのような構文では、次のように書くだけです。

f x y = (x+1)*(y-1)

関数を定義します。ただし、この場合の「キーワード」は「=」です。見逃すと、パーサーでひどいことが起こります。

しかし、これはあなたに同意する点です。他の言語で機能を導入するすべてのdef、dcl、fun、fn、functionまたはwhat-notキーワードよりもはるかに直感的です。

しかし、この文法は単純で古いLALR(1)で書くことができ、ここでは「文脈から推測される」という意味はありません。


1
この声明に対処するための+1(コンピューターはコンテキストから意味を推測できるほど強力になりました)。CFGの文法が好まれる理由は、プログラム構造を帰納的に定義できるからだと思います。なぜ100年たってもこれを変えたいと思うのか分かりません。たぶん想像力が足りないのでしょうか?
ジョルジオ

2
CFGはかなり死んでおり、何十年も死んでいました。HTML内のJavaScript、C内のC形式の文字列、OCamlなどのネストされたコメント-これらはすべてコンテキストに依存しません。そして、なぜあなたは、現在、PEGとGLRの時代に、そのようなarbitrary意的な選択された形式に自分自身を制限したいのですか?
SKロジック

1
@Ingo、はい、あなたは正しい、間違った例の選択。私は、CFGではない、混合された拡張可能な(高次の)文法を意味しました。
SKロジック

2
@ SK-logic:CFGがかなり死んだという情報をどこで手に入れたかはわかりません。私は過去20年間コンパイラーの構築を教えてきた私の前の同僚と話をしてきましたが、CFGはまだ死んでいないようです。
ジョルジオ

1
@Ingo:私が覚えている限り、CF以外の側面は、構文解析ツリーを意味的に分析することにより、後で処理されます。たとえば、{ int x = 0; x = "HELLO"; }解析ツリーを作成する必要がありますが、コンパイラが2番目の割り当てでxを検索すると、コンパイラがintとして宣言されていることを確認し、型エラーを発行します。そのため、プログラムは、そのCF構造が正しい場合でも拒否されます。
ジョルジオ

4

私の知る限り、Smalltalkはキーワードが最も少ない言語です(Brainfuckのような言語をカウントしていない場合)。Smalltalkのキーワードは truefalsenilselfsuperthisContext

smalltalkに触発されたキーワードのない言語を設計しました。しかし、しばらく使用してから、いくつかのキーワードを追加しましたが、そのほとんどは構文糖衣です。

したがって、私の意見では、キーワードのない言語も可能ですが、あまり実用的ではなく、それがすべての人気言語にキーワードがある理由です。


Smalltalkが暗黙的なレシーバーによるメッセージ送信をサポートしている場合、少なくともtruefalseおよびnilその暗黙的なレシーバーのメソッドとして定義でき、反射機能があれば、おそらく他の3つも同様に定義できます。
ヨルグWミットタグ

1
これらはキーワードではなく、疑似変数です。「疑似」ためtruefalseおよびnil環境により供給された、よく知られた値でありselfsuperそしてthisContextあなたが設定できない変数ですが、その値が実行の結果として変化します。
フランク・シーラー

3

あなたは、キーワードがコンパイラのために物事を簡単にするためにそこにあるという誤った仮定の下で苦労しているようです。それらはコンパイラーにとって物事を簡単にしますが、より重要な利点があります:コードを読む人にとって物事を簡単にします

はい、たくさんのコンテキストを見て、関数宣言または変数宣言を見ていることがわかりますが、コンテキストと関連するコードの複雑さによっては、長い時間がかかる可能性があります。あるいは、そこにfunctionvarのような便利なキーワードがあり、何を見ているかすぐにわかります。

はい、彼らはコードを書くのをより複雑にしますが、プログラムが生産よりもメンテナンスに多くの時間を費やし、コードが作成されたよりも多くのコードが読み取られ、デバッグされ、維持されていることを考慮して、あなたの言語を設計しようとします読みやすくするのではなく、書きやすくすることは、有害な時期尚早な最適化の典型的なケースです。

また、コンパイラの仕事を簡単にする概念を軽disしないでください。解析が容易であればあるほど、コードのコンパイルが高速になります。つまり、edit-build-debugサイクルが速くなり、生産性が向上します。

大規模で複雑なコードベースがある場合、それは生産性の重要な違いになります。たとえば、私が働いている場所には、約400万行のDelphiで動作するプログラムがあります。約300,000行のC ++である別のモジュールがあります。どちらもコンパイルにほぼ同じ時間がかかります。(約3分。)400万行のC ++がある場合、構築に1時間かかる可能性があります。


すべての優れた点。+1

小説のすべての名詞、動詞、副詞、形容詞がそのようにラベル付けされていると、読むのが難しくなります!

@JarrodRoberson:もちろんそうですが、コードは小説ではありません。自然言語はプログラミング言語とは大きく異なります。プログラミング言語には形式的なセマンティクスがあります自然言語は直感的に理解されます。 それを読んでその意味を理解するために使用される技術は非常に異なっており、あなたと同じように2つを同一視しようとするのは間違いです。
メイソンウィーラー

私が言ったコンパイラライター異なるコンパイラを。コンパイラはより高速なハードウェアでより高速になり、コンパイラの作成者は人間であり、ムーアの法則を遵守しません!

私が扱う傾向のあるコードベースは、長さが小説よりも桁違いに長く、ほとんどが1,000,000 行以上のコードで、最も長い小説のほとんどは2,000,000 ワード未満です!そして小説のように、彼らは人間によって読まれるので、実際にはコードを書くよりもコードを読むことに多くの時間が費やされます!10年を超えるコードベースと1,000,000行を超えるコードベースを考えると、開発者が10年以上にわたって読み取った回数は、そもそも作成にかかった時間よりも小さいです!

2

まれな例がいくつかあります。

APLはシンボルのみを使用しますが、多くのシンボルを使用します!言語を使用するには特別なキーボードが必要です。

このウィキペディアの記事をご覧ください

CORAL 66-キーワードがありますが、単一引用符で引用されている場合にのみ認識されます。

PL / 1にはキーワードもありましたが、変数またはプロシージャ名として使用することもできます。

全体として、あなたの質問は「話し言葉にはなぜ言葉があるのか​​」と尋ねるようなものです。


APLの外観は気に入っているが、新しいキーボードを購入したくない場合は、Jを追加するだけです。
AakashM

0

主な理由は、人間とコンピューターの両方が解析しやすいことです。キーワードなしで複雑な言語を明確にするには、構文として多くのシンボルが必要になり、非常に不必要に混乱します。読むfunctionよりずっと読みやすいです$!{}。そして、文脈はすべての曖昧さを解決するわけではありません。


1
私はあなたの答えの重要な単語があると思い複雑十分に設計された言語である必要があり、単純ではなく、複雑な

1
@ジャロッド・ロバーソン:レオナルド・ダ・ヴィンチ:「シンプルさは究極の洗練です」、アントワーヌ・ド・サンテグジュペリ:「追加するものが何もないときではなく、奪うものが何もないとき、完璧に達するようです」。
ジョルジオ

1
@Jarrod:意味のある表現力豊かなコンピューター言語はすべて複雑です。
DeadMG

1
@DeadMG:スキームは非常にシンプルであると同時に表現力も豊かです。残念ながら、私が知る限り、標準化されたライブラリがありません。
ジョルジオ

Erlangは非常に表現力があり、構文的に複雑ではありません。すべての関数型言語は、控えめなキーワードで表現力が増すと思います。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.