色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

D語言相對C/C++的衍生功能和優勢

DPVg_AI_era ? 來源:lq ? 2019-07-07 07:22 ? 次閱讀

對于開發者而言,開發語言就是工具,中途換工具一般需要付出的成本。本文是一篇開發者自述,講述了自己是如何從C/C++改投D語言門下,并介紹了D語言相對C/C++的衍生功能和優勢。

作為開發人員,換開發語言其實是一件需要很高成本的事,本文主要講講我是怎么從C語言轉投D語言的。

其實我的經歷和許多系統程序員的故事差不多。曾經有一段時間,C是大多數程序員的首選語言。有一天,我意識到我的大多數C程序都在重新實現C++中的東西:動態數組、更好的字符串、多態類等等。所以我嘗試使用C++,起初我很喜歡它。RAII、類、泛型等新的組件和概念讓編程再次變得有趣起來。

我曾經想象過,如果我把所有關于C ++的書籍都看一遍,并掌握了模板元編程之類的東西,我說不定會成為系統編程的全能之神,我寫的代碼會讓人大吃一驚。但事后看來,學習也可能最終會產生更多相反的效果: 我寫出的代碼實際上變得更糟。

總之全能之神當不上了,我很傷心。

我記得我讀過Scott Meyer著名的《Effective C ++》,這本書其實更多講的是指出低效率的C ++編程的問題,我發現自己寫的大多數C++代碼都對上了號。讓我們面對現實吧:C可能很難用,但它確實足夠“優雅”,而提到C++,你很難跟“優雅”搭上邊。

很多前C ++程序員最終都用回了C。就我而言,我發現了D語言。其實D也不完美,但是我使用它因為它讓我感覺更像是C++應該有的樣子(C+=1)。比如以下面這個簡單的C程序為例(一加一等于幾?):

#includeint main(){ printf("1 + 1 = %d! ", 1 + 1); return 0;}

如果使用C++標準庫,代碼是這樣的:

#include int main(){ std::cout << "1 + 1 = " << 1 + 1 << "!" << std::endl; return 0;}

如果使用D語言,代碼是這樣的:

import std.stdio;void main(){ writef("1 + 1 = %d! ", 1 + 1);}

這個例子雖然淺顯,但它體現出了C++和D之間背后理念的一些區別。

這篇關于C ++成員函數指針的文章也是對D的起源的一個很好的解釋。如果你酷愛編程,這篇文章是一個很好的解讀, 但我的解讀是:C++成員函數指針應該是感覺像是一個低級功能(就像普通函數指針一樣),但其實現的復雜性和多樣性說明它們真的很“高級”。

這些指針的實現過程很復雜,因為關于它們能做什么/不能做什么的規則是很微妙的。作者解釋了幾個C ++編譯器的實現,包括優雅而簡單的Digital Mars C ++實現,即DMC。DMC編譯器是由Walter Bright編寫的,他是“D語言”的發明者。

D具有C ++的類和模板以及其他核心功能,但設計者花費了大量時間思考C ++規范,以及如何讓設計和編程變得更簡單。Walter曾經說過,他在部署C ++模板的痛苦經歷,讓他考慮過根本不把該功能納入D,后來他意識到,這個過程本來不需要那么復雜。

下面對D語言的功能和特點進行一番大概的介紹,其實可以把D視作一個“改進版”的C語言。介紹中時刻少不了和C/C++的對比。

-betterC開關

D編譯器支持-betterC開關,該開關可以啟用/禁用D運行時以及依賴于它的所有高級功能。上面的C代碼可以直接轉換為betterC:

import core.stdc.stdio;extern(C):int main(){ printf("1 + 1 = %d! ", 1 + 1); return 0;}

$ dmd -betterC example.d$ ./example1 + 1 = 2!

生成的二進制文件看起來很像等效的C二進制文件。事實上,如果你在betterC中重寫了一個C庫,仍然可以鏈接到已經對C版本編譯的代碼,無需修改就可立即使用。

實際上,如果只是要在D語言中編寫類似C的代碼,并不需要-betterC開關。只有在沒有D Runtime的特殊情況下才需要使用。

靜態assert()

這個功能允許開發者在編譯時驗證一些假設。

static assert(kNumInducers<16);

系統代碼通常對對齊或結構大小或其他事物做出假設。使用靜態assert不僅可以記錄這些假設,而且如果有人通過添加struct成員或其他東西來破壞假設,則會觸發編譯錯誤。

Slices

典型的C代碼中存在大量的“指針/長度”參數對,一個常見bug就是二者的不同步。對于由指針和長度定義的一系列內存,Slice是一種簡單且超級有用的抽象表示。現在不必使用這樣的代碼:

