“Syntax”와“Syntactic Sugar”의 차이점은 무엇입니까


45

배경

Syntactic Sugar 의 Wikipedia 페이지는 다음과 같습니다.

컴퓨터 과학에서, 구문 설탕은 물건을보다 쉽게 ​​읽거나 표현할 수 있도록 설계된 프로그래밍 언어 내의 구문입니다. 그것은 사람들이 사용하기에 언어를 "더 달콤하게"만들어줍니다. 사물은 더 명확하고 간결하게 표현되거나 다른 스타일로 선호 될 수 있습니다.

Syntactic Sugar와 Syntaxactic의 차이점이 무엇인지 이해하지 못합니다.

설탕 버전이 더 명확하고 간결하며 보일러 플레이트를 끓일 수 있다는 점에 감사합니다. 그러나 어떤 수준에서는 모든 구문이 본질적으로 코드가 컴파일되는 것에 대한 추상화를 형성하기 위해 수행됩니다.

동일한 Wikipedia 페이지에서 :

컴파일러, 정적 분석기 등을 포함한 언어 프로세서는 종종 "설탕 제거 (desugaring)"라고하는 프로세스 인 설탕 처리 된 구조를 처리하기 전에보다 기본적인 구조로 확장합니다.

생각 연습으로,이 문장에서 "항상"을 의미하기 위해 "종종"을 사용하는 경우 : 다음 단계로 넘어 가기 전에 컴파일러가 구문을 "설탕 제거"하는지 여부가 차이라면, 내부자를 모르는 코더는 어떻게 할 수 있을까요? 컴파일러 중 Sugar'd Syntax가 무엇인지 아는가?

이 사이트에 관한 매우 많은 관련 질문 "구문 설탕의 엄격한 정의?" 시작 하는 대답 이 있습니다.

IMHO 나는 구문 설탕에 대한 정의를 가질 수 없다고 생각합니다. 왜냐하면이 문구는 BS이고 "실제 운영 체제"에서 "실제 도구"를 사용하여 "실제 프로그래머"에 대해 이야기하는 사람들이 사용할 수 있기 때문입니다.

언어를 사용하는 코더에는 큰 차이가 없을 수도 있습니다. 아마도 차이점은 컴파일러 작성자에게만 허용됩니까? 언어를 사용하는 코더가 Syntactic Sugar의 후드 아래에 무엇이 있는지 아는 것이 도움이되는 사례가있을 수 있습니까? (그러나 실제로는 주제에 관한 어떤 담론이이 용어를 불꽃 미끼로 사용하는 경향이 있습니까?)

질문의 핵심

그래서 ... 질문의 짧은 버전 :

  • Syntaxactic Syntax와 Syntactic Sugar 사이에 실제 차이점이 있습니까?
  • 누구에게 중요한가?

생각을위한 여분의 음식

주제 모순에 대한 보너스 :

Wikipedia 페이지에서 예제가 제공됩니다.

예를 들어, C 언어에서 a[i]표기법은*(a + i)

위의 링크 된 질문에 대한 또 다른 대답 은 동일한 예에 대해 이야기합니다.

이제 고려하십시오 a[i] == *(a + i). 실질적인 방식으로 배열을 사용하는 C 프로그램을 생각해보십시오.

그리고 그 요약 :

[]표기법은 이러한 추상화를 용이하게합니다. 구문 설탕이 아닙니다.

동일한 예에 대한 반대 결론!


9
인용 된 질문에 대한 대답에서 나는 구문 설탕 이 일반적인 구문을 쉽게 표현할 수 있지만 새로운 의미를 도입하지 않는 대체 구문 (언어에 이미 존재하는 구문)이라고 설명합니다. 이러한 의미에서 구문 설탕은 문맥에 따라 다릅니다 (사용되는 언어에 따라 다름). 동일한 표기법은 한 언어에서 일반적인 구문 일 수 있고 다른 언어에서는 구문 설탕 일 수 있습니다. 이 설명이 도움이 되나요?
Giorgio

