• Posts tagged "d"

Blog Archives

D vs Ruby

블로그 스피어에서 어떤분이 D와 Ruby에 대한 비교글을 써놓았다. 이런 비교가 가능하다니 이 블로그 주인 참 재미있는 사람인거 같다.

내가 그 분의 글에 대해 약간의 견해를 비추기 위해 글을 써본다.

알다시피 D와 Ruby는 태생 목적 자체가 다른 언어이다. D는 생산적인 시스템 프로그래밍을 위해서 나온 언어이고, Ruby는 프로그래머에게 재미를 주는 프로그래밍을 위해 나온 언어이다.

그래서 D에서는 기존에 C, C++ 에서 복잡하게 느껴지는 String연산에 대한 부분에 대해서 편의성을 강조했고 포인터가 있지만 포인터를 없애기 위해 노력한 언어이다. 물론 포인터는 존재하고 C, C++을 임베딩하기 위해서는 이 개념이 필수지만 일단 D만을 쓴다면 포인터 없이(포인터 개념이 아니라 연산자) 프로그래밍이 가능하다.

D 언어에 대해서 점수를 준 표를 보자면.

속도 : 10
설계 : 7
생산성 : 7
C,C++ 임베딩 편의성 : 9
확장성 : 9
라이센스 자유성: 7
라이브러리 : 6
플랫폼 이식성 : 7

Ruby에 대해서는..

속도 : 1
설계 : 7
생산성 : 9
C,C++ 임베딩 편의성 : 5
확장성 : 9
라이센스 자유성: 9
라이브러리 : 6
플랫폼 이식성 : 9

동의 하는 부분도 있고, 안하는 부분도 있다.

동의 하는 부분
속도, C/C++ 임베딩 편의성, 생산성, 확장성 정도….

라이센스는 GDC라는 gnu d compiler가 있지만 아직 완성도 측면에서 digital mars의 dmd compiler에 비해 미약하므로 라이센스 평가의 자유도는 없다고 본다. 물론 GDC만 쓴다면 라이센스 자유도에 대한 7점의 점수는 합당하다. (그러나 나는 절대 gdc  추천못하다. ^^;)

플랫폼 이식성은 GDC가 이식성이 좋기는 하지만, 아직 dmd가 이식성이 좋지 않기 때문에 일단 패스… 코드의 이식성은 좋지만 지원 플랫폼이 아직은 적다.

이 이외의 부분에 대해서는 D언어에 대한 관점에 동의한다.

속도는 생각보다 빠른편이다. 생산성도 좋고 아키텍처 관점에서 이정도의 신경을 쓰면서 퍼포먼스가 나오기 쉽지 않을텐데 생각보다 빠른 속도였다.
C/C++ 임베딩 편의성은 Ruby나 Python의 언어 구현 레벨에서의 이해가 필요한 그런 임베딩 하는데 벽이 있다면, D는 전혀 그럴 필요가 없는 장점이 있다. 단순히 extern(C) 같은 키워드만 헤더파일에 추가해주면 된다. 근본이 원래 D와 C, C++이 비슷한 언어라는 느낌이 이 부분에서 확 든다.

생산성은 정말 대단했다. C에 크게 뒤떨어지지 않은 속도에 개발 생산성은 내가 Python 코드를 짤때만큼 빨랐다.  그래서 요즘 한번 쓰고 버릴 코드들 같은 경우 D로 짜는 연습을 많이 한다. 프로그램하는 재미는 D가 더 재미난거 같고, 또한 프로그램 돌릴때 훨씬 빠르게 결과가 나오기 때문이다. (또한 포인터를 이용하면 메모리(기능한) 어디든지 참조가 가능하다. )

