티스토리 뷰

자연어와 프로그래밍 언어의 중간자

2001-10-2

펄의 세계에 오신 것을 환영합니다!

펄은 문자열(string) 처리에 매우 강한 프로그래밍 언어 中 하나입니다. 펄로 작성된 프로그램은 C나 자바 같은 본격적인 프로그래밍 언어로 행하는 작업보다는 조금 더 가벼운 곳에 쓰이기도 하기 때문에 스크립팅 언어라고 얘기하기도 합니다만 사실은 그 이상입니다. 펄은 몇 줄의 코드로 소소한 작업을 편리하게 해낼 수 있는 스크립팅 언어로 쓰일 수 있을 뿐만 아니라 본격적인 애플리케이션 전체를 오직 펄만을 이용해서 충분히 개발할 수 있는 강력한 언어이자 환경이기 때문입니다.

 

펄은 NASA에서 시스템 관리자로 일하던 언어학자 래리 월(Larry Wall) 씨가 만들었습니다. 처음에는 유즈넷 뉴스 같은 계층구조를 가진 파일의 버그 리포트를 만들기 위해 개발되었다 합니다. 단순한 문자열 처리, 단순한 파일 처리를 해서 레포트를 작성해 주는 간단한 언어였습니다. 그런데 얼마 뒤, 펄이 유닉스 해킹에 큰 도움이 된다는 사실이 알려집니다. 많은 유닉스 긱스들은 펄이 쉘 스크립트와 C 사이의 간격을 매끄럽게 이어줄 수 있다는 것을 알게 되었고 펄은 큰 인기를 누립니다.

 

펄을 만든 Larry Wall

 

펄이 극적으로 성장할 수 있었던 것은 웹의 등장 때문이었습니다. 웹(www)은 사실상 문서가 왔다 갔다하는, 또 작업의 대부분이 문자열을 처리하는 것이었기 때문에 펄의 강력한 문자열 처리 능력과 웹의 매치는 아주 이상적이었습니다. 특히 사용자와의 인터액션을 가능케 해주는 폼(form)이 등장하면서 폼을 처리해주는 프로그램 CGI (common gateway interface)를 만드는 데 안성맞춤이었습니다. 웹의 폭발적 성장과 함께 펄 역시 유닉스 긱스들의 연장을 벗어나 광범위한 인기를 얻습니다.

 

펄은 많은 장점이 있는데 두 가지가 자주 언급됩니다.

 

'쉬운 일은 쉽게, 어려운 일도 가능한'(easy things easy, hard things possible)
'There is more than one way to do it' (TIMTOWTDI)

 

펄은 약간만 알더라도 즉시 많은 작업에 손쉽게 활용할 수 있는 언어이면서(이런 언어는 매우 드뭅니다), 깊게 공부하면 한도 없는, 거의 모든 것이 펄을 통해서 가능한 강력한 언어이기도 합니다. (이런 언어도 많지 않습니다)

 

