4

関数型言語の多く (実際には私がこれまでに使用したすべて) では、ステートメントと式の間に区別はなく、各コード ブロックの最後の値はブロックの「戻り値」です。一方、純粋に機能的であると一般に考えられていない言語では、通常、この区別が導入されます。

私が話していることの例として、次の python コードが出力されますNone

def foo():
    5 + 5
print(foo())

スキームコードが出力されている間10

(define (foo) (+ 5 5))
(display (foo))

もちろん、あるスタイルを他のスタイルよりも好む人の主観的な回答には興味がありませんが、客観的な理由には興味がありません。

私には、この区別が言語の文法と実装をより複雑にしているように見えます (これのあまり明白でない例の 1 つは、テンプレートと void 型の c++ 標準で必要な例外、または?cのような「ショートカット if ステートメント」の導入です)。 -影響を受けた言語) 本当の利点はありませんが、おそらく、新しい現代の言語でさえこの区別があるのには理由があります.

4

3 に答える 3

5

どこにでもある副作用。

純粋な関数型言語を使用している場合、すべてが式です。次のようなものを返す「ステートメント」でさえ()(おそらくタイプによって区別されIO ()ます。

ただし、ほとんどのプログラミング言語は、デフォルトでどこでもどこでも効果を許可するため、順序付けが重要であり、コンピューターへのステートメントを順序付けするための特別な構文をセミコロンで区切ることがよくあります。

これは、式のセマンティクスを保持する任意の順序で評価できる純粋な式には当てはまりません。

副作用アクションは、特別な構文を取得するような特別な式と見なされます。

于 2012-12-31T12:43:39.420 に答える
4

最初に、あなたは 2 つ、あるいはそれ以上の異なる質問をしていると思います。および「シーケンスのセマンティクスが何であるかはなぜですか?」

あなたの最初の質問について: 私が読んだ多くのことから得た感覚は、ステートメント式ですが、すべての状況で部分式として現れることができない制限された式のクラスです。

x = 4
y = (x += 1)

上記の python コードは、(制限のない) 式が予期される場所にステートメントが出現するため、構文エラーを生成します。私はステートメントを副作用、順序付け、および命令スタイルと関連付けます。あなたがプログラミングスタイルをあなたの質問に対する主観的な答えだと考えているかどうかはわかりません (スタイル自体は確かに主観的です)。

この質問に対する他の人の意見も非常に興味があります。

2 番目の質問について: セマンティクスは恣意的に決定されることもありますが、目的は合理的なセマンティクスであり、さまざまな言語設計者が最も合理的な (または最も期待される) ものを単純に区別しています。制御が Python の関数本体の最後に到達すると、None が返されることを知って驚きましたが、それはセマンティクスです。設計者は、「while ループの型はどうあるべきか?」などの同様のセマンティクスの質問に答える必要があります。および「else 分岐がない場合、if ステートメントの型はどうあるべきですか? そして、そのようなステートメントは構文的にどこで許可されるべきですか (そのような if ステートメントが一連のステートメントの最後のステートメントである場合、問題が発生する可能性があります)?」

于 2012-12-31T06:40:54.830 に答える
0

問題は、「なぜ新しい言語にはまだ式だけではなく文があるのか​​?」ということですよね?

プログラミング言語の設計は、さまざまな問題に対処します。

  1. 簡単な文法、
  2. 簡単な実装、
  3. 単純なセマンティクス

より理論的な設計目標の 1 つであり、

  1. 結果のコンパイル済みコードの実行速度
  2. コンパイル速度
  3. 実行中のプログラムのリソース消費
  4. 使いやすさ(読みやすいなど)

より実用的なものの中にあります...

これらの設計目標には明確な定義がありません。たとえば、短い文法は必ずしも最も構造がきれいな文法であるとは限らないため、どちらがより単純でしょうか?

(あなたの例を考慮して)

使いやすさやコードの読みやすさのために、言語設計者は、関数の結果の値 (または式) の前に「return」と書くことを要求する場合があります。これはリターンステートメントです。「return」を省略できる場合でも、それは暗示され、return ステートメントと見なすことができます (コードではそれほど明白ではありません)。それが式と見なされる場合、これは、Scheme などの置換セマンティクスを意味しますが、おそらく Python ではありません。構文上の観点から、'return' が必要なステートメントと式を区別することは理にかなっています。

機械語コード (私はあまりやっていないので、間違っているかもしれません) を見ると、ステートメントしかなく、式がないように思えます。

あなたの例:

ld r1, 5
ld r2, 5
add r3, r1, r2
ret r3

(明らかに、私はこれを作っています)

したがって、(von Neumann) CPU コアが実際にどのように動作するかという観点から考えるのが好きな人、またはそのようなターゲット アーキテクチャのコンパイルを簡素化したい人にとっては、ステートメントがその方法です。

特定の「悪」(非機能的) 割り当てステートメントもあります。終了ループを再帰なしで表現するために必要です。Dijkstra によると、ループは再帰よりも単純なセマンティクスを持っています (ref. EW Dijkstra、「A Discipline of Programming」1976)。ループは、再帰よりも高速に実行され、消費するストレージが少なくなります。あなたの言語が (Scheme のように) 末尾再帰を最適化している場合を除きます。

于 2013-01-01T21:06:15.937 に答える