펄은 래리 월(Larry Wall)에 의해 개발되기 시작한 언어로, 인터프리터식, 객체지향적, 플랫폼 독립적이며 동적인 대화형 스크립트 언어이다. (컴퓨터) 언어학적인 계보를 살펴보자면, sed, awk 등의 유닉스 환경의 잡다한 처리를 위한 스크립트 언어들의 기능적인 면들과, 언어적 구조로서 Modula와 Lisp의 특징을 모으고, 이에 C/C++ 나 Pascal 등에서 추릴 수 있는 형태적 장점만(수없이 많은 단점을 빼버리고) 등에서 좋은 특질을 모아서 그야말로 최대한의 가능성을 열어둔 것이 -- 이 부분 역시 필자의 주관적 견해임을 밝힌다 -- 펄이다. 펄의 표어는 "There is more than one way to do it." 으로, 소위 미니멀리즘 언어 (하나의 일을 하는 표현, 하나의 의미의 표현은 하나 뿐이라는)에 대항하는 맥시멀리즘 정신으로 무장하고 있다. 이 태생의 역할은 래리 월의 기지 넘치고 발랄한 세가지 미덕, "게으름", "조급함", "자만"으로 이어져 있다. 게으름-부지런함, 조급함-인내, 자만-겸손. 펄 프로그래머라면 이 각각이 추상화와 일반화의 문제에 있어 얼마나 유용한 관점인지 이해할 수 있으리라. 펄의 이러한 특징은 또한 오직 펄이기 때문에 가능했던 하나의 '문화',아케이브 문화, CPAN(
http://www.cpan.org) 을 만들어 내었다. CPAN은 말 그대로 bazaar다.
현대의 유닉스, 리눅스 문화에서
PerlLanguage의 부재는 상상하기도 힘들다. 시험삼아, 펄 모듈을 deselect 해보라. 데비안 포테이토판에서는 60%의 패키지가 날아가버렸다.
PerlLanguage 없이는 리눅스도 없다. 물론 다른 언어도 그럴수 있다. 아니, 그럴 가능성은 있다. 그러나 현실로, 오직
PerlLanguage이 유일한 도구 언어이다. 또한 실지로 가장 많이 쓰이고 있는 '풀' 언어이고, 또 커스터마이징 언어이다. 그렇지 않은가? 그렇다고 해서 쓰임이 유닉스용 도구에 한정된 것은 절대 아니며, 각종 웹 검색 사이트 운용(Yahoo, Altavista, ...) 및 생물정보학(bioinformatics), 웹 서버 등 넓은 분야에서 제 몫을 단단히 해내고 있다. 최소한 파이썬 보다는 훨씬 더 널리 쓰이고 있다.
.png)
개발자 래리 월은 GNU에서 준 최초의 자유소프트웨어 상을, 이
PerlLanguage로 수상했다. 이 외에 펄 자체에 대한 구체적인 설명은 ... 마소 몇 월호를 보라고 읽고 싶지만, 불행히도 국내에서는 펄에 대한 인식이 의외로 미비하다. 펄 철학에 대한 가장 편리한 입문은, 오라일리에서 나온 책, '오픈소스'의 래리 월의 아티클
근면인내그리고겸손을 읽으라. 펄의 사고는 그러하다.
흠. 좀더 실질적인 것을 원하는 분들을 위한 간단한 예로, 고전적 예제인 단어 개수 세기 프로그램을 펄로 작성한 것이 <리스트 1>이다. 주석이 필요없을 정도로 간단하고 직관적이지 않은가.
<리스트 1> 단어 개수 세기
open INPUT, $ARGV[0];
while($line = <INPUT>)
{
@words = split /\s/, $line;
foreach $word (@words)
{
$wordfreq{$word} ++;
}
}
print %wordfreq;
조금 더 익숙한 펄 프로그래머라면, 어째서 저렇게 긴 코드를 쓰는지 의아해 할 것이다. 짧고, 그리고 더 가독성 높은 코드는 리스트 2 이다.
<리스트 2> 단어 개수 세기
open INPUT, $ARGV[0];
push @words, split /\s/ while (<INPUT>);
$wordfreq{$_}++ foreach @words;
print %wordfreq;
while문은 자연어인 '영어의 while' 로 읽으라. 아래처럼:
push on @words (what is remain after) split whitespace, while (there is) <INPUT>.
(입력<input>이 있는동안(while) 화이트스페이스로 잘라서(split /\s/) @words 어레이에 넣기(push))
add(++) wordfreq of it($_), foreach @words.
(각 단어별로(foreach @words), 빈도를 더하라. ($wordfreq{$_}++) )
영어 문장과 상당히 흡사해진다는 것을 주지할것. 이런 면에 대해서는, 이 소개글 마지막을 조금 더 보라. 펄에서는 늘 이렇게 인간의 언어에 다가가도록 하는 것이 좋은 코딩 스타일이다.
도대체 무엇 때문에 이토록 펄이 이름을 날리고 개발자 커뮤니티의 날개로 펄펄 날아다니고 있는 것일까? 여러 가지 요인이 있겠지만 가장 대표적인 것을 든다면 역시 "빠른 개발 속도"가 아닐까 한다.
어찌된 일인지 국내에서는 스크립트 언어는 저열한 것이고, 자바나 C++류가 어디서나 최고의 만병통치약이라고 생각하는 사람이 많은 것 같다. 한 두 가지에 우루루 몰리는 집단 문화의 강세 때문인지도 모르겠다. (최근에는 스크립트 언어에도 눈길이 쏠리고 있는데, 우루루 몰리는 집단 문화의 강세 덕분에, 특정 언어에만 몰리는 경향이 있다. 이해 할 수 없는 그 강세, 어디 안 가는지.)
스크립트 언어와 C++의 개발 속도에 대한 비교로 Tcl을 개발한 아우스터하우트(Ousterhout)의 IEEE 논문이 유명한데, DB 애플리케이션 개발에 C++은 이개월, DB 라이브러리 개발에 역시 C++은 삼개월이 소요되었는데, 스크립트 언어로는 각각 하루와 일주일만 걸렸다. 코드 길이를 봐도 3000라인과 300라인의 대략 10배 비율은 극단적인 예가 아니다.
펄에 대한 직접적인 비교는 루츠 프렉헬트(Lutz Prechelt)의 보고서가 통계적으로 비교적 엄밀히 수행된 것인데, 자바, C++, C로 대변되는 비스크립트 언어와 Perl, Python, Rex, Tcl의 스크립트 언어에 대해, 해당 언어 전문가 수십명으로 실험집단을 만들고 동일한 과제(검색 및 스트링 처리)를 주어 여러 가지 측정 결과를 비교했다. 펄과 비스크립트 언어에 대해서만 이야기 한다면, 펄은 C, C++, Java에 비해 평균적으로 삼분의 일 이하의 개발 시간과, 코드의 라인 수도 C, C++, Java에 비해 대략 삼분의 일이고, Java의 절반 정도의 메모리 소모에, 전체 수행 속도는 C나 C++보다는 느리지만 Java보다 약간 빠른 정도를 보여줬다. (주목할 만한 사실은 스크립트 언어 중에서도 펄이 높은 성능을 보여줬다는 점이다) (-리스트2 소개 이후로 여기까지 비교 문단에서는 그저 s/파이썬/펄/ 하였음. 당연히 모두가 사실임.)
여기서 주지할 점은 바로 펄의 높은 생산성이다. 같은 시간 동안에 더 많은 코드를 만들 수 있으면서 동시에 전체 코드 길이는 짧다는 점은 펄의 대표적인 매력 중 하나이다. 펄 유저 그룹에서, C나 C++로 2주일 걸린 작업을 하루에 했다, 허무하다는 등의 이야기는 너무 흔해서 더 이상 뉴스거리조차 되지 못한다... 라는 이야기는 펄 소사이어티에서는 이미 10년 전의 이야기다. 10년전에 래리 월이 한 말; "물론 C가 언제나 더 빠르게 돌아가지요. 하지만 perl은 언제나 더 빠르게 짤 수 있답니다." 그리고 그시기에 이미
BlackPerl 같은 미학적인 시를 쓰기 시작했다. 무의미 시라는 단점이 있지만.
하지만 펄 역시 하나의 도구일 뿐이고, 만병통치약은 되지 못한다. 펄은 자신이 잘 쓰일 수 있는 곳이 있고, C++나 자바 역시 그것들이 효율적일 수 있는 부분이 있다. 현명한 판단은 어느 상황에 어떤 도구를 선택하여 사용하느냐는 것이다.
펄의 다른 스크립트 언어와 비교해서 얻을 수 있는 가장 큰 장점은...
펄의 가장 큰 특징은, 그 자유로움이다. 그 자유로움이 가져다 준 개발자 문화 CPAN은, 성당과 시장 모델을 예로든다면, 지금까지 알려진 단일 언어에 대한 커뮤니티 중에서는 elisp 아케이브와 함께 가장 거대한 '바자'이다.
펄은 '스타일이 있는', '철학이 담긴', 언어의 특징을 가장 많이 지니고 있다. 파이썬의 학습 속도 이야기들을 종종 듣지만, 펄의 경우에는 디자인 자체 부터 자연언어에 유사하게 접근한다는 것을 크게 염두에 두고 있었다.
kiss $me until die; # 영어 그대로, 죽을때까지 키스해 주어요.
free $me or death $me; # 자유가 아니면 죽음을!
또, 대상이 나라는 것이 확실하면 (내 애인은 나 아닌 것에 키스하지 않겠지.
.png)
)
kiss;
라고만 하면 된다. 그러면 대명사가 처리해준다. 생략된 $me. 우리도 말 할때 그렇게 하지 않는가? 모든 이름을 다 읽지 않고, 그것, 저것이라고 하지 않는가?
위와 같은 표현이 억지스럽게 말 맞춘 것으로 보이는가? 아니다. 불행히도 내 코드 속에서 실지로 돌아가는 동사와 명사들이다. 가장 자연스럽고 또 명명법에서 권장되는 방법이다. 동사(함수)와 명사(자료구조)를 위와 같은 식으로 배치하는 것은 펄 언어를 쓸때 가장 표준 적인 것이다. 그저 읽히게 하라. 그저 읽으라.
펄은 늘 다양한 표현을 존중하다. 이를 테면 switch문 (은 펄에 없다) 역할을 하는 코드를 작성하는데에는 펄 교과서에 실릴 예제만으로도 5가지가 된다.
펄은 당신에게 다음 처럼 말한다. 언제나 선택을 하면, 한가지 이점과 다른 한가지 댓가를 치르기 마련이다. 그 모든 선택을 당신이 하라. 여기 모든 방법들이 있다. 필요한 것을 골라써라. 당신의 자유다. 필요없으면? 치워버려라, 혹은 잊어버려라. 아무 상관없다.