6

今週、いくつかのスクリプト言語を行ったり来たりしてみて、どれもどれも似ていることに気づきました。それでも、私は常にGoogle(または最近はSO)に、「instanceof」と「endswith」のローカルでの同等物や、インターフェイスを宣言する正しい構文などの詳細を覚えてもらうようにしています。

これは、(人間の)言語であるEuropontoを思い出させました。漠然とした英語の構文と、漠然としたロマンス語/ゲルマン語/スラブ語の語彙を選択するだけで、すべて問題ありません。

では、スクリプト言語で同じことをしようとするとどうなるでしょうか。今日、Python スタイルのインデントされたブロックに興味がありますか? 罰金!プロトタイプ オブジェクトを使用しますか? Ok!いくつかのライブラリ関数の PHP 名のスペルを覚えることしかできませんか? 問題ない!

とにかく、それはワイルドでクレイジーなアイデアです。具体的な答えを認める質問が必要なので、次のように締めましょう。

[Python、Ruby、PHP、Perl、shell、JavaScript] のすべてのネイティブ構文とライブラリ関数を許可し、言語間でコード ブロックと関数名を自由に混在させることができるスクリプト言語を作成する際の最も重大な競合は何でしょうか。 ?

そして、特定の構造はステートメント レベルで一貫している必要があるとしましょう。したがって、次を許可します。

foreach( $foo as $bar )
{
   if $foo == 2:
      print "hi"
}

しかし、そうではありません。

foreach( $foo as $bar )
{
   if $foo == 2:
      print "hi"
   endif
end

競合には次のようなものがあります。パーサーのあいまいさ。名前の衝突; オブジェクトまたは関数またはクロージャの矛盾するセマンティクス。など。その範囲は非常に大きな問題になると思いますが、教えてください。

最初から「コミュニティ ウィキ」として開始するので、楽しい質問だと思うが、より厳密にしたい場合は、自由に編集してください。

4

5 に答える 5

3

主な問題は、各ステートメントの構文がどうあるべきかを認識することだと思います。

いずれにせよ、ポイントは何ですか?ほとんどすべてのスクリプト言語には、ほとんど同じことを行うための機能があります。そのため、一貫して使用するスクリプト言語を習得し、それを使い続ける傾向があります。

于 2008-10-12T17:12:09.117 に答える
1

主な困難は、人々がそれを維持できるようにすることです。明確に定義された言語を使用するprintと、特定の方法でのみ実行できますsys.argvsys.argv複数の構文を許可すると、コード ベース内のすべてを検索する適切な方法はありません。

于 2008-10-12T18:54:34.120 に答える
1

構文レベルで私が見ることができる唯一の問題は、どのブロックがどの構文を持っているかを検出し、それらを分離して特定のパーサーで解析することです。もちろん、非常に小さなステートメントを考えると、それがどの言語であるかについてあいまいさが生じる可能性があり、それは問題ではないと主張することもできますが、言語が異なると同じ文字列が異なることを行うため、これは可能性があります微妙な問題になります。

APIレベルでは、同じことを行うさまざまな方法がありますが、その方法やサブセットは微妙に異なります。たとえば、PHP で Java を実行する方法がないstring.startsWith()場合は、別のことを行うか、PHP を実行する方法がなくstrstr()(見つかった針から最後までの文字列の一部を返す)、何かを実装します。そのために異なるか、問題について別の考え方をすることさえできます。次に、同じことを行うさまざまな API メソッドをすべて用意する必要があり、実装、サポート、および (神は禁じられています) 学習するための巨大な API になります。

ウェットウェアのレベルでは、大量の言語とそれらの微妙な違いを知らなければ、他の人が書いたコードはまったく読めません。単一のプログラミング言語を細部まで学ぶのは難しいと思うので、この種のフランケンシュタインの獣を作成するのはまったく現実的ではありません。例外として、世界中の大学で使用されているアルゴリズム記述言語として使用する例外を考えることができます。この言語では、教師が好みの言語を使用して、コードを実装する必要なく人間が読みやすいようにコードを作成します。そのためのパーサー。

補足として、この種のシステムは、同じバイトコードにコンパイルし、同じ変数やものにアクセスするさまざまな言語がたくさんある.NETのCLRを何らかの方法で利用することで、最小限の労力で実装できると思います。必要なのは、コードを異なる言語のクラスターに分割し、それぞれのコンパイラーで個別にコンパイルしてから、バイトコードをマージし、同じ名前を言及するときにすべてが同じ変数と関数を指していることを確認することだけですさまざまな言語。

于 2009-05-11T21:20:39.200 に答える
0

Rubyのクロージャに関するかなり詳細な議論を見つけました。Rubyの動作をJavaScriptまたはPythonと共存させるには、ある種の醜い曖昧さ回避が必要になるようです。

カバーする言語のリストにPerlを追加した場合、その語彙スコープ規則は関連する問題を引き起こすと思いますか?

于 2008-10-12T17:36:16.977 に答える
0

構文は言語の特性の 1 つにすぎないことがわかり始めました。そして、それらのほとんどは私にはCのように見えます。言語 (オブジェクト指向、強力な型付けなど) の目的はまた別のものです。構文が最も重要な側面ではないように見え始めます。

私は行ってウィキペディアのエントリを読みました...

Europanto は、寄せ集めの語彙を持つ「構築された言語」として提示された言語学的冗談です。

「寄せ集め」は、Perl が私に説明した方法のように聞こえます。

于 2008-10-12T17:21:19.147 に答える