프로그래밍 언어
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.
1. 개요
프로그래밍 언어는 인간이 컴퓨터에 명령을 전달하기 위해 설계된 인공 언어이다. 최초의 프로그래밍 언어는 기계어였으며, 이후 어셈블리어, 고급 프로그래밍 언어로 발전해왔다. 프로그래밍 언어는 하드웨어의 세부 사항을 추상화하여 알고리즘을 표현하며, 1950년대 포트란(Fortran)이 최초의 컴파일된 고급 프로그래밍 언어로 여겨진다. 프로그래밍 언어는 크게 명령형, 함수형, 논리형, 객체 지향 언어로 분류되며, 저수준 언어와 고수준 언어, 인터프리터 방식과 컴파일러 방식 언어로도 구분된다. 프로그래밍 언어는 구문 규칙과 의미 규칙으로 정의되며, 데이터와 연산을 표현하고 알고리즘을 정확하게 표현하는 데 사용된다. 프로그래밍 언어는 가독성, 작성 용이성, 신뢰성을 고려하여 설계되며, 컴파일러 또는 인터프리터를 통해 기계어로 변환되어 실행된다. C, C++, 자바, 파이썬 등 다양한 프로그래밍 언어가 존재하며, 특정 목적이나 도메인에 특화된 언어도 있다.
더 읽어볼만한 페이지
- 프로그래밍 언어 분류 - 하드웨어 기술 언어
하드웨어 기술 언어(HDL)는 전자 시스템의 구조와 동작을 텍스트 기반으로 표현하는 언어로, 디지털 회로 설계의 핵심 도구로 사용되며, 시뮬레이션 및 디버깅을 통해 설계 검증을 수행한다. - 프로그래밍 언어 분류 - 고급 프로그래밍 언어
고급 프로그래밍 언어는 기계어보다 높은 수준의 추상화를 제공하며, 변수, 객체, 함수 등의 개념을 사용하여 프로그래머가 기계의 세부 사항에서 분리되어 편리하게 프로그래밍할 수 있도록 하는 언어이다. - 프로그래밍 언어 - 다중 패러다임 프로그래밍 언어
다중 패러다임 프로그래밍 언어는 둘 이상의 프로그래밍 패러다임을 지원하며, 다양한 프로그래밍 스타일을 혼합하여 사용할 수 있도록 설계되었다. - 프로그래밍 언어 - 모조 (프로그래밍 언어)
모조는 모듈러사에서 개발한 파이썬과 유사한 구문의 고성능 프로그래밍 언어로, AI 애플리케이션 개발에 초점을 맞추고 러스트의 영향을 받은 메모리 안전성을 제공하며 향후 오픈 소스로 전환될 예정이다.
프로그래밍 언어 | |
---|---|
지도 정보 | |
기본 정보 | |
유형 | 명령형, 선언형, 객체 지향, 함수형, 제네릭 등 |
디자인 | 표준화된 구문과 의미 체계, 문제 해결 방법과 데이터 표현 |
개발자 | 프로그래머 |
용도 | 컴퓨터 프로그램 작성 알고리즘 구현 자료 구조 정의 응용 프로그램 개발 |
영향 | 컴퓨터 과학 소프트웨어 공학 정보 이론 수학 논리학 |
관련 개념 | 컴파일러 인터프리터 가상 머신 프로그래밍 패러다임 |
역사 | |
기원 | 1940년대 초반 |
초기 프로그래밍 언어 | 기계어 어셈블리어 포트란 코볼 리습 |
현대 프로그래밍 언어 | C 언어 C++ 자바 파이썬 자바스크립트 Go |
특징 | |
구문 | 언어 규칙 정의, 키워드, 연산자, 구두점 등으로 구성 |
의미 체계 | 프로그램의 의미와 실행 동작 정의 |
자료형 | 정수, 실수, 문자열, 불리언 등 다양한 자료형 제공 |
제어 구조 | 조건문, 반복문 등 프로그램 흐름 제어 |
라이브러리 | 재사용 가능한 코드 모음 제공 |
프로그래밍 패러다임 | 언어 디자인에 영향을 주는 프로그래밍 스타일 (객체 지향, 함수형 등) |
분류 | |
저수준 언어 | 기계어 어셈블리어 |
고수준 언어 | 포트란 코볼 C 언어 C++ 자바 파이썬 자바스크립트 Go |
컴파일 언어 | 소스 코드를 기계어로 번역 후 실행 |
인터프리터 언어 | 소스 코드를 한 줄씩 번역하며 실행 |
절차적 언어 | 명령어의 순서를 강조하는 언어 |
객체 지향 언어 | 객체와 클래스를 중심으로 프로그램 구성 |
함수형 언어 | 함수를 주요 구성 요소로 사용하는 언어 |
활용 분야 | |
웹 개발 | 자바스크립트, 파이썬 등 |
모바일 앱 개발 | 자바, 스위프트, 코틀린 등 |
게임 개발 | C++, C# 등 |
인공지능 | 파이썬, R 등 |
임베디드 시스템 | C 언어 등 |
데이터 과학 | 파이썬, R 등 |
주요 프로그래밍 언어 목록 | |
참고 자료 | |
참고 문헌 | Introduction to Programming Languages |
2. 역사
프로그래밍 언어의 역사는 컴퓨터의 발전과 밀접하게 연관되어 있다.
최초의 컴퓨터는 종종 프로그래밍 언어 없이 기계어로 프로그래밍되었다. 십진이나 이진 형태의 프로그램들은 천공 카드나 자기 테이프에서 읽거나, 컴퓨터 프론트 패널의 스위치를 켜고 끄는 방식으로 불러왔다. 이러한 기계어는 나중에 1세대 프로그래밍 언어(1GL)로 불리게 되었다.
이후 2세대 프로그래밍 언어(2GL)인 어셈블리어가 개발되었다. 어셈블리어는 여전히 특정 컴퓨터의 명령어 집합 구조와 밀접하게 관련되었지만, 프로그램을 사람이 읽기 쉬운 형태로 만들어주고 주소 계산의 번거로움과 오류 발생 가능성을 줄여주었다.
1950년대에는 최초의 고급 프로그래밍 언어, 즉 3세대 프로그래밍 언어(3GL)가 작성되었다. 초기의 고급 프로그래밍 언어는 Plankalkül로, 콘라트 추제가 1943년부터 1945년까지 독일의 Z3용으로 개발하였으나, 1998년과 2000년이 되어서야 구현되었다.[90]
4세대 프로그래밍 언어(4GL)는 3세대 프로그래밍 언어보다 내부 컴퓨터 하드웨어의 세부 사항을 더 추상화하는 것을 목표로 한다. 5세대 프로그래밍 언어(5GL)는 프로그래머가 작성한 알고리즘을 사용하지 않고, 프로그램에 주어지는 제약을 사용하여 문제를 해결하는 언어이다.
2. 1. 초기 발전
최초의 컴퓨터는 종종 프로그래밍 언어의 도움 없이 프로그래밍되었는데, 이는 프로그램들을 기계어로 작성함으로써 이루어졌다. 십진이나 이진 형태의 프로그램들은 천공 카드나 자기 테이프로부터 읽거나 컴퓨터 프론트 패널의 스위치를 켜고 끔으로써 불러들였다. 절대적인 기계어는 나중에 1세대 프로그래밍 언어(1GL)로 명칭이 정해졌다.[90]다음 단계로 2세대 프로그래밍 언어(2GL), 곧 어셈블리어가 개발되었으며 여전히 특정 컴퓨터의 명령어 집합 구조와 밀접하게 관계되었다. 어셈블리어는 프로그램을 훨씬 더 인간이 읽기 쉽게 만들어주었을 뿐 아니라 주소 계산 시 따분하고 오류가 발생할 경향이 있는 프로그래머를 안심시켜 주었다.[90]
최초의 고급 프로그래밍 언어, 즉 3세대 프로그래밍 언어(3GL)는 1950년대에 작성되었다. 컴퓨터용으로 설계될 초기의 고급 프로그래밍 언어는 Plankalkül였으며, 콘라트 추제가 1943년부터 1945년까지 독일의 Z3용으로 개발했지만 1998년, 2000년까지 구현되지 않았다.[90]
4세대 프로그래밍 언어(4GL)는 3세대 프로그래밍 언어보다 내부 컴퓨터 하드웨어의 상세한 부분을 더 고급적으로 추상화시키는 것을 목적으로 한다. 5세대 프로그래밍 언어(5GL)는 프로그래머가 작성한 알고리즘을 이용하지 않고 프로그램에 주어지는 제약을 사용하여 문제를 해결하는 언어이다.[90]
1957년에 포트란(FORmula TRANslation)이 발명되었다. 종종 최초의 컴파일된 고급 프로그래밍 언어로 여겨지는 포트란은 21세기에도 계속 사용되고 있다.

