반응형

출처 http://www-128.ibm.com/developerworks/kr/library/opendw/20070626/


이비오이비오 idkiller@gmail.com

명지대학교 정보공학과에 재학중이며 SSM(삼성 소프트웨어 멤버십)에 다니고 있다. 미디어 아트, 비주류 언어에 관심이 많고, 외발 자전거를 타고 돌아다니며 프로그래밍 하는 것이 꿈이다.



이 사람이 오픈 디벨로퍼웍스 에 쓴글을 퍼왔습니다.



혹시 C++로 개발하다 PHP의 배열(array)을 쓰고 싶다거나 자바로 코드를 짜다 네이티브 라이브러리를 쓸 일이 생겼다면 독자들은 어떻게 하는가? 물론 C++에서도 연관 배열(associative array)을 구현해 만들거나 라이브러리를 쓸 수 있지만 문법으로 직접 지원하는 것보다는 편하지 않다. 또 자바에서도 JNI와 같은 외부 인터페이스를 쓸 수 있는 장치가 있지만, 그냥 문법적으로 지원해 쓰는 것보다는 불편할 수밖에 없다. D는 이런 문제들에 대해 해답을 줄 수 있는 언어다. 이 글에서는 D의 소개와 설치 및 간단한 예제를 알아보겠다.

   

   
   
   
   

D 언어란

