프로그래밍 언어

Hgkim5241 (토론 | 기여)님의 2024년 8월 15일 (목) 12:15 판 (새 문서: 컴퓨터 프로그램을 짤 때 쓰는 언어. 보통의 자연어와 구분하여 이렇게 부른다. == 언어의 특징에 따른 구분 == 아래의 예시는 프로그래밍 언어의 구분 방법 중 일부이다. === 추상화 수준에 따른 구분 === 프로그래밍 언어가 사람과 기계 중 어떤 쪽에 더 가까운지에 따른 구분이다. 저급 언어는 기계 종속적이며 기계가 해석하기 좋으나, 프로그래머가 코드의...)
(차이) ← 이전 판 | 최신판 (차이) | 다음 판 → (차이)

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

언어의 특징에 따른 구분

아래의 예시는 프로그래밍 언어의 구분 방법 중 일부이다.

추상화 수준에 따른 구분

프로그래밍 언어가 사람과 기계 중 어떤 쪽에 더 가까운지에 따른 구분이다. 저급 언어는 기계 종속적이며 기계가 해석하기 좋으나, 프로그래머가 코드의 의미를 해석하기 어려워진다. 고급 언어는 기계 독립적이며 자연어에 가까운 경우가 많아 프로그래머가 문법과 의미를 해석하기 수월하나, 고급 언어로 작성된 코드를 구동하기 위해서는 컴파일러, 또는 인터프리터를 거쳐 기계어로 번역을 해 주어야 한다.

  • 저급 언어
    기계어, 또는 기계어를 치환한 어셈블리어등이 이에 속한다.
  • 중급 언어
    자연어에 가까운 문법을 가지면서도 저수준의 제어를 제공하는 C언어를 중급언어로 분류하기도 한다.
  • 고급 언어
    문법을 자연어에 가깝게 하여 프로그래머가 쉽게 해석할 수 있도록 만든 언어이다. 대다수의 프로그래밍 언어가 이에 속한다.

실행 방법에 따른 구분

컴퓨터는 원래 기계어만을 실행할 수 있도록 만들어지기 때문에, 기계어가 아닌 다른 프로그래밍 언어로 작성된 원시 코드는 필연적으로 실행하기 위한 중간 처리 과정을 거쳐야 한다. 원시 프로그램을 실행하는 방법에 따라 프로그래밍 언어를 크게 두 종류로 나눌 수 있다.

많은 경우 네이티브 언어가 컴파일 및 최적화를 모두 완료한 상태에서 실행이 되므로 한 줄씩 읽고 처리하는 스크립트 언어에 비해 처리속도가 월등히 빠르다.

언어에 따라서는 Java처럼 기계어로 직접 컴파일하는 대신, 바이트코드 형태로 컴파일한 뒤 이를 인터프리트하는 가상 머신을 제공하는 방식을 쓰기도 하며, 실행 중에 Just-in-time 컴파일을 하면서 실시간으로 모은 프로파일 정보로 추가적인 최적화를 하는 전략도 있다.

프로그래밍 패러다임에 따른 구분

프로그래밍 방식에는 시대별로 패러다임이 존재하는데, 이러한 프로그래밍 패러다임으로 언어를 구분할 수 있다. 같은 패러다임의 언어들 끼리는 코드 작성 방식이 비슷하여 익히기 쉽지만, 서로 다른 패러다임의 언어들은 문법이나 구조가 상이한 경우가 있다.

절차적 프로그래밍
순서대로 코드를 실행하기 때문에 절차적, 과거부터 사용한 방식이기 때문에 전통적 방식이라고도 한다. 코드의 구동 순서는 정해져 있으며 이 순서대로 코드가 작동한다. 흐름 제어를 제외하면 코드는 거의 변수와 배정문으로 이루어진다. C, Pascal 등 대부분의 언어가 이에 해당된다.
병렬 프로그래밍
병렬 처리 개념이 등장하며 만들어진 언어들이다. 코드의 실행 순서가 정해져 있지 않기 때문에 비결정적 언어라고도 한다.
함수형 프로그래밍
명령을 절차적으로 실행하는 방법 대신, 조합 가능한 함수들을 엮는 방식으로 문제를 해결하는 언어들을 말한다.
그 특징 때문에 많은 부분에서 절차적 언어와 프로그램을 서술하는 방식이 다른데, 예를 들어 절차적 언어에서 반복문을 사용하여 해결하던 문제를 함수형 언어에서는 함수의 재귀 호출을 이용하여 해결하려는 경향이 있다.
대표적인 함수형 프로그래밍 언어로는 Lisp, HaskellML이 있다.
논리형 프로그래밍
사실과 규칙이라는 논리적 기술에 기반하여 문제를 해결하는 언어를 논리형 언어라고 한다. Prolog가 대표적인 논리형 언어이다.
객체 지향 프로그래밍
어떤 대상의 상태를 저장하는 기억공간과 이에 관련된 연산을 포함하는 객체 개념을 도입하여 문제를 해결하는 언어이다.
Smalltalk가 최초에 객체 지향 프로그래밍의 개념들을 정립했으며, Java의 대중화로 개념이 널리 퍼져, 현재는 대부분의 언어들이 객체 지향 패러다임을 받아들이고 있다.

꼭 한 언어가 한 패러다임만 지원하는 것은 아니며, C++이나 Python과 같이 여러 패러다임을 함께 받아들인 언어도 있다. 이런 언어들을 보통 멀티 패러다임 언어라고 부른다.

형 검사에 따른 분류

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

  • 약한 타입 언어
  • 강타입 언어

바인딩 시기에 따른 구분

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

  • 동적 타입 언어
  • 정적 타입 언어

언어의 목적에 따른 구분

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

들여쓰기

코드를 작성하면서 들여쓰기할 때, 탭(Tab)을 사용할것인지 스페이스(Space)를 사용할것인지에 대한 논란이 많다. 거의 전쟁에 비유되기도. 구글의 개발자가 분석한 결과, C언어, Go를 제외하고는 들여쓰기에 스페이스를 많이 사용하는 것으로 밝혀졌다.

종류

목록은 사전순으로 기재한다.

각주