Recommanded Free YOUTUBE Lecture: <% selectedImage[1] %>

Contents

위키 소개

C 언어가 B 언어로부터 나왔다는 얘기는 아마 언뜻 들어서 다들 알고 있을 것 같다. 언어의 역사가 궁금하다면 언어의 역사 문서를 한번 보기 바란다.

C도 나왔고, 객체지향을 적용한 C++도 나왔으니 이제 D 언어도 나오지 않을까 ? 라는 생각이 들어봄직도 할 거 같은데, 정말 D 언어가 나왔다. 물론 나온지는 꽤 되었고, 예전 부터 써봐야지 써봐야지 하면서 차일피일 미루어왔는데, 이번참에 직접 사용해 보기로 했다. 이 위키는 D언어를 잘 배워서 한번 써먹어 보자라는 취지로 만들었다.

D 언어 소개

http://www.digitalmars.com/

C와 C++은 시스템프로그래밍에 있어서 강력함을 발휘 한다. 특유의 단순함과 중급언어라고 분류할 만큼 시스템에 가깝다는게 그 이유인데, 이 단순함은 요즘 같은 시대에 단점이기도 하다.

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

물론 현대언어의 유행이란 것이 모든 면에 있어서 좋은 쪽으로 흘러간다고 할 수는 없다. 그렇다면 C와 C++이라는 언어자체가 필요 없어질 것 아닌가. C와 C++이 유행을 따르지 않음으로써 구식언어라는 멍에를 지기는 했지만 여전히 시스템/네트워크 프로그래밍에 있어서, 속도와 성능,신뢰도 측면에서 높은 점수를 받고 있으며 실제로 널리 사용되고 있다.
Position
Jan 2007
Position
Jan 2006
Delta in Position Programming Language Ratings
Jan 2007
Delta
Jan 2006
Status
1 1 Java 19.160% -3.10%   A
2 2 C 15.807% -3.20%   A
3 3 C++ 10.425% -1.04%   A
4 5 (Visual) Basic 9.123% +0.03%   A
5 4 PHP 7.943% -1.46%   A
6 6 Perl 6.237% -0.81%   A
7 7 C# 3.521% -0.03%   A
8 8 Python 3.502% +0.90%   A
9 10 JavaScript 2.845% +1.31%   A
10 21 11 * Ruby 2.519% +2.15%   A
11 11 SAS 2.343% +1.18%   A
12 9 Delphi 2.336% +0.75%   A
13 12 PL/SQL 1.570% +0.54%   A
14 22 8 * D 1.335% +0.97%   A-
15 20 ABAP 1.229% +0.82%   A-
16 14 Lisp/Scheme 0.674% +0.07%   B
17 18 Ada 0.638% +0.17%   B
18 13 COBOL 0.637% -0.13%   B
19 15 Pascal 0.570% +0.04%   B
20 34 14 * Transact-SQL 0.510% +0.34%   B
출처 : http://www.tiobe.com/tpci.htm

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

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

D 언어 설치

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

  • http://www.digitalmars.com/d/download.html 에서 d 언어 컴파일러를 다운로드 받을 수 있다.
  • D언어 전용컴파일인 dmd와 GCC를 위한 GDC두가지 버젼이 있다.
  • gcc의 프론트엔드인 GDC를 받아서 테스트를 하기로 했다.
  • 다운로드 받은 다음에 /usr/local/gdc 에 압축을 풀었다.
  • 다음과 같이 LD_LIBRARY_PATHPATH 환경변수를 수정했다.
    # 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')
                {
                }
                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

꽤나 재미있는 것 같다. 틈틈히 공부해야지..

문서

제목 저자 변경일