7
한 가지 문제는 일부 사람들은 "구문 설탕"이 그렇지 않은 경우 더러운 단어라고 생각하는 것 같습니다. 시스템에 추가하는 각 기능이나 클래스는 "구문 설탕"으로 간주 될 수 있습니다. 왜냐하면 언어에서 이미 표현할 수있는 아이디어를 표현하기가 조금 더 쉽기 때문입니다.
Joris Timmermans

분명히, 그것은 당신에게 중요합니다.
SShaheen

11
결국, 그것은 전기를 통하는 합성 설탕 일뿐입니다.
Anthony Pegram

답변:


34

주요 차이점은 구문은 언어로 정의 된 문법으로 일부 기능을 노출 할 수 있다는 것입니다. 해당 기능을 사용할 수있게되면 바로 동일한 작업을 수행 할 수 있는 다른 구문이 설탕으로 간주됩니다. 물론 두 구문 중 어느 것이 설탕인지에 대한 이상한 시나리오가 발생합니다. 특히 어느 것이 먼저 나왔는지는 항상 명확하지 않기 때문입니다.

실제로, syntactic sugar는 infix lhs + rhsmap to 와 같이 사용하기 쉽도록 언어에 추가 된 구문을 설명하는 데만 사용 됩니다 lhs.Add(rhs). C의 배열 인덱싱은 구문 설탕이라고 생각합니다.

우아한 디자인은 복제 량을 제한하는 경향이 있기 때문에 중요합니다. 구문 설탕의 필요 (또는 적어도 원하는)는 디자인 실패의 표시로 볼 수 있습니다.


"기능에 도달하자마자 같은 일을 할 수있는 다른 구문은 설탕으로 간주됩니다." . 당과 탈당 프로그램은 동일한 의미를 가져야합니다 .
Giorgio

3
@Giorgio "이 두 프로그램은 같은 의미를가집니다"와 다른 "이 두 프로그램은 같은 기능을 계산합니다"는 어떻습니까? 그 외에도, 구문 요소가 아닌 프로그램에 집중하고 있습니다. 전체 프로그램은 구문 설탕 일 수 없습니다. 연산자, 문장 종류 등은 구문 설탕 일 수 있습니다.

@Giorgio-사실, 다른 의미론을 가진 유사한 기능을 다른 기능으로 고려하고 있습니다. 그리고 그래, 같은 의미론을 가진 자신의 컴파일러를 작성하고 그것을 "설탕"이라고 부르는 것처럼 후프 점프가있을 수 있습니다. 솔직히 그러한 비공식적 인 개념에 대한 공식적인 정의는 일어나지 않을 것입니다.
Telastyn

1
@Giorgio 다시 한번, 내 쇠고기는 동등성을 취한 것이 아니라 프로그램에 구문 설탕 개념을 적용하려고 시도하는 것입니다. 이 용어는 전체 프로그램을 의미하지는 않습니다! 당신의 정의에 따라, 그것은 원자 구성 요소이거나 짧은 프로그램 조각 일뿐입니다 (첫 번째는 80 % 이상을 차지하지만 일반적으로 구문 설탕으로 간주되는 모든 것을 다룰지는 확실하지 않습니다).

3
@Giorgio 예를 들어, 전체 프로그램 ;-) 또는 두 공식이 여러 관련없는 언어 키워드를 포함 할만큼 충분히 큰 것. 내가 구문 설탕으로 취급 한 적이없는 것은 if (a) return blah; ...vs result_type res; if (a) res = blah; else {...}; return res;입니다. 당신은 특정 언어를 가정하고, 프로그램 사이의 차이점을 찾기 위해 극도로 언어 변호사를 구해야합니다 (종종 작은 단계의 작동 의미론의 시점까지).

10

구문은 언어 프로세서가 언어 구성의 의미를 이해하기 위해 사용하는 것입니다. 구문 설탕으로 간주되는 구문도 언어 프로세서에서 해석해야하므로 언어 ​​구문의 일부입니다.

구문 설탕을 언어의 나머지 구문과 구별하는 것은 언어로 작성 될 수있는 프로그램에 영향을 미치지 않고 언어에서 구문 설탕을 제거 할 수 있다는 것입니다.

좀 더 형식적인 정의를주기 위해

