Evolution of the Major Programming Languages
프로그래밍 언어론의 2장은 지금까지 개발되었던 프로그래밍 언어에 대한 간단한 정리입니다. 과거부터 지금까지 개발된 프로그래밍 언어의 종류는 매우 많지만, 이러한 프로그래밍 언어의 특징에 대해 하나하나 전부 외울 필요는 없습니다. 그 대신, 주요한 몇몇 언어에서 도입된 새로운 개념에 대해서만 간단하게 요약하겠습니다.
이 그림은 이번 장에서 다룰 프로그래밍 언어의 계보입니다. 다루는 순서는 연도별로 정리되어 있지만, 같은 계보에 있는 언어들 (ex. FORTRAN과 그 후속 버전)은 한번에 같이 다루도록 하겠습니다.
Fortran은 Formula Translator의 약자로써, IBM이 개발한 IBM 704 하드웨어에서 동작하는 것을 목표로 개발된 프로그래밍 언어입니다. IBM 704는 부동 소수점 연산이 가능했던 최초의 하드웨어였기 때문에, 이를 구동하기 위해 1954년 IBM에서는 The IBM Mathematical Formular Translating System이라는 보고서를 작성하였고, 이것이 Fortran 언어의 원형인 Fortran 0입니다. Fortran 0가 실제로 구현되지는 않았지만, 구현 도중 언어 시스템이 계속 수정되면서, 1957년 드디어 Fortran 1이 개발됩니다.
Fortran I의 특징은 동적 공간이 없었으며, 반복문을 동작하기 위하여 좋은 배열이 필요했습니다. 또한 변수 중 I, J, K, L, M, N은 정수형 타입이었으며, 다른 모든 변수는 부동 소수점 타입이라는 규약이 있었습니다. 하지만 문자열 처리가 불가능했고, 강력한 입출력 시스템을 갖지 못했습니다.
Fortran I이 가지는 의의는 컴파일러를 사용하는 최초의 고급 언어라는 것입니다. Fortran I의 특징을 정리하면 다음과 같습니다.
- 변수의 이름은 최대 여섯 글자로 제한됨
- 반복문은 Do 반복문만 존재
- 입출력 형식이 정해져 있음
- 사용자 정의 부프로그램 생성 가능
- 3가지 분기를 가지는 선택문이 존재 (IF)
- 데이터 타입을 표기하는 문법이 없음
- 부분 컴파일이 불가능
- 컴파일러는 18명의 기술자에 의해 1957년 4월에 개발됨
- IBM 704의 낮은 신뢰도로 인해, 400줄이 넘는 프로그램은 컴파일이 정상적으로 수행되지 않음
- 코드는 매우 빠르게 수행됨 (최적화가 잘됨)
- 불과 1년이 지나 IBM 704를 위한 코드 중 절반 이상이 Fortran I으로 작성될 정도로 널리 보급됨
Fortran II는 Fortran I이 나온지 약 1년 후에 배포되었습니다. Fortran I이 가지고 있던 단점을 보완하여 부분 컴파일을 가능하게 했고, 이로 인해 Fortran I보다 긴 프로그램 제작이 가능해졌습니다. 그 외에 Fortran I의 버그를 수정하여 안정성을 향상시켰습니다.
Fortran II 다음에 Fortran III이 개발되긴 하였으나, 널리 쓰여지지 않았기 때문에 금세 잊혀졌습니다. 대신 1960년대 초에 개발된 Fortran IV는 엄청난 성공을 거두었습니다. Fortran IV는 명시적 타입 선언, 논리 IF문, 그리고 부프로그램을 매개변수로 취급하여 다른 부프로그램에 전달할 수 있는 기능이 추가되었습니다. Fortran IV는 ANSI에 의해 1966년에 표준화가 되었습니다.
Fortran IV 다음으로는 Fortran 77이 발표되었습니다. Fortran 77은 문자 스트링 처리, 논리 반복 제어문, IF-THEN-ELSE 문이 추가되었습니다. Fortran 77은 1978년에 표준화가 되었습니다.
Fortran 90은 Fortran 77에서 상당한 발전을 이루어서 모듈, 동적 배열, 포인터, 재귀문, Case문, 매개변수 타입 체크 기능이 추가되었습니다. Fortran 90은 1992년에 표준화가 되었습니다.
Fortran 90 이후, Fortran은 5년 주기의 마이너 업데이트, 10년 주기의 메이저 업데이트를 개발하기로 결정됩니다. 그로 인해 Fortran 95는 Fortran 90의 마이너 업데이트 버전입니다. 기존 문법 중 쓰이지 않는 문법도 제거되었습니다.
계획대로라면 Fortran 95 이후, 2000년에 메이저 업데이트를 포함한 Fortran 2000이 개발되었어야 했지만, 기술자들의 합의가 이루어지지 않아 2003년에야 Fortran 2003으로 발표됩니다. 사실 메이저 업데이트라고 해도 크게 변한 것은 없었습니다. (그래서 위와 동일하다고 ditto로 표시되어 있습니다)
이 글을 쓰는 시점에서 최신 버전은 Fortran 2018입니다.
Fortran은 초창기에 개발된 고급 언어이지만, 현재까지도 적지 않은 사용자를 보유하고 있습니다. 가장 큰 이유로는 Fortran 90 이전의 모든 Fortran 언어는 최적화가 매우 훌륭하기 때문에, 모든 변수의 타입과 저장 공간이 런타임 이전에 고정되었다는 것입니다. 즉, 런타임에서 새로 할당되는 변수가 한 개도 없었다는 뜻입니다.
Fortran의 성공은 컴퓨터가 사용되는 방식을 크게 변화시켰고, 많은 프로그래밍 언어가 Fortran의 문법으로부터 영향을 받았기 때문에, 컴퓨팅 세계에서 공통어(Lingua Franca)라고 불리기도 합니다. (Alan Perlis, 1978)
처음으로 개발된 함수형 프로그래밍 언어는 LISP입니다. LISP는 1958년 MIT에 근무하던 John McCarthy에 의해 개발되었습니다. 이 당시에도 연구자들은 AI에 대한 관심이 있었기 때문에, AI 연산에 어울리는 프로그래밍 언어를 목표로 설계되었습니다. LISP의 문법은 Lambda Calculus를 기반으로 만들어졌다는 특징이 있습니다. 예를 들어, 1부터 10까지 출력하는 프로그램을 Python으로 구현하면 반복문을 사용한 방법이 먼저 떠오르지만, 람다식을 기반으로 만든다면 [print(x) for x in range(10)]
와 같이 나타낼 수 있습니다.
LISP은 당시 유행하던 Fortran과는 다르게, Atom과 List라는 데이터 타입을 가지고 있습니다. Atom은 상수나 심볼을 의미하며, List는 Atom으로 이루어진 자료구조입니다. List는 저희가 자료구조 시간에 배운 연결 리스트와 동일한 구조이며, 위의 그림처럼 리스트 내부에는 부분 리스트가 존재할 수 있습니다.
LISP는 처음 개발된 이후부터 현재까지 AI 응용 분야에서 절대적인 위치에 존재하고 있습니다. LISP가 발전하면서 기존에 가지고 있던 느린 실행 시간이란 문제도 인터프리터도 컴파일러로 변경되면서 보다 빠른 실행 시간을 갖도록 개선되었습니다.
LISP의 문법은 위와 같이 연산 기호가 앞에 오는 전위 표기(Prefix) 구조를 사용합니다.
LISP에서 함수는 위와 같이 정의할 수 있습니다.
LISP에서 반복문은 위와 같이 나타낼 수 있습니다. 위 슬라이드의 함수는 구구단을 출력하는 함수로, (printDan 2)로 호출하여 구구단 2단을 출력하게 만드는 코드입니다.
현재 LISP 계열 언어는 초창기에 개발된 LISP보다 그 개선형들이 더 많이 사용되고 있습니다. 1970년대 중반에 MIT에서 LISP의 파생 언어인 Scheme이 개발되었는데, LISP보다 작은 규모, 정적 영역의 활용, 함수를 일등급 객체로 취급하여 매개변수나 리스트의 원소 등으로 취급할 수 있는 기능이 추가되었습니다. Scheme은 그 간단한 문법으로 인해 교육용으로 많이 사용되었습니다.
또 다른 LISP 계열 언어로써 Common LISP이 있는데, Scheme과는 다르게 오히려 초창기 LISP보다 복잡한 구조를 가지고 있습니다. 그 이유는 LISP 계열 파생 언어를 한 개로 결합했기 때문인데, 구조가 복잡한 대신 LISP 파생 언어들로 작성된 프로그램들을 모두 이식할 수 있다는 장점이 있습니다.
ALGOL 이전에 존재하던 프로그래밍 언어들은 모두 특정한 하드웨어에 종속된 언어였습니다. 따라서 범용성을 늘리고자 하는 연구 끝에 보편적으로 사용할 수 있는 최초의 프로그래밍 언어인 ALGOL 60 언어가 등장하게 됩니다. ALGOL은 Algorithmic Language의 약자입니다.
ALGOL의 설계는 1958년부터 시작되었습니다. 이 때 설계의 목표는 수학적 표기에 가까운 문법, 알고리즘의 설명을 위해 이 언어를 사용하는 것이 가능해야할 것, 그리고 반드시 자동적으로 기계어로 번역되어야 한다는 것이었습니다.
ALGOL에서 정립한 특징은 다음과 같습니다.
- 데이터 타입의 형식화
- 변수명 길이 제한이 없음
- 배열의 차원 제한이 없음
- 매개변수가 입출력에 따라 구분됨
- 색인 첨자를 괄호로 표시함
- 복합문을 가능하게 만듬 (begen - end로 표기)
- 각 문구는 세미콜론으로 구분함
- 배정문은 :=로 정의함
- 조건문 if에서 else-if 문을 사용할 수 있음
- 프로그램에서 필요로하는 입출력이 없음 (이로 인해 기계에 종속적일 수 있기 때문에)
ALGOL은 1958년에 ALGOL 58이란 보고서로 처음 탄생하였습니다. 이것이 실제 구현되지는 않았지만, 이 보고서를 기반으로 MAD나 JOVIAL 등의 언어가 영향을 받아 구현되었습니다. ALGOL 58이 처음 발표되었을 때, IBM은 초기에 관심을 보였으나 이미 IBM 700번대 컴퓨터에 도입된 Fortran을 유지하기로 결정하여 포기하였습니다.
ALGOL 58을 실제로 구현하기 위해 연구자들은 파리에서 6일간 회의를 진행했습니다. 회의 기간이 길지는 않았지만, 이 때 추가된 기능들이 상당히 많은데요. 정리하자면 다음과 같습니다.
- 블록 구조 (지역화의 도입)
- 부프로그램에 매개변수를 전달하는 두 가지 다른 방법이 도입됨 (Call by Value, Call by Name)
- 부프로그램을 재귀적으로 호출하는 것이 가능
- 스택 동적 배열이 허용됨 (6장에서 다룸)
하지만 입출력 형식은 기계에 종속적일 수 있기 때문에 여전히 다루지 않았습니다.
그렇다면 ALGOL 60이 성공한 것과 실패한 것을 나누어 생각해보겠습니다. 먼저 ALGOL 60이 성공한 것부터 말하자면, 컴퓨터 알고리즘을 표기하는 방식이 ALGOL 60을 기준으로 기술되었다는 것입니다. 그렇기 때문에 1960년 이후 설계된 모든 명령형 프로그래밍 언어는 ALGOL 60을 기반으로 설계되었습니다. (C, Java, Pascal 등) 그리고 처음에도 소개했듯이, ALGOL 60은 최초의 기계에 독립적인 프로그래밍 언어이고, 프로그래밍 언어의 문법을 BNF(Backus-Naur Form)으로 규정화하였습니다.
ALGOL 60이 실패한 점은 결국 대중화되지 못했다는 것입니다. 특히 미국에서 굉장히 부진했는데, 그렇다고 유럽에서 널리 쓰인 것도 아니었습니다. 그 이유는 여러 가지가 있었지만, 몇 개만 소개하자면 다음과 같습니다.
- 입출력의 부재로 인해 다른 컴퓨터에 이식하는 것을 어렵게 만듬
- 언어가 너무 유연했기 때문에 구현하기 어려웠음
- 기존에 사용하던 Fortran의 견고한 대중성
- 처음 도입된 BNF 문법을 이해하기 어려웠음
- IBM으로부터의 지원 결여
다음으로 설명할 언어는 비즈니스 용도로 개발된 COBOL입니다. COBOL이 개발되기 전, 1957년에 FLOW_MATIC이라는 언어가 비즈니스 용도로 개발되었으나, 이 언어는 UNIVAC 회사의 소유로써 UNIVAC의 컴퓨터를 위해 설계되었었기 때문에 범용적이지 못했습니다. 또 다른 언어는 미국 공군(USAF)에 의해 개발된 AIMACO가 있었으나, FLOW-MATIC과 큰 차이가 없었고, IBM이 COMTRAN이라는 비즈니스용 언어를 설계하였으나, 결국 구현되지는 못했습니다. 이 외에도 여러 언어들이 비즈니스 용도로 계획되었으나, 각자 가지고 있는 단점으로 인해 주력화되지는 못했습니다.
COBOL 언어는 기존 비즈니스용 언어였던 FLOW-MATIC을 기반으로 만들어졌습니다. 이 당시 FLOW-MATIC은 하이픈을 포함해 12개의 문자로 이름을 짓는 것이 가능했고, 영어로 연산을 표기했습니다. 이 말인 즉슨, 1 + 2와 같이 연산 기호를 사용하지 않고 ADD 1, 2 와 같이 표현했다는 뜻입니다. 또한 데이터와 코드는 완전히 구분되었고, 모든 구문의 첫 단어는 동사로 지정되었습니다.
COBOL을 위한 회의는 1959년 펜타곤에서 처음 열렸습니다. 비즈니스 용도가 목적인 만큼, 전문가가 아닌 일반인도 사용할 수 있도록 간단한 영어처럼 보이게 만들고, 보다 덜 효율적이더라도 사용하기 쉬워야만 했습니다. 또한 컴퓨터를 사용할 수 있는 사람들을 늘리고 현재 발생하고 있는 컴파일(구현) 문제들에 의해 지나치게 제약되어서는 안되었습니다.
COBOL 설계를 위한 구성원들은 전부 컴퓨터 제조업자들과 국방 관계자였습니다. (Department of Defence; DoD)
COBOL 언어는 Define으로 명명된 최초의 매크로가 포함된 첫 고급 언어입니다. 또한 Record라고 불리는 계층적 데이터 구조와 중첩된 선택문이 가능했습니다. 이름을 지을 때 FLOW-MATIC에서는 12개의 문자로 한정되었지만, COBOL은 30글자까지 가능하게 개선되었습니다. 또한 데이터 영역이 코드 영역과 완전히 구분되었다는 특징이 있습니다.
COBOL에 가장 큰 영향을 미친 것은 바로 미 국방성이었습니다. 미 국방성의 설계 개입과 지원은 COBOL이 다른 언어들에 비해 성공할 수 있었던 주요한 이유로 평가됩니다. 미국에서는 여전히 국가 시스템의 일부분이 COBOL로 설계되었기 때문에 가끔 뜬금없이 COBOL 프로그래머를 구인하는 공고가 올라오곤 합니다.
이것은 COBOL로 작성된 프로그램의 예시입니다. 간단한 영어로 대부분 표현되어 있기 때문에 COBOL 언어를 모르더라도 대략적인 해석이 가능합니다. TIJA는 뭔가 싶었는데, 아무리봐도 그냥 임의로 지어진 이름인 것 같습니다. 혹시 다른 뜻으로 알고 계신 분이 있다면 댓글 부탁드립니다…
다음 소개할 언어는 BASIC 입니다. 두 수학자 John Kemeny와 Thomas Kurtz는 다트머스 대학교에서 근무하고 있었는데, 다트머스 대학교는 학부중심대학(Liberal Arts College)으로써 약 75%의 학생이 인문계열을 전공하였습니다. 두 수학자는 이러한 학생들을 위한 새로운 언어가 필요하다고 판단하여 이공계열 학생이 아닌 학생들이 이해하기 쉽도록 설계한 Beginner’s All-purpose Symbolic Instruction Code (BASIC)을 개발하였습니다.
현재 BASIC 언어 중 가장 유명한 파생 언어는 마이크로소프트에서 개발한 Visual BASIC입니다. 아마 90년대에 태어나신 분이라면 한번쯤은 들어보신 언어일 것이라고 생각합니다.
BASIC 언어는 시분할 개념을 도입한 최초의 언어입니다.
PL/I는 모든 사람을 위해 개발된 첫 번째 대규모 언어입니다. IBM에 의하면, 이전까지 프로그래밍 언어를 사용하던 사용자들은 과학 용도로 사용하던 SHARE 그룹과 비즈니스적 용도로 사용하던 GUIDE 그룹이 있었습니다. SHARE 그룹은 Fortran을, GUIDE 그룹은 COBOL을 주로 사용했습니다.
그런데 1963년부터 두 사용자 그룹이 충돌하려는 조짐이 보이기 시작했습니다. 당시 과학 용도로 사용하던 사용자들은 대규모 데이터를 처리하기 위해 효율적인 입출력 기능을 가진 COBOL에 관심을 보였고, 비즈니스 용도로 사용하던 사람은 회귀 분석을 수행하기 위해 부동 소수점 데이터 처리와 배열 기능에 관심을 보이기 시작했습니다. 이것은 각각 분리되었던 두 사용자 그룹이 서로의 언어와 컴퓨터가 필요로 한다는 것을 의미했고, 이것으로 인해 두 종류의 컴퓨터 뿐만 아니라 각각의 프로그래밍 언어를 사용할 수 있는 프로그래머의 추가 고용이 필요했습니다.
따라서 IBM은 두 용도로 모두 사용할 수 있는 범용적인 컴퓨터와 그 언어를 개발하는 작업에 착수합니다.
이러한 언어를 설계하기 위한 위원회가 만들어졌는데, 구성원은 IBM 직원 3명, SHARE 직원 3명으로 이루어졌습니다. 초창기 컨셉은 Fortran IV의 확장으로 기획되었으며, 코드명 NPL (New Programming Language)로 불렸습니다. 1965년에 비로소 현재의 이름인 PL/I (Programming Language One)로 변경됩니다.
PL/I가 프로그래밍 언어에 기여한 부분은 다음과 같습니다.
- 동시에 실행할 수 있는 부프로그램을 생성할 수 있음
- 발생할 수 있는 예외를 처리할 수 있음
- 부프로그램을 재귀적으로 사용하는 것을 허용
- 데이터 타입에 포인터가 추가됨
- 배열의 일부분이 참조될 수 있음 (ex. 2차원 행렬의 특정 행이 1차원 배열인 것처럼 참조될 수 있음)
그러나 PL/I에서 추가된 새로운 구조는 너무 많았고, 설계에 결함도 상당히 많았습니다. 게다가 프로그래밍 언어가 너무 방대하고 복잡하다는 단점이 있었습니다. 하지만 적어도 1970년대까지는 이 언어가 상당히 많이 사용되었기 때문에 어느 정도 성공은 거뒀다고 평가받고 있습니다.
다음 소개할 언어는 APL과 SNOBOL입니다. 이 두 언어는 앞서 소개했던 다른 언어들에 비해 중요도가 높지 않기 때문에 간단하게만 설명하고 넘어가도록 하겠습니다. APL과 SNOBOL은 최초의 동적 언어로서의 의미가 있지만, 이후에 나타나는 다른 언어들에 그다지 큰 영향을 남기지는 못했습니다.
동적 언어로 불리는 이유는 기본적으로 동적 타입과 동적 공간 할당을 지원하기 때문입니다. 예를 들어, 이 언어들에서는 변수가 선언될 때 타입이 선언되지 않고 값이 배정될 때 타입이 결정됩니다. 또한 값이 할당되기 전에는 필요한 기억 공간을 알 수 없기 때문에, 변수는 값이 배정되어야만 기억 공간에 할당됩니다.
APL(A Programming Language)은 1960년 쯤에 IBM의 Kenneth Iverson에 의해 설계되었습니다. 사실 초창기에는 하드웨어의 구조를 설명하는 의도로 제작되었지만, 나중에 프로그래밍 언어로써 목적이 바뀌게 됩니다. 그래서 그런지 몰라도, 이 언어는 굉장히 많은 연산자를 가지고 있으며, 대부분의 코드가 간단하게 표기되지만 읽기가 매우 힘들다는 단점이 있습니다. 예를 들어 Daniel McCracken이라는 프로그래머는 4줄로 작성된 APL 프로그램을 이해하는데 4시간이나 걸렸다고 합니다.
그래서인지 APL은 널리 사용되지는 못했지만, 사용하고 있는 사람은 여전히 있습니다. 그리고 그 구조 또한 초창기에서 거의 변하지 않았습니다.
SNOBOL은 1964년에 벨 연구소에 근무하던 Farber, Griswold, Polensky에 의해 설계되었습니다. SNOBOL은 텍스트 처리, 그 중에서도 문자열 패턴 매칭에 강한 성능을 가졌습니다. 그러나 특수 목적에 사용되는 것과 더불어 동적인 특징으로 인해 일반적인 다른 언어들보다 느리기 때문에, 그다지 많이 사용되지는 못했습니다. 그러나 여전히 몇몇 소수의 사용자들은 이 언어를 사용하고 있습니다.
이 프로그램은 SNOBOL을 사용해서 더 이상 요청이 없을 때까지 문자열 입력을 계속 요청하는 프로그램입니다.
SIMULA 67은 최초로 데이터 추상화에 대한 개념이 도입된 프로그래밍 언어입니다. 노르웨이 컴퓨팅 센터에서 일하던 Nygaard와 Dahl은 시스템 모의실험을 위해 SIMULA I 언어를 설계하였고, ALGOL 60 언어와 SIMULA I을 기반으로 SIMULA 67 언어를 구현하였습니다. 이 언어는 부프로그램의 실행이 끝나면 이전에 실행이 중단된 지점에서 다시 실행을 이어가는 Coroutine이라는 새로운 부프로그램을 설계하였으며, 그것을 위한 클래스, 객체, 그리고 상속이 도입되었습니다.
ALGOL 68은 ALGOL 60의 개정판이지만 ALGOL 60과 상당히 다른 구조를 가지고 있습니다. 안타깝게 ALGOL 60과 마찬가지로 그다지 널리 쓰이지는 못했지만, ALGOL 68은 프로그래밍 언어의 평가 기준 중 하나인 직교성을 처음으로 중요하게 논의하였다는 특징이 있습니다.
ALGOL 68은 사용자 정의 데이터 구조와 동적 배열이라는 개념을 새로 도입하였습니다. 그러나 ALGOL 60에서 안좋은 점을 답습하여 언어 기술 문서를 너무 복잡하게 작성하였기 때문에 사람들로부터 외면받았습니다. 하지만 이 언어는 Pascal, C 언어를 포함한 후속 언어에 매우 강한 영향을 끼쳤기 때문에 역사적으로는 중요한 언어입니다.
ALGOL의 후속 언어라고 볼 수 있는 언어 중 하나는 Pascal 언어입니다. 이 언어는 ALGOL 68을 설계했던 위원 중 하나인 Niklaus Wirth에 의해 설계되었습니다. Pascal은 작고 간단하다는 특징으로 인해 프로그래밍 교육에 지대한 영향을 끼쳤으며, 1970년대 중반부터 1990년대 후반까지 대학교에서 프로그래밍 교육 용도로 사용되었습니다.
C언어는 벨 연구소에 근무하던 Dennis Richie에 의해 시스템 프로그래밍 용도로 설계된 언어입니다. C 언어는 BCLP, B, ALGOL 68로 부터 영향을 받았는데, 강력한 연산자를 가지고 있지만 타입 검사를 거의 하지 않는다는 문제가 있습니다.
기존의 운영체제는 대부분 어셈블리어와 같은 저급 언어로 개발되었으나, C 언어는 처음부터 시스템 프로그래밍 용도로 설계된 언어이기 때문에 실제로 C 언어로 운영체제가 만들어졌습니다. 그 이름도 유명한 UNIX로써, UNIX의 성공과 더불어 C 언어는 현재까지도 널리 쓰이는 주요한 언어로 자리잡게 됩니다.
Prolog는 마르세유 대학교의 Comerauer, Roussel과 애든버러 대학교의 Kowalski에 의해 1970년대에 개발된 언어입니다. Prolog는 논리 프로그래밍을 위해 개발되었는데, 논리 프로그래밍은 술어 해석학 명제들을 명세화하는 것이라고 합니다. 즉, 관련된 정보와 요구한 결과를 계산하기 위한 추론 과정을 컴퓨터에게 제공함으로써 원하는 결과를 얻어내는 방식입니다. 그러나 Prolog는 매우 비효율적이라는 것이 증명되었고, 논리 프로그래밍을 필요로 하는 분야도 적었기 때문에 널리 사용되지 못했습니다.
Ada 언어는 지금까지 나타난 언어 중에 가장 오랜 자원을 투자해 설계한 언어입니다. 이것은 COBOL과 마찬가지로 미 국방성(DoD) 주도로 개발이 시작되었으며, 무려 8년간의 기간동안 여러 제안서를 토대로 요구사항을 정립하였습니다. 이 언어의 이름은 최초의 프로그래머인 에이다 러브레이스로부터 딴 Ada로 붙여졌습니다.
Ada 언어는 패키지, 예외 처리, 포괄적 프로그래밍, 동시 실행에 대해 많은 기여를 남겼습니다. 그러나 설계 당시 경쟁적으로 요구사항이 추가되었고, 당시에 존재하던 소프트웨어 공학과 언어 설계에 대한 지식이 총동원되었기 때문에 Ada 언어의 컴파일러는 상당히 어려운 문제였습니다. Ada 언어 자체는 1980년 쯤에 등장했지만, Ada 언어를 컴파일할 수 있는 컴파일러는 1985년에서야 나타나기 시작했습니다.
Ada 95는 Ada 언어의 개정판으로써 1988년부터 설계가 시작되었습니다. 이때부터 객체 지향 프로그래밍의 개념이 도입되었으며, 상속 시 파생 클래스에 새로운 요소를 추가하는 것이 가능해졌습니다. 또한 공유된 데이터에 대한 제어 메커니즘의 향상 (ex. private), 새로운 동시 프로세스, 더 유연한 라이브러리가 추가되었습니다. 그러나 C++ 언어의 등장으로 인해 Ada 언어는 빠르게 인기를 잃었기 때문에 현재는 그렇게 많이 사용하지는 않습니다. 가장 최근에 발표된 개정판은 Ada 2012입니다.
Smalltalk는 1960년대 후반 유타 대학교에서 박사과정을 하던 Alan Kay로 부터 처음 제안되었습니다. 그러나 당시에는 그가 고안했던 기능을 구현하기 위한 하드웨어가 없었기 때문에, 1970년대에 되서야 구현되었습니다.
지금까지 소개된 프로그래밍 언어에서 객체 지향 프로그래밍의 일부 기능을 지원하는 언어는 있었지만, 완전한 객체 지향 프로그래밍을 지원하는 언어는 소개되지 않았습니다. Smalltalk는 완전한 객체 지향 프로그래밍 언어를 지원하는 첫 언어라는데 그 의의가 있습니다. 또한 그래픽 유저 인터페이스를 지원했다는 특징도 있습니다.
C++ 언어는 벨 연구소에서 근무하던 Bjarne Stroustrup에 의해 1980년에 개발된 언어입니다. 당시 존재하던 C 언어와 SIMULA 67 언어를 기반으로 만들어졌으며, Smalltalk와 같이 객체 지향 프로그래밍을 지원하기 위해 설계되었습니다. C 언어와 다르게 예외 처리를 지원한다는 특징이 있습니다. C++ 언어는 절차적 프로그래밍과 객체 지향 프로그래밍을 모두 지원하도록 설계되었기 때문에 굉장히 방대하고 복잡하게 설계되었습니다. 객체 지향 프로그래밍의 발전으로 인해 C++는 급격하게 인기를 얻게 되었고, 이것은 현재도 마찬가지입니다. 표준화는 ANSI에 의해 1997년에 제정되었고, 대표적인 분파로 마이크로소프트의 Managed C++가 있습니다. 참고로 현재 윈도우 운영체제는 C 언어와 C++ 언어를 기반으로 만들어지고 있습니다.
이 외에 객체 지향 프로그래밍과 관련된 언어는 1992년에 개발된 Eiffel, 2000년에 개발된 Delphi가 있습니다. 그러나 이 언어들은 다음 페이지에 나오는 언어로 인해 묻혀버리고 맙니다.
Java 언어는 썬 마이크로시스템즈에 의해 1990년대 초반에 개발되었습니다. 썬 마이크로시스템즈는 컴퓨터 뿐만이 아니라 냉장고나 TV, 오븐 같은 가전 기기들에서 사용할 수 있는 범용적인 언어가 필요했는데, 당시 널리 쓰이던 C와 C++ 언어는 이것이 불가능했기 때문입니다. Java 언어는 C++ 언어에서 신뢰성에 영향을 미치는 포인터나 구조체, 공용체와 같은 개념을 모두 빼버리고 오로지 객체 지향 프로그래밍만을 위해 설계되었습니다. 이것은 가전 기기에 신뢰성이 매우 중요한 요소였기 때문입니다. 또한 동시성을 위해 애플릿이라는 개념도 새로 도입하였습니다.
Java는 그 외에도 GUI나 데이터베이스를 위한 라이브러리 추가, 자바 가상 머신으로 인해 이식성이 높은 특징이 있습니다. Java 언어는 웹 프로그래밍 분야에서 널리 쓰이게 되며 빠르게 사용자를 늘려왔습니다. Java 언어의 최신 버전은 2023년에 발표된 Java 20입니다.
스크립트 언어는 스크립트(Script) 라는 명령어 리스트를 해석하기 위해 하나의 파일로 저장했던 것에서 유래했습니다. 초기 스크립트 언어는 프로그래밍 언어와 차이가 있었으나, 그 발전 과정에서 프로그래밍 언어와 같은 부프로그램, 변수, 제어문 등이 추가됨으로써 프로그래밍 언어와 점점 가까워졌습니다. 여기서는 대표적으로 몇 개의 스크립트 언어를 간단하게 소개하고 넘어가겠습니다.
-
Perl : Perl은 1987년 Larry Wall에 의해 개발되었습니다. Perl의 특징은 변수들이 정적 타입을 갖지만 묵시적으로 선언된다는 것입니다. Perl의 변수 타입은 변수명의 첫 글자로부터 정해지는데, 스칼라 변수는 $로 시작하고, 배열은 @, 해시는 %로 선언됩니다. Perl의 성능은 강력하지만, 안정성이 낮다는 단점이 있습니다. 주로 웹 프로그래밍 분야에서 많이 사용하며, 유닉스 시스템에서도 종종 사용됩니다.
-
JavaScript : JavaScript는 1995년 넷스케이프에 근무하던 Brendan Eich에 의해 개발되었습니다. 원래 이름은 LiveScript였으나, 당시 유행하던 Java 언어의 인기에 편승하기 위해 JavaScript로 변경하였습니다. JavaScript는 주로 동적인 HTML 문서를 만들기 위해 웹 프로그래밍 분야에 사용되며, 클라이언트에서 인터프리팅 된다는 특징이 있습니다. Java와는 사실 그다지 큰 관련이 없습니다. 프로그래머 사이의 농담 중에, Java와 JavaScript의 관계는 인도와 인도네시아의 관계와 동일하다라는 말이 있습니다.
-
PHP : PHP는 1994년 아파치 그룹의 회원인 Rasmus Lerdorf에 의해 개발되었습니다. JavaScript와는 다르게 PHP는 서버에서 인터프리팅하는 특징이 있습니다. 주로 웹에서 데이터베이스 관리 시스템을 운영할 때 사용됩니다.
-
Python : Python은 1991년 네덜란드의 프로그래머 귀도 반 로썸에 의해 개발되었습니다. 1989년 크리스마스 주에 할게 없어서 연구실에 나와서 만든 에피소드로 유명합니다. Python은 객체 지향 스크립트 언어로써 타입 검사는 하지만 동적인 타입을 갖고 있다는 특징을 가지고 있습니다. Python은 CGI 프로그래밍과 폼 처리에 사용되며 리스트, 튜플, 해쉬 등의 자료구조를 지원합니다. 사실 요즘은 거의 만능으로 사용되는 언어입니다.
-
Lua : Lua는 1993년 리우 데 자네이루 교황청대학교의 Roberto Ierusalimschy, Waldemar Celes, Luis Herique de Figueiredo에 의해 개발되었습니다. Lua는 확장성을 갖는 절차적 함수형 언어를 지원하는 스크립트 언어를 목적으로 하였으며, 객체 지향 프로그래밍도 가능하도록 확장이 가능하다는 특징을 가지고 있습니다. Lua는 주로 게임 프로그래밍에서 많이 쓰이는 언어입니다. Lua의 테이블이라는 1개의 자료구조만 존재합니다.
Ruby는 1996년 Yukihiro Matsumoto에 의해 개발되었습니다. Ruby는 Perl과 Python과는 달리 순수 객체 지향 언어로써, 클래스와 객체들도 모두 동적이라는 특성을 가지고 있습니다. 또한 Python과 마찬가지로 Ruby도 사용자가 목적에 맞게 언어를 확장할 수 있다는 장점이 있습니다.
C#은 마이크로소프트가 .NET 프로젝트와 함께 개발된 언어입니다. 기본적으로 C++, Java 등의 언어에서 강하게 영향을 받았으며, 컴포넌트 기반(특히 .NET Framework) 소프트웨어 개발을 위한 목적으로 설계되었습니다. 그리고 C#은 개발사인 마이크로소프트에서 사용하던 C#, Visual Basic, .NET, Managed C++ 등의 언어와 결합하기 위한 Common Type System을 사용합니다. 따라서 이들은 공통 라이브러리를 사용하고 동일한 중간 언어로 번역됩니다.
다음은 마크업/프로그래밍 하이브리드 언어에 대해 두 개만 살펴보도록 하겠습니다.
-
XSLT(eXtensible Stylesheet Language Transformation) : XSLT가 나타난 배경은 기존에 사용하던 XML(eXtensible Markup Language)라는 마크업 언어로 생성된 XML 문서를 HTML 문서로 변환하기 위해서입니다. XML과 HTML 둘 다 마크업 언어이지만, XSLT는 마크업 언어를 기반으로 하면서도 반복문과 같은 프로그래밍 언어의 특징을 조금 갖고 있습니다.
-
JSP(Java Server Pages) : JavaScript와는 다르게 JSP는 진짜 자바와 관련이 있는 언어입니다. 서블릿(Servlet)은 웹 서버 시스템에서 실행되는 Java 클래스이고, 웹 브라우저에 있는 HTML 문서에 의해 실행이 요청됩니다. JSP는 Java와 마찬가지로 자바 가상 머신 위에서 실행되므로, JSP 소스를 수정 없이 다른 Java 프로그램에 넣어도 실행이 가능합니다. JSP 문서의 처리를 제어하기 위해서는 JSTL(Java Server Pages Standard Tag Library)을 이용합니다.
지금까지 많은 프로그래밍 언어를 살펴보았습니다. 특히 소개했던 주요 언어의 특징을 단순히 외우기보다는 해당 언어가 프로그래밍 언어의 역사에 어떤 영향을 끼쳤는지를 중심으로 생각해보시는 것을 권장드립니다. 최상단에 나와있는 프로그래밍 언어의 계보를 보면서 공부하시면 더 좋습니다.
2장의 내용은 여기까지입니다. 읽어주셔서 감사합니다!
Leave a comment