表現力とは具体的に何を指しますか?


34

表現力はウィキペディアによって次のように定義されています:

..その言語で表現および伝達できる幅広いアイデア。

「アイデア」とは、マシンと通信できるもの(操作、構造、アルゴリズムなど)を指しますか?それとも、他の人間に言語でキャプチャして伝達できる「人間」の概念を指しますか?

表現力はどのように評価および測定されますか?

たとえば、JavaScriptのような言語を使用して、変数がアンダースコアに続く8桁の数字でなければならない/^_[0-9]{8}$/など、変数名に奇妙な制限を課した場合、表現力は失われますか?

それとも、そればかげて迷惑なだけでしょうか?


明確にするために:

言語に固有の一般的なアイデアによって測定される表現力です:

  • 整数と文字列
  • ループ
  • 条件付き

または、言語が表すことができる具体的でユニークなアイデアの数:

  • 整数1、2 ... 2 ^ 32
  • 「キツネの言うこと」を含む文字列 そして「ファパパパパパパパウ」
  • それぞれのカエルカエルの私のコレクション
  • 場合カエルがある緑や何かその後、何かを

3
特定のスコープ内でプログラムを最大1億の変数に制限すると、表現力にある程度の制限が課せられることに注意してください。たとえば、Firefoxの実装が不可能になる場合があります。;-)
R .. 14

1
この「プログラミング言語」にタグを付けましたが、表現力について議論できるコンピューター言語はプログラミング言語だけではないことに注意してください。実際、リンク先のページには最初の例としてWeb Ontology Languageがあります。
ジョンハンナ14

回答:


39

表現力に関する画期的な論文は、Matthias Felleisenによるプログラミング言語の表現力について(1991)です。言語表現力の数学的に厳密な定義が含まれています。

直感的には、言語で記述することができ、すべてのプログラムならばAはまた、言語で書くことができるBだけ地元の変換ではなく、言語で書かれたいくつかのプログラムがあるB言語で書くことができないA、グローバルな構造を変更せずに(だけですなわちありません純粋にローカルな変換)、言語Bは言語Aよりも表現力豊かです。

この定義の一つの素敵な性質は、それが中のプログラムがある言語のペアがあるという可能性を認めているということですXで表現することはできませんYとでプログラムYで表現することができないXを、ひいては言語が異なっているが、どちらも言語は他の言語よりも表現力豊かです。これは、いくつかの言語が得意な言語と、他の言語が得意な言語があり、どちらも一般に他の言語よりも「優れている」という現実世界の経験とうまく合致しています。


だから、(まだ論文を見ていない)表現力は、ソースの読者とは対照的に、マシンに表現できるものについてですか?ハードウェアに指示することができるものの尺度ですか?コードで保存または通信できる「人間」のアイデアの数の尺度ではありませんか?...別の質問をする必要があるかもしれません。しかし、もしそうなら、私たちが話している「機能」とどう違うのでしょうか?
svidgen 14

OPでの私の例は悪いかもしれません。両方とも配列を持つ言語AとBを検討してください。しかし、言語Aには構造体もあります。どちらの言語でもPoint、2D配列の配列を使用して一連のを表すことができます。しかし、Aには、Pointより人間が読みやすい概念として表現させるという利点があります。で、より表現?
svidgen 14

