予約済みのキーワードがない実用的なプログラミング言語を探していましたが、見つけることができませんでした。
私は自分の教育と娯楽のためのプログラミング言語に取り組んでおり、まだキーワードを含める必要はありません。それが私の検索と質問につながったものです。
言語のエンドユーザーにとってコンパイラライターの利便性は重要だとは思いません。今日のコンピュータは、文脈から意味を推測できるほど強力です。小説を書くとき、作家は名詞や動詞などにラベルを付ける必要があるだけですが、プログラマが関数や変数にfunction x() {}
またはset x = 1
またはvar x = 1
などでラベル付けする必要があるのはなぜですか。ステートメントのコンテキストから、それが関数宣言または呼び出しであるか、またはラベルが値への割り当てであるか、またはそのラベル値への参照であると推測できる場合は?
これは私の現在のパーサーが何をしているかの具体例です。予約されたキーワードは、func
のような通常noiseの束を持つ一般的なものをサポートする必要はありません。または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).
キーワードがなぜ成功するプログラミング言語にとって重要なのか知りたいのですが
[〜#〜] mumps [〜#〜] は非常に成功しており、保険やヘルスケアで広く使用されており、予約語はありません。より明確なコードを書くという点で役立つと思いますが、必ずしも必要というわけではありません。 APLは別の例です。 APLは、とりわけ原子力産業での1回限りのスクリプトの使用を検討しています。 [〜#〜] j [〜#〜] 、APLファミリーのメンバーにもキーワードが不足しています。
キーワードは、コンパイラ作成者が解析をより簡単に実装するのに役立ちます。 APLは有名な正しい連想です。また、規則を強化し、読みやすさを向上させるのにも役立ちます。 APLは、ほとんどの人にとって非常に読みやすいことで知られていません。
キーワードなしのよく知られた言語の1つがLISPです。それがキーワードに最も近いものは、いわゆる特別な形式です-それらの数は方言によって異なります-通訳から特別な扱いを受けます。それを除けば、それらが再利用できないことを除いて、それらがどのように使用されるかという点では通常の関数と区別できません(少なくとも、私がよく知っているLispでは)。
これにより、単純な(ただしかっこが多い)構文が得られ、LISPでこのような強力なマクロシステムを使用できるようになりました。一方、LISPは読みにくいとよく言われます。 APLとMUMPSはさらにそうですが、どちらもBrainf * ckの中間にあると説明されています。キーワードはこの部門で役立ち、私たち人間にとってもコードを読みやすくします。
ですから、成功する言語にはキーワードが必要だとは言いませんが、それは言語が成功するのに役立つはずです。
[〜#〜] tcl [〜#〜] にはキーワードがなく、実際には12の構文ルールしかありません。かつてほど人気はありませんが、期待に応えるニッチがあり、ECADとルーターに組み込まれているため、私の考えでは確かに実用的です。
また、多くの言語がこの方法を採用しない理由を示しているのかもしれません。はい、TCLパーサーを書くことは完全に可能です(おそらく他の多くの言語よりも簡単です)。しかし、言語に非常に有用なBNF文法を書くことができず、多くの人が言語を学ぶのに苦労しているようです。これは少なくとも部分的にはキーワードがないためだと思います。
今日のコンピュータは、文脈から意味を推測できるほど強力です。
これは、文脈自由ではない文法が必要であることを意味しますか?幸運を。
パワフルであるかどうかは問題ではありません。言語には、数学のような、永遠で変わらない規則があります。これと、プログラミング言語が構文的に簡単でなければならないという事実は、CFGが今後数十年間支配するようになるでしょう。
ところで、Haskellのような構文では、次のように書くだけです。
f x y = (x+1)*(y-1)
関数を定義します。ただし、この場合の「キーワード」は「=」であることに注意してください。見落とすと、パーサーでひどいことが起こります。
しかし、これは私があなたに同意するポイントです。これは、他の言語で関数を紹介するすべてのdef、dcl、fun、fn、functionまたはwhat-notキーワードよりもはるかに直感的だと思います。
それでも、この文法は昔ながらのLALR(1)で書くことができ、ここでは「文脈から推測」する意味はありません。
私の知る限り、Smalltalkはキーワードが最も少ない言語です(Brainfuckのような言語を数えない場合)。 Smalltalkのキーワードは、true
、false
、nil
、self
、super
およびthisContext
です。
Smalltalkに触発された、キーワードのない言語をデザインしました。しかし、しばらく使用した後、いくつかのキーワードを追加しました。
ですから、私の意見では、キーワードのない言語も可能ですが、あまり実用的ではなく、それがすべての人気のある言語にキーワードがある理由です。
あなたは誤った仮定の下で苦労しているようです、キーワードはコンパイラーにとって物事をより簡単にするためにそこにあるということです。それらはコンパイラーにとって物事を容易にしますが、より重要な利点がありますそれらはコードを読む人にとって物事をより簡単にします。
はい、一連のコンテキストを見て、関数宣言または変数宣言を見ていることを理解できますが、コンテキストや関連するコードの複雑さによっては、理解に時間がかかる場合があります。または、functionやvarのような便利なキーワードを使用すると、何を表示しているかすぐにわかります。
はい、それらはコードをwriteに複雑にしますが、プログラムは本番環境よりもメンテナンスに多くの時間を費やし、コードが読み取られることを考慮します作成されたものよりもはるかに多くのデバッグおよび保守が行われ、読みやすくする代わりに書きやすくするように言語を設計しようとするのは、有害な時期尚早な最適化の典型的なケースです。
また、コンパイラの作業を容易にする概念を軽視しないでください。解析が簡単なほど、コードのコンパイルが高速です。つまり、編集、ビルド、デバッグのサイクルが速くなり、生産性が向上します。
大規模で複雑なコードベースがある場合、生産性に大きな違いが生じる可能性があります。たとえば、私が働いている場所には、デルファイの約400万行のプログラムがあります。約300,000行のC++の別のモジュールがあります。どちらも、コンパイルにはほぼ同じ時間がかかります。 (約3分。)400万行のC++がある場合、ビルドに1時間かかる可能性があります。
いくつかのまれな例があります。
APLはシンボルのみを使用しますが、それらの多くは!言語を使用するには、特別なキーボードが必要です。
CORAL 66-キーワードはありましたが、単一引用符で囲まれている場合にのみ認識されました。
PL/1にはキーワードもありましたが、変数またはプロシージャ名として使用することもできます。
全体として、あなたの質問は「話し言葉にはなぜ言葉があるのですか?」と尋ねるようなものです。
主な理由は、人間とコンピュータの両方が解析しやすいためです。キーワードなしで複雑な言語を明確にすることは、構文として多くの記号を必要とし、それは大規模にそして不必要に混乱するでしょう。 $!{}
よりもfunction
の方がはるかに読みやすいです。そして、文脈はすべてのあいまいさを解決するわけではありません。