구문 설탕은 언어의 다른 구문 구조와 관련하여 효과가 정의되는 언어 구문의 일부입니다.

구문 설탕의 사용은 종종 의도가 더 이해하기 쉬운 프로그램으로 이어지기 때문에 구문 설탕이나 그 언어를 거부하는 것은 아닙니다.


"구문 설탕은 언어의 구문의 일부이기 때문에 '이것은 구문 설탕이며 구문이다'라는 결정적인 방법은 없습니다.": 거짓. 이미 언어에 있고 구문이있는 일부 구문의 구문 설탕 으로 구문 을 소개하는 것은 언어 디자이너입니다 . 구문 설탕은 일반적으로 ad-hoc (일반적이지 않음)이지만 더 읽기 쉽고 사용하기 편리합니다.
Giorgio

@ Giorgio : 첫 번째 단락이 약간 어색 했으므로 다시 표현했습니다. 그러나 나는 구문 설탕이 일반적으로 임시로 첨가된다는 것에 동의하지 않습니다. 가장 널리 알려진 구문 설탕은 아마도 C의 ->연산자 일 것입니다. 그리고 그 연산자가 다른 연산자보다 덜 일반적이라고 생각하지 않습니다.
Bart van Ingen Schenau

1
@Giorgio :이 경우 단일 어셈블리 명령어에 직접 매핑되지 않는 모든 항목은 항상 간단한 조각으로 나눌 수 있으므로 구문 설탕으로 간주해야합니다 (함수 포함). 나는 당신이 그 견해를 공유하는 많은 사람들을 찾지 못할 것이라고 생각합니다.
Bart van Ingen Schenau

1
"Ad-hoc"은 특별하고 제한된 상황에서 사용됨을 의미합니다. 이 용어는 일반적으로 부정적인 의미를 갖지 않습니다. 임시 솔루션이라는 용어는 일반적으로 특정 솔루션이 아닌 일반적인 솔루션을 원하기 때문에 부정적인 의미를 갖습니다 (유사한 문제를 반복해서 해결하지 않기 위해).
Giorgio

1
"ad-hoc 솔루션"은 종종 나쁘기 때문에 "ad-hoc"자체는 나쁨을 의미하는 것 같습니다. 그러나 "ad-hoc polymorphism"AKA 함수 오버로딩 ( en.wikipedia.org/wiki/Ad_hoc_polymorphism )도 있으며 이는 나쁘지 않습니다. 적어도 이탈리아어 (모국어)에서는 라틴어 "임시"의 사용 자체가 부정적이지 않습니다. 영어로 부정적인 의미를 가지면 내 무지를 용서하십시오.
Giorgio

6

다른 답변은 핵심 개념을 언급하지 않았습니다 : 추상 구문 ; 그것 없이는 "구문 설탕"이라는 용어는 의미가 없습니다.

추상 구문은 언어의 요소와 구조 및 해당 언어의 문구를 결합하여 더 큰 문구를 만드는 방법을 정의합니다. 추상 구문은 구체적인 구문과 무관합니다. 내가 이해하는 "구문 설탕"이라는 용어는 구체적인 구문을 나타냅니다.

일반적으로 언어를 디자인 할 때 사람들이 일반 텍스트를 사용하여 언어로 코드를 작성할 수 있도록 추상 구문의 각 용어에 대해 구체적인 구문을 작성하려고합니다.

이제 foo에 대한 어색한 구체적인 구문을 작성한다고 가정 해 봅시다 . 사용자는 불만을 제기 하고 동일한 추상 구문 을 나타내는 새로운 구체적 구문을 구현 합니다 . 결과적으로 추상 구문과 의미가 변경되지 않았지만 동일한 추상 구문 용어에 대해 두 가지 구체적인 구문이 생겼습니다.

저는 이것이 사람들이 "구문 설탕"이라고 말할 때 의미하는 것입니다. 구체적인 구문에만 영향을 미치지 만 추상적 인 구문이나 의미에는 영향을 미치지 않는 변화입니다.

"syntactic sugar"와 "concrete syntax"의 차이점이 분명해졌습니다. 나에게. :)

