D(프로그래밍 언어)

D (programming language)
D 프로그래밍 언어
D Programming Language logo.svg
패러다임멀티패러다임: 기능성, 필수성, 객체 지향성
설계자Walter Bright, Andrei Alexandrescu (2007년부터)
개발자D언어재단
처음 등장한2001년 12월 8일, 20년 전(2001-12-08)[1]
안정된 릴리스
2.099.1[2] / 2022년 4월 7일; 3개월 (2022년 4월 7일)
타이핑 분야추정, 정적, 강력
OSFreeBSD, Linux, macOS, Windows
면허증.부스트[3][4][5]
파일 이름 확장자.d[6][7]
웹 사이트dlang.org
주요 구현
DMD(기준 실장), GCC,

GDC,

LDC, SDC
영향을 받다
C, C++, C#, Eiffel,[8] Java, Python
영향받은
Genie, MiniD, Qore, [9]Swift, Vala, C++11, C++14, C++17, C++20, Go, C#

DDigital MarsWalter Bright에 의해 2001년에 발매된 멀티패러다임 시스템 프로그래밍 언어입니다.Andrei Alexandrescu는 2007년에 설계 및 개발에 참여했습니다.C++의 리엔지니어링에서 유래했지만 D는 전혀 다른 언어입니다.D의 기능은 C++[10]의 합리적이고 확장된 아이디어로 간주될 수 있지만 D는 Java, Python, Ruby, C# Eiffel과 같은 다른 고급 프로그래밍 언어에서도 영감을 얻습니다.

D는 컴파일된 언어의 성능과 안전성을 현대 동적기능적[11] 프로그래밍 언어의 표현력과 결합합니다.Idiomatic D 코드는 일반적으로 동등한 C++ 코드만큼 빠르지만 더 [12]짧습니다.언어 전체는 메모리[13] 안전성이 없지만 프로그램 [14]전체 또는 서브셋의 메모리 안전을 보장하기 위해 설계된 선택적 속성을 포함합니다.

타입 추론, 자동 메모리 관리, 공통 타입통사 설탕의해 고속 개발가능해지고, 범위 확인, 계약에 의한 설계로 런타임에 버그가 발견되며, 동시 인식 타입 시스템이 컴파일 시에 [15]버그를 검출합니다.

특징들

