01. 프로그래밍 언어 개요
컴퓨터를 이용해 문제를 해결할 때는 컴퓨터에 명령을 내려야 하는데, 이 명령어들의 집합이 프로그램이며, 프로그램을 작성하는 과정을 프로그래밍이라고 합니다. 이러한 과정은 컴퓨터가 이해할 수 있는 언어로 실행 프로그램을 만드는 것입니다. 이때 컴퓨터가 이해할 수 있는 언어를 "프로그래밍 언어"라고 합니다.
1) 저급 언어와 고급 언어
(1) 저급 언어
저급 언어, Low Level Language는 하드웨어 지향의 컴퓨터 내부 표현에 가까운 언어로, "기계어"와 "어셈블리어"로 구분됩니다.
기계어는 2진수 형태의 0과 1로 작성하며 컴퓨터가 직접 이해할 수 있는 언어입니다.
어셈블리어는 기계어 명령을 간단한 기호로 표현한 언어이며 기계어보다 사용하기 약간 편합니다. 그러나 두 언어 다 컴퓨터에 더 적합한 언어라 사람이 직접적으로 사용하기는 어려운 언어입니다.
(2) 고급 언어
고급 언어, High Level Language는 저급 언어의 단점을 해결하기 위해 개발된 언어입니다. 사람이 이해하기 쉬운 일상 언어로 기호를 사용해 프로그램을 작성합니다. 저급 언어보다 자연어에 가까운 구문 규칙을 가지고 있어 이식성이 높습니다. 대표적으로 C, Python, Java 등의 언어가 있습니다.
2) 프로그래밍 언어의 발전
프로그래밍 언어는 현재 수백 가지 이상의 언어로 개발되어 사용되고 있습니다. 그러한 프로그래밍 언어가 어떻게 발전해왔는지 알아봅시다.
(1) 1세대 언어 (1940년대)
전자식 컴퓨터가 개발되고, 소프트웨어 개념이 생겨남과 동시에 기계어를 이용한 프로그래밍이 시작되었습니다. 그러나 기계어 프로그래밍은 시간도 오래 걸리고 불편함이 많았습니다. 이를 해결하기 위해 어셈블리어가 만들어졌습니다.
(2) 2세대 언어 (1950~1960년대)
하드웨어가 점점 발전하자 복잡한 프로그램을 작성하기에 어셈블리어도 불편함이 많았습니다. 이를 해결하기 위해 여러가지 고급 언어가 개발되기 시작했고 이때, "포트란"과 '코볼"이 개발되었습니다. 이때 고급 언어를 기계어로 번역하는 "컴파일러"도 개발되었습니다.
(3) 3세대 언어 (1970년대)
고급 언어가 개발되며 다양한 종류의 소프트웨어도 제작되기 시작했습니다. 소프트웨어도 발전함에 따라 사람들에게는 좀 더 체계적이며 새로운 개념의 언어가 필요했고, 이때 구조적 프로그래밍 기법을 따르는 "파스칼"이 개발되었고 뒤이어 "C언어"가 개발되었습니다. 이러한 고급 언어를 바탕으로 유닉스 운영체제와 MS-DOS 운영체제의 개발이 진행됐습니다.
(4) 4세대 언어 (1980년대)
개인용 컴퓨터가 대중화되기 시작한 시기이며, 객체 지향 프로그래밍 기법이 등장했습니다. 다양한 프로그래밍 툴이 지원이 되기 시작했고, C++, Objective-C 등의 언어가 개발되었습니다.
(5) 5세대 언어 (1990년대)
객체 지향 언어가 본격적으로 발전하기 시작했고, GUI 환경 프로그래밍을 위한 여러 클래스의 라이브러리가 등장하며 객체 지향 언어의 장점이 크게 주목받기 시작했습니다. 이러한 추세에 따라 자바, 파이썬 등의 객체 지향 언어가 개발되었고, 인터넷이 등장한 뒤로 웹 프로그래밍이 보편화되었습니다. 그로 인해 HTML(마크업 언어), 자바스크립트 등의 언어가 개발되었습니다.
(6) 6세대 언어 (2000년대)
2000년대에 들어서며 사용자는 더욱 간편하고 쉬운 방법으로 프로그래밍 작업을 하기를 원했고 새로운 개념을 갖춘 언어들과 개발 환경들이 많이 만들어졌습니다. 대표적으로 Go, C#. 코틀린 등의 언어가 있습니다.
3) 프로그래밍 언어별 특징
주요 프로그래밍 언어 특징을 알아보겠습니다.
(1) C
C는 켄 톰슨이 유닉스 시스템에 사용하기 위해 만든 B 언어를 발전시켜 만든 언어로 데니스 리치가 개발했습니다. 저급 언어와 고급 언어의 장점을 모두 가지고 있고 사용률이 높습니다. 시스템 간 호환성이 좋고, 풍부한 연산자를 지원합니다. C를 바탕으로 유닉스, 리눅스 같은 운영체제가 개발되고 발전될 수 있었기에 컴퓨터 프로그래밍 환경의 성장을 이끈 매우 중요한 언어입니다.
(2) Java
마이크로시스템즈 사에서 만든 대표적인 객체 지향 언어입니다. C++이 가진 기능 대부분을 유지하면서도 복잡성 등의 단점은 개선하였습니다. 자바는 컴파일러를 통해 어셈블리어나 기계어로 번역되는 것이 아닌 자바 바이트코드로 변환됩니다. 자바 바이트코드는 자바 가상 머신 내의 인터프리터 방식으로 실행되는 명령어입니다. 자바 가상 머신을 사용하기에 이식성이 매우 높지만 수행 속도는 느리다는 단점이 있습니다.
(3) Python
인터프리터 방식의 대표적인 객체 지향 스크립트 언어 중 하나입니다. 문법 구조가 단순하며 시스템 언어와 스크립크 언어 중간에 위치하여 다른 언어와 잘 융합된다는 장점이 있습니다. 무엇보다 데이터 과학에 관한 다양한 라이브러리르 제공하고 있어 사용률이 점점 높아지고 있습니다.
02. 프로그래밍 언어 구현 방법
1) 소스코드 작성
프로그래밍 언어로 프로그램을 작성하려면 언어를 선택한 후 "소스코드"를 작성하여, "소스 파일"을 만들어야 합니다. 소스파일은 메모장이나 Visual Studio Code, Eclipse, Atom 등 에디터나 통합 개발 환경을 사용하여 만들 수 있습니다.
2) 프로그래밍 언어 번역
소스코드로 작성된 명령은 반드시 컴퓨터가 이해할 수 있는 언어, 즉 기계어로 바꿔져야 합니다. 소스코드를 기계어로 번역하는 것을 "프로그래밍 언어 번역"이라고 하며 이러한 프로그래밍 언어 번역 기법은 "컴파일러 방식"과 "인터프리터 방식"으로 나뉩니다.
(1) 컴파일러
컴파일러는 프로그램 전체 소스코드를 기계어로 한 번에 번역해 실행 파일을 만든 후 프로그램을 실행하는 방식입니다. 대표적으로 C언어가 컴파일러 방식을 사용합니다. 이 방식은 소스코드에서 미리 오류를 찾아내므로 실행했을 때 문제가 생길 일이 없습니다. 그렇기에 최적화된 작업이 가능하며 실행 속도가 빠릅니다.
(2) 인터프리터
인터프리터는 소스코드를 한 행씩 읽어가며 번역과 실행을 동시에 수행하는 방식입니다. 대표적으로 파이썬이 인터프리터 방식을 사용합니다. 컴파일러를 이용하는 방식보다 속도가 느리지만, 즉각적인 피드백이 가능합니다.
3) 프로그래밍 언어 전체 실행 과정
프로그래밍 언어가 실행되는 과정은 이러합니다.
- 사용자가 프로그래밍 언어로 소스코드를 작성하여 소스파일을 만든다.
- 소스파일은 번역(컴파일 or 인터프리터)을 거쳐 개체 파일이 된다.
- 링커 프로그램을 사용해 개체 파일을 실행 파일로 바꾸는 링킹 과정을 거친다.
- 작성된 프로그램이 컴퓨터 메인메모리에 로드된다. (로더)
- 프로그램이 실행된다.
03. 프로그래밍 언어 분류
프로그래밍 언어는 사용 목적이나 형식에 따라 "절차 지향 언어", "객체 지향 언어", "논리형 언어", "함수형 언어"로 분류됩니다.
1) 절차 지향 언어
절차 지향 언어는 프로그램을 작성할 때 실행 순서를 중심으로 설계하는 프로그램 작성 언어입니다. 절차 지향 언어를 이용한 프로그램은 문제를 풀기 위한 명령어를 순차적으로 실행해 표현됩니다. 대표적으로 C, C++, 포트란, 코볼 등이 있는데 초창기 등장한 언어는 대부분 절차 지향 언어입니다.
2) 객체 지향 언어
객체 지향 언어는 프로그램을 명령어의 목록으로만 보는 시각에서 벗어나, 독립된 단위인 '객체' 들의 집합으로 파악하는 언어입니다. 데이터와 기능을 하나로 묶어 사용합니다. 대표적으로 Java, Python, C++, C# 등이 있습니다.
(C++ 언어는 절차지향과 객체지향의 컨셉을 모두 가진 언어입니다.)
객체 지향 언어는 절차 지향 언어의 단점들을 보완하기 위해 등장했습니다.
절차 지향 언어는 데이터와 기능을 별도로 관리하여 기능을 호출한 후, 데이터에 접근하여 일을 처리하기 때문에 현실 세계와 사용자의 요구에 유연하게 대처하지 못하지만, 객체 지향 언어는 기능과 데이터를 하나로 묶어 캡슐화한 후, 메시지를 전달해 일을 처리하므로 훨씬 효율적입니다.
3) 논리형 언어
논리형 언어는 논리학의 관계식 형태로 프로그램을 기술한 언어입니다. 대표적인 언어로는 프롤로그가 있으며, 논리식을 바탕으로 개체 간의 관계에 대한 문제를 해결할 때 주로 사용됩니다. 이때 '관계' 란 프로그램의 로직이 표현되는 방법을 말하는데 이러한 관계에 바탕을 둔 '쿼리'를 수행하여 계산을 수행합니다.
4) 함수형 언어
함수형 언어는 데이터에 대한 함수 적용을 바탕으로 처리 과정을 기술하는 언어입니다. 모든 연산이 함수의 평가에 따라 표현되며, 일반적으로 변수, 할당문, 대입 연산자 등을 쓰지 않는다는 특징이 있습니다. 대표적인 언어로는 리스프, 스킴 등이 있습니다.