Software Development

Updated http-access2 on my machine

bindung군의 RSS가 내 RSS reader에서 제대로 sync가 안되는 문제를 해결하기 위해, http-access2 Ruby module을 2.0.4에서 2.0.5로 update했다. 오랜만에 http-access2 페이지에 들어갔더니, trac을 사용하고 있었다. 개인적으로 프로젝트 관리 툴로 dotproject를 써보고 있었는데, 기능은 충실하지만, 필요 이상으로 복잡한 감이 있다. 나도 trac을 한번 써볼까…생각 중.

2004-12-25: Version 2.0.5

Version 2.0.5 released. This is a minor bug fix release.

  • There is a server which does not like ‘foo.bar.com:80’ style Host header. The server for http://rubyforge.org/export/rss_sfnews.php seems to dislike HTTP/1.1 Host header “Host: rubyforge.net:80”. It returns HTTP 302: Found and redirects to the page again, causes HTTPAccess2::Client to raise “retry count exceeded”. Keat found that the server likes “Host: rubyforge.net” (not with port number).

http://rrr.jin.gr.jp/projects/http-access2/wiki/WikiStart#20041225Version205

Connection: close 헤더를 넣지 않으면, web server측에서 persistent connection을 유지할 경우, HTTPAccess2::Client::get()이 pending되는 문제는 아직 여전한 것 같다. 디버깅해보아야할 듯.

Updated http-access2 on my machine 더 읽기"

오늘 report한 wxRuby bug

deepblue군루비 사용자 모임에 올라온 버그를 메신저로 슬쩍 알려주길래, 내 amd64 machine에 wxRuby를 설치하고 디버깅해보았다.

http://rubyforge.org/tracker/?func=detail&aid=1383&group_id=35&atid=218

전에 wxRuby를 사용해볼 때도, 여러번 segmentation fault를 경험했었는데, 아무래도 unit testing을 해보지 않고, API mapping만 해놓은 모양이다.

그건 그렇고, 루비 사용자 모임의 RSS feed를 받고 있었는데, 최근 업데이트가 안되고 있다 했더니, RSS 링크가 어디론가 사라져버렸다. 뭘까?

오늘 report한 wxRuby bug 더 읽기"

Installing wxRuby on gentoo Linux platform

Introduction

gentoo Linux platform에서 wxWindows와 wxRuby를 source로부터 설치하는 방법을 기술한다.

Installing wxWindows

  1. http://www.wxwindows.org/로부터 wxWindows source를 다운로드 받는다. 본인은 wxGTK-2.4.2.tar.gz를 기준으로 설명한다.
  2. wxWindows를 설치한다.
    cd wxGTK-2.4.2/
    ./configure --with-gtk --enable-gtk2 --enable-unicode
    make
    su
    make install
    
  3. wxRuby가 htmlproc.h를 필요로 하기 때문에 다음 command를 실행한다.
    /bin/install -c -m 644 ./include/wx/html/htmldefs.h /usr/local/include/wx/html/htmldefs.h
    
  4. wxRuby가 문서에 따라 설치한다.
    cd contrib/src/xrc
    make
    su
    make install
    

Installing wxRuby

  1. README에 나와있는대로 설치한다.
        > ruby extconf.rb
    > make     [[[or nmake, depending on your platform]]]
    > ruby install.rb
    
  2. 단, install 시 “ruby install.rb” 대신 “make install”을 사용한다.

Installing wxRuby on gentoo Linux platform 더 읽기"

Programming Language War

프로그래밍 언어 전쟁

흔히 프로그래머들 사이에 일어나는 성전의 주제 중의 하나가 바로 프로그래밍 언어다. 물론 논쟁의 형태는 “어느 프로그래밍 언어가 더 좋은가/나쁜가?”는 것이다. 이 “좋은가/나쁜가”라는 말 자체는 매우 모호하다.

