国产av一二三区|日本不卡动作网站|黄色天天久久影片|99草成人免费在线视频|AV三级片成人电影在线|成年人aV不卡免费播放|日韩无码成人一级片视频|人人看人人玩开心色AV|人妻系列在线观看|亚洲av无码一区二区三区在线播放

網(wǎng)易首頁(yè) > 網(wǎng)易號(hào) > 正文 申請(qǐng)入駐

寫(xiě)給新入門(mén)的程序員,軍工級(jí)的代碼是什么樣子

0
分享至

最近在監(jiān)理一個(gè)項(xiàng)目,因此也就看了一群程序員寫(xiě)的代碼。簡(jiǎn)單的說(shuō)感受,現(xiàn)在很多程序員就是一群造糞機(jī)器,寫(xiě)的代碼就是一坨屎,臭不可聞。

當(dāng)然了,從軟件工程學(xué)、項(xiàng)目處理甚至于成本考慮,這群程序員做的程序并沒(méi)有什么問(wèn)題。但從長(zhǎng)遠(yuǎn)考慮這是一個(gè)劣幣驅(qū)逐良幣的過(guò)程,而且現(xiàn)在的良幣已經(jīng)被驅(qū)逐得差不多了。

早上和這群家伙開(kāi)會(huì),會(huì)議上說(shuō)的話(huà)有點(diǎn)重——“你們每行代碼都是對(duì)行業(yè)的侮辱!”

為什么生這么大的氣?這是一個(gè)很小的項(xiàng)目,卻引入了30多個(gè)pip庫(kù),最后卻卡在了一個(gè)質(zhì)數(shù)判斷的問(wèn)題上。

事情很簡(jiǎn)單需要判斷出0-31這三十二個(gè)數(shù)字哪個(gè)是質(zhì)數(shù)。由于之前W君說(shuō)過(guò)不要為了完成一行代碼去引用一個(gè)巨大的pip庫(kù),就讓這群孩子們犯了愁了。

于是就出現(xiàn)了這樣的代碼:

def is_prime(n):if n <= 1:return Falsefor i in range(2, n - 1):if n % i == 0:# 找到了一個(gè)除數(shù),不是質(zhì)數(shù)return False# 循環(huán)結(jié)束,沒(méi)有找到除數(shù),是質(zhì)數(shù)return True

這行代碼對(duì)不對(duì)呢?理論上是沒(méi)有錯(cuò)誤的,畢竟,當(dāng)初上學(xué)的時(shí)候大多數(shù)老師會(huì)這么教的,這段程序完美的展現(xiàn)了上學(xué)的時(shí)候老師說(shuō)的“指在大于1的自然數(shù)中,除了1和該數(shù)自身外,無(wú)法被其他自然數(shù)整除”的質(zhì)數(shù)最基本含義。

顯然,這比很多只會(huì)用python這種膠水語(yǔ)言無(wú)腦粘接各種庫(kù)的程序員強(qiáng)了那么一點(diǎn)點(diǎn)。

不過(guò),這件事依然不對(duì),W君就說(shuō)了一句“你們?cè)傧胂搿薄?/p>

于是代碼就改成了這個(gè)樣子:

def is_prime(n):if n <= 1:return Falseif n == 2:return Truefor i in range(2, n - 1):if n % i == 0:# 找到了一個(gè)除數(shù),不是質(zhì)數(shù)return False# 循環(huán)結(jié)束,沒(méi)有找到除數(shù),是質(zhì)數(shù)return True

程序員小A的說(shuō)法是當(dāng)n=2的時(shí)候,for循環(huán)實(shí)際上是沒(méi)有執(zhí)行的,于是程序員小B則進(jìn)一步跟進(jìn)還得加上n==3的判斷:

def is_prime(n):if n <= 1:return Falseif n == 2:return Trueif n == 3:return Truefor i in range(2, n - 1):if n % i == 0:# 找到了一個(gè)除數(shù),不是質(zhì)數(shù)return False# 循環(huán)結(jié)束,沒(méi)有找到除數(shù),是質(zhì)數(shù)return True

W君當(dāng)時(shí)就氣笑了,說(shuō)了一句“你們離真相更近了一步”,于是幾經(jīng)討論,他們拿出來(lái)了這個(gè)!

