구문 설탕의 엄격한 정의? [닫은]


9

언어 전쟁에서 사람들은 "단순한 구문 설탕"으로서 특히 유용하지 않은 기능을 끊임없이 거부합니다. "진정한 특징"과 "구문 설탕"사이의 경계는 이러한 논쟁에서 희미 해지는 경향이 있습니다. 화자 / 작가가 유용하지 않은 기능으로 정의되지 않는 구문 설탕의 합리적이고 명확한 정의는 무엇이라고 생각하십니까?

답변:


19

어떻습니까? "구문 설탕은 의미있는 추상화 계층을 도입하지 않는 일부 기능을 편리하게 줄여줍니다."

a->b당신이 지적한 대로을 가져 가십시오 (*a).b. 이 표기법을 사용하면 유용하고 숨겨진 방식으로 코드를 고려할 수 있습니까? 아니요, 그것은 구문 설탕입니다.

이제 고려하십시오 a[i] == *(a + i). 실질적인 방식으로 배열을 사용하는 C 프로그램을 생각해보십시오. []표기법 없이 이해하려고 노력할 수 있습니까 ? 다차원 배열? 연속적인 메모리 블록의 시작에 대한 참조가 아니라 배열을 전체 단위로 간주하는 것이 의미가 있습니다. 복잡한 배열을 수행하려는 경우 C에서 배열이 작동하는 방식을 이해하는 데 도움이되지만 항상 "두 비트의 메모리 2 * i 바이트를 오른쪽에 저장해야합니다"라고 생각하는 것은 비생산적입니다 a"로 참조되는 메모리 위치 ." 배열의 요점은 시퀀스를 코 히어 런트 유닛으로 저장하는 프로세스를 추상화하는 능력입니다. 이 []표기법은 이러한 추상화를 용이하게합니다. 구문 설탕 이 아닙니다 .

이것은 구문 설탕이 항상 나쁜 것을 의미하지는 않습니다. 많은 동맹과 마찬가지로, 그것은 하나의 유행이되어 "실제 특징"에 맞서게되었습니다. 그러나 예를 들어 LISP와 Scheme은 let속기 (및 다른 것) 가 아니라면 읽을 수 없습니다 .

삼항 연산자 인 <pred> ? <cnsq> : <alt>또 다른 예입니다. 구문 설탕은 프로그램을 구성하고 중복 코드를 제거하여 유지 관리 비용을 절감 할 수 있습니다. 프로그래밍에 대한 구문 적 장벽을 제거하는 데 도움이되는 경우, "실제 기능"을 말리는 것보다 때때로 구문 설탕이 바람직 할 수 있습니다.

R ^ 5RS 를 인용하려면 "프로그래밍 언어는 기능 위에 기능을 정리 하는 것이 아니라 추가 기능이 필요한 것으로 보이는 약점과 제한 사항을 제거하여 설계해야합니다." IMHO, 구문은 약점과 제한으로 간주 될 수 있으므로 프로그래머가 구문에서 벗어날 수있게 하면 언어 표현력이 향상 될 수 있습니다 .


7

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

BS의 "실제 특징"또는 "구문 설탕"이라는 개념은 진정한 스코틀랜드 인의 실수와 같지 않기 때문 입니다. 그 구절은 "합리적이지 않은 주장을 유지하려는 임시 시도"입니다. 여기서는 "실제 기능"을 대신 사용할 수 있기 때문에 여기서 기능이 간단하다는 주장입니다.

BS는 설탕을 사용하는 것을 피해야 한다고 주장하기 때문에 BS 는 버그 를 작성할 있기 때문에 버그를 작성하기는 어렵지만 버그를 작성하기가 어려워 야합니다. 굉장하지 않습니까? 동일한 문구를 사용하면 동일한 논리를 사용하는 것과 정확히 반대되는 결론이 도출됩니다.

BS는 가독성이나 유지 보수성 또는 결함 주장을 백업하기 위해 사용성 연구 또는 결함 수 연구를 인용하지 않았기 때문에 BS입니다.

사람들이 종종 등가에 대해 잘못하거나 잘못되기 때문에 BS. 예를 들어이 질문 은 C # 문자열이 char 배열의 sugar라고 주장합니다. 그들은 아닙니다 .

그러나 의미 적으로 동등한 두 가지 경우 설탕이라고 말하고 싶다면 어쨌든 원하는대로 정의하고 정의하는 데 도움이됩니다.

누군가를 무시하고 싶다면 문구를 사용할 수도 있습니다.


2
"누군가를 무시하고 싶다면 문구를 사용할 수도 있습니다." - "바바라를 만났습니까? 그녀는 우리의 구문 설탕입니까?"
molf

