web-dev-qa-db-ja.com

Java 8?の文脈における「砂糖」、「脱糖」という用語は何ですか?

「シュガーリング」と「デシュガーリング」については、Java 8、これらの用語はどういう意味ですか?概念的または構文的ですか?.

いくつかの例:

Javaに再糖化するデフォルトの反復ループ

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

97
Xelian

sugar、プログラミングでは、通常、sweet追加、主にショートカットを指します。これは、いくつかの構成体の入力と読み取りを容易にします(後者は実際には最も重要です)プログラムのライフサイクル中)。

ウィキペディアには シンタックスシュガー の定義がありますが、すべてのシュガーが本質的にシンタックスであるわけではないことに注意してください(最近の甘い追加はすべてコンパイラーの変更だけではありませんでした)。

以下に例を示します。

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

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

最後に、砂糖が不足するとプログラムが太くなる可能性がありますが、過剰な砂糖は同じことを書くさまざまな方法につながるため、言語が混乱し、プログラムの一貫性が低下し、維持が難しくなることに注意してください。別の種類の砂糖、APIシュガーは、ほとんどの場合ペストであり、特に追加(オーバーロードなど)で作成されている場合、APIの把握が難しくなります。

これは、desugaringのいずれかを指します

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

「脱糖」はJava 8。

"Lambda Expressionsの翻訳" に関するこのドキュメントには、詳細に興味がある場合に何が起こっているかの本当の詳細があるようです。

ドキュメントからのキーフレーズ:

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

15
Shorn

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

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

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

5
Vicente Romero