def is_prime(n):if n <= 1:return Falseif n == 2:return Trueif n == 3:return Trueif n == 4:return Falseif n == 5:return Trueif n == 6:return Falseif n == 7:return Trueif n == 8:return Falseif n == 9:return Falseif n == 10:return Falseif n == 11:return Trueif n == 12:return Falseif n == 13:return Trueif n == 14:return Falseif n == 15:return Falseif n == 16:return Falseif n == 17:return Trueif n == 18:return Falseif n == 19:return Trueif n == 20:return Falseif n == 21:return Falseif n == 22:return Falseif n == 23:return Trueif n == 24:return Falseif n == 25:return Falseif n == 26:return Falseif n == 27:return Falseif n == 28:return Falseif n == 29:return Trueif n == 30:return Falseif n == 31:return Trueif n >= 32:return False

小A的理由是反正只有32個(gè)數(shù)字,不妨這樣寫(xiě)。緊接著W君就說(shuō)了那句“你們每行代碼都是對(duì)行業(yè)的侮辱!

這就是W君遇到的程序員的水平,能理解要判斷的數(shù)字是有限個(gè)數(shù)的,于是就給你寫(xiě)出一大堆if判斷來(lái)做這件事。

腦子這玩意是好東西,可惜現(xiàn)在很多程序員沒(méi)有這玩意。

于是W君問(wèn)干嘛不這樣寫(xiě)呢?

def is_prime(n):return n in [2,3,5,7,11,13,17,19,23,29,31]

如果n在這個(gè)[2,3,5,7,11,13,17,19,23,29,31]列表中,直接返回真,否則返回一個(gè)數(shù)字在不在質(zhì)數(shù)列表中假難道不香嗎?

這時(shí)候小A在說(shuō),這么牛,難道這是軍工級(jí)的代碼嗎?

似乎所謂的“軍工級(jí)”成了一些程序員眼中高效代碼的傳說(shuō)。但是還真不是這么回事,而且上面的那一行代碼的效率也并不高,畢竟python要在列表里挨個(gè)去試探n是不是在列表中,這個(gè)操作只不過(guò)是一個(gè)for循環(huán)的展開(kāi)。

再高效一些的代碼是這樣的:

def is_prime(n):return (1 << n) & 2693408940 != 0

理論上這是最快的方式,當(dāng)然了,這僅僅是在理論上,2693408940展開(kāi)為二進(jìn)制為:10100000100010100010100010101100,在從低向高的質(zhì)數(shù)位上放“1”,其余非質(zhì)數(shù)位置上放0。我們只需要把這個(gè)二進(jìn)制串直接移動(dòng)n位就可以對(duì)應(yīng)到是不是質(zhì)數(shù)的判斷上。

最多4個(gè)CPU時(shí)鐘周期就可以判斷完畢這個(gè)數(shù)字n是不是質(zhì)數(shù)。

而對(duì)于上面的“軍工級(jí)的代碼”查表法則需要大約2000多個(gè)時(shí)鐘周期才可以完成。

但是誰(shuí)腦子抽了才會(huì)用python算這么大的數(shù)字來(lái)移位計(jì)算呢?python根本不擅長(zhǎng)這樣的操作。

反而,反直覺(jué)的操作會(huì)更快:

def is_prime(n):return n in {2,3,5,7,11,13,17,19,23,29,31}

和前面的代碼不同,列表("[]")被改成集合("{}"),也就是把中括號(hào)改成大括號(hào)。在性能上會(huì)比python中的移位的操作快將近一半。

那問(wèn)題來(lái)了——軍工級(jí)的代碼要怎么寫(xiě)呢?

首先軍用代碼誰(shuí)去python呢?這玩意狗都不用。大部分軍用代碼的編寫(xiě)目前還是編譯形語(yǔ)言的天下,C語(yǔ)言都用得不多,更為普遍的是ADA。和python這些解釋形的語(yǔ)言相比它們更接近于硬件底層、執(zhí)行效率更高,可控性更強(qiáng),尤其是ADA,它的語(yǔ)法嚴(yán)謹(jǐn),天然適合安全關(guān)鍵系統(tǒng)。在咱們國(guó)內(nèi),大部分航空、航天、飛行控制、艦船控制的代碼都是ADA來(lái)寫(xiě)的。

