맨위로가기

신택틱 슈거

"오늘의AI위키"는 AI 기술로 일관성 있고 체계적인 최신 지식을 제공하는 혁신 플랫폼입니다.
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.

1. 개요

신택틱 슈거(syntactic sugar)는 프로그래밍 언어에서, 언어의 핵심 기능을 변경하지 않으면서 코드의 가독성과 사용 편의성을 높이기 위해 추가되는 구문이다. 1964년 피터 J. 랜딘에 의해 처음 사용되었으며, 람다 계산법의 적용 표현식을 설명하기 위해 ALGOL과 유사한 언어의 표면 구문을 지칭하는 데 사용되었다. 이후 CLU, ML, Scheme과 같은 언어에서 핵심 구조를 정의하는 데 사용되는 구문 요소로 확장되었다. 신택틱 슈거는 코드의 간결성을 높이고, 특정 기능을 더 쉽게 사용할 수 있게 하지만, 과도한 사용은 코드의 복잡성을 증가시키고 유지보수를 어렵게 만들 수 있다는 비판도 존재한다.

더 읽어볼만한 페이지

  • 프로그래밍 언어 설계 - 메모리 오더링
    메모리 오더링은 컴파일러와 CPU가 메모리 접근 순서를 최적화하는 과정에서 멀티 스레드 환경의 데이터 일관성을 해칠 수 있는 문제로, 메모리 배리어를 통해 제어하고 메모리 모델을 이해해야 한다.
  • 음식에 대한 비유 - 빵과 서커스
    빵과 서커스는 로마 제국 정치인들이 시민의 불만을 무마하고 권력을 유지하기 위해 정치적 권리 대신 식량과 오락을 제공하여 정치적 무관심을 유도한 정책을 풍자하는 표현으로, 현대 사회에서도 대중의 관심을 돌리려는 정책을 비판할 때 사용된다.
  • 음식에 대한 비유 - 체리 피킹
    체리 피킹은 유리한 정보만 선택하고 불리한 정보는 무시하는 행위로, 다양한 분야에서 특정 입장을 옹호하거나 반대하는 데 사용되는 오류이다.
  • 컴퓨터 특수용어 - DLL 지옥
    DLL 지옥은 윈도우 운영체제에서 DLL 파일 공유로 인해 발생하는 호환성 문제 및 의존성 충돌을 의미하며, 특정 프로그램의 설치/제거 과정에서 시스템 DLL이 변경되어 다른 프로그램의 동작을 방해하는 현상이다.
  • 컴퓨터 특수용어 - FUD
    FUD는 경쟁사의 제품이나 서비스에 대한 부정적인 정보를 퍼뜨려 소비자의 의사 결정을 왜곡하는 전략으로, 1970년대 IBM에서 유래하여 정보통신 기술, 정치, 광고 등 다양한 분야에서 사용되며 비판받는다.
신택틱 슈거

2. 기원

"신택틱 슈거"라는 용어는 1964년 피터 J. 랜딘이 람다 계산법의 적용 표현식 측면에서 의미가 정의된 간단한 ALGOL과 유사한 프로그래밍 언어의 표면 구문을 설명하기 위해 만들었다.[1] 이 용어는 어휘적으로 λ를 "where"로 대체하는 데 중점을 둔다.

이후 CLU, ML 및 Scheme과 같은 프로그래밍 언어는 언어 핵심의 필수 구조 측면에서 정의될 수 있는 언어 내 구문을 지칭하도록 이 용어를 확장했다.[2] 이는 실제로 기본 요소에서부터 구축하는 일반적인 수학적 관행이다.

1991년 마티아스 펠라이젠은 "표현력"을 공식화할 것을 제안했다. 그는 문제의 언어 구조가 없으면 프로그램을 완전히 재구성해야 한다는 의미로 "더 표현력이 있다"고 정의했다.[3]

"신택틱 슈거"(syntactic sugar)의 직역에 가까운 '''구문 설탕'''이라는 용어도 사용된다. 또한 외래어로서 그대로 신택스 슈거라고도 불린다. 당의 구문 또는 구문 당의라고 하는 것은 약간 의역이지만 자주 사용된다[22]

어원은 "취급하기 쉽다"를 의미하는 sweet영어의 제1의 의미가 "(설탕처럼) 달콤하다"는 데서 유래했다[23][24]

2. 1. 람다 계산법과의 관계

