프로그래밍 언어

Kroisse (토론 | 기여)님의 2015년 4월 17일 (금) 04:45 판 (타입 인더스트리의 침공이다!)

컴퓨터 프로그램을 짤 때 쓰는 언어. 보통의 자연어랑 구분해서 이렇게 부른다.

구분

저급 ↔ 고급

사람이 이해하기 어렵지만 컴퓨터가 해석하긴 쉬운 언어를 저급 언어, 반대인 언어를 고급 언어라고 부른다. 물론 이분법으로 나뉘는 게 아니라 C 언어 같은 건 파이썬보다 저급이지만 어셈블리보다는 고급이다... 식으로 말할 수 있다. 고급 언어가 선택이었던 옛날에는 이 구분이 쓸모가 있었는데, 모든 언어가 고급이고 상황에 따라 다른 종류의 언어를 써야 하는 현대에는 별 쓸모 없는 구분이다.

컴파일 ↔ 인터프리트

프로그램을 실행하는 방법은 여러 가지가 있는데 사람이 짠 코드를 실시간으로 "번역"하는 걸 인터프리트라고 하고 미리 "번역"해서 컴퓨터가 빠르게 알아 먹을 수 있는 프로그램(기계어)으로 만들어 주는 걸 컴파일이라고 한다. 엄밀히 말하면 언어보다는 언어 구현체에 가깝긴 하지만 아무래도 컴파일하는 게 편한 언어(C 언어 같은 것)가 있고 인터프리트하기 편한 언어(파이썬 같은 것)가 있게 마련이다. 근데 요즘은 원래대로라면 인터프리트되었던 언어도 성능을 위해 실시간으로 컴파일되거나, 원래대로라면 컴파일되었던 언어가 다른 언어로 재번역되어 인터프리트된다거나 하는 일도 잦아서 이것도 별 쓸모 있는 구분은 아니게 되었다(...).

명령적 ↔ 선언적

어떤 일을 프로그램으로 짤 때 그 일을 하기 위한 단계를 하나씩 써 나가는 언어를 명령적 언어, 일에 대해서만 써 놓고 빈칸을 컴퓨터가 채워 넣는 언어를 선언적 언어라고 한다. 보통 선언적인 언어로 갈수록 과정에는 별 관심이 없는 경우가 많고, 반대로 과정을 잘 제어해야 할 수록 명령적 언어를 써야 한다.

절차적 ↔ 객체지향 ↔ 함수형 ↔ 논리 ↔ ...

프로그램을 짤 때 어떤 모델에 맞추느냐에 따른 구분. 모든 게 프로시저(procedure)면 절차적(procedural), 모든 게 객체(object)면 객체지향(object-oriented), 모든 게 함수(function)면 함수형(functional), 모든 게 논리식이면 논리 프로그래밍 언어 등등. 흔히 패러다임이라고 하는데, 한 패러다임에 속하는 언어들끼리는 일단 하나를 배우면 쉽게 건너탈 수 있지만 서로 다른 패러다임을 배우는 데는 많은 시간이 든다는 게 정론. 고로 여러 패러다임에 속하는 언어를 배우는 게 이득이다. 절차적 언어의 예로 C 언어, 객체지향 언어의 예로 자바, 함수형 언어의 예로 하스켈, 논리 언어의 예로 프롤로그 등등이 있다.

약타입 ↔ 강타입, 동적 타입 ↔ 정적 타입

전산학의 태동기에 등장했던 어셈블리어와 같은 언어들은 모든 데이터를 숫자로만 다룰 수 있었고, 그 숫자를 어떤 의미로 사용할지는 무슨 명령을 쓰냐에 따라서 좌우됐었다. 때문에 어느 데이터는 정수로 쓰이고 어느 데이터는 문자로 쓰이고 어느 데이터는 다른 데이터의 주소로 쓰이는지를 사람이 일일히 기억해 가며 써야만 했고, 실수는 바로 버그로 이어지기 일쑤였다. 이에 뒤에 등장하게 된 언어들은 점차 타입 이론을 사용하여 데이터에 타입을 부여하는 방법으로 버그를 조기에 잡고 안전한 방법으로 처리하도록 디자인되게 되었다. 타입을 더 엄격하게 적용할 수록 강한 타입(strong typing) 언어로 분류되며, 반대로 어셈블리어와 같이 타입 개념이 희박하거나, PHPJavaScript와 같이 사용성을 위해 다소 관대한 타입 시스템을 적용하는 약한 타입(weak typing) 언어도 존재한다.

또한, 타입을 언제 확인하느냐에 따라서도 분류를 나눌 수 있는데, 컴파일 시점과 같이 실행 전 시점에 타입이 올바른지를 체크하는 정적 타입(static typing) 언어가 있고, 실행 중에 동적으로 타입을 체크하는 동적 타입(dynamic typing) 언어가 있다. 보통 CJava와 같이 컴파일러를 쓰는 언어들이 정적 타입인 경우가 많고, Python이나 JavaScript처럼 별도의 컴파일 시점이 없는 스크립트 언어의 경우 동적 타입을 쓰는 경향이 있다. 하지만 반드시 그런 건 아니고, C#의 dynamic 변수처럼 컴파일을 하면서도 일부분 동적 타입을 쓰도록 허용하는 경우도 있고, TypeScript처럼 동적 타입을 쓰는 환경 위에 정적 타입 시스템을 얹어서 쓰는 경우도 있다.

일반 목적 ↔ 시스템 ↔ 스크립팅 ↔ 난해 ↔ ...

용도에 따른 구분. 많은 언어는 아무 용도로나 쓸 수 있지만, 어떤 언어는 시스템 프로그래밍에 특화되어 있고, 어떤 언어는 빠르게 짜고 버리는 코드(스크립트)에 특화되어 있고, 어떤 언어당신의 뇌를 엿먹이는데 특화되어 있다(...). 물론 용도에 맞는 언어를 쓰는 게 정답. 모든 용도에 최적인 언어 같은 거 없다.

종류