맨위로가기

D (프로그래밍 언어)

"오늘의AI위키"는 AI 기술로 일관성 있고 체계적인 최신 지식을 제공하는 혁신 플랫폼입니다.
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.

1. 개요

D는 1999년 월터 브라이트가 개발을 시작하여 2001년 처음 출시된 프로그래밍 언어이다. C++와 유사한 명령형, 객체 지향, 메타 프로그래밍 패러다임을 지원하며, 클로저, 순수 함수, 함수형 프로그래밍 등 다양한 기능을 제공한다. 가비지 컬렉션, 저수준 프로그래밍 지원, C와의 상호 운용성, Better C라는 하위 집합을 특징으로 한다. DMD, GDC, LDC 등의 컴파일러가 있으며, 시스템 프로그래밍, 게임 개발, 웹 개발 등 다양한 분야에서 활용된다. 하지만, 언어 변경 과정의 투명성 부족 등의 비판도 존재한다.

더 읽어볼만한 페이지

  • 2001년 개발된 프로그래밍 언어 - C 샤프
    C#은 마이크로소프트에서 개발한 멀티 패러다임 프로그래밍 언어로, .NET Framework 개발 과정에서 안데르스 하일스베르그 팀에 의해 개발되었고, C++를 기반으로 객체 지향 프로그래밍의 특징을 강조하며 .NET 플랫폼을 지원한다.
  • 2001년 개발된 프로그래밍 언어 - 라이브코드
    라이브코드는 Transcript 언어를 사용하여 여러 운영체제에서 실행되는 애플리케이션을 생성하는 프로그래밍 플랫폼이며, 초보자도 쉽게 배울 수 있는 영어 유사 구문과 다양한 고급 기능을 제공한다.
  • 시스템 프로그래밍 언어 - C (프로그래밍 언어)
    C는 하드웨어 제어와 이식성이 뛰어난 고급 절차적 프로그래밍 언어로서, 다양한 분야에서 사용되며 후속 언어에 영향을 주었고, 성능과 효율성이 높지만 안전성 문제 개선이 필요한 언어이다.
  • 시스템 프로그래밍 언어 - 스위프트 (프로그래밍 언어)
    2014년 애플 세계 개발자 컨퍼런스에서 처음 공개된 스위프트는 크리스 래트너가 개발한 애플의 범용 프로그래밍 언어로서, Objective-C를 대체하며 다양한 플랫폼 지원, 모던 문법, 안정성, 인터랙티브한 개발 환경, SwiftUI 등의 특징을 가진다.
  • C 프로그래밍 언어 계열 - C (프로그래밍 언어)
    C는 하드웨어 제어와 이식성이 뛰어난 고급 절차적 프로그래밍 언어로서, 다양한 분야에서 사용되며 후속 언어에 영향을 주었고, 성능과 효율성이 높지만 안전성 문제 개선이 필요한 언어이다.
  • C 프로그래밍 언어 계열 -
    펄은 래리 월이 개발한 텍스트 조작에 강점을 가진 다목적 프로그래밍 언어이며, 1987년 펄 1.0이 처음 공개된 이후 여러 버전 업데이트를 거쳐 객체 지향 프로그래밍과 유니코드 지원 기능을 추가했고, 현재 펄 5가 널리 사용되며 CPAN을 통해 방대한 모듈 생태계를 제공한다.
D (프로그래밍 언어) - [IT 관련 정보]에 관한 문서
일반 정보
D 프로그래밍 언어 로고
D 프로그래밍 언어 로고
패러다임다중 패러다임 프로그래밍 언어: 함수형 프로그래밍, 명령형 프로그래밍, 객체 지향 프로그래밍
발표 연도2001년 12월 8일
설계자월터 브라이트, 안드레이 알렉산드레스쿠 (2007년부터)
개발자D 언어 재단
타이핑추론 타이핑, 정적 타이핑, 강한 타이핑
구현체DMD (참조 구현)
GCC
GDC
LDC
SDC
파일 확장자.d
영향을 준 언어Genie
MiniD
Qore
Swift
Vala
C++11
C++14
C++17
C++20
Go
C#
영향을 받은 언어BASIC
C
C++
C#
Eiffel
Java
Python
운영 체제FreeBSD, Linux, macOS, Windows
라이선스Boost
웹사이트dlang.org
위키책D Programming
최신 릴리스 정보
최신 릴리스 날짜}}

2. 역사

월터 브라이트는 1999년에 새로운 언어 개발을 시작하여, 2001년 12월에 D를 처음 출시했고[28] 2007년 1월에 버전 1.0에 도달했다.[29] 이 언어의 첫 번째 버전인 D1은 C++와 유사하게 명령형, 객체 지향 및 메타 프로그래밍 패러다임에 집중했다.[30] D1은 기능적으로 성숙하여 유지보수 모드로 전환되었으며, 2012년 말에 지원이 중단되었다.

D 커뮤니티의 일부 구성원들은 D의 공식 런타임 라이브러리이자 표준 라이브러리인 Phobos에 불만을 품고, Tango라는 대체 런타임 및 표준 라이브러리를 만들었다. 첫 번째 공개 Tango 발표는 D 1.0 출시 며칠 만에 이루어졌다.[31] Tango는 OOP와 높은 모듈성을 수용하는 다른 프로그래밍 스타일을 채택했고, Phobos보다 더 빠르게 발전할 수 있었다. 그러나 당시 Tango와 Phobos는 런타임 지원 API가 달라서 호환되지 않았고, 이로 인해 두 라이브러리를 동일한 프로젝트에서 사용하는 것이 불가능하여 논쟁을 불러일으켰다.[32]

2007년 6월, D2의 첫 번째 버전이 출시되었다.[33] D2 개발의 시작은 D1의 안정화를 알렸다. D2는 호환성 파괴 변경을 도입, 클로저 (컴퓨터 프로그래밍), 순수 함수, 함수형 및 동시 프로그래밍 패러다임 지원과 같은 기능을 추가했다. 또한 런타임을 표준 라이브러리에서 분리하여 표준 라이브러리 문제를 해결했다. D2 Tango 포트의 완료는 2012년 2월에 발표되었다.[34]

안드레이 알렉산드레스쿠의 저서 ''The D Programming Language''가 2010년 6월 12일에 출판되면서 D2가 안정화되었으며, 오늘날에는 단순히 "D"로 통칭된다.

2011년 이후, D 개발은 GitHub로 이전되어 기여가 크게 증가했고,[35] 2017년에는 전체 컴파일러가 Boost 라이선스 하에 제공되었다.[40][41][42][43] 2017년 6월 21일, D 언어가 GCC에 포함되도록 승인되었다.[44]

2. 1. D1과 D2

월터 브라이트는 1999년에 새로운 언어 개발을 시작하여, 2001년 12월에 D를 처음 출시했고[28] 2007년 1월에 버전 1.0에 도달했다.[29] 이 언어의 첫 번째 버전인 D1은 C++와 유사하게 명령형, 객체 지향 및 메타 프로그래밍 패러다임에 집중했다.[30] D1은 기능적으로 성숙하여 유지보수 모드로 전환되었으며, 2012년 말에 지원이 중단되었다.

