-
AWK 창시자 Dr. Brian Kernighan과의 짧은 인터뷰
-
Dr. Brian Kernighan 소개
- Dr. Brian Kernighan은 캐나다 출신의 컴퓨터 과학자로, Bell Labs에서 UNIX 개발에 기여함
- Dennis Richie와 함께 C 프로그래밍 언어에 관한 기본서인 "The C Programming Language"를 공동 저술함
- 2000년부터 Princeton University에서 다음 세대 프로그래머를 양성하고 있음
- 최초의 "Hello World!" 프로그램을 작성한 인물로 유명함
-
AWK의 새로운 아이디어
- AWK의 주요 아이디어는 연관 배열(associative arrays)임
- 당시에는 새로운 개념이었으나, 현재는 대부분의 언어에서 라이브러리 함수(hashmaps in Java or C++)나 언어 자체(dictionaries in Perl and Python)로 사용됨
- 연관 배열은 매우 강력한 구조로, 다양한 데이터 구조를 시뮬레이션하는 데 사용될 수 있음
- 패턴-액션 패러다임도 당시에는 널리 사용되지 않았으나, 특정 계산을 조직하는 효과적인 방법임
-
프로그래밍 언어를 만들 때 참조한 자료
- Dr. Kernighan: "없음"
- 1970년대 당시에는 새로운 특수 목적의 언어들이 많았고, 참조할 만한 선행 자료가 거의 없었음
- Yacc는 문법을 쉽게 만들고 실험할 수 있게 해주는 중요한 도구였음
- Lex는 어휘 수준에서 동일한 역할을 하여 많은 지루한 코드를 규칙 세트로 대체함
- Lex와 Yacc는 패턴-액션 언어의 예시로, 서로 긍정적인 순환을 이루었음
-
프로그래밍 언어 설계에 관심 있는 젊은이들에게 조언
- 작은 특수 목적의 언어를 설계하고 구현해보라고 조언함
- 이는 매우 재미있고 유용하며, Rust나 C++의 대체 언어를 만드는 것보다 훨씬 쉬움
- 자동화할 수 있는 작업을 찾아서 간단한 컴파일러와 런타임을 만들라고 권장함
- Jon Bentley가 오래전에 쓴 관련 기사가 여전히 유효함
-
이미지 출처
- Wikimedia Commons
-
GN⁺의 정리
- Dr. Brian Kernighan은 UNIX와 C 언어 개발에 기여한 중요한 인물로, 연관 배열과 패턴-액션 패러다임을 도입한 AWK 언어의 창시자임
- 연관 배열은 현재 대부분의 프로그래밍 언어에서 사용되는 강력한 데이터 구조임
- 젊은 프로그래머들에게는 작은 특수 목적의 언어를 설계하고 구현해보는 것이 유익함
- Yacc와 Lex는 문법과 어휘 분석을 쉽게 해주는 도구로, 패턴-액션 언어의 좋은 예시임
댓글과 토론
Hacker News 의견들
-
잘 알려지지 않은 Brian Kernighan 관련 잡다한 사실들: 2000년에 Princeton CS 학과에 합류했지만, Bell Labs Research에 있던 1993년쯤 이미 Princeton에서 수업을 하나 이상 가르쳤음
한 학생이 pre-1.0 Linux가 도는 386sx 노트북을 자주 가져왔고, Brian이 awk의 세부 동작을 기억 못 할 때 그 학생이 awk 명령을 실행해 “정답 구현”을 알려줬다고 함. 그래서 Brian은 비교적 이른 시기에 Linux를 접한 셈임
1994년 가을 AT&T의 무료전화번호부를 인터넷에 올린 글도 있음: https://www.cs.princeton.edu/~bwk/800.html- gawk가 awk의 기준 구현인지, 아니면 실제로 크게 다른 쪽은 gsed였던 건지 헷갈림
- “그 학생”이 글쓴이 본인 같다는 냄새가 남
-
관심 있으면 Lex Fridman이 BK와 한 1시간 반 인터뷰가 꽤 좋음: https://www.youtube.com/watch?v=O9upVbGSBFo
- Computerphile YouTube 채널에도 BK 인터뷰가 많음: https://www.youtube.com/results?search_query=computerphile+kernighan
가끔 지금 이 시대에 사는 게 엄청난 특권처럼 느껴짐. 수학자가 Euler를 인터뷰하거나 물리학자가 Newton을 인터뷰할 수 있는 것과 비슷함 - 예전엔 그의 강연 일부를 보고 별로라고 느꼈는데, 이 인터뷰는 광고 뒤 실제 대화가 시작되는 초반부터 꽤 괜찮아 보임
- Computerphile YouTube 채널에도 BK 인터뷰가 많음: https://www.youtube.com/results?search_query=computerphile+kernighan
-
Masterminds of Programming 책에는 Aho와 Weinberger까지 포함한 더 포괄적인 인터뷰가 있음. 강력 추천함
- 위키에 인터뷰가 여러 개 정리돼 있음:
https://en.wikipedia.org/wiki/Brian_Kernighan
http://www.linuxjournal.com/article/7035
http://www-2.cs.cmu.edu/~mihaib/kernighan-interview/index.html
https://web.archive.org/web/20090428163341/https://www.princeton.edu/~mike/unixhistory
https://web.archive.org/web/20131126220450/http://princetonstartuptv.com/post/49379235060/the-legendary-brian-kernighan-on-teaching-writing
- 위키에 인터뷰가 여러 개 정리돼 있음:
-
이번 주에 1983년의 The Unix Programming Environment를 읽고 있는데, 35년쯤 늦게 읽은 셈임. 책에서 awk가 정말 돋보이고, 지금 인기 있는 JavaScript, Lua, Python, Perl, Tcl 같은 언어에 가장 가까운 존재로 보임
awk가 “연관 배열”이라고 부르는 것을 JavaScript는 그냥 “객체”라고 부름. 1979년 7판 Unix의 awk 소스는 https://www.tuhs.org/cgi-bin/utree.pl?file=V7/usr/src/cmd/awk 기준 2680줄뿐이고, 실행 파일은 46KB로 PDP-11의 64KB 주소 공간에서 돌았다는 게 놀라움. 그 버전과 4년 뒤 책에 나온 awk에는 사용자 정의 함수도 없었던 것 같고, V7 Bourne shell도 마찬가지였던 듯함. 하지만 bc에는 있었음- 사용자 정의 함수가 없던 awk는 old awk, 또는 역으로 붙인 이름인 oawk로도 알려져 있음. Heirloom에는 더 익숙한 nawk와 함께 그 후손으로 보이는 구현이 아직 남아 있음: https://heirloom.sourceforge.net/man/awk.1.html
실행 파일 46KB도 Turbo Pascal 3.02보다는 조금 컸음: https://prog21.dadgum.com/116.html 물론 Turbo Pascal에는 정규식 엔진이 없긴 했음 - awk는 그 이상임.
function키워드,for e in a, 세미콜론 없는 문법, 문자열 중심 타입 처리,delete x[e]같은 요소를 보면 JavaScript의 기반이 awk였다는 게 꽤 분명하고, Brendan Eich도 그렇게 말했음: https://brendaneich.com/2010/07/a-brief-history-of-javascript/ - 같은 책을 읽고 똑같은 결론에 도달했음. 그 뒤 The UNIX-Haters Handbook을 읽고 나니 awk 같은 Unix 도구들이 이제는 안타깝게도 충분히 좋지 않다고 느꼈음
01983,01979처럼 쓰는 건 연도를 쓰는 방식도 아니고, 사실 숫자를 쓰는 방식으로도 이상함- 연도 앞의 0 때문에 꽤 헷갈렸음. 뭔가 난해한 날짜 형식인 줄 알았음
- 사용자 정의 함수가 없던 awk는 old awk, 또는 역으로 붙인 이름인 oawk로도 알려져 있음. Heirloom에는 더 익숙한 nawk와 함께 그 후손으로 보이는 구현이 아직 남아 있음: https://heirloom.sourceforge.net/man/awk.1.html
-
오래전에 누군가 Usenet
.sig에 “Perl은 마가린, awk는 버터”라고 썼던 기억이 있음. 순서는 반대였을 수도 있음
Perl에 단점이 많긴 하지만, Perl을 발견한 뒤에는 awk를 훨씬 덜 쓰게 됐음 -
80년대 호주 Unix 콘퍼런스에서 Dr. Kernighan에게 서명받은 K&R 책을 갖고 있음. 가장 아끼는 물건 중 하나임
그 책과 Kernighan/Pike의 The Practice of Programming, Byte 매거진 같은 것들이 1980년대의 내 “Stack Overflow”였음 -
그가 연관 배열을 “비교적 새로운 것”처럼 말하는 게 흥미로움. Lisp에는 거의 20년 전부터 있었기 때문임
- 인터넷 이전에는 한 분야에서 숙련되고 지식이 많아도, 다른 공동체에서는 기본으로 여기는 걸 전혀 접하지 못하거나 수십 년에 걸쳐 천천히 퍼지는 일이 쉬웠음
1990년대에 프로그래밍을 시작했을 때도 C 세계의 상당수는 해시 테이블 같은 연관 자료구조를 다소 이국적인 것으로 보고, 정말 어쩔 수 없을 때만 꺼내 쓰는 것으로 여겼음. 프로그래밍 세계가 빠르게 움직인다고 생각하지만 실제론 그렇지 않고, 특히 그 시절에는 더 느렸음. 1960~70년대 어떤 언어에 등장한 기능이 널리 채택되기까지 몇십 년이 걸린 경우가 많음. Lisp도 당시 성능이 다른 선택지에 비해 꽤 나빠서, 자기 기능을 홍보하기에 좋은 사례가 아니었을 수 있음 - The AWK Programming Language 초판 무료 PDF에는 연관 배열이 SNOBOL4 테이블에서 영감을 받았지만 더 일반적이지는 않다고 나옴
awk는 느린 기계와 작은 메모리에서 태어났고, 배열의 성질도 그 환경의 결과였음. 첨자를 문자열로 제한하고, 문법적 설탕이 있어도 1차원으로 제한한 것이 그 예임. 더 일반적인 구현이라면 다차원 배열이나 최소한 배열 원소로 배열을 넣는 방식을 허용했을 것이라고 함. SNOBOL4 안정판은 1967년: https://en.wikipedia.org/wiki/SNOBOL - Common Lisp에는 당연히 해시 테이블이 내장돼 있음. MacLisp에는 Pitmanual을 봐도 없는 것 같고, ZetaLisp/LML과 InterLisp에는 있음
따라서 Lisp의 내장 연관 배열을 alist나 속성 리스트까지 포함하지 않는다면, awk가 태어난 시기와 거의 동시대이거나 조금 더 나중으로 보임 - Lisp의 alist도 어떤 의미에서는 “연관 배열”이 맞지만, 언어 기능이라기보다는 리스트로 만든 구조이고 awk에서 쓰는 용도에는 효율이 충분하지 않음
어떤 언어에서든 선형 검색으로 연관 배열 비슷한 걸 몇 분 만에 만들 수는 있지만, SNOBOL4, MUMPS, awk, Perl, Python, Tcl, Lua, JavaScript처럼 언어 기능으로 내장된 것과는 완전히 다름. 초기 Lisp가 데이터 구조화를 위해 제공한 건cons,car,cdr였고, 이는 같은 것이 아님. awk 이전 Unix 안에도 링커의 심볼, C 컴파일러, 어셈블러, 파일시스템 디렉터리 형태의 커널, 셸 변수처럼 연관 배열이 들어간 프로그램들은 있었지만, 프로그래밍 언어 기능으로 제공된 건 아니었음. Bourne shell은 변수명을 이어 붙여eval myarray_$key=$val같은 식으로 흉내 낼 수 있어서 가장 가까웠고, V7 Bourne shell의 셸 변수 처리는 이진 트리 탐색으로 구현돼 있었음
- 인터넷 이전에는 한 분야에서 숙련되고 지식이 많아도, 다른 공동체에서는 기본으로 여기는 걸 전혀 접하지 못하거나 수십 년에 걸쳐 천천히 퍼지는 일이 쉬웠음
-
정규식에서 lex, yacc, awk로 이어지는 개발의 흐름이 무척 인상적임. 앞선 작업 위에 쌓아 더 일반적인 결과를 만들어냈다는 느낌이 설득력 있게 드러남
-
욕먹을 말이겠지만, GitHub에는 이런 코딩 전설들보다 더 잘 짠 저장소를 가진 프로그래머가 아주 많을 것 같음. 그때는 인재 풀이 훨씬 작았음
- 요즘 사람 중에 누가 뛰어나다고 생각하는지 궁금함. 새 피의 커리어나 근황을 따라가는 건 늘 재미있음
- Brian Kernighan이 역사상 최고의 프로그래머라고 누가 주장한 적은 없는 것 같음
- 순진한 말이긴 한데 정말 궁금함. 더 낫다는 걸 어떻게 측정할 건가?