web-dev-qa-db-ja.com

プログラミング言語のファースト/セカンド/サードクラス値の数学の基礎は何ですか?

追加されました

関連する2つの質問が見つかりました

https://math.stackexchange.com/q/1759680/1281

https://stackoverflow.com/a/2582804/156458


プログラミング言語では、マイケル・スコットのプログラミング言語プラグマティクスから

一般に、プログラミング言語の値は、パラメータとして渡したり、サブルーチンから返したり、変数に代入したりできる場合、first-classステータスと呼ばれます。整数や文字などの単純な型は、ほとんどのプログラミング言語でファーストクラスの値です。対照的に、a「第2クラス」の値はパラメーターとして渡すことができますが、サブルーチンから返されたり、変数に割り当てたりすることはできません。また、a 「サードクラス」の値をパラメーターとして渡すこともできません。

Labelsは、ほとんどのプログラミング言語では3番目のクラスの値ですが、ALGOLでは2番目のクラスの値です。 Subroutinesは、ほとんどのバリエーションを表示します。これらは、すべての関数型プログラミング言語とほとんどのスクリプト言語で一流の値です。これらは、C#のファーストクラスの値でもあり、いくつかの制限はありますが、Fortran、Modula-2および-3、Ada 95、C、C++など、他のいくつかの命令型言語でも使用できます。 11これらは、他のほとんどの命令型言語では2番目のクラスの値であり、Ada 83では3番目のクラスの値です。

  1. プログラミング言語のファースト/セカンド/サードクラス値の数学の基礎は何ですか?

    この用語は一次/二次ロジックを思い出させますが、それらは関連していますか?

  2. それらの違いは、値が使用できる特定のケースであるように思えます

    • パラメータとして渡され、
    • サブルーチンから返された、または
    • 変数に割り当てられます。

    特定のケースが重要であるのに、他のケースは言及されていないのはなぜですか?

ありがとう。

19
Tim

何もありません、そしてそれはかなり恣意的です。

唯一の有用な違いは、ファーストクラスと他のすべてのものとの間です。 「その他」の括弧内にあるすべてのケースには、それぞれのケースで独自のルールのセットがあり、それらをまとめてまとめてもあまり役に立ちません。 「ファーストクラス」とは「ルールを調べる必要がない」という意味で、「その他」とは「ルールを学ぶ必要がある」という意味です。

たとえばC++では、個々の関数は、それらがステートレスである限り、ファーストクラスの値です。オーバーロードセットはそうではありませんが、ラムダはそうです。 C#では、関数は一般的にファーストクラスの値ですが、型推論を処理するときに発生して、すべての場合に存在することを妨げる厄介なケースがあります。

45
DeadMG

DeadMGに同意します。重要な違いは、ファーストクラスと「その他すべて」の間です。ただし、違いを分類するより一般的な方法があります。

ファーストクラスの値はデータで、その他はコードです。 (大まかに言えば、例外があると確信しています。しかし、これは実際の言語に当てはまる非常に優れた近似です。)

一部の言語では、コードをデータとして扱うことができます。関数型言語はこれで有名です。それらのいくつかは、実行中にプログラムのコードを変更することができます( 遺伝的プログラミング の基礎)。

CやC++などの言語を使用すると、関数のアドレスを取得できます。関数を変更することはできませんが、関数をパラメーターとして他の関数に渡すことができます。 C++には functors の構文糖衣もあります。表面的には関数のように動作し、データのように渡されるオブジェクト全体を作成するという考えがあります。そうでなければ、より低いクラスの値は、ファーストクラスの値として扱うことができます。