D 커뮤니티의 일부 구성원들은 D의 공식 런타임 라이브러리이자 표준 라이브러리인 Phobos에 불만을 품고, Tango라는 대체 런타임 및 표준 라이브러리를 만들었다. 첫 번째 공개 Tango 발표는 D 1.0 출시 며칠 만에 이루어졌다.[31] Tango는 OOP와 높은 모듈성을 수용하는 다른 프로그래밍 스타일을 채택했고, Phobos보다 더 빠르게 발전할 수 있었다. 그러나 당시 Tango와 Phobos는 런타임 지원 API가 달라서 호환되지 않았고, 이로 인해 두 라이브러리를 동일한 프로젝트에서 사용하는 것이 불가능하여 논쟁을 불러일으켰다.[32]

2007년 6월, D2의 첫 번째 버전이 출시되었다.[33] D2 개발의 시작은 D1의 안정화를 알렸다. D2는 호환성 파괴 변경을 도입, 클로저 (컴퓨터 프로그래밍), 순수 함수, 함수형 및 동시 프로그래밍 패러다임 지원과 같은 기능을 추가했다. 또한 런타임을 표준 라이브러리에서 분리하여 표준 라이브러리 문제를 해결했다. D2 Tango 포트의 완료는 2012년 2월에 발표되었다.[34]

안드레이 알렉산드레스쿠의 저서 ''The D Programming Language''가 2010년 6월 12일에 출판되면서 D2가 안정화되었으며, 오늘날에는 단순히 "D"로 통칭된다.

2011년 이후, D 개발은 GitHub로 이전되어 기여가 크게 증가했고,[35] 2017년에는 전체 컴파일러가 Boost 라이선스 하에 제공되었다.[40][41][42][43] 2017년 6월 21일, D 언어가 GCC에 포함되도록 승인되었다.[44]

3. 특징

D는 C 및 C++ 소스 코드와 소스 코드 호환되지 않지만, 두 언어 모두에서 유효한 코드는 동일하게 작동한다.[9] C++와 유사하게 D는 클로저, 익명 함수, 컴파일 타임 함수 실행, 범위, 내장 컨테이너 반복, 타입 추론을 지원한다. D의 선언, 문, 표현식 구문은 C++와 매우 유사하다.[9]

D는 C++와 달리 계약에 의한 설계, 가비지 컬렉션, 일급 배열, 배열 슬라이싱, 중첩 함수, 지연 평가를 구현한다. D는 C++ 스타일의 다중 상속 대신 인터페이스와 믹스인을 사용한 Java 스타일의 단일 상속을 사용한다.

D는 시스템 프로그래밍 언어로, Java나 C#과 달리 저수준 프로그래밍을 지원하며, 인라인 어셈블러를 포함한다. 인라인 어셈블러를 통해 표준 D 코드 내에 시스템별 어셈블리 코드를 입력할 수 있다. 이를 통해 운영 체제 및 장치 드라이버와 같이 기본 하드웨어와 직접 인터페이스하는 프로그램을 실행하는 데 필요한 프로세서의 저수준 기능에 접근하거나, 컴파일러가 생성하는 것보다 더 높은 성능의 코드를 작성할 수 있다.[9]

D는 함수 오버로딩 및 연산자 오버로딩을 지원하며, 기호 (함수, 변수, 클래스)는 순서에 관계없이 선언할 수 있고, 전방 선언이 필요하지 않다.

D에서 텍스트 문자열은 문자 배열이며, D의 배열은 경계가 검사된다.[9] D는 복소수 및 허수 타입을 갖는다.[10]

3. 1. 문법 및 기능

D는 C 및 C++ 소스 코드와 소스 코드 호환되지 않지만, 두 언어 모두에서 유효한 코드는 동일하게 작동한다.[9] C++와 유사하게 D는 클로저, 익명 함수, 컴파일 타임 함수 실행, 범위, 내장 컨테이너 반복, 타입 추론을 지원한다. D의 선언, 문, 표현식 구문은 C++와 매우 유사하다.[9]

D는 C++와 달리 계약에 의한 설계, 가비지 컬렉션, 일급 배열, 배열 슬라이싱, 중첩 함수, 지연 평가를 구현한다. D는 C++ 스타일의 다중 상속 대신 인터페이스와 믹스인을 사용한 Java 스타일의 단일 상속을 사용한다.

D는 시스템 프로그래밍 언어로, Java나 C#과 달리 저수준 프로그래밍을 지원하며, 인라인 어셈블러를 포함한다. 인라인 어셈블러를 통해 표준 D 코드 내에 시스템별 어셈블리 코드를 입력할 수 있다. 이를 통해 운영 체제 및 장치 드라이버와 같이 기본 하드웨어와 직접 인터페이스하는 프로그램을 실행하는 데 필요한 프로세서의 저수준 기능에 접근하거나, 컴파일러가 생성하는 것보다 더 높은 성능의 코드를 작성할 수 있다.[9]

D는 함수 오버로딩 및 연산자 오버로딩을 지원하며, 기호 (함수, 변수, 클래스)는 순서에 관계없이 선언할 수 있고, 전방 선언이 필요하지 않다.

D에서 텍스트 문자열은 문자 배열이며, D의 배열은 경계가 검사된다.[9] D는 복소수 및 허수 타입을 갖는다.[10]

D는 동시성 (액터 모델), 객체 지향, 명령형, 함수형, 메타 프로그래밍의 다섯 가지 주요 프로그래밍 패러다임을 지원한다.[9]

D에서의 명령형 프로그래밍은 C와 거의 동일하며, 함수, 데이터, 구문, 선언, 표현식은 C에서와 같이 작동하고 C 런타임 라이브러리에 직접 접근할 수 있다. C와 달리 D의 `foreach` 루프 구조는 컬렉션을 반복할 수 있게 해준다. D는 다른 함수 내에서 선언되며 외부 함수의 지역 변수에 접근할 수 있는 중첩 함수를 허용한다.

```D

import std.stdio;

void main() {

int multiplier = 10;

int scaled(int x) {

return x * multiplier;

}

foreach (i; 0 .. 10) {

writefln("Hello, world %d! scaled = %d", i, scaled(i));

}

}

```

D에서의 객체 지향 프로그래밍은 단일 상속 계층을 기반으로 하며, 모든 클래스는 Object 클래스에서 파생된다. D는 다중 상속 대신 Java 스타일의 인터페이스믹스인을 사용한다. D는 인터페이스에서 정적 및 final(가상화되지 않은) 메서드의 정의를 허용한다. D의 인터페이스와 상속은 재정의된 메서드의 반환 형식에 대한 공변 타입을 지원하며, 타입 전달 및 선택적 사용자 지정 동적 디스패치를 지원한다. D의 클래스(및 인터페이스)는 불변성을 포함할 수 있으며, 이는 계약에 의한 설계 방법론에 따라 공용 메서드 진입 전후에 자동으로 확인된다. 클래스(및 구조체)의 많은 측면은 컴파일 시간(`타입 트레이트`를 사용하는 반사 프로그래밍) 및 런타임(RTTI / `TypeInfo`)에 자동으로 내부 검사될 수 있어, 일반 코드 또는 자동 코드 생성을 용이하게 한다.

