Joinc 팀블로그 리눅스 메뉴얼 정리 Joinc 위키
댓글

Recent Comments

Powered by Disqus
팀블로그 카테고리
  전체 (1105)
   공지사항 (1)
   검색엔진 (21)
   기술동향 (58)
   게임 (2)
   독서 (6)
   리눅스 (12)
   보안 (1)
   사회문제 (22)
   어셈블리 (43)
   영화 (3)
   오픈소스 (10)
   음악 (9)
   인물 (1)
   포인터 (4)
   프로그래머 (23)
   팀블로그 (20)
   테터툴즈 (29)
   C/C++ (152)
   FireFox (11)
   Gimp (2)
   Google (98)
   Java (13)
   Perl (2)
   Pthread (11)
   STL (13)
   TCP/IP (8)
   Tools (31)
   Web2.0 (42)
   Wiki (1)
«   2010/07   »
        1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31

'D 언어'에 해당되는 글 3건

  1. 2007/06/16 D 언어로 만들어진 게임.. (3)
  2. 2007/04/17 D언어에서의 정규표현 (6)
  3. 2007/04/16 D 프로그래밍 언어 소개 (5)
2007/06/16 22:23

D 언어로 만들어진 게임..

D 언어로 만들어진 게임이 있네요. 일본 개발자가 만들었는데, D로도 이런것을 할 수 있다라는 걸 보여주기 위해서 만들었다고 합니다.
혼자서 간단히 만든게임 같은데, 상당히 깔끔하게 잘만들었습니다. 은근히 재미있기도 하구요. 무수히 쏟아지는 탄환을 피하다보면 무아지경에 빠질 수 있는 게임입니다.

ttn_1l.gif

감각적이고 시원한 느낌의 게임입니다. 타임킬링용 게임으로 제격입니다. 모든 게임의 조작은 3개로 이루어집니다.
  • 이동 : 방향키
  • 일반공격 : Ctrl 키
  • 특수공격 : Alt 키

예전 PS2에도 이런 류의 게임이 있었는데, 이름이 기억나지 않는군요.

http://www.asahi-net.or.jp/~cs8k-cyu 를 방문하시면 D 언어로된 다양한 게임들을 다운로드 받으실 수 있습니다. 소스코드까지 포함되어 있으므로, D 언어의 구조도 살펴보실 수 있습니다.
:::
2007/04/17 00:35

D언어에서의 정규표현

원문 : http://www.joinc.co.kr/modules/moniwiki/wiki.php/Site/D/Documents/regex

정규표현

정규표현은 텍스트에서 매칭되는 문자의 패턴을 찾아내기 위해 사용하는 강력한 툴로, Perl, Ruby, Javascript 등의 언어에 포함되어 있다. C언어의 경우에도 라이브러리 형태로 이용할 수 있다. 이중 Perl과 Ruby는 정규표현을 매우 능숙하게 다루도록 만들어져 있다. D언어는 런타임 라이브러리 형태로 정규표현을 지원한다. 여기에서는 펄과 비교해가면서, D언어에서의 정규표현에 대해서 알아보도록 할 것이다.
역자주 : 원문은 Ruby와 비교해서 설명하고 있지만, 개인적으로 Perl에 더 익숙한 관계로 Perl로 대체했습니다.

장규표현에 대한 자세한 내용은 정규표현문서들을 참고하기 바란다.

패턴매칭

perl은 정규표현과 관련된 전용의 문법을 제공한다. 패턴매칭은 다음과 같은 방법으로 이루어진다.
$string = "hello yundream";
$string =~ m/yundream/;
매칭이 이루어지편 참이 리턴된다.
$string = "hello world";

if($string =~ m/yundream/)
{
print "OK\n";
}

D는 perl에서와 같은 전용의 문법을 가지고 있지는 않고, 함수차원에서 지원한다.
auto s = "hello yundream";
std.regexp.find(s, "yundream"); // 처음 일치된 위치인 6이 리턴된다.
std.regexp.find(s, "world"); // 일치된 패턴이 없을경우 -1이 리턴된다.

Perl에서는 ()를 사용해서 각각의 매칭된값을 변수명으로 얻어올 수 있다.
$line = "abcdefg";
$line =~ m/(.*)(cd)(.*)/;
print "$1\n";
print "$2\n";
print "$3\n";

