Chapter 2 : 언어의 변천

Download Report

Transcript Chapter 2 : 언어의 변천

1
Chapter 2 – 언어의 변천
Outline
2.1
2.2
2.3
2.4
2.5
2.6
2.7
디지털 컴퓨터 이전의 언어
1950년대 : 최초의 프로그래밍 언어
1960년대 : 프로그래밍 언어의 폭증
1970년대 : 간결성, 추상화, 연구사항
1980년대 : 통합과 새로운 방향
1990년대 : World Wide Web 프로그래밍 (Java)
언어의 세대론과 미래
2
2.1 디지털 컴퓨터 이전의 언어
• 최초의 알고리즘
– 찰흙판, BC 1500 – 3000, 바빌론 근처 메소포타미아
– 60진법 사용 (현재 시, 분, 초 개념에 사용), 부동 소수점, 가감승제 가능
– 대수학 방정식 해결 ( “이것이 프로시저다” 표현 사용)
– if x < 0 then branch 개념 없음 (음수, 0 개념 없음)
– 알고리즘 반복 작성, 우수한 표기법이었음
• Euclid
– B. C. 300년, 최대공약수 알고리즘 (모국어 사용)
– 수에서 0 개념 없음, 수 1이 제수로 인식되지 않았음
– 특수 경우 반복 시킴
– 바빌로니아 사람들 보다 별로 진보되지 못함
3
2.1 디지털 컴퓨터이전의 언어
• Charles Babbage (1792 – 1871)
– Difference Engine
• 계산 처리를 위한 기계
• 유한 차 (finite difference)의 원리를 기본으로 함
– Analytical Engine : 현 디지털 컴퓨터의 원리 포함
• 현재 컴퓨터와 유사한 구조
• 프로그램과 자료를 주기억장치에 저장시키는 저장 개념 없음 (연산카드,
변수카드 사용)
– Ada Augusta(C Babbage 조수)
• 최초의 컴퓨터 프로그래머 (Analytical Engine 프로그래머)
• Ada의 ‘알고리즘 분석’에 대한 견해
“거의 모든 계산에서 성공적인 수행을 할 수 있는 매우 다양한 배치 방법들이
가능하다. 그리고 이들 배치 방법을 선택하는데 있어서 계산을 수행하는 기계
목적에 맞도록 여러 가지 고려해야 할 점들이 있다. 한 가지 중요한 고려 대상은
계산하는데 필요한 시간을 최소로 줄이는 배치 방법을 선택하는 것이다.”
4
2.1 디지털 컴퓨터이전의 언어
• 1930년대 – 1940년대
– 프로그래밍 표기에서 창조적인 것들이 급격히 증가
• Zuse의 Plan Calculus
• Turing의 Turing Machine
• Church의 Lambda Calculus
• Aiken의 Mark I
• von Neumann의 Flow Diagrams
디지털 컴퓨터의 초기 개발자에게 알려지지 않음
1957
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
FORTRAN I 
FORTRAN II 
 ALGOL 58
 ALGOL 60
FORTRAN Ⅳ 
5
 FLOW-MATIC
 CPL
SIMULAR I 
ALGOL W 
 LISP
 COBOL
 APL
 BASIC
 SNOBOL
 PL/I
SIMULAR 67 
 ALGOL 68
 Pascal
 Smalltalk 72
 BCPL
B
C
 Prolog
 CLU
 Mesa
 Scheme
 Euclid
FORTRAN 77 
 MODULAR-2
 Smalltalk 80
 Ada 83
FORTRAN 90 
 ML
 MinimalBASIC
 Oberon
 MODULAR-3
 ICON
 COMMON LISP
 C++  Miranda
QuickBASIC 
 Eiffel
 Ada 95
 ANSI C
VisualBASIC 
 Java
 2004 Y.H. Won, Hongik University.