其次,軍規(guī)代碼是有自己的規(guī)范的。例如MISRA C / MISRA C++、DO?178C、SPARK/Ada以及MIL-STD-498或者GJB 2786A一系列軟件開(kāi)發(fā)標(biāo)準(zhǔn)。

那么到了代碼層級(jí),就遠(yuǎn)遠(yuǎn)不是前面寫(xiě)了一兩行代碼這么簡(jiǎn)單的事情了。

軍工級(jí)代碼和普通商業(yè)代碼的最大區(qū)別,不僅僅是快,而是可靠,不是“能跑”,而是無(wú)條件正確。

你可能會(huì)覺(jué)得這種說(shuō)法有些裝,但我告訴你,軍用代碼的世界和現(xiàn)在的商業(yè)程序猿們寫(xiě)業(yè)務(wù)邏輯調(diào)API、對(duì)接數(shù)據(jù)庫(kù)的世界完全不是一個(gè)宇宙。

  • 確定性(Determinism):相同輸入下,任何時(shí)刻、任何硬件平臺(tái)都必須產(chǎn)生相同輸出;
  • 形式化驗(yàn)證(Formal Verification):代碼不能只是跑通單元測(cè)試,而是邏輯路徑必須被證明不會(huì)出現(xiàn)“非法狀態(tài)”;
  • 零未定義行為(No Undefined Behavior):你寫(xiě)個(gè)野指針在Linux下可能沒(méi)出問(wèn)題,在RTOS里就是立即炸;
  • 強(qiáng)類(lèi)型/靜態(tài)分析支持:例如 Ada 的子類(lèi)型約束系統(tǒng),能在編譯期就拒絕不合理狀態(tài);
  • 資源確定性:執(zhí)行時(shí)間、棧空間、緩存訪(fǎng)問(wèn)必須全部可估算,不允許 GC、動(dòng)態(tài)分配、解釋器優(yōu)化等不確定性行為。

與此同時(shí),你的代碼還要具有極強(qiáng)的可讀性和可驗(yàn)證特性。

以剛剛咱們的代碼為例子:

def is_prime(n):return (1 << n) & 2693408940 != 0

上面這種商業(yè)程序員認(rèn)為的“軍工級(jí)代碼”實(shí)際上根本就是錯(cuò)誤的。

原因在于哪個(gè)大聰明給你的這個(gè)“2693408940”數(shù)字,你說(shuō)從低到高凡是質(zhì)數(shù)的位上都是1就是這個(gè)“2693408940”的數(shù)字了嗎?有沒(méi)有缺掉某個(gè)數(shù)字?是不是在原理上沒(méi)有錯(cuò)誤?

“!=0” 這種不是人話(huà)的描述給軍隊(duì)的任何人看都能看懂嗎?

在真正的軍用系統(tǒng)中,上面這種炫技式樣的代碼不僅不被提倡,甚至是被嚴(yán)令禁止的行為。

2693408940 = 0b10100000100010100000100001001100這確實(shí)可以是某位程序員按照 0~31 范圍內(nèi)的質(zhì)數(shù)打出的一串?dāng)?shù)字位,其中第 n 位為 1 表示 n 是質(zhì)數(shù)。但這東西有幾個(gè)致命問(wèn)題:首先這串?dāng)?shù)字是難以驗(yàn)證來(lái)源,你只能“相信”這個(gè)數(shù)字是對(duì)的,而無(wú)法“推理”它是對(duì)的。軍用系統(tǒng)所有值必須可追溯到規(guī)范、公式或定義。而這個(gè)2693408940的推導(dǎo)過(guò)程并沒(méi)有在軟件編碼中出現(xiàn)。

同時(shí),這段代碼的可維護(hù)性為0,如果哪天質(zhì)數(shù)定義范圍改了,誰(shuí)知道這段代碼還對(duì)不對(duì)?戰(zhàn)爭(zhēng)都開(kāi)打了,還讓數(shù)學(xué)家來(lái)證明和定義具體哪個(gè)數(shù)字是質(zhì)數(shù)嗎?

