91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

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

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

3天內(nèi)不再提示

D語言相對C/C++的衍生功能和優(yōu)勢

DPVg_AI_era ? 來源:lq ? 2019-07-07 07:22 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

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

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

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

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

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

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

很多前C ++程序員最終都用回了C。就我而言,我發(fā)現(xiàn)了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);}

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

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

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

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

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

-betterC開關

D編譯器支持-betterC開關,該開關可以啟用/禁用D運行時以及依賴于它的所有高級功能。上面的C代碼可以直接轉(zhuǎn)換為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庫,仍然可以鏈接到已經(jīng)對C版本編譯的代碼,無需修改就可立即使用。

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

靜態(tài)assert()

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

static assert(kNumInducers<16);

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

Slices

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

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

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

buffer = buffer[offset..$];

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

編譯時間函數(shù)估計 (CTFE)

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

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

函數(shù)的一部分中的代碼通常會在后續(xù)部分帶上一段清理代碼。一個常見的錯誤來源是未能正確匹配該代碼,(尤其是涉及多個控制流路徑時)。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。清理代碼將在需要時以正確的順序被調(diào)用。

D語言還利用結構析構函數(shù)支持RAII。

常量和不可變量

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

函數(shù)純度

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

@Safe

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

元編程

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

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

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

沒有預處理器

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

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

    關注

    183

    文章

    7644

    瀏覽量

    145636
  • 編程
    +關注

    關注

    90

    文章

    3716

    瀏覽量

    97198
  • C++
    C++
    +關注

    關注

    22

    文章

    2124

    瀏覽量

    77138

