D語言(Dlang)簡介

fmms 12年前發布 | 53K 次閱讀 D語言 C/C++開發


D語言(Dlang)是由Digital Mars公司開發的編程語言,起因是為了改進C++。它與C二進制兼容(不完全),可編譯為本地碼,有GC也可手動管理內存,語法上借鑒多種語言,模板則 在C++的基礎上做了相當大的擴充。D 語言既有 C 語言的強大威力,又有 Python 和 Ruby 的開發效率。它是一種集垃圾回收、手工內存操作、契約式設計、高級模板技術、內嵌匯編、內置單元測試、Mixin 風格多繼承、類 Java 包管理機制、內置同步機制、內建基本運行時信息的系統級編程語言。

D語言是一種通用的系統和應用編程語言。它是比 C++ 更高級的語言,同時還保持了生成高效代碼以及直接訪問操作系統API和硬件的能力。D 很適合于編寫從中等規模到那些由團隊合作完成、數百萬行代碼規模的各種程序。D 易于學習,為編程者提供了很多便利,并且適用各種野心勃勃的編譯器優化技術。

D 不是腳本語言,也不是一種解釋型語言。它不需要虛擬機、宗教、或者高于一切的哲學。它是給實際的編程者使用的實際的語言,它幫助編程者快速、可靠的完成易于維護、易于理解的代碼。

D 是數十年來實現多種語言編譯器的經驗的積累,是用那些語言構造大型工程的嘗試的積累。D 從那些語言(主要是 C++ )那里獲得了靈感,并使用經驗和現實世界中的實用性來馴服它。

為什么是 D ?

確實,為什么?有誰需要另一種編程語言?

自從 C 語言被發明以來,軟件工業走過了一段很長的路。許多新的概念被加入了 C++ 中,但同時維護了同 C 的向后兼容性,包括兼容了原始設計中的所有的弱點。有很多修正這些弱點的嘗試,但是兼容性是最大的困擾。同時,C 和 C++ 都在不斷引入新的特性。這些新特性必須被小心的加入到現有的結構中,以免重寫舊的代碼。最終的結果十分復雜—— C 標準將近 500 頁,C++ 標準大概有 750 頁!C++ 實現起來既困難又代價高昂,造成的結果就是各種實現之間都有差別,因此很難寫出完全可以移植的 C++ 代碼。

C++ 程序員傾向于使用語言中的孤島來編程,也就是說,他們傾向于十分精通語言中的某個特性而避免使用其他特性。盡管代碼通常在編譯器之間是可移植的,但在程序 員之間移植就不那么容易了。C++ 的一個長處是它支持很多根本上不同的編程風格——但從長遠來看,互相重復和互相沖突的風格會給開發帶來妨礙。

C++ 在標準庫而不是語言核心中實現了可改變大小的數組和字符串拼接等。不在語言核心中實現這些功能造成了幾種不太理想的結果。

是否能把 C++ 的能力釋放、重新設計并重鑄到一門簡單、正交并實用的語言中呢? 這種語言是否能做到易于正確實現,并使編譯器有能力有效地生成高度優化的代碼呢?

現代編譯器技術已經取得了很大的進步,有些原來用作原始編譯技術的補充的語言特性已經可以被忽 略了(一個這樣的例子是 C 語言中的‘register’關鍵字,一個更為微妙的例子是 C 中的宏預處理程序)。我們可以依賴現代編譯器的優化技術而不是使用語言特性(如同原始的編譯器所做的那樣)來獲得可以接受的代碼質量。

下面是一段D語言的代碼示例。

#!/usr/bin/dmd -run/* sh style script syntax is supported */ /* Hello World in D
   To compile:
     dmd hello.d
   or to optimize:
     dmd -O -inline -release hello.d
*/ import std.stdio;void main(char[][] args)
{
    writefln("Hello World, Reloaded");

    // auto type inference and built-in foreach    foreach (argc, argv; args)
    {
        // Object Oriented Programming        CmdLin cl = new CmdLin(argc, argv);
        // Improved typesafe printf        writefln(cl.argnum, cl.suffix, " arg: %s", cl.argv);
        // Automatic or explicit memory management        delete cl;
    }

    // Nested structs and classes    struct specs
    {
        // all members automatically initialized        int count, allocated;
    }

    // Nested functions can refer to outer    // variables like args    specs argspecs()
    {
        specs* s = new specs;
        // no need for '->'        s.count = args.length;         // get length of array with .length        s.allocated = typeof(args).sizeof; // built-in native type properties        foreach (argv; args)
            s.allocated += argv.length * typeof(argv[0]).sizeof;
        return *s;
    }

    // built-in string and common string operations    writefln("argc = %d, " ~ "allocated = %d",
    argspecs().count, argspecs().allocated);
}class CmdLin
{
    private int _argc;
    private char[] _argv;public:
    this(int argc, char[] argv)  // constructor    {
        _argc = argc;
        _argv = argv;
    }

    int argnum()
    {
        return _argc + 1;
    }

    char[] argv()
    {
        return _argv;
    }

    char[] suffix()
    {
        char[] suffix = "th";
        switch (_argc)
        {
          case 0:
            suffix = "st";
            break;
          case 1:
            suffix = "nd";
            break;
          case 2:
            suffix = "rd";
            break;
          default:
        break;
        }
        return suffix;
    }
}

項目主頁:http://www.baiduhome.net/lib/view/home/1326978342530

 本文由用戶 fmms 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!