D는 함수형 프로그래밍 기능을 지원하며, 함수 리터럴, 클로저, 재귀적으로 불변하는 객체, 고차 함수 사용 등이 포함된다.[11] 익명 함수에는 여러 문장 형태와 "단축형" 단일 표현식 표기법을 포함한 두 가지 구문이 있다.[11]

```D

int function(int) g;

g = (x) { return x * x; }; // 긴 형식

g = (x) => x * x; // 단축 형식

```

함수 리터럴에는 `function`과 `delegate`의 두 가지 내장 형식이 있다. `function`은 스택에 할당된 함수 포인터이고, `delegate`는 관련 스택 프레임 및 주변 환경에 대한 포인터를 포함한다. 익명 함수와 타입 추론을 함께 사용하면 컴파일러는 환경 포인터가 필요하지 않다고 증명할 수 없는 한 `delegate`을 생성한다. 컴파일러는 필요한 경우 둘러싸인 지역 변수를 에 배치하며, 타입 추론을 사용할 때 적용 가능하다고 증명할 수 있는 경우 함수의 타입에 `pure` 및 `nothrow`와 같은 속성을 추가한다.

커링과 map, filter, reduce와 같은 일반적인 고차 함수는 표준 라이브러리 모듈 `std.functional` 및 `std.algorithm`을 통해 사용할 수 있다.

```D

import std.stdio, std.algorithm, std.range;

void main() {

int[] a1 = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];

int[] a2 = [6, 7, 8, 9];

// pure 함수 내부에서 접근을 허용하려면 불변해야 함

immutable pivot = 5;

int mySum(int a, int b) pure nothrow /* 순수 함수 */ {

if (b <= pivot) // 둘러싸는 범위에 대한 참조

return a + b;

else

return a;

}

// delegate (클로저) 전달

auto result = reduce!mySum(chain(a1, a2));

writeln("Result: ", result); // Result: 15

// delegate 리터럴 전달

result = reduce!((a, b) => (b <= pivot) ? a + b : a)(chain(a1, a2));

writeln("Result: ", result); // Result: 15

}

```

위 함수 구성은 UFCS(Uniform function call syntax)를 사용하여 왼쪽에서 오른쪽으로 읽을 수 있도록 표현할 수 있다.

```D

auto result = a1.chain(a2).reduce!mySum();

writeln("Result: ", result);

result = a1.chain(a2).reduce!((a, b) => (b <= pivot) ? a + b : a)();

writeln("Result: ", result);

```

라이브러리에는 병렬 프로그래밍 개념이 구현되어 있으며, 컴파일러의 추가 지원을 필요로 하지 않는다. D 타입 시스템과 컴파일러는 데이터 공유를 투명하게 관리한다.

```D

import std.stdio : writeln;

import std.range : iota;

import std.parallelism : parallel;

void main() {

foreach (i; iota(11).parallel) {

// foreach 루프의 본문은 각 i에 대해 병렬로 실행됩니다.

writeln("처리 중 ", i);

}

}

```

`iota(11).parallel`은 UFCS를 사용하여 `std.parallelism.parallel(iota(11))`과 동일하다.

`std.parallelism` 모듈은 병렬 작업의 동적 생성을 위해 사용될 수 있는 `taskPool`을 지원하며, 기능적 연산과 결합될 때 유용한 범위(및 배열)에 대한 맵-필터-리듀스 및 폴드 스타일 연산을 지원한다. `std.algorithm.map`은 배열 대신 지연 평가된 범위를 반환하여 각 작업자 작업에서 자동으로 요소를 병렬로 계산한다.

```D

import std.stdio : writeln;

import std.algorithm : map;

import std.range : iota;

import std.parallelism : taskPool;

/* Intel i7-3930X 및 gdc 9.3.0에서:

  • std.algorithm.reduce 사용 시 5140ms
  • std.parallelism.taskPool.reduce 사용 시 888ms

  • AMD Threadripper 2950X 및 gdc 9.3.0에서:
  • std.algorithm.reduce 사용 시 2864ms
  • std.parallelism.taskPool.reduce 사용 시 95ms
  • /

void main() {

auto nums = iota(1.0, 1_000_000_000.0);

auto x = taskPool.reduce!"a + b"(

0.0, map!"1.0 / (a * a)"(nums)

);

writeln("합계: ", x);

}

```

동시성은 라이브러리에서 완전히 구현되며 컴파일러 지원이 필요하지 않다. D 타입 시스템은 메모리 안전성을 보장한다.

```d

import std.stdio, std.concurrency, std.variant;

void foo() {

bool cont = true;

while (cont) {

receive( // 메시지 유형을 일치시키기 위해 대리자가 사용됩니다.

(int msg) => writeln("int received: ", msg),

(Tid sender) { cont = false; sender.send(-1); },

(Variant v) => writeln("huh?") // Variant는 모든 유형과 일치합니다

);

}

}

void main() {

auto tid = spawn(&foo); // foo()를 실행하는 새 스레드 생성

foreach (i; 0 .. 10)

tid.send(i); // 몇 개의 정수 전송

tid.send(1.0f); // float 전송

tid.send("hello"); // 문자열 전송

tid.send(thisTid); // 구조체(Tid) 전송

receive((int x) => writeln("Main thread received message: ", x));

}

```

메타 프로그래밍은 템플릿, 컴파일 타임 함수 실행, 튜플, 문자열 믹스인을 통해 지원된다.

D의 템플릿은 C++의 함수형 스타일 템플릿에 비해 더 명령형 스타일로 작성될 수 있다. 다음은 숫자의 팩토리얼을 계산하는 일반적인 함수이다.

```d

ulong factorial(ulong n) {

if (n < 2)

return 1;

else

return n * factorial(n-1);

}

```

D의 컴파일 타임 조건 구성인 `static if`를 사용하여 위 함수와 유사한 코드를 사용하여 동일한 계산을 수행하는 템플릿을 구성할 수 있다.

```d

template Factorial(ulong n) {

static if (n < 2)

enum Factorial = 1;

else

enum Factorial = n * Factorial!(n-1);

}

```

다음은 위에서 정의된 템플릿과 함수를 사용하여 팩토리얼을 계산하는 예제이다. 상수의 타입은 컴파일러가 할당의 오른쪽에 있는 값에서 타입 추론을 하기 때문에 명시적으로 지정할 필요가 없다.

```d

enum fact_7 = Factorial!(7);

```

이것은 컴파일 타임 함수 실행(CTFE)의 예이다. 일반 함수는 특정 기준을 충족하는 경우 상수, 컴파일 타임 표현식에서 사용할 수 있다.

```d

enum fact_9 = factorial(9);

```

`std.string.format` 함수는 printf와 유사한 데이터 형식 지정을 수행하며(CTFE를 통해 컴파일 타임에도 가능), "msg" pragma는 결과를 컴파일 시간에 표시한다.

```d

import std.string : format;

pragma(msg, format("7! = %s", fact_7));

pragma(msg, format("9! = %s", fact_9));

```

문자열 믹스인은 컴파일 타임 함수 실행과 결합되어 컴파일 시간에 문자열 연산을 사용하여 D 코드를 생성할 수 있다. 이것은 프로그램의 일부로 컴파일될 도메인 특화 언어를 파싱하는 데 사용할 수 있다.

```d

import FooToD; // Foo 소스 코드를 파싱하고 동등한 D 코드를 반환하는 함수를 포함하는 가상의 모듈

void main() {

mixin(fooToD(import("example.foo")));

}

```

