프로그래밍 기초

KANOTYPE WIKI
둘러보기로 이동 검색으로 이동

이 문서는 프로그래밍에 대한 기초 해설이다.

들어가기에 앞서

우리들의 일상 생활에서 개인용 컴퓨터(PC, Personal Computer)를 비롯한 각종 전자 기기들은 이제 없어서는 안될 필수품이 되었다. 불과 몇십년 전만 해도 거대한 빌딩 만한 컴퓨터들이 이제는 각 가정에 1대, 심지어는 가방에 넣고 들고다닐 수 있을 정도가 된 것이다. 이러한 컴퓨터들은 각종 산술 계산은 물론 다양한 작업을 수행할 수 있다.

컴퓨터는 어떠한 원리로 작동하며, 이런 컴퓨터들을 어떻게 하면 유용하게 활용할 수 있을까? 이 문서는 컴퓨터 프로그램과 그 프로그램을 작성하는 프로그래밍에 대한 내용을 다룬다. 또한 저자의 주관이 강하게 개입되어 있으며 일부 항목에서는 오류가 있을 수 있다. 이 문서는 위키 문서 이므로 오류를 발견한 독자는 망설이지 말고 로그인 한 후 수정을 하자.

컴퓨터의 작동 원리와 프로그램

일반적으로 컴퓨터는 중앙 처리 장치(CPU), 기억 장치(Memory), 입출력 장치(Input/Output Device)로 구성되며 CPU는 메모리에 적재된 프로그램에 따라 각종 작업을 수행한다. 프로그램은 CPU가 이해할 수 있는 기계어로 이루어져 있으며 이 기계어는 CPU의 종류마다 달라진다. 이때문에 서로다른 CPU가 같은 프로그램을 사용하는 것은 불가능하다.

즉 프로그래밍이란, CPU가 이해할 수 있는 기계어로 이루어진 프로그램을 작성하는 것을 의미한다. 우리가 흔히 사용하는 개인용 PC는 일반적으로 Intel의 x86 시리즈와 그 호환 CPU들(대표적으로 AMD의 CPU)이 주로 사용되는데, 여기서 잠깐 x86 CPU를 위한 기계어 프로그램을 살펴보자.

66 B8 05 00 (알파벳은 16진수를 의미한다, 10=A, 11=B, 12=C, 13=D, 14=E, 15=F)

이 프로그램은 어떤 의미일까? 이 프로그램은 CPU 내부 레지스터 EAX에 숫자 5를 입력하라는 의미이다. 보는바와같이 기계어는 숫자만으로 구성되어 있으며 일반적으로 사람이 이해하기 어렵다. 때문에 이해하기 힘든 기계어로 프로그램을 작성하기 보다는, 좀더 사람이 이해하기 쉬운 언어로 프로그램을 작성하고, 그 프로그램을 CPU를 위한 기계어 프로그램으로 변환하는 방식이 도입되었다. 이때 사람이 이해하기 쉬운 언어를 고급 언어라고 하며, CPU가 인식하는 기계어를 저급 언어[1] 라고 한다. 요즘 시대의 프로그래밍이라고 하면, 일반적으로 이 고급 언어를 이용한 프로그램 작성을 의미한다.

고급 언어 프로그램이 기계어가 되기 까지

그렇다면 고급 언어로 작성한 프로그램은 어떤 과정을 거쳐서 CPU가 이해할 수 있는 기계어 프로그램으로 바뀌게 될까. 고급 언어로 작성된 프로그램[2]을 기계어 프로그램[3]으로 변환화는 과정을 컴파일 이라고 하며, 이러한 작업을 수행 해 주는 프로그램을 컴파일러 라고 한다. 프로그래머는 자신이 작성한 소스 코드를 컴파일러를 통해 컴파일하여 목적 프로그램으로 변환하게 된다. 이 목적 프로그램을 메모리에 적재하여 CPU에 프로그램이 적재된 메모리 주소를 지정하면, CPU는 프로그램에 기술된 작업 순서에 따라 작업을 시작하게 된다. 물론 독자들이 지금까지 프로그램을 실행할 때는 단순히 더블클릭만 하면 저절로 프로그램이 실행 되었을 것이다. 이는 프로그램실행에 필요한 준비작업을 운영체제(OS)가 대신 해 주기 때문이다. 각 OS에서 이용할 수 있는 컴파일러들은 프로그래머가 작성한 프로그램 본체에 OS가 프로그램을 메모리로 적재하는데 이용하는 추가적인 부분들을 컴파일 과정에서 자동으로 추가해 준다. 이때문에 컴파일 완료된 최종 실행 프로그램들의 기계어를 살펴보면, 프로그래머가 추가한 부분 이외의 복잡한 내용들이 추가되어 있는것을 알 수 있다.

고급 언어의 종류

현재 프로그래머들이 즐겨 쓰는 고급 언어에는 다음과 같은 언어들이 있다. (물론 여기 기재된 언어 이외에도 정말 다양한 종류의 언어들이 많다.)

  • BASIC
  • C
  • C++
  • C#
  • Cobol
  • Java
  • Pascal
  • FORTRAN
  • 그 외 수많은 언어들

이러한 고급 언어들은 언어가 기계어로 변환되는 과정이나 작동 방식에 따라 여러 종류로 구분된다. 기계어 코드의 컴파일 방법에 따라 소스 코드를 한번에 기계어로 컴파일 한 후 실행하는 컴파일 언어와 프로그램의 각 부분을 실행하면서 실시간으로 기계어로 해석하는 인터프리터 언어로 분류할 수 있으며, 컴파일 언어는 다시 각 CPU의 기계어로 바로 컴파일되는 네이티브 언어와 서로 다른 CPU의 기계어 환경을 극복하기 위해 중간 단계를 거치는 매니지드 언어로 구분할 수 있다.

유명한 프로그래밍 언어인 C는 컴파일언어이며, 바로 기계어로 컴파일되는 네이티브 언어이다. C#이나 Java와 같은 경우는 컴파일 언어이지만 소스코드가 직접 기계어로 변환되는 대신 중간 언어로 변환되는 매니지드 언어이다. BASIC은 프로그램이 실행되면서 실시간으로 해석되는 컴파일이 필요없는 인터프리터 언어이다.

주석

  1. 이 말은 약간의 추가 설명이 필요한데, 숫자로 이루어진 기계어를 좀더 사람이 읽기 쉽도록 개선한 기계어와 1대1 대응이 되는 어셈블리어 라는 언어가 있다. 저급 언어라고 하면 일반적으로 이 어셈블리어를 지칭한다.
  2. 보통 원시 프로그램, 원시 코드, 혹은 소스 코드 라고 한다.
  3. 보통 목적 프로그램 이라고 한다.