数学的には、プログラムの [〜#〜] ast [〜#〜] を考えるのが最善の方法だと思います。通常、各トークンには特定のタイプがあり、他のタイプと互換性がある場合とない場合があります。 l値、r値、およびその他のC++の値型の混乱 と考えてください。次に、キーワード、関数である記号などを追加します。これらの言語の一部は、言語に応じて、ファースト、セカンド、またはサードクラスの値になる場合があります。

学問的な環境を除いて、価値の「クラス」がそれほど重要であることを私は知りません。現実の世界では、知っておくべき重要なことは、コードを渡し、データのように扱う方法です。ファンクタ、ラムダ/クロージャ、関数ポインタなどです。

11
user22815

Denotational Semantics は、プログラミング言語で値と変数がどのように機能するかを記述するための数学的な基礎を提供します。私のコンピュータサイエンスの学位で非常によく説明されていたので、私はDenotational Semantics試験でトップの成績を取り、ほとんどのことを忘れて、プログラマーとして20年の人生でそれを使用する必要がありませんでした。

明確に定義された数学的な基礎を使用するか、「ファーストクラスのステータス」などの非公式な用語を使用するかを選択できます。コースがスコットのプログラミング言語の語用論に基づいていれば、もっと多くのことを学びましたが、プログラミング言語の設計でPHdを行う人には正式な数学が必要です。

ほとんどのプログラミング言語の仕様を読むと、変分論的セマンティクスの明白な欠如に気付くでしょう。しかし、最もよく設計された言語には、プログラミング言語設計のエキスパートであるチームの誰かがいて、したがって、変分論的セマンティクスをよく理解しています。

したがって、Michearl Scottは、正式な数学と何らかの関係がある非公式な用語を使用し、ほとんどのプログラマーが恩恵を受けることができる方法で主題を提示しています。彼の用語はそうではありません他の人が使用するので、コミュニケーションには役立ちませんが、新しいプログラミング言語を初めて見るときに尋ねる必要がある質問の基礎を提供します。

Michael L.ScottはComputer Sciの主要な研究者であり、正式な数学を使用して理解し、非常に満足していることに注意してください。残りの皆んな。

8
Ian

いいえ、「ファーストクラス」と「ファーストオーダー」の「ファースト」という言葉は異なる意味を持っています。

しかし、はい、「ファーストクラス」と「ファーストオーダー」の概念は関連しています。それらは両方とも、言語がその言語を説明できるどの概念も抽象化できるかを分類することに関するものです。

言語の通常の抽象化メカニズムがその概念を抽象化できる場合、概念はfirst-classです。

たとえば、Javaプログラミング言語は、整数と、整数を抽象化するためのすべての通常のメカニズムを記述することができます(それらをメソッドパラメータとして受け入れ、関数結果として返し、データ構造に格納します。 。)整数に対して機能します。

それ自体を抽象化するために使用できない場合、コンセプトはfirst-orderです。

たとえば、Javaでも、メソッドを使用して特定のものを抽象化できます。ただし、メソッド名をメソッドパラメータとして渡すことができないため、メソッドを使用してメソッドを抽象化することはできません。これはJavaScriptとは異なります。ブラケット表記を使用すると、オブジェクトのプロパティに名前で文字列としてアクセスでき、文字列を抽象化できます。

概念はsecond-orderであり、それ自体の1次の使用では抽象化できますが、2次の使用では抽象化できません。

たとえば、Javaでは、ジェネリックを使用して型を抽象化できます(class Foo<T> { public List<T> content; }など)。ただし、ジェネリックを使用してジェネリックを抽象化することはできません(class Bar<T> { public T<Int> content; }など)。これはScalaでは異なります。

概念はthird-orderであり、それ自体を1次および2次の使用で抽象化するために使用でき、2次の使用では抽象化できない場合。

等々。

最後に、それ自体の任意の使用を抽象化するために使用できる場合、コンセプトはhigher-orderです。

概要:抽象化機能がファーストクラスである場合、それも高次です。また、抽象化機能が一次である場合、それをファーストクラスにすることはできません。

3
Toxaris

プログラミング言語のファースト/セカンド/サードクラス値の数学の基礎は何ですか?

私が気づいているものはありません。

この用語は一次/二次ロジックを思い出させますが、それらは関連していますか?

あんまり。

プログラミング言語要素の「クラス」は、私の言語のユーザーがプログラムで操作したいこと質問/についての簡単な方法です。たとえば、C#は、 values を操作するための豊富な操作セット、 types を操作するための豊富な方法セット、および操作な​​しを提供します labels を操作します。

しかし、ここにつながりがあるというあなたの直感は完全に見当違いです。一次論理から手続き型プログラミングまで、そして高次論理から関数型プログラミングまでの類推があります。一次論理は、値の論理操作に関するものです。手続き型プログラミングは、プログラムによる値の操作に関するものです。高次論理は論理のステートメントの論理操作に関するものであり、関数型プログラミングは関数のプログラムによる操作に関するものです。

特定のケースが重要であるのに、他のケースは言及されていないのはなぜですか?

あなたは著者に決定的な答えを求めなければなりません。

私はこの「階級」の概念にあまり夢中にならないでしょう。それは正式に定義するものではありません。言語設計者がプログラムでどのような種類の操作ができるかを説明するために使用する略記です。

2
Eric Lippert

この文脈での「ファーストクラスの値」は、プログラミング言語理論における標準的な用語です。ファーストクラスの値は、言語で通常の値として操作できるもので、実行時に計算できるものです。もちろん、それは、言語のセマンティクスを定義するまでトートロジーの定義であり、値は、セマンティクスが値として定義するものです。概念の要点は、間接的にアクセスされるだけではなく、直接操作できるものを識別することです。

たとえば、ほとんどすべてのプログラミング言語では、制限されたサイズのマシン整数(8ビット整数、32ビット整数、64ビット整数など)がファーストクラスの値です。それらを変数に格納し、それらを渡して関数などに返すことができます。アセンブリやCなどの低レベル言語ではなく、ほとんどの言語では、文字列はファーストクラスの値ですが、Cではそうではありません。文字列へのポインタを取得します。 Cでは、文字列と配列はファーストクラスの値ではありません。たとえば、配列を関数に渡すことはできません。配列を配列変数に割り当てることはできません。Cでは、関数はファーストクラスの値ではありません。いずれか:関数を変数に格納することはできません。関数へのポインターのみを格納します。対照的に、文字列と関数は、ほとんどの高水準プログラミング言語ではファーストクラスの値です。文字列などに格納できます。

コンパイルするように設計された多くのプログラミング言語では一流ではない概念の例は型です。 CやJavaなどの言語では、型はコンパイル時に存在するため、言語構造を使用して型を操作することはできません。 (Javaにもクラスに基づく動的な型システムがあります。クラスはリフレクションによるファーストクラスの値です。)対照的に、Pythonのような言語には、型を表す値を返すtype関数がありますその議論の。

標準的な用語での「ファーストクラスの値」の否定は「ファーストクラスの値ではない」です。 「セカンドクラスバリュー」という用語は一般的には使用されていません。この本の外でそれらを見ることを期待しないでください。 「秒」を「パラメーターとして渡すことができる」と定義する根拠はまったくなく、「3番目」を「パラメーターとして渡すことはできない」と定義する根拠はなく、意味のある番号を付けることができる規模はありません。関数にパラメーターとして渡すことができる値と変数に割り当てることができる値を区別する言語はほとんどないため、この概念の名前を定義しても意味がありません。