컴퓨터 하드웨어는 아주 단순한 저수준의 명령어만 실행할 수 있다. 복잡한 응용에서 출발해서 단순한 명령어까지 내려가려면 높은 수준의 작업을 단순한 컴퓨터 명령어로 번역 또는 해독하는 여러 겹의 소프트웨어가 필요하다. 이것이 추상화라고 하는 위대한 아이디어의 한 예이다.
이러한 소프트웨어들은 계층적으로 구성된다.

그림과 같이 응용 프로그램이 가장 바깥쪽에 위치하며, 여러 시스템 소프트웨어가 하드웨어와 응용 소프트웨어 사이에 존재한다.
시스템 소프트웨어에는 여러 가지가 있으나, 현대 컴퓨터 시스템에서 핵심이 되는 두 가지는 운영체제와 컴파일러이다.
운영체제는 사용자 프로그램과 하드웨어 간의 인터페이스 역할을 하면서 각종 서비스와 감독 기능을 제공한다.
- 기본적 입출력 작업의 처리
- 보조기억장치 및 메모리 할당
- 컴퓨터를 동시에 사용하는 여러 응용들 간의 컴퓨터 공유 방법 제공
컴파일러는 C, C++, Java 같은 상위 수준 언어로 작성된 프로그램을 하드웨어가 실행할 수 있는 명령어로 번역하는 일을 한다. 프로그래밍 언어의 복잡성과 하드웨어가 실행하는 명령어의 단순함을 고려해 볼 때, 상위 수준 언어 프로그램을 하드웨어 명령어로 번역하는 일은 매우 중요한 작업이다.
상위 수준 언어에서 기계어까지
전자 장비와 실제도 대화를 하기 위해서는 전기 신호를 보내야 한다. 기계가 이해할 수 있는 가장 쉬운 신호는 on과 off이다. 따라서 기계 언어는 단 두 종류의 문자로 되어 있다. 이 두 종류의 문자를 나타내는 기호는 0과 1이다. 그러므로 보통 기계어는 기수2인 숫자, 즉 이진수라고 생각한다. 각 문자를 이진 자릿수(binary digit) 또는 비트(bit)라고 부른다.
컴퓨터는 우리의 지시에 따라야 하는데 이 지시를 명령어(instruction)라고 한다. 명령어는 컴퓨터가 이해할 수 있는 비트들의 집합에 불과하므로, 이것도 역시 숫자로 생각할 수 있다.
초창기 프로그래머들은 컴퓨터와 이진수로 대화하였으나, 이것은 매우 지겨운 작업이었기 때문에 곧 사람이 생각하는 것과 비슷한 새로운 표시 방법을 고안했다. 처음에는 이 표시 방법으로 표현된 프로그램을 사람이 일일이 이진수로 번역했으나 이것 또한 지루한 작업이었다. 이런 기호식 표현을 이진수로 바꾸는 프로그램을 발명한 선구자들이 나타나서, 컴퓨터에 프로그램하는 것을 컴퓨터 자신이 도와주도록 만들었다. 이런 프로그램을 어셈블러(assembler)라 불렀다.
이와 비교하여 기계가 이해하는 언어를 기계어(machine language)라고 한다.
어셈블리 언어가 많이 개선되기는 했지만 아직도 불편한 점이 많다. 어셈블리 언어는 컴퓨터가 수행할 명령어를 한 줄에 하나씩 써야 하기 때문에 프로그래머에게 기계적 사고방식을 강요한다.
오늘날 프로그래머가 정신 건강을 잃지 않으면서도 높은 생산성을 유지할 수 있는 것은 상위 수준 언어(high-level programming language)와 이것을 기계어로 번역하는 컴파일러가 있기 때문이다.
컴파일러 덕택에 프로그래머는 A + B와 같은 상위 수준 언어 수식을 작성할 수 있다.
컴파일러는 이것을 번역해서 add A, B 라는 어셈블리 언어 문장으로 바꾼다.

상위 수준 언어는 몇 가지 중요한 장점이 있다.
- 프로그래머가 영어 단어와 수학기호를 사용해서 자연스러운 언어로 생각할 수 있게 하며, 작성된 프로그램도 이상한 부호로 된 표 형태보다 일반 문장과 훨씬 비슷한 읽기 좋은 모양이 된다.
- 프로그래머의 생산성을 높여 준다.
- 프로그램을 개발한 기종과 상관없이 어느 컴퓨터에서든 실행이 가능하다.
그 이유는 컴파일러나 어셈블러가 상위 수준 언어 프로그램들을 어떤 컴퓨터의 기계어로도 번역할 수 있기 때문이다.
컴퓨터 하드웨어는 아주 단순한 저수준의 명령어만 실행할 수 있다. 복잡한 응용에서 출발해서 단순한 명령어까지 내려가려면 높은 수준의 작업을 단순한 컴퓨터 명령어로 번역 또는 해독하는 여러 겹의 소프트웨어가 필요하다. 이것이 추상화라고 하는 위대한 아이디어의 한 예이다.
이러한 소프트웨어들은 계층적으로 구성된다.

