Chapter 2 역사 1950 년대 : 첫번째프로그래밍언어 1960 년대 : 프로그래밍언어들의난리법석 1970 년대 : 단순성, 추상성, 프로그래밍언어론 1980 년대 : 객체지향프로그래밍 1990 년대 : 인터넷, API, 스크립트언어
수학그리고프로그램 프로그래밍언어 컴퓨터의진화의영향 수학표현의발전의영향 수학그리고프로그램 수학자들은어떻게하느냐보다는무엇이냐에더중점을둠 무엇 : 특성, 정리 어떻게 : 알고리즘, 프로시져, 프로그림 B.C.600 년그리스이전에는모든수학이프로그래밍이었음 Programming Languages 2
바빌론프로그램의예 아주오랜옛날, 연산이란게있었음 바빌론스타일표현 [Knuth 1972] 네모난저수지가있는데. 가로길이와높이는같다. 그저수지를만들려고판흙들이있는데. 이흙들의부피는 120 이다. 저수지의가로길이는 5 다. 저수지의세로길이는? // 너무평이하므로번역할필요없음 Add 1 to 5, getting 6. Divide 6 into 120, obtaining 20. Divide 5 into 20, obtaining the width, 4. This is the procedure. Programming Languages 3
바빌론프로그램의추가설명 기하학적인해결책을보이고있음 Area + Volume = T (120 in the example) Area = length width Volume = length width height height = length In code: = * + * * Solving for the width: = / ( + * ) = T / (1 + ) / Programming Languages 4
초기의역사 해석엔진 찰스배비지 (1830s-40s) 기계적컴퓨터 입출력방법 : 펀치카드 최초의프로그래머 ( 여자임 ) 어거스타에이다러브레이스백작부인 (Ada Augusta, Countess Lovelace) 시인바이런의딸 프로그래밍언어에서사용되는중요한개념인루프, 점프, IF 문과같은제어문, 서브루틴에관한개념고안 Programming Languages 5
1950 년대 기초적인프로그래밍언어 기계어코드 어셈블리어 : 심볼과니모닉은있으나여전히기계 종속적임 ( 중요 중요!) 선구자적인고수준언어들 임퍼러티브언어 포트란 (FORTRAN) 코볼 (COBOL) 알골 (Algol60) 함수언어 리스프 (LISP) APL Programming Languages 6
FORTRAN ( 중요!) FORmula TRANslation John Backus, IBM (1954~1957) 최초의고수준프로그래밍언어 목적코드의효율화가궁극적목적 특징들 배열 인덱스변수에의해루프제어 if 문에의한브랜치 (branch) 아직도쓰이고있음 (Fortran I, II, III, IV, Fortran66, Fortran77, Fortran90, Fortran95) Programming Languages 7
코볼 (COBOL) ( 중요!) Common Business-Oriented language 그레이스하퍼 (Grace Hopper), 미해군, 미국국방성 (1959~1960) 산업계에서는많이애용되었지만, 학계에서 는무시당해왔음 ( 장황한문법때문인데, 사 실그당시가장영어에가까운프로그래밍언어 ) 특징 레코드구조 데이터구조와실행블록의분리 picture 를이용한포맷팅 Programming Languages 8
Algol60 ALGOrithmic Language 국제위원회에의해만들어짐 (1958~1960) 알고리즘구현을위한언어 특징 구조화된문장 begin-end 블럭 변수의형 (type) 선언 재귀호출 스택기반실행환경 값기반호출 문법은 BNF (Backus-Naur Form) 에의해정의 Programming Languages 9
리스프 (LISP) ( 중요!) LISt Processor 존매카시 (John McCarthy), MIT (1958~1960) 특징 인공지능에서의심볼프로그래밍 하나의데이터구조, S 표현식 (S-expression) 쓰레기수집 (garbage collection) 재귀호출 (recursion) 리스프의방언들이여전히쓰이고있음 ( 예를들어, Scheme, Common Lisp) Programming Languages 10
APL A Programming Language K. Iverson, Harvard, late 1950s Transferred to IBM, early 1960s 특징 배열과매트릭스연산 초기의시분할시스템에서사용됨 (IBM 360) 단점 : 수학심볼을위해서특별한터미널이필요 Programming Languages 11
1960 년대 프로그래밍언어들이마구등장하기시작 (50 쪽그림 2.1) 특화된목적의프로그래밍언어들이등장 주목할만한언어들 PL/I: 범용언어의시조 Algol68: 직교적설계 (orthogonal design) 직교성 언어가문맥에따라다른의미를가지지않는것 직교성이안되는경우의예 C 에서의배열 다른특화된언어들 SNOBOL Simula67 ISWIM BASIC Programming Languages 12
PL/I IBM 360 시리즈를위한언어 (1963~1964) 다른모든프로그래밍언어를아우르기위한꿈으로시작된범용언어 실패함! 설계의목적 FORTRAN, COBOL, Algol60 의모든특성을망라 함 병행성 (concurrency) 과예외처리 (exception handling) 단점 언어번역기를만들기어렵다 배우기어렵고, 에러를내기쉽다 Programming Languages 13
Algol68 국제위원회 (1963~1968) 특징 완전히직교적인언어 Algol60 에새로운특징들이추가됨 단점 너무복잡함 : 거의읽을수없는난해한언어참조매뉴얼 실패! Programming Languages 14
SNOBOL StriNg Oriented symbolic Language D. Farber, R. Griswold, and I. Polonsky of Bell Labs (1962~3) 스트링을처리하는언어 강력한패턴매칭능력을가지고있음 Programming Languages 15
Simula67 Kristen Nygaard and Ole-Johan Dahl, Norwegian Computing Center (1965~7) 시뮬레이션에사용되는언어 객체지향언어에필수적인클래스 (class) 개념도입 Programming Languages 16
ISWIM If you See What I Mean Peter Landin (1966) 현대의함수언어의조상 (say Haskell, ML) 특징 느긋한계산법 (lazy evaluation) ( 중요!) 결과값이필요할때까지계산을미룸 1. 지연계산법 함수형언어에서많이사용됨 2. 최소계산법 오프사이드규칙 ( 중요!) 인덴테이션에의해변수의영역이결정됨 최근의경우이런대표적인언어는파이썬 (Python) 임 Programming Languages 17
BASIC ( 중요!) Beginners All-purpose Symbolic Instruction Code John Kemeny and Thomas Kurtz at Dartmouth College (1964) 시분할시스템을위한언어 나중에마이크로컴퓨터에서채택되었음 ANSI Standard minimal BASIC (1978) ANSI full Standard BASIC (1988) Programming Languages 18
1970 년대 단순함과추상화 언어의복잡함으로인해, PL/I 과 Algol68 가실패했었기때문임 주목할만한언어들 가장유명한 : Pascal, C ADT ( 추상데이터형 ) 연구 : CLU, Euclid, Mesa 규제되는 LISP: Scheme 다른것들 : ML (Milner, 1978~), FP (Backus, 1978), Prolog (Colmerauer 1972~1982) Programming Languages 19
파스칼 (Pascal) ( 중요!) Niklaus Wirth (1971) Algol68 의기본개념들만강조 작고, 단순하고, 효율적이고, 구조적인언어 프로그래밍을가르칠때교육용으로많이사용되었음 다음의중요한특성들이빠짐 분리컴파일 스트링다루기 확장가능한입출력기능 [Kernighan 1981, Why Pascal is Not My Favorite Programming Language ] 참고 Programming Languages 20
C ( 매우중요!) 벨연구소의데니스리치 (Dennis Ritchie) (1972) 형 (type systems) 체계를단순화함 단순한실행환경 ( 함수는 nesting 이안됨 ) 중간수준언어 : 기계에더가깝게다가간언어 운영체제프로그래밍에사용됨 (Unix) Programming Languages 21
1980 년대 객체지향 중요한언어들 Ada (John Ichbiah, ~1983) Modula-2 (Niklaus Wirth, 1982) Smalltalk (Alan Kay, ~1980) C++ (Bjarne Stroustrup, 1980~1998) Programming Languages 22
Ada (Ada83) John Ichbiah Team (~1980) 미국방성의프로젝트언어 특징 패키지 (package) 를통한추상데이터타입 (ADT) 지원 태스크 (task) 를통한병렬프로글래밍지원 매우크고복잡한언어 1980 년대의 PL/I 1983 년에국제표준으로채택되었음 Programming Languages 23
Modula-2 Niklaus Wirth (1982, revised in 1985 and 1988) 특징 모듈 (module): Ada 의패키지개념 코루틴 (coroutine): 제한적으로병행성지원 교육용언어파스칼을대체함 큰소프트웨어프로젝트에는거의사용되지않음 Programming Languages 24
Smalltalk (Smalltalk-80) ( 중요!) 제록스파크 (Xerox Corporation s Palo Alto Research Center) 의 Alan Kay, Dan Ingalls, et al. at (1972~80) 특징 Simula 언어의클래스 (class) 개념이더강화됨 GUI 윈도우와마우스를통한환상적인 환상적인프로그래밍환경 Mac OS Windows 단점 표시방법이일반적이지않음 효율적인구현이어려움 Programming Languages 25
C++ ( 중요!) 벨연구소의비야네스트롭스트룹 (Bjarne Stroustrup) C with classes 효율적인객체지향언어 대부분의플랫폼에서사용가능 1998 ISO 표준 C++ 제정 C++0x 2009 년도현재개발중인새로운표준 Programming Languages 26
1990 년대 : 이제기술이만개하였다 거대한프로그래밍라이브러리와 API 들 Java (James Gosling, 1995): 이미만들어진 API 들과함께등장한최초의언어 Ada 의라이브러리들도많아짐 (Ada95). 시스템프로그래밍분야도커짐 : 많은스크립 트언어들이도래함 (Perl, Tcl, Javascript, VBScript, Python) 함수언어들도많아짐 : ML (Milner, 1978~1988) Haskell (Hudak, Peyton-Jones, Wadler, 1989~1998) Programming Languages 27
과연미래는어떨까? C# (2000): 자바의자리를바꿀수있을까? 5~10 년뒤의자바는어떠할까? ( 대부분의웹기반이아닌프로그램들은여전히 C++ 나 C 로구현되어있음.) 새로운언어가등장할까? 프롤로그 (Prolog) 는어떻게될까? 미래를예측하는게가능하기나할까? Programming Languages 28
알아두면좋은언어들 C C++ Java C# C# Python Ruby Programming Languages 29