객체 지향 프로그래밍에서의 메서드 호출과 동일한 구문으로 자유 함수(전역 레벨에서 선언된 함수)를 호출할 수 있는 기능이다. 함수의 왼쪽에 위치한 값이 첫 번째 인수로 평가되며, 일반적으로 "메서드 체인"이라고 불리는 표현을 가능하게 한다. Nim 프로그래밍 언어에도 유사한 언어 기능이 존재한다.

```d

import std.stdio;

void main()

{

// 다음 두 가지는 동일한 결과를 반환한다.

writeln(square(square(2))); // 16

2.square().square().writeln(); // 16

}

// 인수를 제곱하여 반환하는 함수

int square(int n)

{

return n * n;

}

3. 2. 메모리 관리

D는 일반적으로 가비지 컬렉션으로 메모리를 관리하지만, 특정 객체는 범위를 벗어나는 즉시 종료될 수 있다.[12] 이것이 D로 작성된 대부분의 프로그램과 라이브러리가 사용하는 방식이다.

메모리 레이아웃에 대한 더 많은 제어와 더 나은 성능이 필요한 경우, 명시적인 메모리 관리가 가능하다. 오버로드된 연산자 `new`를 사용하거나, C의 malloc과 free를 직접 호출하거나, 사용자 정의 할당자 스키마(예: 폴백이 있는 스택, RAII 스타일 할당, 참조 계산, 공유 참조 계산)를 구현할 수 있다.

가비지 컬렉션은 제어할 수 있다. 프로그래머는 수집기가 관찰하는 메모리 범위를 추가하고 제외할 수 있으며, 수집기를 비활성화 및 활성화하고 세대별 또는 전체 컬렉션 주기를 강제할 수 있다.[12] 매뉴얼에는 가비지 컬렉션이 프로그램에서 부적절할 때 서로 다른 고도로 최적화된 메모리 관리 스키마를 구현하는 방법에 대한 많은 예가 제공된다.[13]

함수에서 `struct` 인스턴스는 기본적으로 스택에 할당되는 반면, `class` 인스턴스는 기본적으로 힙에 할당된다(클래스 인스턴스에 대한 참조만 스택에 있음). 그러나 표준 라이브러리 템플릿 `std.typecons.scoped`를 사용하거나 구조체에 `new`를 사용하고 값 기반 변수 대신 포인터에 할당하여 클래스에 대해 변경할 수 있다.[14] 함수에서 정적 배열(크기가 알려진)은 스택에 할당된다. 동적 배열의 경우 `core.stdc.stdlib.alloca` 함수(C의 `alloca`와 유사)를 사용하여 스택에 메모리를 할당할 수 있다. 반환된 포인터는 슬라이스를 통해 (유형 지정된) 동적 배열로 사용할 수 있다(그러나 배열 크기 조정, 추가 포함을 피해야 하며, 명백한 이유로 함수에서 반환해서는 안 됨).[14]

`scope` 키워드는 코드의 일부, 변수 및 클래스/구조체에 주석을 달아 범위 종료 시 즉시 파괴(소멸자 호출)해야 함을 나타내는 데 사용할 수 있다. 메모리가 해제되는 방식은 구현 및 클래스-대-구조체 차이점에 따라 달라진다.[15]

`std.experimental.allocator`는 특수한 사용 사례를 위해 사용자 정의 고성능 할당자를 만들 수 있는 모듈형 및 구성 가능한 할당자 템플릿을 포함한다.[16]

3. 3. 안전한 D (SafeD)

SafeD[17]는 메모리 안전이 보장되는 D의 하위 집합이다. `@safe`로 표시된 함수는 컴파일 시간에 검사되어 포인터 연산 및 검증되지 않은 캐스팅과 같이 메모리 손상을 초래할 수 있는 기능을 사용하지 않는지 확인한다. 호출되는 다른 모든 함수도 `@safe` 또는 `@trusted`로 표시되어야 한다. SafeD에서 비활성화된 기능의 안전한 사용과 잠재적인 메모리 손상 사례를 컴파일러가 구별할 수 없는 경우 함수는 `@trusted`로 표시될 수 있다.[18]

D는 DIP1000[19] 및 DIP25[20](현재 언어 사양의 일부[21])의 기치 아래 데이터의 수명과 관련된 특정 부적절한 구성을 방지하는 기능을 제공한다.

현재 적용된 메커니즘은 주로 함수 매개변수와 스택 메모리를 처리하지만, D 프로그래밍 언어 내에서 수명에 대한 보다 철저한 처리를 제공하는 것이 D 프로그래밍 언어 리더십의 목표로 명시되어 있다[22](러스트 프로그래밍 언어의 아이디어에 영향을 받았다). `@safe` 코드 내에서, 참조 타입을 포함하는 할당의 생명주기는 할당받는 쪽의 생명주기가 할당하는 쪽의 생명주기보다 더 긴지 확인한다.

함수 매개변수가 포인터 유형 또는 참조 유형인 경우, 키워드 ''return''과 ''scope''는 해당 매개변수의 수명과 사용을 제한한다. 언어 표준은 다음과 같은 동작을 규정한다:[23]

저장 클래스저장 클래스를 가진 매개변수의 동작 (및 제약 조건)
scope매개변수 내의 참조는 탈출할 수 없다. 참조가 없는 매개변수에서는 무시된다.
return매개변수는 반환되거나 첫 번째 매개변수로 복사될 수 있지만, 그렇지 않으면 함수 밖으로 탈출하지 않는다. 이러한 복사본은 파생된 인수를 벗어나지 않아야 한다. 참조가 없는 매개변수에서는 무시된다.


3. 4. 다른 시스템과의 상호 작용

C의 응용 프로그램 바이너리 인터페이스(ABI)를 지원하며, C의 모든 기본 및 파생 형식을 지원하여 기존 C 코드 및 라이브러리에 직접 접근할 수 있다.[24][25][26] D는 많은 인기 있는 C 라이브러리에 대한 바인딩을 제공한다. 또한 C의 표준 라이브러리는 표준 D의 일부이다.

마이크로소프트 윈도우에서 D는 COM 코드에 접근할 수 있다.

메모리 관리가 제대로 처리되는 한, 다른 많은 언어들도 D와 단일 바이너리로 혼합될 수 있다. 예를 들어, GDC 컴파일러는 C, C++, Objective-C와 같은 지원되는 다른 언어 코드를 연결하고 혼합할 수 있다. D 코드(함수)는 C, C++, 파스칼 ABI를 사용하도록 표시될 수 있으며, 따라서 이러한 언어로 작성된 라이브러리에 콜백으로 전달될 수 있다. 마찬가지로 이러한 언어로 작성된 코드 간에 양방향으로 데이터를 교환할 수 있다. 일반적으로 이는 기본 유형, 포인터, 일부 형태의 배열, 공용체, 구조체 및 일부 유형의 함수 포인터로 사용이 제한된다.

다른 많은 프로그래밍 언어들이 확장을 작성하거나 언어 인터프리터를 실행하기 위해 C API를 제공하기 때문에, D는 표준 C 바인딩(얇은 D 인터페이스 파일 포함)을 사용하여 이러한 언어와 직접 인터페이스할 수도 있다. 예를 들어, 파이썬, 루아와 같은 언어에 대한 양방향 바인딩이 있으며, 종종 컴파일 시간 코드 생성 및 컴파일 시간 유형 리플렉션 방식을 사용한다.

extern(C++)로 표시된 D 코드의 경우 다음과 같은 기능이 지정된다.

  • 이름 맹글링 규칙은 대상 플랫폼의 C++ 규칙과 일치해야 한다.
  • 함수 호출의 경우 ABI(Application Binary Interface, 응용 프로그램 이진 인터페이스)가 동일해야 한다.
  • vtable은 단일 상속(D 언어 사양에서 지원되는 유일한 수준)까지 일치해야 한다.


C++ 네임스페이스는 extern(C++, namespace) 구문을 통해 사용되며, 여기서 ''namespace''는 C++ 네임스페이스의 이름이다.

3. 5. Better C

D 프로그래밍 언어는 "Better C"로 알려진 공식적인 하위 집합을 가지고 있다.[27] 이 하위 집합은 C의 런타임 라이브러리 외에 다른 D 런타임 라이브러리의 사용을 요구하는 D 기능에 대한 접근을 금지한다.

Better C는 컴파일 시점 기능의 무제한 사용, 완전한 메타프로그래밍 기능, 중첩 함수, 중첩 구조체, 델리게이트 및 람다, 멤버 함수, 생성자, 소멸자, 연산자 오버로딩 등을 지원한다. 또한 전체 모듈 시스템, 배열 슬라이싱 및 배열 범위 검사, RAII, '''scope(exit)''', 메모리 안전 보호, C++와의 인터페이스, COM 클래스 및 C++ 클래스, '''assert''' 실패 시 C 런타임 라이브러리로 전달, 문자열을 사용한 '''switch''', '''final switch''', '''unittest''' 블록, '''printf''' 형식 유효성 검사 등의 기능을 제공한다.

반면, 가비지 컬렉션, TypeInfo 및 ModuleInfo, 내장 스레딩, 동적 배열 및 연관 배열, 예외, ''synchronized'' 및 `core.sync`, 정적 모듈 생성자 또는 소멸자는 Better C에서 지원되지 않는다.

DMD와 LDC에서는 "-betterC" 컴파일러 플래그를, GDC에서는 "-fno-druntime" 플래그를 통해 Better C를 활성화할 수 있다. Better C로 컴파일된 코드는 동일한 플래그로 컴파일된 D 코드 및 D가 아닌 링크된 코드만 호출할 수 있지만, Better C 옵션 없이 컴파일된 코드는 해당 옵션으로 컴파일된 코드를 호출할 수 있다. 그러나 이는 C와 D가 어설션을 처리하는 방식의 차이로 인해 약간 다른 동작을 유발할 수 있다.

4. 구현

D 프로그래밍 언어의 구현체는 대부분 효율적인 실행을 위해 기계어로 직접 컴파일한다.[39][2]


  • DMD는 D 언어의 창시자인 월터 브라이트가 개발한 공식 컴파일러로, 부스트 소프트웨어 라이선스를 따르는 오픈 소스이다. DMD 프론트엔드는 GDC (현재 GCC에 포함)와 LDC에서 공유되어 컴파일러 간 호환성을 높인다. 초기에는 C++로 작성되었으나 현재는 대부분 D 자체로 작성되어 셀프 호스팅을 구현했다. 백엔드 및 기계어 최적화기는 심텍 컴파일러를 기반으로 하며, 초기에는 32비트 x86만 지원했으나, 이후 64비트 amd64 및 PowerPC에 대한 지원이 추가되었다.
  • GDCGNU 컴파일러 모음(GCC)의 백엔드를 위한 프론트엔드로, 2018년 10월 29일 GCC 9에 병합되었다.[45][46] 2004년 3월 22일, GCC 3.3 및 GCC 3.4 기반의 첫 작동 버전이 Linux 및 macOS의 32비트 x86에서 출시되었다.[47] 이후 GDC는 추가 플랫폼 지원, 성능 개선, 버그 수정을 진행하며 업스트림 DMD 코드를 추적했다.[48]
  • LDC는 DMD 프론트엔드를 기반으로 LLVM을 컴파일러 백엔드로 사용하는 컴파일러이다. 2009년 1월 9일 첫 릴리스 버전이 나왔으며,[49] D 2.0 버전을 지원한다.[50]
  • .NET용 D 컴파일러는 D 2.0 컴파일러의 백엔드로,[51][52] 기계어 대신 공통 중간 언어(CIL) 바이트코드로 컴파일한다. CIL은 공통 언어 인프라(CLI) 가상 머신을 통해 실행된다. 현재는 업데이트되지 않고 있다.
  • SDC (Snazzy D 컴파일러)[53]는 맞춤형 프론트엔드를 사용하고 LLVM을 백엔드로 사용한다. D로 작성되었으며, D의 컴파일 타임 기능을 처리하기 위해 스케줄러를 사용한다. 현재 언어의 제한된 하위 집합만 지원한다.[54][55]


이러한 컴파일러 및 툴체인을 통해 IA-32, amd64, AArch64, PowerPC, MIPS64, DEC Alpha, Motorola m68k, SPARC, s390, WebAssembly 등 다양한 아키텍처를 대상으로 D 프로그램을 컴파일할 수 있다. 기본적으로 Windows 및 Linux를 지원하며, 다양한 컴파일러가 Mac OS X, FreeBSD, NetBSD, AIX, Solaris/OpenSolaris, Android도 지원한다. WebAssembly 대상(LDC 및 LLVM을 통해 지원)은 구글 크롬, 모질라 파이어폭스, 마이크로소프트 엣지, 애플 사파리 등의 웹 브라우저 또는 전용 Wasm 가상 머신에서 작동한다.

5. 개발 도구

D 언어를 지원하는 구문 강조 및 부분적인 지능형 코드 완성을 지원하는 편집기 및 통합 개발 환경(IDE)에는 SlickEdit, Emacs, Vim, SciTE, Smultron, Zeus[56]Geany 등이 있다.[57]

Object Pascal로 작성된 D에 특화된 그래픽 IDE인 Dexed (구 Coedit)[58], MonoDevelop / Xamarin Studio를 기반으로 한 기능이 풍부한 크로스 플랫폼 D에 특화된 그래픽 IDE로, 주로 C#으로 작성된 Mono-D[59][60], D용 이클립스 플러그인으로는 DDT[61]와 Descent (중단된 프로젝트)[62], Visual Studio 통합은 VisualD가 제공한다.[63][64] Visual Studio Code는 Dlang-Vscode[65] 또는 Code-D와 같은 확장 기능으로 통합된다.[66]

TextMate용 번들이 있으며, Code::Blocks IDE는 이 언어를 부분적으로 지원한다. 그러나 코드 완성이나 리팩토링과 같은 표준 IDE 기능은 아직 사용할 수 없지만, Code::Blocks에서는 D가 C와 유사하기 때문에 부분적으로 작동한다. Xcode 3 플러그인 "D for Xcode"는 D 기반 프로젝트 및 개발을 가능하게 한다.[67] KDevelop (및 텍스트 편집기 백엔드인 Kate) 자동 완성 플러그인을 사용할 수 있다.[68] Dlang IDE는 DlangUI 라이브러리를 사용하여 D로 작성된 크로스 플랫폼 IDE이다.[69]

오픈 소스 소프트웨어 D IDE는 윈도우용으로 존재하며, 일부는 D로 작성되었으며, Poseidon,[70] D-IDE,[71] 및 Entice Designer가 있다.[72]

D 응용 프로그램은 GNU 디버거 (GDB) 또는 WinDbg와 같은 모든 C/C++ 디버거를 사용하여 디버깅할 수 있지만, 다양한 D 특정 언어 기능에 대한 지원은 매우 제한적이다. 윈도우에서는 Ddbg 또는 Microsoft 디버깅 도구 (WinDBG 및 Visual Studio)를 사용하여 cv2pdb를 사용하여 디버그 정보를 변환한 후 D 프로그램을 디버깅할 수 있다. Linux용 디버거인 ZeroBUGS는 D 언어를 실험적으로 지원한다. Ddbg는 다양한 IDE 또는 명령줄에서 사용할 수 있으며, ZeroBUGS는 자체 그래픽 사용자 인터페이스 (GUI)를 갖추고 있다.

''DustMite''는 컴파일러 또는 테스트 문제를 찾을 때 유용한 D 소스 코드를 최소화하는 도구이다.[73]

''dub''는 D 응용 프로그램 및 라이브러리를 위한 널리 사용되는 패키지 및 빌드 관리자이며, 종종 IDE 지원에 통합된다.[74]

Visual D는 마이크로소프트통합 개발 환경(IDE) Visual Studio용 플러그인이다. 무상으로 이용 가능한 Visual Studio Shell에도 대응한다.

6. 예제 코드

d

import std.stdio; // 모듈을 불러오기

void main() // 프로그램의 엔트리 포인트는 C와 같은 main

{

writeln("Hello, world!");

// void main() 함수에서 빠져나가면 적절한 종료 코드가 반환된다

}

```

