본문 바로가기
개발일지/주저리주저리

파스칼(Pascal) 비난과 멸시, 그 원형을 찾아서... - 1 -

by 사악신 2013. 1. 29.

지금은 많이 줄었지만, 과거 1970, 1980년대에는 파스칼 언어에 대한 공격적인 분위기가 있었습니다. 그리고 그런 이야기들은 확대 재생산되어 전후사정을 잘 모르는 이들에게 막연한 편견을 형성하는 역할을 하게 됩니다. 따라서 한 세대라고 할 수 있는, 30 ~ 40 여년이 지난 오늘날 당시의 상황과 그들의 이야기를 역사적 관점에서 판단해보고자 합니다.(물론, 저의 주관적 견해도 꽤 관여하고 있음을 밝힙니다.)


먼저, 파스칼이 등장한 70년대 초반 분위기를 살펴볼까요?


컴퓨터 : 대형 고가의 장비, 일부 대학 및 기업의 연구소에 설치

대표 컴퓨터 언어 : 시스템 프로그래밍을 위한 어셈블리어, 수치연산을 위한 포트란(FORTRAN)

프로그래밍 관련자 : 대학 석박사 및 대기업의 연구원


당시 컴퓨터란 오늘날 공학용 계산기에 해당한다라고 보시면 되겠습니다. 따라서 컴퓨터 프로그래밍은 OS 와 같은 시스템 프로그래밍 또는 과학기술을 위한 수치연산에 국한되어 있었습니다. 파스칼을 만든 Niklaus Wirth 가 교수의 신분으로 a convenient basis to teach programming 이라고 밝힌 것은 이런 시대적 배경을 염두해두고 이해하여야합니다. 대학의 학생들 외에 컴퓨터 언어를 배우는 대상자 자체가 존재하지 않던 시절이니까요. 그리고 그 자신이 이들을 가르치는 교수였구요. 하지만, 불행히도 파스칼은 이후 교육용 언어라는 꼬리표를 낙인처럼 달고 다니게 됩니다. 만약, 1990년 이후 파스칼이 등장하였다면, "기존 언어들 보다 훨씬 익히기 쉬운 언어" 라고 표현했으리라 봅니다. 또 한가지 파스칼의 모체가된 ALGOL 에 대한 이해가 필요한데요. 이 녀석은 FORTRAN 의 대항마로, 유럽 학자들에 의해 만들어진 이론적인 언어입니다. America vs Europe 의 묘한 심리적 경쟁 관계 또한 존재하였고 파스칼은 바로 유럽 태생의 대표적 언어로 찍혔다고 보시면 됩니다.


파스칼이 발표되고 이에 대한 검증 작업이 벌어지는데, 가장 대표적인(공격적인) 논문이 1973년 5월에 발표된 A. N. Habermann 의


Critical Comments on the Programming Language Pascal


입니다. 그리고 이 논문의 논리 중 일부는 이후에도 꾸준히 차용됩니다. 논문의 시작과 함께 Summary 가 등장하는데, 원문 그대로 옮겨 보겠습니다.


The programming language Pascal is claimed to be more suitable than other languages for "teaching programming as a systematic discipline". However, an investigation of the Reports on the Pascal language reveals that it suffers as much from ill-defined constructs as many of the languages to which it is supposed to offer an alternative. Problems with the language are caused primarily by the confusion of ranges, types and structures and by the phenomena associated with goto statements.


논문의 내용은 크게 두 가지로 진행됩니다.


  1. 파스칼에서 버려진 유용한 구조
    1. Block Structure
    2. Dynamic Arrays
    3. own Variables
    4. Conditional Expressions
  2. 문제를 야기시키는 파스칼 예제
    1. Labels and goto statements
    2. Subranges, Types, and Structures
    3. Procedures, Functions, and Parameters


이 논문의 모든 내용을 다루는 것은 별도의 포스팅이 필요할 것 같으니 개인적인 결론만 말씀드리겠습니다. 파스칼은 제기된 문제점들을 해소 및 대안을 제시해가면서 대학에서 대세가 됩니다. 어떤 언어도 완성된 채로 세상에 나오지 않습니다. 중요한 것은 단점을 극복하고 발전할 수 있느냐(즉, 살아있느냐)인데... 파스칼은 이를 잘 충족해왔습니다. 아울러 상기 논문에 대한 반박 중 하나로 5년간 파스칼을 사용하며 얻은 노하우를 정리한~ 1975 년 Niklaus Wirth 가 쓴 논문


AN ASSESSMENT OF THE PROGRAMMING LANGUAGE PASCAL