C나 C++로 이런코드를 만들어야 한다고 생각해보라. 벌써부터 골치가 아파올 것이다. 그러나 D에서는 간단하게 해치울 수 있다.
auto s = std.regexp.search("abcdefg","c");
if (s)
{
writefln("%s[%s]%s", s.pre, s.match(0), s.post);
}
다음과 같이 더 간단하게 만들 수도 있다.
if (auto s = std.regexp.search("abcdefg","c"))
{
writefln("%s[%s]%s", s.pre, s.match(0), s.post);
}

치환

치환은 더 유용하고 재미있는 기능이다. 다음은 문장중에 등장하는 모든 "a"를 "ZZ"로 변경하는 Perl 코드다.
#!/usr/bin/perl

$s = "Strap a rocket engine on a chicken.\n";
$s =~ s/a/ZZ/g;
print $s;

이걸 D로 바꾸어 보았다.
char[] s = "Strap a rocket engine on a chicken.";
char[] b = new char[80];
b = sub(s, "a", "ZZ"); // 처음 매칭되는 문자열만 치환
writefln(b);
b = sub(s, "a", "ZZ", "g"); // 모든 매칭되는 문자열을 치환
writefln(b);

다음과 같이 매치된 문자열의 레퍼런스를 이용한 치환도 가능하다.
b = sub(s, "[ar]", "[$&]", "g");  
// result: St[r][a]p [a] [r]ocket engine on [a] chicken.

매칭된 문자열을 대문자로 치환할 수도 있다.
b = sub(s, "[ar]",
(RegExp m) {return toupper( m.match(0));}, "g");
toupper 은 std.string를 import해서 사용할 수 있다.

루프

문자열에 대해서 루프를 돌면서 모든 매칭되는 것들을 찾는 것도 가능하다.
import std.stdio;
import std.regexp;

void main()
{
foreach(m; RegExp("ab").search("abcabcabab"))
{
writefln("%s[%s]%s", m.pre, m.match(0), m.post);
}
}
// 출력결과 :
// [ab]cabcabab
// abc[ab]cabab
// abcabc[ab]ab
// abcabcab[ab]

:::
2007/04/16 21:49

D 프로그래밍 언어 소개


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

그리고 예상과는 달리 사용자층도 꽤 만고 해서, D언어를 함 사용해 보기로 마음 먹고 위키를 만들었습니다.
위키의 주소는 http://www.joinc.co.kr/modules/moniwiki/wiki.php/Site/D 이고 앞으로 계속 수정되어 나갈 겁니다.




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

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

관련기사
지 금, 세계는 대화 언어보다 프로그램 언어를 더 많이 가지고 있으나 프로그램 언어들은 계속 만들어지고 있다. 금주에 Digital Mars는 C/C++의 문제점과 약점을 해결한 D 언어를 발표했다. D는 C++ 컴파일러, Zortech C++의 자손이다. D는 무료이며 윈도우와 리눅스를 위한 표준 라이브러리이며 오픈 소스이다.

C/C++의 개선으로 D는 C 코드와 호환되며 콜 인터페이스 없이 어떠한 C API와도 인터페이스 가능하다. 그러나 D는 C 코드와 완전하게 후향적 호환은 안되며 자바와 Microsoft C#의 많은 기능을 추가로 한다. D는 2001년 이후 개발되었으며 오픈 소스 공동체의 입력물을 많이 사용하였으며 http://dmoz.org/Computers/Programming/Languages/D/에 자료가 많이 있다.

브라이트는 “D는 C++ 프로그래머의 경험에 의해 개발되었으며 많은 새로운 언어처럼 어느 특정한 플랫폼을 목적으로 설계되지 않았다. D의 개념은 빠르게 배우고 코딩하고 빠르게 디버깅하며 유지 보수하는 것”이라고 말했다.

Forrester Research 분석가인 제프 함몬드는 “D가 기반을 얻기까지에는 약간의 시간이 걸릴 것이다. D 언어가 성공하려면 D 언어 기술이 좋은 것 이외에도 그에 맞는 비즈니스 모델이 있어야 될 것”이라고 말했다. 마치 리눅스가 성공한 이유가 그 당시 다른 OS 가격이 너무 고가이어서 고객들이 선택했기 때문인 것처럼 필요한 비즈니스 모델이 중요하다.

출처 : http://www.internetnews.com

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
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_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
:::