[java] Java 8에서 “설탕”, “디 슈가”용어는 무엇입니까?

Java 8에서 ‘설탕’과 ‘디스가 링’에 대해 더 자주 듣습니다.이 용어는 무엇을 의미합니까? 개념적이거나 구문 적입니까?

몇 가지 예 :

Java로 다시 발생하는 기본 반복 루프

컴파일시 구문 설탕에 대한 관찰.



답변

프로그래밍에서 sugar 는 일반적으로 일부 구문을 더 쉽게 입력하고 읽을 수 있도록 하는 단맛 추가 (대부분 단축키)를 나타냅니다 (실제로는 프로그램의 수명주기 동안 가장 중요한 구성 요소).

위키피디아는 문법적인 설탕에 대한 정의를 가지고 있지만 모든 설탕이 본질적으로 구문적인 것은 아닙니다 (최근의 모든 달콤한 추가가 단지 컴파일러 변경이 아니 었습니다).

다음은 몇 가지 예입니다.

  • 접미사 및 접두사 증가 연산자 ( i++++i). 그들의 유일한 목적은 추가 진술을 작성하지 않는 것입니다. 그들은 순수한 설탕입니다.
  • +=, |=, &=, 등 설탕 같은 종류로 만들어진다.
  • 원시 유형과 객체 간의 암시 적 변환도 당연합니다.
  • 유형 추론도 설탕입니다.
  • Java 8과 함께 제공되는 Lambda 표현식은 다른 종류의 설탕입니다 (이는 단순한 구문아닙니다 ).

Java는 특히 현대 언어에 비해 간결하지 않은 것으로 널리 알려져 있습니다. 그렇기 때문에 코드를 더 빨리 읽을 수 있도록 도와주는 추가 기능을 환영합니다.

끝내기 위해 설탕이 부족하면 프로그램이 뚱뚱해질 수 있지만 설탕이 너무 많으면 같은 것을 작성하는 여러 가지 방법으로 이어지고 언어가 메스 꺼워지고 프로그램이 일관성이 떨어지고 유지 관리가 어려워 질 수 있습니다. . 또 다른 종류의 설탕 인 API 설탕은 API를 파악하기 어렵게 만드는 전염병입니다.

즉, 탈당

  • 언어에서 중복되는 모든 것을 제거하는 프로세스
  • 코드 프로세서가 설탕 문장 뒤에 무엇이 있는지 알아내는 프로세스 (예를 들어 유형 추론이 포함될 수 있음)

답변

“Desugaring”은 Java 8에서 매우 특정한 의미를 갖는 것으로 보입니다. 람다식이 실제 구체적인 메서드 호출에 바인딩 될 수있는 다양한 방식을 표현하는 포괄적 인 용어 인 것 같습니다.

“람다 표현식의 번역” 에 대한이 문서 는 특정 사항에 관심이있는 경우 진행되는 작업에 대한 실제 세부 정보를 가지고있는 것 같습니다.

문서의 핵심 문구 :

람다를 바이트 코드로 변환하는 첫 번째 단계는 람다 본문을 메서드로 desugaring하는 것입니다.


답변

일반적으로 javac에서 “desugaring”을 사용하면 기존 기능으로 일부 언어 기능을 나타낼 수 있습니다. 이를 통해 클래스 파일 형식을 크게 변경하지 않고도 바이트 코드로 표현할 수 있습니다. 또한 이러한 이유로 컴파일러의 백엔드는 프론트 엔드보다 안정적입니다. 이것은 람다 및 메서드 참조의 경우가 아닌 것처럼 모든 새로운 언어 기능이 단지 구문상의 설탕이라는 것을 의미하지는 않습니다. 컴파일러에는 “desugaring”의 더 많은 예제가 있습니다.

  • 각 루프에 대해 C 스타일 for 루프에 “desugared”
  • 단언은 if 문장에 “desugared”됩니다.
  • 내부 클래스는 독립형 클래스로 표시됩니다.

또한 String 스위치, type erasure, …


답변