이 있으며, 이어 기념비적인 책


"Algorithms + Data Structures = Programs"


이 1976년에 출판됩니다. 예제는 모두 파스칼로 작성되어있으며 이 책의 목차만으로도 충분한 설명이 되지 않을까 싶습니다. 말 그대로 바이블입니다. ^^


1 FUNDAMENTAL DATA STRUCTURES 1 

1.1 Introduction 1 

1.2 The Concept of Data Type 4 

1.3 Primitive Data Types 6 

1.4 Standard Primitive Types 8 

1.5 Subrange Types 10 

1.6 The Array Structure 11 

1. 7 The Record Structure 16 

1.8 Variants of Record Structures 20 

1.9 The Set Structure 23 

1.10 Representation of Array, Record, and Set Structures 29 

1.10.1 Representation of Arrays 30 

1.10.2 Representation of Record Structures 32 

1.10.3 Representation of Sets 33 

1.11 The Sequential File Structure 34 

1.11.1 Elementary File Operators 37 

1.11.2 Files with Substructure 39 

1.11.3 Texts 41 

1.11.4 A File Editing Progral11 49 



2 SORTING 56 

2.1 Introduction 56 

2.2 Sorting Arrays 59 

2.2.1 Sorting by Straight Insertion 60 

2.2.2 Sorting by Straight Selection 63 

2.2.3 Sorting by Straight Exchange 65 

2.2.4 Insertion Sort by Diminishing Increment 68 

2.2.5 Tree Sort 70 

2.2.6 Partition Sort 76 

2.2.7 Finding the Median 82 

2.2.8 A Comparison of Array Sorting Methods 84 

2.3 Sorting Sequential Files 87 

2.3.1 Straight Merging 87 

2.3.2 Natural Merging 92 

2.3.3 Balanced Multiway Merging 99 

2.3.4 Polyphase Sort 104 

2.3.5 Distribution of Initial Runs 116 



3 RECURSIVE ALGORITHMS 125 

3.1 Introduction 125 

3.2 When Not to Use Recursion 127 

3.3 Two Examples of Recursive Programs 130 

3.4 Backtracking Algorithms 137 

3.5 The Eight Queens Problem 143 

3.6 The Stable Marriage Problem 148 

3.7 The Optimal Selection Problem 154 



4 DYNAMIC INFORMATION STRUCTURES 162 

4.1 Recursive Data Types 162 

4.2 Pointers or References 166 

4.3 Linear Lists 171 

4.3.1 Basic Operations 171 

4.3.2 Ordered Lists and Re-organizing Lists 174 

4.3.3 An Application: Topological Sorting 182 

4.4 Tree Structures 189 

4.4.1 Basic Concepts and Definitions 189 

4.4.2 Basic Operations on Binary Trees 198 

4.4.3 Tree Search and Insertion 201 

4.4.4 Tree Deletion 210 

4.4.5 Analysis of Tree Search and Insertion 211 

4.4.6 Balanced Trees 215 

4.4.7 Balanced Tree Insertion 216 

4.4.8 Balanced Tree Deletion 222 

4.4.9 Optimal Search Trees 226 

4.4.10 Displaying a Tree Structure 232 

4.5 Multiway Trees 242 

4.5.1 B-Trees 245 

4.5.2 Binary B-Trees 257 

4.6 Key Transformations (Hashing) 264 

4.6.1 Choice of a Transformation Function 266 

4.6.2 Collision Handling 266 

4.6.3 Analysis of Key Transformation 271 



5 LANGUAGE STRUCTURES AND COMPILERS 280 

5.1 Language Definition and Structure 280 

5.2 Sentence Analysis 283 

5.3 Constructing a Syntax Graph 288 

5.4 Constructing a Parser for a Given Syntax 291 

5.5 Constructing a Table-Driven Parsing Program 295 

5.6 A Translator from BNF into Parser-Driving Data Structures 299 

5.7 The Programming Language PL/0 307 

5.8 A Parser for PL/0 311 

5.9 Recovering from Syntactic Errors 320 

5.10 A PL/0 Processor 331 

5.11 Code Generation 344 


APPENDICES 

A THE ASCII CHARACTER SET 351 

B PASCAL SYNTAX DIAGRAMS 352 

SUBJECT INDEX 359 

INDEX OF PROGRAMS 365 