```d

import std.stdio, std.conv : to;

void main(string[] args) // D의 배열은 요소 수의 정보를 가지고 있다

{

int sum; // 값 타입은 컴파일러에 의해 0으로 초기화된다

foreach(arg; args[1..$]) // 변수 arg는 타입 추론에 의해 string 타입이 된다

{ // 배열의 슬라이싱도 내장되어 지원된다

sum += to!(int)(arg); // to는 템플릿 함수

}

writeln(sum);

}

```

고차 함수를 사용하여 작성하는 것도 가능하다. 표준 라이브러리에 포함된 map, reduce 함수를 사용하는 예제를 나타낸다.

```d

import std.algorithm;

import std.conv;

import std.stdio;

void main(string[] args)

{

writeln(args[1 .. $].map!(to!int).reduce!((a, b) => a + b));

}

6. 1. 헬로 월드 프로그램

d

import std.stdio;

int main(string args[])

{

writeln("안녕. D Programming Language!");

return 0;

}

```

위 코드는 기본적인 "Hello, world!" 프로그램의 예시이다.

D 언어의 "Hello, world!" 프로그램은 아래와 같이 더 간결하게 작성할 수도 있다.

```d

import std.stdio; // 모듈을 불러오기

void main() // 프로그램의 엔트리 포인트는 C와 같은 main

{

writeln("Hello, world!");

// void main() 함수에서 빠져나가면 적절한 종료 코드가 반환된다

}

```

