기계어란 말그대로 기대들의 언어 즉, 기계만이 알아 볼수있도록 코딩된 언어 입니다.
말이 어려운가요?
기계(흔히말하는 컴퓨터칩)은 전기의 on/off정보 전기가 흐르고 안흐르고를 1과 0으로 표현을해서 단지 저 두가지 1,0 이라는 숫자만을 인식할수 있습니다.
즉 1과 0로 나열된 그러한 부호를 기계언어라 합니다.
예를들어 컴퓨터에서 신호가 10101100(8비트) 이와 같은 신호를 받는 다면 특정레티스터(예.AX)에 있는 자료를 다른 레지스터로(예. BX)로 옮겨라 던지.
이런식으로 일일이 2진코드에 어떠한 내용의 명령이 담겨져 있는겁니다.
그리고 그 2진코드별의 명령어는 사용되는 CPU별로 다 틀리게 됩니다.
그냥 예삼아서 설명을 하자면(여기서 설명하는 예는 실제기계어가 아닌 예로 들어 설명하는 겁니다.)
00000000 의 의미는 AX와 BX를 더해라
00000001 의 의미는 AX에서 BX를 빼라.
00001010 의 의미는 AX를 BX로 옮겨라..
.......
이런식으로 저마다의 2진부호마다 어떠한 CPU에서의 처리할 명령이 하나씩 1:1 매칭 되어 있는 것입니다.
(만일 어떤 응용프로그램이든 그 프로그램을 헥사에디터로 열어보면 저와 같이 2진숫자들이 쭉 나열되어 있는것을 볼수가 있을겁니다)
만일 우리가 프로그래밍을 할때 일일이 저렇게 기계어를 사용해서 프로그래밍 하게 된다면 일일이 저 2진 부호들을 외울수도 없고 난감하겠죠(쉽게 예를 들기 위해서 8비트만 사용하였지만. 실제는 16비트 32비트 그이상의 명령어들도 많거든요..) 그래서 일일이 테이블을 찾아보며 프로그래밍 해야 겠죠?
그래서 생겨난 것이 바로 저런 2진부호를 니모닉화 시킨 어셈블리어라는 것입니다.
많이 들어봤죠? 근데 이 어셈블리 어라는 것은 바로 위의 2진 코드들을 사람들이 기억하고 알아 보기 쉽도록 니모닉화(부호화)시킨거에 불과하죠.
즉 위에 기계어들이 있다면..
00000000 의 의미는 AX와 BX를 더해라 (ADD AX, BX)
00000001 의 의미는 AX에서 BX를 빼라. (SUB AX, BX)
00001010 의 의미는 AX를 BX로 옮겨라..(MOV AX, BX)
.......
이런식으로 1:1 매칭을 시킨 것이죠.. 기억하기 쉽겠죠?
그리고 어셈블러는 바로 저런 어셈블리어로 작성한 소스코드를 기계어로 바꿔 주는 역할을 하는 것이고요.
하지만 어셈블리 언어 또한 인간이 사용하는 언어와 상당히 달라 프로그래밍시에 상당히 난해함을 격습니다.
그래서 탄생한것이 바로 흔히 고급언어라고 불리우는 인간이 사용하는 언와와 흡사해서 자연어라도 불리우는 컴파일언어가 탄생한것입니다.
고급언어는 우리가 일생활에서 사용하는 말을 거의 그대로 사용합니다.
예를 들어 a 와 b 를 더해서 x에 대입하여라 라는 것을 x = a + b 이렇게 표현하듯이
고급언어도 예를 들어 C언어는 x = a + b ; 이와 같이 표현을 하죠?
아주 사람이 알아 보기도 쉽고 프로그래밍하기도 아주 간단해 졌습니다.
예를 들어 x = a + b ; 라는 것을 어셈블리어에서 코딩하기 위해서는 몇라인에 걸쳐서 코딩을 하여야합니다.
자 우리는 인간의 언어와 비슷한 고급언어(자연어)를 사용하여 프로그램을 작성할수 있습니다.
아니 그런데 이러한 고급언어를 사용하여 작성한 프로그램은 컴퓨터(즉 기계)가 알아볼수 없네요.. 이일을 어쩌죠? 그래서 우리가 고급언어를 사용하여 작성한 소스코드를 기계가 알아볼수 있는 기계어로 바꿔주는 작업이 필요한데요 이러한 작업을 우리는 컴파일이라고 그러고 그러한 역할을 하는 것을 컴파일러라고 그러죠.. 그리고 고급언어는 반듯이 위와 같은 컴파일 작업이 필요하기 때문에 바로 컴파일언어라고도 불리우고요..
자.. 그럼 여기까지 해서 기계어, 어셈블리어, 컴파일어 에 대해서는 이해가 되었죠??
그럼 원시코드는 뭐엇인가?? 원시코드는 소스코드라고도 불리우는데요..
바로 컴파일언어롤 작성한 프로그램을 컴파일 하기전, 어셈블리언어로 짠 프로그램을 어셈블러로 기계어로 바꾸어주기전의 바로 프로그래머가 코딩한 언어그대로의 모습을 원시(소스)코드라고 불리우는 겁니다.