그리고 이것은 새로운 패러다임, 구조적 프로그래밍(Structured Programming)의 등장을 알리는 강력한 신호였습니다. 구조적 프로그래밍의 특징을 살펴볼까요?

  1. 서브루틴(함수 등...), 블럭 구조(코드 블럭 등...), 루프(for, while 등...) 를 최대한 활용할 것.
  2. goto 문을 없애거나 사용을 억제할 것.
  3. loop 의 진입점은 하나여야하며 이론적으로 종료점도 하나일 것.
  4. 전역 변수를 거의 사용하지말 것.
  5. 서브함수는 지역변수를 사용하거나 값이나 참조에 의한 인자를 사용할 것.


지금 생각해보면 너무나 상식적이거나 혹은, 조금 맞지않는 부분도 있지만 당시에는 새로운 패러다임이었고 이에 대한 반발도 만만치않았습니다. 못믿겠다구요? 바로 FORTRAN 진영에서 이런 불만이 제기되었습니다. 지금보면 우스게글이지만 1982년까지도 이런 기조가 있었습니다. 대표적인 글(프로그래머에 대한 에세이)이 바로,


Real Programmers Don't Use PASCAL


입니다. "진정한 프로그래머는 PASCAL 을 사용하지 않는다." 이 얼마나 자극적인 제목입니까? 이 글은 이후에 무수한 패러디를 양산합니다. 가령, "Real Computer Scientists Don't Write Code", "Real Software Engineers Don't Read Dumps", "Real Programmers Don't Write Specs" 등... 그럼 진정한 프로그래머는 어떤 존재일까요? 묘사된 내용을 살펴보면 대략 이렇습니다.


1. 진짜 프로그래머는 FORTRAN 을 사용한다.

2. 진짜 프로그래머는 리스트, 문자열, 인공 지능 등의 프로그램을 FORTRAN 을 사용하여 개발한다.

3. 진짜 프로그래머는 구조적 프로그래밍을 하지 않는다.

(goto 를 사용하는 것을 두려워하지 않는다. 혼란없이 5페이지에 걸친 do 루프를 쓸 수 있다. 주석은 필요하지 않다. 등...)

4. 진짜 프로그래머는 데이터 구조를 배열로만 사용한다.(구조체, 리스트 등등 사실 필요없다. Niklaus Wirth 를 언급하며 쓸데없는 책을 썼다고 비아냥)

5. 루프에서 20 ns 라도 갱신할 수 있다면 수정한다.

6. 운영체제의 경우 CP/M 은 신도 금할 정도이고 Unix 는 그냥 비디오 게임 수준이며 진짜 프로그래머는 OS/370 을 사용한다.

7. 진짜 프로그래머는 16진수로 부트스트랩 로더를 전부 암기하고 있으며, 이를 전면 패널의 토글 스위치로 입력할 수 있다.

8. 진짜 프로그래머는 Smalltalk 같은 운영체제를 갖춘 컴퓨터를 사용하지 않으며 또한 마우스를 사용하지도 않는다.

9. 진짜 프로그래머는 원자 폭탄 시뮬레이션 프로그램을 작성하거나 NSA(국가안보기관)에서 일하며 소련의 정보문들을 해독하는 일을 한다.

10. 진짜 프로그래머는 우주 왕복선의 프로그램이나 보잉에서 일하며 순항 미사일의 운영 시스템을 설계하는 일을 한다.

11. 다시말해 진짜 프로그래머는 미국 정부 그것도 국방부를 위해 일하고 있다.(Pascal 등은 정확도가 떨어져서 사용하지 못한다.) 또한, Ada(미국방성에서 개발한 프로그래밍 언어) 는 진짜 프로그래머의 창의력을 잃게 만드는 전형적인 언어이다.

12. 간혹 진짜 프로그래머는 아타리 사에서 비디오 게임을 만들거나, 루카스 영화사에서 컴퓨터 그래픽스 프로그래밍을 한다.(물론, Fortran 으로....)


대충 이런 내용인데... 농담조의 내용(진짜 프로그래머는 와이프의 이름을 몰라도 EBCDIC 또는 ASCII 코드 테이블들을 모두 외우고 있다)들도 있고... 아무튼 당시에 꽤 호응을 얻은 글이었고, 구조적 프로그래밍의 대표 주자로 파스칼이 저격 대상이었음을 알 수 있습니다. 결론 부분에 이르러 그는 다음과 같이 호언장담합니다.


"진짜 프로그래머의 미래는 매우 밝다. 전세계 Pascal 프로그래머의 노력에도 불구하고 OS/370 및 Fortran 은 사라질 기미조차 보이지 않는다. Fortran 에 구조적 프로그래밍과 같은 방법론을 추가하는 것도 실패하고 있다. 즉, Fortran 77 은 결국 66 으로 돌아가고 있으며 하나님의 뜻대로 Do 루프를 컴파일한다. 구조화된 점만 무시한다면 C 프로그래밍도 나쁘지 않다. Fortran 과 어셈블리 언어의 좋은점(?)을 갖춘 부분이 있다."