All rights reserved.
6
2.2 1950년대 : 최초의 프로그래밍 언어
• 1950년대 초반
– 기계어 사용 (프로그램 저장 방식)
기호화
어셈블리 언어
- 기계 의존적
- 자연어와 상이한 구문
• 1950년대 중반
– Fortran (Formula TRANslation)
• 1954 – 57, John Backus에 의해 고안된 최초의 고급 언어
• Fortran II, Fortran IV, Fortran 66, Fortran 77, Fortran 90
• Fortran 컴파일러는 효율적인 기계어 코드를 생성
언어의 긴 생명
• 배열, 반복 구조, 분기문, 부프로그램 등의 특징은 이후 언어에 큰 영향
7
2.2 1950년대 : 최초의 프로그래밍 언어
• 1950년대 후반에 등장한 언어
– COBOL (Common Business-Oriented Language)
• 상업자료처리용
– ALGOL 60 (ALGOrithmic Language 60)
• 알고리즘 기술, 범용
– Lisp (LISt Processor)
• 기호연산, 리스트 처리용
– APL (A Programming Language)
• 배열처리용
8
2.2 1950년대 : 최초의 프로그래밍 언어
• 1950년대 후반
– COBOL (COmmon Business-Oriented Language)
• 1959 - 60, 미국방성의 Grace Hopper에 의해 고안
• 설계 목적
– 사용자들이 프로그램을 읽기 쉽고, 이해하기 쉽게 함
• 언어의 특징
– 레코드 구조 도입
– 자료구조와 실행 부분을 분리
– “PICTURE”를 써서 원하는 출력 양식의 가변성 부가
9
2.2 1950년대 : 최초의 프로그래밍 언어
• 1950년대 후반
– ALGOL 60 (ALGOrithmic Language 60)
• 1958 - 60, 알고리즘 서술을 위한 일반적인 표현 언어
• 언어의 특징
– 양식의 자유화(free format), 구조적 명령문, begin-end 블록,
변수 타입선언, 되부름, call-by-value 매개 변수 등의 개념 소개
– 스택 기반 실행 환경 도입
– Backus-Naur Forms(BNF)을 최초로 사용
10
2.2 1950년대 : 최초의 프로그래밍 언어
• 1950년대 후반
– Lisp (LISt Processor)
• 1950 년대 후반, MIT의 John McCarthy에 의해 고안
• 일반적인 리스트 구조와 함수의 적용을 기본으로 함
• 인공지능 분야 응용
• 언어의 특징
– 통일된 자료구조, S-expression
– 기본적인 계산 표기법에 함수 적용
– garbage collection 개념 소개
– 되부름의 원조
11
2.2 1950년대 : 최초의 프로그래밍 언어
• 1950년대 후반
– APL (A Programming Language)
• 1950 년대 후반에서 60년대 초반
• 하버드대의 K. Iverson에 의해 고안
• 언어의 장점
배열과 행렬에 대한 연산이 쉽고, 강력한 프로그래밍
• 언어의 단점
– 제어구조가 없음
– 특정 터미널에만 있는 그리스 기호 사용
– 프로그램 이해 난이
12
2.3 1960년대 : 프로그래밍 언어의 폭증
•
Sammet의 “Programming Languages: History and Funda Mentals”책 표지
13
2.3 1960년대 : 프로그래밍 언어의 폭증
•
1960년대 시대적 특징
–
초기 언어 성공
–
특별한 관심 분야나 목적
언어 개발 몰두
수백의 언어 탄생
• 예 : 그래픽, 통신, 보고서 작성 분야 등
–
•
대부분의 언어는 소멸, 소수 언어는 지대한 공헌
1960년대 등장한 언어
– PL/I (Programming Language One)
– Algol 68
– Simula 67
– Basic (Beginners All-purpose Symbolic Instruction Code)
14
2.3 1960년대 : 프로그래밍 언어의 폭증
•
PL/I
–
Fortran, Cobol, Algol 60의 장점 모두 수용
–
새로운 개념 추가 (병행성, 기억 장소 할당, 예외처리)
–
IBM의 막강한 지원
–
언어의 문제점 (방대)
•
번역기가 크고 작성이 어려움
•
실행 효율 저하
•
배우기 어려움, 오류 발생 유도
•
언어 특성들의 상호 작용으로 인한 신뢰성 저하
15
2.3 1960년대 : 프로그래밍 언어의 폭증
•
Algol 68
–
Algol60 + 타 언어의 여러 기능 + 표현력 있고 일관된 구조
–
새로운 특성 독자 개발
–
이론적으로 일관성 갖는 구조
–
일반적인 형 시스템, 직교성 강조 (수식 위주)
–
언어 기술
–
디자인 일관성, 파일 시스템, 실행 환경
–
범용 컴퓨터 사용 불가능 (비판
새로운 용어 과다 사용
우수
소수 구현)
16
2.3 1960년대 : 프로그래밍 언어의 폭증
•
특기 할 기타 언어
–
Snobol (StriNg Oriented symBOlic Language)
•
–
–
최초의 문자열 처리 언어, 패턴 매칭 기능 다양
Simula 67
•
객체 지향 언어(클래스 개념 최초 도입)
•
Simula I + Algol 60
•
시뮬레이션 목적
Basic (Beginners All-purpose Symbolic Instruction Code)
•
시분할용의 간결한 언어
•
마이크로 컴퓨터 이식 (교육용, 사무처리용, 가정용)
•
언어군 (ANSI 표준 : 1978 ‘minimal Basic’, 1988 ‘Standard Basic’)
•
후에 나온 Basic : 제어 구조, 변수 선언, 프로시저 추가
17
1970년대 : 간결성, 추상화, 연구 사항
•
•
1970년대 초반 언어의 특징
–
60년대의 혼돈 후
–
Niklaus Wirth : Algol 68 디자인에 반발 (방대성)
–
Wirth + Hoare : Algol W 제안
간결성과 일관성 추구
1970년대 초반에 등장한 언어
–
–
Pascal (1971, Wirth)
•
작고, 간결하고, 효율적이고, 구조적이며, 프로그래밍 교육용
•
분리 컴파일, 유용한 문자열 조작, 입출력 기능
삭제 또는 축소 (성공적)
C 언어 (1972, Dennis Ritchie)
•
Pascal 과는 다른 각도의 간결성
•
수식 위주로 형 시스템과 실행환경 축소, 하드웨어 접근 용이
•
중급 언어로 분류 : 기계 접근성 강화 (고급 언어와 상반 개념)
•
운영체제 프로그래밍용 (Bliss(1971), Forth(1971))
•
C 언어로 작성된 UNIX 성공
★ C, Pascal
C 언어 대중화
간결성, 디자인 일관성 (소그룹의 고안) : 성공 요인
18
1970년대 : 간결성, 추상화, 연구 사항
• 1970년대 중, 후반 언어 특징
– 자료 추상화, 병행성, 증명 등의 메커니즘을 집중적으로 시도
– 1970년대 중, 후반에 등장한 언어
– CLU (1974-77, MIT의 Babara Liskov)
• 추상화 기법을 위한 일관성 있는 접근 방식
자료 추상화, 제어 추상화, 예외처리
• 자료 추상화 : cluster (Simula의 class와 유사)
• 제어 구조 : iterator - 일반성
• 예외처리 : Ada와 비슷한 구조 제안
19
1970년대 : 간결성, 추상화, 연구 사항
•
1970년대 중, 후반에 등장한 언어
– Euclid (1976-77, 토론토(Toronto) 대학)
• Pascal을 개선한 언어
• Pascal의 단점인 이명(aliasing) 개선, 자료형의 추상화, 프로그램 증명 보조 추가
• 프로그램의 형식적 검증을 목적으로 한 최초 언어
–
Mesa (1976-79, Xerox사 Palo Alto 연구소)
• Pascal 구조에 모듈 구조, 예외처리기, 병행성, 병렬 프로그래밍의 개념 추가
• 시스템 프로그래밍용
Modula-2 메커니즘 고안에 지대한 영향
20
2.5 1980년대 : 통합과 새로운 방향
•
•
1980년대 언어의 특징
–
Ada 등장(개념 통합)
–
함수형 언어에 새로운 관심 부여 - 스킴(Scheme), ML(Meta Language) 개발
–
논리형 프로그래밍 언어 - Prolog 등장
–
객체 지향 언어에 대한 활발한 연구 및 개발
1980년대 등장한 언어
– Ada
• 자료 추상화, 타입 메커니즘(package), 병행 처리(task), 예외처리기 도입
• 디자인이 섬세하고 상세함, 사용 급증
• 단점 : 복잡 방대 (제 2의 PL/I 가능성)
21
2.5 1980년대 : 통합과 새로운 방향
• 1980년대 등장한 언어
– Modula-2
• 1982-88, Modula 언어를 기본, 운영체제 구축용( N. Wirth)
• Pascal의 디자인에 결점 보완(당시 실험적 언어)
• 추상화, 부분적 동시처리 개념
• 내장형 시스템 프로그래밍 목적 : 하드웨어 접근이 용이한 다목적 언어
• 교육 목적으로 인기
• 가능한 한 소규모의 간결한 언어로 시도
예외처리기능 등 제외
22
2.5 1980년대 : 통합과 새로운 방향
• 1980년대 등장한 함수형 언어
– 스킴(Scheme)
• 1975-78, MIT의 Gerald J. Sussman과 Guy L. Steele, Jr. 개발
• Lisp 언어 개정
• Lisp보다 획일적이고, lambda calculus에 가깝게 설계됨
–
Common Lisp : 표준
–
ML (meta language)
• 1978, 에딘버러(Edinburgh) 대학의 Robin Milner 개발
• 기존 함수형 언어와 상이 함
• Pascal과 유사하나 유연성 (문법, 타입 체킹)
– Miranda
• 1985-86, 맨체스터 대학의 데이비드 터너(David Turner)가 개발
23
2.5 1980년대 : 통합과 새로운 방향
•
1980년대 등장한 언어
– Prolog (1972- , A. Colmerauer의 그룹)
• 논리형 언어
• 인공지능 분야에서 많이 사용
– SETL (뉴욕 대학(NYU)의 J. Schwartz)
• 집합론을 프로그래밍 언어로 시도한 것 (미적분, 수학의 교육 모델로 사용)
• 구현 결핍
– Smalltalk (1972-80, Xerox사의 Alan Kay, Dan Ingalls)
• 객체 지향 언어의 모범
–
C++ (1980, Bjarne Stroustrup)
• C 언어를 확장한 객체 지향언어
–
Eiffel (1980년대 중반, Bertrand Meyer)
• Pascal에 가까우면서 일관성 있는 객체 지향 언어
24
2.6 1990년대 : World Wide Web 프로그래밍 (Java)
•
1990년대 언어의 특징
– 제 4세대 언어 대두
• 응용문제를 빠르게 구현
• 실사용자가 직접 프로그래밍
• 데이터 베이스를 쉽게 처리
– HTML, Java 등장
•
1990년대 등장한 언어
– Java언어
• James Gosling 설계 팀장
• C++ 기반 : 많은 구조 삭제, 일부 구조 변경, 일부 구조 추가
– C++의 강력함과 유연성 제공
– C++ 보다 규모는 작아지고, 더 간결하고, 신뢰성이 증가 된 언어
• 한 응용 분야 목표 : 내장 시스템
• Java의 응용분야가 확장 됨
Web 프로그래밍 (C/C++결점 보완)
25
2.6 1990년대 : World Wide Web 프로그래밍 (Java)
•
Java의 특징 : 간결성과 신뢰성 제공 원칙
–
자료형, 클래스 제공
–
기본 자료형 : 스칼라 형 제공
–
배열 – 미리 정의된 클래스 객체로 제공(C++와 구별)
–
포인터 삭제
•
참조형 제공
포인터 – 기억장소 지시, 참조형 – 객체 지시
–
논리형 제공 ( 산술 연산에 사용 불가 : C/C++와 구별),
–
부프로그램 제공 안함
–
단일상속
–
동시성 제공 (synchronize) - Thread
–
쓰레기 수집
–
묵시적 형 변화 – 확대형 변환 ( widenning)
–
중간 언어 제공 (이식성 증가)
–
Java 애플릿 - 클라이언트에서 실행
–
프로그래머 – Java선호 (C++기피)
클래스 메소드 제공
다중 상속 변칙 사용 (인터페이스 사용)
26
2.7 프로그래밍 언어의 세대론과 미래
• 프로그래밍 언어의 세대구분(견해에 따른 2가지 분류)
• 제 1 세대 – 어셈블리 언어
• 제 1 세대 – 기계어
• 제 2 세대 – 비구조형 고급 언어
• 제 2 세대 – 어셈블리 언어
• 제 3 세대 – 구조형 고급 언어
• 제 3 세대 – 고급 언어
• 제 4 세대 – 화일처리(SQL등)
• 제 4 세대 – 화일처리(SQL등)
• 제 5 세대 – 초 고급 언어
• 제 5 세대 – 초 고급 언어
Fortran, Cobol,Basic 등 : 비구조형 언어
PL/1,Pascal, C 등 : 프로시저 위주의 고급 언어
Prolog, SETL등 : 초고급 언어
27
2.7 프로그래밍 언어의 세대론과 미래
•
4세대 언어의 특징
–
소프트웨어의 위기 (software crisis)
–
4세대 언어들은 데이터베이스 시스템을 위해 만들어진 명령어로 출발
에디터(editor)나 디버거(debugger), 서류작성기나 제어용 유틸리티와 같은
개발도구들과 함께 디자인 환경에 포함
–
대표적 예 : SQL(Structured Query Language), Lotus, Delphi 등
–
거대한 화일 처리 응용 프로그램을 몇 개 안 되는 코드로 신속하게 작성
–
언어 설계 이론에 공헌한 바는 작지만 실용성 큼
–
최근의 Visual Basic, Visual C++, Power Builder도 이 부류에 속함
28
2.7 프로그래밍 언어의 세대론과 미래
•
명세 언어
–
사용자가 원하는 바를 서술하면 시스템이 요구 사항을 구현해 주는 언어
–
1979, Winograd의 명세 언어에 대한 견해
“고급 언어는 기계어 코드의 복잡함과 난해함을 탈피할
수있게하며 ,고급언어시스템은
복잡한 시스템이나 구성 요소를 이해하여 다룰 수 있게 한다.
이제는 알고리즘의 세부적인 명세로부터 떠나서 우리가 작성한 패키지나 객체의
성질을 기술하는데 집중시킬 필요가 있다. 즉, 새로운 세대의 프로그래밍 도구가
될 조건은 프로그래밍 시스템이 명령이 아닌 선언인데, 즉 프로그램의 주작업이
알고리즘을 수행하는 명령문들의 나열보다는 계산과정과 계산이 수행되는 객체
(object)를 묘사하는 작업을 수행하는 방향으로 가게될 것이다.”
논리형 언어와 제 5세대 언어가 시도하는 바를 기술
- 이런 언어들은 모범안을 빠르게 기술하는 방법만을 제공
29
2.7 프로그래밍 언어의 세대론과 미래
• 소프트웨어 위기 (software crisis)의 극복
– 언어적 기술보다는 조직적인 방법으로 해결
• 기존 코드의 재사용 증대
• 이식성 증대
• 문법 위주의 에디터를 사용하여 프로그래머의 생산성 높임
• 언어 설계의 미래
– 하드웨어와 컴퓨터 구조의 발달에 의해 영향 받음
– 새로운 언어의 출현보다는 기존 언어들을 갈고 닦아, 언어 설계에 대한
이해를 점진적으로 증가시키는 방향으로 예상됨