http://langdev.net/post/141 이곳을 보고 여러가지가 생각나서 적어본다.
* 1993 : GW-BASIC
국민학교 다닐 때의 일이라, 학교에서 운영하던 방과후 컴퓨터 교실에서 배운 것이 먼저였는지 우리집에 컴퓨터를 구입하고 설치하는 것을 도와준 외삼촌이 알려주었는지 기억이 확실치 않다. 컴퓨터가 단순히 게임하고 타자쳐서 글쓰는 기계가 아니고 내가 시킨 일을 수행하기도 한다는 것을 가르쳐 준 언어.
루비 튜토리얼에서도 한번 언급한 적 있지만, 함수도 없고, 사용자 정의 데이터타입도 없고, 변수 스코프도 없는, 구조적 측면에서는 정말 초보적인 언어다. 그러나 복잡한 개념을 가르칠 필요 없이 바로 눈에 보이는 결과가 나온다는 점에서 교육용 언어라는 애초의 목적에는 충실한 언어였다.
95년 무렵부터 엄마를 졸라 사설 컴퓨터 학원에 다녔는데, 이곳에서 QuickBASIC을 구할 수 있었다. QuickBASIC은 GW-BASIC의 상당히 업그레이드된 버전이었다. 함수와 C 스타일의 typedef를 제공했고, 인터프리터 환경에서 개발한 후 EXE 파일로 컴파일할 수도 있었다. 무엇보다 간단한 에디터와 디버거를 통해 IDE와 유사한 환경을 제공했다. 예제 코드도 상당히 많이 들어 있었기 때문에, 프로그래밍의 기본을 QuickBASIC으로부터 다 배웠다 해도 과언이 아니다.
* 1996 : C
위에 언급한 사설 컴퓨터 학원에서 turbo C 컴파일러를 통해 C를 배우게 되었는데, 대단한 언어라고 들었던 C가 어렵기만 하고 별로 재밌지 않아서 실망했던 기억이 있다. 명령어만 입력하면 삑삑 소리도 나고 원하는 위치에 글자도 뿌릴 수 있었던 GW-BASIC과 달리 C는 그 자체로 할 수 있는 일이 별로 없었다. 결국 QuickBASIC에 더 많은 시간을 투자했던 것으로 기억한다.
애초에 시스템 프로그래밍 언어를 지향했던 C로서는 나의 악평(?)이 억울했겠지만, 당시 좀더 강력한 라이브러리를 자랑하던 borland나 watcom의 컴파일러는 나로서는 쉽게 구할 방법이 없었다. (turbo C 역시 borland사의 제품인 걸로 알고 있는데 어떻게 구했는지는 기억이 나지 않는다. 아마 불법복제였던 듯 싶다.)
1999년 무렵에 gcc를 도스용으로 포팅한 djgpp 컴파일러를 통해 다시 C를 만나게 되었을 때 드디어 C의 매력에 빠지게 되었다. djgpp는 일단 공짜로 쉽게 구할 수 있었고(!) gnu 진영의 다양한 라이브러리를 쉽게 설치할 수 있었다. 이전까지는 게임 불법 다운로드(...)에나 사용하던 PC 통신에서 프로그래밍 관련 정보를 얻을 수 있다는 걸 알게 된 것도 이 무렵이었는데, 여기서 유전 알고리즘에 대한 간략한 소개를 보고 직접 prisoner's dilemma 문제를 코딩해 보기도 했는데 결과는 중구난방이었다. 지금 생각해보면 CPU가 구린 것을 나름 보완한다고 진화압력과 돌연변이 확률을 너무 크게 잡았기 때문이 아니었나 싶다.
* 2000 : C++
djgpp는 C 컴파일러이기도 했지만 C++ 컴파일러이기도 했기 때문에 자연스럽게 C++를 접할 수 있었다. C++는 참 이름을 잘 지은 것이, 사실 C와 큰 관련이 없는 언어지만 이름 때문에 C의 후계자가 C++라고 아주 당연하다는 듯이 생각하고 있었던 것 같다.
C++는 수많은 키워드와 에러나기 쉬운 메모리 관리 시스템 때문에 참 어려웠는데, 나는 "진짜" 프로그래밍 언어는 어려운 것이 당연하지 하면서 열심히 배웠다. 지금은 단순히 C++의 문법이 지저분한 것 뿐이라고 생각한다. 게다가 당시에는 C++ == MFC 인 것마냥 대부분의 책이 MFC만을 다뤘기 때문에, C++의 진짜 힘인 template의 존재를 알지 못했다. MFC나 좀 건드려 보다가 말았던 걸로 기억한다. 매크로로 떡칠된 MFC의 라이브러리 디자인은 지금도 좋아하지 않는다.
나중에 대학교에 들어와서 C++를 다시 돌아보게 되는 데는 Effective C++와 더 나중에 만난 Modern C++ design 의 도움이 컸다. 특히 Modern C++ design은 C++의 강력함과 한계를 동시에 알게 해 주는 책이다. 적극 추천하는 바이다.
* 2003 : java
대학교에 들어와서 전공이 정해진 후 프로그래밍의 기초 시간에 Java를 처음 배웠던 것 같다. C++과 열심히 씨름했던 덕분에 Java는 참 쉽게 배울 수 있었다. template을 제외하면 C++의 핵심적인 기능은 대부분 Java에도 있었고, 덤으로 좀더 단순한 문법과 풍부한 기본 라이브러리를 자랑한다. (Java에도 훗날 template이 추가되었다.)
그러나 개인적으로는 java가 차지하고 있는 위치가 애매하달까... CPU 성능을 극단적으로 요구하는 프로젝트는 C가 더 나은 경우가 많고, 병렬 프로그래밍은 haskell이 훨씬 쉽고, 보다 generic한 프로그래밍에는 상황에 따라 파이썬이나 루비를 사용하기 때문에 요즘은 java는 그다지 좋아하지 않는다.
특히 자바 커뮤니티는 다른 언어로 된 라이브러리 갖다 쓰는 것을 굉장히 싫어하고 모든 것을 자바 언어 내에서 해결하고 싶어하는 특징이 있는데, 나에게는 별로 맞지 않는 것 같다.
* 2004 : nML
이 언어는 모르는 사람들이 많을 텐데, 서울대학교 이광근 교수님이 Standard ML과 OCaml의 디자인을 합쳐 만든 ML의 방언이다. 프로그래밍 언어 시간에 nML을 처음 만났을 때의 충격을 아직도 잊을 수 없다. 아마 함수형 언어를 배운 사람들은 대부분 함수형 언어와 처음 만나는 순간을 충격적으로 기억하고 있을 게다.
함수형 언어의 심플한 아름다움은 아마 접해본 사람은 다들 알고 있을 것이고 접해보지 않은 사람에게는 말로 전달해줄 능력이 없다. 두려워하지 말고 만나보라고 할 수밖에. 프로그래밍을 바라보는 눈이 바뀔 것이다.
하지만 지금은 nML을 쓰지 않는다. 함수형 언어를 쓰고 싶은 프로젝트를 만나면 그냥 Haskell을 쓴다...
* 2004 : PHP
웹 프로젝트에 잠시 사용해 봤다. 끝... 이 아니고...
네트워크 프로그래밍 시간에 처음 써봤고, 이후에도 웹 개발할 일이 있을 때 한두번 더 써보기도 했지만, 지금은 웹 개발은 전부 루비로 하고 있다.
* 2005 : python
파이썬의 강력함은 이전부터 익히 들어 왔지만, 실제로 다뤄본 것은 4학년때 잠깐, 그리고 대학원에 들어가고 나서의 일이었다. 대학원에서는 주로 numpy와 scipy를 통해 수치해석을 많이 했고, 요즘 들어서는 twisted로 네트워크를 많이 다루고 있다.
워낙 대세가 되어 개발자라면 써보지 않은 사람이 없을 것이다. 나 역시 혼자 작업할 때는 루비를 선호하지만 국내 개발자 가운데서도 루비 쓰는 사람은 별로 없어도 파이썬 안써본 사람은 거의 없기 때문에 누군가와 함께 작업할 때는 대부분 파이썬을 쓰게 된다.
* 2006 : matlab
대학원에서 처음 접하게 된 언어. 수치해석과 그래프 그리기의 최강자. 그러나 과제 때 몇번 써보고 이후에 비슷한 과제가 있을 때는 그냥 numpy로 대체해 버렸다.
* 2007 : ruby
실용적인 프로그래밍의 진정한 의미를 가르쳐준 언어이자, 프로그래밍 언어의 문법이 심플하지 않아도 아름다울 수 있다는 것을 가르쳐준 언어. 루비의 특징은 이 블로그에서 몇번 소개하였으므로 루비 태그를 참조하시면 되겠다.
루비는 언어 자체도 독특하지만 커뮤니티 역시 참 독특하다.
* 테스트 주도 개발을 거의 맹신이라고 할만큼 철저히 지킨다. 테스트 주도 개발은 java 진영에서 먼저 보편화되었지만, 요즘은 루비의 훌륭한 테스트 도구들이 java/python 진영으로 역수출되는 추세다.
* Mac 사용자의 비중이 다른 커뮤니티에 비해 높다. 사용자 친화를 중시하는 애플 진영의 특성과 프로그래머 친화를 중시하는 루비의 특성이 잘 맞기 때문인 것 같다. 덕분에 루비의 Mac OS 지원도 상당히 훌륭하다.
* 웹 개발자가 많다. 이것은 물론 Ruby on Rails 라는 걸출한 프레임워크 덕분인데, 이 때문에 다른 분야 라이브러리들의 발전은 느린 편이다. 루비 커뮤니티에서 가장 아쉬운 점이다.
* 2008 : haskell
프로그래밍 언어의 진화의 한 정점에 서 있는 언어. 세상에서 가장 정교한 프로그래밍 언어를 꼽으라면 나는 주저없이 haskell을 꼽을 것이다.
side-effect를 허용하지 않는 순수 함수형 언어로, side-effect 없이 I/O를 구현하기 위해 monad라는 독특한 개념을 이용한다. 순수 함수형 언어라는 점을 제외하면 nML과 유사한 문법을 갖고 있어서 쉽게 입문할 수 있었는데, 배우면 배울수록 새로운 개념이 끊임없이 등장하는, 굉장히 깊은 언어이다. 게다가 학자들이 좋아하는 (...) 언어다 보니 새로운 프로그래밍 패러다임의 주된 실험장이기도 하다.
실용적인 측면에서 haskell의 가장 큰 특징은 persistent data일 것이다. nML이나 LISP 등 대부분의 값 중심 (함수형 언어의 다른 별명) 언어들의 특징이기도 한데, 한번 계산된 값은 절대 변경되지 않는다는 것이다. 예를 들어 list에 새로운 값을 추가하거나, hashmap에 새로운 key/value를 추가해도 원래 값은 변하지 않고 그로부터 계산된 새로운 값이 반환된다. 또한 같은 함수에 같은 값을 넣으면 항상 같은 동작을 한다는 것이 100% 보장되기 때문에 일단 컴파일된 코드는 높은 확률로 의도대로 동작한다는 것을 보장하는 훌륭한 특성을 갖고 있다.
다만 함수형 언어의 생소함 외에도 monad라는 수학적인 개념을 광범위하게 다루고 있기 때문에 배우기 어려운 언어인 것은 사실이다. haskell을 공부하고 싶은 사람에게는 공식 홈페이지 www.haskell.org 와, haskell의 실용적인 측면을 많이 다루고 있는 Real World Haskell을 추천한다.
* 2010 : actionscript
flash 개발을 위한 언어. javascript 방언이다. 회사에서 쓸 데가 있어 배우긴 했는데 언어적으로 참 지저분하다 -_- flash까지 덩달아 싫어지게 만드는 마술같은 언어.
* 2010 : lua
와우 애드온 고칠때 조금 끄적여본 수준. 재미있어 보이긴 하는데 많이 들여다보지는 않았음.
이렇게 써놓고 보니 대학교에 입학한 이후로는 나도 모르는 사이에 매년 새 언어 배우기 원칙을 실행하고 있었다... 2009년에는 딱히 새 언어를 배우지 않았다는 것이 갑자기 아쉬워진다.
* 그 외에 요즘 기대하고 있는 언어들
clojure : 요즘 루비 커뮤니티에서 주목받고 있는 LISP 방언이다. LISP가 등장한지 50년이 넘었지만 여전히 코드를 그 자체로 데이터로 다루는 LISP만의 특징은 다른 언어들은 흉내만 낼 뿐 완전히 구현하지 못하고 있다. clojure는 현대 언어들의 기능 (dynamic inheritance, hashmap, STM 등등) 으로 재무장한 LISP라고 할 수 있는데, 자바 가상 머신 위에서 동작하기 때문에 자바의 수많은 라이브러리를 바로 갖다 쓸 수 있다는 장점이 있다. 다만 등장한지 얼마 되지 않아서 API가 확립되지 않은 것이 단점이라 하겠다.
go : 작년에 구글에서 공개한 언어. 디자이너 가운데 무려 켄 톰슨1과 롭 파이크2가 포함되어 있다. 역시 구글이랄까 I/O 함수와 강력한 병렬처리에 집중하는 점이 돋보인다. 이번 프로젝트 끝나면 회사에서 한번 스터디해볼 계획이다.
'로그 > 전공' 카테고리의 다른 글
| 나의 언어 편력기 (0) | 2010/08/05 |
|---|---|
| 카테고리 이론 동영상 강좌 (0) | 2010/06/09 |
| SSH 터널링으로 사설망 리눅스 PC 접속하기 (1) | 2009/02/05 |
| 리눅스에서 소스 패키지 설치/제거하기 (4) | 2008/02/27 |
| 제어이론(control theory)에 대한 간단한 요약 (1) | 2007/11/26 |
| 재미있는 연구결과, 그리고 파이썬 놀이 (2) | 2007/02/28 |