@ 몰프. 꽤 재밌어요. 나는 누군가의 아이디어 나 일이나 도구를 의미한다고 생각합니다. "바바라를 아직 만났습니까? 그녀는 자신이 진짜 코더라고 생각하지만 설탕을 너무 많이 사용합니다." 또는 "Barbra는 Bar ++ v8.0의 전문가이지만 8.0은 설탕이 많은 7.0에 불과합니다."
Conrad Frix

7

여기입니다 매우 : 관련 개념에 대한 엄격한 정의 표현 에 의해
마티아스 펠리 센은 :

프로그래밍 언어의 표현력에 대하여 [Postscript는 내가 찾은 유일한 자유 형식이었습니다.]

또한 Java 언어 및 클로저대한 이 항목을 참조하십시오 .

효과적으로, 로컬 변경만으로 구문없이 형태로 변경 될 수 있다면 무언가는 구문 설탕입니다. 예를 들어 구문 형식이없는 경우 여러 다른 코드 위치를 변경하거나 조각을 다른 위치로 이동해야하는 경우에는 설탕이 아닙니다.

즉, 적절하게 사용하면 구문 설탕이 좋다. Scheme 프로그래머라면 let새로운 익명 함수를 만든 다음 적용하는 것보다 특별한 형식이 있다고 생각합니다 . 목적은 코드를 명확하게하는 것입니다.


5
+1 : 구문 설탕이 중요합니다. 현대 대수 표기법은 대체 된 라틴어 산문에 대한 구문 설탕이지만 수학적으로 추론하는 능력에 큰 차이를 만듭니다.
케빈 클라인

3

구문 설탕 이라는 용어 는 동일한 기본 의미를 표현하는 대체 구문을 나타냅니다.

sum임의의 길이의 정수 목록을 더할 수 있는 연산이있는 프로그래밍 언어 A를 예로 들어 보겠습니다 . 이 언어로 우리는 표현을 쓸 수 있습니다

sum []
sum [3, 4, 5, 1]
sum [2, 7]

결과는 각각 0, 13 및 9입니다.

이제 우리가 사용하는 시간의 90 % sum가 두 개의 주장으로 사용된다는 것을 인식하고 편의상 새로운 표기법을 도입 한다고 가정 해 봅시다.

2 + 7

그것은 단지 구문 설탕 입니다 sum [2, 7].

이제 추가 연산 이 없는 제 2 언어 B를 가져 가십시오 . 우리는 운영자가 좋아가 없을 수 있습니다 <, =우리가 숫자를 비교할 수 있지만, 할 수있는 방법 추가 번호를. 언어 B의 릴리스 2에서는 구문을 사용 하여 새로운 추가 작업을 소개 합니다.

2 + 7

평소와 같이 숫자를 추가합니다.

언어 A와 관련하여, +표기법은 구문 설탕입니다 (표기법 대신 사용할 수있는 대체적이고 간결하며 임시 sum [...]표기법 임). 마찬가지로 Hoa Long Tam의 답변에서 지적했듯이 C에서 표기법 p->field은의 구문 설탕입니다 (*p).field.

언어 B의 맥락에서, +표기법은 구문 설탕아닙니다 (이는 합 연산에 사용되는 유일한 유효한 구문입니다). 마찬가지로 C가 포인터를 통해서만 구조체 멤버에 액세스 할 수 (*p).field있고 표기법 p->field이없는 경우 표기법 은 구문 설탕이 아닙니다.

제 생각에는 프로그래밍 언어 의미론에 대한 혼란으로 되돌아 갈 수있는 구문 설탕에 대한 오해가 있습니다. 추론은 다음과 같습니다.

  • 프로그램의 의미는 프로그램이 계산하는 것입니다.
  • 프로그래밍 언어의 표현력은 해당 언어로 설명 할 수있는 계산으로 표현됩니다.
  • 튜링 머신을 사용하여 정의 된 모든 계산 가능한 기능을 설명 할 수있는 두 가지 프로그래밍 언어는 동일한 표현력을 갖습니다
  • ... 따라서 구문 만 다릅니다.
  • 추론 : Turing-complete 언어의 확장은 언어의 표현력을 변경하지 않기 때문에 구문 (구문 설탕) 일뿐입니다.

위의 추론은 "구문 설탕을 제대로 정의 할 수 없다", "맛의 문제", 또는 "모든 프로그래밍 언어 기능이 결국 구문 설탕"과 같은 일반적인 주장으로 이어진다.

위의 주장에서 주요 문제는 시맨틱이 프로그램에 의해 계산 될 수있는 것 뿐만 아니라 프로그램 이 계산 되는 방법 , 즉 사용되는 기본 구성과 결합 방법에 관한 것입니다.

