520 likes | 756 Views
프로그래밍 언어의 발전사. Plankalk Ü l. 독일의 과학자 Kornard Zuse 가 1945 년 개발 — 1972 년 출판 실제 구현되지는 않음 언어의 개요 비트 최소의 타입 정수 및 부동소수점 타입의 기초 배열 및 레코드 예 ) 배열을 이용한 계산 A(5) A(4) + 1 에 대한 표현 | A + 1 => A V | 4 5 레이블 V 는 첨자행임을 표시
E N D
PlankalkÜl • 독일의 과학자 Kornard Zuse가 1945년 개발—1972년 출판 • 실제 구현되지는 않음 • 언어의 개요 • 비트 • 최소의 타입 • 정수 및 부동소수점 타입의 기초 • 배열 및 레코드 예) 배열을 이용한 계산 • A(5) A(4) + 1에 대한 표현 | A + 1 => A V | 4 5 레이블 V는 첨자행임을 표시 S |1.n 1.n 레이블 S는 데이터 타입행임을 표시, 1.n은 n비트의 정수를 표시 • Pascal for 문과 유사한 반복문 • Else 절이 없는 선택문
Short Code • 1949년 BINAC 컴퓨터를 위해 개발 • 기계어와 어셈블리어의 중간 형태---해석방식으로 수행 • 연산자 및 피연산자를 바이트의 조합으로 표현 • 1 바이트를 6비트, 1 워드를 12바이트로 표현하여 하나의 명령문을 표현 예) X0 = SQRT(ABS(Y0)) 00 X0 03 20 06 Y0 • 첫 00: 한 워드를 채우기 위해 사용 • 03: = • 20: SQRT • 06: ABS
Speedcoding • 1954년 IBM 701 컴퓨터를 위해 개발 • 기계어와 어셈블리어의 중간 형태---해석방식으로 수행 • 기계언어를 확장한 가상시스템 • 부동소수점에 대한 의사명령어(pseudoinstruction) 및 수학함수 등을 해석 방식으로 수행 • 기계어로 프로그래밍 했을 때보다 수 십 배의 프로그래머 생산성 향상
FORTRAN • 세계 최초로 광범위하게 채택된 고급 언어 • 1954년 11월에 제안된 FORTARN 0 ~ FORTRAN 90까지 발전 • FORTRAN 0 • IBM 704 컴퓨터를 위한 언어로 제안 • 보고서: “The IBM Mathematical FORmula TRANslating System: FORTRAN” • 개발 환경 • 느리고 상대적으로 신뢰성이 없었음 • 과학 계산 분야에 주로 사용 • 프로그래밍에 대한 효율적 방법이 없었음 • 컴퓨터 비용이 프로그래머의 비용보다 컸으므로 효율적인 목적 코드가 중요
FORTRAN I • FORTRAN 0의 수정 구현; 1957년 4월 완성 • 변수명 6자로 제한 • 데이터 타입문이 없다 • I,J,K,L,M,N으로 시작되는 변수정수형 • 그외 부동소수점형 • 개별적으로 컴파일할 수 없는 사용자정의 서브루틴 • IF 선택문: IF (산술식) N1, N2, N3 • 산술식 < 0 GOTO N1 • 산술식 = 0 GOTO N2 • 산술식 > 0 GOTO N3 • DO 루프: DO N1 변수 = 최초값, 최종값 • N1: 루프의 마지막 문장에 대한 레이블
FORTRAN II • 1958년 봄에 발표 • FORTRAN I 에 포함된 에러 수정 • FORTRAN I 에 기능 추가서브루틴의 독립 컴파일 기능
FORTRAN IV, 77 • FORTRAN IV • 1962년 발표~1978년 까지 FORTRAN표준 • 변수의 명시적 선언 허용 • 논리 IF문 • 부프로그램을 매개변수로 사용 가능 • FORTRAN 77 • FORTRAN IV의 기능 + 문자 스트링 처리, 논리 루프 제어문, ELSE IF문
FORTRAN 90 • 배열 연산을 위한 다양한 내장 함수 제공 • 동적 배열 생성 • 레코드 및 포인터 • 새로운 제어문의 추가 • CASE • EXIT: 루프로부터 탈출 • CYCLE: 루프 내부의 마지막 문장으로 GOTO • 재귀적 부프로그램 가능 • 모듈 • 데이터 선언 및 부프로그램을 포함 • PUBLIC 및 PRIVATE 선언 가능
FORTRAN 언어의 특징 • 변수의 타입과 기억 장소가 컴파일 시 결정(FORTRAN I, 90 제외) • 단순성 및 효율성을 위함 • 재귀적 부프로그램 불가능 • 동적으로 형태를 키우거나 변경 가능한 데이터 구조의 구현을 어렵게 함 • 수치 분야 응용, 단순한 프로그램 위주
함수 프로그래밍: LISP • 1950년대 중반 인공지능에 관한 관심 태동 • 언어학자: 자연언어처리 • 심리학자: 인간의 정보처리능력의 형상화 • 수학자: 정리의 증명 기호적인 데이터를 연결 리스트로 처리할 수 있는 능력의 언어 필요성 대두 • MIT의 John McCarthy의 연구 • 대수식의 기호적 미분 연구로부터 언어 요구 사항을 알고자 했음 리커젼(recursion), 조건식---수학함수의 제어 흐름 동적으로 할당되는 연결 리스트, 폐기된 리스트의 묵시적 회수
LISP의 데이터 구조 • 원자(atom) • 식별자 형태의 기호 • 수치 리터럴 • 리스트 • 괄호로 원소들을 구분 예) (A B C D) : 원소가 원자들로만 구성 (A (B C) D (E (F G))): 4개의 원소 • 첫 원소: 원자 A • 둘째 원소: 부분 리스트 (B C) • 셋째 원소: 원자 D • 넷째 원소: 부분 리스트 (E (F G)) • 교 P 60 그림 2.2 참조
LISP의 처리 • 함수를 인자에 적용하여 처리 • 배정문, 변수가 필요 없다 • 반복 함수의 재귀 호출 • 데이터 및 프로그램이 같은 형태 예) (A B C D) • 데이터: 4개의 원소를 갖는 리스트 • 프로그램: 매개변수 B, C, D를 함수 A에 적용
LISP의 후손 언어 • Scheme • 1970년 중반에 MIT에서 개발 • 비교적 적은 규모의 lisp 구현 • 교육분야에 적합 • COMMON LISP • 1980년대 중반에 개발 • 여러 변형의 lisp을 통합
정교화를 향한 첫 단계: ALGOL 60 • 후속 프로그래밍 언어들에 지대한 영향 • 50년대 후반의 언어 급증에 대한 반발 • IBM의 독점 소유인 FORTRAN 이상의 범용 언어를 개발하고자 유럽을 중심으로 위원회 결성 • GAMM(German acronym for Society for Applied Mathematics and Mechanics), ACM(Association for Computing Machinery)과 함께 설계 작업
ALGOL의 설계 목적 • 언어의 구문은 가능하면 표준수학기호에 가까워야 하고, 이 언어로 작성한 프로그램은 다른 설명이 필요 없을 정도로 판독성을 지녀야 한다 과학 계산 용 • 출판물에서 계산 과정의 서술에 이 언어를 사용하는 것이 가능하여야 한다 • 새로운 언어로 작성된 프로그램은 기계적으로 기계 언어로 번역될 수 있어야 한다
ALGOL 60의 개요 • 블록 구조 개념의 도입; 전역 및 지역 • 매개변수 전달 • 참조-전달 • 값-전달 • 재귀적 프로시저 • 스택-동적 배열(stack-dynamic array)의 허용 • 첨자 범위로 변수를 사용 가능 • 형식(formatted) 입출력문의 생략 • 기계 종속적이므로
ALGOL 60의 평가 • 긍정적인 면 • 알고리즘을 기술하는 공식 언어 역할 • 60년대 이후 개발된 언어들에 많은 영향 • PL/I, SIMILA 67, ALGOL 68, Pascal, Ada, C++, Java 등 • BNF의 사용 시작을 계기로 형식언어, 파싱이론, 컴파일러 설계 등의 연구 토대가 됨 • 실지로 프로그래밍에는 많이 사용되지 않음 • 실지 구현의 어려움 • 입출력문의 결여 • FORTRAN의 확고한 위치 및 IBM의 지원 결여
사무작업의 전산화: COBOL • 1960년 COBOL 60 이후 74, 85년에 ANSI에 의해 표준화 • 미 국방성이 사용을 공식적으로 지정 • 회계 분야의 전산화 이룸 • 언어 설계의 기준 • 영어를 가능하면 많이 사용 • 사용의 수월성 • 구현 측면과 비교적 독립적
COBOL (계속) • 특징 • 데이터 기술 부분과 실행 연산 부분으로 따로 프로그래밍 • 수치형 변수는 십진소수점 포함 가능 • 예) BAL-UNIT-PRICE PICTURE IS 9999V99. • 최초의 계층적 데이터 구조 구현 • 30자까지의 긴 이름 허용 • 초기에는 비효율적이었으나 • 컴파일러 설계 기술 개선 • 고속의 CPU • 메모리 용량의 발달로 사용이 확산됨
시분할의 발단: BASIC • 1964년 Dartmouth 대학교의 J. Kemeny와 T. Kurtz가 교양과정 학생들을 위해 개발 • 언어 설계의 목적 • 비 과학 전공 학생들이 배우고 사용하기가 쉬워야 한다 • 사용자에게 즐거움을 주고 친숙해야 한다 • 숙제를 원활히 할 수 있도록 빠른 작업 처리 시간을 제공해야 한다 • 자유롭고 개인적인 접근을 허용해야 한다 • 사용자 시간을 컴퓨터 시간보다 더욱 중요하게 생각해야 한다
BASIC (계속) • 초기의 BASIC • 14개 문장 종류 • 수치 데이터 타입: Numbers • 정수 및 부동소수점을 구분하지 않음 • BASIC의 발전 • Minimal BASIC • ANSI, 1978 • 언어의 최소 특징만을 포함하여 초기의 BASIC과 유사
BASIC (계속) • BASIC의 발전(계속) • BASIC-PLUS: 70년대 • BASIC의 정교한 버젼 • PDP-11 운영체제의 일부 코드 작성 • Quick BASIC: PC용, 80년대 후반 • Visual BASIC: PC용, 90년대 초반~
모든 사람을 위한 모든 것: PL/I • 역사적 배경 • 1963년 초반 새로운 컴퓨팅 요구의 태동 • 과학계산분야: 대형 데이터 파일 처리의 필요성 대두 • 사무 응용분야: 회귀분석의 사용 시작---부동소수점 및 배열의 필요성 • ===> 단일 범용 컴퓨터의 요구: IBM System/360 계열의 탄생 • ===> 과학 및 사무응용분야 프로그래밍 언어 요구 (+ 시스템 프로그래밍 및 리스트 처리 요구)
PL/I (계속) • 특징 • ALGOL 60 (리커젼과 블럭 구조) + FORTRAN IV (전역 데이터에 의한 통신 기능을 가진 개별 컴파일 기능) + COBOL 60 (데이터 구조, 입력/출력, 보고서 생성 기능) • 동시에 실행하는 태스크의 생성 허용 • 예외 처리 기능- 실행 시간 오류 탐지 및 처리 • 재귀적 프로시저 (효율적 코드 생성을 위해 불허용도 가능) • 포인터 데이터 타입 • 배열의 일부분에 대한 참조 • 예) 배열의 세 번째 행을 벡터로 간주 가능
PL/I (계속) • 평가 • 많은 구조들의 성공적 결합 실패 ==> 언어 설계에 대한 경험 부족이 원인 • E. Dijkstra의 비판 • “프로그래밍 언어--우리의 기본 도구--가 단순한 현란함 때문에 우리의 지적 제어 능력을 벗어날 때, 우리는 커지고 있는 프로그램을 계속해서 우리의 지적 범위 안에 유지할 수 있는 방법을 전혀 알지 못한다” • 사용의 관점에서는 부분적으로 성공 • 70년대에 사무 및 과학분야에 많이 사용 • 부분 집합이 교육용으로 사용됨: PL/C, PL/CS
초기 동적 언어: APL과 SNOBOL • 공통 특성 • 동적 타입 및 동적 기억 장소 할당 • 동적 타입 • 변수는 타입을 반드시 표시하지 않아도 되며 값이 배정될 때 타입을 갖게 됨 • 동적 기억 장소 할당 • 변수의 기억 장소는 값이 배정될 때만 할당됨
APL • “A Programming Language” • 1960년 IBM의 K.E. Iverson에 의해 설계 • 컴퓨터 구조를 기술하는 수단으로 • 특징 • 강력한 많은 연산자==> 표현력은 높으나 판독성 떨어뜨림 • IBM 프린팅 터미널 사용해야 • 배열을 스칼라 변수처럼 다룰 수 있게 허용 • 신속한 프로그램 작성 <==> 유지보수의 어려움: 1회용 프로그램 작성
SNOBOL • 60년대 초반 벨 연구소의 Farber, Griswold, Polensky에 의하여 설계 • 텍스트 처리용 • 스트링 패턴 매칭을 위한 강력한 연산자들 보유
데이터 추상화의 발단: SIMULA 67 • SIMULA I • 1964년 노르웨이 컴퓨팅 센터의 Nygaard와 Dahl이 개발 • 모의 실험을 위해 개발 • SIMULA 67 • 범용적인 응용분야에 사용될 수 있도록 확장한 것
SIMULA 67 (계속) • 특징 • 코루틴(coroutine) 기능 • 실행이 중단되었던 부분부터 다시 시작할 수 있는 부 프로그램 • 시뮬레이션 응용의 특징---호출자와 피호출자가 대등한 관계를 가짐 • 클래스 구조 • 데이터 구조 • 데이터 구조를 조작하는 루틴들 • 사례(instance) • 지역 데이터 포함 가능 • 사례의 데이터 구조를 초기화하여 사용
직교적 설계: ALGOL 68 • 특징 • 사용자-정의 데이터 타입 • 기본적 타입과 구조체로 다양한 결합 허용 • 중요성: 특정 문제에 적합한 데이터 추상화 • 동적 배열 데이터 타입의 최초 허용 • 첨자 범위를 명시하지 않는 배열 • 기억장소 할당: 값이 배정될 때
ALGOL 68 (계속) • 평가 • 많은 직교성의 허용을 통한 작성력 <==>PL/I (많은 고정된 구조로 작성력 높임) • 과학 응용분야 용 • van Wijngaarden 메타 언어를 사용하여 기술===> 사람들에게 거부감 • IBM의 PL/I에 대한 장려 + ALGOL68을 이해하고 구현하는데 어려움 ===> PL/I의 보다 광범위한 사용
설계의 단순성: Pascal • 1971년 Wirth (“Virt”로 발음)가 개발 • ALGOL 60에 기반을 둔 단순성 및 표현력이 뛰어난 언어 • 프로그래밍 교육 목적으로 설계 응용 분야에는 필수적인 사항이 일부 빠짐 예) 가변 길이 배열을 매개변수로 못 가짐 부 프로그램별 개별 컴파일 기능이 없음
이식성이 있는 시스템 언어: C • 1972년 벨 연구소의 Ritchie가 개발 • BCPL 및 B, ALGOL 68의 영향 • BCPL 및 B의 특징 • 타입이 없음: 모든 데이터가 기계 워드 복잡성/비안정성 초래 • 1989년 ANSI C로 표준화 • UNIX 운영체제의 일부로서 80년대에 인기
Delphi • Pascal에 기반을 둔 객체지향 언어 • C에 기반을 둔 C++보다는 간단하고 안전성 높음 • GUI 기능 제공
논리 기반 프로그래밍: Prolog • 술어해석학(predicate calculus)에 기반을 둠 • 술어해석학: predicates, subjects, quantifiers에 각각 심볼을 사용하여 규칙이나 사실을 나타내고 추론하는 방식 예) X.(mother(mary,X) male(X)) • mother, male: predicates • ( ) 안에 든 것: subjects • : quantifier • mary는 X의 어머니이고 X는 남자인 X가 존재한다mary에게 아들이 있다
Prolog(계속) • 1972년 Marseille 대학에서 첫 prolog 인터프리터 개발 • 특징 • 지능형 데이터베이스의 역할 • 사실(fact)과 규칙(rule)으로 구성 예) 사실: mother(joanne, jake). joanne은 jake의 어머니 father(vern, joanne). vern은 joanne의 아버지 규칙: grandparent(X, Z) :- parent(X, Y), parent(Y, Z). X가 Y의 부모이고, Y가 Z의 부모이면 X는 Z의 조부모이다. • 질의를 통해 문제 해결 예) father(bob, darcie). bob이 darcie의 아버지인가? prolog 인터프리터가 해를 도출
Prolog(계속) • 평가 • 비효율성 • 제한된 응용 분야 • 데이터베이스 관리 시스템 • 자연어 처리 • 전문가 시스템
역사상 최대 설계 노력: Ada • 배경 • 1974년 DoD (Department of Defense) • 컴퓨터 응용분야의 절반이 내장시스템(embedded system) 450여가지 프로그래밍 언어 사용 • 유지보수 측면에 문제 야기 • 설계 • 1975년 국방성을 중심으로 공개 경쟁 형식으로 설계를 시작 • 1980년 MIL-STD로 정함 (MIL-STD 1815) • 1983년 ANSI에서 Ada를 표준화 • 1985년 컴파일러 개발 (높은 복잡도 )
Ada (계속) • 특징 • 패키지 • 데이터 객체, 데이터 타입 명세, 프로시저 등을 캡슐화 보여줄 부분과 보여주지 않을 부분을 명시 예) 교 p 492 아래 부분 • 예외처리 • 포괄적 프로시저(generic procedure) • 같은 방식으로 처리하나 데이터 타입만 다른 경우를 처리하기 위함 • 특정 데이터 타입으로 처리할 때는 해당 타입으로 실체화(instantiation) 시킴 • 코드의 재사용성을 높임 예) 교 p 426, 425
Ada (계속) • 특징 • 랑데부(rendezvous) • 태스크 간의 통신 및 동기화 기법 • 태스크---Ada 동기화 프로그램 작성 단위 예) 교 p 595 아래부분~596 윗부분
Ada 95 • Ada 83에 대한 개선 • GUI • 객체 지향 프로그래밍 • 더 유연한 라이브러리 • 공유 데이터에 대한 보다 나은 메카니즘
객체지향 프로그래밍: Smalltalk • 객체 지향 프로그래밍의 본질 • 문제에 속한 실세계 객체를 식별 • 객체에 필요한 프로세스를 식별 • 객체들간에 필요한 통신에 대한 모의 실험을 생성 • Smalltalk의 기원: Dynabook • 1960년대 후반 Utah 대학의 Alan Kay의 박사 학위 논문 • 강력한 데스크 탑 컴퓨터 사용 • 초당 백만 이상의 명령어 수행 • 수 메가 바이트의 기억 장소 • 강력한 인간 인터페이스: 비 프로그래머에 의한 사용 • Inerim Dynabook: Xerox Alto HW + Smalltalk-72 • Smalltalk-80
Smalltalk • 언어 개요 • 소프트웨어 개발 환경 • 객체 • 프로그램의 단위 • 지역 데이터를 가질 수 있음 • 연산(메소드)의 모임 • 메소드 • 계산의 수단 • 메시지를 받을 때 자신이 속한 객체의 반응을 명세 • 클래스 • 객체에 대한 추상화 • 객체: 생성된 사례 • 계층구조를 가질 수 있음
Smalltalk (계속) • 평가 • Window의 원조 • 객체 지향 소프트웨어 설계 방법론/언어의 원조
명령형 특징과 객체지향 특징의 결합: C++ • 설계과정 • 클래스를 가진 C(“C with classes”) • 1980년 Bell 연구소의 Stroustrup이 설계 • C에 클래스를 추가 • C++ • 1985~1990 • 가상함수, 함수 이름, 연산자 중복, 참조 타입, 다중 상속, 추상화 클래스, 템플리트, 예외 처리 등을 추가
C++ • 평가 • 장점 • 성능 좋고 가격 저렴한 컴파일러 존재 • 하향 호환성 • 대중성 • 단점 • 규모가 크고 복잡 • C의 안전하지 못한 부분 보유 • 관련 언어 • Eiffel • 규모가 작고 단순하나 C++과 유사한 작성력 및 표현력 • 보급 실패 이유 • C와 호환 불가능 • 상대적으로 비싼 컴파일러
World Wide Web 프로그래밍: Java • C++보다 • 규모가 더욱 작고 • 더욱 단순하고 • 더욱 신뢰성을 갖춘 언어 • 1990년 Sun 마이크로시스템 사의 J. Gosling이 이끈 팀이 설계 • J. Gosling: emacs, NeWS 윈도우 시스템 등을 개발
Java • 언어 개요 • 포인터 대신 참조를 사용 • 포인터: 기억장소 주소를 가리킴 • 참조 • 객체를 가리킴 • 참조의 산술 연산은 의미가 없음---오류 소지를 줄임 • 독립적 부 프로그램이 없음 • 모든 부프로그램은 클래스에 속함 • 다중 상속의 결여 • 동시성 프로세스(thread)의 쉬운 생성