"신택틱 슈거"라는 용어는 1964년 피터 J. 랜딘이 람다 계산법의 적용 표현식 측면에서 의미가 정의된 간단한 ALGOL과 유사한 프로그래밍 언어의 표면 구문을 설명하기 위해 만들었다.[1] 이 용어는 어휘적으로 λ를 "where"로 대체하는 데 중점을 둔다.

2. 2. 용어의 확장

"신택틱 슈거"라는 용어는 1964년 피터 J. 랜딘이 만들었으며, 람다 계산법의 적용 표현식 측면에서 의미가 정의된 간단한 ALGOL과 유사한 프로그래밍 언어의 표면 구문을 설명하기 위해 사용되었다.[1] 이후 CLU, ML, Scheme 등의 프로그래밍 언어에서 언어 핵심 구조 측면에서 정의될 수 있는 구문 요소를 가리키는 용어로 확장되었다.[2] 이는 기본 요소에서부터 구축하는 일반적인 수학적 관행이다.

3. 비판

일부 프로그래머들은 신택틱 슈거가 중요하지 않거나 터무니없다고 생각한다. 특히, 특수한 구문 형식은 언어를 덜 획일적으로 만들고 사양을 더 복잡하게 만들며, 프로그램이 크고 복잡해짐에 따라 문제를 일으킬 수 있다. 이러한 견해는 Lisp 커뮤니티에서 특히 널리 퍼져 있는데, Lisp는 매우 단순하고 규칙적인 구문을 가지고 있으며 표면 구문을 쉽게 수정할 수 있기 때문이다. 앨런 펄리스는 "프로그래밍 격언"에서 중괄호 프로그래밍 언어를 언급하며 "신택틱 슈거는 세미콜론의 암을 유발한다"라고 말했다. 이는 신택틱 슈거에 대한 비판적인 시각을 보여주는 격언이다.

3. 1. 앨런 펄리스의 경고

앨런 펄리스는 "프로그래밍 격언"에서 중괄호 프로그래밍 언어를 언급하며 "신택틱 슈거는 세미콜론의 암을 유발한다"라고 말했다. 이는 중괄호 프로그래밍 언어를 비판하는 격언이다. 일부 프로그래머들은 이러한 구문 사용성 기능이 중요하지 않거나 터무니없다고 생각한다. 특히, 특수한 구문 형식은 언어를 덜 획일적으로 만들고 사양을 더 복잡하게 만들며, 프로그램이 크고 복잡해짐에 따라 문제를 일으킬 수 있다. 이러한 견해는 Lisp 커뮤니티에서 특히 널리 퍼져 있는데, Lisp는 매우 단순하고 규칙적인 구문을 가지고 있으며 표면 구문을 쉽게 수정할 수 있기 때문이다.

4. 관련 용어

4. 1. 신택틱 솔트 (Syntactic Salt)

"신택틱 슈거"라는 은유는 "신택틱 솔트"라는 용어를 만들어 확장되었으며, 이는 나쁜 코드를 작성하기 어렵게 만들도록 설계된 기능을 나타낸다.[11] 구체적으로, 신택틱 솔트는 프로그래머가 프로그램의 동작을 표현하기 위해서가 아니라, 자신이 무슨 일을 하고 있는지 알고 있음을 증명하기 위해 거쳐야 하는 난관이다.

C#에서는 상속된 클래스 멤버를 숨길 때, 숨김이 의도적임을 명시하기 위해 `new` 키워드를 사용하지 않으면 컴파일러 경고가 발생한다.[12] 스위치 문과 관련하여, C#에서는 잠재적인 버그를 피하고자 암시적인 "폴스루"를 허용하지 않고 각 비어 있지 않은 `case` 레이블에 `break`가 필요하다(`goto`, `return` 또는 `throw`가 사용되지 않는 경우).[13]

신택틱 솔트는 코드를 읽기 어렵게 만들어 품질을 악화시킬 수 있다. 극단적인 경우, 코드의 핵심 부분이 언어 요구 사항을 충족하기 위해 도입된 오버헤드보다 짧을 수 있다.

신택틱 솔트의 대안은 코드가 실수로 작성되었을 가능성이 높을 때 컴파일러 경고를 생성하는 것이다. 이는 현대적인 C/C++ 컴파일러에서 흔히 사용되는 방식이다.

4. 2. 신택틱 사카린 (Syntactic Saccharin)

프로그래밍을 더 쉽게 만들지 않는 불필요한 구문인 ''신택틱 사카린''과 ''신택틱 시럽''이 있다.[14][15][16][17]

5. 주요 프로그래밍 언어에서의 신택틱 슈거