이 해석은 또한 Alan Perlis가 "구문 설탕이 세미콜론의 암을 유발한다"고 말할 때 의미 한 바를 설명하는 데 도움이됩니다. 세계의 모든 구체적인 구문 설탕은 약한 추상 구문을 고칠 수 없으며 설탕을 첨가하는 데 드는 모든 노력은 실제 문제, 추상 구문을 다루는 데 소비하지 않는 노력.


나는 이것이 전적으로 나의 의견임을 주목해야한다. 내가 생각할 수있는 유일한 해석이기 때문에 나는 그것을 믿습니다.


1
나는 또한 추상 구문과 구체적인 구문에 대해 생각했지만 이것이 항상 구문 설탕을 설명하는지 확실하지 않습니다. 예를 들어 C에서 pfield를 포함하는 구조체에 대한 포인터 가 주어지면 x표현식 (*p).xp->x사용하고 동일한 추상 구문을 가지고 있습니까? 그러나 모든 것이 추상적 구문과 구체적인 구문으로 요약되면 좋을 것이라고 생각합니다.
Giorgio

@Giorgio 불행히도, 나는 그중 하나가 다른 쪽의 구문 설탕인지 또는 추상적 구문 트리가 어떻게 생길지 자신있게 진술 할 수있는 충분한 C를 모른다. 또는 C의 스펙이 실제로 추상 구문을 정의하더라도. :(

1
첫 번째 표현식은 .루트가 있는 트리로 구문 분석 할 수 있습니다 . 루트의 왼쪽 하위 노드 *p입니다. 그 하위 노드 는 입니다. 루트의 오른쪽 하위 노드는 x입니다. 두 번째 표현의 경우, 추상 구문 트리가있다 ->루트 및 루트는 두 아이가 px. 두 표현식을 서로 다르게 구문 분석하여 동일한 추상 구문 트리를 갖도록하는 것이 합리적인지 알아 내려고 노력하고 있지만 현재는 방법을 보지 못합니다.
Giorgio

3
이 구문 분석 트리는 종종 AST로 묘사 되더라도 Matt가 말하고있는 추상 구문과 동일하다고 생각하지 않습니다. 두 표현식 모두 동일한 동작을 갖습니다 ( 포인터 유형을 참조 유형으로 변환 한 다음 멤버를 참조하십시오x )
쓸모없는

1
"두 표현식 모두 동일한 동작을 갖습니다 (포인터 유형을 참조 유형으로 변환 한 다음 멤버 x에 대한 참조 가져 오기)": 이것은 추상 구문이 아닌 의미론입니다. 추상 구문은 프로그램의 실제 구조를 반영하는 트리를 생성하기 위해 구체적 구문 (예 : (또는 ;) 의 쓸모없는 세부 사항을 생략하는 것을 말합니다 ( en.wikipedia.org/wiki/Abstract_syntax_tree 참조 ). 그러나 추상 구문에서는 프로그램의 의미에 대해서는 아직 언급되지 않았습니다.
Giorgio

4

구문 설탕은 언어 구문의 하위 집합입니다. 기본적인 아이디어는 같은 것을 말하는 방법이 여러 가지라는 것입니다.

어떤 조각이 구문 설탕인지, 어떤 조각이 "순수한 구문"인지 말하기 어렵게 만드는 것은 "어떤 형식이 처음인지 말하기 어렵습니다"또는 "언어 작성자가 의도 한 방식을 알기가 어렵다"또는 " 어떤 형태가 더 간단한지를 결정하기 위해 다소 임의적이다. "

어떤 조각이 순수하거나 설탕인지를 쉽게 결정하는 것은 특정 컴파일러 또는 인터프리터의 프레임 내에서 질문하는 것입니다. 순수한 구문은 컴파일러가 기계 코드로 직접 변환하거나 인터프리터가 직접 응답하는 것입니다. 설탕은 이러한 직접적인 일이 일어나기 전에 먼저 다른 구문으로 바뀌는 것들입니다. 구현에 따라, 이것은 저자가 의도 한 것과 언어 사양이 주장하는 것과 동일하거나 동일하지 않을 수 있습니다.

실제로, 이것은 문제의 현실이 결정되는 방식입니다.


이 답변은 구문 구현을 설탕인지 아닌지에 잘못 연결합니다. 언어의 요소가 "설탕"인지 아닌지, 요소의 구현 방식과 관련이 있는지에 대한 논쟁은 결코 보지 못했습니다. 순전히 다른, 못생긴 요소를 구문 적으로 복제하는지 여부에 관한 것입니다.
GreenAsJade

3

실제로, Wikipedia의 첫 인용문은 "... 더 읽기 쉽게 ...", ".... 사람들이 사용하기에 더 달콤하다 ..."라고 말합니다.

서면으로, "하지 말라"또는 "하지 않은"과 같은 단축 된 형태는 구문 설탕으로 간주 될 수 있습니다.


(1) "지금 가야한다"대 (2) "지금 가야한다"를 고려하십시오 : (1) (2)에 대한 구문 설탕입니까?
조르지오

1
@Giorgio 아니에요.
ozz

가독성 때문에 ( "해야한다"보다 "읽어야한다"), 또는 의미 때문에 ( "해야한다"및 "해야한다"는 다른 의미를 갖는다).
Giorgio

@Giorgio fair 충분히 :)
ozz

1
아, 나는 본다 :) 내가 생각하는 더 많은 직감, 그 예에서 하나가 다른 것보다 더 읽기 쉽다고 생각하지 않는다
ozz

