본문 바로가기

studio/programmazione

[C] 프로그래밍 언어

이 글에 적는 모든 내용은 혜지원 출판사의 <요리조리 맛있는 C언어(서보원 저)>를 참조하여 작성되었습니다.















프로그래밍 언어



프로그램이란, 컴퓨터에게 작업을 지시하기 위해 명령어를 논리적으로 늘어 놓은 것을 말한다. 프로그램을 만들기 위해서 사용하는 것이 프로그래밍 언어인데, 이것은 컴퓨터에게 작업을 지시하기 위한 명령과 표현 방식을 기호로 만들어 놓은 것이다. 컴퓨터가 사람의 언어를 알아듣지 못하기 때문에 프로그래밍 언어를 통해서 명령을 전달하여 지시 사항을 수행하도록 하는 것이다.

이러한 프로그래밍 언어에는 두 가지 부류가 있는데, 기계 중심의 저급 언어와 사용자 중심의 고급 언어가 있다. 표현이야 고급, 저급이 쓰이지만 실제로는 고급 언어가 저급 언어에 비해 월등히 뛰어나다던지 하는 차이가 있는 것은 아니다. 단지 누가 주체이냐 하는 차이만 있는 것이다.

컴퓨터가 알아들을 수 있는 유일한 언어는 우리가 수학 시간에도 늘상 들어왔던, 0과 1의 조합으로 이루어진 이진수이다. 저급 언어기계어(Machine language)라는 것이 이진수의 조합으로 표현되는 프로그래밍 언어이다. 한편 저급 언어에는 어셈블리 언어(Assembly language)라는 것도 있는데, 이것은 이진수 대신 기호를 이용하여 명령어를 표시한다. 이 언어는 저급 언어인데도 불구하고 이진수로 표현되지 않아 기계가 바로 인식할 수 없기 때문에 어셈블리 언어를 이진수로 바꾸어주는 작업이 필요하다. 이 작업을 어셈블(assemble)이라고 하고, 어셈블을 수행하는 프로그램을 어셈블러(assembler)라고 한다.

저급 언어는 기계 중심이기 때문에 기계에 대한 정밀한 제어가 가능하며, 번역 과정이 없거나 적어 빠른 실행 속도를 자랑한다. 하지만 아무래도 프로그래머인 사람이 알아듣기에는 무리가 있다. 이진수로 프로그램을 하라고 하면 얼마나 비효율적일지 상상만 해도 뻔한 결과일 것이다. 또한 기계에 따라 특정 언어를 인식하지 못하는 경우가 있어 호환성이 떨어지기도 한다.

이러한 저급 언어와 달리 고급 언어는 사람 중심의 언어로, 프로그래머가 보다 쉽게 프로그래밍을 할 수 있도록 설계되었다. 주로 영어로 된 명령어를 사용하기 때문에 친숙하며 배우기도 쉽고, 부가적으로 호환성의 향상도 가져오게 되었다(이건 수업 시간에 들은 내용인데 왜인지는 아직 잘 모르겠다). 다만 인간 중심의 프로그래밍 언어를 기계가 이해하기 위해서는 또 다른 번역 과정이 필요하므로 이 과정에서 실행 속도가 느려지게 되며, 기계에 최적화된 언어가 아니기 때문에 기계어에 비해 하드웨어 제어가 어렵다.

고급 언어로 작성된 프로그램은 2진수로 된 명령어인 기계어 코드로 번역되어 실행되는데, 번역과 실행 방법에 따라 컴파일(compile)과 인터프리터(interpreter)로 나뉘게 된다.
먼저, 컴파일 방식을 살펴보자. 컴파일 방식에서 프로그램은 두 번의 변환 과정을 걸쳐 실행된다. 처음에 프로그래머가 작성한 프로그램 소스 파일은 번역기인 컴파일러(compiler)를 통해 기계어 코드로 이루어진 목적 파일(object file)로 변환되어 저장된다. 이 파일은 다시 링커(linker)라는 프로그램에 의해 실행 파일로 변환되는데, 최종적으로 만들어진 실행 파일을 실행하면 작업을 수행하게 된다. 컴파일 방식을 사용하는 언어의 대표적인 예로는 C, C++ 등이 있다.

인터프리터 방식은 프로그램 소스 코드를 기계어 코드로 변환한다는 점에서는 컴파일 방식과 같으나, 기계어 코드를 따로 파일로 만들지 않고 즉시 인터프리터(interpreter)라는 번역기를 통해 프로그램을 실행한다. 문법이 간단하여 배우기 쉽고, 호환성도 좋다. 하지만 컴파일 방식에 비해 시간이 오래 걸린다는 단점이 있다(이 부분에서 궁금한 게... 어째서 파일을 따로 생성하는 컴파일 방식보다 파일을 생성하지 않는 인터프리터 방식이 느린 걸까? 한 줄씩 번역한다는 것과 통째로 번역한다는 점에서 속도 차이가 나는 건가...). 인터프리터 방식을 사용하는 언어의 대표적인 예로는 Python, JavaScript 등이 있다.

참고로 하이브리드 방식이란 것이 있는데, 컴파일과 인터프리트 방식을 함께 쓰는 방식이다. Java나 C#이 이에 해당한다.




//절차적 언어, 객체 지향 언어는 다음에 업데이트!