티스토리 뷰
프로그래밍 언어
프로그램을 작성하는 데 필요한 언어를 프로그래밍 언어(programming language)라고 합니다. 기계어, 어셈블리어, 컴파일러어 등 3종류가 있습니다. 이들 중 컴퓨터가 직접 이해할 수 있는 것은 기계어 뿐입니다. 코드, 즉 2진 코드로 되어 있어서 마치 암호와 같습니다. 예컨대 기계어(machine "레지스터 language)는 0과 1로 된 클리어하라"라는 명령을 AVR 마이크로컨트롤러에서 는 0010 0100 0000 0000이라고 하는데, 이것이 R0의 내용을 기계어입니다. 기계어는 쓰고 읽을 때의 번잡을 피하기 위해서 흔히 16진수로 표기합니다. 예컨대 0010 0100 0000 0000 대신 $2400이라고 씁니다. (단 $는 16진수 표시임). 기계어는 2진 코드로 되어 있어서 이해가 어려울 뿐만 아니라, 컴퓨터의 기종에 따라 다르고, 프로그램을 작성할 때에도 많은 시간과 노력을 필요로 합니다. 또한 프로그램의 일 부를 삭제한다든가 추가하는 소위 에디팅(editing)이 어려우며, 프로그램에서 잘못된 곳을 찾아내는 디버깅(debugging)이 매우 어렵습니다. 그래서 2진 코드로 된 기계어 대신 우리의 일상 언어에 가까운 기호(symbol)를 쓰는 것이 어떻겠느냐는 의견이 나왔습니다. 예컨대 0010 0100 0000 0000 대신 CLR RO라고 하면 (RO → 0)가 연상되고, 0010 1100 0000 0001 대신 에디팅이나 디버깅도 쉽지 연상되므로, 이해하기도 쉽고, 프로그램을 작성하기도 MOV RO, RI라고 하면 (RO ←R1)이 쉬우며, 않겠느냐는 의견입니다. 이런 의견에 따라 "기계어를 기호화한 언어"가 나오게 되었는데, 이것을 어셈블리어(assembly language)라고 합니다. 그리고 어셈블리어에서 기계어와 1대 1의 대응 관계에 있는 기계어와 1대 1의 알파벳 관계에 코드를 니모닉 코드(mnemonic code)라고 합니다. 여기서 반드시 명심할 것이 있습니다. 그것은 전술한 바와 같이, 컴퓨터가 알아들을 수 있는 언어는 기계어 뿐이라는 사실입니다. 그러므로, 어셈블리어로 작성된 프로그램을 컴퓨터에 아무리 넣어 보았자 소용이 없고, 이것을 기계어로 고쳐서 컴퓨터에 넣어 주어야 합니다. 어셈블리어로 작성된 프로그램을 원시 프로그램(source program)이라고 하고, 기계어로 고쳐진 프로그램을 목적 프로그램(object program)이라고 합니다. 그러면 어떻게 어셈블리어로 작성된 원시프로그램을 기계어로 된 목적프로그램으로 고치는가? 간단한 경우에는 명령코드표를 보면서 고칠 수 있습니다. 예컨대 CLR R0를 0010 0100 0000 0000으로 표를 보면서 고치는 것입니다. 실제로 컴퓨터 발전의 초기에는 이렇게 일일이 사람이 표를 보면서 고쳤다고 합니다. 표를 보면서 기계어로 고치는 사람을 어셈블러(assembler)라고 하였습니다. "er"가 붙으면 사람이라는 뜻입니다. 그러나, 현재에는 대부분의 경우 어셈블리 처리라고 하는 번역 과정을 거쳐서 컴퓨터가 기계어로 고칩니다. 이 때에는 어셈블러 (assembler)라는 번역용 프로그램의 힘을 빌립니다. 방법은 사람이 표를 보면서 하나하나 고치는 것과 같습니다. 그러니까 어셈블러라는 사람이 어셈블러라는 프로그램으로 바뀐 것입니다. 어셈블리어는 기계어를 기호화함으로써 이해하기 쉽고, 프로그램하기가 쉬우며, 에디팅 및 디버깅이 쉽다는 점에서 매우 편리한 언어입니다. 그러나 기계어와 1대 1의 대응관계에 있으므로, 수 많은 명령들을 하나하나 단계적으로 해주어야 한다는 점에서는 기계어와 다를 바 없습니다. 예컨대, Y= 2X +6 이라는 간단한 계산을 하는 데도 10여개의 명령이 있어야 합니다. 더구나 어차피 컴퓨터에 의해서 기계어로 고쳐져야 하므로 "이왕 그럴 바엔 그렇게 많은 과정을 거칠 필요가 있겠는가? 그저 Y = 2.0*X+6.0이라고 우리 인간은 써주고, 컴 퓨터가 이것을 기계어로 바꿀 때 여러 과정으로 나누어 주면 되지 않겠느냐"라는 의견이 나오게 되었습니다. 이러한 의견에 따라 우리가 일상 쓰는 언어 또는 계산식에 가까운 표현으로 프로그램을 작성하는 프로그래밍 언어가 출현하였는데, 이것을 컴파일러어 또는 고급언어라고 합니다. 그러므로, 컴파일러어는 "기계어를 일상 언어화한 것"이라고 할 수 있습니다. 컴파일러어에는 하늘의 별 만큼이나 많은 것들이 있으나, 마이크로컨트롤러에서 사용되는 것에는 BASIC, FORTRAN, PASCAL, PL/M, 등이 있습니다. 이들 중 BASIC에는 컴파일 C언어 외에도 인터프리터도 있습니다. 어느 것이든 간에 이러한 언어로 작성된 원시프로그램은 반드시 기계어로 된 목적 프로그램으로 고쳐야 합니다. 컴파일러라는 번역용 프로그램의 힘을 빌어 소위 컴파일을 해야 합니다. 컴파일러어로 프로그램을 작성하면 프로그램 작성이 쉽고, 기종에 따라 크게 다르지 않으며, 에디팅이나 디버깅이 쉬운 장점이 있는 대신, 마이크로컨트롤러의 경우에는 하드웨어와 관련성이 있는 것에 대한 세부적인 처리가 어렵다는 단점이 있습니다. 하긴 이 단점은 거의 다 보완된 상태이지만, 실제로 가장 큰 단점은 컴파일러로 작성된 프로그램을 컴파일하면 아무 의미도 없는 소위 dummy instuction이 많이 들어가서 프로그램 메모리의 용량과 속도에 문제가 생긴다는 것입니다. 그러긴 해주셔도 프로그램 언어의 진화 방향은 컴파일러어 쪽입니다. 이상에서 설명한 프로그램 언어중 AVR 마이크로컨트롤러에서는 주로 어느 것을 사용 하는가? AVR 인서키트 에물레이터를 포함한 대부분의 교육 및 개발 시스템은 IBM PC와 같은 컴퓨터에 연결해서 사용하도록 되어 있으므로, ATMEL AVR 어셈블리어 또는 AVR C와 같은 컴파일러어를 씁니다. ATMEL AVR 어셈블러는 시물레이터와 함께 AVR.EXE에 들어 있고, AVR C 컴파일러에는 IAR, Code Vision, GCC 등이 있습닏. 어셈블러만을 쓰든, 컴파일러 중 어느 것을 쓰든 물론 개발이 끝난 실제 시스템에서는 기계어로 된 목적 프로그램을 인서키트 에뮬레이터의 SRAM 또는 실제 마이크로컨트롤러의 프로그램 메모리에 넣어서 씁니다.
'정보통신 및 로봇제어시스템' 카테고리의 다른 글
프로그램의 실행 과정 알아보기 (0) | 2021.06.29 |
---|---|
프로그램 작성 순서 (0) | 2021.06.27 |
CPU에 대해서 알아보기 (0) | 2021.06.23 |
ATmega128의 내부 구성 (0) | 2021.06.21 |
하바드 구조에 대해서 (0) | 2021.06.16 |