프로그램(Program)은 일종의 명령어 집합이다. 컴퓨터에서 특정 기능을 수행하도록 프로그램을 만들기 위해서는 이 명령어들을 구조와 논리에 맞게 작성해 주어야 한다. 이때 우리는 다양한 프로그래밍 언어를 사용해 코드(code)를 작성하고, 이러한 행위를 코딩(coding)이라고 부른다.
프로그래밍 언어라고 하면 대부분 python, C, C++, Java 등을 떠올릴 것이다. 이와 같은 언어들을 고급 언어(High Level Language)라고 하고, 이와 구분되는 언어로 저급 언어(Low Level Language)가 있다. 고급, 저급과 같은 말의 뉘앙스 때문에 오해할 수도 있지만 두 언어는 단지 사용자 친화적인지, 컴퓨터 친화적인지에 따라 구분된다. 컴퓨터가 더 이해하기 쉬운 언어면 저급 언어, 사용자가 더 이해하기 쉬운 언어면 고급 언어이다.
저급 언어
저급 언어에는 기계어(Machine Code)와 어셈블리어(Assembly Language)가 있다. 기계어는 오직 0과 1로 기술되는 컴퓨터 고유의 명령 형식이다. 때문에 일반적으로 저급 언어로 프로그래밍 하기란 불가능에 가깝다. 어셈블리어는 기계어를 기호화하여 특정 값을 대응시킨 언어로, 기계어 보다는 고급 언어와 가까운 형식의 언어이다. 그러나 역시나 어셈블리어로 프로그래밍 하기는 쉽지 않다. 특히 어셈블리어는 CPU마다 명령어가 다르기 때문에 레지스터의 종류에 따른 방법을 익혀야 한다.
컴파일러, 인터프리터
위에서 서술한 바와 같이 일반적으로 저급 언어로는 프로그래밍하기 어렵기 때문에 보다 더 사용자 친화적인 고급 언어로 코드를 작성한다. 이때, 컴퓨터는 고급 언어를 저급 언어와 같이 친숙하게 다루지 못하므로 사용자가 작성한 코드를 저급 언어로 바꿔주는 과정이 필요하다. 이러한 과정을 '컴파일'(Complie)이라고 부르며, 컴파일을 수행하는 소프트웨어를 '컴파일러'(Compiler)라고 부른다. 사용자가 직접 작성한 코드를 소스 코드(Source Code), 그리고 컴파일러에 의해 저급 언어로 변환된 코드를 목적 코드(Object Code)라고 부른다.
컴파일러는 소스 코드 전체를 한번에 컴파일하는 방식으로 작동한다. 즉 소스 코드가 $N$줄로 작성되고 이때 단 1줄이라도 오류가 있으면 컴파일러는 코드 전체를 실행하지 않는다.
이러한 방식과는 달리, '인터프리터'(Interpreter)라는 소프트웨어에 의해 실행되는 고급 언어도 있다. 소스 코드가 인터프리터에 의해 실행되면 한 줄씩 순차적으로 실행된다. 즉 어떤 줄에 문제가 있더라도 그 줄 바로 직전까지는 코드가 실행된다. 때문에 일반적으로 인터프리터는 컴파일러에 의해 실행되는 속도가 느리다. 그러나 컴파일러는 출력물이 목적 코드인 대신, 인터프리터는 소스 코드로 구성된 프로그램을 즉시 실행한다. 컴파일러에 의해 출력된 목적 코드는 실행 파일로 만들어지고, 메모리에 저장되어서 실행되는 등 다른 여러 소프트웨어에 의해 수행되어야 하는 여러 과정이 필요하다.
대표적인 컴파일러 언어로는 C, 포트란이, 인터프리터 언어로는 python, R등이 있다. 그러나 모든 고급 언어가 반드시 둘 중 하나로 구분되지는 않는데, 컴파일러과 인터프리터를 동시에 수행하는 Java와 C# 등의 언어도 존재한다.
명령어
명령어는 연산 코드(Operation Code)와 피연산자(Operand)로 구성된다. 연산 코드는 연산자를, 피연산자는 연산에 사용할 데이터나 데이터가 저장된 주소, 즉 메모리 주소나 레지스터 이름 등을 의미한다. 비유하자면 연산 코드는 동사, 피연산자는 명사라고 할 수 있겠다.