어떻습니까? 구시대 화석이 된 프로그래머의 기록을 보시는 소감이... 오늘날 공룡은 멸종하였지만, 그 시대 그들의 존재와 삶을 부정할 수 없듯 30년 전 글쓴이의 삶 또한 부정할 수 없는 것입니다. 하지만, 그의 논리의 대부분은 멸종된 화석이 되고 말았습니다. 되짚어보면, 아주 동일하지는 않겠지만 현 시점에서도 상기 글과 같은 자세(?)로 다른 언어를 폄하하는 사람들은 상당수 존재합니다. 심지어 구조적 개발 방법론 이후 OOP 가 등장한지도 20년이 넘어 역으로 구조적 개발 방식을 고집하는 이들이 OOP 개발 방법론을 상기와 같은 관점으로 비하하는 경우도 종종 봅니다.(그러지 맙시다.^^)


아무튼 이러한 구조적 프로그래밍에 대한 거부감이 그것의 대명사라고 할 수 있는 Pascal 을 향해있었으며, 이런 비아냥은 공교롭게도 어느 정도 공통 분모가 있던 C 조차 차용합니다. 고수는 C 를 쓰지 파스칼을 사용하지 않는다 혹은 어셈블리어를 쓴다와 같은...^^ 아무튼 Fortran 의 시대가 저물자 헤게모니는 자연히 Pascal 로 넘어옵니다. 하지만 그것도 잠시, 잠룡이었던 C 가 Unix 를 등에 업고 화려하게 등장합니다.(아이러니하게 프로그래밍 언어는 그 자체 보다는 플랫폼의 인기에 편승하는 경우가 대부분입니다.) 그들의 성공을 위해서 Pascal 은 극복 대상이었기에 불특정 C 언어 개발자가 아닌, 바로 이 사람에 의해 Pascal 은 직접적인 공격을 받게 됩니다. 바로,


Why Pascal is Not My Favorite Programming Language



1981년, Brian Wilson Kernighan 에 의해서입니다. C 언어를 하시는 분이라면 낯이 익은 이름일 겁니다. 유명하신 분이지만 대략 약력을 설명하자면...


1942년 캐나다 토론토 출신으로 1964년에 토론토 대학을 졸업하였고, 1969년 프린스턴 대학에서 전자 공학 박사 학위를 받았습니다. 이듬해 벨 연구소에서 근무하던 시절, C 언어의 창시자이자 UNIX 개발자인 Dennis Ritchie 와 함께 일을 했으며... 너무나도 유명한, 최초의 C 언어 책인 "The C Programming Language"(1978) 를 Dennis Ritchie 와 공동 집필합니다. K&R C 라고도 부르는데 C 언어의 표준이 정립되기 전까지 사실상의 표준이자 교재였습니다.

여기서 K 는 Kernighan 을 가리키고 R 은 Ritchie 를 가리키지만, 실제 C 언어의 개발은 Dennis Ritchie 가 전적으로 하였다고 합니다.(AWK 스크립트의 K 도 Kernighan 의 이니셜입니다.)


또 하나 그를 유명하게 한 것은... 1972년 C 언어의 전신이라고 할 수 있는 B 언어의 튜토리얼을 작성하며 예제로 넣은 Hello, World! 소스입니다. 뭐, 웬만한 프로그래밍 교재의 첫 시작 예제를 이것으로 시작하니 알든 모르든 그를 간접적으로 만나온 셈인데요. 저 또한 말도 안되는 이 문장을 왜 출력하는지조차 모르는 채, 예제를 따라한 기억이 납니다. 최초의 예제는 어땠는지 볼까요?


main( ) {

 extrn a, b, c;

 putchar(a); putchar(b); putchar(c); putchar('!*n');

}


a 'hell';

b 'o, w';

c 'orld';


아무튼, 이런 그가 1981년 "Why Pascal is Not My Favorite Programming Language" 라는 소론을 쓰며 뜨거운 논쟁을 불러일으킵니다.^^ 그리고 그가 원한대로 세상은 C 의 세상이 됩니다. 이와 관련한 이야기들은 다음 글에서 뵙도록하겠습니다.(언제가 될런지... 이 글도 작년에 적었지만 이제야 포스팅합니다.ㅠㅠ 즉, 아쉽지만 여기서 절단신공~)




반응형

댓글