原文標題:開發(fā)者自述:我為什么從C語言轉(zhuǎn)投了D語言?

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

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    C語言主要特點

    。 5.語法限制不太嚴格,程序設計自由度大。 6.C語言允許直接訪問物理地址,能進行位(bit)操作,能夠?qū)崿F(xiàn)匯編語言的大部分功能,可以直接對硬件進行操作。因此
    發(fā)表于 01-05 07:41

    汽車網(wǎng)絡安全開發(fā)語言選型指南:C/C++/Rust/Java等主流語言對比+Perforce QAC/Klocwork工具支持

    汽車網(wǎng)絡安全如何選編程語言C、C++、Rust、Java……誰更適合AUTOSAR、ISO/SAE 21434?一文了解8種主流語言的優(yōu)劣與適用場景,以及Perforce QAC/K
    的頭像 發(fā)表于 12-26 11:13 ?442次閱讀
    汽車網(wǎng)絡安全開發(fā)<b class='flag-5'>語言</b>選型指南:<b class='flag-5'>C</b>/<b class='flag-5'>C++</b>/Rust/Java等主流<b class='flag-5'>語言</b>對比+Perforce QAC/Klocwork工具支持

    C語言C++的區(qū)別及聯(lián)系

    C語言C++到底是什么關系? 首先C++C語言本來就是兩種不同的編程
    發(fā)表于 12-24 07:23

    CC++之間的聯(lián)系

    控制能力,這一點與C語言相似,使得它們在系統(tǒng)編程、嵌入式系統(tǒng)等領域都得到廣泛應用。 3、發(fā)展歷程: C++正是在C語言的基礎上逐步發(fā)展起
    發(fā)表于 12-11 06:51

    C語言C++之間的區(qū)別是什么

    C++的標準庫那樣集成度高和功能齊全。 6、編譯器與語言特性: C++編譯器通常比C語言
    發(fā)表于 12-11 06:23

    C語言特性

    訪問內(nèi)存地址,對內(nèi)存中的數(shù)據(jù)進行讀寫操作,還可以控制硬件的寄存器,實現(xiàn)對硬件設備的精確控制。這種底層操作的能力,使得 C 語言在嵌入式開發(fā)中能夠充分發(fā)揮硬件的優(yōu)勢,實現(xiàn)各種復雜的功能。
    發(fā)表于 11-24 07:01

    C語言和單片機C語言有什么差異

    單片機c語言相對于普通C語言增加了一些基本的指令,還有變量的賦值是16進制,當然單片機c
    發(fā)表于 11-14 07:55

    C/C++代碼靜態(tài)測試工具Perforce QAC 2025.3的新特性

    ?Perforce Validate?中?QAC?項目的相對/根路徑的支持。C++?分析也得到了增強,增加了用于檢測 C++?并發(fā)問題的新檢查,并改進了實體名稱和實
    的頭像 發(fā)表于 10-13 18:11 ?575次閱讀
    <b class='flag-5'>C</b>/<b class='flag-5'>C++</b>代碼靜態(tài)測試工具Perforce QAC 2025.3的新特性

    技能+1!如何在樹莓派上使用C++控制GPIO?

    在使用樹莓派時,你會發(fā)現(xiàn)Python和Scratch是許多任務(包括GPIO編程)中最常用的編程語言。但你知道嗎,你也可以使用C++進行GPIO編程,而且這樣做還有不少好處。借助WiringPi
    的頭像 發(fā)表于 08-06 15:33 ?4164次閱讀
    技能+1!如何在樹莓派上使用<b class='flag-5'>C++</b>控制GPIO?

    C++ 與 Python:樹莓派上哪種語言更優(yōu)?

    Python是樹莓派上的首選編程語言,我們的大部分教程都使用它。然而,C++在物聯(lián)網(wǎng)項目中同樣廣受歡迎且功能強大。那么,在樹莓派項目中選擇哪種語言更合適呢?Python因其簡潔性、豐富
    的頭像 發(fā)表于 07-24 15:32 ?955次閱讀
    <b class='flag-5'>C++</b> 與 Python:樹莓派上哪種<b class='flag-5'>語言</b>更優(yōu)?

    Perforce QAC產(chǎn)品簡介:面向C/C++的靜態(tài)代碼分析工具(已通過SO 26262認證)

    Perforce QAC專為C/C++開發(fā)者打造,支持多種編碼規(guī)范、功能安全標準(ISO 26262)等,廣泛用于汽車、醫(yī)療、嵌入式開發(fā)領域,可幫助快速識別關鍵缺陷、提升代碼質(zhì)量、實現(xiàn)合規(guī)交付。
    的頭像 發(fā)表于 07-10 15:57 ?1283次閱讀
    Perforce QAC產(chǎn)品簡介:面向<b class='flag-5'>C</b>/<b class='flag-5'>C++</b>的靜態(tài)代碼分析工具(已通過SO 26262認證)

    基于LockAI視覺識別模塊:C++目標檢測

    本文檔基于瑞芯微RV1106的LockAI凌智視覺識別模塊,通過C++語言做的目標檢測實驗。本文檔展示了如何使用lockzhiner_vision_module::PaddleDet類進行目標檢測,并通過lockzhiner_vision_module::Visualiz
    的頭像 發(fā)表于 06-06 13:56 ?847次閱讀
    基于LockAI視覺識別模塊:<b class='flag-5'>C++</b>目標檢測

    主流的 MCU 開發(fā)語言為什么是 C 而不是 C++

    在單片機的地界兒里,C語言穩(wěn)坐中軍帳,C++想分杯羹?難嘍。咱電子工程師天天跟那針尖大的內(nèi)存空間較勁,C++那些花里胡哨的玩意兒,在這兒真玩不轉(zhuǎn)。先說內(nèi)存這道坎兒。您當stm32f4的
    的頭像 發(fā)表于 05-21 10:33 ?1055次閱讀
    主流的 MCU 開發(fā)<b class='flag-5'>語言</b>為什么是 <b class='flag-5'>C</b> 而不是 <b class='flag-5'>C++</b>?

    深入理解C語言C語言循環(huán)控制

    C語言編程中,循環(huán)結構是至關重要的,它可以讓程序重復執(zhí)行特定的代碼塊,從而提高編程效率。然而,為了避免程序進入無限循環(huán),C語言提供了多種循環(huán)控制語句,如break、continue和
    的頭像 發(fā)表于 04-29 18:49 ?2052次閱讀
    深入理解<b class='flag-5'>C</b><b class='flag-5'>語言</b>:<b class='flag-5'>C</b><b class='flag-5'>語言</b>循環(huán)控制

    C++學到什么程度可以找工作?

    C++學到什么程度可以找工作?要使用C++找到工作,特別是作為軟件開發(fā)人員或相關職位,通常需要掌握以下幾個方面: 1. **語言基礎**:你需要對C++的核心概念有扎實的理解,包括但不
    發(fā)表于 03-13 10:19