同樣,“!=0”不是語(yǔ)義,而是一個(gè)障眼法,軍工級(jí)代碼必須可讀、可分析、可驗(yàn)證!!= 0” 是個(gè)機(jī)械語(yǔ)言,而不是表達(dá)語(yǔ)義。0b10100000100010100000100001001100經(jīng)過(guò)計(jì)算非得“!=0”嗎?難道就不能直接寫(xiě)真假嗎?

所以,如果是一個(gè)軍工級(jí)代碼應(yīng)該怎么寫(xiě)呢?這樣

#include #include #define PRIME_TABLE_SIZE 32Ustatic uint8_t prime_table[PRIME_TABLE_SIZE]; /* 0 = false, 1 = true *//* 判斷一個(gè)數(shù)是否為質(zhì)數(shù)(布爾邏輯) */static bool is_prime_check(uint8_t n){    if (n <= 1U) {        return false;    }    for (uint8_t i = 2U; (i * i) <= n; ++i) {        if ((n % i) == 0U) {            return false;        }    }    return true;}/* 初始化 prime_table[] */void prime_table_init(void){    for (uint8_t i = 0U; i < PRIME_TABLE_SIZE; ++i) {        prime_table[i] = is_prime_check(i) ? 1U : 0U;    }}/* 驗(yàn)證表正確性 */bool prime_table_verify(void){    for (uint8_t i = 0U; i < PRIME_TABLE_SIZE; ++i) {        uint8_t expected = is_prime_check(i) ? 1U : 0U;        if (prime_table[i] != expected) {            return false;        }    }    return true;}/* 接口函數(shù) */bool is_prime(uint8_t n){    if (n >= PRIME_TABLE_SIZE) {        return false;    }    return (prime_table[n] == 1U);}

首先,在代碼中并不會(huì)存儲(chǔ)一個(gè)不知所云的數(shù)字,例如“2693408940”,而是利用“prime_table_init”函數(shù)在初始化的時(shí)候生成這個(gè)質(zhì)數(shù)列表。同樣,在生成后還需要對(duì)列表進(jìn)行驗(yàn)證(prime_table_verify),以確保在生產(chǎn)的過(guò)程中出現(xiàn)錯(cuò)誤。

其次,所有的內(nèi)容都是“顯式”的,并不會(huì)有晦澀難懂的數(shù)據(jù)和算法,甚至0和1所代表的意義也需要在聲明的時(shí)候就近寫(xiě)出注釋?zhuān)?* 0 = false, 1 = true */)。

最后,代碼看起來(lái)冗余度很大,比之前的“一行函數(shù)”要復(fù)雜很多。但每一行的職責(zé)就更明確了。

那么為什么ADA更適合軍用代碼呢?如果我們把C語(yǔ)言轉(zhuǎn)成ADA就更加一目了然了:

with Ada.Text_IO; use Ada.Text_IO;with Ada.Integer_Text_IO; use Ada.Integer_Text_IO;procedure Prime_Table_Gen is   subtype Prime_Index is Integer range 0 .. 31;   type Prime_Table_Type is array(Prime_Index) of Boolean;   function Is_Prime(N : Integer) return Boolean is   begin      if N <= 1 then         return False;      end if;      for I in 2 .. Integer(N ** 0.5) loop         if N mod I = 0 then            return False;         end if;      end loop;      return True;   end Is_Prime;   Prime_Table : Prime_Table_Type;begin   -- Initialize table   for I in Prime_Index loop      Prime_Table(I) := Is_Prime(I);   end loop;   -- Output for verification   for I in Prime_Index loop      Put("Index ");      Put(I, 2);      Put(": ");      Put_Line(Boolean'Image(Prime_Table(I)));   end loop;end Prime_Table_Gen;

大部分的內(nèi)容都是平鋪直敘接近于自然語(yǔ)言所書(shū)寫(xiě)的。在這種狀態(tài)下即便是一個(gè)沒(méi)有太多程序經(jīng)驗(yàn)的審計(jì)人員也可以很迅速的理解這些代碼所代表的含義。這在軍用系統(tǒng)中十分重要。

當(dāng)然了,也正是有各自初始化和驗(yàn)證的過(guò)程存在。軍用系統(tǒng)的啟動(dòng)往往是這樣的:

慢慢的一部分一部分的打開(kāi),相當(dāng)具有“儀式感”。

所以說(shuō)嘛,要不是知道軍用代碼是怎么寫(xiě)、是什么樣子的,今天上午,還真被人拍馬屁拍爽了,哈哈哈。

特別聲明:以上內(nèi)容(如有圖片或視頻亦包括在內(nèi))為自媒體平臺(tái)“網(wǎng)易號(hào)”用戶(hù)上傳并發(fā)布,本平臺(tái)僅提供信息存儲(chǔ)服務(wù)。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相關(guān)推薦
熱點(diǎn)推薦
老人再婚后第一次圓房有何感想?67歲老人傾訴:她給了我很多驚喜

老人再婚后第一次圓房有何感想?67歲老人傾訴:她給了我很多驚喜

熱心柚子姐姐
2026-05-07 16:28:09
81歲李家鼎向李泳漢稱(chēng)「不獲續(xù)約」為權(quán)宜之計(jì)? 李泳豪開(kāi)腔回應(yīng)

81歲李家鼎向李泳漢稱(chēng)「不獲續(xù)約」為權(quán)宜之計(jì)? 李泳豪開(kāi)腔回應(yīng)

粵睇先生
2026-05-08 21:31:36
伊朗外交部:武裝力量已做好全面準(zhǔn)備,將回?fù)羧魏吻致?>
    </a>
        <h3>
      <a href=界面新聞