물론, 프로그래머들이 아닌 컴퓨터 과학자들도 프로그래밍 언어의 성질에 대해서 연구하고 있고, 이러한 “좋음/나쁨”에 대한 여러가지 합리적인 의견들을 가지고 있을 것이다. 하지만, 자연 언어가 그런 것과 마찬가지로, 프로그래밍 언어는 문법만으로 이루어져있지 않다. 예를 들어, 한국어는 한국어 문법만으로 이루어져있지 않다. 한국어로 밥먹었냐고 물어보는 방법, 한국어로 문학 작품을 쓰는 방법, 그리고 한국어를 사용하는 언중들의 사상, 종교, 문화 등 언어 외적인 것이 그 언어와 밀접한 관련을 가지고 있다. 프로그래밍 언어도 마찬가지다. 프로그래밍 언어를 사용하는 여러가지 idiom들, 컴파일러/인터프리터의 구현, 표준 라이브러리, 사용자 라이브러리의 보편화 정도, 언어를 위한 툴 (IDE), 언어가 사용되는 프로젝트에 따라, 프로그래밍 언어를 평가하는 기준은 달라질 수 밖에 없다.

그런데, 실제로 어느 게시판에 들어가서 이러한 논쟁을 구경해보면, 특별히 이러한 기준들을 설정해놓고 논의를 하는 것은 보기 힘들다. 어떤 사람들은 특정 언어 구현에 의한 프로그램 성능을 따지고 있고, 어떤 사람들은 새로운 기능이 추가되었음을 강조한다.

이러한 사실보다 더욱 괴로운 것은, 두가지 언어를 비교하는 논쟁에서, 실제로 (자신이 공격하는) 다른 언어나 다른 환경을 경험하지 못한 사람들이 대부분이라는 것이다. 만약, 두 언어를 어느 정도 경험해보았다고 하더라도, 언어 외적인 여러가지 기준들에 대해서 그 사람이 올바른 평가를 내릴 수 있는지도 의문이다. 서로 부족한 정보를 가지고 누가 ‘옳은가’를 따지는 것은 매우 소모적이고 쓸데없는 일이 되기 쉽다.

옮고 그름의 문제? 선택의 문제!

보통 프로그래밍 언어 전쟁의 대상이 되는 범용 (General-purpose) 프로그래밍 언어들은, 프로그래머가 무슨 일을 하고자 했든간에, 대부분의 일을 할 수 있다. static typing이든, dynamic typing이든, garbage collection을 채용하든 안하든 프로그램이 무슨 일을 하는가에는 상관이 없다. procedural programming language인 C로도 OOP의 polymorphism을 구현할 수 있다.

다만, 프로그래머가 생각하는 방식과 언어가 얼마나 호환되는가, 프로그래머가 원하는 성능을 낼 수 있는가, 프로그래머가 이미 존재하는 라이브러리를 재사용할 수 있는가, 프로그램을 얼마나 여러가지 시스템에서 동작시킬 수 있는가, 우리 팀에 그 언어를 사용할 수 있는 사람이 얼마나 되는가 등이 다를 뿐이다.

예를 들어, 웹브라우저를 만든다고 해보자. C, C++, Java, Python, Haskell, PHP 어떤 언어를 사용하든 웹브라우저를 만들 수 있다. 하지만 각 언어들은 서로 다른 철학을 가지고 있기 때문에, structured programming에 익숙한 사람이 Haskell을 사용해서 개발하거나, functional programming에 익숙한 사람이 Java를 사용해서 개발하는데에는 많은 시간이 걸릴 것이다. 반면에, PHP의 설계자는 웹 어플리케이션을 만들기 위한 언어를 설계했기 때문에, 웹브라우저에는 매우 부적합할 수 있다. 만약, 웹브라우저의 성능이 중요하다면, 어떤 언어의 선택은 매우 나쁠 수도 있다. 또한, 어떤 언어에는 쓸만한 GUI 라이브러리가 없다면, 웹브라우저의 개발에 난항을 겪을지도 모른다.

프로젝트 초기에 프로그래밍 언어를 채택할 임무를 맡은 사람은 바로 이러한 점들을 고려해서 프로그래밍 언어를 선택해야하는 것이다.

무슨 프로그래밍 언어를 선택할 것인가?

David West의 책, ‘Object Thinking’에서는 무슨 프로그래밍 언어를 선택할 것인가에 대한 기준에 대해서 얘기하고 있다.

