Zuze's Plankalkul
세계 최초의 컴퓨터 x1을 프로그래밍하기 위해 나온 언어
1945년에 나온 언어인데, 이때 벌써 floating point, array, record 의 개념과 상수가 정의되어 있었다.
A[5] = A[4] + 1 를 이렇게 썼고, 1.n 은 데이터 타입을 나타낸 표기라고 한다.
Pseudocodes
등장 배경
컴퓨터가 등장했을 때, 사람들은 컴퓨터에 기계어로 명령을 직접 내려야 했다.
기계어는 읽기, 수정하기, 의사표현하기가 매우 힘든 언어였고, index, floating point 의 개념도 없었다.
- Short Code (BINAC 컴퓨터에 사용한 슈도 코드)
- SpeedCoding (IBM 701 컴퓨터에 사용)
700개의 단어 밖에 사용하지 못하고 느리지만, 분기와 자동으로 증가하는 레지스터를 제공했다.
- UNIVAC
Grace Hopper가 이끄는 팀이 만든 컴파일 시스템 (슈도코드를 기계 코드로 바꾸는 시스템)
하지만 이 시스템으로 만든 코드가 메모리의 아무 위치에 올라가면 실행이 안되는 문제가 있었다.
그래서 Wheeler 라는 사람이 프로그램이 실행될 메모리의 주소를 다시 계산해서 배치하는 block을 사용하는 방법을 고안했다.
Fortran
등장 배경
컴퓨터는 작고, 신뢰할 수 없었으며, 주로 과학분야에서 사용되었다.
프로그래밍 방법론이나 도구가 존재하지 않고, machine efficiency가 가장 주요한 관심사였다.
1954년 포트란 언어가 설계됨 (Fortran 0),
1957년 IBM 704을 위한 프로그래밍 언어로 개발됨 (Fortran 1, 컴파일러 등장)
당시에는 메모리 공간이 부족해 메모리의 동적할당을 지원하지 않았고,
배열 조작과 정해진 횟수만큼 반복하는 기능을 제공하는데에 특화되어 있었다.
문자열 조작, 10진수 연산, 입출력 기능은 제공하지 않았다.
그래서 제약사항이 굉장히 많았는데
- 변수는 6글자까지 사용가능
- 조건을 체크하고 반복하는 Do 문 제공
- 매우 짧은 입출력 지원
- 함수와 비슷한 사용자 정의 서브프로그램 제공
- IF 를 이용한 3가지 경우에 대한 분기문 제공
- 자료형은 없음
이런 특징을 갖고 있었다.
Fortran 1
컴파일러는 400줄이 넘어가면 컴파일이 안되고, 컴파일 결과물의 신뢰성도 낮았지만 코드 실행이 매우 빠르게 되었기 때문에 널리 보급되었다.
Fortran 2
모듈별 독립적인 컴파일 기능이 추가
Fortran 4
데이터 타입을 명시할 수 있게 되었고, 논리적 조건문이 추가되었으며, 서브프로그램에 매개변수를 전달할 수 있게 되었다. 1966년 ANSI (American National Standard Institute) 의 표준으로 등록되었다.
Fortran 77
1978년 ANSI의 새로운 표준
문자열 조작, 반복문에 대한 논리적 제어 (아마 breank continue를 말하는 것 같다.) 기능이 추가되었고,
IF-THEN-ELSE 구문이 추가되었다.
Fortran 90
모듈, 동적배열, 포인터, 재귀, Case (multiple selection), 파라미터의 데이터 타입 체킹 기능과 같은 중요한 기능들이 다수 추가되었다.
이후
객체지향, 함수 포인터, C언어로의 변환, block scope (local scope), 병렬 실행(Concurrent) 등의 기능을 제공하였다.
포트란은 컴파일러의 성능을 극대화하기위해 90버전 이전까지는 모든 변수의 타입과 변수의 크기가 정적으로 고정되었다.
그리고 포트란은 누구나 컴퓨터를 사용할 수 있도록 컴퓨터를 사용하는 방식을 바꾸는데 기여하였다.
Lisp (함수형 프로그래밍)
Lisp ( List Processing language )
AI 연구를 할 때 array가 아닌 list (연결 리스트) 에 데이터를 담아 처리하거나 숫자가 아닌 기호 기반의 연산을 자주해야했는데, 이 연산을 편하게 하기 위한 언어로서 MIT의 맥커시 라는 사람이 만들었다.
Lisp에는 atom, list 라는 2가지 데이터 종류만 있고, lambda calculus 기반의 문법을 갖고 있다.
이렇게 리스트를 괄호와 문자 기반의 기호로 표현한다고 한다.
Lisp는 함수형 언어로서 변수도, 할당자도 필요하지 않고 재귀와 조건문 표현을 통해 모든 흐름제어가 일어난다.
보통 Lisp에서 발전한 Scheme, Common Lisp 를 사용한다고 한다.
Lisp말고도 ML, Haskell, F# 등의 다른 함수형 언어들도 존재하며, Lisp와 전혀 다른 문법을 사용한다.
Scheme
MIT에서 1970년대에 개발한 언어로 작고 효과적인 함수형 언어이다.
static scoping 을 사용하는 것이 특징이다.
함수를 기본 단위로 사용하며, 작고 간단한 문법을 갖고있어 교육용으로 사용된다.
Common Lisp
여러 Lisp의 변종 언어들의 특징들을 하나로 모은 언어
크고 복잡하며, 큰 어플리케이션을 만드는 회사에서 사용된다.
ALGOL
현재 우리가 사용하는 언어들의 선조격 언어
등장 배경
Fortran이 IBM 700 시리즈를 위해 만든 언어다보니 IBM 700 시리즈에 종속적이었다.
다른 언어들도 모두 특정 기계에 특화되어있는 구조로 설계되었다.
그래서 어떤 기계에서도 공용으로 사용할 수 있는 언어를 만들고자하여 탄생한 언어가 ALGOL이다.
초기에 ACM, GAMM 이라는 학회가 서로 만나 공용으로 사용할 언어의 구조를 논의하였다.
언어의 목표
- mathematical notation 과 유사한 언어
- 알고리즘 구현에 좋은 언어
- 기계어로 번역될 수 있어야 함
- ALGOL58
변수의 이름 길이가 자유로웠고, 배열은 인덱스로 아무 숫자나 넣을 수 있었다.
매개변수는 in, out 이라는 모드에 따라 구분되었고, 배열의 인덱스를 기입할 때 [ ] 대괄호에 넣는 개념이 이때 처음 등장했다.
모든 프로그램은 begin end 사이에 작성되도록 구문 집합의 개념을 만들었고, 모든 각 statement 끝에는 ; 를 붙이게 한 것도 ALGOL이 처음이었다.
대입연산자로 := 기호를 사용하고, else if 의 개념도 있었다.
하지만 I/O 기능은 없었다. 이 기능은 특정 기계에 의존적인 기능이었기 때문이다.
- ALGOL 60
ALGOL58은 IBM의 지원아래 만들어졌는데, 1959년 IBM이 지원을 철회하면서 실제로 구현되지 못했다.
그래서 이를 조금 바꿔서 ALGOL60 이라는 언어를 만들기로 하였다.
ALGOL60은 블록 기반의 지역 스코프 개념, 함수의 재귀, 동적 배열 (배열의 크기가 변할 수 있다.), 매개변수에 값을 넘기는 방법을 2가지로 제공하는 등 새로운 기능이 추가되었다.
ALGOL은 알고리즘을 표현하는 언어로서 20년 이상 꾸준히 사용되었다.
모든 명령형 프로그래밍 언어의 기반이 되었고, 최초의 기계 독립적인 언어이기도 했다.
ALGOL은 최초로 BNF가 적용된 문법을 사용한 언어였다.
하지만 ALGOL은 미국에서밖에 사용되지 않은 한계도 있었다.
기게독립적으로 만들다보니 I/O 기능이 없었고, 너무 유연한 나머지 구현이 어려운 문제도 있었다.
당시 유명한 컴퓨터였던 IBM 컴퓨터의 지원도 부족한 것도 한계 중 하나였다.
COBOL
등장 배경
UNIVAC (맨 위에서 설명한 컴파일 시스템)은 FLOW-MATIC 이라는 프로그래밍 언어를 사용하기 시작했다.
미 공군은 AIMACO라는 언어를 사용했고, IBM은 COMTRAN 이라는 언어를 개발하고 있었다.
코볼은 FLOW-MATIC 이라는 언어에 기반한 언어였다.
FLOW-MATIC은 하이픈을 포함하여 12글자까지 이름을 지을 수 있었고, 수학 기호를 그대로 사용하는게 아니라 영어 이름을 붙여서 사용하는 특징이 있었다.
제일 큰 특징은 데이터와 코드를 완전히 분리한 점이었다.
모든 문장의 첫번째 단어는 반드시 '동사' 인 점도 특징이었다.
(이렇게 보면 마치 어셈블리언어와 비슷하게도 느껴진다.)
COBOL 디자인 목표
코볼은 펜타곤에서 군용으로 사용하기 위해 디자인되었다.
- 간단한 영어처럼 보일 것
- 기능이 좀 부족해도 좋으니 사용하기 쉬울 것
- 당시의 컴파일러 문제에 영향받지 않을 것
- 컴퓨터를 사용하는 누구라도 사용할 수 있을 것
이 언어는 컴퓨터 제조사들과 국방성 관계자들이 함께 디자인했다.
그 결과 처음으로 macro 라는 개념이 등장했다.
또 계층적인 데이터구조로서 record 가 등장했다. (C의 struct 키워드와 동일)
중첩된 조건문을 사용할 수 있었고, 변수명도 30글자까지 사용할 수 있도록 늘렸다.
그리고 코볼이 FLOW-MATIC에서 기반하였기 때문에 데이터와 코드가 완전히 분리되어 있었다.
코볼은 국방성의 도움 없이는 만들어질 수 없었을 것이다.
또한 여전히 많은 비즈니스 어플리케이션의 개발 언어로 사용되고 있다. (진짜..?)
Basic
설계 목표
- 이공계 학생이 아니더라도 배우기 쉬울 것 (즐겁고 친근한 언어)
- 숙제를 위해서 사용할 수 있을 것
- 혼자서도 사용할 수 있을 것
- 컴퓨터보다 사용자 친화적일 것
현재는 비주얼에서 파생된 Visual Basic 을 많이 사용한다.
최음으로 널리 사용된 time-sharing (시분할, 컴퓨터를 대화식으로 사용) 언어이다.
PL / 1
등장 배경
당시 비즈니스용 컴퓨터와 과학용 컴퓨터가 분리되어 있었고, 그 둘에서 사용하는 프로그래밍 언어도 따로따로 만들어져 있었다. (과학 분야 = Fortran, 비즈니스 = COBOL)
하지만 서로가 서로의 기능을 원하는 시점이 오기 시작했고, 이 둘을 통합한 하나의 컴퓨터와 하나의 언어를 만든 결과 PL/1이 등장했다.
초기 컨셉은 포트란 4를 확장한 것으로, 처음엔 NPL (New Programming Language) 로 불렸지만 1965년부터는 PL/1 으로 바뀌게 되었다.
PL/1의 특징 (기여)
- 최초로 사용자 레벨에서 concurrency(동시성) 적용
- 최초로 에러 핸들링 기능 제공
- selection 문의 재귀적 사용 기능 제공
- 최초로 pointer data type 제공
- 최초로 array corss section 제공
다만 문제점은, 너무 많은 기능을 포함하려고 하다보니 디자인이 깔끔하지 못했고, 너무 거대하면서 또 복잡했다.
(programmability와 readability가 떨어진다.)
APL & SNOBOL
APL과 SNOBOL은 초기의 동적 언어이다.
동적이라는 말은 데이터의 타입과 메모리 크기가 동적으로 바뀔 수 있다는 의미이다.
처음에는 자료형이 결정되지 않았다가, 변수에 데이터가 들어오면 그때 데이터에 맞게 메모리를 할당하고 자료형을 결정한다.
APL은 1960년에 나온 언어로 벡터와 행렬 연산에 특화된 언어다.
이와 관련된 많은 연산자가 존재해서 읽기에는 굉장히 좋지 않지만 행렬을 작성하기에는 매우 편했다고 한다.
SNOBOL은 1964년에 나온 언어로 문자열 패턴 매칭에 대해 강력한 연산자를 제공하는 것이 특징이다.
하지만 문자열이 문자의 배열인 만큼 속도가 굉장히 느렸다고 한다.
SIMULA 67 & ALGOL 68
SIMULA 67은 말 그대로 시스템 시뮬레이션을 위해 ALGOL 60, SIMULA 1 을 기반으로 만든 언어이다.
이때 처음으로 객체지향의 개념과, (지금은 잘 안쓰이는) Coroutines 라는 개념이 등장했다.
ALGOL 68 역시 ALGOL 60 을 기반으로 만든 언어이다.
알골 68의 목표는 orthogonality (다른 기능과의 충돌이 없는 것) 으로, 새로운 기능을 기존 기능과 충돌없이 추가하는 것이었다.
이때 사용자 정의 자료구조, 참조 개념, 벡터 같은 동적 배열과 같은 개념들이 추가되었다.
ALGOL 60보다 덜 사용됐지만, PASCAL, C 와 같은 절차 지향 언어에 큰 영향을 끼쳤다.
Pascal
1971년에 나온 구조적 프로그래밍 교육용 언어이다.
작고 간단하며 새로운 배워야 하는 개념이 없는 언어였다.
프로그래밍 교육 분야에서 널리 쓰였지만 C와의 경쟁에서 밀렸다.
C
1972년에 데니스 리치가 만는 언어이다.
BCLP, B, ALGOL 68 에서 진화한 형태의 언어이다.
다양한 연산자를 지원하였지만, 타입 체킹에는 약했다.
UNIX 운영체제를 통해 퍼져나갔고, 시스템 언어로 디자인음에도 다양한 분야에서 쓰이고 있다.
Prolog
절차지향적이지 않고, 이산수학에서 나오는 '논리' 부울대수 개념을 이용하여 프로그래밍하는 언어이다.
데이터베이스에 인공지능 관련 논리를 넣어둔 뒤, 그 논리에 맞는 데이터를 얻고자 할 때 사용한다.
꽤 큰 작업을 하기 때문에 느리고 비효율적이라고 한다.. (그럼 왜 쓰는거지)
Ada
PL/1을 기반으로 만든 언어로 많은 노력과 돈을 갈아서 만들었다고 한다.
최초의 프로그래머의 이름을 따서 만든 언어라고 한다.
특징은 아래와 같다.
- 패키지 (데이터 추상화 지원)
- 에러 처리
- C++의 템플릿과 유사한 Generic program unit
- 동시성 (Concurrency)
당시 알려진 모든 소프트웨어 공학과 언어 디자인의 개념을 모두 포함하는 언어이다.
최초의 컴파일러를 만드는 것이 너무 어려워서 언어가 만들어진지 5년 뒤에나 만들어졌다고 한다.
후속 버전으로 Ada 95가 있는데, 1988년에 만들어졌고 객체지향을 지원하기 시작했다.
공유된 데이터에 대한 제어 메커니즘을 개선하고 새로운 동시성 기능과 더 많은 라이브러리를 제공하기 시작했다.
하지만 이 언어는 C++의 등장에 의해 밀려났다고 한다.
객체 지향 언어
Smalltalk
제록스의 PARC (Palo Alto Research Crew) 에서 만든 임베디드 개발용 언어이다.
최초로 OOP에 대한 모든 기능을 다 구현한 언어라고 한다. (데이터 추상화, 상속, 동적 바인딩)
C++
C와 SIMULA 67을 기반으로 만든 언어로, SIMULA 67의 객체지향 개념을 일부 차용하여 객체지향 기능을 만들었다.
절차지향과 객체지향을 모두 지원하는 언어이다보니 크고 복잡한 언어이다.
OOP의 성장과 함께 급격하게 성장했고, 1997년 ANSI의 표준이 되었다.
Swift
Objective-C 의 대체로 2014년 나온 언어이다.
C#과 비슷하게 class와 struct라는 2가지 종류의 타입이 있다.
애플 계열 시스템 어플리케이션 개발시 사용한다.
Delphi
C++, Pascal, C# 과 모두 관련된 언어
객체지향 개념이 적용된 Pascal 으로부터 시작된 언어이다.
Java
선마이크로시스템사에서 1990년대 초에 개발한 언어이다.
C, C++이 임베디드 시스템에 적합하지 않아서 개발되었다.
C++에 기반하였는데, C++에서 struct union enum, 포인터 같이 unsafe한 개념을 제외하여 더 단순하게 만든 것이 특징이다.
오직 객체지향만을 지원하며, 참조 개념은 가지고 있지만, 포인터 개념은 갖고 있지 않다.
동시성 개념과 applets 에 대한 지원을 포함한다.
JAVA는 JVM (Java Virtual Machine) 개념과 JIT 컴파일러가 특징이다.
이를 통해 기계 종류에 상관없이 실행할 수 있다.
WEB (Script Language)
Perl
CGI(Computer Graphical Interface) 프로그래밍에 사용한다. (이 약어가 맞나..?)
JavaScript
넷스케이프로부터 시작하였다가, 선마이크로시스템사가 관리하는 언어이다.
클라이언트 사이드에서 HTML 안에 넣어서 사용하는 언어로, 동적 HTML 요소를 생성하기 위해 사용된다.
PHP
서버사이드에서 HTML에 스크립트를 넣어 동적으로 데이터를 추가히기 위해 사용한다.
자바스크립트와 마찬가지로 인터프리터 언어이다.
Python
Ruby
Perl과 파이썬을 대체하려고 만든 순수 객체지향 스크립트 언어이다. (모든 데이터가 객체이다)
잘 안쓰인다고 한다.
C#
C++, JAVA, Delphi 에 기반하여 .NET 개발 환경을 위해 만들어진 언어이다.
포인터, 델리게이트, 프로퍼티, enum 타입, 익명 타입 등 다양한 개념을 포함한다.
XSLT
XML 이 확장된 마크업 언어라면, XSLT는 XML 문서를 화면에 보여줄 때 스타일을 추가한다.
프로그래밍 개념도 조금 넣어서 반복문을 지원한다.
JSP
Java Server Page, 동적 웹 문서를 만드는데 사용하는 기술이다.
JSTL 은 JSP에서 사용하는 라이브러리이다. HTML에 프로그래밍 개념을 넣은 형태이다.
'CS > 프로그래밍언어론' 카테고리의 다른 글
[프로그래밍언어론] 6. C언어의 BNF 문법과 파싱 예제 (0) | 2024.04.17 |
---|---|
[프로그래밍언어론] 5. Lexical and Syntax Analysis (0) | 2024.04.17 |
[프로그래밍언어론] 4. Semantics (0) | 2024.04.16 |
[프로그래밍언어론] 3. Syntax 와 BNF, Parse Tree (1) | 2024.04.13 |
[프로그래밍언어론] 1. 프로그래밍 언어의 개념 (0) | 2024.04.10 |