2026-05-08 21:58:23
又是被巨嬰孫楊氣暈的一天,網(wǎng)友:可恨之人必有可憐之處!

又是被巨嬰孫楊氣暈的一天,網(wǎng)友:可恨之人必有可憐之處!

手工制作阿殲
2026-05-08 20:14:23
年輕時(shí)是帥的教科書(shū),老了卻丑得千姿百態(tài),這6位男神越活越走樣

年輕時(shí)是帥的教科書(shū),老了卻丑得千姿百態(tài),這6位男神越活越走樣

八斗小先生
2026-03-28 10:49:09
八路軍最強(qiáng)的師,擁有30個(gè)師的兵力,八年抗戰(zhàn)下來(lái)殲滅日偽軍42萬(wàn)

八路軍最強(qiáng)的師,擁有30個(gè)師的兵力,八年抗戰(zhàn)下來(lái)殲滅日偽軍42萬(wàn)

凡人侃史
2026-05-07 22:41:20
爭(zhēng)冠格局變了:前2相差5分,C羅進(jìn)球,下一場(chǎng)生死戰(zhàn):對(duì)決新月

爭(zhēng)冠格局變了:前2相差5分,C羅進(jìn)球,下一場(chǎng)生死戰(zhàn):對(duì)決新月

足球狗說(shuō)
2026-05-08 05:44:29
鄧華被批評(píng)調(diào)離軍隊(duì),為何他還能當(dāng)副省長(zhǎng)?毛主席的一番話(huà)是關(guān)鍵

鄧華被批評(píng)調(diào)離軍隊(duì),為何他還能當(dāng)副省長(zhǎng)?毛主席的一番話(huà)是關(guān)鍵

揚(yáng)平說(shuō)史
2026-05-08 21:28:12
妻子升副局長(zhǎng)跟我離婚,半年后我去開(kāi)會(huì),見(jiàn)她在門(mén)口等我2小時(shí)

妻子升副局長(zhǎng)跟我離婚,半年后我去開(kāi)會(huì),見(jiàn)她在門(mén)口等我2小時(shí)

千秋文化
2026-03-25 21:49:57
我軍得到敵人密碼本無(wú)法破解,周總理瞅了一眼:這不是一首歌嗎?

我軍得到敵人密碼本無(wú)法破解,周總理瞅了一眼:這不是一首歌嗎?

浩渺青史
2026-05-06 00:53:17
亨得利希望2029年世錦賽留在謝菲爾德!特魯姆普:找不到任何理由

亨得利希望2029年世錦賽留在謝菲爾德!特魯姆普:找不到任何理由

世界體壇觀察家
2026-05-08 08:12:17
德州王女士白嫖榴蓮徹底社死:商家上門(mén)對(duì)質(zhì)被威脅,被爆是慣犯

德州王女士白嫖榴蓮徹底社死:商家上門(mén)對(duì)質(zhì)被威脅,被爆是慣犯

一盅情懷
2026-05-08 16:14:55
原來(lái)我們都被騙了!唯獨(dú)吳昕缺席謝娜演唱會(huì),不是不想,而是不能