@svidgenチューリング完全言語はすべて計算上同等であるため、記述可能なプログラムのセットは理論的にはすべて同じです。上記の定義により、Bで書かれたプログラムをAに合わせて再編成する必要がある場合、言語BはAよりも表現力があります(構文を行ごとに変更するだけでなく、新しいクラス、ループなどを導入します。 Javaの7でのプログラムの使用のラムダ、そのmapfilter、ファーストクラスの型/メソッド/関数、おそらくいくつかeval、などだけでメタクラスの魔法または動的に作成されたタイプを聞かせて
marczellm

@marczellmそう、表現力が指す「アイデア」は言語構成要素そのものですか?たとえば、条件付きはアイデアですか?ループはアイデアですか?文字列?数?等。?
svidgen 14

1
@Jörg回答に例を挙げていただけますか?それはかわいい定義ですが、質問に答えるのにはあまり役立ちません。
svidgen 14

10

表現力はウィキペディアによって次のように定義されています:

そのページをもう一度読みましょう。最初に注意することの1つは、「プログラミング言語」ではなく「言語」と言うことであり、その例のほとんどはプログラミング言語ではありません。たとえば、最初の例はOWL2 ELとOWL2 RLの比較です。言語。

この概念はプログラミング言語に適用できますが、パターンマッチング言語、マークアップ言語、クエリ言語、視覚スタイルシート言語、正規表現(およびそれらが参照するすべての正規言語)などにも適用できます。英語のような自然言語の表現力を参照することもできます。これは非常に非公式に行われますが、自然言語処理に関連する問題を考慮するとより深刻になります。

「アイデア」とは、マシンと通信できるもの(操作、構造、アルゴリズムなど)を指しますか?それとも、他の人間に言語でキャプチャして伝達できる「人間」の概念を指しますか?

それは、その言語で表現できるものを指し、それ自体が純粋に物と見なされます。

たとえば、(あなたの質問はあなたが知っている言語の1つであることを示しているため、例ではjavascriptを使用します)javascriptステートメントを検討してください:

var x = 3 + 4;

これは、3と4の値の合計が計算さxれ、特定の名前空間スコープ内のラベルに関連付けられた値が表されることを表します。

世界中のすべてのコンピューターを破壊し、そのコードを紙に書いたとしても、javascriptでも同じ意味が残ったままです。このようなコードを何に対しても実行することはできませんが、言語の抽象的な定義はまだ話し合うことができます。

これはつまらないように思えるかもしれませんが、実際のコンピューターを考慮せずに、言語が抽象的に推論できるものであることが実際に非常に重要です。一つには、コンピューター言語の理論的ポイントについて、実際にはまだ実現可能ではなかったと考える人々が、私たちを今日の私たちに導いたものの1つです。コンピューターはコンピューターサイエンスを必要としますが、コンピューターサイエンスはコンピューターを必要とせず、計算のアイデアだけを必要とします。

もちろん、私たちは現実の世界でコンピューターを使用しています。最近では、理論上それらを議論する少数の専門家ではなく、実際にコンピューターを使用する人が大勢います。リンクしたページには次のように表示されます:

表現力という用語は、さまざまな意味で使用できます。それはその言語で表現可能なアイデアの尺度を意味する場合があります:

  • 簡単に関係なく(理論的表現力)

  • 簡潔かつ容易に(実用的な表現力)

最初の感覚は、形式言語理論、数学論理、プロセス代数など、言語の正式な記述とその意味を扱う数学と論理の分野で支配的です。

非公式の議論では、この用語はしばしば第2の感覚、またはその両方を指します。これは、プログラミング言語について議論する場合によくあります。用語のこれらの非公式の使用を形式化する努力がなされました

この2つの用語の使用のうち、最初の実際の影響は、コンピューターに伝達できるものにのみ関係します。

2つ目は、読み取りと書き込みの両方の人間の理解に関連しますが、その程度は使用法によって大きく異なります。非公式であり、厳密に定義されていないためです。

たとえば、JavaScriptのような言語を使用して、変数がアンダースコアを前に付けた8桁の数字でなければならないなど、変数名に奇妙な制限を課した場合、/^_[0-9]{8}$/表現力は失われますか?

正式な定義では、表現力は失われていません:100,000,000個の変数に制限されていますが、本当に必要な場合は、新しく作成された名前空間内でより多くの変数を保持するオブジェクトを作成することでこれを回避できます。そのため、今日javascriptで記述されたプログラムはすべてこの新しい形式に書き換えることができるため、同様に表現力があります。

非公式の定義では一部を失いましたが、どれだけ非公式かによって異なります。これは、非公式の使用に関する「ルール」とは言えないため、変化します。同じ名前空間に100,000,000を超える変数を持つプログラムは、単純な置換を超えて書き直さなければならないため、わずかな量を失ったと言えるかもしれません。さらにもっと非公式な使用法は、このような不格好な変数名が人間の包括的なものに与える精神的な影響に言及します。

また、人々が非公式に言語の一部ではないものを非公式に検討することにも注意してください。Javascriptの作成から今日までの変更を検討してください。

最も正式な定義では、表現力にはほとんど変化がありません。結局のところ、そもそもチューリング完全でした。

より非公式な定義により、配列操作、例外処理、(おそらく何よりも)正規表現の包含などの特定の点で、表現力が大幅に向上しました。これらは、以前はjavascriptでできなかったことを何もしませんが、javascript1.0で書くのに数キロバイトのコードを必要とし、実行に長い時間を要する数秒と1秒未満の実行時間で何かをすることができます。

はるかに非公式な定義により、ブラウザでのJavaScriptの最初の使用からの変更(フォーム入力の値を変更できdocument.write、ページが最初に解析されて新しい場所に移動するか、履歴で前後に移動できますが、それ以外のことはほとんどありません)(サーバー呼び出しからのデータに基づいたものを含め、ページ上のほぼすべてを変更できる)それは絶対に計り知れませんが、そのほとんどはjavascriptではなく、作成されたオブジェクトモデルとAPIに関連しています言語ではなく、利用可能です(たとえば、IEのvbscriptは、これらの変更から等しく恩恵を受けました)。

私の考えでは、その最後の使用は非常に非公式なので実際には正しくありませんが、それは非公式の定義の問題です。

正式な定義では、それは実際にはまったく表情豊かになりませんでした。


2
私はそのように「コンピュータがコンピュータサイエンスが必要ですが、コンピュータサイエンス、コンピュータを必要としない」
chbaker0

変数の命名制限に関して、外部のアイデア(物事の母国語の名前)を参照する能力は、アイデアを表現する言語の能力とは無関係ですか?...たぶん、質問の根底にあります。私たちが話しているアイデアは、一般的な言語構成だけを表現しているのでしょうか?たとえば、加算、減算、否定、配列、クラスなど?特定のアイデアとは対照的に、言語で表現できますか?例えば、typeの配列fishiesFish
svidgen 14

詳細については、私の編集をご覧ください。...両方だと言っているように聞こえます(私の編集を参照)。ただし、最初のリストは「正式」で、2番目のリストは「非公式」です。その場合、会話で無条件に使用される方法の規範はありますか?または...あなたは明確化を求める傾向がありますか?
svidgen

4

変数の命名規則は、「表現力」が意味するものを実際に捕捉するとは思わない。「表現力」とはもっと基本的なことを指すと思います。たとえば、Linqを使用するC#とLinqを使用する前のC#を検討してください。Linqの追加後、SQLに似たクエリをC#で直接記述できるようになりました。これは、SQLを文字列リテラルに入れてサーバーに渡す、または「for」を使用してコレクションを反復処理するなど、以前の選択肢よりもはるかにエレガントです。

別の良い例は、プロトタイプベースの継承を備えた言語かもしれません。これらの言語では、実行時に新しいメソッドをインスタンスまたはクラス(「クラス」が指定された言語に含まれる名前は何であれ)に追加するだけで済みます。C ++やC#では実際にはできません。プロトタイプベースの言語と比較して、この程度の表現力が欠けています。(C#には拡張メソッドの概念があり、表現力を追加すると言うことができます。)


0

ウィキペディアの記事で言及されているように、表現力とは、言語で表現できるプログラムのセットを指します。「プログラミング言語」(JavaScript、LISP、C#、Perlなど)と考えるものはすべて基本的にチューリング完全であり、「計算可能」と言われるものをすべて表現できることを意味します。

ただし、正規表現は通常のプログラミング言語ほど表現力がないことは明らかです。さらに、シェルワイルドカードは、正規表現よりも表現力がやや劣ります。

CTEを使用すると、通常はSQLでは表現できない再帰クエリを表現できるため、共通テーブル式を使用したSQLのバージョンは、なしのバージョンよりも表現力があります。


0

表現力を理解するための、よりシンプルで簡単な方法がありますが、最初に言語の意味を確立する必要があります。言語を研究する2つの分野、言語学とオートマトンがあります。どちらも、言語が連結を使用していくつかの有限アルファベットから構築された単語のセット(有限シーケンス)であることに同意します。通常、興味深い言語(興味深いことに、私たちが便利な方法で解釈できるような言語を意味します)には、どの単語がその言語に含まれ、どの単語がそうでないかを管理する一連のルールもあります。表現力は、解釈がある場合にのみ存在することに注意してください。

解釈とは、言語の単語を与えられたオブジェクトのセットからオブジェクトを選択する関数の存在を意味します(これは自然言語では明らかに議論の余地があります)。

ただし、「単語」を使用しても誤解しないでください。Javaプログラムは、Java言語の単語です(ただし、スペースで区切られた複数の文字列を含む複数のファイルにまたがることがあります)。

この比較的単純な概念に対処するために、現代のプログラミング言語のような複雑な言語を使用すると逆効果になるため、代わりに数式を使用します。

  • 言語Aを整数の加算を含むすべての数式として定義しましょう。

  • 言語Bを、整数の乗算を含むすべての式の言語であると定義しましょう。

どちらの場合も、identity要素の使用は許可されません。したがって、言語Aには「1 + 1」、「1 + 2」、「1 + 3」、「2 + 3」などの単語が含まれます。言語Bには、「2 * 2」、「2 * 3」、「2 * 4」、「3 * 4」などの単語が含まれています。また、通常の解釈を「*」と「+」(整数の加算と整数の乗算)にそれぞれのシンボルに割り当てます。したがって、「1 + 1」の解釈は2、「2 * 2」の解釈は4です。

整数では乗算が繰り返し加算としてキャストされる可能性があるため、言語Aは言語Bよりも厳密に表現力があることに注意してください。ただし、加算を一般に乗算として表現する方法はありません。


要約すると、言語Aは言語Bよりも表現力が高いと言えます。言語Bの解釈関数が共通領域を共有する場合、Bの解釈関数のイメージはAの解釈関数のイメージの適切なサブセットです。


-1

TLDR:機能が欠落しているが、他の方法で表現できる場合、それは表現力の欠如ではありません。アルゴリズムを思い描いたり、ある言語で実装することもできるが、別の言語が何らかの方法でアルゴリズムを実装できないように構成されている場合、それは表現力の問題*です。

変数の命名制限は、表現力を低下させません(すべてのアルゴリズムを表現できず、配列+インデックスのような変数を偽造できないほど名前が少ない場合を除きます)。

表現力の不足の簡単な例はこれです:あなたがする必要があるdo_homeworkbring_down_trash。これはコードで簡単に記述できます。

do_homework();
bring_down_trash();

このソリューションは非常に単純に見えますが、実際do_homeworkbring_down_trashは順序付けられていないため、次のように書くこともできます。

bring_down_trash();
do_homework();

命令を執行するつもりがないことを表明していないため、これも同様に不正確です。また、スレッドを使用する必要もありません。このようなことを言いたいです。

compiler_or_interpreter_pick_one(
    {
        do_homework();
        bring_down_trash();
    },
    {
        bring_down_trash();
        do_homework();
    }
);

私の知る限り、これはどのプログラミング言語でも表現するのが非常に難しいか不可能です。

私に終わりを告げない例は、Javaではオブジェクトの配列を持つことは不可能だということです。オブジェクトへのポインタの配列を作成できますが、同じメモリレイアウトはありません(効率を上げる)。

例に取ると、別の答えC ++はクラスまたはインスタンスにメソッドを追加することをサポートしていません。これは事実ですが、C ++の表現力を制限するものではありません。

struct Extensible{
    std::vector<std::function<void(Extensible *)>> instanceExtensions;
    static std::vector<std::function<void(Extensible *)>> classExtensions;
};

これは、インスタンスおよびクラスの任意の数のメンバー関数を追加、削除、および呼び出すことができるクラスです。技術的には、C ++は、この機能を実際にサポートするプログラミング言語よりもこの点で表現力が高いでしょう。C++では、関数(ベクトルvs配列vs forward_list)の格納方法を選択できるためです。

*一部の言語では、機能として表現力が不足しています。通常、それらは無限ループを書くことを不可能にします。これにより、停止している問題を解決でき、正確性を自動的に証明できます。


2
私はこれが正しくないことをかなり確信しています-少なくともそれが私が理解していることではありません。生のバイナリをディスクに書き込むことは、この定義によって表現力があり、これはばかげています。
テラスティン14

1
@Telastynなぜそれはばかげているのでしょうか?もちろん、生のバイナリをディスクに書き込むだけでは表現力豊かではありませんが、それができる言語は、そうでない言語よりも表現力があり、他のすべてが同じです。
nwp 14

ハードウェアインターフェースを使用して生のビットをコンピューターに書き込む「言語」は、コンピューターができることなら何でもできるので、最も表現力のある言語の例です。他の方法で不足している機能を表現できます。あなたの定義では、それは表現力豊かな言語であるというのはばかげていると思います。
テラスティン14

@Telastynなぜそれが最も表現力のある言語なのでしょうか?データの読み取りや計算、グラフィックスやスレッドの表示はできません。メモリとディスクにのみビットを書き込むことができる言語は、表現力がほとんどないので、用途があるのではないかと疑問に思います。
nwp 14

1
「通常、無限ループを作成することはできません。これにより、停止する問題を解決できる可能性があります」-無限ループを作成できない場合、定義上、プログラムは停止する必要があります。
パトリックコリンズ14
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.