3

일반적으로 구문 설탕은 일반성을 잃지 않고 명확성을 잃을 수있는 언어의 일부 (구문)로 표현할 수있는 언어의 일부입니다. 때때로 컴파일러는 소스 코드에 의해 생성 된 AST를 변환하고 간단한 단계를 적용하여 설탕에 해당하는 노드를 제거하는 명백한 탈당 단계가 있습니다.

예를 들어 Haskell에는 다음 규칙을 반복적으로 적용한 모나드 용 구문 설탕이 있습니다.

do { f }            ~> f
do { g; h }         ~> g >> do h
do { x <- f; h }    ~> f >>= \x -> do h
do { let x = f; h } ~> let x = f in do h

현재 정확히 의미하는 바는 중요하지 않습니다. 그러나 LHS의 특수 구문이 RHS (즉, 함수 응용 프로그램, 람다 및 등)에서보다 기본적인 것으로 변환 될 수 있음을 알 수 있습니다 let. 이 단계를 통해 두 세계를 최대한 활용할 수 있습니다.

  1. LHS에 대한 구문은 기존 아이디어를보다 명확한 방식으로 표현하는 프로그래머 (구문 설탕)에게 더 쉽습니다.
  2. 그러나 RHS 구문에 대한 컴파일러의 지원은 이미 컴파일러에 존재하므로이를 외부 외부 파서 및 역설 화 (오류보고 제외)로 처리 할 필요가 없습니다.

마찬가지로 C에서 desugaring rewrite 규칙을 상상할 수 있습니다 (연산자 과부하 등으로 인해 C ++에는 해당되지 않습니다).

f->h ~> (*f).h
f[h] ~> *(f + h)

오늘날이 구성을 사용하는 C를 사용 ->하거나 사용하지 않고 모든 프로그램을 작성하는 것을 상상할 수 []있습니다. 그러나 프로그래머가 구문 설탕을 사용하는 것이 더 어려울 것입니다 (70 년대에는 컴파일러의 작업을 단순화 할 수도 있습니다). 기술적으로 다음과 같이 완벽하게 유효한 다시 쓰기 규칙을 기술적으로 추가 할 수 있으므로 명확하지 않을 수 있습니다.

*f ~> f[0] -- * and [] have the same expressiveness 

구문 설탕은 나쁜가요? 반드시 그런 것은 아닙니다. 더 깊은 의미를 이해하지 않고화물 컬트로 사용될 위험이 있습니다. 예를 들어 다음 함수는 Haskell에서 동일하지만 많은 초보자는 구문 설탕을 과도하게 사용하고 있음을 이해하지 않고 첫 번째 양식을 작성합니다.

f1 = do x <- doSomething
        return x
f2 = doSomething