C 언어에서 `a[i]` 표기법은 `*(a + i)`의 신택틱 슈거이다.[7] 마찬가지로 `a->x` 표기법은 멤버 접근을 역참조 연산자 `(*a).x`를 사용하여 접근하는 신택틱 슈거이다.

C#의 `using` 문은 특정 객체가 올바르게 해제되도록 보장한다. 컴파일러는 이 문을 try-finally 블록으로 확장한다.[8]

Java에서 `import` 선언을 사용하면 컴파일러가 정규화된 이름으로 지정되지 않은 클래스를 찾을 수 있다. 예를 들어 `import javax.swing.*;`를 사용하면 프로그래머가 `javax.swing.JButton`과 같은 Swing 객체를 더 짧은 이름 `JButton`으로 참조할 수 있다.

Perl에서 `unless (condition) {...}`는 `if (not condition) {...}`의 신택틱 슈거이다. 또한, 모든 문장은 조건 다음에 올 수 있으므로 `statement if condition`은 `if (condition) {statement}`와 동일하지만, 전자가 한 줄에 더 자연스럽게 형식화된다.

파이썬의 리스트 컴프리헨션(예: 제곱의 리스트를 위한 [x*x for x in range(10)])과 데코레이터 (예: @staticmethod)는 대표적인 신택틱 슈거이다. 확장 할당 또는 복합 할당 연산자(예: `a += b`)는 `a = a + b`와 동일하며, `a`가 일반 변수와 같이 부작용이 없다고 가정한다.[4][5] 파이썬과 같은 일부 언어는 연산자 오버로딩 확장 할당 연산자를 허용하여 표준 연산자와 다르게 동작할 수 있다.[6]

Haskell에서 따옴표로 표시된 문자열은 의미적으로 문자 목록과 동일하다. 선택적 언어 확장인 ''OverloadedStrings''를 사용하면 문자열 리터럴이 Text와 같은 다른 유형의 값을 생성할 수도 있다.

tidyverse 컬렉션의 R 패키지에서 `%>%`로 표시되는 ''파이프''는 파이프 앞에 오는 데이터(또는 함수의 출력)가 파이프 뒤에 오는 함수의 첫 번째 인수로 사용됨을 선언한다.[9] 따라서 `x %>% f(y)`는 `f(x,y)`와 동일하다.

SQL에서 단순히 `JOIN`은 `INNER JOIN`과 동일하며, 후자는 조인 문이 외부 조인 연산과 반대로 내부 조인 연산임을 명확하게 한다. 마찬가지로, `LEFT OUTER JOIN`, `RIGHT OUTER JOIN` 및 `FULL OUTER JOIN`에서 `OUTER`를 생략할 수 있다.

ES6 버전의 자바스크립트에서 화살표 함수는 `(x) => x + 1`의 짧은 형태를 가지며, 이는 더 긴 형태인 `(x) => { return x + 1; }`과 동일하다.

Scala에서 세 개의 물음표(` ??? `)는 ` throw new NotImplementedError `와 동일하다. 이는 아직 작성되지 않은 코드의 위치를 표시하는 데 유용하다.[10]

