MY IT

D 프로그래밍 언어

메롱씨티 배드맨 2007. 12. 13. 19:35

Joinc "yundream의 프로그래밍 이야기" - 펌 -

 

------------------------------------------------------------

이름에서 알수 있듯이... B다음에 C다음에 C++다음에 만들어진 D언어입니다. 1.0이 나온게 몇년전이고지금은 상당히 완성도를 가지고 있다고 하더군요.

(그런데 아래 샘플 예제로만 본다면 C/C++ 과 뭔 차이가 있는지 모르겠네요..)


그리고 예상과는 달리 사용자층도 꽤 만고 해서, D언어를 함 사용해 보기로 마음 먹고 위키를 만들었습니다. 

위키의 주소는 http://www.joinc.co.kr/modules/moniwiki/wiki.php/Site/D 이고 앞으로 계속 수정되어 나갈 겁니다.

------------------------------------------------------------


D 언어 소개

http://www.digitalmars.com/


 C와 C++은 시스템프로그래밍에 있어서 강력함을 발휘 한다.

 특유의 단순함과 중급언어라고 분류할 만큼 시스템에 가깝다는게 그 이유인데, 이 단순함은 요즘 같은 시대에 단점이기도 하다. 


 암튼 이 두언어는 최신언어의 유행에 한참이나 뒤 떨어져 있다.

 절차지향적이고 그다지 깔끔하지도 않으며, C++은 객체지향 적이긴 하지만 업계표준이며 모태라고 할 수 있는 C언어와의 호환성유지등의 문제로 현대언어들의 유행을 쫓아가지 못하고 있다.


 물론 현대언어의 유행이란 것이 모든 면에 있어서 좋은 쪽으로 흘러간다고 할 수는 없다.

 그렇다면 C와 C++이라는 언어자체가 필요 없어질 것 아닌가. C와 C++이 유행을 따르지 않음으로써 구식언어라는 멍에를 지기는 했지만 여전히 시스템/네트워크 프로그래밍에 있어서, 속도와 성능,신뢰도 측면에서 높은 점수를 받고 있으며 실제로 널리 사용되고 있다.

 

 D언어는 즉 시스템 프로그래밍을 위한 C/C++의 강력함과 최근의 언어들이 가지고 있는 Object orinted, template metaprogramming style 등의 multiparadigm을 지원하는 언어다. 


 D언어는 statically type를 지원하며 native 코드로 컴파일 되어서 실행된다.

 

D 언어 설치

Windows, Linux 모두에 대한 버젼이 있는데, 환경이 Linux인 관계로 Linux를 기준으로 설명하도록 하겠다.


http://www.digitalmars.com/d/download.html 에서 d 언어 컴파일러를 다운로드 받을 수 있다.

D언어 전용컴파일인 dmd와 GCC를 위한 GDC두가지 버젼이 있다.

gcc의 프론트엔드인 GDC를 받아서 테스트를 하기로 했다. 

다운로드 받은 다음에 /usr/local/gdc 에 압축을 풀었다. 

다음과 같이 LD_LIBRARY_PATH와 PATH 환경변수를 수정했다. 


# export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/gdc/lib

# export PATH=$PATH:/usr/local/gdc/bin

 

-----------------------------------------------------------

이제 wc의 d버젼을 가지고 테스트 해보았다



import std.stdio;

import std.stream;

import std.date;


int main (char[][] args)

{

    int w_total;

    int l_total;

    ulong c_total;

    int[char[]] dictionary;


    writefln("   lines   words   bytes file");

    foreach (arg; args[1 .. args.length]) {

        int w_cnt, l_cnt;

        bool inword;


        auto c_cnt = std.file.getSize(arg);

        if (c_cnt < 10_000_000) {

            size_t wstart;

            auto input = cast(char[])std.file.read(arg);

 

            foreach (j, c; input) {

                if (c == '\n')

                    ++l_cnt;

                if (c >= '0' && c <= '9') {

                    // To do .....

                } else if (c >= 'a' && c <= 'z' || c >= 'A' && c <= 'Z') {

                    if (!inword) {

                        wstart = j;

                        inword = true;

                        ++w_cnt;

                    }

                } else if (inword) {   

                    auto word = input[wstart .. j];


                    dictionary[word]++;

                    inword = false;

                }

            }


            if (inword) {   

                auto w = input[wstart .. input.length];

                dictionary[w]++;

            }

        } else {

            auto f = new BufferedFile(arg);

            char[] buf;


            while (!f.eof()) {   

                char c;


                f.read(c);

                if (c == '\n')  ++l_cnt;

                if (c >= '0' && c <= '9') {

                    if (inword)  buf ~= c;

                } else if (c >= 'a' && c <= 'z' || c >= 'A' && c <= 'Z') {

                    if (!inword) {

                        buf.length = 1;

                        buf[0] = c;

                        inword = 1;

                        ++w_cnt;

                    } else {

                        buf ~= c;

                    }

                } else if (inword) {

                    if (++dictionary[buf] == 1)   buf = null;

                    inword = 0;

                }

            }


            if (inword)   dictionary[buf]++; 

        }

        writefln("%8s%8s%8s %s\n", l_cnt, w_cnt, c_cnt, arg);

        l_total += l_cnt;

        w_total += w_cnt;

        c_total += c_cnt;

    }


    if (args.length > 2)

        writefln("--------------------------------------\n%8s%8s%8s total", l_total, w_total, c_total);


    writefln("--------------------------------------");


    foreach (word1; dictionary.keys.sort) 

        writefln("%3s %s", dictionary[word1], word1);


    writefln(toDateString(getUTCtime()));

    return 0;

}




---------------------------------------------------

컴파일과 실행은 매우 간단했다.

# gdc -o wc wc.d

# ./wc wc.d

   lines   words   bytes file

     114     234    2922 wc.d


--------------------------------------

  2 A

  1 BufferedFile

  2 Z

....

Mon Jan 29 2007



'MY IT' 카테고리의 다른 글

Linked List  (0) 2008.01.17
Libwww compile option  (0) 2007.12.26
pthread_join과 pthread_detach 차이  (0) 2007.11.12
Vim 6.x 설정  (0) 2007.10.31
C++ Framework ACE  (0) 2007.08.24