Java 8のコンテキストで「砂糖」、「砂糖」という用語は何ですか?


107

Java 8で「シュガーリング」と「デシュガーリング」についてよく耳にしますが、これらの用語はどういう意味ですか?それらは概念的なものか、構文上のものか。

いくつかの例:

デフォルトの反復ループがJavaに再解析

コンパイル時の構文糖に関する観察。

回答:


136

プログラミングにおける砂糖とは、通常、一部の構成要素の入力と読み取りを容易にする甘い追加(ほとんどはショートカット)を指します(後者は、実際には、プログラムのライフサイクル中に最も重要です)。

Wikipediaには構文糖の定義がありますが、すべての糖が本質的に構文であるとは限らないことに注意してください(最近のすべての甘い追加がコンパイラーの変更だけであったわけではありません)。

以下にいくつかの例を示します。

  • 後置および前置インクリメント演算子(i++および++i)。彼らの唯一の目的は、追加のステートメントを書くのを避けることです。彼らは純粋な砂糖です。
  • +=|=&=、などの砂糖の同じ種類で構成されています。
  • プリミティブ型とオブジェクト間の暗黙的な変換も砂糖です。
  • 型推論も砂糖です。
  • Java 8に付属するラムダ式は、他の種類の砂糖です(これは構文だけではありません

特に現代の言語と比較して、Javaは十分に簡潔ではないと広く見られています。そのため、コードを読みやすくするための追加が歓迎されています。

最後に、砂糖が不足するとプログラムが太くなる可能性がありますが、砂糖が多すぎると、同じことを書くためのさまざまな方法につながり、言語が不安定になり、プログラムの一貫性が失われ、維持が困難になる可能性があります。別の種類の砂糖、API砂糖は、ほとんどの場合、特に追加で作成されている場合(オーバーロードなど)にAPIを把握するのを困難にするペストです。

これは言われて、desugaringはどちらかを指します

  • 言語で冗長なものをすべて削除するプロセス
  • コードプロセッサが糖化ステートメントの背後にあるものを見つけるプロセス(これには、たとえば型推論が含まれる場合があります)

6
+1砂糖の部分について言及することもできます。これで、OPが求めた答えが完成します。:)
Rahul Tripathi 2014

6
@justhalf関数を渡すためだけに作成したすべてのインターフェイスを削除できるようになると、プログラムがどれほど薄くなるかを考えてください。
DenysSéguret2014

42
「構文上の砂糖はセミコロンのガンを引き起こします。」-アラン・ペルリス
スチュアートマーク

12
Cの初期の頃、PostfixとPrefix演算子はかつては構文糖ではありませんでした。初期のコンパイラは、今日の標準ではばかげていて、これらの演算子は1つのマシンコード命令で実装できましたが、同等の代入ステートメントでは実装できませんでした。したがって、より効率的なプログラムを作成できるようになりました。
Raedwald 2014

3
@justhalfこの質問は多くの注目を集めました。これらの場合、建設的でないように見えるコメントを管理者に削除させることは珍しくありません。あなたのコメントを削除する必要があるとは思いませんが、それほど多くはありませんでした。
DenysSéguret2014年

17

「Desugaring」はJava 8で非常に特定の意味を持っているようです。ラムダ式が実際の具体的なメソッド呼び出しにバインドされるさまざまな方法を表すのは、包括的な用語のようです。

「ラムダ式の翻訳」に関するこのドキュメントには、詳細に興味がある場合に何が行われているのかについての詳細が含まれているようです。

ドキュメントの重要なフレーズ:

ラムダをバイトコードに変換する最初のステップは、ラムダ本体をメソッドに脱糖することです。


6

一般に、javacの「desugaring」では、一部の言語機能を既存の機能で表すことができます。これにより、クラスファイル形式に大きな変更を加えることなく、バイトコードでそれらを表すことができます。また、このため、コンパイラのバックエンドはフロントエンドよりも安定しています。これは、ラムダやメソッド参照の場合とは異なり、すべての新しい言語機能が単に構文上の砂糖であることを意味するものではありません。コンパイラに「desugaring」の例がさらにあります。

  • ループごとに、ループのCスタイルに "desugared"されます
  • アサーションはif文に「脱糖」されます
  • 内部クラスはスタンドアロンクラスとして表されます

あなたはまた、文字列スイッチで何が起こるかを調査することができます、タイプ消去、...

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.