buffer_p += offset;buffer_len -= offset; // Got to update both

而可以用下邊這種更不容易出bug的代碼:

buffer = buffer[offset..$];

Slice 其實就是具備優秀語法功能的指針/長度對。

編譯時間函數估計 (CTFE)

許多函數都可以用編譯時間來評估。

long factorial(int n) pure{ assert (n >= 0 && n <= 20); long ret = 1; foreach (j; 2..n+1) ret *= j; return ret;}// Statically allocated array// Size is calculated at compile timePermutation[factorial(kNumThings)]permutation_table;

scope Guards

函數的一部分中的代碼通常會在后續部分帶上一段清理代碼。一個常見的錯誤來源是未能正確匹配該代碼,(尤其是涉及多個控制流路徑時)。D的scope guards設定使得這個問題變得不再困難:

p = malloc(128);// free() will be called when thecurrent scope exitsscope (exit) free(p);// Put whatever if statements, or loops,or early returns you like here

你甚至可以在作用域中使用多個scope,或嵌套使用scope。清理代碼將在需要時以正確的順序被調用。

D語言還利用結構析構函數支持RAII。

常量和不可變量

有一個流行的說法是,C和C++中的const對編譯器優化很有用。不過D的作者表示,每當他想到一個新的基于const的C++優化時,最終都發現它在實際代碼中并不起作用。所以他對D的const語義做了一些修改,并添加了不可變量。可以在D const FAQ中閱讀更多內容。

函數純度

可以實施函數純度功能。我之前寫過關于pure關鍵字的一些好處。

@Safe

SafeD是D的一個部分,禁止使用指針類型轉換和內聯匯編等高風險語言功能。標記為@safe的代碼由編譯器強制執行,不使用這些功能,因此高風險代碼可以僅限需要這些功能的應用程序的一小部分。

元編程

如前所述,元編程在一些C ++程序員中名聲不好。但是D中的元編程具備一些沒那么有趣的優點,程序員一般傾向于只在必要時才用,而不是一個有趣的謎題。

需要將枚舉類型的名稱作為數組?容易!

enum State{ stopped, starting, running, stopping,}string[] state_names =[__traits(allMembers, State)];

沒有預處理器

好吧,這其實是一個“非功能”,但D沒有相當于C的預處理器的功能。所有理智的用例都被替換為本機語言功能,如清單常量和模板。這包括適當的模塊支持,這意味著D可以擺脫舊#include黑客的限制。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • C語言
    +關注

    關注

    180

    文章

    7605

    瀏覽量

    137027
  • 編程
    +關注

    關注

    88

    文章

    3621

    瀏覽量

    93785
  • C++
    C++
    +關注

    關注

    22

    文章

    2110

    瀏覽量

    73689

原文標題:開發者自述:我為什么從C語言轉投了D語言?

