D (프로그래밍 언어)
"오늘의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 관련 정보]에 관한 문서 | |
---|---|
일반 정보 | |
![]() | |
패러다임 | 다중 패러다임 프로그래밍 언어: 함수형 프로그래밍, 명령형 프로그래밍, 객체 지향 프로그래밍 |
발표 연도 | 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에 대한 지원이 추가되었다.
- GDC는 GNU 컴파일러 모음(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. 헬로 월드 프로그램
dimport 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