Python은 이미 Google과 NASA에서 공식적으로 사용하는 언어로 잘 알려져 있다. 그리고 일부 IronPython 같은 프로그램들은 Microsoft가 지원을 하기도 한다. Ruby는 Ruby on Rails라는 프로그램 때문에 세상 사람들에게 더 알려지는 계기가 되었다. 그리고 오픈마루의 Springnote, (주)미투데이의 Me2Day등 실험적인 기술들의 근간에는 Ruby가 존재한다. 이런 이유들 때문에 각각의 인터프리터 언어를 알아볼 겸 두 언어가 가진 특징 및 지향하는 방향에 대해서 글을 써보고자 한다. 하지만 둘 중 누가 더 나은가에 대한 글은 아니다. 두 언어의 특징을 분석함에 따라서 프로젝트의 목적에 따라 더 적합한 언어를 선택할 수 있을 것이라는 생각에서 이 글을 시작한다.
2. 소개
간단히 두 언어가 어떻게 시작되었고 그들의 철학은 무엇인지 대해서 알아 보았다. Python 1991년 Guido Van Rossum이 Python프로젝트를 공개했다. 그가 일을 하면서 작성하고 검증하기 쉬운 관리용 스크립트 언어와 일반적인 사용자가 프로그래밍 하기 쉬운 프로그래밍 언어를 개발하는 프로젝트들을 하면서 Python에 관한 구상을 하기 시작했다. 크리스마스 연휴 중에 할 일이 없어서 2주 동안 Python을 개발했다고 한다. (Interview with Guido van Rossum)
ABC, ALGOL 68, C, Haskell, Icon, Lisp, Modula-3, Perl, Java등의 언어들로부터 영향을 받았으며, 다중-패러다임을 지향한다. 하지만 Python이 추구하는 철학은 꽤 단순 명료하다. "어떤 일을 해결하는 데에는 오직 하나의 방법이 있어야 한다." ("there should be one—and preferably only one—obvious way to do it",The Zen of Python) 즉, 본래의 경쟁자인 Perl의 개발 철학인 "한가지 문제를 해결하는데 다양한 방법이 존재한다."와 상반 되는 생각이며, 아름답고, 명료하며 간결한 코드를 생산하는 것이 그들의 실제 목적이다. Python은 새로운 버전 Python 3000으로 이름된 3.0버전의 5번째 알파가 최근 5월에 발표되었다. 이 프로젝트는 PEP(Python Enhancement Proposal)에 의해 진행이 되고 있으며, 2.x버전에서 가지고 있는 결함과 함수를 구현하는데 중복되는 부분을 제거하는 방향으로 나아가고 있다. 참고:Python (programming language) - Wikipedia
Ruby Ruby는 1995년 마스모토 유키히로(일명 "Matz")가 공개하였으며, 영향을 받은 언어로는 Smalltalk, Perl, Lisp, Scheme, Python, CLU, Eiffel, Ada, Dylan등 Python에 비해 비교적 최근에 개발된 언어이다. 그래서 영향을 받은 언어들도 주로 고급 언어들이며, 다양한 언어들의 영향을 받아 역시 다중 패러다임을 지향한다. 일본에서 만들어진 개발도구이므로 일본 내에서만 사용되다가 이 문서들이 영어로 번역되고 난 뒤 후에 세계적으로 유명해졌다.
마츠는 Ruby를 개발한 동기로 기계를 위한 프로그램이 아니라 사람을 위하는 프로그램을 만들고 싶었다고 밝히고 있으며, 공식 홈페이지의 첫 머리에도 그들의 모토는 "루비: 프로그래머의 단짝 친구(Ruby-Programmer's Best Friend)"라고 밝히고 있다. 2007년 12월 1.9버전이 출시 되었다. 참고:Ruby (programming language) - Wikipedia
3. 두 언어간 유사성
Python과 Ruby는 객체 지향 언어로 모두 객체로 구현되며, 변수는 객체의 참조 수준으로 다루고 있다. 또 멀티패러다임을 가지고 있어 순차적 프로그래밍 방식에서 객체 지향형 프로그래밍 방식으로 손쉽게 전환이 가능하다. 둘 모두 가비지콜랙션과 동적변수형(Dynamically Typed)를 지원한다. 또한 각 언어의 인터렉티브 쉘(Ruby - irb, Python - python, idle(GUI)), 표준라이브러리, 도큐먼트 툴 등을 제공한다. 배열의 처리 방식, 리스트 타입(lists)을 위한 브라켓(Bracket)과 사전 형(dicts)을 위한 브레이스(braces)의 사용(Ruby에서는 hashes라 부른다.) 그리고 문자열 처리방식(여러 줄의 문자열을 사용 가능함, Ruby - "spaning multiple lines", Python - "triple-quoted strings")등에서는 같은 처리 방식을 가지고 있다.
4. 각 언어별 특성 및 강점
3절에서 소개 한데로 각각의 언어는 다양한 언어들의 특징을 모방해왔고 아직도 발전하고 있는 언어들로 서로 영향을 주고 받으며 발전해 나가고 있다. 하지만 그 언어들이 가지고 있는 고유한 특성이나 강점을 보이는 부분들을 잘 활용해 다양한 프로그램들이 만들어지고 있다. 그래서 각자 고유한 특성들에 대해서 알아보았다.
Ruby Block and Closure Ruby가 다른 언어들과 가장 차별된 기능 중 하나는 Block과 Closure이다. Ruby의 개발자 Matz는 이 기능을 함수형 언어(정확히 Python의PEP343)에서 아이디어를 가지고 왔으며, Lisp의 Closure를 존중하고 싶었다고 말한다. Python도 2.2버전 이후 Lambda를 추가하여 Block과 같은 기능을 구현 하고 있지만 둘 사이에 다른 점은 Ruby의 Block이 정의된 스코프 이내의 변수까지 접근 가능하다. 이로 인해 Ruby Block이 메서드를 좀 더 유연하게 처리 할 수 있다. 두 언어의 Block기능에 관한 예제는 아래 사이트들에서 찾아 볼 수 있다. 참고:Blocks In Ruby,Ruby Block and Closure,Blocks In Python
Metaprogramming Ruby와 Python 모두 Metaprogramming(Lisp에서 나온 기술)을 지원한다. Ruby on Rails의 인상적인 실시간 Runtime 코드 생성 및 실행을 통해 Ruby의 Meta-programming 방식이 더 유명해졌지만, Python도 Metaprogramming을 지원한다. 다만 Ruby는 Class 정의에까지 영향을 줄 수 있는 클래스 매소드까지 불러올 수 있으나 Python은 Class정의 수준까지는 구현되어 있지는 않고 대신 Meta-class를 이용 해야 한다. Pyprotocal의 advise() 함수로 Ruby 프로세서를 흉내 낼 수는 있으나 많은 노력이 필요하다.
Thread 처리 두 언어 모드 Thread 처리를 지원하지만 Python에 비해 Ruby는 제한성을 가지고 있다. Ruby는 선점형 OS-level Thread를 지원하지 않는다. (비선점형 방식 Thread -Ruby Threading) 이는Stackless Python의 Microthread (코드를 작게 분할, 동시에 실행시켜 성능을 높이는 방식 -Wikipedia)와 유사한데 이미 주류계 Python에서는 사용되지 않는다. Python은 선점형 OS Thread를 지원한다. GIL(Global-Interpreter-Lock) 때문에 프로세서 처리 수준의 Python 프로그램에서 다중프로세서를 지원을 제한 받는다. 그래서 Ruby와 유사하다고는 할 수 있지만 GIL의 다중 CPU기능 제한 이외에는 여전히 동시에 Thread처리를 가능하기 때문에 사용 할 만하다. 하지만 Ruby의 thread도 C 확장기능 의해서 블록(Block) 할 수 있지만 하나 입출력을 블록 하지 않는다. Python의 OS-level Thread는 외부자원에서 Thread를 블록 할 때(디스크 액세스, 네트워크 IO, 소켓대기 등) 잘 사용된다. Microthread는 많은 양을 동시에 처리할 때(많은 양의 독립 context의 실행)에 사용되며, Python에서는 생성자(Generator)를 통해 처리하나 향후 Corutines로 처리 할 수 있다.
Library 둘 다 표준 라이브러리를 가지고 있고, 스크립터 형 언어인 만큼 많은 라이브러리를 제공한다. 하지만Python이 Ruby에 비해 더 많은 라이브러리를 보유하고 있다. 그래서, 일부 사용자는 Python이 잘 갖추어진 Library를 가지고 있기 때문에 더 선호한다고 한다.(Jeremy Zawodny: Should I Learn Python or Ruby next?) 물론 Python이 Ruby보다 출시된 지가 더 오래 되었고, 사람들에게 더 많이 알려졌기 때문에 더 많은 라이브러리를 보유하고 있다고 생각 할 수도 있다.
5. 퍼포먼스
대부분 Python이 Ruby에 비해 더 빠르다고 말을 하고 있지만 객관적인 지표를 알기 위해서 둘을 비교한 벤치마크를 살펴보았다. 비교 대상으로 Python 2.5.1과 Ruby 1.8.6이 사용되었다. 위의 그래프에서 보이듯 전체적으로 Python이 Ruby에 비해 각각의 프로그램의 처리속도가 빠르며 일부 프로그램서만 Ruby가 약간 빠르거나 메모리 사용량이 적은 것을 볼 수 있다. 전반적으로 Python이 일반적으로 처리 속도와 메모리 사용량이 Ruby에 비해 조금 더 빠르다고 볼 수 있다. 좀 더 자세한 내용은Benchmark Python vs Ruby에서 확인 할 수 있다.
6. 결론
Python은 전체적으로 성능 면에서 안정적이고 단단하게 기능을 구현 해나가는 특징을 보이고, Ruby는 프로그램의 기술적인 측면보다 프로그래밍을 하는 방법적인 기능 구현에 좀 더 시간을 투자하는 모습을 볼 수 있었다. Python에 비해서 어린 Ruby가 Library나 아직 부족한 부분(Unicode처리 등, Ruby 2.0버전에서 지원 예정)이 있지만 시간이 지나면서 그 언어들의 추종자들에 의해 발전을 거듭 할 것이다. 또한 Python은 나름대로의 색을 갖추고 있으며 내년쯤에 새롭게 나올 Python3k버전도 기대 할만 하다.
7. 더 참고 할 만한 곳들 끝으로 이 글을 쓰는데 참고한 글들과 각 언어별 재미있는 프로젝트들을 소개한다.
RECENT COMMENT