D는 순수하게 이론적인 관점이 아닌 실용적인 C++ 사용법에서 얻은 교훈을 바탕으로 설계되었다.이 언어는 많은 C 및 C++ 개념을 사용하지만 일부 목표를 달성하기 위해 일부 또는 다른 접근법(및 구문)을 사용하기도 합니다.따라서 C 및 C++ 소스 코드와 일반적으로 호환성이 없습니다(또한 이러한 언어의 단순한 코드 베이스는 D와 함께 동작하거나 포팅이 필요할 수도 있습니다.단, D는 C와 D 양쪽에서 합법적이었던 모든 코드가 동일하게 동작해야 한다는 규칙에 의해 설계상 제약이 있었습니다.

D는 C++ 이전에 폐쇄, 익명 함수, 컴파일 시간 함수 실행, 범위, 내장 컨테이너 반복 개념 및 유형 추론과 같은 몇 가지 특징을 얻었습니다.D는 계약에 의한 설계, 유닛 테스트, 진정한 모듈, 가비지 컬렉션, 퍼스트 클래스 어레이, 어소시에이션 어레이, 다이내믹 어레이, 어레이 슬라이싱, 네스트 함수, 레이지 평가, 스코프(지연) 코드 실행 및 리엔지니어링된 템플릿 구문을 구현함으로써 C++의 기능을 더한다.C++ 다중 상속은 인터페이스 및 혼합을 사용하는 Java 스타일의 단일 상속으로 대체되었습니다.한편, D의 선언, 스테이트먼트, 식 구문은 C++와 거의 일치한다.

D는 인라인 어셈블러를 포함한 하위 수준의 프로그래밍을 수행하는 C++의 능력을 보유하고 있으며, 이는 D와 Java 및 C#과 같은 응용 프로그램 언어 간의 차이를 나타냅니다.인라인 어셈블러는 프로그래머가 표준 D코드 내에 머신 고유의 어셈블리 코드를 입력할 수 있도록 합니다.이것은 시스템 프로그래머가 운영체제나 디바이스 드라이버같은 기본 하드웨어와 직접 인터페이스하는 프로그램을 실행하는 데 필요한 프로세서의 낮은 수준의 기능에 액세스하기 위해 사용하는 방법이며 고성능 코드(즉,컴파일러가 자동으로 생성하기 어려운 벡터 확장자(SIMD)를 사용합니다.

D는 함수 오버로드 연산자 오버로드와 동적 어레이 및 관련 어레이를 기본적으로 지원합니다.기호(함수, 변수, 클래스)는 임의의 순서로 선언할 수 있습니다.으로의 선언은 필요 없습니다.마찬가지로 Import는 거의 임의의 순서로 실행할 수 있으며, 범위도 지정할 수 있습니다(즉, 일부 모듈 또는 일부 모듈을 함수, 클래스, 또는 함수 내에서만 Import할 수 있습니다.D에는 문서 코멘트에 대한 지원이 내장되어 있어 문서를 자동으로 생성할 수 있습니다.

D에서 텍스트 문자열은 문자 배열일 뿐이며, C++[16]와 달리 D의 배열은 경계 검사됩니다.수학 코어리와 시각적으로 다른 문자열 처리 연산자가 존재합니다.D는 복소수 및 허수의 퍼스트 클래스 타입을 가지며, 이러한 타입을 포함한 [17]식을 효율적으로 평가한다.

프로그래밍 패러다임

D는 5가지 주요 프로그래밍 패러다임을 지원합니다.

필수

D의 명령형 프로그래밍은 C의 명령형 프로그래밍과 거의 동일합니다.함수, 데이터, 스테이트먼트, 선언 및 식은 C에서와 동일하게 동작하며 C 런타임 라이브러리에 직접 액세스할 수 있습니다.한편, 명령형 프로그래밍 영역에서 D와 C의 몇 가지 주목할 만한 차이점은 컬렉션에 대한 루프를 허용하는 D의 루프 구성 및 다른 함수의 내부에 선언되어 포섭 함수의 로컬 변수에 액세스할 수 있는 중첩 함수를 포함한다.

수입품 표준.스태디오;  무효 주된() {     인트 승수 = 10;     인트 스케일이 있는(인트 x) { 돌아가다 x * 승수; }      앞지르다 (i; 0 .. 10) {         기입하다("안녕하세요, 월드 %d! scaled = %d", i, 스케일이 있는(i));     } } 

객체 지향

D의 객체 지향 프로그래밍은 단일 상속 계층을 기반으로 하며 모든 클래스는 클래스 객체에서 파생됩니다.D는 다중 상속을 지원하지 않습니다.대신 C++의 순수 추상 클래스와 유사한 Java 스타일의 인터페이스와 상속 계층에서 공통 기능을 분리하는 mixin을 사용합니다.또, D 에서는, 스태틱 방식 및 최종(비가상) 방식을 인터페이스로 정의할 수도 있습니다.

D의 인터페이스 및 상속은 재정의된 메서드의 반환 유형에 대해 공변 유형을 지원합니다.

D는 타입 포워딩과 옵션의 커스텀 다이내믹 디스패치를 지원합니다.

D의 클래스(및 인터페이스)는 계약 방법에 의한 설계에 따라 퍼블릭 메서드 진입 전후에 자동으로 체크되는 불변수를 포함할 수 있다.

클래스(및 구조)의 많은 측면은 컴파일 시 자동으로 검토될 수 있습니다(사용하는 성찰의 한 형태).type traits실행 시(RTTI/) 및TypeInfo범용 코드 또는 자동 코드 생성을 용이하게 합니다(일반적으로 컴파일 타임 기법을 사용합니다).

기능하다

D는 함수 리터럴, 폐쇄, 재귀 불변 객체 및 고차 함수 사용과 같은 기능 프로그래밍 기능을 지원합니다.익명 함수에는 다중 스테이트먼트 형식과 "shorthand" 단일 표현 표기법 등 [12]두 가지 구문이 있습니다.

인트 기능.(인트) g; g = (x) { 돌아가다 x * x; }; // 핸드 g = (x) => x * x;          // 줄임말 

함수 리터럴에는 두 가지 기본 유형이 있습니다.function이는 단순히 스택슬롯 함수에 대한 포인터일 뿐이며,delegate주변 환경에 대한 포인터도 포함되어 있습니다.유형 추론은 어나니머스 함수와 함께 사용될 수 있으며, 이 경우 컴파일러는 다음을 생성합니다.delegate환경 포인터가 필요하지 않다는 것을 증명할 수 있는 경우를 제외하고요.마찬가지로 폐쇄를 구현하기 위해 컴파일러는 필요한 경우에만 힙에 폐쇄된 로컬 변수를 배치합니다(예를 들어 폐쇄가 다른 함수에 의해 반환되어 해당 함수의 범위를 종료하는 경우).유형 추론을 사용할 때 컴파일러는 다음과 같은 속성도 추가합니다.pure그리고.nothrow적용 여부를 증명할 수 있는 경우 함수의 유형에 따라 달라집니다.

표준 라이브러리 모듈을 통해 카레링과 같은 기타 기능 및 지도, 필터, 축소 등의 일반적인 고차 함수를 사용할 수 있습니다.std.functional그리고.std.algorithm.

수입품 표준.스태디오, 표준.알고리즘., 표준.범위;  무효 주된() {     인트[] a1 = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];     인트[] a2 = [6, 7, 8, 9];      // 순수 함수 내부에서 액세스를 허용하려면 불변해야 합니다.     불변의 피벗 = 5;      인트 마이섬(인트 a, 인트 b) 순수하다 행하지 않다 // 순수 함수     {         한다면 (b <=> 피벗) // 인클로징을 참조합니다.             돌아가다 a + b;         또 다른             돌아가다 a;     }      // 위임자 전달(종료)     자동 결과 = 줄이자!마이섬(쇠사슬(a1, a2));     기입하다("결과: ", 결과); // 결과: 15      // 위임 리터럴 전달     결과 = 줄이자!((a, b) => (b <=> 피벗) ? a + b : a)(쇠사슬(a1, a2));     기입하다("결과: ", 결과); // 결과: 15 } 

또는 Uniform Function Call Syntax(UFCS; 균일한 함수 호출 구문)를 사용하여 위의 함수 구성을 표현할 수 있습니다.

    자동 결과 = a1.쇠사슬(a2).줄이자!마이섬();     기입하다("결과: ", 결과);      결과 = a1.쇠사슬(a2).줄이자!((a, b) => (b <=> 피벗) ? a + b : a)();     기입하다("결과: ", 결과); 

평행성

병렬 프로그래밍 개념은 라이브러리에 구현되어 컴파일러의 추가 지원이 필요하지 않습니다.다만, D타입의 시스템과 컴파일러는, 데이터 공유를 투과적으로 검출해 관리할 수 있도록 합니다.

수입품 표준.스태디오 : 기입하다; 수입품 표준.범위 : iota; 수입품 표준.평행성 : 평행한;  무효 주된() {     앞지르다 (i; iota(11).평행한) {         // Forech 루프 본문은 각 i에 대해 병렬로 실행됩니다.         기입하다("처리 중", i);     } } 

iota(11).parallel와 동등하다std.parallelism.parallel(iota(11))UFCS 를 사용해 주세요.

같은 모듈에서도taskPool이는 병렬 태스크의 동적 생성 및 범위(및 배열)에서의 맵 필터 변환 및 폴드 스타일 작업에 사용할 수 있으며, 기능적 작업과 결합할 때 유용합니다. std.algorithm.map배열이 아니라 느리게 평가된 범위를 반환합니다.이 방법으로 요소는 각 작업자 태스크에 의해 병렬로 자동으로 계산됩니다.

수입품 표준.스태디오 : 기입하다; 수입품 표준.알고리즘. : 지도; 수입품 표준.범위 : iota; 수입품 표준.평행성 : 태스크 풀;  /* 인텔 i7-3930X 및 gdc 9.3.0: * 5140ms (Std.delays.delays 사용) * std.parallelism.taskPool.reduce를 사용한888ms * * AMD 스레드 리퍼 2950X 및 gdc 9.3.0의 경우: * 2864밀리초 (Std.204.199 사용) * std.parallelism.taskPool.reduce를 사용한95밀리초 */ 무효 주된() {   자동 숫자 = iota(1.0, 1_000_000_000.0);    자동 x = 태스크 풀.줄이자!"a + b"(       0.0, 지도!"1.0 / (a * a)"(숫자)   );    기입하다("합계: ", x); } 

동시성

동시성은 라이브러리에서 완전히 구현되며 컴파일러의 지원이 필요하지 않습니다.동시 코드를 작성하는 대체 구현 및 방법론을 사용할 수 있습니다.D 타이핑 시스템을 사용하면 메모리의 안전성을 확보할 수 있습니다.

수입품 표준.스태디오, 표준.동시성, 표준.변종;  무효 후우() {     부울 콘텐트 = 진실의;      하는 동안에 (콘텐트)     {         받다( // 메시지 유형을 일치시키기 위해 대리인을 사용합니다.             (인트 메시지) => 기입하다(수신된 입력:, 메시지),             (Tid(Tid) 송신자) { 콘텐트 = 거짓의; 송신자.보내세요(-1); },             (변종 v) => 기입하다("응?") // 변형은 모든 유형과 일치합니다.         );     } }  무효 주된() {     자동 조형물 = 낳다(&)후우); // foo()를 실행하는 새 스레드를 생성합니다.      앞지르다 (i; 0 .. 10)         조형물.보내세요(i);   // 일부 정수 전송      조형물.보내세요(1.0f);    // 플로트 보내기     조형물.보내세요("안녕하세요"); // 문자열 전송     조형물.보내세요(ThisTid); // 구조체 전송(TID)      받다((인트 x) => 기입하다("메인 스레드 수신 메시지:", x)); } 

메타프로그래밍

메타프로그래밍은 템플릿, 컴파일 타임 함수 실행, 튜플 및 문자열 믹스인을 통해 지원됩니다.다음 예시는 D의 컴파일 타임 기능의 일부를 나타내고 있습니다.

D의 템플릿은 템플릿의 C++ 기능 스타일과 비교하여 보다 명령적인 스타일로 작성할 수 있습니다.이것은 숫자의 계수를 계산하는 정규 함수입니다.

하지 않다 요인(하지 않다 n) {     한다면 (n < > 2)         돌아가다 1;     또 다른         돌아가다 n * 요인(n-1); } 

여기에서는,static if, D의 컴파일 시간 조건부 구성은 위의 함수와 유사한 코드를 사용하여 동일한 계산을 수행하는 템플릿을 구축하는 것을 보여줍니다.

템플릿 요인(하지 않다 n) {     정적인 한다면 (n < > 2)         열거하다 요인 = 1;     또 다른         열거하다 요인 = n * 요인!(n-1); } 

다음 두 가지 예에서는 위에서 정의한 템플릿과 함수를 사용하여 인자 계수를 계산합니다.컴파일러가 할당의 오른쪽에서 해당 유형을 추론하기 때문에 상수의 유형을 명시적으로 지정할 필요는 없습니다.

열거하다 팩트_7 = 요인!(7); 

이것은 Compile-Time Function Execution(CTFE; 컴파일 시간 함수 실행)의 예입니다.일반 함수는 특정 기준을 충족하는 경우 연속 컴파일 시간 표현식으로 사용할 수 있습니다.

열거하다 팩트_9 = 요인(9); 

std.string.format함수는 (컴파일 시에도 CTFE를 통해) 데이터 포맷을 실행하고 "msg" 플러그마는 컴파일 시 결과를 표시합니다.

수입품 표준.스트링 : 포맷; 플러그마(메시지, 포맷("7! = %s", 팩트_7)); 플러그마(메시지, 포맷("9! = %s", 팩트_9)); 

문자열 믹스인은 컴파일 시 함수 실행과 조합되어 컴파일 시 문자열 연산을 사용하여 D 코드를 생성할 수 있습니다.이것은, 프로그램의 일부로서 컴파일 되는 도메인 고유의 언어를 해석하기 위해서 사용할 수 있습니다.

수입품 FooToD; // Foo 소스 코드를 해석하는 함수를 포함하는 가상 모듈                // 및 동등한 D 코드를 반환합니다. 무효 주된() {     혼재(동작(수입품("foo.foo"))); } 

메모리 관리

메모리는 보통 가비지 수집으로 관리되지만 특정 개체가 범위를 벗어나면 즉시 완료될 수 있습니다.이것은 D로 쓰여진 대부분의 프로그램과 라이브러리가 사용하는 것입니다.

메모리 레이아웃을 보다 제어하고 성능을 향상시킬 필요가 있는 경우 과부하 연산자를 사용하여 명시적인 메모리 관리가 가능합니다. new그리고.deleteC의 malloc 및 free에 직접 전화하거나 커스텀 할당기 스킴(즉, 폴백이 있는 스택, RAII 스타일 할당, 참조 카운트, 공유 참조 카운트)을 구현합니다.가비지 컬렉션을 제어할 수 있습니다.프로그래머는 메모리 범위를 추가 및 제외하거나 컬렉터를 비활성화 및 활성화하거나 [18]생성 또는 전체 수집 사이클을 강제할 수 있습니다.이 매뉴얼에서는 [19]가비지 컬렉션이 프로그램에서 불충분한 경우에 대비하여 고도로 최적화된 다양한 메모리 관리 체계를 구현하는 방법에 대한 많은 예를 보여 줍니다.

기능에서는struct인스턴스는 디폴트로 스택에 할당됩니다.class기본적으로는 힙에 할당된 인스턴스(클래스 인스턴스만 스택에 있음)입니다.단, 표준 라이브러리 템플릿을 사용하여 클래스에 대해 변경할 수 있습니다.std.typecons.scoped또는 를 사용하여new값 기반 [20]변수 대신 포인터에 할당하는 구조입니다.

기능에서는 (이미 알려진 크기의) 정적 배열이 스택에 할당됩니다.동적 어레이의 경우core.stdc.stdlib.alloca기능(와 유사)alloca스택에 메모리를 할당합니다.반환된 포인터는 슬라이스를 통해 (타이프된) 동적 배열로 사용할 수 있습니다(단, 추가 등 배열 크기를 조정하지 않아야 하며,[20] 명백한 이유로 함수에서 반환해서는 안 됩니다).

A scope키워드는, 코드의 일부에 주석을 붙이기 위해서도 사용할 수 있습니다만, 변수나 클래스/코드에 주석을 붙이기 위해서도 사용할 수 있습니다.이것은, 스코프 종료시에 곧바로 파기(파괴자 호출)할 필요가 있는 것을 나타냅니다.메모리가 할당 해제되는 것은 모두 구현 및 클래스 대 구조 [21]차이에 따라 달라집니다.

std.experimental.allocator에는 모듈러형 컴포지터형 할당기 템플릿이 포함되어 있어 특수한 사용 [22]사례에 적합한 맞춤형 고성능 할당기를 생성할 수 있습니다.

세이프디

SafeD는[23] 메모리 안전성을 보증할 수 있는 D의 서브셋에 붙여진 이름입니다(할당되지 않았거나 재사용된 메모리에 대한 쓰기 없음).기능 표시@safe포인터 연산이나 체크되지 않은 캐스트 등 메모리 파손을 일으킬 수 있는 기능을 사용하지 않도록 컴파일 시에 체크됩니다.또, 호출된 다른 함수도, 다음과 같이 마크 할 필요가 있습니다.@safe또는@trusted. 기능을 표시할 수 있습니다.@trusted컴파일러가 SafeD에서 비활성화되어 있는 기능의 안전한 사용과 메모리 [24]파손의 가능성을 구별할 수 없는 경우.

범위 평생 안전성

DIP1000 및 DIP25[26](현재는 언어 사양의[27] 일부)의[25] 배너 하에 D는 데이터의 라이프 타임을 수반하는 잘못된 형식의 구조에 대한 보호를 제공합니다.

현재의 메커니즘은 주로 함수 파라미터와 스택메모리를 다루지만 D프로그래밍[28] 언어(Rust 프로그래밍 언어로부터의 아이디어에 영향을 받아) 내의 수명을 보다 철저하게 처리하는 것은 프로그래밍 언어 리더십의 야망입니다.

할당의 평생 안전성

@safe 코드 내에서 기준 유형을 포함하는 할당의 수명이 할당된 할당의 수명보다 긴지 확인합니다.

예를 들어 다음과 같습니다.

@safe 무효 시험() {     인트 tmp = 0; // #1     인트* rad;    // #2     rad = &tmp;  // #1과 #2의 선언 순서가 바뀌면 실패합니다.     {      인트 나빠 = 45; // "bad"의 수명이 정의된 범위까지만 연장됩니다.         *rad = 나빠;   // 여기는 코셔입니다.         rad = &나빠;   // rad의 라이프 타임이 bad보다 길기 때문에 이것은 전혀 코셔가 아닙니다.     } } 

@safe 코드 내의 함수 파라미터 수명 주석

포인터 유형 또는 참조 중 하나인 함수 파라미터에 적용되면 키워드 return scope에 의해 해당 파라미터의 라이프타임과 사용이 제한됩니다.

언어 표준은 다음과 같은 [29]동작을 지시합니다.

저장소 클래스 저장소 클래스를 사용하는 매개 변수의 동작(및 제약 조건)
범위 매개 변수의 참조를 이스케이프할 수 없습니다.참조가 없는 매개 변수에 대해 무시됨
돌아가다 파라미터는 첫 번째 파라미터로 반환 또는 복사할 수 있지만 그 이외의 경우 함수에서 이스케이프되지 않습니다.이러한 복사본은 파생된 인수보다 오래가지 않도록 요구됩니다.참조가 없는 매개 변수에 대해 무시됨

주석이 달린 예를 다음에 제시하겠습니다.

@safe:  인트* gp; 무효 토린(범위 인트*); 무효 글루인(인트*); 인트* 바린(돌아가다 범위 인트* p, 범위 인트* q, 인트* r) {      gp = p; // 오류, p는 글로벌 gp로 이스케이프됩니다.      gp = q; // 오류, q가 글로벌 gp로 이스케이프됩니다.      gp = r; // OK(확인)       토린(p); // OK, p는 sorin()을 이스케이프하지 않습니다.      토린(q); // OK(확인)      토린(r); // OK(확인)       글루인(p); // 오류, gloin()이 p를 이스케이프합니다.      글루인(q); // 오류, gloin() 이스케이프 q      글루인(r); // gloin()이 r을 이스케이프하는 것을 확인합니다.       돌아가다 p; // OK(확인)      돌아가다 q; //오류, 'scope의 quaque으로 돌아올 수 없다.      돌아가다 r; // 괜찮아 } 

다른 시스템과의 상호작용

C의 응용 프로그램 2진 인터페이스(ABI)가 모든 C며 파생 근본적인 종류로 기존의 C코드와 도서관에 대한 직접적인 접근의 활성화 지원된다.D하는 바인딩을 갉아 많은 인기 있는 C도서관 이용할 수 있다.표준 D를 또한, C표준 라이브러리 일부이다

MicrosoftWindows에, D컴포넌트 오브젝트 모델(COM)코드에 액세스 할 수 있다.

내가 긴 기억 관리 올바로 관리 해 많은 다른 언어 D와 함께 단일 이진에 섞일 수 있다.예를 들어, 일반 설계 기준 컴파일러로 어우러진 C, C++, 그리고 다른 지원되는 언어 코드 연결할 수 있도록 한다.D코드(기능)또한 C, C++, 파스칼 ABIs을 사용하며, 따라서 도서관 이들 언어로 소환에 적힌 대로에 전달할 표시할 수 있다.마찬가지로 데이터 코드를 이들 언어로 두가지로 쓰여진 사이에 교환될 수 있다.이것은 대개 기본 형식, 포인터 배열, 노조, 구조의 형태, 그리고 함수 포인터의 일부 유형에 사용을 제한하는 것이다.

왜냐하면 많은 다른 프로그래밍 언어들 자주 또는 흐르는 공여가 언어의 통역사 집필 기준에 CAPI를 제공한다, D직접 이 언어들과, 표준 C바인딩( 얇은 D인터페이스의 조직으로 레코드들과)를 사용하여 접속할 수 있다.예를 들어, Python,[30]Lua[31일][32]과 다른 언어들처럼 언어들을 위한 양방향 바인딩, 종종 컴파일 타임 코드 생성이 뛰어나며 컴파일 타임 형식 리플렉션을 사용하고 있다.

C++ 코드와의 상호작용

D는 C++ [33]코드와의 상호 운용에 대해 허용적이지만 현실적인 접근방식을 취합니다.

다음과 같이 표시된 D 코드의 경우extern(C++)다음의 기능이 지정되어 있습니다.

  • 망글링 규칙은 타깃의 C++ 규칙과 일치해야 합니다.
  • 함수 호출의 경우 ABI는 동등해야 합니다.
  • 테이블은 단일 상속(D 언어 사양에서 지원되는 유일한 수준)까지 일치해야 합니다.

C++ 네임스페이스는 구문을 통해 사용됩니다.extern(C++, namespace)여기서 namespace는 C++ 네임스페이스 이름입니다.

C++ 상호 운용의 예

C++측

#실패하다 <iostream> 사용. 네임스페이스 표준; 학급 기초 {     일반의:         가상 무효 프린트 3i(인트 a, 인트 b, 인트 c) = 0; };  학급 파생된 : 일반의 기초 {     일반의:         인트 들판;         파생된(인트 들판) : 들판(들판) {}          무효 프린트 3i(인트 a, 인트 b, 인트 c)         {             외치다 << > "a =" << > a << > ;             외치다 << > "b = " << > b << > ;             외치다 << > "c = " << > c << > ;         }          인트 멀티(인트 인자); };  인트 파생: mul(인트 인자) {     돌아가다 들판 * 인자; }  파생된 *createInstance(인트 i) {     돌아가다 신규 파생된(i); }  무효 deleteInstance(파생된 *&d) {     삭제하다 d;     d = 0; } 

D면

외부(C++) {     추상적인 학급 기초     {         무효 프린트 3i(인트 a, 인트 b, 인트 c);     }      학급 파생된 : 기초     {         인트 들판;         @disable 이것.();         덮어쓰다 무효 프린트 3i(인트 a, 인트 b, 인트 c);         최종 인트 멀티(인트 인자);     }      파생된 createInstance(인트 i);     무효 deleteInstance(레퍼런스 파생된 d); }  무효 주된() {     수입품 표준.스태디오;      자동 d1 = createInstance(5);     기입하다(d1.들판);     기입하다(d1.멀티(4));      기초 b1 = d1;     b1.프린트 3i(1, 2, 3);      deleteInstance(d1);     주장하다(d1  무효);      자동 d2 = createInstance(42);     기입하다(d2.들판);      deleteInstance(d2);     주장하다(d2  무효); } 

Better C

D 프로그래밍 언어에는 "Better C"[34]로 알려진 공식 하위 집합이 있습니다.이 서브셋은 C 이외의 런타임 라이브러리를 사용해야 하는 D 기능에 대한 접근을 금지합니다.

DMD 및 LDC의 컴파일러 플래그 "-betterC" 및 GDC의 "-fno-druntime"을 통해 활성화되는 Better C는 동일한 플래그(및 D 이외의 링크 코드)로 컴파일된 코드만 호출할 수 있지만 Better C 옵션을 사용하지 않고 컴파일된 코드는 호출할 수 있습니다.다만, C의 동작에 약간 차이가 있습니다.및 D 핸들이 단언됩니다.

Better C에 포함된 기능

  • 컴파일 시 기능의 무제한 사용(예를 들어 D의 동적 할당 기능을 컴파일 시 사용하여 D 데이터를 사전 할당할 수 있음)
  • 완전한 메타프로그래밍 기능
  • 내포된 함수, 내포된 구조, 위임자 및 람다
  • 멤버 함수, 컨스트럭터, 디스트럭터, 운용 오버로드 등
  • 풀 모듈 시스템
  • 어레이 슬라이싱 및 어레이 한계 확인
  • 레이
  • scope(표준)
  • 메모리 안전 보호
  • C++와의 인터페이스
  • COM 클래스 및 C++ 클래스
  • 아사트 실패는 C 런타임라이브러리로 전송됩니다
  • 으로 바꾸다
  • 최종 스위치
  • 끝없는 블록
  • printf 형식 검증

Better C에서 제외된 기능

  • 가비지 컬렉션
  • TypeInfo 및 ModuleInfo
  • 내장 스레드화(예:core.thread)
  • 동적 어레이(스태틱 어레이 슬라이스 사용 가능) 및 관련 어레이
  • 예외
  • 동기화된core.sync
  • 정적 모듈 컨스트럭터 또는 디스트럭터

역사

월터 브라이트는 1999년에 새로운 언어를 연구하기 시작했다.D는 2001년 12월에[1] 처음 출시되어 2007년 [35]1월에 버전 1.0에 도달했습니다.언어의 첫 번째 버전(D1)은 C++와 유사한 명령형, 객체 지향형 및 메타프로그래밍 [36]패러다임에 초점을 맞췄다.

D의 공식 런타임표준 라이브러리인 Phobos에 불만을 품은 D 커뮤니티의 일부 구성원들은 Tango라는 이름의 대체 런타임 및 표준 라이브러리를 만들었다.첫 공개 [37]Tango 발표는 D 1.0 출시 후 며칠 만에 이루어졌다.Tango는 OOP와 높은 모듈성을 수용하는 다른 프로그래밍 스타일을 채택했습니다.커뮤니티 주도의 프로젝트였기 때문에 Tango는 공식적인 표준 라이브러리보다 더 빨리 진행될 수 있도록 기부에 더 개방적이었습니다.당시 Tango와 Phobos는 서로 다른 런타임 지원 API(가비지 컬렉터, 스레드 지원 등)로 인해 호환되지 않았습니다.이로 인해 동일한 프로젝트에서 두 라이브러리를 모두 사용할 수 없게 되었습니다.두 개의 라이브러리가 널리 사용되고 있다는 것은 포보스를 사용하는 패키지와 [38]탱고를 사용하는 패키지로 인해 심각한 논쟁을 불러 일으켰다.

2007년 6월에 D2의 첫 번째 버전이 [39]출시되었습니다.D2 개발의 시작은 D1의 안정화를 예고했다.언어의 첫 번째 버전은 유지보수에 배치되어 수정 및 구현 오류 수정만 받고 있습니다.D2는 첫 번째 실험적인 Const 시스템을 시작으로 언어에 획기적인 변화를 도입했습니다.D2는 나중에 폐쇄, 순수성, 기능 및 동시 프로그래밍 패러다임 지원과 같은 수많은 다른 언어 기능을 추가했습니다.D2는 또한 표준 라이브러리에서 실행 시간을 분리함으로써 표준 라이브러리 문제를 해결했습니다.D2 Tango 포트의 완성은 2012년 [40]2월에 발표되었습니다.

2010년 6월 12일 안드레이 알렉산드레스쿠저서 D프로그래밍 언어(The D Programming Language)가 발표되면서 D2가 안정화되었습니다.D2는 오늘날에는 D라고 불리고 있습니다.

2011년 1월, D개발은 버그 트래커/패치 송신 베이스에서 GitHub로 이행했습니다.이로 인해 컴파일러, 런타임 및 표준 [41]라이브러리에 대한 기여도가 크게 증가했습니다.

2011년 12월, Andrei Alexandrescu는 D1의 첫 번째 [42]버전이 2012년 12월 31일에 중단될 것이라고 발표했습니다.최종 D1 릴리즈 D v1.076은 [43]2012년 12월 31일에 공개되었습니다.

공식 D 컴파일러 코드인 Walter Bright의 Digital Mars D 컴파일러는 원래 커스텀 라이선스로 출시되었으며 사용 가능한 소스로 인정되지만 오픈 소스 [44]정의에 부합하지 않습니다.2014년에 컴파일러 프런트 엔드는 Boost Software [3]License에 따라 오픈 소스재라이센스되었습니다.이 재라이센스 코드에서는 Symantec에서 부분적으로 개발된 백엔드는 제외되었습니다.2017년 4월 7일 Symantec이 [4][45][46][47]백엔드 재라이센스를 허가한 후 Boost 라이선스로 컴파일러 전체를 이용할 수 있게 되었습니다.2017년 6월 21일, D Language는 GCC에 [48]포함되도록 승인되었다.

실장

현재 대부분의 D 구현은 효율적인 실행을 위해 기계 코드로 직접 컴파일됩니다.

가동 가능한 컴파일러:

  • DMD – Walter Bright사의 Digital Mars D 컴파일러는 정식 D 컴파일러이며, Boost 소프트웨어 [3][4]라이선스로 오픈 소스되어 있습니다.DMD 프론트 엔드는 컴파일러 간의 호환성을 향상시키기 위해 GDC(현재의 GCC)와 LDC에서 공유됩니다.처음에 프런트엔드는 C++로 작성되었지만, 현재는 대부분의 프런트엔드가 D자체(셀프호스팅)로 작성되었습니다.백엔드 및 머신코드 옵티마이저는 Symantec 컴파일러를 기반으로 합니다.처음에는 32비트 x86만 지원했으며 64비트 amd64 및 Power 지원이 추가되었습니다.Walter Bright의 PC.이후 백엔드와 컴파일러 거의 전체가 C++에서 D로 포팅되어 완전한 셀프호스팅이 이루어졌습니다.
  • GCCGNU 컴파일러 컬렉션은 2018년 [50]10월 29일에 GDC를 GCC 9로 통합했습니다[49].Linux 및 MacOS[51] 상의 32비트 x86 상의 GCC 3.3 및 GCC 3.4에 기반한 GDC의 첫 번째 동작 버전은 2004년 3월 22일에 출시되었습니다.그 후 GDC는 프론트 엔드 및 언어 [52]사양의 업스트림 DMD 코드를 추적하면서 추가 플랫폼, 성능 향상 및 버그 수정을 지원하게 되었습니다.
  • LDC – 컴파일러 백엔드로 LLVM을 사용하는 DMD 프론트엔드에 기반한 컴파일러.첫 번째 릴리스 품질 버전은 2009년 [53]1월 9일에 공개되었습니다.버전 2.[54]0을 지원합니다.

완구 및 개념 증명 컴파일러:

  • D 컴파일러 for.NET – D 프로그래밍 언어 2.0 [55][56]컴파일러용 백엔드.코드를 기계 코드가 아닌 Common Intermediate Language(CIL; 공통 중간 언어) 바이트 코드로 컴파일합니다.CIL은 Common Language Infrastructure(CLI) 가상 머신을 통해 실행할 수 있습니다.이 프로젝트는 몇 년 동안 업데이트되지 않았으며 작성자는 프로젝트가 더 이상 활성화되지 않았다고 지적했습니다.
  • SDCStudf D 컴파일러는 커스텀 프론트 엔드와 LLVM을 컴파일러 백엔드로 사용합니다.D로 쓰여져 있으며, D의 컴파일 타임 기능을 우아하게 처리하기 위해 심볼 해상도를 처리하는 스케줄러를 사용합니다.이 컴파일러는 현재 언어의 [57][58]일부만 지원합니다.

위의 컴파일러와 툴체인을 사용하여 D 프로그램컴파일하여 x86, amd64, AArch64, PowerPC, MIPS64, DEC Alpha, Motorola m68k, Sparc, s390, Web Assembly 등의 다양한 아키텍처를 대상으로 할 수 있습니다.지원되는 주요 운영 체제는 WindowsLinux이지만 다양한 컴파일러는 Mac OS X, FreeBSD, NetBSD, AIX, Solaris/OpenSolaris Android를 호스트 또는 타겟으로 또는 둘 다 지원합니다.Web Assembly 타깃(LDC 및 LLVM을 통해 지원됨)은 최신 웹 브라우저(Google Chrome, Mozilla Firefox, Microsoft Edge, Apple Safari) 또는 전용 Wasm 가상 머신과 같은 모든 Web Assembly 환경에서 작동할 수 있습니다.

개발 도구

언어의 구문 강조 표시 및 부분 코드 완성을 지원하는 에디터 및 통합 개발 환경(IDE)에는 SlikEdit,[60] Emacs, vim, SciTE, Smultron, [59]Zeus 및 Geany 등이 있습니다.

  • Dexed(구 Coedit),[61] 객체 파스칼로 작성된 D 포커스 그래픽 IDE
  • Mono-D는[62] 주로 C [63]Sharp로 작성된 MonoDevelope/Xamarin Studio 기반의 풍부한 크로스 플랫폼 D 포커스 그래픽 IDE입니다.
  • D용 Eclipse 플러그인에는[64] DDT 및 Descent(데드 프로젝트)[65]포함됩니다.
  • Visual [66][67]Studio 통합은 VisualD에서 제공합니다.
  • Dlang-Vscode 또는 Code-D와 같은[68] 확장 기능과 Visual [69]Studio 코드 통합.
  • 번들은 TextMate에서 사용할 수 있으며 코드는 다음과 같습니다.블록 IDE에는 언어에 대한 부분 지원이 포함됩니다.다만, 코드 완성이나 리팩터링등표준 IDE 기능은 아직 사용할 수 없습니다.단, 코드:블록(D가 C와 유사하기 때문에).
  • Xcode 3 플러그인 "D for Xcode"는 D 기반 프로젝트와 [70]개발을 가능하게 합니다.
  • KDevelop(및 텍스트 에디터 백엔드, Kate) 자동 완성 플러그인을 사용할 [71]수 있습니다.

윈도우즈용 오픈 소스 D IDE가 있으며, 일부는 포세이돈,[72] D-IDE [73]및 Entice [74]Designer와 같이 D로 작성됩니다.

D 어플리케이션은 GDB나 WinDbg 등의 임의의 C/C++ 디버거를 사용하여 디버깅할 수 있습니다.다만, 다양한 D 고유의 언어 기능에 대한 지원은 극히 한정되어 있습니다.Windows 에서는, 디버깅 정보를 cv2pdb 를 사용해 변환한 후, DDBg 또는 Microsoft 디버깅툴(WinDBG 와 Visual Studio)을 사용해 D프로그램을 디버깅 할 수 있습니다.제로비Linux용 UGS 디버거는 D 언어를 실험적으로 지원합니다.DDBg는 다양한 IDE 또는 명령줄에서 사용할 수 있습니다.ZeroBUGS에는 독자적인 Graphical User Interface(GUI; 그래피컬사용자 인터페이스)가 있습니다.

Dust Mite는 D 소스 코드를 최소화하는 강력한 도구이며 컴파일러 또는 테스트 [75]문제를 찾을 때 유용합니다.

dub는 D 어플리케이션과 라이브러리의 일반적인 패키지 및 빌드 매니저이며 IDE [76]지원에 통합되어 있는 경우가 많습니다.

예 1

이 예제 프로그램은 명령줄 인수를 인쇄합니다.main함수는 D 프로그램의 진입점입니다.args는 명령줄 인수를 나타내는 문자열 배열입니다.astring인 D는 다음과 같은 문자의 배열입니다.immutable(char)[].

수입품 표준.스태디오: 기입하다;  무효 주된(스트링[] args) {     앞지르다 (i, arg; args)         기입하다("s[%d] = '%s'", i, arg); } 

foreach문은 모든 컬렉션에 대해 반복할 수 있습니다.이 경우 일련의 인덱스를 생성합니다.i및 값(arg어레이에서 )를 선택합니다.args. 인덱스i그리고 가치arg배열의 종류로부터 그 종류를 추론하다.args.

예 2

다음은 짧은 프로그램에서의 몇 가지 D기능과 D설계 트레이드오프를 보여줍니다.이름이 붙은 텍스트파일의 행에 걸쳐 반복됩니다.words.txt각 행에 다른 단어가 포함되어 있으며 다른 단어의 애너그램인 모든 단어가 인쇄됩니다.

수입품 표준.스태디오, 표준.알고리즘., 표준.범위, 표준.스트링;  무효 주된() {     스트링[] [스트링] 시그니처 2워드;      앞지르다 (dchar[] w; 줄들(파일("words.txt"))) {         w = w.찰칵찰칵 소리가 나다().낮추다();         불변의 서명 = w.이중.종류().풀어주다().아이듀프;         시그니처 2워드[서명] ~= w.아이듀프;     }      앞지르다 (단어; 시그니처 2워드) {         한다면 (단어.길이 > 1) {             기입하다(단어.합류하다(" "));         }     } } 
  1. signature2words는 dstring(32비트/char) 키를 dstring 배열에 매핑하는 삽입 어소시에이션어레이입니다와 비슷하다.defaultdict(list)Python에서.
  2. lines(File())줄 바꿈과 함께 줄 바꿈이 느리다.그런 다음 복사해야 합니다.idup관련 배열 값에 사용할 문자열을 얻습니다.idup어레이의 속성은 어레이의 불변 복제를 반환합니다.이거는 다음부터 필요합니다.dstring타입은 사실immutable(dchar)[]). 내장 어소시에이션 어레이에는 불변의 키가 필요합니다.
  3. ~=연산자는 연관된 다이내믹 배열 값에 새로운 dstring을 추가합니다.
  4. toLower,join그리고.chomp는 메서드 구문을 사용하여 를 사용할 수 있는 문자열 함수입니다.이러한 함수의 이름은 종종 Python 문자열 메서드와 유사합니다.toLower문자열을 소문자로 변환합니다.join(" ")는 단일 공간을 구분자로 사용하여 문자열 배열을 단일 문자열에 결합합니다.chomp는 새로운 행이 존재하는 경우 문자열 끝에서 삭제합니다.w.dup.sort().release().idup가독성은 높지만 동등합니다.release(sort(w.dup)).idup예를들면.이 기능은 Uniform Function Call Syntax(UFCS; Uniform Function 콜 구문)라고 불리며 메서드와 같은 기능을 가진 내장 패키지 또는 서드파티 패키지 유형을 확장할 수 있습니다.이와 같은 코드 작성 스타일은 종종 파이프라인(특히 사용되는 오브젝트가 반복기/범위와 같이 느리게 계산되는 경우) 또는 Fluent 인터페이스로 참조됩니다.
  5. sort는 배열을 정렬하는 std.disc 함수로, 서로의 애너그램인 단어에 대해 하나의 시그니처를 작성합니다.release()수익률에 관한 방법sort()코드를 하나의 표현으로 유지하는데 편리합니다.
  6. 두 번째foreach연관 배열의 값을 반복한다, 그것은 유추할 수 있다words.
  7. signature는 불변의 변수에 할당되어 있으며, 그 유형은 유추정됩니다.
  8. UTF-32 dchar[]일반 UTF-8 대신 사용됩니다. char[]그렇지않으면sort()분류를 거부합니다.UTF-8만을 사용하여 이 프로그램을 보다 효율적으로 작성할 수 있는 방법이 있습니다.

사용하다

프로젝트에 D 프로그래밍 언어를 사용하는 주목할 만한 조직으로는 Facebook,[77] eBay [78][79]Netflix있습니다.

D는 AAA 게임,[80] 언어 통역, 가상 머신,[81][82] 운영체제 커널,[83] GPU 프로그래밍,[84] 개발,[85][86] 수치 분석,[87] GUI 애플리케이션,[88][89] 승객 정보 시스템,[90] 기계 학습,[91] 텍스트 처리, 웹 및 애플리케이션 서버 및 연구에 성공적으로 사용되고 있습니다.

「 」를 참조해 주세요.

레퍼런스

  1. ^ a b "D Change Log to Nov 7 2005". D Programming Language 1.0. Digital Mars. Retrieved 1 December 2011.
  2. ^ https://dlang.org/changelog/2.099.1.html 를 참조해 주세요.
  3. ^ a b c "dmd front end now switched to Boost license". Retrieved 9 September 2014.
  4. ^ a b c "dmd Backend converted to Boost License". 7 April 2017. Retrieved 9 April 2017.
  5. ^ "D 2.0 FAQ". Retrieved 11 August 2015.
  6. ^ ""D Programming Language - Fileinfo.com"". Retrieved 15 November 2020.[필요한 건]
  7. ^ ""D Programming Language - dlang.org"". Retrieved 15 November 2020.[필요한 건]
  8. ^ Alexandrescu, Andrei (2010). The D programming language (First ed.). Upper Saddle River, New Jersey: Addison-Wesley. p. 314. ISBN 978-0321635365.
  9. ^ "Building assert() in Swift, Part 2: __FILE__ and __LINE__". Retrieved 25 September 2014.
  10. ^ "Programming in D for C++ Programmers - D Programming Language". dlang.org. Retrieved 5 April 2022.
  11. ^ "Functional programming - Dlang Tour". tour.dlang.org. Retrieved 5 April 2022.
  12. ^ a b "Expressions". Digital Mars. Retrieved 27 December 2012.
  13. ^ "On: Ruminations on D: An Interview with Walter Bright". Hacker News. 30 August 2016. "그것은 가깝고, 우리는 남은 격차를 줄이기 위해 노력하고 있습니다."
  14. ^ "Memory-Safe-D-Spec". D Language Foundation.
  15. ^ GhostarchiveWayback Machine에서 아카이브:
  16. ^ "D Strings vs C++ Strings". Digital Mars. 2012.
  17. ^ "D Complex Types and C++ std::complex". Digital Mars. 2012. Archived from the original on 13 January 2008. Retrieved 4 November 2021.
  18. ^ "std.gc". D Programming Language 1.0. Digital Mars. Retrieved 6 July 2010.
  19. ^ "Memory Management". D Programming Language 2.0. Digital Mars. Retrieved 17 February 2012.
  20. ^ a b "Go Your Own Way (Part One: The Stack)". The D Blog. 7 July 2017. Retrieved 7 May 2020.
  21. ^ "Attributes - D Programming Language". dlang.org. Retrieved 7 May 2020.
  22. ^ "std.experimental.allocator - D Programming Language". dlang.org. Retrieved 7 May 2020.
  23. ^ Bartosz Milewski. "SafeD – D Programming Language". Retrieved 17 July 2014.
  24. ^ Steven Schveighoffer (28 September 2016). "How to Write @trusted Code in D". Retrieved 4 January 2018.
  25. ^ "Scoped Pointers". GitHub. 3 April 2020.
  26. ^ "Sealed References".
  27. ^ "D Language Specification: Functions - Return Scope Parameters".
  28. ^ "Ownership and Borrowing in D". 15 July 2019.
  29. ^ "D Language Specification: Functions - Function Parameter Storage Classes".
  30. ^ "PyD". GitHub. 7 May 2020. Retrieved 7 May 2020.
  31. ^ Parker, Mike. "Package derelict-lua on DUB". DUB Package Registry. Retrieved 7 May 2020.
  32. ^ Parker, Mike. "Package bindbc-lua on DUB". DUB Package Registry. Retrieved 7 May 2020.
  33. ^ "Interfacing to C++".
  34. ^ "Better C".
  35. ^ "D Change Log". D Programming Language 1.0. Digital Mars. Retrieved 11 January 2012.
  36. ^ "Intro". D Programming Language 1.0. Digital Mars. Retrieved 1 December 2011.
  37. ^ "Announcing a new library". Retrieved 15 February 2012.
  38. ^ "Wiki4D: Standard Lib". Retrieved 6 July 2010.
  39. ^ "Change Log – D Programming Language". D Programming Language 2.0. D Language Foundation. Retrieved 22 November 2020.
  40. ^ "Tango for D2: All user modules ported". Retrieved 16 February 2012.
  41. ^ Walter Bright. "Re: GitHub or dsource?". Retrieved 15 February 2012.
  42. ^ Andrei Alexandrescu. "D1 to be discontinued on December 31, 2012". Retrieved 31 January 2014.
  43. ^ "D Change Log". D Programming Language 1.0. Digital Mars. Retrieved 31 January 2014.
  44. ^ "backendlicense.txt". DMD source code. GitHub. Archived from the original on 22 October 2016. Retrieved 5 March 2012.
  45. ^ "Reddit comment by Walter Bright". 5 March 2009. Retrieved 9 September 2014.
  46. ^ linux-magazin.de의 D-Compiler-unter-freier-Lizenz(2017년, 독일어)
  47. ^ github.com의 Walter Bright에서 백엔드를 Boost License #6680으로 바꿉니다.
  48. ^ D 언어를 GCC에 포함시킬 수 있습니다.
  49. ^ "GDC".
  50. ^ "GCC 9 Release Series — Changes, New Features, and Fixes - GNU Project - Free Software Foundation (FSF)". gcc.gnu.org. Retrieved 7 May 2020.
  51. ^ "Another front end for GCC". forum.dlang.org. Retrieved 7 May 2020.
  52. ^ "GCC 9 Release Series Changes, New Features, and Fixes".
  53. ^ "LLVM D compiler project on GitHub". GitHub. Retrieved 19 August 2016.
  54. ^ "BuildInstructionsPhobosDruntimeTrunk – ldc – D Programming Language – Trac". Retrieved 11 August 2015.
  55. ^ "D .NET project on CodePlex". Retrieved 3 July 2010.
  56. ^ Jonathan Allen (15 May 2009). "Source for the D.NET Compiler is Now Available". InfoQ. Retrieved 6 July 2010.
  57. ^ GhostarchiveWayback Machine에서 아카이브:
  58. ^ "deadalnix/SDC". GitHub. Retrieved 8 January 2014.
  59. ^ "Wiki4D: EditorSupport/ZeusForWindows". Retrieved 11 August 2015.
  60. ^ "Wiki4D: Editor Support". Retrieved 3 July 2010.
  61. ^ "Basile.B / dexed". GitLab. Retrieved 29 April 2020.
  62. ^ "Mono-D - D Wiki". wiki.dlang.org. Retrieved 30 April 2020.
  63. ^ "Mono-D – D Support for MonoDevelop". Retrieved 11 August 2015.
  64. ^ "Google Project Hosting". Retrieved 11 August 2015.
  65. ^ "descent". Retrieved 11 August 2015.
  66. ^ "Visual D - D Programming Language". Retrieved 11 August 2015.
  67. ^ Schuetze, Rainer (17 April 2020). "rainers/visuald: Visual D - Visual Studio extension for the D programming language". github.com. Retrieved 30 April 2020.
  68. ^ "dlang-vscode". GitHub. Retrieved 21 December 2016.
  69. ^ "code-d". GitHub. Retrieved 21 December 2016.
  70. ^ "Michel Fortin – D for Xcode". Retrieved 11 August 2015.
  71. ^ "Dav1dde/lumen". GitHub. Retrieved 11 August 2015.
  72. ^ "poseidon". Retrieved 11 August 2015.
  73. ^ "Mono-D – D Support for MonoDevelop". Retrieved 11 August 2015.
  74. ^ "Entice Designer – Dprogramming.com – The D programming language". Retrieved 11 August 2015.
  75. ^ "What is DustMite?". GitHub. Retrieved 29 April 2020.
  76. ^ "dlang/dub: Package and build management system for D". GitHub. Retrieved 29 April 2020.
  77. ^ "Under the Hood: warp, a fast C and C++ preprocessor". 28 March 2014. Retrieved 4 January 2018.
  78. ^ "Faster Command Line Tools in D". 24 May 2017. Retrieved 4 January 2018.
  79. ^ "Introducing Vectorflow". 2 August 2017. Retrieved 4 January 2018.
  80. ^ "Quantum Break: AAA Gaming With Some D Code". Retrieved 4 January 2018.
  81. ^ "Higgs JavaScript Virtual Machine". GitHub. Retrieved 4 January 2018.
  82. ^ "A D implementation of the ECMA 262 (Javascript) programming language". GitHub. Retrieved 4 January 2018.
  83. ^ "Project Highlight: The PowerNex Kernel". 24 June 2016. Retrieved 4 January 2018.
  84. ^ "DCompute: Running D on the GPU". 30 October 2017. Retrieved 4 January 2018.
  85. ^ "vibe.d - a high-performance asynchronous I/O, concurrency and web application toolkit written in D". Retrieved 4 January 2018.
  86. ^ "Project Highlight: Diamond MVC Framework". 20 November 2017. Retrieved 4 January 2018.
  87. ^ "Numeric age for D: Mir GLAS is faster than OpenBLAS and Eigen". Retrieved 4 January 2018.
  88. ^ "On Tilix and D: An Interview with Gerald Nunn". 11 August 2017. Retrieved 4 January 2018.
  89. ^ "Project Highlight: DlangUI". 7 October 2016. Retrieved 4 January 2018.
  90. ^ "Project Highlight: Funkwerk". Retrieved 4 January 2018.
  91. ^ "Netflix/vectorflow". GitHub.com. Netflix, Inc. 5 May 2020. Retrieved 7 May 2020.

추가 정보

외부 링크