구문과 의미론
어떤 코드가 맞는 코드인지는 어디에 적혀 있을까?
화면을 누르면 다음 장으로 넘어갑니다
두 가지 질문
생김새와 뜻은 따로 정합니다
구문(syntax)은 식, 문장, 프로그램이 어떻게 생겨야 하는지를 정합니다. 의미론(semantics)은 그것을 실행하면 무슨 일이 일어나는지를 정합니다. 프로그래밍 언어의 정의는 이 둘로 이루어집니다.
예시입니다. C나 자바 같은 언어에서 오른쪽 코드는 + 의 자리가 틀려 구문에 어긋납니다.
누가 읽나
언어의 정의는 세 사람이 봅니다
언어 설계자가 정의를 쓰고, 구현자가 그 정의대로 컴파일러를 만들고, 개발자가 그 정의대로 프로그램을 짭니다. 정의가 정확해야 세 사람이 같은 언어를 씁니다.
컴파일러는 소스(내가 쓴 코드)를 기계어로 번역하는 프로그램입니다. 1강 8편에서 봤습니다.
문장과 언어
언어는 맞는 문장들의 집합입니다
글자를 줄지어 놓은 것을 문자열이라고 합니다. 정해진 글자들로 만든 문자열 가운데 그 언어에 속하는 것이 문장(sentence)이고, 언어(language)는 문장들의 집합입니다. 어떤 문자열이 문장인지를 가르는 것이 구문입니다.
변수에 값을 넣는 문장만 있는 작은 언어를 예로 들었습니다.
문장을 이루는 조각
어휘 단위를 종류로 묶으면 토큰
1강 8편에서 코드를 뜻이 있는 가장 작은 조각으로 끊었습니다. 그 조각이 어휘 단위(lexeme)이고, 어휘 단위를 종류별로 묶은 범주가 토큰(token)입니다. sum과 a는 다른 어휘 단위지만 둘 다 식별자라는 토큰입니다.
식별자(identifier)는 프로그래머가 지은 이름, 상수는 10처럼 정해진 값입니다. 토큰 이름은 예시입니다. 어휘 단위는 렉심이라고도 적습니다.
언어를 정의하는 두 길
가려내거나, 만들어 내거나
언어를 정확히 정의하는 방법은 둘입니다. 인식기(recognizer)는 문자열을 받아 그 언어의 문장인지 가려냅니다. 생성기(generator)는 그 언어의 문장을 만들어 냅니다.
컴파일러에서 코드의 구조를 찾는 구문 분석기가 인식기입니다. 다음 편부터 볼 문법은 생성기입니다. 문자열은 예시입니다.
다음 편