D는 최초의 C++ 네이티브 컴파일러를 만들었다고 알려진 월터 브라이트(Walter Bright)가 만든 언어로, C++의 많은 장점을 바탕으로 기타 언어(자바, C#, Eiffel 등)들의 장점들과 섞어 만들었다. 이 언어의 이름은 처음에는 Mars 프로그래밍 언어였지만 친구가 D라고 계속 불러 결국 D가 되었다는 허무한 사연이 있다. D 언어의 1.0 버전은 2007년 1월 2일에 나왔고, 현재 최신 버전은 2007년 4월 26일에 나온 1.014 버전이다.


 

D 언어의 특징 및 용도

D는 C++에서 많은 부분을 채용하고, 몇 가지 부분은 버리면서 여러 다른 개념을 집어 넣어 만든 언어다.
D는 C나 C++와 같이 컴파일이 가능한 저수준(low-level) 언어이며, 인라인 어셈블러(inline assembler)를 갖고 있다. 그러면서 자바와 같은 언어들에 있는 가비지 컬렉션(garbage collection) 기능 또한 갖고 있다. 게다가 PHP나 자바스크립트에서 볼 수 있던 연관 배열이나 동적 배열(Dynamic Array)도 지원한다.
C++로 개발을 하면서 메모리 관리 때문에 짜증이 났거나 다른 언어들에 있는 편한 메모리 제어 기술들이 탐났다면, D를 쓸만한 충분한 이유가 된다. 또한 다른 언어에서 볼 수 있는 수많은 장점이 D에 있기 때문에 C++를 쓰다가 다른 언어들이 부러웠다면 D를 한번쯤 써 봐야 한다.
D는 기본 문법 수준에서 Eiffel의 DBC(Design by contract)를 지원하며, 마찬가지로 단위 테스트를 지원한다. 또한 강력한 타입 검사(type checking)를 하는 언어이면서, C# 같은 언어에서 볼 수 있는 각 타입의 속성(property)을 지원한다. 그리고 펄에서 볼 수 있는 배열 슬라이싱(array slicing)과 자바스크립트의 중첩 함수(nested function), 이너 클래스(inner class), 익명 함수(anonymous function)를 지원하며, 해스켈(Haskell)의 지연 평가(lazy evaluation)를 지원한다.
이 수많은 특징 외에도 D는 멀티 패러다임 언어로서 C의 명령형 프로그래밍과, C++의 객체지향 프로그래밍 그리고 템플릿(template) 프로그래밍까지 지원한다. 또한 C의 자료형과 호환되는 자료형들을 갖고 있고, C의 표준 라이브러리와 기타 라이브러리들을 모두 코드 안에서 바로 쓸 수 있다.
이쯤 되면 정말 잡다한 언어라고 느낄 수 있고, 초보자가 D를 배운다는 것이 불가능에 가깝다고 느낄 수도 있다, 하지만 C++의 경우만 봐도, 여러 가지 가능성을 갖고 있는 언어이지만 대부분의 사람들이 자신에게 필요한 부분만을 각각 잘 이용하고 있는 것을 알 수 있다.



위로



사용 분야

D는 구현하고 있는 많은 개념 때문에, 컴퓨터 언어를 처음 배우는 사람에게는 적합한 언어가 아니다. D는 다른 언어를 이미 쓸 줄 아는 중급 정도 이상의 개발자에게 최고의 선택이 될 수 있다
D는 일반적으로 C++가 필요한 모든 곳에 쓰일 수 있다. 즉 C++를 하다가 다른 언어의 특징들이 부러웠던 프로그래머, 혹은 파이썬(Python)과 같은 언어를 하다가 C나 C++와 같은 언어들이 부러웠던 프로그래머들에게 D는 매우 좋은 언어다.


 

설치법

D로 프로그래밍을 하기 위해 만들어진 IDE는 아직 없는 것 같다. 그러나 emacs, vim 등의 편집기에 D 구문 강조(syntax highlight) 기능이 들어가 있다.
현재 D 컴파일러는 두 가지로 구현되어 있다. 하나는 DigitalMars의 DMD 컴파일러이고, 다른 하나는 GDC로 GCC를 기본으로 프론트엔드로 만들어져 있다. 여기서는 완전한 D 구현인 DigitalMars DMD의 설치에 대해 알아보겠다.
DMD는 현재 1.0 버전이 2007년 2월 2일에 나왔고 1.0 이전 버전과 1.0 이후의 버전은 소스부터 호환이 되지 않는다. 현재 최신 버전은 2007년 6월 5일에 나온 1.015 버전이다.


 

바이너리 다운로드

DigitalMars 홈페이지에서 MS 윈도우와 리눅스, 두 가지 버전의 DMD를 다운로드할 수 있다(http://www.digitalmars.com/d/dcompiler.html). DMD는 GNU GPL(General Public License)과 Artistic License의 이중 라이선스 정책을 쓰고 있으며, 여기서는 윈도우 버전 설치만을 알아보겠다.



위로



설치하기

일단 위 URL에서 윈도우 버전의 DMD.zip과 DMC.zip을 다운로드한다. DMD는 D 컴파일러이며, DMC는 링커(linker)와 C, C++ 컴파일러 및 몇 가지 유틸리티를 포함하고 있다. 소스를 다운로드했으면, 적당한 위치로 소스를 옮긴 후 동일한 곳에 DMD.zip과 DMC.zip의 압축을 푼다. 압축을 푸는 경로의 이름에 빈칸이 있으면 문제가 생긴다는 보고가 있으므로, 이름에 빈칸이 없는 경로에 압축을 풀도록 한다.


환경 설정

DMD는 다음과 같은 환경 변수들을 사용한다.
* DFLAGS: 명령행에서 dmd.exe에 뒤따라올 문자열
* LIB: 링커가 사용하는 라이브러리를 찾을 곳을 정하는 변수
* LINKCMD: 링커 경로를 정하는 변수
* PATH: 현재 디렉터리에 컴파일러나 링커가 없다면 PATH에서 찾는다.

위 환경 변수들은 압축을 모두 풀었을 때 \dmd\bin\sc.ini에 기입한다. 일반적으로 그냥 기본으로 기입되어 있는 변수들을 그대로 써도 되지만, 다른 방법으로 설치를 하고 싶다면 sc.ini의 환경 변수들을 수정하면 된다.


 

컴파일러 사용

DMD는 기본적으로 명령행 컴파일러이며, 이 컴파일러는 윈도우의 경우 cmd.exe에서 작동된다. 그러나 윈도우에서 시그윈(Cygwin) 위에서 실행할 경우 이상 현상을 일으키므로 시그윈에서 컴파일하는 것은 피하도록 한다. 명령행에서 컴파일 명령은 기본적으로 다음과 같은 형태로 입력한다.

  
<FONT size=3>dmd files.d ... { -switch }
</FONT>

files.d에서 볼 수 있듯이 D의 소스는 일반적으로 확장자를 d라고 쓴다. switch에 관한 것은 dmd –help 명령을 입력하면 볼 수 있다.



위로



Hello, D!

다음 예제는 D의 기능을 어느 정도 보여 줄 수 있게 DigitalMars에서 인용한 것으로 D를 위한 HelloWorld 프로그램이다. 일반적으로 컴파일을 위해 다음과 같이 한다.

  
<FONT size=3>dmd hello.d
</FONT>

혹은 최적화된 컴파일을 위해 다음과 같이 한다.

  
<FONT size=3>dmd -O -inline -release hello.d
</FONT>


코드로 살펴보는 D의 특징

지금부터 http://www.digitalmars.com/d/index.html에 나오는 D 예제인 Hello World Reloaded를 통해 D의 특징을 하나씩 살펴보겠다.
DMD의 –run 옵션을 통해 D 소스를 셸 스크립트처럼 실행할 수 있다.

  
<FONT size=3>#!/usr/bin/dmd -run
</FONT>

D는 문법적으로 foreach를 지원한다. 또한 객체지향 프로그래밍이 가능하며, 가비지 컬렉션을 이용하거나 명시적으로 표기하여 메모리를 관리할 수 있다.

  
<FONT size=3>foreach (argc, argv; args)
{
    CmdLin cl = new CmdLin(argc, argv);
    writefln(cl.argnum, cl.suffix, " arg: %s", cl.argv);
    delete cl;
}</FONT>


위 예제에서 foreach args 선언은 char[][]이고, argc는 args의 index가 되어야 하므로, int 혹은 uint type만이 올 수 있다. 그리고 argv는 char[] 형이 되어야 한다. 즉 다음과 같이 되어야 한다.

  
<FONT size=3>foreach(uint argc, char[] argv; args)
</FONT>

그러나 D의 foreach에 자동으로 자료형을 예측하는 기능이 있으므로 자료형 선언 없이 위 예제와 같이 쓸 수 있다. 또한 위 예제에서 “delete cl;” 구문은 가비지 컬렉션이 있으므로 제거해도 되지만 명시적으로 메모리를 제거하기 위해 delete를 하고 있다.

D에서는 중첩 구조체(nested struct)와 클래스를 사용할 수 있으며, 모든 일반 자료형에 기본값이 존재한다. 즉 기본적으로 쓰레기 값이 들어가지 않는다.

  
<FONT size=3>void main(char[][] args)
{
    ………
struct specs
    {
        int count, allocated;
    }
    ………
}</FONT>


위 예제에서 struct specs는 메인 함수 내부에서 선언을 한 중첩 구조체다. 또한 specs에 내장된 멤버변수 count와 allocated는 int 형이고 int 형의 기본값은 0이다. 자료형의 기본 값은 모든 자료형에 .init로 들어 있으며, int.init와 같은 방식으로 쓸 수 있다.

중첩 함수에서는 외부 변수를 가져다 쓸 수 있고, 인스턴스에 접근할 때 C++처럼 ->가 아닌 자바처럼 “.”으로 접근할 수 있다. 또한 기본 자료형에도 여러 가지 정보를 볼 수 있는 속성이 존재한다.

  
<FONT size=3>void main(char[][] args)
{
………
specs argspecs()
    {
        specs* s = new specs;
        s.count = args.length;
s.allocated = typeof(args).sizeof; 
foreach (argv; args)
            s.allocated += argv.length * typeof(argv[0]).sizeof;
        return *s;
    }
    ………
}</FONT>


위 예제에서 argsspecs는 메인 함수의 중첩 함수로 argspecs의 외부에 있는 메인 함수의 인자 args를 함수 내부에서 쓰고 있다. 또한 typeof(args)로 얻은 자료형에서 sizeof 속성을 가져다 쓰고 있다. 위에서 설명한 init 또한 자료형의 속성 중 하나다. 이러한 자료형의 속성에는 모든 자료형에 공통으로 들어있는 다음과 같은 속성들이 있다.



속성 설명
.init 자료형의 기본값
.sizeof 자료형의 바이트 단위 크기. C의 sizeof와 같다.
.alignof 자료형의 alignment 크기를 찾아낸다.
.stringof 자료형을 나타내는 문자열

D는 C++와 달리 내장된 문자열 형이 존재하며, 문자열 형에 연산을 사용할 수 있다.

표. 모든 자료형의 공통 속성


  
<FONT size=3>writefln("argc = %d, " ~ "allocated = %d", argspecs().count, argspecs().allocated);
</FONT>

위 예제에서 writefln은 C의 printf와 비슷한 형식화된 출력 함수다. printf와 같이 형식화된 입력을 받아 출력하고 다음 라인으로 넘어간다. ~ 연산자는 배열을 합치는 연산자지만 D에서 문자열은 다음과 같이 정의된다.

  
<FONT size=3>Char[] str = “anystring”;
</FONT>

또 문자열이 보다시피 char자료형의 배열로 선언되므로 배열에 쓰는 array concat 연산자 혹은 array slice 연산자 등을 모두 쓸 수 있다. D의 문자열은 C나 C++처럼 끝이 “\0”으로 끝나지 않으므로 그냥 배열 연산자로 합치거나 나누었을 때 문자열 또한 합치거나 나눠진다.

  
<FONT size=3>Char[] str = “my face” ~ “ is very” ~ “ long.”;
</FONT>

위 예제의 문자열 str은 “my face is very long.”와 같다. 마지막으로 배열 슬라이스 연산자는 다음과 같이 쓴다.

  
<FONT size=3>Char[] str = “I am a boy.”[7..10];
</FONT>

위 예제에서 문자열 str은 “boy”와 같다.



위로



맺음말

이상 D 언어의 수 많은 특징 중 몇 가지 많이 쓰이는 부분을 살펴봤다. D는 수 많은 언어의 장점을 모아 놓은 듯한 비빔밥 같은 언어다. 수많은 컴퓨터 언어 기술들을 가지고 있지만, 많은 사람에게 익숙한 C++와 문법 체계가 비슷하기 때문에 C, C++, 자바와 같은 언어를 쓰던 사람이라면 금방 익힐 수 있다.
D는 C++ 같은 언어에는 없는 편한 메모리 관리, DBC 등을 지원한다. 이러한 장점들을 활용하여 좀더 탄탄한 코드를 만들 수 있고, 생산성을 향상시킬 수 있다.
D는 현재 계속 발전하고 있는 언어로 역사는 오래되지 않았지만 D를 공부하는 것 하나만으로도 많은 공부가 될 것이다. 이 글로 D에 대해 좀더 많은 사람이 관심을 갖고 프로그래밍을 즐겁게 할 수 있기를 바란다.






위로


참고자료

위키백과의 D 관련 페이지

이 기사에서 소개한 개념들에 대한 위키백과 페이지

반응형
Posted by Real_G