Chiusakpung's Electronics Blog

블로그 이미지
Computer programming ...
by 치우삭풍
  • Total hit
  • Today hit
  • Yesterday hit

첫번째 글은 다소 원론적인 이야기.

프로그래밍언어도 자연어와 마찬가지로 문법이라는게 있고, 이 문법에 따라 해당 프로그래밍 언어로 쓰여진 코드는 컴파일러나 인터프리터를 통해 기계어로 번역된다. 이 문법은 두 번역기에서 이미 구현되어 있으므로, 0과 1 밖에 모르는 컴퓨터도 알아듣는 매우 논리정연한 문법 구조임을 알 수 있다. 즉, 프로그래밍 언어는 자연어 보다 훨씬 엄격한 문법체계를 갖고 있다.

이런 언어 구조를 말끔히 기술하는 방법 중 EBNF(Extended Backus-Naur Form)란 것이 있다. 이 방법을 통해 한 문법(혹은 신택스, Syntax)을 '형식'으로만 재귀적으로 정의해 나갈 수 있다.

EBNF의 기본적으로 낱말의 '정의Definition', '대체Alternative', '나열Sequence','재귀Recursion'로 문법의 형식을 기술한다.
'정의'는 기본이 되는 단일 낱말이 어떤 문자, 어떤 형식을 갖는지 '::=' 를 이용해 정의하는 것을 말한다. 예를들면 다음의 '정의'는 EBNF를 통해 digit라는 낱말을 기술 한다.

     digit ::= 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 

'|'는 OR을 의미한다. 따라서 위는 "digit라는 말은 0, 1, 2 ... 9 의 10개의 숫자 중 하나를 의미한다"를 함축한 문장이다.

다음은 '재귀'를 이용한 '정의'이다. 수는 임의의 숫자들이 임의의 개수개 모인 집합으로 볼 수 있다. 따라서 다음과 같은 number는 숫자 하나이거나, 혹은 둘 이상의 수인 셈이다.

     number ::= <digit> | <digit><number>

단순히 number ::= <digit><number> 만으로 정의할 경우 종결 조건이 없어 number는 무한대 길이의 숫자가 됨을 유의하자.

'재귀'를 이용해 number를 '정의'하는 문제를 계속 생각해보면 사실 EBNF가 유일하지 않다는 것을 알 수 있다. 다음과 같이 정의해도 상관 없으니 말이다.

     number ::= <digit> | <number><number>

그럼 한번 위의 두 EBNF 문장을 비교해 보자. 12는 첫번째 정의로는 <digit><number> -> 1<number> -> 1 <digit> = 12가 되며, 두번째 정의로는 <number><number> -> <digit><digit> = 12가 된다.

(여기서 통사론Syntax과 의미론Semantics 얘기가 나온다. 언어학 전공자가 아니므로 간단히만 알고 넘어가면 통사론은 언어의 형식만을, 의미론은 언어내 내포된 뜻을 논한다.) 

참- 쉽죠?



음... 생각해보니 -_-; 영어보다 프로그래밍언어를 먼저 배웠네 그려. 그래서인지 영어 공부에 꽤나 도움이 되었는데 말이지. ㅋㅋ

어쨌거나 마지막 예제는 Verilog for문의 EBNF.

for_loop        ::= FOR <variable>:=<number> TO <number> <stepsize> DO

                       <statement>;

Variable        ::= <variable> <variable> I <digit> I a I b I c I d I e I f I g I h
                    I i I j I k 
| l I m I n I o I p I q I r I s I t I u I v I w I x 
                    I y I z I A I B I C I D 
I E I F I G I H I I I J I K I L I M I N
                    I O I P I Q I R I S I T I U I V I W 
I X I Y I Z

stepsize        ::= I STEP <number>

참고로 stepsize의 경우 선택사항임을 눈치가 빠른 사람은 알 수 있다. ( | 앞에 아무것도 없다. )

언제 다 이렇게 이해하나하는 생각이 들겠다. 사실 대세인 C계열(혹은 ALGOL 계열)문법만 익혀도 코딩하거나 다른 사람의 코드를 이해하는데 지장 없기 때문이다. 하지만 새로 접하는 프로그래밍 언어에 대해서도 유연한 통찰력을 얻기 위해서는 이런 기초도 익혀둘 필요가 있다고 본다.

자 이제 EBNF에 대한 대략적인 것을 알았으니 다음 부턴 실제 코드로부터 배우고, 간간히 EBNF를 통해 문법을 익히도록 하자.

AND

ARTICLE CATEGORY

전체 (126)
EECS (56)
Physics (5)
Misc. (60)

RECENT ARTICLE

RECENT COMMENT

RECENT TRACKBACK

CALENDAR

«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31

ARCHIVE