프로그래밍 언어와 컴파일러에 대해 알아보자
시스템 소프트웨어나 응용 소프트웨어를 개발하려면 원하는 기능을 수행하는 프로그램을 작성해야 한다.
프로그램을 작성하는 언어와 작성된 프로그램을 컴퓨터가 이해할 수 있도록 해석해주는 컴파일러의 개념을
설명하고, 각종 프로그래밍 언어를 발전 동향에 따라 소개한다.
1.프로그래밍 언어와 컴파일러의 기능
문서를 작성하고 그림을 그리고 출력을 하려면 프로그램이 있어야 한다.
이러한 프로그램을 개발하기 위해서는 프로그램 언어가 있어야 한다.
개발자인 프로그래머는 프로그래밍 언어를 사용하여 프로그램을 작성하거나 수정하게 된다.
프로그래밍 언어는 다양한 종류가 있으며 이를 언어표현의 난이도 수준에 따라 기계가 이해하기 쉬운
저수준언어와 사람이 이해하기 쉬운 고수준언어로 구분할 수 있다.
또는 컴퓨터의 해석방식에 따라 컴파일러 방식과 인터프리터 방식으로도 구분할 수 있다.
▶ 저수준 (Low-level) 언어와 고수준 (High-level) 언어 ◀
컴퓨터가 이해하기 쉽도록 고안된 저수준 컴퓨터 언어로는 기계어 (Machine Language)와 어셈블리
언어 (Assembly Language)가 있다. 기계어는 컴퓨터 하드웨어에서 자료 표현의 기본 단위인 비트의 값 0과 1로 그대로 표기하는 언어이다.
기계어는 컴퓨터 CPU에서 명령을 수행하기 위해 반드시 필요로 하며 CPU의 종류에 따라 각기 고유한 명령어로 구성되어 있다.
컴퓨터는 기계어로 작성된 프로그램을 직접 수행할 수 있으므로 컴퓨터 실행에는 효율적이지만, 사람이 작성하기에는 불편하며 매우 많은 시간과 노력을 요구한다.
어셈블리 언어는 컴퓨터 고유의 기계어 명령을 사람이 어느 정도 해독할 수 있도록 문자화하거나 기호화한 형태를 가지고 있다. 어셈블리 프로그램은 기계어 프로그램과 동일한 내용을 수행하는 명령으로 0과 1로 구성된 기계어를 문자 형태로 그대로 대응시킨 것이다.
따라서 어셈블리 언어는 기계어와 마찬가지로 CPU 종류에 따라 명령어가 다르게 되어 있다.
한편, 어셈블리 프로그램이 실행될 때에는 일단 기계어로 번역되는 과정을 거쳐야 컴퓨터에서 실행이 가능하게
된다.
[기계어 프로그램] [어셈블리 프로그램]
그림 1 : 저수준 컴퓨터 언어 프로그램의 예
어셈블리 언어도 사람이 프로그램을 작성하기에는 결코 쉽지가 않으며 컴퓨터 CPU의 종류에 따라 다르다는
단점이 있다.
고수준 프로그래밍 언어는 프로그램 작성이 보다 쉽도록 명령어를 일상적으로 사용하는 문장에 가깝게 만들어서 코딩 부분이 훨씬 줄어들게 하였다.
고수준 언어는 기계어로 번역하는 복잡한 과정을 거쳐야 하지만 컴퓨터 하드웨어에 독립적이므로 프로그래밍
과정은 더욱 간단해진다.
그림 2 : 고수준 컴퓨터 언어 프로그램의 예
고수준 언어로는 실행할 작업의 목적이나 성격에 따라 다양한 언어가 사용되고 있으며 그동안 기술의 발전에 따라 많이 진화되어 왔다.
일반적인 프로그램을 작성하는 절차적 (Procedural) 언어로는 FORTRAN, COBOL, C, PASCAL, BASIC 등이 대표적이며, 최근에는 C++, Java 등의 객체지향 언어가 많이 사용되고 있다.
한편 자연어에 더 가까운 4세대 언어로는 SQL, RPG등이 있으며, 인공지능 등의 특수 목적의 언어로는 LISP, Prolog, SmallTalk 등이 있다.
▶ 컴파일러 (Compiler)와 인터프리터 (Interpreter) ◀
기계어는 컴퓨터가 직접 해석하여 처리할 수 있는 언어이며 고수준 프로그래밍 언어는 사람이 쉽게 사용할 수
있도록 만들어진 언어이다.
따라서 기계어 이외의 다른 언어로 작성된 모든 프로그램은 일단 기계어로 번역되어야 프로그램의 실행이
가능하다.
고수준의 컴퓨터 프로그램을 번역하는 데에는 컴파일러와 인터프리터의 두 가지 방식이 있다.
컴파일러는 고수준 프로그램 언어로 작성된 소스 프로그램 (Source Program)을 기계어로 번역하여 그 결과를 오브젝트 코드(Object Code)라 불리는 실행 가능한 프로그램으로 저장해 둔다.
일단 오브젝트 코드로 존재하는 프로그램은 항상 컴퓨터에서 실행이 가능하다.
*.exe 또는 *.com 파일이 이에 해당하며 대부분의 응용 프로그램들이 이런 방식으로 컴파일되어 실행파일 형태로 제공된다.
프로그램이 실행될 때에는 번역이 필요 없으므로 실행 속도가 빠르며 번역된 기계어는 사람의 해독이 어려워 소스코드의 보안에도 좋다. 그러나 일단 컴파일하여 제공되므로 오류가 발생하거나 새로운 내용으로 변경하고자 할 때 즉시 적용하는 것은 곤란하다.
반면에 인터프리터는 미리 번역을 해 두는 것이 아니라 실행할 때마다 소스 프로그램을 한 줄씩 기계어로 해석하여 바로 실행을 하는 방식이다.
BASIC이 대표적인 인터프리터 방식의 언어이며 웹페이지에 많이 사용되는 스크립트 언어 (Script Language)들도 인터프리터 방식을 따르고 있다.
실행 속도는 약간 느리더라도 특별히 문제가 안 되는 분야에서 많이 사용되며, 장점으로는 개발이나 업데이트가
쉽다는 것이다.
그림 3은 어셈블러, 언터프리터, 컴파일러에서 프로그램 처리과정을 보여주고 있다.
그림 3 : 프로그램 언어의 실행 과정
(가)는 어셈블리 언어로 작성된 프로그램이 어셈블러에 의해 기계어로 변환되어 실행되는 과정을 설명하며,
(나)는 고수준 언어로 작성된 프로그램을 인터프리터가 해석하여 바로 실행되는 과정을 보여주고 있으며,
(다)는 일단 컴파일러에 의해 오브젝트코드로 번역되어 보관되었다가 필요할 때 실행하는 과정을 설명하고 있다.
2.초기 프로그래밍 언어
컴퓨터에서 원하는 작업을 수행하기 위해 기계어로 프로그램을 작성하는 것은 매우 곤혹스러운 일이므로 위에서 설명한 바와 같이 어셈블리 언어가 등장하게 되었다.
어셈블리 언어는 기계어를 그대로 기호화하여 0과 1의 숫자 대신 더하기의 경우 A(Add),
곱하기는 M(Multiply), 문자열 비교의 경우 C(Compare), 데이터 로드할 때 L(Load) 등의 명령을 사용한다.
메모리 주소도 번지수 대신에 기호로 된 이름을 사용할 수 있다.
어셈블리 언어는 기계어에 비해 사용하기 쉬우나 역시 배우기는 어려우며, 컴퓨터 CPU 종류에 따라 해당하는 어셈블리 언어가 다르다. 산업기계 제어용 프로그램에서는 프로세서의 속도를 증가시키기 위하여 프로그램을 주로 어셈블리 언어로 작성하고 있다. 그러나 최근에는 프로세서의 성능이 향상됨에 따라 기계제어용
프로그램에서도 C 또는 Java 등의 고수준 언어를 사용하는 추세이다.
컴퓨터 기종에 독립적인 일반 프로그램 언어로는 1954년 과학이나 공학 계산을 위한 프로그램용으로
개발된 FORTRAN (FORmular TRANalstor)이 최초의 고수준 프로그래밍 언어이다.
그림 4 : FORTRAN 및 COBOL 프로그램의 예
우주선의 궤도를 계산하거나 자동차 및 선박의 설계 분야 등에 많이 사용되었으며 아직도 선박설계용으로 사용하는 경우가 있다.
COBOL 언어는 1960년대 초반 데이터 처리를 주 목적으로 하여 여군으로 활동 중이던 컴퓨터과학자 그레이스
호퍼 (Grace Hopper)가 개발하였다.
그림 4에서 보듯이 영어 표기와 유사하며, 읽기 쉽고 작성하기 쉽고, 유지하기 용이하다는 장점이 있다.
회계처리나 상거래와 같은 비즈니스 응용에서 많이 사용되어 왔다.
3.절차적 프로그래밍 언어
1970년대에 들어와 소프트웨어의 개발이 활발해지면서 작성이 용이하고 체계적인 프로그래밍 언어의 요구가 증가되었다. 특히 컴퓨터가 수행할 작업의 내용을 순서대로 작성해 주는 절차적 언어의 필요성이 대두되었다. 컴퓨터의 수행 작업이란 주로 입력, 계산, 데이터 처리 및 저장, 출력 등의 작업을 반복시키는 것이다. 이를 체계적인 구조로 표현하기 위하여 구조적 프로그래밍(Structured Programming) 개념을 프로그램 언어에 적용하였다.
구조적 프로그래밍에서는 프로그램의 반복 및 제어 구조의 표현을 체계적으로 할 수 있다는 점이 가장 큰 특징으로, 반복구조를 위해 for, while, do while 문장이 있고, 선택 구조를 위해 if 문이나 switch case 문이 있다.
그림에서는 보듯이 이러한 구조문은 언어에 따라 문법만 다를 뿐 제어구조의 기본 개념은 동일하다. 대표적인 절차적 프로그래밍 언어로는 C, Pascal, BASIC, PL/I, Ada 등이 있다.
C 언어는 1970년대 초반 AT&T Bell 연구소에서 UNIX 운영체제 프로그램을 작성하기 위하여 개발한 언어로서, 요즘을 각종 응용 소프트웨어의 개발에 널리 사용되고 있다.
C 언어는 고수준 프로그램 뿐만 아니라 저수준의 하드웨어 제어 프로그램의 작성에도 편리하므로 용용 프로그램의 개발은 물론이고 시스템 프로그램이나 산업기계 제어 프로그램의 개발까지 폭넓게 사용되고 있다.
BASIC (Beginner’s All purpose Symbolic Instruction Code)은 간단한 개산을 위하여 초보자용으로 개발된
언어로 배우기 쉽고 작성이 용이하다는 장점이 있다.
1980년대 및 1990년대 PC에서부터 널리 활용되어 왔다.
그림 5는 C언어와 BASIC 언어로 작성된 예를 보이고 있다.
그림 5 : 절차적 프로그램 언어의 예
4.객체지향 언어
절차적 프로그래밍 언어는 컴퓨터가 수행할 작업 순서대로 프로그램을 작성하지만 객체지향(Object Oriented)
언어는 인간이 이해하기 쉬운 사물이나 개념을 객체(Object)로 표현하고 이들 객체 위주로 프로그램을 작성하자는 것이다.
객체지향 언어에서는 객체 (데이터)의 형식을 의미하는 클래스 (Class)와 그 객체의 처리방법을 한 묶음으로
표현한다.
절차적 언어에서는 프로그램의 시작부터 끝날 때까지의 작업절차를 표현하고 있지만 객체지향 언어에서는 객체의 처리방법을 클래스에 정의하고 있다가 필요시(이벤트 발생시) 호출하여 해당 작업만을 수행한다.
이를 이벤트기반 (Event Driven) 프로그래밍 기법이라고 한다.
객체지향 언어에서는 프로그램을 객체별로 분리하여 취급할 수 있으므로 재사용과 수정이 용이하게 된다.
대표적인 객체지향 언어로는 SmallTalk, C++, Java, C# 등이 있다.
C++ 언어는 1980년대 AT&T Bell 연구소에서 C 언어를 확장하여 클래스, 객체, 이벤트 등의 객체지향 개념을 적용하도록 만든 언어이다. 데이터베이스에서의 활용 또는 웹 어플리케이션의 개발 뿐 만 아니라 각종 응용 프로그램 개발에 많이 사용되고 있다.
한편 C# 언어는 마이크로소프트사에서 웹 서비스 어플리케이션에 적합하도록 C++를 확장하여 개발한 객체지향언어이다.
Java 언어는 1980년대 후반 Sun Microsystems사가 차세대 프로그래밍 언어로 개발한 대표적인 객체지향언어로서 현재 웹 어플리케이션 뿐 만 아니라 일반 어플리케이션이나 소형 가전기기에도 사용되고 있다. Java로 작성된 일반 데스크탑 응용 프로그램을 Application 이라 부르며, 웹 응용 프로그램은 Applet, 셋탑박스 나 모바일 기기 등에서의 Java 프로그램은 Xlet 또는 Jlet 등으로 불리고 있다. Java 컴파일러는 일종의 중간형태의 기계어인 바이트코드 (Byte Code) 형태로 번역하고, 실행 시에는 Java VM (Virtual Machine) 에서 바이트코드를 해석하여
작업을 수행한다.
그래서 Java 응용 프로그램이 수행되려면 사용자의 시스템에 Java VM이 설치되어 있어야 하는 것이다.
그림 6은 C++ 및 Java로 작성된 프로그램의 예를 보여주고 있다.
그림 6 : C++ 및 Java 언어 프로그램의 예