D는 인수의 합을 구하는 프로그램을 작성할 때, 배열 슬라이싱과 타입 추론 등의 기능을 활용할 수 있다.

```d

import std.stdio, std.conv : to;

void main(string[] args) // D의 배열은 요소 수의 정보를 가지고 있다

{

int sum; // 값 타입은 컴파일러에 의해 0으로 초기화된다

foreach(arg; args[1..$]) // 변수 arg는 타입 추론에 의해 string 타입이 된다

{ // 배열의 슬라이싱도 내장되어 지원된다

sum += to!(int)(arg); // to는 템플릿 함수

}

writeln(sum);

}

```

고차 함수를 사용하여 작성하는 것도 가능하다. 표준 라이브러리에 포함된 map, reduce 함수를 사용하는 예제는 다음과 같다.

```d

import std.algorithm;

import std.conv;

import std.stdio;

void main(string[] args)

{

writeln(args[1 .. $].map!(to!int).reduce!((a, b) => a + b));

}

```

6. 2. 명령행 인자 출력

D 언어 프로그램의 명령행 인자는 `main` 함수의 `string[] args` 인자를 통해 접근할 수 있다. `args`는 명령행 인자를 나타내는 문자열 배열이며, `string`은 `immutable(char)[]`로 표현되는 문자 배열이다.

다음은 콘솔에 명령행 인자를 출력하는 예제이다.

```d

import std.stdio: writefln;

void main(string[] args)

{

foreach (i, arg; args)

writefln("args[%d] = '%s'", i, arg);

}

```

`foreach` 문을 사용하여 배열 `args`의 각 인덱스(`i`)와 값(`arg`)을 순회하며 출력한다. 이때 `i`와 `arg`의 타입은 `args` 배열의 타입으로부터 추론된다.

다음은 명령행 인자들의 합을 출력하는 예제이다.

```d

import std.stdio, std.conv : to;

void main(string[] args)

{

int sum;

foreach(arg; args[1..$])

{

sum += to!(int)(arg);

}

writeln(sum);

}

```

`args[1..$]`를 통해 첫 번째 인자를 제외한 나머지 인자들을 슬라이싱하여 순회한다. 각 인자는 `std.conv` 모듈의 `to` 템플릿 함수를 사용하여 정수형으로 변환되어 `sum` 변수에 더해진다.

고차 함수를 사용하면 다음과 같이 작성할 수도 있다.

```d

import std.algorithm;

import std.conv;

import std.stdio;

void main(string[] args)

{

writeln(args[1 .. $].map!(to!int).reduce!((a, b) => a + b));

}

```

`std.algorithm` 모듈의 `map` 함수를 사용하여 각 인자를 정수형으로 변환하고, `reduce` 함수를 사용하여 모든 요소의 합을 계산한다.

6. 3. 파일에서 단어 읽어 아나그램 찾기

다음은 D의 몇 가지 기능과 D 설계의 트레이드 오프를 보여주는 짧은 프로그램이다. 이 프로그램은 각 줄에 서로 다른 단어가 포함된 `words.txt`라는 텍스트 파일의 각 줄을 반복하며, 다른 단어의 아나그램인 모든 단어를 출력한다.

