통사당
Syntactic sugar컴퓨터 과학에서 통사설탕은 읽거나 표현하기 쉽게 고안된 프로그래밍 언어 내의 구문이다.그것은 인간이 사용하기 위해 언어를 "더 달콤하게" 만든다: 사물은 더 명확하고, 더 간결하게, 또는 일부 사람들이 선호하는 대체 스타일로 표현될 수 있다.
예를 들어, 많은 프로그래밍 언어는 배열 요소를 참조하고 업데이트하기 위한 특별한 구문을 제공합니다.추상적으로 배열 참조는 다음과 같이 표현될 수 있는 배열과 첨자 벡터의 두 가지 인수의 절차입니다.get_array(Array, vector(i,j))
대신 많은 언어가 다음과 같은 구문을 제공합니다.Array[i,j]
마찬가지로 어레이 요소 업데이트는 예를 들어 3개의 인수로 구성된 절차입니다.set_array(Array, vector(i,j), value)
단, 많은 언어가 다음과 같은 구문을 제공합니다.Array[i,j] = value
.
언어의 구조는 언어가 무엇을 할 수 있는지에 대한 어떠한 영향도 없이 언어에서 제거될 수 있다면 통사설탕이다: 기능성과 표현력은 그대로 유지될 것이다.
컴파일러나 정적 분석기를 포함한 언어 프로세서는 종종 설탕이 첨가된 구조를 처리 전에 보다 기본적인 구조로 확장합니다.이 과정은 때때로 "탈회"라고 불립니다.
오리진스
통사설탕이라는 용어는 1964년 피터 J. 랜딘이 람다 [1][2]미적분의 적용적 표현으로 의미론적으로 정의된 단순한 ALGOL과 유사한 프로그래밍 언어의 표면 구문을 설명하기 위해 만든 용어이다.
CLU, ML 및 Scheme와 같은 이후의 프로그래밍 언어들은 필수 구성체의 언어 코어로 정의될 수 있는 언어 내의 구문을 참조하도록 용어를 확장했습니다. 편리하고 높은 수준의 기능은 "배제"되어 하위 [3]집합으로 분해될 수 있습니다.이것은, 사실, 원초적 요소로부터 쌓는 일반적인 수학적 관행입니다.
1991년, 마티아스 펠라이센은 필수적인 언어 구조와 통사적 설탕 사이의 랜딘의 구별을 바탕으로, "표현력"의 코드화를 문학에서 "광범위하게 보유된 신념"과 일치하도록 제안했다.그는 "더 표현력"을 문제의 언어 구조가 없다면 프로그램을 완전히 [4]재구성해야 한다는 것을 의미한다고 정의했다.
주목할 만한 예
- COBOL에서 많은 중간 키워드는 선택적으로 생략될 수 있는 통사당이다.예를 들어, 그 문장은
MOVE A B.
그리고 문장은MOVE A TO B.
동일한 기능을 수행하지만 두 번째 기능을 사용하면 수행되어야 할 작업이 더 명확해집니다. - 증강 할당 또는 복합 할당 연산자:예를들면,
a += b
와 동등하다a = a + b
C 및 유사한 언어로, 가정할 때a
만약의 경우 등의 부작용이 없다a
는 정규 [5][6]변수입니다.Python과 같은[7] 일부 언어에서는 증강된 할당 연산자를 오버로드할 수 있으므로 표준 연산자와 다르게 동작할 수 있습니다. - Perl에서는
unless (condition) {...}
통사당이다if (not condition) {...}
또한 어떤 문장이든 조건이 뒤따를 수 있습니다.statement if condition
와 동등하다if (condition) {statement}
단, 전자는 한 줄에서 보다 자연스럽게 포맷됩니다. - C 언어에서는
a[i]
표기법은 통사당이다*(a + i)
. 마찬가지로,[8]a->x
표기법은 참조 해제 연산자를 사용하여 멤버에 액세스하기 위한 구문설탕입니다.(*a).x
. - 그
using
C#의 스테이트먼트를 사용하면 특정 오브젝트가 올바르게 폐기됩니다.컴파일러는 스테이트먼트를 try-finally [9]블록으로 확장합니다. - C# 언어에서는 변수를 다음과 같이 선언할 수 있습니다.
var x = expr
이를 통해 컴파일러는 의 유형을 추론할 수 있습니다.x
그 표현으로 보아expr
명시적인 타입 선언을 필요로 하지 않습니다.마찬가지로 C++에서는auto x = expr
C++11 및 Java를 통해var x = expr
Java 11 이후. - Python 목록 통합(예:
[x*x for x in range(10)]
정사각형 목록용) 및 장식자(예:@staticmethod
). - Haskell에서 따옴표로 표시된 문자열은 의미론적으로 문자 목록과 동일합니다.
- R 패키지의 깔끔한 컬렉션에서 파이프는 다음과 같이 표시됩니다.
%>%
파이프 앞의 데이터(또는 함수의 출력)가 파이프 [10]뒤의 함수의 첫 번째 인수로 기능함을 선언합니다.그렇게,x %>% f(y)
와 동등하다f(x,y)
. - SQL에서는
JOIN
와 동등하다INNER JOIN
후자는 join 스테이트먼트가 특히 외부 join 조작이 아닌 내부 join 조작임을 명확히 합니다. - OOP 언어로 메서드를 호출하는 형식
myObject.myMethod(parameter1, parameter2, parameter3)
통사설탕은 글로벌 기능을 호출하는 통사설탕이다.myMethod(myObject, parameter1, parameter2, parameter3)
. 객체에 대한 참조는 숨겨진 인수로 전달되며 보통 메서드 내에서 로 액세스할 수 있습니다. - 참조에 의해 호출되는 파라미터는 포인터를 파라미터로서 기술적으로 전달하기 위한 통사설탕이지만, 함수 내부의 코드에서 포인터의 지속적인 참조를 피하기 위해 변수 자체로서 구문적으로 처리한다.
- 자바에서는
import
선언을 사용하면 컴파일러는 정규화된 이름으로 지정되지 않은 클래스를 검색할 수 있습니다.예를들면import javax.swing.*;
프로그래머는 다음과 같은 Swing 객체를 참조할 수 있습니다.javax.swing.JButton
단축형 이름 사용JButton
.
비판
일부 프로그래머는 이러한 구문 조작성 기능이 중요하지 않거나 완전히 경박하다고 생각합니다.특히, 특별한 통사적 형태는 언어를 덜 균일하게 만들고 그 사양을 더 복잡하게 만들며, 프로그램이 크고 복잡해짐에 따라 문제를 일으킬 수 있습니다.이 뷰는 Lisp 커뮤니티에서 특히 널리 사용되고 있습니다.Lisp의 구문은 매우 단순하고 규칙적이며 표면 구문은 쉽게 [11]변경할 수 있기 때문입니다.예를 들어, Alan Perlis는 "Epigrams on Programming"에서 괄호로 구분된 언어들을 언급하면서 "통사설탕은 [12]세미콜론의 암을 유발한다"고 말한 적이 있다.
파생항
통사염
이 은유는 통사적 소금이라는 용어를 합성함으로써 확장되었는데, 이것은 나쁜 [13]코드를 쓰는 것을 더 어렵게 만들도록 설계된 특징을 나타낸다.구체적으로, 통사염은 프로그래머들이 프로그램 액션을 표현하기 보다는 무슨 일이 일어나고 있는지 알고 있다는 것을 증명하기 위해 통과해야 하는 고리이다.예를 들어 Java 및 Pascal에서 float 값을 int로 선언된 변수에 할당하는 경우 int에 할당된 float 값은 컴파일 오류가 발생한다고 명시적으로 명시하지 않고 C 및 C++는 자동으로 잘라냅니다.그러나 이것은 구문이 아니라 의미론이다.
C#에서는 상속된 클래스 멤버를 숨길 때 컴파일러의 경고가 발행됩니다.단, 이 경고는new
숨기기가 [14]의도적인 것을 지정하기 위해 키워드를 사용합니다.스위치문 구문이 C 또는 C++ 구문과 유사하기 때문에 발생할 수 있는 버그를 피하기 위해 C#에는break
비어 있지 않은 각에 대해case
의 라벨switch
(단,goto
,return
, 또는throw
를 사용합니다.단, 암묵적인 폴 스루(fall-through)[15]는 허가하지 않습니다.(사용방법)goto
후속 라벨을 지정하면 C/C++와 같은 폴스루가 생성됩니다.)
통사염은 코드를 읽을 수 없게 함으로써 그 목적을 저하시킬 수 있으며, 따라서 그 품질을 악화시킬 수 있습니다.극단적인 경우에는 언어 요건을 충족시키기 위해 도입된 오버헤드보다 코드의 필수 부분이 짧을 수 있습니다.
구문 salt의 대안으로 코드가 오류의 결과일 가능성이 높을 때 컴파일러 경고를 생성하는 것이 있습니다.이것은 현대의 C/C++ 컴파일러에서 흔히 볼 수 있는 방법입니다.
통사카린
다른 확장자로는 구문 사카린과 구문 시럽이 있는데, 이는 프로그래밍을 더 [16][17][18][19]쉽게 하지 않는 gratuitous 구문을 의미합니다.
설탕 타입
핵심 통사적 지원이 있는 데이터 유형은 "제안 유형"[20][21][22]이라고 합니다.일반적인 예로는 따옴표로 구분된 문자열, 개체 및 레코드 유형의 경우 물결 괄호, 배열의 경우 대괄호 등이 있습니다.
메모들
- ^ Landin, Peter J. (1964). "The mechanical evaluation of expressions" (PDF). The Computer Journal. Computer Journal. 6 (4): 308–320. doi:10.1093/comjnl/6.4.308. Retrieved 21 July 2014.
- ^ Abelson & Sussman 1996, 제1장, 각주 11.
- ^ Barbara Liskov, "CLU의 역사", MIT 컴퓨터 과학 연구소 기술 보고서 561 (1993)
- ^ Felleisen, Matthias (December 1991). "On the Expressive Power of Programming Languages". Science of Computer Programming. Springer-Verlag. 17 (1–3): 35–75. doi:10.1016/0167-6423(91)90036-W. Retrieved 19 July 2014.
- ^ "C Compound Assignment". msdn.microsoft.com. Microsoft. Retrieved 20 June 2016.
However, the compound-assignment expression is not equivalent to the expanded version because the compound-assignment expression evaluates expression1 only once, while the expanded version evaluates expression1 twice: in the addition operation and in the assignment operation.
- ^ Garavaglia, Emilio (26 July 2015). "Why are shortcuts like x += y considered good practice?". stackexchange.com. Retrieved 20 June 2016.
optimization can [be done] if 'finding x' has no side effects
- ^ "Python Data model". docs.python.org. 21 December 2020.
- ^ Raymond, Eric S. (11 October 1996). The New Hacker's Dictionary – 3rd Edition. MIT Press. p. 432. ISBN 978-0-262-68092-9. Retrieved 5 August 2012.
- ^ "using Statement (C# Reference)". Retrieved 16 September 2014.
- ^ "magrittr: Vignette". Retrieved 24 December 2018.
- ^ Abelson & Sussman 1996, 제1장, 각주 11.
- ^ 1982년 펠리스 에피그램 3번
- ^ "The Jargon File - syntactic salt". 2003-06-12. Archived from the original on 2003-06-12. Retrieved 2018-03-19.
- ^ "new Modifier (C# Reference)". microsoft.com. Microsoft. Retrieved 3 August 2015.
- ^ "switch (C# Reference)". microsoft.com. Microsoft. Retrieved 3 August 2015.
- ^ "syntactic sugar". catb.org. Retrieved 3 August 2015.
- ^ Boiten, Eerke A.; Möller, Bernhard (2002-06-26). Mathematics of Program Construction. ISBN 9783540438571. Retrieved 3 August 2015.
- ^ Dean, Thomas (2004). Talking with Computers: Explorations in the Science and Technology of Computing. Cambridge University Press. p. 115. ISBN 9780521542043.
- ^ Harrison, William; Sheard, Tim (July 8–10, 2002). "Mathematics of Program Construction". Mathematics of Program Construction: 6th International Conference, MPC 2002, Dagstuhl Castle, Germany, July 8–10, 2002. Proceedings. International Conference on Mathematics of Program Construction. Lecture Notes in Computer Science. Vol. 2386. Dagstuhl Castle, Germany: Springer Berlin Heidelberg. p. 93. doi:10.1007/3-540-45442-X_6. ISBN 978-3-540-43857-1. S2CID 10059915.
{{cite conference}}
:archive-url=
필요.url=
(도움말) - ^ Chugh, Ravi (2013). Nested Refinement Types for JavaScript (PhD). UC San Diego.
- ^ "C Language LLVM Documentation". clang.llvm.org. Retrieved 30 June 2020.
- ^ "The Secret Life of Types in Swift". medium.com/@slavapestov. 14 July 2016. Retrieved 30 June 2020.
레퍼런스
- Abelson, Harold; Sussman, Gerald Jay; Sussman, Julie (1996) [1984]. Structure and Interpretation of Computer Programs. Cambridge, MA: MIT Press. ISBN 0-262-51087-1.
- Landin, Peter J. (February–March 1965). "A Correspondence Between ALGOL 60 and Church's Lambda-Notation: Parts I and II". Communications of the ACM. 8 (2.3): 89–101, 158–165. doi:10.1145/363744.363749. S2CID 6505810.
- Landin, Peter J. (March 1965). "Programming Without Imperatives – An Example". UNIVAC Systems Programming Research.
- Landin, Peter J. (July 1965). "Getting Rid of Labels". UNIVAC Systems Programming Research.
- Landin, Peter J. (August 1965). "A Generalization of Jumps and Labels". UNIVAC Systems Programming Research.,
{{cite journal}}
에서 전재: 인용 저널이 필요합니다(도움말). - Perlis, A. J. (September 1982). "Epigrams on programming". ACM SIGPLAN Notices. New York, NY, USA: Association for Computing Machinery. 17 (9): 7–13. doi:10.1145/947955.1083808. S2CID 20512767. Archived from the original on January 17, 1999.