잘못된 기준

  • Loyalty: 우린 마이크로소프트 가게니까, Visual Basic을 사용한다.

  • Bandwagon: 모두가 자바를 사용한다.

  • Economics: 자바 프로그래머는 10명에 100원이고, 완전히 대체가능하다. 한명을 잃더라도, 쉽게 대체할 사람을 찾을 수 있다.

  • Culture: 실시간/임베디드 어플리케이션에서는 C++ 말고는 쓸 수 없다.

  • Resume: 모든 회사 취업 광고에는 C# 경력을 물어본다. 뭔가 눈길을 끄는 게 필요하다.

  • Inertia: 난 첫번째 프로그램을 COBOL로 작성했고, COBOL이 가장 친숙하다. 따라서, 이 프로젝트에는 COBOL이 적합하다. COBOL을 사용하는 것은 프로젝트를 관리하는 데 편리하다.

올바른 기준

  • 실리적 기준: 성숙된 라이브러리, 외부 시스템과의 호환성, 가용한 노동력, 경제적인 이유.

  • 성능

  • 철학: 언어 디자이너의 의도, 가치, 생각.

Conclusion

위와 같은 기준에 따르면, 약간의 syntatic sugar 라든가 ‘pure XXX language’는 실질적으로 중요한 선택 기준이 되기는 힘들다. 물론 대부분의 선택 기준이 동등하다면, 프로그래밍 언어 전쟁에 참여해서 언어들의 서열을 매기는 것에 관심있는 사람들에게는 쓸모있는 기준이 될 수는 있다. 하지만, 대개는 그렇지 않다는 것이 문제다.

많은 사람들이 프로그래밍 언어의 ‘좋음/나쁨’에 관심이 있지만, 대부분은 ‘잘못된 기준’에 따라 프로그래밍 언어를 선택한다. 왜 CS101에서는 이런 것을 가르쳐주지 않은 것일까?

Programming Language War 더 읽기"

'Ruby on Rails' on Slashdot

‘Ruby on Rails’를 소개하는 기사가 Slashdot에 실렸다. 이 기사에서는 ONLamp의 Ruby on Rails walkthrough를 언급하고 있기도 하다.

이 walkthrough의 comment를 보다가 Maypole을 발견했다. Maypole은 Perl 기반의 Web app framework이다. 역시 Struts로부터 영향을 받은 것 같고, 따라서, MVC 모델을 채용하고 있으며, Rails 처럼 자동적인 OR mapping 기능을 제공하고 있다. Rails가 처음으로 사용한 방식은 아닌 모양이다.
http://www.perl.com/pub/a/2004/04/15/maypole.html
http://www-106.ibm.com/developerworks/linux/library/l-maypole/?ca=dgr-perlw02BuildMypole

그리고, 직접적으로 Rails로부터 영향을 받은 Trails란 Java project도 있다. Trails에서 Rails와 함께 언급하고 있는 Naked objects는 옛날에 Smalltalk 쪽에서 시도했던, GUI를 사용한 OOP framework인 것 같으나, 좀 더 살펴봐야할 듯하다.

'Ruby on Rails' on Slashdot 더 읽기"

"can't find header files for ruby" error when require 'mkmf' in a ruby program

www.lastmind.net 은 amd64 machine이고, gentoo linux를 사용하고 있는데, gentoo 사용자가 적다보니, x86 계열은 그럭저럭 지원되지만 x86_64(=amd64) 쪽은 잘 지원되지 않는 경우가 많다.

eruby portage(gentoo에서의 package)도 x86_64에서는 지원이 안되어서 직접 source를 받아서 설치해야했다. configure.rb 부터 ‘can’t find header files for ruby’ 에러가 발생했다. 다음과 같은 간단한 errata가 원인.

Found an errata in /usr/lib/ruby/1.8/x86_64-linux/rbconfig.rb.
--- rbconfig.rb.old     2005-01-13 13:29:43.581254776 +0900
+++ rbconfig.rb 2005-01-13 13:29:47.055726576 +0900
@@ -29,7 +29,7 @@
CONFIG["sysconfdir"] = "$(DESTDIR)/etc"
CONFIG["sharedstatedir"] = "$(prefix)/com"
CONFIG["localstatedir"] = "$(DESTDIR)/var/lib"
-  CONFIG["libdir"] = "$(DESTDIR)//usr/lib"
+  CONFIG["libdir"] = "$(DESTDIR)/usr/lib"
CONFIG["includedir"] = "$(prefix)/include"
CONFIG["oldincludedir"] = "/usr/include"
CONFIG["infodir"] = "$(DESTDIR)/usr/share/info"

http://bugs.gentoo.org/show_bug.cgi?id=76359

 

"can't find header files for ruby" error when require 'mkmf' in a ruby program 더 읽기"