또한 구문 설탕은 언어를 지나치게 복잡하게 만들거나 너무 좁아서 일반화 된 관용어 코드를 허용 할 수 없습니다. 또한 언어가 특정 작업을 쉽게 수행 할 수있을만큼 강력하지 않다는 것을 의미 할 수 있습니다. 설계 상 (개발자에게 더 강력한 구문을 추가하여 다른 목표를 해칠 수있는 날카로운 도구 나 매우 구체적인 틈새 언어를 제공하지 않음) 또는 후자의 경우 일 수 있습니다. 형태는 구문 설탕에 나쁜 이름을 주었다. 언어가 구문 설탕을 추가하지 않고 다른 구문을 사용할 수있을만큼 강력하면이를 사용하는 것이 더 우아하다고 간주됩니다.


3

가장 확실한 예는 C의 "+ ="구문 일 것입니다.

i = i + 1;

 i +=  1;

정확히 동일한 작업을 수행하고 정확히 동일한 머신 명령어 세트로 컴파일하십시오. 두 번째 형식은 입력하는 두 문자를 저장하지만, 현재 값을 기준으로 값을 수정하고 있음을 더욱 명확하게합니다.

"++"post / prefix 연산자를 표준 예제로 인용하려고했지만 이것이 구문 설탕 이상이라는 것을 깨달았습니다. i = i + 1구문을 사용하여 ++ i와 i ++의 차이를 단일 표현식으로 표현할 방법이 없습니다 .


+ =는 다음과 같은 경우에 유용 할 수 있습니다 a[f(x)] += 1.
Florian F

1

먼저 구체적인 예를 들어 다른 답변을 다룰 것입니다. C ++ 11 범위 기반 for 루프 (다양한 다른 언어의 foreach 루프와 매우 유사)

for (auto value : container) {
    do_something_with(value);
}

(즉, 설탕 버전)과 정확히 동일합니다.

for (auto iterator = begin(container); iterator != end(container); ++iterator) {
    do_something_with(*iterator);
}

이제 언어에 새로운 추상 구문이나 의미를 추가하지 않아도 실제로는 유용합니다.

첫 번째 버전은 의도 (컨테이너의 모든 항목 방문)를 명시 적으로 만듭니다. 또한 순회 중 컨테이너를 수정하거나 iterator루프 본체에서 추가로 전진 하거나 루프 조건이 미묘하게 잘못 되는 등의 비정상적인 동작을 금지 합니다. 이렇게하면 가능한 버그 원인을 피할 수 있으며 코드를 읽고 추론하기가 어렵습니다.

예를 들어 두 번째 버전에서 한 문자의 실수는 다음과 같습니다.

for (auto iterator = begin(container); iterator <= end(container); ++iterator) {
    do_something_with(*iterator);
}

과거의 일회성 오류와 정의되지 않은 동작을 제공합니다.

따라서 sugared 버전은 더 제한적이기 때문에 정확하게 이해하고 이해하기가 더 간단합니다.


둘째, 원래 질문 :

Syntaxactic Syntax와 Syntactic Sugar 사이에 실제 차이점이 있습니까?

아닙니다. "구문 설탕"은 (구체적인) 언어 구문이며, 언어의 추상 구문이나 핵심 기능을 확장하지 않기 때문에 "설탕"으로 간주됩니다. 나는 이것에 대한 Matt Fenwick의 답변을 좋아합니다.

누구에게 중요한가?

그것은 다른 구문만큼이나 언어 사용자에게 중요하며 설탕에서 특정 관용구를 지원하기 위해 제공됩니다 (어떤 의미에서는 축복).

마지막으로 보너스 질문에

[] 표기법은 이러한 추상화를 용이하게합니다.

이것은 구문 설탕 의 정의 와 비슷하게 들립니다 . 포인터를 배열로 사용하여 지원하고 언어 작성자의 축복을 제공합니다. p[i]형태는 정말보다 더 제한없는 *(p+i)유일한 차이는 의도의 명확한 의사 소통 (그리고 약간의 가독성 이득) 그래서.


