컴퓨터 프로그래밍에서 S-표현식(또는 기호 표현식)은 중첩된 목록(트리 구조) 데이터를 표현하는 방법입니다. S-표현식은 Lisp 프로그래밍 언어에서 발명되어 대중화되었는데, Lisp 프로그래밍 언어는 소스 코드와 데이터 표현 형식으로 S-표현식을 모두 사용합니다.
"S-표현식은 데이터와 코드를 모두 표현할 수 있어 Lisp의 표현이 매우 유연해집니다."
S-표현식의 일반 구문은 괄호를 사용하여 구성되며 "x"와 같은 원자로 정의되거나 "(x.y)" 형태로 정의됩니다. 여기서 x와 y는 모두 S-표현식입니다. 이 정의는 Lisp가 목록을 일련의 "셀"로 표현하는 방식을 반영하는데, 각 "셀"은 순서가 있는 쌍입니다.
이 구조를 이용하면 S-표현식으로 임의의 이진 트리를 표현할 수 있습니다. 그러나 S-표현식은 순환 참조도 허용할 수 있으며, 이 경우 구조는 더 이상 트리가 아니라 순환 그래프가 됩니다. Common Lisp와 Scheme과 같은 많은 최신 Lisp 방언은 이러한 반복 구조를 표시하는 구문을 제공합니다.
존 매카시의 원래 정의에 따르면 원자는 인식 가능한 기호의 집합으로 간주될 수 있습니다. 시간이 지나면서 현대의 S-표현식 표기법은 더 다양한 인용 문자열을 허용하게 되었고, 두 개 이상의 멤버로 구성된 목록도 더 짧은 표기법으로 표현할 수 있게 되었습니다.
"Lisp 계열 언어에서 S 표현식은 소스 코드와 데이터를 표현하는 데 사용되며, 프로그래밍 혁명의 핵심이 되었습니다."
Lisp에서 파생된 언어는 많고 각각 다른 형식의 S-표현식 구문을 지원하지만, 이들 모두가 공통적으로 갖고 있는 특징은 S-표현식과 접두사 표기법을 사용한다는 것입니다. Lisp에서 소스 코드를 표현할 때 S-표현식의 첫 번째 요소는 일반적으로 연산자나 함수 이름이고 나머지 요소는 인수로 간주됩니다.
표준 접두사 표기법은 이 점을 활용하며, 많은 프로그래머가 이런 방식으로 많은 코드를 작성합니다. 예를 들어, C에서 부울 표현식 "4 == (2 + 2)"는 Lisp에서는 "(= 4 (+ 2 2))"로 표현됩니다.
특정 데이터 유형 및 구문 측면에서 S-표현식 형식에는 많은 변형이 있으며, 목록 및 쌍, 기호 및 문자열, 심지어 부동 소수점 숫자 및 정수를 포함하여 다양한 데이터 유형에 대해 서로 다른 구문을 지원합니다.
"Lisp의 자기 동형성은 프로그램의 주요 표현이 언어 자체의 데이터 구조라는 것을 의미합니다."
S-표현식을 구문 분석할 때 종종 XML과 비교됩니다. 그러나 S-표현식은 점쌍이라는 하나의 컨테이너 형태만 갖는 반면, XML 태그는 간단한 속성, 다른 태그 또는 CDATA를 포함할 수 있으며 이를 위해 다른 구문을 사용합니다.
S-표현식은 간단한 사용 사례에서는 XML보다 간단하지만, XML은 XPath와 같은 쿼리 언어와 다양한 도구 및 타사 라이브러리를 갖추고 있어 고급 사용 사례에서 데이터 처리를 단순화합니다.
Lisp와 그 파생 언어가 인기를 얻으면서 표준화가 뒤따랐습니다. Common Lisp와 Scheme과 같은 여러 방언에는 S-표현식 구문에 대한 사양이 있습니다. 론 리베스트는 1997년에 Lisp S-표현식을 기반으로 범용 데이터 저장 및 교환을 위한 구문을 정의하는 인터넷 초안을 제안했습니다.
이 초안은 최종적으로 RFC로 승인되지 않았지만, 그 내용은 여러 RFC와 기타 출판물에서 참조되고 적용되었습니다. 이러한 표준의 제정은 컴퓨터 과학에서 S-표현식의 중요성을 보여줍니다.
오늘날의 프로그래밍 환경에서 S-표현식은 데이터 직렬화 표준을 포함한 다양한 응용 분야에서 널리 사용되고 있습니다. 런던대학교와 마이애미대학교가 실시한 추세 분석에 따르면 점점 더 많은 개발자가 프로그래밍의 유연성과 표현력을 향상시키기 위해 S-표현식의 잠재력을 탐구하기 시작하고 있다는 사실이 주목할 만합니다.
요약하자면, S-표현식은 단순한 표기법이 아니라 Lisp 언어의 핵심이며 컴퓨터 프로그래밍의 매우 혁신적인 구조를 나타냅니다. 코드와 데이터의 공통성으로 인해 이런 종류의 표현은 우리의 미래에 어떤 종류의 깨달음을 가져다 줄 것인가?