Ruby on Rails

Rails는 Ruby 기반의 Web App Framework이다.

특징을 꼽아본다면,

  • Model-View-Controller 패턴을 채택하고 있다.
  • 단순하고 강력한 OR mapping을 제공한다.
  • CRUD logic을 자동으로 생성해준다.

아직 Rails의 ‘The Seeing Is Believing Lesson’을 보지못했다면, 지금 바로 보길 바란다. Web App Framework를 어느 정도 경험해본 사람이더라도, 엄청나게 빠른 prototyping에 놀랄 것이다. 설치부터, 간단한 blog의 prototype 구현까지 10분이면 된다니, 놀랍지 않은가.

불과 수시간 정도 경험해보고나서 판단을 내리기에는 무리일지 모르겠지만, Rails의 빠른 prototyping은 Model, View, Controller의 mapping이 name-based로 이루어지는 점과, OR mapping (DB table과 Model class의 mapping) 역시 name-based로 이루어진다는 점, 그리고 CRUD를 자동으로 생성해주는 점에 기인한다고 생각된다. 다른 Web App Framework를 약간이라도 들여다본 사람이라면 알아차리겠지만, 그러한 framework에서는 확장성을 위한 추가적인 노력이 필요하기 때문에, Rails에서 얻을 수 있는 빠른 prototyping 능력을 희생하고 있다고 볼 수 있다.

다만, OR mapping을 할 때, DB table을 만든 후, Model class가 table에 따라 생성되므로, 설계가 data-oriented 화할 가능성이 커지지 않을까 하는 우려가 있다. 이 부분에 대해서는, 아직 Rails를 충분히 경험하지 못했으므로, 더이상의 언급은 나중으로 미루는 것이 좋을 듯 하다.

다음은 ‘A Guide to Testing the Rails’를 보면서 작성한 Rails application이다.

http://www.lastmind.net/rails/todo/list