먼저 "[루프 기반 범위]는 [일부 다른 것]과 정확히 동일합니다"라고 말합니다. 그러나 순회 중에 컨테이너를 수정하는 것을 금지한다는 점에서 다릅니다. 그리고 설명한 단순한 구문 변환 (예 : "컨테이너"가 임시 인 경우의 동작) 이상의 다른 차이점이 있습니다. 이러한 차이점은 그것이 단지 구문 설탕 이 아니라는 것을 의미합니다 . 어쩌면 이것이 구문 설탕의 좋은 예가 아닌 것 같습니다.
Don Hatch

나는 그것이 일반적인 루프 와 동일하다고 말하지 않았고 , 주어진 특정 루프 와 동일하다고 말했다 . 특정의 루프는 컨테이너를 수정하고, 매우 일반적인 관용구을 대표하지 않습니다 -하지만 당신은 여전히 그 흔한 관용구 다음, 또는 특별한 뭔가 루프 본문에 숨어 경우 여부를 알주의 깊게 모든 일반 루프를 읽을 필요가있다. 새로운 루프는 일반적인 관용구에 대한 설탕이며 , 덜 장황하고 사용중인 관용구를보다 명확하게 전달합니다. 그것은 루프의 일반적인 아이디어에 대해 어떻게 든 설탕이 아니며 결코 주장하지 않았습니다.
쓸모없는

0

어구의 원래 의미가 무엇이든, 요즘은 주로 "유의 한"또는 "유일한"구문 설탕으로 표현되는 주로 중대하다. 읽을 수없는 방식으로 일을하고 동료에게이를 정당화 할 수있는 간결한 방법을 원하는 프로그래머에게는 매우 중요합니다. 오늘날이 용어를 주로 사용하는 사람들의 정의는 다음과 같습니다.

언어를 실제로 이해하지 못하는 프로그래머에게 버팀목을 제공하기 위해 더 널리 적용되는 다른 구문과 중복되는 구문입니다.

이것이 동일한 구문 요소에 대해 두 가지 반대 결론을 얻는 이유입니다. 배열 표기법에 대한 첫 번째 예는 Bart의 대답과 비슷한 용어의 원래 긍정적 인 의미를 사용하는 것입니다. 두 번째 예는 중추적 의미에서 구문 설탕이라는 비난에 대해 배열 표기법을 방어하는 것입니다. 다시 말해, 구문은 목발보다는 유용한 추상화라고 주장한다.


나는이 단어의 구문 적 의미 ( "구문 설탕 만")가 구문 설탕이 정보를 추가하지 않는다는 사실에서 비롯된 것이라고 생각한다.
Giorgio

1
그것은 구문론이 어떤 정보도 추가하지 않는다는 아이디어에서 나왔을 수도 있지만, 그 아이디어는 사실이 아닙니다. 의도에 대한 정보 (예 : 잘 알려진 관용구 사용)는 여전히 정보입니다.
쓸모없는

@ 쓸모없는 : 정보에 따르면 프로그램이 구문 설탕과 함께 또는 구문 설탕없이 동일하게 작동한다는 것을 의미했습니다. 물론 그것은 구문 설탕 (독자에게 정보 / 문서를 추가합니다)으로 더 읽기 쉽습니다.
Giorgio

가짜. 구문 설탕은 중대하지 않습니다. 소금을 쓸만한 프로그래머라면 누구나 동일한 코드를 복사하여 붙여 넣는 것보다 복잡한 작업을 캡슐화하고 단순화하는 라이브러리를 만들 것입니다. 이로 인해 더 잘 작동하고 유지 관리가 쉬운 코드가 생성됩니다. 이것은 본질적으로 복잡하지만 일반적인 패턴을 더 간단한 구문으로 추상화하여 구문 설탕이 달성하는 것입니다.
Craig

나는 사람들이 일반적으로 모욕이라는 용어를 의미한다고 말하고 있으며, 기본 관행 자체에 대해서는 언급하지 않습니다. "멍청이"라는 단어가 대표적이라는 말이 모든 사람이 바보라는 것을 의미하지는 않습니다. 사람들이 연습에 대해 긍정적으로 이야기하고 싶을 때 보통 "추상"또는 "캡슐화"와 같은 용어를 사용합니다.
Karl Bielefeldt
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.