예를 들어 객체 는 기본 비트 구성 및 비트 변환에 대한 구문 설탕이 아니며 데이터와 연산을 모델링하고 계산을 설명 할 수있는 구문입니다. 객체, 메소드, 메소드 호출을 사용한 컴퓨팅은 바이트, 프로세서 레지스터, 메모리 주소를 사용한 컴퓨팅과 동일하지 않습니다 (두 계산의 결과가 같더라도 두 번째 계산이 첫 번째 계산을 수행하는 경우에도 마찬가지 임).

나는이 설명을 약간 길게 만들었지 만 다른 답변에서 다루지 않은 것은 중요한 측면이라고 생각합니다.

결론 : 구문 설탕은 이미 언어로되어 있고 구문과 의미가 이미 정의 된 구문의 대체 구문 일 수 있습니다. 새로운 구문 (구문 설탕)은 기존 구문과 다르지만 의미같습니다 . 언어로 된 새로운 구문과 구문을 도입하면 구문 설탕이 없습니다.


0

구문 설탕은 언어 표현력 자체를 확장하지 않아서 중복되고 때로는 표기법을 남용하는 기능이지만 작가의 삶을 단순화하고 독자에게 더 많은 통찰력을 제공합니다.


0

내 자신의 질문에 대답하기 위해, 기능은 오직 그 경우는 미학과 가독성을 향상시키기 위해 주로 포함 된 경우 문법 설탕입니다 하찮게 드 - 설탕 버전으로 대략 일대일 방식으로 번역 될 수있다. (대략 일대일로 나는 계산 연산 순서, 변수 이름 및 공백 순서와 같은 사소한 것을 의미합니다.)

상당한 양의 프로그래머 징계로만 설탕을 제거 할 수있는 기능은 구문 설탕이 아닙니다. 이것의 부분 집합으로서, 프로그래머의 훈련을 통해 타입 안전을 수동으로 시행하는 것은 매우 중요하지 않기 때문에 타입 안전성을 향상시키는 기능은 구문 설탕이 아닙니다. 예를 들어, C ++의 객체 시스템은 C 포인터 캐스트 다형성의 상단에있는 구문 설탕 이상입니다.

중요한 코드 복제 또는 제거 된 경우 주요 재 설계가 필요한 기능은 구문 설탕이 아닙니다. 이는 간단한 작업이 아니기 때문입니다. 예를 들어, 템플릿 없이는 동등한 기능을 사용하려면 수많은 복제 및 수정이 필요하기 때문에 템플릿은 단순한 구문 설탕이 아닙니다.

일 예 이다 문법 설탕 :

a[i] 대신에 *(a + i)

a -> b 대신에 (*a).b

foreach 반복자 구문을 수동으로 입력하는 대신 구문.

모든 연산자 과부하는 순수한 구문 설탕입니다.

이것이 공정하고 합리적으로 명확한 정의처럼 들립니까?


3
연산자 과부하는 구문 설탕이 아닙니다. 이것이 C ++이 기본 유형 (예 : int)과 내 클래스 모두에서 작동하는 템플릿을 가질 수있게하는 것입니다.
Kate Gregory

@KateGregory : 함수 과부하가 구문 설탕이 아니라는 것을 받아들이면, 연산자 과부하는 단순히 표시된 값에서 과부하 기능을 호출하기위한 구문 설탕으로 간주 될 수 있습니다.
supercat

0

"구문 설탕"은 엄격하게 정의 된 용어가 아닙니다. 요청한 사람에 따라 다음과 같은 종류의 정의 중 하나를 얻을 수 있습니다.

  1. 진정한 스코틀랜드 접근 방식은 없습니다. 내가 좋아하는 것은 실제 프로그래밍이고, 내가 싫어하는 것은 구문 설탕입니다.
  2. MIPS 이후의 모든 것은 구문 설탕이었고, 일부 지침조차도 필요하지 않을 것입니다.
  3. 어딘가에 누군가를 위해 프로그래밍을 쉽게하는 것은 유용하며 구문 설탕은 아닙니다. 어떤 상황에서도 유용한 기능을 찾지 못하면 기능이 추가되지 않았기 때문에 기존의 모든 기능이 구문 설탕이 아닙니다. 가상의 특징은 누군가가 그 기능이 유용하다고 결정할 때까지 구문 설탕 일 수 있습니다.

-3

나는 컴퓨터 과학 분야에서에 대해 잘 모르겠지만, 논리의 필드가 보수성과 정의 [의 제거 가능성의 개념이다 1 ] 같은 맥락에있는 것으로 보인다.

Curry-Howard 서신을 적용하면“syntactic sugar”에 대한 병렬 개념이 나올 수 있습니다.

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