5. 1. C 계열 언어 (C, C++, C#, Java)

C 언어에서 `a[i]` 표기법은 `*(a + i)`의 신택틱 슈거이다.[7] 마찬가지로 `a->x` 표기법은 멤버 접근을 역참조 연산자 `(*a).x`를 사용하여 접근하는 신택틱 슈거이다.

C#의 `using` 문은 특정 객체가 올바르게 해제되도록 보장한다. 컴파일러는 이 문을 try-finally 블록으로 확장한다.[8]

Java에서 `import` 선언을 사용하면 컴파일러가 정규화된 이름으로 지정되지 않은 클래스를 찾을 수 있다. 예를 들어 `import javax.swing.*;`를 사용하면 프로그래머가 `javax.swing.JButton`과 같은 Swing 객체를 더 짧은 이름 `JButton`으로 참조할 수 있다.

5. 1. 1. LINQ (C#)

.NET Framework 3.5에서는 컬렉션 등에 대해 지연 실행되는 복잡한 반복 처리를 간결하게 기술할 수 있는 LINQ(Language INtegrated Query영어)가 추가되었다. 이와 함께 C# 3.0 이후에는 SQL 구문과 유사한 쿼리 문자열로 표현할 수 있는 LINQ 쿼리 구문이 제공되지만, 이는 내부적으로 람다식을 파라미터로 받는 메서드 체인에 의한 등가의 반복 처리 표현(LINQ 메서드 구문)으로 대체된다.[10]

```c#

using System.Linq; // 어느 구문에서든 필요함.

var src = new char[] { 't', 'e', 's', 't' };

// 다음 코드는 각각 동일하며, 문자 't'만 추출한 새로운 시퀀스(IEnumerable형)를 반환한다.

var p = from c in src where c == 't' select c;

var q = src.Where(c => c == 't').Select(c => c);

5. 1. 2. 인덱서 (C#)

C#에서는 객체 내부의 컬렉션 호출 등에 사용되는 getter/setter 메서드 호출을 배열과 동일한 첨자 표현으로 대체할 수 있는 인덱서가 신택틱 슈거로 제공된다.

```c#

public class UserDefinedClass

{

private Dictionary collection;

// 인덱서를 통한 내부 컬렉션 접근 (초기화 및 null 체크 등은 생략)

public object this[string key]

{

get { return collection[key]; }

set { collection[key] = value; }

}

}

```

실질적으로는 getter/setter 메서드의 구현과 동일하지만, List나 Dictionary와 같은 컬렉션 클래스에 대한 접근을 보다 직접적으로 기술할 수 있다.

5. 2. Python

파이썬의 리스트 컴프리헨션(예: 제곱의 리스트를 위한 [x*x for x in range(10)])과 데코레이터 (예: @staticmethod)는 코드의 간결성을 높이는 대표적인 신택틱 슈거이다.[6]

```python

def decorater(func):

def wrapper(*args, **kwargs):

print("함수 호출됨")

result = func(*args, **kwargs)

print("함수 종료")

return result

return wrapper

def pure_func(a, b):

return a + b

covered_func = decorater(pure_func)

@decorater

def decorated_func(a, b):

return a + b

```

위 코드에서 `covered_func` 함수와 `@decorater`를 사용한 `decorated_func` 함수는 동작 면에서 동일하다. 데코레이터를 사용함으로써, `decorated_func`가 비교적 이해하기 쉽게 구현되었다.

또한

```python

my_list = [1, 2, 3]

my_list[0] = 2

print(my_list[0])

```



```python

my_list = [1, 2, 3]

my_list.__setitem__(0, 2)

print(my_list.__getitem__(0))

```

의 신택틱 슈거이다.

확장 할당 또는 복합 할당 연산자(예: `a += b`)는 `a = a + b`와 동일하며, `a`가 일반 변수와 같이 부작용이 없다고 가정한다.[4][5] 파이썬과 같은 일부 언어는 연산자 오버로딩 확장 할당 연산자를 허용하여 표준 연산자와 다르게 동작할 수 있다.[6]

5. 3. Haskell

하스켈에서 문자열은 문자 목록의 신택틱 슈거이다. `do` 표기법을 사용하면 모나드 연산을 명령형 프로그래밍 스타일로 작성할 수 있다. 선택적 언어 확장인 ''OverloadedStrings''를 사용하면 문자열 리터럴이 Text와 같은 다른 유형의 값을 생성할 수도 있다.

5. 4. JavaScript

ES6 버전의 자바스크립트에서 화살표 함수는 `(x) => x + 1`의 짧은 형태를 가지며, 이는 더 긴 형태인 `(x) => { return x + 1; }`과 동일하다. 이는 함수 표현식의 축약형으로, 코드 작성을 간편하게 한다.

5. 5. 기타 언어 (Perl, Erlang, Scala, SQL, R)

Perl에서 `unless (condition) {...}`는 `if (not condition) {...}`의 신택틱 슈거이다. 또한, 모든 문장은 조건 다음에 올 수 있으므로 `statement if condition`은 `if (condition) {statement}`와 동일하지만, 전자가 한 줄에 더 자연스럽게 형식화된다.

Perl의 개발자인 래리 월에 따르면, 조건문 표기법(예: `print "Syntax sugar\n" if $boolean;`)은 신택틱 슈거이지만, 일부 프로그래머는 가독성이 떨어진다고 느낄 수 있다. 이는 "읽고 쓰기 쉬움"이 주관적이기 때문이다.

Erlang에서의 레코드형 데이터는 실제로는 튜플형 데이터에 대한 신택틱 슈거이지만, 요소를 꺼내거나 패턴 매칭하는 데 신택틱 슈거가 사용된다.

```erlang

%% 레코드의 정의 (컴파일러 매크로)

  • record(book, {title, author, lang, isbn}).


%% 튜플 {book, "Learn You Some Erlang for Greate Good!", "Fred Herbert", en, "978-1-59327-435-1"} 가 된다.

B = #book{title="Learn You Some Erlang for Great Good!", author="Fred Herbert", lang=en, isbn="978-1-59327-435-1"}.

%% 튜플 요소 꺼내기 element(2, B). 의 신택틱 슈거

B#book.author.

%% 튜플 요소 교체하기 setelement(2, B, "F. Herbert"). 의 신택틱 슈거

B#book{author="F. Herbert"}.

%% 레코드의 패턴 매칭 부분은 튜플의 패턴 매칭 printCover({Title, Author, _, _}) 의 신택틱 슈거

printCover(#book{title=Title, author=Author})

  • > io:format("~p by ~s~n", [Title, Author]).

```

Scala에서 세 개의 물음표(` ??? `)는 ` throw new NotImplementedError `와 동일하다. 이는 아직 작성되지 않은 코드의 위치를 표시하는 데 유용하다.[10]

SQL에서 단순히 `JOIN`은 `INNER JOIN`과 동일하며, 후자는 조인 문이 외부 조인 연산과 반대로 내부 조인 연산임을 명확하게 한다. 마찬가지로, `LEFT OUTER JOIN`, `RIGHT OUTER JOIN` 및 `FULL OUTER JOIN`에서 `OUTER`를 생략할 수 있다.

tidyverse 컬렉션의 R 패키지에서 `%>%`로 표시되는 ''파이프''는 파이프 앞에 오는 데이터(또는 함수의 출력)가 파이프 뒤에 오는 함수의 첫 번째 인수로 사용됨을 선언한다.[9] 따라서 `x %>% f(y)`는 `f(x,y)`와 동일하다.

참조

[1] 논문 The mechanical evaluation of expressions https://www.cs.cmu.e[...] Computer Journal 2014-07-21
[2] 간행물 A History of CLU MIT Laboratory for Computer Science 1993
[3] 논문 On the Expressive Power of Programming Languages http://www.cs.rice.e[...] Springer-Verlag 2014-07-19
[4] 웹사이트 C Compound Assignment https://msdn.microso[...] Microsoft 2016-06-20
[5] 웹사이트 Why are shortcuts like x += y considered good practice? http://programmers.s[...] 2016-06-20
[6] 웹사이트 Python Data model https://docs.python.[...] 2020-12-21
[7] 서적 The New Hacker's Dictionary – 3rd Edition https://books.google[...] MIT Press 1996-10-11
[8] 웹사이트 using Statement (C# Reference) http://msdn.microsof[...] 2014-09-16
[9] 웹사이트 magrittr: Vignette https://cran.r-proje[...] 2018-12-24
[10] 웹사이트 Stack Overflow: What does the triple question mark mean in scala? https://stackoverflo[...] 2024-01-23
[11] 웹사이트 The Jargon File - syntactic salt http://www.catb.org/[...] 2018-03-19
[12] 웹사이트 new Modifier (C# Reference) http://msdn.microsof[...] Microsoft 2015-08-03
[13] 웹사이트 switch (C# Reference) http://msdn.microsof[...] Microsoft 2015-08-03
[14] 웹사이트 syntactic sugar http://www.catb.org/[...] 2015-08-03
[15] 서적 Mathematics of Program Construction https://books.google[...] Springer 2002-06-26
[16] 서적 Talking with Computers: Explorations in the Science and Technology of Computing https://archive.org/[...] Cambridge University Press 2004
[17] conference Mathematics of Program Construction https://pdfs.semanti[...] Springer Berlin Heidelberg 2002-07-08
[18] 학위논문 Nested Refinement Types for JavaScript UC San Diego 2013
[19] 웹사이트 C Language LLVM Documentation http://clang.llvm.or[...] 2020-06-30
[20] 웹사이트 The Secret Life of Types in Swift https://medium.com/@[...] 2020-06-30
[21] 문서
[22] 문서
[23] 웹사이트 syntactic sugarの意味・用例|英辞郎 on the WEB:アルク https://eow.alc.co.j[...]
[24] 웹사이트 syntax sugarの意味・用例|英辞郎 on the WEB:アルク https://eow.alc.co.j[...]
[25] 웹사이트 The Jargon File 4.4.8, syntactic sugar http://catb.org/jarg[...]
[26] 문서
[27] 웹사이트 The Jargon File 4.4.8, syntactic salt http://catb.org/jarg[...]
[28] 웹사이트 Haskell 2010 Language Report, 3.14 Do Expressions https://www.haskell.[...]
[29] URL http://hackage.haske[...]
[30] 웹사이트 Java Language Specification Third Edition, 10.6 http://java.sun.com/[...]
[31] 서적 Types and Programming Languages



본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.

문의하기 : help@durumis.com