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 |