```d

import std.stdio, std.algorithm, std.range, std.string;

void main() {

dstring[] [dstring] signature2words;

foreach (dchar[] w; lines(File("words.txt"))) {

w = w.chomp().toLower();

immutable signature = w.dup.sort().release().idup;

signature2words[signature] ~= w.idup;

}

foreach (words; signature2words) {

if (words.length > 1)

writeln(words.join(" "));

}

}

```

  • `signature2words`는 `dstring`(32비트/char) 키를 `dstring` 배열에 매핑하는 내장 연관 배열이다. 이는 파이썬의 `defaultdict(list)`와 유사하다.
  • `lines(File())`은 줄 바꿈과 함께 줄을 지연 로딩한다. 연관 배열 값에 사용할 문자열을 얻으려면 `idup`로 복사해야 한다(배열의 `idup` 속성은 배열의 변경 불가능한 복사본을 반환하며, `dstring` 유형이 실제로 `immutable(dchar)[]`이기 때문에 필요하다). 내장 연관 배열은 변경 불가능한 키가 필요하다.
  • `~=` 연산자는 새 `dstring`을 연관 동적 배열의 값에 추가한다.
  • `toLower`, `join` 및 `chomp`는 D에서 메서드 구문을 사용하여 사용할 수 있는 문자열 함수이다. 이러한 함수의 이름은 종종 파이썬 문자열 메서드와 유사하다. `toLower`는 문자열을 소문자로 변환하고, `join(" ")`는 문자열 배열을 단일 공백을 구분 기호로 사용하여 단일 문자열로 결합하며, `chomp`는 문자열 끝에 줄 바꿈이 있으면 제거한다. `w.dup.sort().release().idup`는 더 읽기 쉬우며, 예를 들어 `release(sort(w.dup)).idup`와 동일하다. 이 기능은 UFCS(Uniform Function Call Syntax)라고 하며, 메서드와 같은 기능을 사용하여 모든 내장 또는 타사 패키지 유형을 확장할 수 있다. 이와 같이 코드를 작성하는 스타일은 종종 파이프라인(특히 사용된 객체가 지연 계산될 때, 예를 들어 반복자/범위) 또는 플루언트 인터페이스라고 한다.
  • `sort`는 배열을 제자리에서 정렬하여 서로의 아나그램인 단어에 대한 고유한 시그니처를 만드는 std.algorithm 함수이다. `sort()`의 반환 값에 대한 `release()` 메서드는 코드를 단일 표현식으로 유지하는 데 유용하다.
  • 두 번째 `foreach`는 연관 배열의 값을 반복하며, `words`의 유형을 추론할 수 있다.
  • `signature`는 변경 불가능한 변수에 할당되며, 해당 유형이 추론된다.
  • UTF-32 `dchar[]`는 일반 UTF-8 `char[]` 대신 사용된다. 그렇지 않으면 `sort()`가 정렬을 거부한다. UTF-8만 사용하여 이 프로그램을 작성하는 더 효율적인 방법이 있다.

7. 활용 사례

D 프로그래밍 언어는 페이스북[75], 이베이[76], 넷플릭스[77] 등 주요 조직에서 사용되고 있다.

D는 AAA 게임[78], 언어 인터프리터, 가상 머신[79][80], 운영 체제 커널[81], GPU 프로그래밍[82], 웹 개발[83][84], 수치 해석[85], GUI 애플리케이션[86][87], 승객 정보 시스템[88], 머신 러닝[89], 텍스트 처리, 웹 및 애플리케이션 서버, 그리고 연구 분야 등에서 다양하게 활용된다.

북한의 해킹 그룹 라자루스는 "Log4Shell"(CVE-2021-44228) 취약점을 이용해 DLang으로 작성된 3개의 악성 코드를 배포했다.[90]

8. 비판

D 언어의 결함 및 오류 수정 사항 통합 과정에서 투명성, 민첩성, 예측 가능성이 부족하다는 비판이 제기된다. D 언어에 사소한 변경 사항과 주요 변경 사항을 도입하는 데 어려움이 있다는 점도 문제점으로 지적되며, 이러한 문제는 2024년 1월 1일 ''OpenD'' 포크로 이어졌다.

참조

