목차
📁 프로그래밍 언어의 구성요소
📌 프로그래밍 언어는 구문구조(syntax)와 의미(sementics)로 구성된다.
때로는 실행환경(runtime environment)를 포함하기도 한다.
실행환경이란 기본제공 라이브러리 등의 프로그램 실행을 돕는 코드뭉치를 말한다.
때문에 프로그래밍 언어를 정의한다는 것은
프로그래밍 언어가 어떻게 생겼는지를 나타내는 구문구조를 정의하는 것과
각 구문구조가 어떤 동작을 수행하는지를 나타내는 의미를 정의하는 것이다.
프로그래밍 언어의 정의는 언어 스펙(specification) 문서에 기재되어 잇다.
📁 Syntax(구문구조)
📌 Syntax(구문구조)란 프로그래밍 언어의 "형태"이다.
Tokens
프로그래밍언어에서 token이란 문법적으로 더 이상 나눌 수 없는 기본적인 언어요소를 말한다.
예를 들어 하나의 키워드나 연산자 또는 구두점 등이 토큰이 될 수 있다.
키워드 예시로는 auto, enum, restrict, unsigned, break 등이 있으며
nonzero-digit 예시로는 1,2,3,4,5,6,7,8,9가 있다.
Expressions
예시로는 다음과 같은 expression들이 있다.
Declaration
Statement
Function
Program
📁 Semantics(의미)
📌 Semantics(의미)란 프로그래밍 언어 구문의 "실행 동작"을 뜻한다.
각각의 syntax에 따라 실행동작이 정의된다. 예를 들면 다음과 같다.
일반적으로 natural language(자연어, 주로 영어)로 작성되어있기 때문에 Ambiguity(모호성)이 존재한다. 이는 하나의 같은 문장을 서로 다르게 이해할 수 있다는 뜻이다.
특정 조건에서 해당 구문의 실행동작을 정의하지 않은 경우도 있기 때문에 undefined나 unspecified behavior가 존재하기도 한다.
📁 Unspecified Behaviors
프로그래밍 언어에는 특정 조건에서 구문의 동작을 정의하지 않은 경우가 있다.
이는 컴파일러 또는 인터프리터 개발자에게 자유를 준다.
Compiled language는 어떤 컴파일러를 사용하는가에 따라 동일한 프로그램이 서로 다른 프로그램으로 컴파일 될 수 있고, Interpreted language는 어떤 인터프리터를 사용하는가에 따라 동일한 프로그램이 서로 다르게 동작할 수 있다.
구문의 동작을 정의하지 않는 경우는 주로 어떻게 정의해도 문제가 되지 않는 경우이다. 프로그램이 다르게 동작해도 에러를 유발하거나 에러와 연관되지 않은 경우이다.
단, 개발자는 "Unspecified Behaviors"를 잘 파악하고 있어야 프로그램의 오동작을 방지할 수 있다.
🔎 예시
for x in s
위 코드에서 s가 set일때, 해당 순회문을 진행할 때 set 안의 원소를 어떤 순서로 순회하도록 해야하는지가 정의되어있지 않다.
🔎 기술된 Unspecified Behaviors
C언어는 Unspecified Behaviors가 기술되어 있다.