在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

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

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐ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ā)語言其實(shí)是一件需要很高成本的事,本文主要講講我是怎么從C語言轉(zhuǎn)投D語言的。

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

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

總之全能之神當(dāng)不上了,我很傷心。

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

很多前C ++程序員最終都用回了C。就我而言,我發(fā)現(xiàn)了D語言。其實(shí)D也不完美,但是我使用它因?yàn)樗屛腋杏X更像是C++應(yīng)該有的樣子(C+=1)。比如以下面這個簡單的C程序?yàn)槔ㄒ患右坏扔趲祝浚?/p>

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

如果使用C++標(biāo)準(zhǔn)庫,代碼是這樣的:

#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ū)別。

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

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

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

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

-betterC開關(guān)

D編譯器支持-betterC開關(guān),該開關(guān)可以啟用/禁用D運(yùn)行時以及依賴于它的所有高級功能。上面的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!

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

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

靜態(tài)assert()

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

static assert(kNumInducers<16);

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

Slices

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

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

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

buffer = buffer[offset..$];

Slice 其實(shí)就是具備優(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設(shè)定使得這個問題變得不再困難:

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語言還利用結(jié)構(gòu)析構(gòu)函數(shù)支持RAII。

常量和不可變量

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

函數(shù)純度

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

@Safe

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

元編程

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

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

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

沒有預(yù)處理器

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

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

    關(guān)注

    180

    文章

    7617

    瀏覽量

    138156
  • 編程
    +關(guān)注

    關(guān)注

    88

    文章

    3645

    瀏覽量

    94165
  • C++
    C++
    +關(guān)注

    關(guān)注

    22

    文章

    2114

    瀏覽量

    73969

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

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

收藏 人收藏

    評論

    相關(guān)推薦

    源代碼加密、源代碼防泄漏c/c++與git服務(wù)器開發(fā)環(huán)境

    源代碼加密對于很多研發(fā)性單位來說是至關(guān)重要的,當(dāng)然每家企業(yè)的業(yè)務(wù)需求不同所用的開發(fā)環(huán)境及開發(fā)語言也不盡相同,今天主要來講一下c++及git開發(fā)環(huán)境的源代碼防泄密保護(hù)方案。企業(yè)源代碼泄密場景一、在很多
    的頭像 發(fā)表于 02-12 15:26 ?222次閱讀
    源代碼加密、源代碼防泄漏<b class='flag-5'>c</b>/<b class='flag-5'>c++</b>與git服務(wù)器開發(fā)環(huán)境

    Spire.XLS for C++組件說明

    Spire.XLS for C++ 是一款專業(yè)的 C++ Excel 組件,可以用在各種 C++ 框架和應(yīng)用程序中。Spire.XLS for C++ 提供了一個對象模型 Excel
    的頭像 發(fā)表于 01-14 09:40 ?207次閱讀
    Spire.XLS for <b class='flag-5'>C++</b>組件說明

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

    產(chǎn)品創(chuàng)新與功能迭代,而非技術(shù)遷移的細(xì)節(jié)問題,大幅提升開發(fā)效率。 據(jù)悉,在涉及C/C++/ETS跨越語言調(diào)用的鴻蒙化應(yīng)用中,有超過80%的項(xiàng)目都在使用AKI,如某知名購物應(yīng)用,使用后減少
    發(fā)表于 01-02 17:08

    同樣是函數(shù),在CC++中有什么區(qū)別

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

    C語言C++中結(jié)構(gòu)體的區(qū)別

    同樣是結(jié)構(gòu)體,看看在C語言C++中有什么區(qū)別?
    的頭像 發(fā)表于 10-30 15:11 ?389次閱讀

    C7000優(yōu)化C/C++編譯器

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

    C語言與Java語言的對比

    C語言和Java語言都是當(dāng)前編程領(lǐng)域中的重要成員,它們各自具有獨(dú)特的優(yōu)勢和特點(diǎn),適用于不同的應(yīng)用場景。以下將從語法特性、內(nèi)存管理、跨平臺性、性能、應(yīng)用領(lǐng)域等多個方面對
    的頭像 發(fā)表于 10-29 17:31 ?508次閱讀

    C++語言基礎(chǔ)知識

    電子發(fā)燒友網(wǎng)站提供《C++語言基礎(chǔ)知識.pdf》資料免費(fèi)下載
    發(fā)表于 07-19 10:58 ?8次下載

    C++中實(shí)現(xiàn)類似instanceof的方法

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

    SEGGER編譯器優(yōu)化和安全技術(shù)介紹 支持最新CC++語言

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

    C/C++中兩種宏實(shí)現(xiàn)方式

    #ifndef的方式受C/C++語言標(biāo)準(zhǔn)支持。它不僅可以保證同一個文件不會被包含多次,也能保證內(nèi)容完全相同的兩個文件(或者代碼片段)不會被不小心同時包含。
    的頭像 發(fā)表于 04-19 11:50 ?728次閱讀

    C/C++代碼動態(tài)測試工具VectorCAST插樁功能演示#代碼動態(tài)測試 #C++

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

    鴻蒙OS開發(fā)實(shí)例:【Native C++

    使用DevEco Studio創(chuàng)建一個Native C++應(yīng)用。應(yīng)用采用Native C++模板,實(shí)現(xiàn)使用NAPI調(diào)用C標(biāo)準(zhǔn)庫的功能。使用C
    的頭像 發(fā)表于 04-14 11:43 ?2839次閱讀
    鴻蒙OS開發(fā)實(shí)例:【Native <b class='flag-5'>C++</b>】

    為什么很少用C++開發(fā)單片機(jī)

    C語言是面向過程的語言C++是面向?qū)ο蟮木幊?b class='flag-5'>語言。結(jié)合本文來說,面向過程相比面向?qū)ο蟮木幊蹋纱a量(bin文件)更小,運(yùn)行效率更高。
    發(fā)表于 03-25 14:26 ?1205次閱讀
    為什么很少用<b class='flag-5'>C++</b>開發(fā)單片機(jī)

    C語言#define的應(yīng)用

    C/C++ 編程語言中,當(dāng)程序被編譯時,被發(fā)送到編譯器,編譯器將程序轉(zhuǎn)換為機(jī)器語言,然后完成編譯并執(zhí)行該程序。預(yù)處理器也稱為宏預(yù)處理器。
    發(fā)表于 03-06 11:29 ?445次閱讀
    <b class='flag-5'>C</b><b class='flag-5'>語言</b>#define的應(yīng)用
    主站蜘蛛池模板: 午夜性视频 | 1000部啪啪勿入十八免费 | 视频在线观看高清免费大全 | 天天色天天操天天 | 国产亚洲精品激情都市 | 日本www色视频 | 亚洲91精品| 777色狠狠一区二区三区香蕉 | 一级特黄特黄的大片免费 | www.乱| 色偷偷亚洲天堂 | 色激情综合网 | 色午夜在线 | bt天堂新版中文在线地址 | 四虎永久免费在线观看 | 国产精品视频你懂的 | 成年香蕉大黄美女美女 | 成 年 人 视频在线播放 | 视频色版 | 男人的j桶女人的j视频 | 午夜撸| 18男女很黄的视频 | 色偷偷av男人的天堂 | 亚洲日本视频在线观看 | 欧美综合精品一区二区三区 | 免费黄色福利视频 | 香蕉久久高清国产精品免费 | 黄色网日本| 天堂最新版免费观看 | 天天做天天操 | 一区二区网站 | 一级毛片看真人在线视频 | 波多久久夜色精品国产 | 天天操天天弄 | 久久九九国产精品怡红院 | 国产在线视频www色 国产在线视频欧美亚综合 国产在线视频网站 | 香港三级理论在线影院 | www.亚洲天堂.com | 欧美一级艳片视频免费观看 | 天天干天天干天天天天天天爽 | 日韩午夜片 |