Tutorial을 따라가는 동안 내내 즐거웠고, 거의 막힘없이 진행하기는 했으나, 아쉽게도 host의 root로 Rails 설치 위치를 alias하지 않은 경우에(나는 http://www.lastmind.net/이나 http://rails.lastmind.net/이 아니라, http://www.lastmind.net/rails 아래에 Rails app을 설치했다.), mod_rewrite를 이용하는 RewriteRule이 문제가 생겨서, 약간의 손질이 필요했다. 다음이 그 내용이다.

# Make sure that mod_ruby.c has been added and loaded as a module with Apache
RewriteEngine On
# Change extension from .cgi to .fcgi to switch to FCGI and to .rb to switch to mod_ruby
RewriteBase /rails/dispatch.cgi
# Enable this rewrite rule to point to the controller/action that should serve root.
# RewriteRule ^$ /controller/action [R]
# Add missing slash
RewriteRule ^([-_a-zA-Z0-9]+)$                                            $1/
# Default rewriting rules.
RewriteRule ^([-_a-zA-Z0-9]+)/([-_a-zA-Z0-9]+)/([0-9]+)$                  ?controller=$1&action=$2&id=$3 [QSA,L]
RewriteRule ^([-_a-zA-Z0-9]+)/([-_a-zA-Z0-9]+)$                           ?controller=$1&action=$2 [QSA,L]
RewriteRule ^([-_a-zA-Z0-9]+)/$                                           ?controller=$1&action=index [QSA,L]
RewriteRule ^([-_a-zA-Z0-9]+)/([-_a-zA-Z0-9]+)/([-_a-zA-Z0-9]+)/([0-9]+)$ ?module=$1&controller=$2&action=$3&id=$4 [QSA,L]
RewriteRule ^([-_a-zA-Z0-9]+)/([-_a-zA-Z0-9]+)/([-_a-zA-Z0-9]+)$          ?module=$1&controller=$2&action=$3 [QSA,L]
RewriteRule ^([-_a-zA-Z0-9]+)/([-_a-zA-Z0-9]+)/$                          ?module=$1&controller=$2&action=index [QSA,L]

최근에 Ruby를 사용한 Web app를 이것저것 만들고 있었는데, OR mapping에 시간을 불필요하게 많이 소비하고 있었고, view에 있어서 templating이 매우 필요했는데, 이러한 점들 모두 Rails가 해결해줄 수 있을 것 같아서 기쁘다. 앞으로는 기존 ruby web app들(RSS reader, link gallery, ..)을 Rails로 porting 해 볼 생각이다.

Ruby on Rails 더 읽기"

PHP 5

지난 주말에 Zend Engine 2.0Changes in PHP 5/Zend Engine II를 읽었다. (Zend Engine은 PHP 프로그래밍 언어의 핵심 구현 부분이다. 나름대로 언어 중립적인 엔진이라고 할 수 있지만, 그다지-전혀?- 널리 쓰이지는 않았다.) PHP 5가 나온지가 오래인데, 왠 뒷북일까라고 생각하는 사람도 있을 듯하다.

PHP는 매우 널리 퍼져있는 프로그래밍 언어이지만, 또 반대로 여러 사람들이 미워하는(!) 프로그래밍 언어다. PHP를 많이 써보진 않았지만, 어느 정도는 써봤고, 내 나름대로의 PHP를 싫어하는 이유를 몇가지 가지고는 있지만, 사실 그것들이 결정적인 이유가 되기는 힘들다고 생각한다. 그리고, “PHP가 싫어, 미워”라고 외치는 주변의 사람들에게 물어보아도 설득력 있는 이유가 나오는 경우는 드물다. 아마도, Zend 사 자체의 PHP를 개선하려는 노력이 그러한 이유 중의 약간은 제시해줄 지도 모른다는 기대를 할 수 있지 않을까?

일단, 이 글에서는 Zend Engine 2.0에 나오는 항목들을 중심으로 얘기를 풀어나가보자.

Reference semantic on object variables

이 문서에서는 object model이 변화했다고 하지만, 좀 더 정확히 말하면, object를 가리키는 variable의 semantic이 변화했다고 볼 수 있다. PHP 4의 variable은 value semantic을 가지고 있다. 다시 말해 reference semantic이 아니다.

class SomeObject
{
    var $memberVar = 0;
};

$a = new SomeObject;
$b = $a;

$b->memberVar++;

print $a->memberVar;
print $b->memberVar;

위와 같은 코드의 결과는 “01”이다. variable $a는 new를 통해 새로 만들어진 object를 가리키지만, variable $b는 $a의 복사본이다. 서로 다른 object를 가리키는 것이다.

PHP 5에서는 object를 가리키는 variable은 reference semantic으로 동작한다. (이러한 방식을 ‘handle’이라는 이름으로 자주 부른다.) 따라서, 위 코드의 결과는 “11”이 된다.

object가 복사되는 것은 (심지어 function call과 같이 서로 다른 module boundary를 넘어다니더라도) 매우 특별한 것을 의미한다. 매우 단순한 비유를 들어보자. 철수가 영희에게 지우개를 빌려주었을 때, 지우개는 두개가 되는 것이 아니라, 역시 하나만 존재한다. 이처럼 object에 관련된 대부분의 idiom이나 pattern에서도 reference semantic이 훨씬 자연스럽다. (e.g. Factory pattern)

물론 PHP 4에서 reference가 존재한다.

$c = &$a;

프로그래머들에게 reference를 사용하는 규칙(discipline)을 정해서, 위의 문제를 해결할 수 있다. 하지만, PHP 처럼 “쉬운” 것을 지향하는 언어에서 프로그래머가 매순간마다 reference semantic을 써야할 지, value semantic을 써야할 지 고민해야한다는 것은 괴로운 일이다. 프로그래밍 언어는 “무엇을 할 수 있는가/없는가”의 척도로 평가되는 것이 아니라, “무언가를 쉽게 할 수 있는가”의 척도로 평가되는 것이다. 따라서, reference semantic을 기본적인 semantic으로 선택하는 것은 매우 합리적이라고 생각된다.

C++에 익숙한 사람들은 C++의 object를 가리키는 variable은 value semantic이 아니냐고 반문할 수 있겠지만, C++에서 object는 주로 pointer나 reference로 나타내어지는 것이 보통이고 이러한 방식이 자연스럽다. C++이 value semantic을 사용하는 것은 순전히 performance에 대한 고려라고 생각된다. (역설적이게도, C에 익숙한 사람들은 pointer를 사용하는 것이 performance에 대한 고려가 아닌가 의아해할 수도 있을 듯하다.)

잘 알다시피 Java에서는 object를 가리키는 variable은 reference semantic을, primitive type를 가리키는 variable은 value semantic을 선택함으로써, 일종의 trade-off를 선택한다. 이는 Java가 Pure object-oriented programming language가 아니라는 근거로 채택되기도 한다.

Python이나 Ruby 같은 언어는 모두 reference semantic을 채용한다.

Improved Object Dereferencing

아래와 같은 문법을 허용하기 시작했다. 사실상, parser가 그다지 똑똑하지 못했다고 볼 수 밖에 없다.

$object->method()->method()

Object Cloning

reference semantic으로 바뀌면서, 당연히 따라오는 변화이다. object를 copy하는 방법을 __clone() method를 통해서 프로그래머가 지정할 수 있다. 사용시에는 다음과 같은 문법을 가진다.

$copy_of_object = $object->__clone();

Constructor/Destructor

이해할 수 없는 PHP 4의 특징 가운데 하나가, constructor는 있으나, destructor는 없는 것이었다. (destructor와 같은 기능을 하도록 꽁수를 쓰는 방법이 있긴 했지만) destructor를 추가하면서 destructor는 __destruct(), constructor는 __construct()라는 이름의 method로 바뀌었다.

특기할만한 점은 parent class의 destructor가 implicit하게 호출되지 않기 때문에, parent::__destruct()로 직접 호출해주어야 한다는 점이다.

delete statement

object를 참조하고 있는 곳이 있어서 garbage collection이 안되는 object라고 하더라도, 강제로 지우기 위한 방법이다.

어떤 사람들은 garbage collection과 object의 강제 삭제는, 서로의 이익을 침해하기 때문에 상극이라고 주장하기도 한다. 간단히 얘기해서, C++에서 pointer과 delete를 사용하는 것은 object의 life time을 프로그래머에게 위임해서 성능을 올리겠다는 목적을 가지고 있고, 여타의 다른 언어들에서 garbage collection을 사용하는 것은 프로그래머가 object의 life time을 전혀 신경 안쓰겠다는 것이기 때문이다. 이 주제에 대해서는 논란의 여지가 있기 때문에, 더이상 언급을 하지 않겠다.

Multiple Inheritance

Zend Engine 2.0의 feature인데, PHP 5 상에서는 interface의 Multiple inheritance만을 지원하는 듯 하다. parent class의 같은 이름의 method가 충돌하는 경우에 대해서는 항상 override해야하는 (C++과 동일한) 규칙을 사용한다.

Abstract Classes and Methods

구현을 가지지 않는 method를 abstract method라고 하고, 이를 포함하는 class는 abstract class로 선언되어야 한다. abstract class는 instantiate할 수 없다.

기본적인 동작을 구현하고, 특정 동작의 구현을 하위 클래스에 위임하는 Framework 내의 클래스에서 유용할 것이다. C++에서라면 constructor를 protected로 만드는 경우가 여기에 해당할 것이다.

Interface

모든 method가 public이고, 구현을 가지지 않는다. 일반적인 interface 개념과 크게 다르지 않다.

Visibility

object 내부의 정보를 감출 수 (Information hiding) 없는 것은  PHP 4의 커다란 결함 중의 하나이다. public, protected, private 키워드가 추가되었고, Java와 유사한 문법을 사용한다. Visibility에 관한 manual page를 보면, class member와 class method라는 용어를 사용하는데, 일반적인 usage(class method == static method)를 생각하면 좀 짜증스럽다.

Static member variables

static method는 지원했으나, static member는 지원하지 않았던 문제를 해결함으로써, Singleton pattern을 구현할 수 있게되었다.

Exception

대부분의 modern programming language에서는 exception을 지원한다. exception은 크게, error handling을 중심 logic으로부터 제거하는 효과와 error handling을 적절한 장소에서 수행할 수 있는 효과를 가진다.

다른 언어들과 비슷하게 try/throw/catch keyword를 사용하지만, Java/Python의 finally나 Ruby의 ensure와 같은 syntax가 없는 점은 좀 아쉽다고 하겠다.

String offset syntax

PHP 4에서는 string offset syntax와 array offset syntax가 같기 때문에, null variable에 대해서, offset syntax를 사용하면, 애매모호한 문제가 발생해서, array로 변환되는 문제가 있다. PHP 5에서는 string offset syntax를 변경해서 이를 해결한다. PHP에서 자주 발견되는 애매모호한 문법들 중의 하나가 해결된 듯 하다.

Class Type Hints

PHP는 원래 weak typed programming language지만, class에 한정해서 type을 명시할 수 있다. 이는 strong typing의 이익 중의 하나인 Safety 보다는, type을 이용해 contract를 구현하는 abstraction의 역할에 가깝다고 생각된다. interface와 함께 유용하게 쓰일 수 있을 듯 하다. COM이나 다른 OO 언어들과의 interoperation에서도 유용하리라고 생각된다.

PHP 5 더 읽기"

Smalltalk syntax

지금 읽고 있는 “Object Thinking”에서 자주 사용되는 예제가 Smalltalk이다보니, 가끔씩 Smalltalk code를 읽을 일이 생겨서, I Can Read C++ and Java But I Can’t Read Smalltalk란 article을 읽어보았다. 말그대로, C++/Java 와 같은 문법에 익숙한 프로그래머가 Smalltalk code 앞에서 적어도 문맹은 되지 않도록 해주는 글이다.

Smalltalk 언어는 Object-Oriented Programming Language의 시조라고 할 수 있는 Simula의 첫번째 아들격으로, 1979년에 태어나, 최근에 만들어진 여러 OOPL 들(Objective-C, Java, Ruby, …)의 아버지 역할을 하면서, 아직도 Pure OOPL의 강력한 정신적 지주로 군림하고 있다. 여기서는 언어의 철학적인 특질(OOP)이나 구현에 관련된 특성(garbage collection, …)은 피하고, 단지 다른 언어들(C++, Java, …)에 비해 문법적으로 특이한 점을 짚어보자.

No parentheses/Keywords

t->rotate (a, v); // C++
t rotateBy: a around: v // Smalltalk

Smalltalk에서는 receiver(object)와 message(method)간의 구분을 위해 따로 operator를 쓰지 않고 space를 사용한다. method 이름이나 parameter 이름과 argument들을 구분할 때도, 괄호를 사용하지 않고, space와 colon을 사용한다. 이 때, method 이름이나 parameter 이름은 keyword라고 부르고, keyword를 조합해서 method를 호출하기 때문에, parameter들의 순서를 신경쓸 필요도 없고, readability를 상당히 향상시킨다. (C++, Java code를 읽을 때 힘든 점이, argument가 무엇을 의미하는 지 모른다는 점이니까) 대신 프로그래머는 약간의 고생을 해야하긴 하지만, 오히려 프로그래머가 정확한 semantic을 이해할 수 있다는 점에서, “example code의 폐해”를 줄일 수 있는 면도 있다.

Getter/Setter method

// C++
long getAge () { return age; }
void setAge (long newAge) { age = newAge; }

// Smalltalk
age ^age
age: newAge age := newAge

요즘에는 Python이나 Ruby, C# 같은 유명한 언어들에서 모두 지원하는, 워낙 일반적인 문법이 되어서 따로 언급할 필요는 없겠지만, Smalltalk 에 이미 있던 문법이라는 점은 특기할만하다. Smalltalk 이전에도 있던 문법일까? 그리고 Smalltalk에서도 default getter/setter를 지원하는지도 궁금하다.

Block

a = f (x) { return x + 1; } // C-Like syntax
a := [:x | x + 1] // Smalltalk

Smalltalk에서는 Block을 통해서 Higher Order Function을 지원한다. 때로는 Closure라는 이름으로 불리기도 한다. (어원이 어느 곳인지는…) C/C++에서는 function pointer의 형태로 이를 간접적으로 지원하지만, Smalltalk에는 Block이라는 이름의 function object가 존재한다. Block은 callback이나 collection의 enumeration 등 매우 쓸모가 많다. Python이나 Ruby, C# 같은 현대의 Programming Language들에서는 모두 직접 지원하는 문법이다.

Conclusion

현대의 여러 Programming Language의 Object-oriented programming paradigm 이나, 위에서 소개한 문법적인 요소들, 그리고 구현에 이르기까지, 많은 요소들이 Smalltalk로부터 전해져 내려왔다. (물론 그 중에서도 어떤 것들은 더욱 오랜 역사를 가지고 있다; 수학적인 개념들부터 상속된 것들이 특히 그러하다) 이러한 역사를 모르는 사람들은 때로 Programming Language에 대한 이상한 오해를 가지기도 한다. 미신을 멀리하고 역사를 배우라.

Links

Smalltalk syntax 더 읽기"