펄의 또 하나의 특징은 호불호가 분명하다는 점입니다. 펄은 다른 고급언어(C, Java, 파스칼, Python, PHP, ...)와 다르게 계속해서 축약이 가능합니다. 또 "TIMTOWTDI"라는 표현처럼 코딩하는 사람마다 같은 기능을 다르게 코딩할 수 있기 때문에 '지저분한' 코드가 상대적으로 많습니다. 처음 펄 코드를 본 사람은 이상한 기호(@, %, [, $, *, @_, &... ; "funny characters"라 합니다)로 가득 차 있는 코드를 보며 상당히 긴장을 합니다. 다른 프로그래밍 언어에서는 잘 쓰이지 않거나 제한적으로 쓰이는 기호들이 변수 이름을 만드는 것 같은 기본적인 작업에서도 많이 쓰이기 때문에 펄 코드는 잘 모르는 사람이 볼 때 암호처럼 보이기 때문입니다.

 

게다가 펄은 암묵적으로 은밀하게(implicit) 이뤄지는 작업이 많습니다. '특별히 명시하지 않으면 모든 결과는 어디에 담긴다'는 것이 많이 존재합니다 그래서 다른 언어처럼 깔끔하고 읽기좋게 코딩할 수 있으면서도, 한없이 읽기 어렵게 코딩할 수도 있습니다. 암묵적으로 이뤄지는 부분들을 교묘하게 활용하면 그야말로 암호같은 코드가 되기도 합니다. 코드를 읽기 어렵게 만들 수 있다는 점이 의미가 있는 것이 아니라 코드가 매우 컴팩트하게 축약될 수 있다는 점이 펄의 강점입니다.

 

연관된 얘기지만 펄은 또 형(type)을 엄격하게 규정하지 않습니다. C같은 언어는 변수를 선언할 때도 그 변수형을 확실하게 규정해야 하지만 펄은 변수를 미리 선언할 필요도 없을 뿐만 아니라, 선언을 하는 경우도 형을 지정하지 않습니다. 변수들은 각기 자신이 속한 문맥(context; 펄에서 매우 중요한 의미를 갖습니다)에 맞게 적절히 취급됩니다. 이런 점들은 언어학자인 래리 월 氏가 언어를 설계할 때부터 가급적 자연어에 유사하게 만들려 했기 때문입니다. 일상 영어에서 같은 단어가 문맥에 따라 동사로도 쓰이고 명사로도 쓰이는 것처럼, 펄의 변수 역시 문맥에 따라 그 용도가 적절히 조절됩니다. 그래서 펄은 똑같은 기능을 하는 코드인데도 코딩하는 사람에 따라 전혀 다를 수 있고, 엄격한 규정 속에 코딩하는 것을 선호하는 사람들은 펄을 '지저분하다'며 피하게 되었습니다. (물론 펄도 얼마든지 읽기 좋게 코딩할 수 있습니다.)

한편, 지저분한 펄 코딩을 즐기는 펄 해커도 상당수 있으며, 누가 더 암호같은 코드를 잘 만들어 내느냐로 경쟁을 하기도 합니다. (심지어 대회도 있습니다 -_-;; Obfuscated Perl contest. C도 유사한 것이 있죠?)

 

얼마 전 DVD를 크랙하는 프로그램이 인터넷 상에 떠돌아서 문제가 된 적이 있었는데, 그 DVD 카피라잇 깨주는 프로그램은 펄로 작성되었습니다. 놀라운 것은 그 코드가 채 열 줄이 안 되었다는 점입니다. 그것은, 그만큼 펄이 강력한 언어라는 점과 펄 코드는 줄이고 줄여서 거의 암호처럼 만들어 버릴 수 있기 때문입니다. 이 코드가 DVD 프로텍션을 깨뜨린 펄 코드입니다.

 

$_='while(read+STDIN,$_,2048){$a=29;$b=73;$c=142;$t=255;@t=map{$_%16or$t^=$c^=(  
$m=(11,10,116,100,11,122,20,100)[$_/16%8])&110;$t^=(72,@z=(64,72,$a^=12*($_%16  
-2?0:$m&17)),$b^=$_%64?12:0,@z)[$_%8]}(16..271);if((@a=unx"C*",$_)[20]&48){$h  
=5;$_=unxb24,join"",@b=map{xB8,unxb8,chr($_^$a[--$h+84])}@ARGV;s/...$/1$&/;$  
d=unxV,xb25,$_;$e=256|(ord$b[4])<<9|ord$b[3];$d=$d8^($f=$t&($d12^$d4^ $d^$d/8))  
<<17,$e=$e8^($t&($g=($q=$e14&7^$e)^$q*8^$q<<6))<<9,$_=$t[$_]^  
(($h=8)+=$f+(~$g&$t))for@a[128..$#a]}print+x"C*",@a}';s/x/pack+/g;eval

 

위와 같이 코딩할 수 있기 때문에, 파스칼(Pascal)이나 자바(Java), 파이썬(Python) 같은 정리되고 엄격한 프로그래밍을 선호하는 프로그래머는 펄의 분방함을 무척 싫어합니다. 역으로 해커들은 펄의 그런 특성을 무척 좋아하기 때문에 펄을 좋아하며, '펄 해커'라는 말을 일종의 영예로 받아들이고 있습니다.

 

펄은 특정 기능을 구현하기 위해 개발되어 온 언어 그 이상입니다. 펄에는 펄만의 독특하고 강렬한 문화가 있고, 펄만의 스타일이 있습니다. 언어 자체가 언어학자에 의해 최대한 자연어와 유사한 특징을 갖도록 디자인되어 왔기 때문에 펄은 단순히 프로그래밍 언어라 하고 말기에는 유연함에서나 둘러싸고 있는 문화에서 무척 독특합니다.

 

위 그림처럼 펄은 언어학의 영향을 받아서 문맥 의존성, 쉬운 일은 쉽게 어려운 일도 가능한 특징, TIMTOWTDI 같은 자연어와 유사한 특징을 갖습니다. 또 한 편으로는 일반 상식,'이렇게 되어야 하지 않겠느냐'라고 생각할 수 있는 부분이 당연히 그렇게 구현되어 있는 언어입니다. 또한 차가운 컴퓨터 언어에 문학적인 자취를 가미한 언어입니다.

 

펄은 그 어떤 커뮤니티보다 자발적이고 도움을 주는 것을 즐기는 강력한 커뮤니티가 있으며, 다른 사람이 만든 코드(모듈)를 손쉽게 사용할 수 있도록 확장성이 좋게 설계되어 있습니다. CPAN이라는 공간에는 상상할 수 있는 거의 모든 기능들이 이미 모듈 형태로 공개되어 있어서 필요한 기능을 아주 손쉽게 구현할 수 있습니다.

운영체계, 준비물

이 씨리즈는 기본적으로 리눅스(유닉스)를 사용한다는것을 전제로 할 예정입니다. 하지만 윈도우즈 유져들도 걱정하실 필요는 없습니다. 펄은 크로스 플랫폼 언어입니다. 유닉스상에서 작성한 펄 프로그램을 무리없이 윈도우즈상에서 실행해 볼 수 있습니다. 거의 수정할 필요도 없습니다. 펄은 리눅스, 여러 종류의 유닉스, 윈도우즈는 물론이고, 매킨토시, 아타리, 아미가, OS/2 등 거의 대부분의 운영체계로 포팅되어 있습니다.

 

리눅스 사용자는 아마도 사용하고 있는 리눅스 배포본을 인스톨할 때 펄이 함께 인스톨되어 있을 것입니다.

확인해 보려면,

 

whereis perl

 

이라고 터미널창에서 입력해 보세요.

 

/usr/bin/perl 이나 /usr/local/bin/perl 이라고 나올 것입니다.

 

펄은 이미 리눅스와 유닉스에 워낙 깊게 포함되어 있기 때문에 펄이 없이는 리눅스를 제대로 인스톨을 할 수 없을 정도가 되었습니다. 그래서 거의 웬만한 리눅스/유닉스 환경은 펄이 함께 설치되어 있습니다.

 

새로운 버전의 펄을 인스톨하려면 리눅스의 경우 2가지 방법이 있습니다. 바이너리 배포본을 받아서 설치할 수 있습니다. 또는 소스코드를 다운로드해서 직접 컴파일할 수 있습니다. 바이너리의 경우 www.perl.com의 다운로드에 몇 종류가 있습니다.

 

윈도우즈 펄로도 널리 알려진 Activestate에서 배포하고 있는 바이너리 등이 링크되어 있습니다. 바이너리를 설치해도 되지만, 역시 제대로 하려면 소스코드를 직접 컴파일하는 것이 좋습니다. 최신 버전 소스코드는 perl.com에서 stable 버전을 찾으세요.

 

이것을 다운로드 한 다음 tar.gz를 풀고 새로 생긴 "perl-버전" 디렉토리로 cd해서 이동한 뒤 다음과 같이 명령어를 타이핑 합니다. 맨 앞 달러표시는 터미널 창의 프럼프트입니다.

 

$ sh Configure -d $ make $ make test $ make install

 

밑의 세 개를 한 번에 실행하는 방법으로 &&를 사용할 수도 있습니다.

 

$ make && make test && make install

 

뭐가 한참 컴파일 되는데 그냥 놔두면 됩니다. (중간에 질문이 나오면서 멈추면 엔터키를 눌러주면 됩니다.) 컴파일이 끝나면 펄이 제대로 인스톨되었는지 확인해 보세요.

 

터미널 창에서,

 

$ perl -v

 

를 입력하면 저작권 관련 내용과 함께 펄 버전이 나옵니다.

 

윈도우즈 유져는 strawberry perl에 가서 인스톨러를 다운로드해서 진행하면 됩니다.

이제 펄 프로그램을 실제로 어떻게 실행하는지 알아봅시다. 펄 프로그램은,

 

 1. 맥 유져는 Terminal에서

 2. 리눅스 유져는 터미널 창에서 (한텀 등)

 3. 윈도즈 9x 유져는 도스창에서

 4. 윈도즈 NT, 2000, XP 유져는 명령 프롬프트 창에서

 

실행합니다.

 

리눅스 유져는 터미널 창에서 바로 vi나 emacs 등의 텍스트 에디터를 띄워서 작업한 다음 터미널 창에서 곧바로 실행해 볼 수 있습니다. 윈도우즈 유져는 아무 텍스트 에디터에서나 코드를 작성한 다음 적당한 곳에 저장한 뒤 도스 창이나 명령 프롬프트 창에서 실행하면 됩니다.

 

리눅스 유져는 큰 문제가 없지만 윈도우즈 유져의 경우에는 터미널 프로그램(cmd.exe)이 펄 프로그램과 같은 디렉토리 내에 있어야 실행이 되므로 탐색기의 검색 기능을 이용해서 cmd.exe 프로그램을 찾아서 이것을 펄 프로그램을 저장할 디렉토리에 복사해 두세요. 예를 하나 들어서 설명해 볼께요. 텍스트 에디터를 연 다음,

 

print "hello, world!";

 

라고 입력하고 이것을 hello.pl이라는 이름으로 저장을 합니다. 저장한 그 디렉토리에 cmd.exe를 복사하고 실행합니다. 명령 프롬프트 창에 hello.pl 이라고 입력하세요. 펄 코드가 실행되면서 hello, world!가 출력됩니다. 확장자가 .pl인 파일은 Perl.exe로 실행하도록 인스톨 시 설정이 되어 있기 때문에 바로 실행됩니다. 만약 안되면 명령 프롬프트 창에서,

 

perl hello.pl

 

라고 해보세요.

 

리눅스 유져는 vi에서 다음과 같이 코딩을 합니다.

 

#!/usr/bin/perl print "hello,world!";

 

이것을 hello.pl이라는 이름으로 저장한 다음,
터미널에서 perl hello.pl 또는 현재 펄 프로그램이 있는 디렉토리에 있다면 ./hello.pl 라고 해주면 실행됩니다. 주의할 점은, 파일 퍼미션이 반드시 0755로 되어 있어야 합니다.

chmod +x hello.pl 또는 chmod 755 hello.pl로 해서 실행가능한 퍼미션을 주면 됩니다.

 

리눅스인 경우 위와 같이 첫줄이 반드시 #!/usr/bin/perl로 시작해야 합니다. (whereis perl 에서 알려주는 펄 패쓰입니다. 유닉스인 경우 #!/usr/local/bin/perl일 것입니다)

 

#!은 shebang(=sharp + bang)이라고 합니다. 밑에 나오는 코드를 어떤 프로그램을 이용해서 실행할 것인가를 설명하는 부분입니다. #!/usr/bin/perl의 의미는, "다음에 나올 코드는 /usr/bin 디렉토리에 있는 perl 프로그램으로 실행하라"입니다.

 

리눅스는 펄 실행 방법이 하나 더 있습니다. 간단한 수십 줄 내외의 펄 코드(Snippet)를 테스트할 때 사용되는 방법입니다. 터미널 창에서 perl만 입력합니다. 그러면 한 줄 띄워지면서 기다리고 있을 것입니다. 그 상태에서 간단한 펄 코드를 입력합니다. 복사-붙이기를 해도 됩니다. 다 입력했으면 CTRL-D를 눌러 보세요. 그 펄 코드가 실행되면서 (에러가 있다면 알려주면서) 결과가 출력됩니다. 펄 파일을 따로 만들지 않고 간단하게 테스트할 때 아주 유용합니다.

이제 본격적으로 신나는 펄의 세계로 함께 들어가 봅시다.

반응형
댓글