2. 2. 1960년대 ~ 1970년대
1958년에 구현된 리습은 최초의 함수형 프로그래밍 언어였다. 포트란과 달리 재귀와 조건부 표현식을 지원했으며, 힙에 대한 동적 메모리 관리와 자동 가비지 컬렉션을 도입했다. 수십 년 동안 리습은 인공 지능 응용 프로그램을 지배했다.[64] 1978년, 또 다른 함수형 언어인 ML은 추론된 타입과 다형적 매개변수를 도입했다.ALGOL(ALGOrithmic Language)이 1958년과 1960년에 출시된 후, 알고리즘을 설명하기 위한 컴퓨팅 문헌의 표준이 되었다. 상업적 성공은 제한적이었지만, C, 파스칼, Ada, C++, 자바, C#를 포함한 대부분의 인기 있는 명령형 언어는 직접 또는 간접적으로 ALGOL 60에서 파생되었다. 후속 프로그래밍 언어에서 채택된 혁신에는 더 나은 이식성과 최초의 맥락 자유, BNF 문법의 사용이 포함되었다. 시뮬라는 객체 지향 프로그래밍( 하위 유형, 동적 디스패치, 상속 포함)을 지원하는 최초의 언어이며 상업적으로 성공했다. 또 다른 ALGOL 후손인 C는 21세기에도 지속적인 인기를 누리고 있다. C는 다른 동시대 언어보다 하위 수준의 기계 작업에 더 쉽게 접근할 수 있게 해준다. 유연한 포인터 연산으로 부분적으로 생성되는 C의 강력함과 효율성은 올바른 코드를 작성하기 어렵게 만드는 대가를 치른다.[67]
1972년에 설계된 프롤로그는 형식 논리 표기법을 사용하여 컴퓨터와 통신하는 최초의 논리 프로그래밍 언어였다. 논리 프로그래밍을 사용하면 프로그래머는 원하는 결과를 지정하고 인터프리터가 그것을 달성하는 방법을 결정하도록 허용한다.
이 시기에 개발된 주요 언어들은 다음과 같다.
언어 | 설명 |
---|---|
APL | 배열 프로그래밍을 도입한 언어. 함수형 프로그래밍에도 영향을 미쳤다.[66] |
PL/I (NPL) | FORTRAN과 COBOL의 장점을 결합하여 1960년대 초에 설계되었다. |
Simula | 세계 최초(1960년대)로 객체 지향 프로그래밍을 채택한 언어. |
C언어 | 1969년부터 1973년까지 시스템 프로그래밍 언어로 개발되었으며, 현재도 널리 사용되고 있다.[67] |
Prolog | 1972년에 설계된 논리 프로그래밍 언어. |
ML | 1978년에 개발된 언어로, LISP을 기반으로 한 정적 타입 함수형 언어의 선구자였다. |
1960년대와 1970년대는 구조적 프로그래밍에 대한 논쟁이 활발하게 이루어진 시기이기도 하다.[68] 이 논쟁에서 특히 유명한 것은 1968년 Communications of the ACM에 실린 에드거 다익스트라의 편지 "Go To Statement Considered Harmful"[69]일 것이다. 그 후 반론과 지침으로는 크누스의 "Structured Programming with go to Statements"가 있다.
또한, 프로그램의 메모리 사용량을 줄이고 프로그래머와 사용자의 생산성을 향상시키는 기법도 발전한 시기이다. 초기 4세대 언어(4GL)는 같은 프로그램을 3세대 프로그래밍 언어로 작성했을 때보다 소스 코드의 양을 극적으로 줄였다.
2. 3. 1980년대 ~ 2000년대
1980년대에는 개인용 컴퓨터가 발명되면서 프로그래밍 언어의 용도가 크게 변화했다. 새롭게 등장한 C++는 C의 상위 집합으로 C 프로그램을 컴파일할 수 있을 뿐만 아니라 클래스와 상속을 지원했다.[70] Ada를 비롯한 다른 새로운 언어들은 동시성을 지원했다. 일본 정부는 논리 프로그래밍 구조에 동시성을 지원하는 소위 5세대 언어에 많은 투자를 했지만, 이러한 언어들은 다른 동시성 지원 언어들에 비해 성능이 떨어졌다.1990년대에는 인터넷과 월드 와이드 웹이 급속하게 성장하면서 웹 페이지와 네트워킹을 지원하는 새로운 프로그래밍 언어들이 등장했다. C++를 기반으로 시스템 간의 이식성과 보안성을 높이기 위해 설계된 자바는 이러한 기능이 많은 인터넷 애플리케이션에 필수적이었기 때문에 크게 성공했다.[70] 동적 타입의 스크립팅 언어인 파이썬, 자바스크립트, PHP, 루비도 개발되었다. 이러한 언어들은 기존의 애플리케이션을 조정하는 작은 프로그램을 빠르게 생성하도록 설계되었으며, HTML과의 통합으로 서버에 호스팅되는 웹 페이지를 구축하는 데에도 사용되었다.
2000년대에는 널리 보급된 새로운 프로그래밍 언어의 개발이 둔화되었다. 한 가지 혁신은 네트워크로 연결된 구성 요소를 가진 분산 시스템을 활용하도록 설계된 서비스 지향 프로그래밍이었다. 서비스는 객체 지향 프로그래밍의 객체와 유사하지만 별도의 프로세스에서 실행된다. C#과 F#은 명령형 프로그래밍과 함수형 프로그래밍 간의 아이디어를 상호 교환하였다.
2. 4. 2000년대 이후
2000년대에는 널리 보급된 새로운 프로그래밍 언어의 개발이 둔화되었다. 한 가지 혁신은 네트워크로 연결된 구성 요소를 가진 분산 시스템을 활용하도록 설계된 서비스 지향 프로그래밍이었다. 서비스는 객체 지향 프로그래밍의 객체와 유사하지만 별도의 프로세스에서 실행된다. C#과 F#은 명령형 프로그래밍과 함수형 프로그래밍 간의 아이디어를 상호 교환하였다. 2010년 이후 러스트, 고, 스위프트, 지그, 카본 등 여러 가지 새로운 언어들이 C가 역사적으로 사용되어 온 성능이 중요한 소프트웨어를 위해 경쟁하였다. 대부분의 새로운 프로그래밍 언어는 정적 타이핑을 사용하지만, 링이나 줄리아와 같이 동적 타이핑을 사용하는 새로운 언어도 소수 존재한다.[12][13]일부 새로운 프로그래밍 언어는 스크래치, LabVIEW, PWCT와 같이 시각적 프로그래밍 언어로 분류된다. 또한, 발레리나와 같이 텍스트 기반과 시각적 프로그래밍을 혼합하여 사용하는 언어도 있다.[14][15][16][17] 이러한 추세는 구글의 블록리와 같이 새로운 시각적 프로그래밍 언어 개발을 돕는 프로젝트 개발로 이어졌다.[18] 언리얼이나 유니티와 같은 많은 게임 엔진도 시각적 스크립팅을 지원하기 시작했다.[19][20]
2. 5. A언어부터 C언어까지
C언어의 C는 프로그래밍 언어의 역사와 관련이 있다. 통상 A언어부터 B언어, C언어 순으로 발전해 왔다고 알려져 있다.- A언어: 과거에는 ALGOL (Algorithm Language의 약자로, 알고리즘 연구개발을 위해 만들어졌다)을 의미했다. 현재는 구조화된 프로그래밍 언어를 지칭하는 용어로 사용된다.
- B언어: 켄 톰슨이 유닉스 운영 체제를 고급언어로 만들기 위해 마틴 리차드의 BCPL을 바탕으로 만든 언어이다. 이 언어는 자료형이 없었다.
- C언어: 데니스 리치가 1972년에 B언어에 데이터 유형 개념을 추가하여 만든 언어이다. 이후 유닉스의 구현 언어로 C언어가 채택되면서 1973년에 C언어로 구현된 유닉스가 만들어졌다.
3. 정의
프로그래밍 언어는 자연어와 다르게, 인간이 기계에 명령을 전달하기 위해 설계된 인공 언어이다. 프로그래밍 언어는 컴퓨터에게 특정 계산[84]이나 알고리즘을 실행하도록 지시하고, 프린터나 로봇[85] 같은 외부 장치를 제어할 수도 있다.
''컴퓨터 언어''라는 용어는 때때로 "프로그래밍 언어"와 같은 의미로 사용되기도 한다.[2] 그러나 이 용어의 사용은 사람마다 다를 수 있다.
어떤 경우에는 프로그래밍 언어를 컴퓨터 언어의 하위 집합으로 보기도 한다.[3] 예를 들어 마크업 언어는 컴퓨팅에 사용되지만 프로그래밍 언어로 간주되지 않는 경우가 있다.[4][5][6] 튜링 완전한 언어만을 프로그래밍 언어로 좁게 정의하는 경우도 있다.[1][7] 대부분의 실용적인 프로그래밍 언어는 튜링 완전하며,[8] 계산 가능한 프로그램 측면에서 동등하다.
다른 관점에서는 프로그래밍 언어를 추상 기계를 프로그래밍하기 위한 이론적 구성으로 보고, 컴퓨터 언어를 유한한 하드웨어 자원을 가진 물리적 컴퓨터에서 실행되는 프로그래밍 언어의 하위 집합으로 간주하기도 한다.[9] 존 C. 레놀즈는 형식 명세 언어도 실행을 위한 언어만큼 프로그래밍 언어라고 강조한다.[10]
프로그래밍 언어는 다른 대부분의 인간 표현 방식과 달리 더 높은 수준의 정확성과 완전성을 요구한다. 자연어에서는 모호하거나 작은 실수가 있어도 의사소통이 가능하지만, 컴퓨터는 지시받은 대로만 정확하게 수행하며 프로그래머가 의도한 바를 이해할 수 없다. 언어 정의, 프로그램, 입력의 조합은 프로그램 실행 시 발생하는 외부 동작을 완전히 지정해야 한다.
프로그래밍 언어는 데이터와 그 데이터에 대해 자동으로 수행될 수 있는 연산 또는 변환을 정의하는 구조적 메커니즘을 제공한다. 프로그래머는 언어에 있는 추상화를 사용하여 계산에 포함된 개념을 나타낸다. 이러한 개념은 사용 가능한 가장 단순한 요소(기본 요소라고 함)의 집합으로 표현된다.[41] ''프로그래밍''은 프로그래머가 이러한 기본 요소들을 결합하여 새로운 프로그램을 구성하거나 기존 프로그램을 새로운 용도나 변화하는 환경에 적응시키는 과정이다.
프로그래밍 언어는 정보를 구성하고 처리하는 작업에 대한 이해를 용이하게 하고, 알고리즘을 정확하게 표현할 수 있게 한다. 특히, 튜링 완전인 것이 특징이다.[51]
프로그래밍 언어는 '''구문 규칙'''(자연어에 관한 언어학에서 말하는 통사론 규칙과 유사)과 '''의미 규칙'''(자연어의 의미론과 유사한 규칙)으로 정의된다.
4. 구조
컴퓨터 프로그램은 데이터와 명령어로 구성된다. 프로그래밍 언어는 데이터를 유용한 형태로 정리하고, 데이터에 대한 연산을 정의한다.
프로그래밍 언어는 바이트 형식으로 저장되는 데이터를 유용한 형태로 정리한다. 사용자는 필요에 따라 데이터를 다음과 같이 선언할 수 있다.
```c
int MyData; // 정수형 데이터
```
이는 컴퓨터 메모리의 한 영역을 'MyData'라는 이름의 정수 타입으로 저장하며, 저장 위치는 컴파일러가 결정한다. 'MyData'는 간단한 변수이며, 한 개의 정수만 담을 수 있다. 여러 개의 변수를 만들고 싶으면 배열을 사용할 수 있다.
```c
int MyArray[100]; // 100개의 정수형 변수 선언
```
소프트웨어 공학의 발달로 더 복잡한 자료형이 필요해졌다. 예를 들어, 사각형을 정의하려면 너비, 높이, 색과 같은 여러 정보가 동시에 필요하다. 고급 언어는 이러한 정보들을 묶어 새로운 자료형을 만들 수 있도록 지원한다.
```c
struct rectangle {
int width; // 사각형의 너비를 픽셀 단위로 저장
int height; // 사각형의 높이를 픽셀 단위로 저장
color_type color; // 사각형의 색 정보를 저장
};
```
이러한 데이터들을 활용하기 위해 컴퓨터에 지시를 내려야 한다. 컴퓨터 언어는 하드웨어를 직접 제어하는 어셈블리 언어에서 C 언어와 같은 고급 언어로 발전하여, 인간의 언어에 가까운 형태로 학습과 구현이 쉬워졌다.
프로그래머가 고급 언어로 작성한 지시문은 컴파일러에 의해 기계어로 번역된다. 이러한 지시문들을 묶어 놓은 것을 함수라고 하며, 특정 동작을 정의하는 명령어의 집합이다. 함수는 동일한 동작이 필요할 때 매개변수를 이용하여 재사용할 수 있다.
C 언어는 검색, 정렬, 입출력에 관련된 다양한 표준 함수를 제공하여 사용자의 노력을 절약해 준다. 연결된 함수들을 묶은 것을 모듈이라 하고, 모듈들의 상호 연결로 프로그램이 구성된다. 이러한 모듈들을 재사용할 수 있게 모아둔 것을 라이브러리라 한다.
모든 프로그래밍 언어는 데이터를 설명하고, 데이터에 적용되는 연산 또는 변환을 설명하기 위한 기본 요소들을 포함하며, 이는 구문적 및 의미적 규칙에 의해 제어된다.
5. 분류
프로그래밍 언어는 다양한 기준으로 분류할 수 있다. 크게 명령형, 함수형, 논리형, 객체 지향의 네 가지 범주로 나눌 수 있다.
- 명령형 언어: 지정된 순서대로 알고리즘을 구현하도록 설계되었다. .NET과 같은 시각적 프로그래밍 언어를 포함한다. 스크립팅 언어는 부분적으로 또는 완전히 인터프리터 방식으로 해석되기 때문에 컴파일러 방식과 대비되기도 한다.
- 함수형 언어: 주어진 매개변수에 함수를 연속적으로 적용하여 작동한다. 단순성과 우아함 때문에 일부 연구자들이 높이 평가하지만, 효율성 문제로 널리 채택되지는 못했다.
- 논리형 언어: 프로그래머가 아닌 소프트웨어가 명령을 실행하는 순서를 결정하도록 설계되었다.
- 객체 지향 언어: 데이터 추상화, 상속, 동적 디스패치가 특징이며, 대부분의 인기 있는 명령형 언어와 일부 함수형 언어에서 지원된다.
마크업 언어는 프로그래밍 언어가 아니지만, 제한적인 프로그래밍을 지원하는 확장 기능을 갖춘 언어도 있다. 또한 다른 프로그래밍 언어와 쉽게 비교할 수 없는 특수 목적 언어도 있다.
프로그래밍 언어는 분류 방법이 다양하며, 각 언어는 여러 범주로 분류될 수 있다. 예를 들어, 어셈블리어는 "저수준 언어", "비객체 지향 언어"로, 자바(Java)는 "고수준 언어", "객체 지향 언어", "병렬 처리 언어"로, 파이썬(Python)은 "객체 지향 언어", "스크립트 언어"로, 리스프(LISP)는 "멀티 패러다임 언어", "함수형 프로그래밍 언어", "절차적 언어"로 분류할 수 있다.
5. 1. 저수준 언어와 고수준 언어
저수준 언어는 기계 중심의 언어로, 기계어와 어셈블리어가 대표적이다.[55][56] 기계어는 컴퓨터가 직접 이해하고 실행할 수 있는 2진수 또는 16진수 형태의 명령어 집합이다. 어셈블리어는 기계어의 명령어들을 사람이 좀 더 읽기 쉬운 기호(symbol) 형태로 표현한 것으로, 기계어와 1:1 대응된다.고수준 언어는 인간 중심의 언어로, 사람이 이해하기 쉬운 형태로 작성된다. C, 자바, 파이썬 등이 대표적인 고수준 언어이다. 고수준 언어는 컴퓨터 하드웨어의 세부 사항을 추상화하여 프로그래머가 좀 더 쉽게 프로그램을 작성할 수 있도록 돕는다.
하지만 C 언어는 메모리 관리를 직접 해야 하는 특징 때문에 현대에는 저수준 언어로 분류되기도 한다.
5. 2. 인터프리터 방식 언어와 컴파일러 방식 언어
인터프리터 방식 언어의 예로는 PHP, 루비를 들 수 있다. 컴파일러 방식 언어의 예로는 C언어, C++, 얼랭, 하스켈, 러스트, 고, 포트란, 코볼 등을 들 수 있다. 언어에 따라서는 인터프리터 방식으로 실행할 수도 있고, 컴파일 방식으로 실행할 수도 있는 경우도 있다. 그리고 “일단 어느 방식으로든 실행할 수 있지만, 기본은 컴파일 방식”과 같은 경우도 있으므로, 분류가 다소 모호해지는 경우가 있다. 컴파일 방식으로만 실행할 수 있는 언어를 특별히 지칭해야 할 경우에 “순수 컴파일 방식 언어(/pure compiled language)” 등으로 분류하는 사람도 있다.[57]자바는 바이트코드로 컴파일한 후 실행하므로, 일단 “컴파일 방식”으로 분류하는 것도 가능하다. 하지만 자바는 런타임 컴파일러(JIT)와 자바 가상 머신을 사용하므로, 종종 “컴파일 방식과 인터프리터 방식의 중간적인 방식”이라고 지적되며, 모호한 위치에 있다.
5. 3. 기타 분류법
- '''절차적 언어''' / '''비절차적 언어'''
: 절차적 언어의 대표적인 예로는 포트란, 알골, C언어, 코볼, 베이직, 파스칼 등이 있다.
- '''객체 지향 언어''' / '''비객체 지향 언어'''
- '''구조적 프로그래밍 언어''' / '''비구조적 프로그래밍 언어'''
- '''병렬 언어''' / '''비병렬 언어'''
: 스레드를 동시에 여러 개 생성 및 관리할 수 있는 언어를 병렬 언어(또는 병렬성 언어), 그렇지 않은 언어를 비병렬 언어(또는 비병렬성 언어)라고 한다.
- '''범용 프로그래밍 언어''' / '''사무 계산용 프로그래밍 언어''' / '''과학 기술 계산용 프로그래밍 언어'''
: 범용 프로그래밍 언어의 대표적인 예로는 자바, C#, 파이썬[58], 비주얼 베이직, 루비 등이 있다.
6. 요소
모든 프로그래밍 언어는 데이터를 설명하고, 두 수를 더하거나 컬렉션에서 항목을 선택하는 것과 같은 데이터에 적용되는 연산 또는 변환을 설명하기 위한 기본 요소들을 포함한다. 이러한 요소들은 각각 구조와 의미를 정의하는 구문적 및 의미론적 규칙에 의해 제어된다.
프로그래밍 언어의 주요 요소는 다음과 같다.
- '''구문''': 프로그래밍 언어의 표면 형태로, 대부분 자연어처럼 단어, 숫자 및 구두점을 포함하는 텍스트 기반이다.
- '''의미론''': 언어가 나타내는 바를 정의하며, 구문이 아닌 의미를 가리킨다. 정적 의미론과 동적 의미론으로 나뉜다.
- '''형 시스템''': 형 이론에 기반하여 데이터 형식을 분류하고 어떻게 다룰지를 나타낸다.
- '''동시성''': 명령어 수준 및 하위 프로그램 수준의 동시성을 지원한다.
- '''예외 처리''': 런타임 오류에 의해 실행되는 코드 부분인 예외 처리기를 포함한다.
6. 1. 구문
프로그래밍 언어의 표면 형태는 구문이라고 한다. 대부분의 프로그래밍 언어는 순수하게 텍스트 기반이며, 자연어처럼 단어, 숫자 및 구두점을 포함하는 텍스트 시퀀스를 사용한다. 반면, 시각적인 프로그래밍 언어도 존재하며, 이들은 기호 간의 시각적 관계를 사용하여 프로그램을 지정한다.언어의 구문은 구문적으로 올바른 프로그램을 형성하는 기호의 가능한 조합을 설명한다. 기호 조합에 부여된 의미는 의미론(형식적이거나 형식적 또는 참조 구현에 하드코딩됨)에 의해 처리된다. 대부분의 언어가 텍스트 기반이므로, 이 문서에서는 텍스트 구문에 대해 설명한다.
프로그래밍 언어 구문은 일반적으로 정규 표현식(어휘 구조용)과 백커스-나우어 형식(문법적 구조용)을 결합하여 정의된다.
리스프를 기반으로 한 간단한 문법의 예시는 다음과 같다.
expression ::= atom | list
atom ::= number | symbol
number ::= [+-]?['0'-'9']+
symbol ::= ['A'-'Z''a'-'z'].*
list ::= '(' expression* ')'
이 문법은 다음을 정의한다.
- ''표현식''은 ''원자'' 또는 ''목록''이다.
- ''원자''는 ''숫자'' 또는 ''기호''이다.
- ''숫자''는 하나 이상의 10진수 자릿수로 이루어진 연속된 시퀀스이며, 선택적으로 플러스 또는 마이너스 부호가 앞에 붙을 수 있다.
- ''기호''는 문자 뒤에 영(0)개 이상의 알파벳 문자(공백 제외)가 오는 것이다.
- ''목록''은 괄호의 일치하는 쌍이며, 그 안에 영(0)개 이상의 ''표현식''이 있다.
이 문법에서 올바르게 형성된 토큰 시퀀스의 예로는
12345
, ()
, (a b c232 (1))
등이 있다.구문적으로 올바른 모든 프로그램이 의미적으로 올바른 것은 아니다.[72][73] 많은 구문적으로 올바른 프로그램은 언어의 규칙에 따라 잘못 형성되었을 수 있으며, 번역 또는 실행 시 오류를 발생시킬 수 있다. 어떤 경우에는 이러한 프로그램이 정의되지 않은 동작을 보일 수도 있다. 프로그램이 언어 내에서 잘 정의되어 있더라도, 작성자가 의도하지 않은 의미를 가질 수 있다.
자연어를 예로 들면, 문법적으로 올바른 문장에 의미를 할당할 수 없거나 문장이 거짓일 수 있다.
- "무색의 녹색 생각들은 격렬하게 잠든다."는 문법적으로 잘 형성되었지만 일반적으로 받아들여지는 의미가 없다.
- "John은 기혼 독신남입니다."는 문법적으로 잘 형성되었지만 참일 수 없는 의미를 나타낸다.
프로그래밍 언어를 지정하는 데 필요한 문법은 촘스키 계층에서의 위치에 따라 분류할 수 있다. 대부분의 프로그래밍 언어의 구문은 2형 문법, 즉 맥락 자유 문법을 사용하여 지정할 수 있다.[21]
6. 2. 의미론
의미론이라는 용어는 언어의 형태(구문)가 아닌 의미를 가리킨다. 프로그래밍 언어의 의미론은 해당 언어가 나타내는 바를 정의한다.프로그래밍 언어의 의미론은 크게 정적 의미론과 동적 의미론으로 나뉜다. 정적 의미론은 컴파일 시점에 확인할 수 있는 의미 규칙을 정의한다. 예를 들어, 변수의 타입 검사 등이 이에 해당한다.
동적 의미론은 프로그램의 실행 동작을 정의한다. 예를 들어 "`a + b`라는 식의 값은 a의 값과 b의 값을 더한 값이다"와 같은 규칙들의 집합이 동적 의미론에 해당한다. 식의 평가 전략(선행 평가, 부분 평가, 지연 평가, 단락 평가 등)이나 제어 구조에서의 조건부 실행 방법 또한 동적 의미론의 일부이다.
프로그램 의미론이라는 분야에서 형식적인 의미론(형식 의미론, formal semantics|포멀 시맨틱스영어)도 연구되고 있지만, C 언어의 표준 규격 등 자연어로 의미를 부여하고 있는 언어나 형식적이지 않은 의사 언어와 같은 것으로 의미를 부여하고 있는 언어도 있다.
6. 3. 형 시스템
자료형은 허용되는 값들의 집합과 그 값들에 대해 수행될 수 있는 연산들을 정의한다.[26] 각 프로그래밍 언어의 타입 시스템은 어떤 자료형들이 존재하는지, 표현식의 자료형은 무엇인지, 그리고 타입 동치와 타입 호환성이 언어에서 어떻게 작동하는지를 정의한다.[24]타입 이론에 따르면, 모든 연산의 명세가 해당 연산이 적용될 수 있는 데이터의 타입을 정의하는 경우 언어는 완전 타입화되었다고 한다.[26] 반대로, 대부분의 어셈블리어와 같이 비타입화된 언어는 어떤 연산이든 어떤 데이터(일반적으로 다양한 길이의 비트 시퀀스)에도 수행될 수 있도록 허용한다.[26]
정수와 부동소수점수와 같이 서로 다른 타입은 값을 다르게 나타내기 때문에, 다른 타입이 필요한 경우에 하나의 타입을 사용하면 예상치 못한 결과가 발생한다. 타입 검사는 이러한 오류를 일반적으로 컴파일 시점에(런타임 타입 검사는 더 비용이 많이 든다) 플래그로 표시한다.[24]
형 시스템은 프로그래밍 언어에서 식의 값이 되는 데이터 형식을 형 이론에 기반하여 분류하고 어떻게 다룰지를 나타내는 것이다. 내부적으로 디지털 컴퓨터에서 모든 데이터는 바이너리(이진법)로 저장된다.
형 시스템을 통해 각 값의 데이터 유형에 따라 정의되지 않은 연산이 실행되지 않도록 검사하는 메커니즘을 갖춘 언어를 정적 형 언어라고 한다.[74] 예를 들어, `"this text between the quotes"`는 문자열 형식의 값인데, 일반적으로 숫자를 문자열로 나누는 연산은 의미가 없으므로 그러한 프로그램은 거부된다. 언어에 따라 컴파일 시에 검출하여 (정적 형 검사) 컴파일 오류를 발생시키거나, 실행 시에 검출하여 (동적 형 검사) 예외를 발생시키거나 어떤 형 변환을 수행하는 경우도 있다.
정적 타이핑에서는 모든 표현식의 자료형이 프로그램 실행 전, 일반적으로 컴파일 시에 결정된다.[26] C++이나 자바와 같은 주요 정적 타입 지정 언어에서는 자료형을 명시한다. Haskell이나 ML같은 경우에는 자료형 추론을 수행한다.[76]
동적 타입 지정에서는 자료형의 안전성이 실행 시에 검사된다. 다시 말해, 자료형은 소스 상의 식이 아니라 실행 시의 값에 부여된다.[74] 하나의 변수가 프로그램 실행 중에 서로 다른 자료형의 값을 저장할 수도 있다. 하지만 코드를 실제로 실행해 보기 전까지는 자료형의 오류를 자동으로 탐지할 수 없어 디버깅이 다소 어렵다. 동적 타입 지정 언어로는 루비, 리스프, 자바스크립트, 파이썬 등이 있다.[77]
강 타입을 사용하면 변수가 명시적으로 캐스팅되지 않는 한 타입 오류를 항상 감지할 수 있다. 약 타입은 언어가 암시적 캐스팅을 허용하는 경우 발생한다. 예를 들어, 프로그래머가 명시적인 타입 변환을 하지 않고도 서로 다른 타입의 변수 간에 연산을 수행할 수 있도록 하는 경우이다. 이러한 타입 변환이 허용되는 경우가 많을수록 감지할 수 있는 타입 오류가 줄어든다.[24]
6. 4. 동시성
컴퓨팅에서 여러 명령어를 동시에 실행할 수 있다. 많은 프로그래밍 언어는 명령어 수준 및 하위 프로그램 수준의 동시성을 지원한다.[25] 21세기에 들어서면서 컴퓨터의 추가적인 처리 능력은 더 많은 프로세서를 사용하는 것에서 나오게 되었는데, 이는 프로그래머가 향상된 성능을 달성하기 위해 여러 프로세서를 동시에 사용하는 소프트웨어를 설계해야 함을 의미한다.[25] 인터프리터 언어인 파이썬과 루비는 여러 프로세서의 동시 사용을 지원하지 않는다.[25] 다른 프로그래밍 언어는 세마포어를 사용하여 주요 명령어의 실행 순서를 제어하거나, 모니터를 통해 공유 데이터에 대한 접근을 제어하거나, 스레드 간 메시지 전달을 가능하게 함으로써 서로 다른 스레드 간에 공유되는 데이터를 관리하는 것을 지원한다.[25]6. 5. 예외 처리
많은 프로그래밍 언어는 런타임 오류에 의해 실행되는 코드 부분인 예외 처리기를 포함하고 있다. 예외 처리기는 크게 두 가지 방식으로 오류를 처리할 수 있다.[1]- 종료: 프로그램을 종료하고 제어권을 운영 체제에 넘긴다. 이 방법은 가장 간단한 방법으로 간주된다.
- 재개: 예외가 발생한 지점 근처에서 프로그램을 재개한다. 예외 처리기가 예외의 재발을 방지하기 위해 값을 수정하지 않는 한, 예외가 다시 발생할 수 있다.
일부 프로그래밍 언어는 코드에 도달하기 전에 예외가 발생하든 발생하지 않든 관계없이 실행될 코드 블록을 지정하는 것을 지원한다. 이것을 종료 처리(finalization)라고 한다.[2]
예외 처리 능력의 향상과 성능 저하 사이에는 상충 관계가 있다.[3] 예를 들어, 배열 인덱스 오류는 흔하지만,[4] C 언어는 성능상의 이유로 이를 확인하지 않는다.[5] 프로그래머는 사용자 정의 예외를 처리하는 코드를 작성할 수 있지만, 이는 프로그램을 복잡하게 만들 수 있다. C와 같은 일부 언어의 표준 라이브러리는 반환 값을 사용하여 예외를 나타낸다.[6] 일부 언어와 컴파일러는 임시 또는 영구적으로 오류 처리 기능을 켜고 끌 수 있는 옵션을 제공한다.[7]
7. 설계 및 구현
프로그래밍 언어 설계에 가장 큰 영향을 미친 요소 중 하나는 컴퓨터 아키텍처이다. 가장 일반적으로 사용되는 유형인 명령형 언어는 가장 일반적인 컴퓨터 아키텍처인 폰 노이만 아키텍처에서 효율적으로 작동하도록 설계되었다.[1] 폰 노이만 아키텍처에서는 메모리가 데이터와 명령어를 모두 저장하며, 데이터에 대한 명령어를 실행하는 CPU는 별도로 존재하고, 데이터는 CPU와 주고받아야 한다. 이러한 언어의 핵심 요소는 변수, 대입, 그리고 이러한 기계에서 재귀보다 효율적인 반복이다.[2]
많은 프로그래밍 언어가 처음부터 설계되거나, 새로운 요구 사항을 충족하도록 변경되거나, 다른 언어와 결합되었다. 많은 언어는 결국 사용되지 않게 되었다. 1950년대 프로그래밍 언어의 탄생은 모든 기계와 용도에 적합한 범용 프로그래밍 언어를 만들고, 다른 컴퓨터를 위해 코드를 작성할 필요성을 피하려는 열망에 의해 자극되었다.[3] 1960년대 초에는 코드가 작성된 다양한 목적의 상이한 요구 사항으로 인해 범용 언어의 개념이 거부되었다.[4]
프로그래밍 언어의 바람직한 특성에는 가독성, 작성 용이성, 그리고 신뢰성이 포함된다.[5] 이러한 특징들은 프로그래머의 언어 숙련 교육 비용, 언어를 사용하여 프로그램을 작성하고 유지 보수하는 데 필요한 시간, 코드 컴파일 비용을 줄이고 런타임 성능을 향상시킬 수 있다.[6]
- 초기 프로그래밍 언어는 종종 가독성보다 효율성을 우선시했지만, 1970년대 이후 가독성의 중요성이 커졌다. 같은 결과를 얻기 위해 여러 연산을 사용하는 것은 연산자 오버로딩처럼 가독성에 해로울 수 있으며, 같은 연산자가 여러 의미를 가질 수 있기 때문이다.[7] 가독성에 중요한 또 다른 특징은 직교성으로, 프로그래머가 배워야 할 구성 요소의 수를 제한하는 것이다.[8] 쉽게 이해할 수 있는 구문 구조와 즉시 알 수 있는 특수어도 가독성을 높인다.[9]
- 작성 용이성은 원하는 문제를 해결하기 위한 코드 작성의 용이성을 의미한다. 가독성에 필수적인 것과 같은 특징과 함께,[10] 추상화—클라이언트로부터 세부 정보를 숨기는 인터페이스—및 표현력—보다 간결한 프로그램을 가능하게 함—은 프로그래머가 코드를 작성하는 데 추가적으로 도움이 된다.[11] 초기 프로그래밍 언어는 컴퓨터의 기본 하드웨어와 매우 밀접하게 연결되었지만, 시간이 지남에 따라 추상화에 대한 지원이 증가하여 프로그래머는 기본 하드웨어 명령어로의 단순한 변환과는 거리가 먼 아이디어를 표현할 수 있게 되었다. 프로그래머가 컴퓨터의 복잡성에 덜 구애받기 때문에, 그들의 프로그램은 프로그래머의 노력을 덜 들이고 더 많은 컴퓨팅을 수행할 수 있다.[28] 대부분의 프로그래밍 언어에는 일반적으로 사용되는 함수의 표준 라이브러리가 함께 제공된다.[29]
- 신뢰성이란 프로그램이 광범위한 상황에서 지정된 대로 수행되는 것을 의미한다.[12] 형식 검사, 예외 처리, 그리고 제한된 별칭(메모리의 동일한 영역에 액세스하는 여러 변수 이름)은 모두 프로그램의 신뢰성을 향상시킬 수 있다.[13]
프로그래밍 언어 설계는 종종 트레이드오프를 수반한다.[14] 예를 들어, 신뢰성을 향상시키는 기능은 일반적으로 성능 저하를 초래한다.[15] 많은 수의 연산자로 인한 표현력 향상은 코드 작성을 쉽게 하지만 가독성 저하를 초래한다.[16]
자연어 프로그래밍은 프로그래밍을 위한 특수 언어의 필요성을 없애는 방법으로 제안되었다. 그러나 이 목표는 여전히 멀고 그 이점은 논쟁의 여지가 있다. 에츠허르 데이크스트라는 의미 없는 구성 요소의 도입을 방지하기 위해 형식 언어의 사용이 필수적이라는 입장을 취했다. 앨런 펄리스도 이 아이디어에 대해 비슷하게 무관심했다.
프로그래밍 언어의 명세는 언어 사용자인 프로그래머와 구현자가 소스 코드가 해당 언어의 유효한 프로그램인지 여부와 그렇다면 그 동작이 무엇인지에 대해 합의하는 데 사용할 수 있는 산출물이다.
프로그래밍 언어 명세는 다음을 포함한 여러 형태를 취할 수 있다.
- 언어의 구문, 정적 의미론 및 실행 의미론에 대한 명시적 정의. 구문은 일반적으로 형식 문법을 사용하여 지정되지만, 의미론적 정의는 자연어(예: C 언어) 또는 형식 의미론(예: Standard ML[32] 및 Scheme[33] 명세)으로 작성될 수 있다.
- 언어에 대한 번역기의 동작에 대한 설명(예: C++ 및 포트란 명세). 언어의 구문과 의미론은 자연어 또는 형식 언어로 작성될 수 있는 이 설명에서 추론해야 한다.
- 참조 또는 모델 구현은 때때로 명세되는 언어로 작성됨(예: 프롤로그 또는 ANSI REXX[34]). 언어의 구문과 의미론은 참조 구현의 동작에 명시적으로 나타난다.
프로그래밍 언어의 구현은 프로그램을 하드웨어가 실행할 수 있는 기계어로 변환하는 과정이다. 기계어는 운영 체제의 도움을 받아 실행될 수 있다.[17] 제품 코드에서 가장 일반적인 해석 방식은 컴파일러를 사용하는 것으로, 컴파일러는 소스 코드를 중간 수준 언어를 통해 실행 파일로 알려진 기계어로 변환한다. 프로그램이 컴파일되면 다른 구현 방법보다 더 빠르게 실행된다.[18] 일부 컴파일러는 실행 파일이 실행될 때 메모리 또는 계산 사용량을 줄이기 위해 추가적인 최적화를 제공할 수 있지만, 컴파일 시간이 증가한다.[19]
또 다른 구현 방법은 인터프리터를 사용하여 프로그램을 실행하는 것이다. 인터프리터는 소프트웨어의 각 줄을 실행 직전에 기계어로 변환한다. 디버깅을 더 쉽게 만들 수 있지만, 인터프리터의 단점은 컴파일된 실행 파일보다 10배에서 100배 느리게 실행된다는 것이다.[20] 하이브리드 해석 방법은 부분 컴파일을 통해 컴파일의 이점과 해석의 이점을 모두 제공한다. 이것의 한 형태는 JIT 컴파일로, 소프트웨어는 미리 중간 언어로 컴파일되고 실행 직전에 기계어로 컴파일된다.[21]
컴퓨터 프로그래밍 언어의 설계는 "언어 명세"로 나타내고, 구현은 "언어 처리 시스템"이라고 부른다.
구문 규칙은 일반적으로 BNF(Backus-Naur Form) 등을 사용하여 형식적으로 나타낸다. 의미론의 명세는 자연어로 기술되는 경우가 많지만, 형식적으로 주어지는 언어도 있다. 형식 의미론(프로그램 의미론 문서 참조)에서 의미론을 기술한 예로 Standard ML[78]과 Scheme[79]이 있다.
다음과 같은 방식으로 사양이 주어지는 언어도 있다.
- 해당 언어의 처리계 구현 참조 또는 모델 구현으로 제시
- 해당 언어의 컴파일러(FORTRAN)
- 해당 언어의 인터프리터(Ruby(cruby), 단 Ruby 표준화 이전의 경우)
- 대상 언어 자체로 작성되는 경우(예: LISP, 프롤로그, ANSI REXX[80]) 메타 순환 평가기 참조.
프로그래밍 언어의 구현은 프로그래밍 언어 처리계라고 불린다. 컴파일러는 소스 코드 등의 입력을 중간 표현 등, 더 해석 및 실행하기 쉬운 표현으로 변환하는 처리계이다. 또한, 인터프리터는 입력된 프로그램을 해석 및 실행하는 처리계이다(하드웨어의 프로세서는 기계어를 해석 및 실행하는 인터프리터라고 볼 수 있다).
컴파일러와 인터프리터의 관계는 이론적으로 이무라 사영에 의해 공식화되어 있다.
일반적으로 기계어로 변환한 것(실행 파일)을 하드웨어로 직접 실행하는 것이 인터프리터로 실행하는 것보다 훨씬 빠르다. 인터프리터에서의 실행을 개선하는 기법으로 실행 시 컴파일러 등의 동적 컴파일 기법이 있다.
8. 주요 프로그래밍 언어의 목록
9. 독점 언어
대부분의 널리 사용되는 프로그래밍 언어는 완전히 공개된 사양과 구현을 가지고 있지만, 많은 프로그래밍 언어는 단일 공급업체에서만 구현을 제공하는 독점 프로그래밍 언어로만 존재하며, 해당 공급업체는 그러한 독점 언어가 자사의 지적 재산이라고 주장할 수 있다. 독점 프로그래밍 언어는 일반적으로 도메인 특화 언어 또는 단일 제품을 위한 내부 스크립팅 언어이다. 일부 독점 언어는 공급업체 내부에서만 사용되는 반면, 다른 언어는 외부 사용자에게도 제공된다.
일부 프로그래밍 언어는 독점적이고 공개적인 경계에 존재한다. 예를 들어, 오라클은 자바 프로그래밍 언어의 일부 측면에 대한 독점적 권리를 주장하며,[35] 마이크로소프트의 C# 프로그래밍 언어는 시스템의 대부분에 대한 공개 구현을 가지고 있지만, 공용 언어 런타임(CLR)은 폐쇄된 환경이다.[36]
많은 독점 언어는 독점적인 특성에도 불구하고 널리 사용된다. MATLAB, VBScript, 울프람 언어가 그 예시이다. 일부 언어는 폐쇄형에서 공개형으로 전환될 수 있다. 예를 들어, 얼랭은 원래 에릭슨의 내부 프로그래밍 언어였다.[37]
10. 사용
수천 가지의 다양한 프로그래밍 언어가 주로 컴퓨팅 분야에서 만들어졌습니다.[39] 개별 소프트웨어 프로젝트는 일반적으로 5개 이상의 프로그래밍 언어를 사용합니다.[40]
어떤 프로그래밍 언어가 가장 널리 사용되는지를 판단하기는 어렵습니다. 사용량의 정의가 맥락에 따라 다르기 때문입니다. 한 언어는 프로그래머 작업 시간의 대부분을 차지할 수도 있고, 다른 언어는 더 많은 코드 라인을 가질 수도 있으며, 또 다른 언어는 가장 많은 CPU 시간을 소모할 수도 있습니다. 특정 종류의 애플리케이션에 매우 인기 있는 언어도 있습니다. 예를 들어, COBOL은 여전히 기업 데이터 센터, 특히 대형 메인프레임에서 강세를 보이고 있습니다.[43][44] 포트란은 과학 및 공학 애플리케이션에서, Ada는 항공 우주, 운송, 군사, 실시간 및 임베디드 애플리케이션에서, 그리고 C는 임베디드 애플리케이션과 운영 체제에서 사용됩니다. 다른 언어들은 다양한 종류의 애플리케이션을 작성하는 데 정기적으로 사용됩니다.
언어의 인기를 측정하는 다양한 방법이 제안되었지만, 각 방법은 측정 대상에 따라 다른 편향을 가지고 있습니다.
- 해당 언어를 언급하는 채용 광고 수를 세는 것[45]
- 해당 언어를 가르치거나 설명하는 책의 판매량[46]
- 해당 언어로 작성된 기존 코드 라인 수 추정치. 공개 검색에서 자주 발견되지 않는 언어는 과소평가될 수 있습니다.[47]
- 웹 검색 엔진을 사용하여 발견된 언어 참조(즉, 언어 이름) 수를 세는 것.
순위 | 언어 | 출처 |
---|---|---|
1 | Java | stackify.com[48] |
2 | C | stackify.com,[48] TIOBE 지수[49] |
3 | C++ | stackify.com,[48] TIOBE 지수[49] |
4 | Python | stackify.com,[48] TIOBE 지수[49] |
5 | C# | stackify.com,[48] TIOBE 지수[49] |
6 | 자바스크립트 | stackify.com[48] |
7 | VB .NET | stackify.com[48] |
8 | R | stackify.com[48] |
9 | PHP | stackify.com[48] |
10 | MATLAB | stackify.com[48] |
11 | Java | TIOBE 지수[49] |
11. 방언, 종류 및 구현
프로그래밍 언어 또는 데이터 교환 언어의 '''방언(dialect)'''은 언어의 본질적인 성격을 바꾸지 않는 (비교적 작은) 변형이나 확장이다. 스킴이나 포스와 같은 언어에서는 표준이 구현자들에 의해 불충분하거나 부적절하거나 정당하지 않다고 간주될 수 있으므로, 종종 표준에서 벗어나 새로운 방언을 만들기도 한다. 다른 경우에는, 종종 부분 집합인 도메인 특화 언어에서 사용하기 위해 방언이 생성된다. 리스프 세계에서는 기본적인 S-표현식 구문과 리스프와 유사한 의미 체계를 사용하는 대부분의 언어는 리스프 방언으로 간주되지만, 래킷과 클로저처럼 매우 다양하다. 한 언어에 여러 방언이 있는 것이 일반적이므로, 경험이 없는 프로그래머가 올바른 문서를 찾는 것이 매우 어려워질 수 있다. 베이직 언어는 많은 방언을 가지고 있다.
참조
[1]
서적
Introduction to Programming Languages
http://www.emu.edu.t[...]
2012-09-29
[2]
서적
The Prentice-Hall standard glossary of computer terminology
Prentice-Hall
[3]
논문
Towards a General Ontology of Computer Programs
http://home.mis.u-pi[...]
[4]
웹사이트
XML in 10 points
http://www.w3.org/XM[...]
[5]
서적
HTML & XHTML: the complete reference
McGraw-Hill
[6]
서적
XML For Dummies
https://archive.org/[...]
Wiley
[7]
서적
Principles of Programming Languages
Oxford University Press
[8]
웹사이트
Turing Completeness
https://www.cs.odu.e[...]
2022-10-05
[9]
서적
Programming Languages and Computers: A Unified Metatheory
Academic Press
[10]
간행물
Some thoughts on teaching programming and programming languages
2008-11
[11]
웹사이트
How Lisp Became God's Own Programming Language
https://twobithistor[...]
2024-04-10
[12]
논문
Julia: A fast dynamic language for technical computing
[13]
서적
Beginning Ring Programming: From Novice to Professional
[14]
논문
Visual programming languages integrated across the curriculum in elementary school: A two year case study using “Scratch” in five schools
[15]
논문
PWCT: visual language for IoT and cloud computing applications and systems
[16]
논문
LabVIEW
[17]
서적
Beginning Ballerina Programming: From Novice to Professional
Apress
[18]
논문
Artificial intelligence based smart door with face mask detection
IEEE
[19]
서적
Blueprints visual scripting for unreal engine
Packt Publishing Ltd.
[20]
서적
Hands-On Game Development without Coding: Create 2D and 3D games with Visual Scripting in Unity
Packt Publishing Ltd.
[21]
서적
Introduction to the Theory of Computation
PWS Publishing
[22]
간행물
Perl and Undecidability
http://www.jeffreyke[...]
[23]
웹사이트
Lecture Notes: Macros
http://www.apl.jhu.e[...]
[24]
서적
Programming language pragmatics
Morgan Kaufmann
[25]
서적
The Formal Semantics of Programming Languages: An Introduction
https://books.google[...]
MIT Press
1993-02-05
[26]
웹사이트
Introduction To Computer Languages
http://www.acooke.or[...]
2012-07-13
[27]
논문
Polymorphic type inference
ACM Press
1983
[28]
서적
The Mythical Man-Month
Addison-Wesley
[29]
웹사이트
Standard Libraries
https://press.rebus.[...]
2024-01-27
[30]
웹사이트
On the foolishness of "natural language programming."
http://www.cs.utexas[...]
[31]
웹사이트
Epigrams on Programming
http://www-pu.inform[...]
1982-09
[32]
서적
The Definition of Standard ML (Revised)
MIT Press
[33]
웹사이트
Section 7.2 Formal semantics
http://www.schemers.[...]
1998-02
[34]
표준
Programming Language Rexx
[35]
법률
Oracle America, Inc. v. Google, Inc.
2023-06
[36]
뉴스
Guide to Programming Languages {{!}} ComputerScience.org
https://www.computer[...]
2018-05-13
[37]
웹사이트
The basics
https://www.ibm.com/[...]
2011-05-10
[38]
논문
Optimizing large real-world data analysis with parquet files in R: A step-by-step tutorial
2023
[39]
웹사이트
HOPL: an interactive Roster of Programming Languages
https://web.archive.[...]
Murdoch University
2009-06-01
[40]
학회발표논문
Proceedings of the 19th International Conference on Evaluation and Assessment in Software Engineering
ACM
[41]
웹사이트
Structure and Interpretation of Computer Programs
https://web.archive.[...]
2009-03-03
[42]
웹사이트
Scripting Languages
http://www.mactech.c[...]
[43]
웹사이트
COBOL turns 50
https://web.archive.[...]
Computerworld
2009-09-21
[44]
웹사이트
7 Myths of COBOL Debunked
http://www.developer[...]
developer.com
2012-05-03
[45]
웹사이트
SSL/Computer Weekly IT salary survey: finance boom drives IT job growth
http://www.computerw[...]
[46]
웹사이트
Counting programming languages by book sales
https://web.archive.[...]
Radar.oreilly.com
2006-08-02
[47]
논문
Finding code on the World Wide Web: a preliminary investigation
2001
[48]
웹사이트
Most Popular and Influential Programming Languages of 2018
https://stackify.com[...]
stackify.com
2017-12-18
[49]
웹사이트
TIOBE Index
https://www.tiobe.co[...]
2024-06-24
[50]
웹사이트
Lexico, definition of programming language
https://www.lexico.c[...]
[51]
서적
Principles of Programming Languages
Oxford University Press
1987
[52]
웹사이트
Encyclopaedia of Mathematics » P » PL/I
http://eom.springer.[...]
2006-06-29
[53]
서적
The Mythical Man-Month
Addison-Wesley
1982
[54]
웹사이트
The Encyclopedia of Computer Languages
http://hopl.murdoch.[...]
Murdoch University
[55]
문서
CPU의 명령 코드
[56]
문서
어셈블리어
[57]
웹사이트
Interpreted vs Compiled Programming Languages: What's the Difference?
https://www.freecode[...]
[58]
웹사이트
What are the best general-purpose programming languages?
https://www.slant.co[...]
[59]
웹사이트
TUNES: Programming Languages
http://tunes.org/wik[...]
2008-02-29
[60]
논문
Recollections about the development of Pascal
http://portal.acm.or[...]
2006-06-30
[61]
문서
튜링 완전
[62]
문서
프로그래밍 언어 분류
[63]
서적
Types and Programming Languages
MIT Press
2002
[64]
pdf
History of programming languages
http://www.oreilly.c[...]
2006-10-05
[65]
웹사이트
IBM Punch Cards
http://www.columbia.[...]
[66]
서적
History of Programming Languages
Academic Press
1981
[67]
웹사이트
Programming Language Usage Graph
http://www.cs.berkel[...]
2006-06-21
[68]
논문
The Semicolon Wars
2006
[69]
논문
Go To Statement Considered Harmful
http://www.acm.org/c[...]
2006-06-29
[70]
학회발표논문
KLIC: A Portable Implementation of KL1
http://www.icot.or.j[...]
1994-12
[71]
웹사이트
Mini-Bibliography on Modules for Functional Programming Languages
http://readscheme.or[...]
2004-03-15
[72]
문서
자연어에서는 Colorless green ideas sleep furiously. 라는 예문이 있다.
[73]
문서
그 언어의 설계에 달려 있다. 구문적으로 정확하다면 반드시 일치하는 의미를 갖도록 하는 설계도 있을 수 있다.
[74]
웹사이트
An Introduction to Programming Languages
http://www.acooke.or[...]
[75]
문서
statically typed language
[76]
문서
예를 들어 변수의 선언 등에서는, 그 이름의 직전이나 직후인 경우가 많다. 하지만 C언어에서는 "void (*signal(int sig, void (*func)(int)))(int);" 등과 같이, 도대체 어디에 이름이 있고 형식이 있는지 전혀 알 수 없는 경우가 있다.
[77]
문서
dynamically typed language
[78]
서적
The Definition of Standard ML (Revised)
MIT Press
1997
[79]
웹사이트
Section 7.2 Formal semantics
http://www.schemers.[...]
1998-02
[80]
문서
ANSI — Programming Language Rexx, X3-274.1996
[81]
웹사이트
Survey of Job advertisements mentioning a given language
http://www.computerw[...]
[82]
웹사이트
Counting programming languages by book sales
http://radar.oreilly[...]
[83]
논문
Finding code on the World Wide Web: a preliminary investigation
Proceedings First IEEE International Workshop on Source Code Analysis and Manipulation
2001
[84]
웹사이트
Bylaws of the Special Interest Group on Programming Languages of the Association for Computing Machinery
http://www.acm.org/s[...]
2003
[85]
웹사이트
Programming Robots
http://www.cs.brown.[...]
Brown University Department of Computer Science
2002
[86]
웹사이트
On the foolishness of "natural language programming."
http://www.cs.utexas[...]
[87]
웹사이트
Epigrams on Programming
http://www-pu.inform[...]
SIGPLAN Notices
1982-09
[88]
문서
1960년대, JIS에서는 「프로그램 언어」의 번역어가 사용되었다(JIS C 6201-1967「전자 계산기 프로그램 언어 FORTRAN」). 이 때문에 '''프로그램 언어'''로 하고 있는 예도 JIS를 시작으로 널리 볼 수 있지만, 영어구 programming language에 대응하는 어휘로서 {{출처 필요|date=2019-08|반드시 적절하다고는 할 수 없다.}}
[89]
문서
단, 항목명이나 머리글의 경우는 그대로 한 글자로 표기하는 경우가 있다.
[90]
논문
Plankalkül: The First High-Level Programming Language and its Implementation
http://www.zib.de/zu[...]
Institut für Informatik, Freie Universität Berlin, Technical Report B-3/2000
2000
본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.
문의하기 : help@durumis.com