Java 8에서 "설탕", "디 슈가"용어는 무엇입니까?


107

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

몇 가지 예 :

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

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

답변:


136

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

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

다음은 몇 가지 예입니다.

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

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

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

즉, 탈당

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

6
+1 OP가 요청한 답변을 완료 할 수 있으므로 desugar 부분에 대해 언급 할 수도 있습니다! :)
Rahul Tripathi 2014

6
@justhalf 함수를 전달할 수 있도록 생성 한 모든 인터페이스를 제거 할 수있을 때 프로그램이 얼마나 얇아 질지 생각해보십시오.
Denys Séguret 2014

42
"Syntactic sugar는 세미콜론의 암을 유발합니다." -Alan Perlis
Stuart Marks

12
접미사 및 접두사 연산자는 C의 초기에는 구문 설탕이 아니라 한때였습니다. 오늘날의 표준에 따르면 초기 컴파일러는 멍청했고 이러한 연산자는 하나의 기계 코드 명령으로 구현 될 수 있었지만 동등한 할당 명령문은 불가능했습니다. 그래서 그들은보다 효율적인 프로그램을 작성할 수있었습니다.
Raedwald 2014

3
@justhalf이 질문은 많은 관심을 받았습니다. 이 경우 관리자가 건설적이지 않은 댓글을 삭제하도록하는 것은 드문 일이 아닙니다. 나는 당신의 코멘트를 삭제해야한다고 생각하지 않지만 많은 것을 가져 오지 않았습니다.
Denys Séguret 2014 년

17

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

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

문서의 핵심 문구 :

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


6

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

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

또한 String 스위치, type erasure, ...

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.