PHP, Perl, Ruby, Python 비교

나는 왜 PHP보다 Python을 좋아하는가? 깔끔한 문법이 일단 매력이지만 그게 다가 아니다.

기능 비교 (( http://en.wikipedia.org/wiki/First-class_function, http://en.wikipedia.org/wiki/List_comprehension, http://en.wikipedia.org/wiki/Mixin ))

일단은 언어의 강력함에서 큰 차이를 보인다. 생산성에 신경쓰는 언어들이라면 당연히 지원해 줄 법한 기능들에 대해 PHP는 너무나도 무심하다.

PHP Perl Ruby Python
Higher-order functions Arguments Yes Yes Yes Yes
Results Yes Yes Yes Yes
Non-local variables Nested functions No (( Nested functions are created at global scope once the outer function is executed. )) 6 Yes Yes
Anonymous functions 5.3 Yes Yes Yes
Closures 5.3 (( Anonymous functions could be created using create_function but could not refer to variable in the outer scope. )) Yes Yes Yes
Partial application No 6 1.9 (( Explicit currying with Proc#curry )) 2.5 (( Explicit partial application with functools.partial ))
List comprehension No No No Yes
Mixin No 6 Yes Yes

Anonymous functions와 Closures를 PHP 5.3에서 지원하기는 하지만 그 기능을 웹애플리케이션을 개발할 때 사용하기엔 PHP 5.3이 너무 최근(2009년)에 나왔다. 내 애플리케이션의 요구사항을 PHP 5.3 이상으로 하는 것은 시기상조다.

성능 비교

아래의 링크를 보면 모든 테스트케이스에서 python이 php보다 훨씬 좋은 성능을 보인다. pypy나 psyco를 사용한다면 상대가 안되는 수준이 될 듯.

광고

PHP의 당황스런 특징들

PHP는 나름 태생이 특이한 언어다. 현재 웹에서 널리 쓰이고 있는 많은 서버사이드 언어들(Java, PHP, Python, Ruby 등등 ((등등 취급해서 미안하다. perl 그리고 c)) ) – 중에서 거의 유일하게 ‘진짜로 웹개발에 특화된’ 언어다.

그래서 그런건지 PHP는 다른 언어를 쓰다 온 사람들을 희한한 방식으로 깜짝 놀래키곤 한다. 지난 3년간 나를 당황시킨 PHP의 독특한 동작 몇가지를 소개해 보겠다.

0 == ‘string’

<?php
print 0=='hello';

위 코드를 실행하면 놀랍게도 1이 출력된다.

PHP는 어째서 숫자 0과 ‘hello’을 같다(equal)고 판단한 것인가? 그것은 숫자와 문자열을 equal operator로 비교를 시도하는 경우, PHP는 문자열을 숫자로 변환하기 때문이다. ‘hello’를 숫자로 변환하면 0이 되므로 PHP는 0과 ‘hello’를 같다고 판단한다.

PHP 개발자들은 ’42’ == 42 와 같은 평가식이 아무 에러 없이 참을 반환하는 편리함을 누리는 동시에, 위와 같은 PHP 고유의 독특한 해석도 받아들여야만 한다.

이렇게 동작하게 된 배경에는 PHP가 태생적으로 HTML에 embeded해서 사용하기 위한 언어라는 사실이 자리하고 있을 것이다. 그런 형태로 사용하려면 가급적 코드가 짧은 것이 바람직할 것이며, 잦을 수 밖에 없는 문자열 변환 함수 호출도 생략할 수 있게 하고 싶었던 것이 아닐런지.
이런 특성은 PHP가 perl의 weak typing을 그대로 물려받은 것이 아닐까 싶다.

함수 이름에 대소문자를 구분하지 않는다.

<?php
function foo() {
    print 'hello';
}
FoO();

C 개발자가 보면 기절초풍할 코드지만 문제없이 잘 동작한다. 더 신기하게도, 함수 이름에선 대소문자를 전혀 구분하지 않지만 변수 이름에선 정확하게 구분한다.

이것 역시 PHP가 웹개발용 언어이기 때문일 것이다. 내 추측으로는 과거 HTML 태그를 소문자로 써야 하는건지 대문자로 써야하는 건지 명확하지 않던 시절의 잔재가 아닐까 싶다. HTML element를 만들어주는 함수를 PHP로 작성했을 때(예: a(), table(), …) 대문자로 호출하든 소문자로 호출하든 잘 동작하게 하고 싶었던 게 아닐까?

foo()[0] 불가능

<?php
function foo() {
    return array('first', 'second');
}

$result = foo();
print $result[0]; # print 'first'
print foo()[0]; # ?

두 print 문 모두 문제없이 ‘first’ 가 출력될 것으로 기대하게 되지만,  사실 두번째 print 문은 parse 에러를 일으킨다.

PHP Parse error:  syntax error, unexpected '[' in - on line 8

함수 호출문 뒤에 첨자 연산자를 붙여 사용할 수 없다. 이유는 나도 모르겠다. 파서를 단순하게 유지하기 위함일 것이라고 짐작할 뿐이다.

PHP 6에서도 안될 예정이다: http://bugs.php.net/bug.php?id=43577

프로그래밍 언어들을 한문장으로 소개

Perl

Perl is a language optimized for scanning arbitrary text files, extracting information from those text files, and printing reports based on that information. ((man perl))
펄은 텍스트를 다루는데 최적화된 언어다.

Python

Python is an interpreted, interactive, object-oriented programming language  that  combines  remarkable power with very clear syntax. ((man python))
파이썬은 매우 간결한 문법이 특징.
동의한표. 내가 써 본 언어 중에서 가장 문법이 간결했다. 물론 lisp 계열은 제외하고.

Ruby

Ruby is an interpreted scripting language for quick and easy object-oriented programming. ((man ruby))
루비는 빠르고 쉬운 OOP를 위한 스크립트 언어다.
여기서 빠르다는건 성능이 아니라 생산성을 의미하는 것이겠지. 확실히 파이썬보다 코드를 짧게 작성할 수 있다.

PHP

PHP is a widely-used general-purpose scripting language that is especially suited for Web development and can be embedded into HTML. ((man php))
PHP는 원래 HTML에 끼워넣는 것에 특화된 언어다.
언어가 좀 엉성해 보이고 빈약해서 난 항상 불만이긴 한데, 어찌보면 그런 점도 이런 지향점을 고려하면 타당한 것일 수 있다.

C++

C++ is a general purpose programming language with a bias towards systems programming that
* is a better C
* supports data abstraction
* supports object-oriented programming
* supports generic programming. ((http://www2.research.att.com/~bs/C++.html))
C++은 C보다 좋은 언어라고 한다.
잘못하면 싸움나겠네.

J

J is a modern, high-level, general-purpose, high-performance programming language. ((http://www.jsoftware.com/))
현대적 고수준 다목적 고성능 언어.
그리고 C++ 보다도 어려운 것 같아.

Lisp

Lisp is a programmable programming language. ((책 <On Lisp>의 서문에서. Paul Graham은 “It’s difficult to convey the essence of a programming language in one sentence, but John Foderaro has come close:” 라고 말하며 이 정의를 소개한다.))
정말 멋진 정의다!

Java?

자바는 공신력 있고 설득력 있는 한문장 소개를 찾지 못했다. C++ 보다도 정체성이 불분명한 녀석이다.