프로그래밍 언어를 설계할 때 크게 2가지 측면으로 나뉠 수 있습니다. 하나는 Syntax이고 또 하나는 Semantics입니다. 간단하게 설명하면 지켜야 하는 문법의 구조와 어떤 하나의 문장이나 단어의 역할(의미)입니다. 의미를 생각하기 전에 먼저 Syntax가 무엇인지에 대해 살펴보고자 합니다. "게으른 토끼가 달린다" 라는 문장은 어떻게 만들어진 걸까요? 사람은 자연스럽게 문장을 구성하지만, 그러한 문장을 구성하는 규칙이 있음은 너무 당연합니다. 어떤 단어가 다른 단어로 바뀌는 규칙 몇 개를 정해보겠습니다. 이 규칙은 '왼쪽'의 것이 |로 구분된 '오른쪽' 의 단어 중 하나를 선택해서 바꿀 수 있다.를 의미합니다.
* 여기서 다루는 단어는 그저 단어(이제부터 Term이라고 하겠습니다.)일 뿐 입니다. 그 의미를 생각하지 않고 단지 왼쪽의 Term이 그대로  오른쪽의 Term으로 바뀔 수 있다는 것만 생각합니다. 또한 Term을 구성하는 또 다른 Term 또한 규칙을 적용 받을 수 있음을 기본적인 전제로 일단 두겠습니다. (e.g, A->B Then A K -> B K)
'문장' -> '주어 동사' '주어' -> '명사' '명사' -> '형용사 명사' | '토끼' | '거북이' | '강아지' '형용사' -> '귀여운' | '게으른' | '예쁜' | '못생긴' '동사' -> '자동사' | '타동사 명사' '자동사' -> '달린다' | '수영한다' | '잔다' '타동사' -> '잡는다' | '부른다' | '던진다'
------이 규칙을 어떻게 적용할 수 있는 지 예시를 보겠습니다. 처음부터 제게 '문장' 이라는 Term이 주어져 있습니다. 그렇다면 각 규칙을 제가 임의로 적용하면
'문장' -> '주어 동사' -> '주어 자동사' -> '명사 자동사' -> '형용사 명사 자동사' -> '형용사 토끼 자동사' -> '형용사 토끼 달린다' -> '게으른 토끼 달린다'
라는 결과를 얻을 수 있습니다. 다소 규칙이 임의적인 감이 있지만 언어의 구체적인 문장들은 위와 같은 규칙을 통해 구성된다고 이해할 수 있습니다. 이를 통해 '거북이 수영한다' , '예쁜 강아지 던진다 귀여운 토끼' 등의 문장을 구성해 볼 수 있습니다. 


 

실제 파이썬의 Syntax 중 일부입니다. 문장이라는 Term에서 연속적으로 각각의 Term이 바뀌어가면서 하나의 복잡한 코드를 구성하게 되는 것 처럼 사진 속 규칙은 Atom이라는 작은 단위에 대한 규칙을 정의하고 있습니다. (자세한 사항은 python reference를 참고. 각 문서는 각자의 표기와 규칙이 있으니 먼저 그것을 잘 읽어보는 것도 중요합니다.) 우리의 프로그램은 완성된 코드로 동작하지만, 그 완성된 코드는 사실 하나의 뿌리에서 출발합니다.  C언어에서 가장 대표적인 규칙을 생각해보면 코드 -> 코드;코드 가 있고 이러한 룰을 기반으로 우리는 세미콜론을 가지고 코드의 문장을 연결합니다. 컴파일러나 인터프리터가 Syntax error를 잡아내는 것도, 현재 작성한 Term이 규칙에 의해서 만들어질 수 있냐 없냐를 따져보는 것 입니다. 규칙 ㅑ 코드자 이제 우리는 프로그래밍 언어의 Syntax를 이해할 수 있고, 정의할 수 있습니다. 그렇다면 이렇게 작성 된 하나의 완성된 Term은 프로그램에 있어서 어떤 의미를 갖게 될까요? 이 프로그램의 실행은 무엇으로 정의되는 걸까요? 우리는 이제 문장의 구조가 아닌 문장의 의미에 대해서 생각해야 합니다. 그리고 '의미'라는 것은 무엇이고 '실행'이라는 것은 무엇인지.. 프로그램은 결국 무엇을 하는 것인지에 대해서도 이해해야 할 필요가 생길 것 같습니다. 다음 내용은 이러한 관점에서 프로그래밍 언어의 Semantics를 이야기 하겠습니다. 감사합니다!

+ Recent posts