그림과 같이 응용 프로그램이 가장 바깥쪽에 위치하며, 여러 시스템 소프트웨어가 하드웨어와 응용 소프트웨어 사이에 존재한다.
시스템 소프트웨어에는 여러 가지가 있으나, 현대 컴퓨터 시스템에서 핵심이 되는 두 가지는 운영체제와 컴파일러이다.
운영체제는 사용자 프로그램과 하드웨어 간의 인터페이스 역할을 하면서 각종 서비스와 감독 기능을 제공한다.
- 기본적 입출력 작업의 처리
- 보조기억장치 및 메모리 할당
- 컴퓨터를 동시에 사용하는 여러 응용들 간의 컴퓨터 공유 방법 제공
컴파일러는 C, C++, Java 같은 상위 수준 언어로 작성된 프로그램을 하드웨어가 실행할 수 있는 명령어로 번역하는 일을 한다. 프로그래밍 언어의 복잡성과 하드웨어가 실행하는 명령어의 단순함을 고려해 볼 때, 상위 수준 언어 프로그램을 하드웨어 명령어로 번역하는 일은 매우 중요한 작업이다.
상위 수준 언어에서 기계어까지
전자 장비와 실제도 대화를 하기 위해서는 전기 신호를 보내야 한다. 기계가 이해할 수 있는 가장 쉬운 신호는 on과 off이다. 따라서 기계 언어는 단 두 종류의 문자로 되어 있다. 이 두 종류의 문자를 나타내는 기호는 0과 1이다. 그러므로 보통 기계어는 기수2인 숫자, 즉 이진수라고 생각한다. 각 문자를 이진 자릿수(binary digit) 또는 비트(bit)라고 부른다.
컴퓨터는 우리의 지시에 따라야 하는데 이 지시를 명령어(instruction)라고 한다. 명령어는 컴퓨터가 이해할 수 있는 비트들의 집합에 불과하므로, 이것도 역시 숫자로 생각할 수 있다.
초창기 프로그래머들은 컴퓨터와 이진수로 대화하였으나, 이것은 매우 지겨운 작업이었기 때문에 곧 사람이 생각하는 것과 비슷한 새로운 표시 방법을 고안했다. 처음에는 이 표시 방법으로 표현된 프로그램을 사람이 일일이 이진수로 번역했으나 이것 또한 지루한 작업이었다. 이런 기호식 표현을 이진수로 바꾸는 프로그램을 발명한 선구자들이 나타나서, 컴퓨터에 프로그램하는 것을 컴퓨터 자신이 도와주도록 만들었다. 이런 프로그램을 어셈블러(assembler)라 불렀다.
이와 비교하여 기계가 이해하는 언어를 기계어(machine language)라고 한다.
어셈블리 언어가 많이 개선되기는 했지만 아직도 불편한 점이 많다. 어셈블리 언어는 컴퓨터가 수행할 명령어를 한 줄에 하나씩 써야 하기 때문에 프로그래머에게 기계적 사고방식을 강요한다.
오늘날 프로그래머가 정신 건강을 잃지 않으면서도 높은 생산성을 유지할 수 있는 것은 상위 수준 언어(high-level programming language)와 이것을 기계어로 번역하는 컴파일러가 있기 때문이다.
컴파일러 덕택에 프로그래머는 A + B와 같은 상위 수준 언어 수식을 작성할 수 있다.
컴파일러는 이것을 번역해서 add A, B 라는 어셈블리 언어 문장으로 바꾼다.

상위 수준 언어는 몇 가지 중요한 장점이 있다.
- 프로그래머가 영어 단어와 수학기호를 사용해서 자연스러운 언어로 생각할 수 있게 하며, 작성된 프로그램도 이상한 부호로 된 표 형태보다 일반 문장과 훨씬 비슷한 읽기 좋은 모양이 된다.
- 프로그래머의 생산성을 높여 준다.
- 프로그램을 개발한 기종과 상관없이 어느 컴퓨터에서든 실행이 가능하다.
그 이유는 컴파일러나 어셈블러가 상위 수준 언어 프로그램들을 어떤 컴퓨터의 기계어로도 번역할 수 있기 때문이다.