그러나 라이브러리를 6점 준것은 약간 오바를 한거 같다. 현재 Digital mars 에서 공식 배포하는 Phobos같은 경우 시스템프로그램 레벨의 라이브러리만 제공하기 때문에 광범위한 프로그램을 짜기에는 약간 버거운 감이 있다. 그래서 현재 Tango라는 서드파티 라이브러리가 나왔지만 이만도 Phobos와 호환이 되지 않기 때문에 쓰기가 편하지만은 않다.
현재 D 개발자는 이 두 라이브러리 사이에서 고민을 해야한다. 자신이 만드는 프로그램이 시스템레벨의 프로그래밍인지 아니면 어플리케이션 레벨의 프로그램인지 말이다. 현재 나는 phobos만으로 충분하지만.. 하지만 나중에 어쩔지는 모르겠다. ^^;

결론은 일단 D와 Ruby를 비교한건 요리용 식칼(D)과 맥가이버 칼(Ruby)을 비교한것과 비슷한게 아닐까 하는 생각이 든다.  용도가 다른 언어를 어떤 관점으로 비교를 한단 말인가?

중요한건 주어진 프로젝트는 어떤 점이 무엇보다 중요하기 때문에 반드시 이 언어를 써야 한다 식의 합리적인 언어 결정 사고방식이 필요할 것이다.
또한 C, C++, D 와 같은 컴파일러기반의 언어와  Ruby Python 같은 스크립트 언어를 다 사용할줄 알아야 한다는 것이다.  그 이후엔 취사 선택이 있을 뿐이니…

ps. 그나마 저런 새로운 언어를 배우는 사람들은 훌륭한 사람들이다. 새로운 언어가 나오면 그때마다 왜 이런 언어를 만드느냐? 새로운 언어를 만드는 사람은 대체 어떤 생각을 하고 만든 거냐? 하는 식의 부정적인 생각을 하는 사람이 꽤 되는데. (그들은 기존의 언어로도 충분히 현실 세계 문제를 해결 할 수 있다고 변명한다. )  차라리 이런 비평을 하는 사람들보다는 훨 씬 개발자로서 성공할 가능성이 많은 사람들임엔 분명하다.

ps. ErLang가 요즘 인기를 끌던데.. 쩝

ps. 새로운 언어를 배우는건 컴퓨터 사이언스 분야에서 발견하기 힘든 재미중에 하나이다.

endian 변환 모듈

주말에 서버를 개발하다가 아래와 같은 메서드가 없어서 고민을 하다가 만들어 버렸다.

uint32_t htonl(uint32_t hostlong);

uint32_t ntohl(uint32_t netlong);

D language에서는 위와 같은 메서드를 찾아볼수 없고, 유저 게시판에서도 못찾아서 만들어 버렸는데, 꽤 쓸만하다.

네트워크상에서는 Big-endian을 쓰니 LittleEndian에서만 문제가 생기더라. 그래서 아래와 같은 모듈로 두 메서드를 대체해 버렸다.

[CODE c]
import std.system;

uint htonl(uint hostlong){
    ubyte[4] retbyte;
   
    // 현재의 머신이 리틀엔디언이라면
    if(endian == Endian.LittleEndian){
        // little -> big
        retbyte[length - 4] = hostlong >> 24;
        retbyte[length - 3] = hostlong >> 16;
        retbyte[length - 2] = hostlong >> 8;
        retbyte[length - 1] = hostlong;
        //retbyte를 uint*로 캐스팅, 레퍼런스값을 취한다.
        return *cast(uint*)&retbyte[0];
    }else return hostlong;
}

alias htonl ntohl; // ntohl는 htonl와 같은 내용의 함수이다.

[/CODE]

D 2.0이 나왔나?

사용자 삽입 이미지

D language 2.0에 대한 소식이 들려오기 시작한다.

1.0 정식 버전이 올해 출범하고 얼마전에 1.015 버전에 대한 발표를 했는데 1.016버전에 대한 발표를 하면서 2.0버전에 대한 이야기를 하고 있다. (2.0에 대한 링크가 있었구나.)

char[]의 alias로 string형을 지원한다는 이야기를 하고 있고, 여러 wide char를 지원하는 string 형을 또한 제공하고 있다. 현재로서는 단순한 alias 그 이상도 그 이하도 아닌거 같다.

또한 여러 const형에 대한 추가가 있었던거 같다. (예제를 보면 struct에도 생성자가 있는거 같다.)