原來(lái)我們都被騙了!唯獨(dú)吳昕缺席謝娜演唱會(huì),不是不想,而是不能

李橑在北漂
2026-05-08 12:16:59
入朝前夕,毛主席聽(tīng)取林帥建議:換掉13兵團(tuán)主將!兩年后才知高明

入朝前夕,毛主席聽(tīng)取林帥建議:換掉13兵團(tuán)主將!兩年后才知高明

搜史君
2026-05-08 13:00:16
廣東男籃動(dòng)態(tài)更新!徐杰深夜加練,杜峰調(diào)整陣容,朱芳雨提前部署引援動(dòng)作

廣東男籃動(dòng)態(tài)更新!徐杰深夜加練,杜峰調(diào)整陣容,朱芳雨提前部署引援動(dòng)作

凱豐侃球
2026-05-08 15:07:34
比亞迪閃充76°高溫傷電池?李云飛疑似回應(yīng):歡迎去吐魯番體驗(yàn)

比亞迪閃充76°高溫傷電池?李云飛疑似回應(yīng):歡迎去吐魯番體驗(yàn)

汽車(chē)記錄者
2026-05-07 23:05:01
於之瑩代表了一個(gè)時(shí)代,韓國(guó)女團(tuán)已對(duì)中國(guó)女團(tuán)形成壓制

於之瑩代表了一個(gè)時(shí)代,韓國(guó)女團(tuán)已對(duì)中國(guó)女團(tuán)形成壓制

月滿(mǎn)大江流
2026-05-08 10:03:59
廣州飛新加坡航班遇嚴(yán)重顛簸:劇烈起伏如坐過(guò)山車(chē),緊急迫降巴淡島

廣州飛新加坡航班遇嚴(yán)重顛簸:劇烈起伏如坐過(guò)山車(chē),緊急迫降巴淡島

新加坡眼
2026-05-08 17:55:20
美軍再次對(duì)多艘伊朗油輪發(fā)動(dòng)空襲

美軍再次對(duì)多艘伊朗油輪發(fā)動(dòng)空襲

新京報(bào)
2026-05-08 21:27:10
中方?jīng)]想到,金磚國(guó)家赴美求和,給美國(guó)送上稀土資源,動(dòng)機(jī)不簡(jiǎn)單

中方?jīng)]想到,金磚國(guó)家赴美求和,給美國(guó)送上稀土資源,動(dòng)機(jī)不簡(jiǎn)單

影孖看世界
2026-05-08 18:33:54
2026-05-08 22:55:00
軍武數(shù)據(jù)庫(kù)
軍武數(shù)據(jù)庫(kù)
軍事類(lèi)興趣頻道,介紹各國(guó)武備
1145文章數(shù) 6459關(guān)注度
往期回顧 全部

科技要聞

SK海力士平均獎(jiǎng)金600萬(wàn) 工服成相親神器

頭條要聞

"4只皮皮蝦1035元"消費(fèi)者再次發(fā)聲 否認(rèn)"想吃白食"

頭條要聞

"4只皮皮蝦1035元"消費(fèi)者再次發(fā)聲 否認(rèn)"想吃白食"

體育要聞

他把首勝讓給隊(duì)友,然后用一年時(shí)間還清賬單

娛樂(lè)要聞

古天樂(lè)被曝隱婚生子,新娘竟是她

財(cái)經(jīng)要聞

估值3000億 DeepSeek尋求500億元融資

汽車(chē)要聞

MG 4X實(shí)車(chē)亮相 將于5月11日開(kāi)啟盲訂

態(tài)度原創(chuàng)

手機(jī)
房產(chǎn)
家居
親子
公開(kāi)課

手機(jī)要聞

iQOO 15T官宣本月發(fā)布!天璣9500+8000mAh,性能續(xù)航都太頂了

房產(chǎn)要聞

豪擲6.8億拿地!何猷君大手筆投資三亞!

家居要聞

流動(dòng)的尺度 打破家的形式主義

親子要聞

男人帶娃,為什么如此輕松?網(wǎng)友: 放下你的控制欲你也能輕松

公開(kāi)課

李玫瑾:為什么性格比能力更重要?

無(wú)障礙瀏覽 進(jìn)入關(guān)懷版