文章出處:【微信號:AI_era,微信公眾號:新智元】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    AKI跨語言調用庫神助攻C/C++代碼遷移至HarmonyOS NEXT

    產品創新與功能迭代,而非技術遷移的細節問題,大幅提升開發效率。 據悉,在涉及C/C++/ETS跨越語言調用的鴻蒙化應用中,有超過80%的項目都在使用AKI,如某知名購物應用,使用后減少
    發表于 01-02 17:08

    同樣是函數,在CC++中有什么區別

    同樣是函數,在 CC++ 中有什么區別? 第一個返回值。 C語言的函數可以不寫返回值類型,編譯器會默認為返回 int。 但是 C++
    的頭像 發表于 11-29 10:25 ?345次閱讀

    C語言C++中結構體的區別

    同樣是結構體,看看在C語言C++中有什么區別?
    的頭像 發表于 10-30 15:11 ?247次閱讀

    C7000優化C/C++編譯器

    電子發燒友網站提供《C7000優化C/C++編譯器.pdf》資料免費下載
    發表于 10-30 09:45 ?0次下載
    <b class='flag-5'>C</b>7000優化<b class='flag-5'>C</b>/<b class='flag-5'>C++</b>編譯器

    C語言與Java語言的對比

    C語言和Java語言都是當前編程領域中的重要成員,它們各自具有獨特的優勢和特點,適用于不同的應用場景。以下將從語法特性、內存管理、跨平臺性、性能、應用領域等多個方面對
    的頭像 發表于 10-29 17:31 ?364次閱讀

    C++語言基礎知識

    電子發燒友網站提供《C++語言基礎知識.pdf》資料免費下載
    發表于 07-19 10:58 ?7次下載

    C++中實現類似instanceof的方法

    函數,可實際上C++中沒有。但是別著急,其實C++中有兩種簡單的方法可以實現類似Java中的instanceof的功能。 在 C++ 中,確定對象的類型是編程中實際需求,使開發人員
    的頭像 發表于 07-18 10:16 ?607次閱讀
    <b class='flag-5'>C++</b>中實現類似instanceof的方法

    SEGGER編譯器優化和安全技術介紹 支持最新CC++語言

    SEGGER編譯器是專門為ARM和RISC-V微控制器設計的優化C/C++編譯器。它建立在強大的Clang前端上,支持最新的CC++語言
    的頭像 發表于 06-04 15:31 ?1485次閱讀
    SEGGER編譯器優化和安全技術介紹 支持最新<b class='flag-5'>C</b>和<b class='flag-5'>C++</b><b class='flag-5'>語言</b>

    C/C++代碼動態測試工具VectorCAST插樁功能演示#代碼動態測試 #C++

    C++代碼
    北匯信息POLELINK
    發布于 :2024年04月18日 11:57:45

    鴻蒙OS開發實例:【Native C++

    使用DevEco Studio創建一個Native C++應用。應用采用Native C++模板,實現使用NAPI調用C標準庫的功能。使用C
    的頭像 發表于 04-14 11:43 ?2667次閱讀
    鴻蒙OS開發實例:【Native <b class='flag-5'>C++</b>】

    為什么很少用C++開發單片機

    C語言是面向過程的語言C++是面向對象的編程語言。結合本文來說,面向過程相比面向對象的編程,生成代碼量(bin文件)更小,運行效率更高。
    發表于 03-25 14:26 ?1020次閱讀
    為什么很少用<b class='flag-5'>C++</b>開發單片機

    C語言#define的應用

    C/C++ 編程語言中,當程序被編譯時,被發送到編譯器,編譯器將程序轉換為機器語言,然后完成編譯并執行該程序。預處理器也稱為宏預處理器。
    發表于 03-06 11:29 ?389次閱讀
    <b class='flag-5'>C</b><b class='flag-5'>語言</b>#define的應用

    c語言,c++,java,python區別

    操作系統、嵌入式系統等對性能要求較高的場景。C語言的語法相對簡單,學習曲線較平緩,也是學習其他高級語言的入門語言
    的頭像 發表于 02-05 14:11 ?2443次閱讀

    vb語言c++語言的區別

    VB語言C++語言是兩種不同的編程語言,雖然它們都屬于高級編程語言,但在設計和用途上有很多區別。下面將詳細比較VB
    的頭像 發表于 02-01 10:20 ?2373次閱讀

    C++簡史:C++是如何開始的

    的 MISRA C++:2023 博客系列的第二部分。 在這篇博客中,我們將深入探討 C++ 的歷史、編程語言多年來的發展歷程以及它的下一步發展方向。
    的頭像 發表于 01-11 09:00 ?618次閱讀
    <b class='flag-5'>C++</b>簡史:<b class='flag-5'>C++</b>是如何開始的
    主站蜘蛛池模板: 黄得让人湿的片段| 日本一卡2卡3卡四卡精品网站| 少妇第一次交换| 国产精品久久一区二区三区蜜桃| 亚洲国产AV精品卡一卡二| 久久精品一区二区影院| 92看看福利午夜影院| 人妻少妇久久久久久97人妻| 国产国产成年在线视频区| 亚洲乱码一区二区三区香蕉| 蜜臀AV精品久久无码99| 福利社影院| 在线观看视频国产| 日本三区四区免费高清不卡| 国产午夜精品一区二区理论影院| 中字幕久久久人妻熟女天美传媒| 日本 稀土矿| 精品久久久久久无码人妻国产馆 | 清晨紧湿爱运动h高h| 国产精品国产三级国产专区53| 亚洲午夜久久久精品电影院| 暖暖 免费 高清 日本视频5| 国产精品亚洲一区二区三区久久| 2021国产精品| 亚洲 制服 欧美 中文字幕| 男人插曲女人下生免费大全| 国产欧美一区二区精品久久久| 99爱视频在线观看| 亚洲精品第一综合99久久| 欧美性appstin孕妇| 紧缚束缚调教丨vk| 出租屋自拍贵在真实15P| 伊人影院中文字幕| 我的美女奴隶| 女人高潮久久久叫人喷水 | 久久re视频这里精品青| 成人影院午夜久久影院| 在线A亚洲老鸭窝天堂AV高清| 帅哥操帅哥| 欧美日本高清动作片www网站| 黄色一级毛片免费|