[1] 웹사이트 Building assert() in Swift, Part 2: __FILE__ and __LINE__ https://developer.ap[...] 2014-09-25
[2] 웹사이트 dmd Backend converted to Boost License https://forum.dlang.[...] 2017-04-07
[3] 웹사이트 D 2.0 FAQ http://dlang.org/faq[...] 2015-08-11
[4] 웹사이트 D Programming Language - Fileinfo.com https://fileinfo.com[...] 2020-11-15
[5] 웹사이트 D Programming Language - dlang.org https://dlang.org/dm[...] 2020-11-15
[6] 웹사이트 On: Show HN: A nice C string API https://news.ycombin[...] 2022-12-03
[7] 서적 The D programming language https://archive.org/[...] Addison-Wesley 2010
[8] 웹사이트 Introduction - D Programming Language https://dlang.org/sp[...] 2024-04-21
[9] 웹사이트 D Strings vs C++ Strings https://digitalmars.[...] Digital Mars 2012
[10] 웹사이트 D Complex Types and C++ std::complex https://digitalmars.[...] 2021-11-04
[11] 웹사이트 Expressions http://dlang.org/exp[...] Digital Mars 2012-12-27
[12] 웹사이트 std.gc http://www.digitalma[...] Digital Mars 2010-07-06
[13] 웹사이트 Memory Management http://dlang.org/mem[...] Digital Mars 2012-02-17
[14] 웹사이트 Go Your Own Way (Part One: The Stack) https://dlang.org/bl[...] 2017-07-07
[15] 웹사이트 Attributes - D Programming Language https://dlang.org/sp[...] 2020-05-07
[16] 웹사이트 std.experimental.allocator - D Programming Language https://dlang.org/ph[...] 2020-05-07
[17] 웹사이트 SafeD – D Programming Language http://dlang.org/saf[...] 2014-07-17
[18] 웹사이트 How to Write @trusted Code in D https://dlang.org/bl[...] 2016-09-28
[19] 웹사이트 Scoped Pointers https://github.com/d[...] 2020-04-03
[20] 웹사이트 Sealed References https://wiki.dlang.o[...]
[21] 웹사이트 D Language Specification: Functions - Return Scope Parameters https://dlang.org/sp[...]
[22] 웹사이트 Ownership and Borrowing in D https://dlang.org/bl[...] 2019-07-15
[23] 웹사이트 D Language Specification: Functions - Function Parameter Storage Classes https://dlang.org/sp[...]
[24] 웹사이트 PyD https://github.com/a[...] 2020-05-07
[25] 웹사이트 Package derelict-lua on DUB https://code.dlang.o[...] 2020-05-07
[26] 웹사이트 Package bindbc-lua on DUB https://code.dlang.o[...] 2020-05-07
[27] 웹사이트 Better C https://dlang.org/sp[...]
[28] 웹사이트 D Change Log to Nov 7 2005 http://www.digitalma[...] Digital Mars 2011-12-01
[29] 웹사이트 D Change Log http://www.digitalma[...] Digital Mars 2012-01-11
[30] 웹사이트 Intro http://www.digitalma[...] Digital Mars 2011-12-01
[31] 웹사이트 Announcing a new library http://forum.dlang.o[...] 2012-02-15
[32] 웹사이트 Wiki4D: Standard Lib http://www.prowiki.o[...] 2010-07-06
[33] 웹사이트 Change Log – D Programming Language https://dlang.org/ch[...] D Language Foundation 2020-11-22
[34] 웹사이트 Tango for D2: All user modules ported http://forum.dlang.o[...] 2012-02-16
[35] 웹사이트 Re: GitHub or dsource? http://forum.dlang.o[...] 2012-02-15
[36] 웹사이트 D1 to be discontinued on December 31, 2012 http://forum.dlang.o[...] 2014-01-31
[37] 웹사이트 D Change Log http://www.digitalma[...] Digital Mars 2014-01-31
[38] 웹사이트 backendlicense.txt https://github.com/d[...] GitHub 2012-03-05
[39] 웹사이트 dmd front end now switched to Boost license http://forum.dlang.o[...] 2014-09-09
[40] 웹사이트 dmd Backend converted to Boost License https://forum.dlang.[...] 2017-04-09
[41] 웹사이트 Reddit comment by Walter Bright https://www.reddit.c[...] 2014-09-09
[42] 뉴스 D-Compiler-unter-freier-Lizenz http://www.linux-mag[...] linux-magazin.de 2017
[43] Github switch backend to Boost License #6680 https://github.com/d[...] github.com
[44] 웹사이트 D Language accepted for inclusion in GCC https://gcc.gnu.org/[...]
[45] 웹사이트 GDC https://gdcproject.o[...]
[46] 웹사이트 GCC 9 Release Series — Changes, New Features, and Fixes - GNU Project - Free Software Foundation (FSF) https://gcc.gnu.org/[...] 2020-05-07
[47] 웹사이트 Another front end for GCC https://forum.dlang.[...] 2020-05-07
[48] 웹사이트 GCC 9 Release Series Changes, New Features, and Fixes https://gcc.gnu.org/[...]
[49] 웹사이트 LLVM D compiler project on GitHub https://github.com/l[...] 2016-08-19
[50] 웹사이트 BuildInstructionsPhobosDruntimeTrunk – ldc – D Programming Language – Trac http://www.dsource.o[...] 2015-08-11
[51] 웹사이트 D .NET project on CodePlex http://dnet.codeplex[...] 2010-07-03
[52] 웹사이트 Source for the D.NET Compiler is Now Available http://www.infoq.com[...] InfoQ 2009-05-15
[53] 웹사이트 Make SDC the Snazzy D compiler https://github.com/s[...] 2023-09-24
[54] Youtube DConf 2014: SDC, a D Compiler as a Library by Amaury Sechet https://www.youtube.[...] 2014-01-08
[55] 웹사이트 deadalnix/SDC https://github.com/d[...] 2014-01-08
[56] 웹사이트 Wiki4D: EditorSupport/ZeusForWindows http://www.prowiki.o[...] 2015-08-11
[57] 웹사이트 Wiki4D: Editor Support http://www.prowiki.o[...] 2010-07-03
[58] 웹사이트 Basile.B / dexed https://gitlab.com/b[...] 2020-04-29
[59] 웹사이트 Mono-D - D Wiki https://wiki.dlang.o[...] 2020-04-30
[60] 웹사이트 Mono-D – D Support for MonoDevelop http://mono-d.source[...] 2015-08-11
[61] 웹사이트 Google Project Hosting https://code.google.[...] 2015-08-11
[62] 웹사이트 descent http://dsource.org/p[...] 2015-08-11
[63] 웹사이트 Visual D - D Programming Language https://rainers.gith[...] 2015-08-11
[64] 웹사이트 rainers/visuald: Visual D - Visual Studio extension for the D programming language https://github.com/r[...] 2020-04-17
[65] 웹사이트 dlang-vscode https://github.com/d[...] 2016-12-21
[66] 웹사이트 code-d https://github.com/P[...] 2016-12-21
[67] 웹사이트 Michel Fortin – D for Xcode http://michelf.com/p[...] 2015-08-11
[68] 웹사이트 Dav1dde/lumen https://github.com/D[...] 2015-08-11
[69] 웹사이트 Project Highlight: DlangUI https://dlang.org/bl[...] 2024-09-12
[70] 웹사이트 poseidon http://dsource.org/p[...] 2015-08-11
[71] 웹사이트 Mono-D – D Support for MonoDevelop http://d-ide.sourcef[...] 2015-08-11
[72] 웹사이트 Entice Designer – Dprogramming.com – The D programming language http://www.dprogramm[...] 2015-08-11
[73] 웹사이트 What is DustMite? https://github.com/C[...] 2020-04-29
[74] 웹사이트 dlang/dub: Package and build management system for D https://github.com/d[...] 2020-04-29
[75] 웹사이트 Under the Hood: warp, a fast C and C++ preprocessor https://code.faceboo[...] 2018-01-04
[76] 웹사이트 Faster Command Line Tools in D https://dlang.org/bl[...] 2018-01-04
[77] 웹사이트 Introducing Vectorflow https://medium.com/@[...] 2018-01-04
[78] 웹사이트 Quantum Break: AAA Gaming With Some D Code http://dconf.org/201[...] 2018-01-04
[79] 웹사이트 Higgs JavaScript Virtual Machine https://github.com/h[...] 2018-01-04
[80] 웹사이트 A D implementation of the ECMA 262 (Javascript) programming language https://github.com/D[...] 2018-01-04
[81] 웹사이트 Project Highlight: The PowerNex Kernel https://dlang.org/bl[...] 2018-01-04
[82] 웹사이트 DCompute: Running D on the GPU https://dlang.org/bl[...] 2018-01-04
[83] 웹사이트 vibe.d - a high-performance asynchronous I/O, concurrency and web application toolkit written in D http://vibed.org/ 2018-01-04
[84] 웹사이트 Project Highlight: Diamond MVC Framework https://dlang.org/bl[...] 2018-01-04
[85] 웹사이트 Numeric age for D: Mir GLAS is faster than OpenBLAS and Eigen http://blog.mir.dlan[...] 2018-01-04
[86] 웹사이트 On Tilix and D: An Interview with Gerald Nunn https://dlang.org/bl[...] 2018-01-04
[87] 웹사이트 Project Highlight: DlangUI https://dlang.org/bl[...] 2018-01-04
[88] 웹사이트 Project Highlight: Funkwerk https://dlang.org/bl[...] 2018-01-04
[89] 웹사이트 Netflix/vectorflow https://github.com/N[...] Netflix, Inc. 2020-05-07
[90] 웹사이트 Lazarus hackers drop new RAT malware using 2-year-old Log4j bug https://www.bleeping[...] 2023-12-11
[91] 웹사이트 A ship carrying silverware has sailed https://dpldocs.info[...] 2024-05-06
[92] 웹사이트 The OpenD Programming Language http://opendlang.org 2024-05-14
[93] 웹사이트 Building assert() in Swift, Part 2: __FILE__ and __LINE__ https://developer.ap[...] 2014-09-25
[94] 웹사이트 Why does the standard library use the boost license? Why not public domain? https://dlang.org/ar[...] 2024-09-13
[95] 문서 D 2.0 の 1.0 からの違い - プログラミング言語 D 2.0 https://www.kmonos.n[...]
[96] 문서 Deprecated Features https://dlang.org/de[...]
[97] 웹인용 dmd Backend converted to Boost License https://forum.dlang.[...] 2017-04-07
[98] 웹인용 D 2.0 FAQ http://dlang.org/faq[...] 2015-08-11
[99] 웹인용 Expressions http://dlang.org/exp[...] Digital Mars 2012-12-27
[100] 웹인용 'On: Ruminations on D: An Interview with Walter Bright' https://news.ycombin[...] 2016-08-30
[101] 웹인용 Memory-Safe-D-Spec https://dlang.org/sp[...] D Language Foundation



본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.

문의하기 : help@durumis.com