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

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

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

0
分享至

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

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

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

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

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

于是就出現(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é)束,沒有找到除數(shù),是質(zhì)數(shù)return True

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

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

不過,這件事依然不對(duì),W君就說了一句“你們?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é)束,沒有找到除數(shù),是質(zhì)數(shù)return True

程序員小A的說法是當(dāng)n=2的時(shí)候,for循環(huán)實(shí)際上是沒有執(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é)束,沒有找到除數(shù),是質(zhì)數(shù)return True

W君當(dāng)時(shí)就氣笑了,說了一句“你們離真相更近了一步”,于是幾經(jīng)討論,他們拿出來了這個(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ù)字,不妨這樣寫。緊接著W君就說了那句“你們每行代碼都是對(duì)行業(yè)的侮辱!

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

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

于是W君問干嘛不這樣寫呢?

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在說,這么牛,難道這是軍工級(jí)的代碼嗎?

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

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

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

理論上這是最快的方式,當(dāng)然了,這僅僅是在理論上,2693408940展開為二進(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í)鐘周期才可以完成。

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

反而,反直覺的操作會(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中的移位的操作快將近一半。

那問題來了——軍工級(jí)的代碼要怎么寫呢?

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

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

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

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

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

  • 確定性(Determinism):相同輸入下,任何時(shí)刻、任何硬件平臺(tái)都必須產(chǎn)生相同輸出;
  • 形式化驗(yàn)證(Formal Verification):代碼不能只是跑通單元測(cè)試,而是邏輯路徑必須被證明不會(huì)出現(xiàn)“非法狀態(tài)”;
  • 零未定義行為(No Undefined Behavior):你寫個(gè)野指針在Linux下可能沒出問題,在RTOS里就是立即炸;
  • 強(qiáng)類型/靜態(tài)分析支持:例如 Ada 的子類型約束系統(tǒng),能在編譯期就拒絕不合理狀態(tài);
  • 資源確定性:執(zhí)行時(shí)間、??臻g、緩存訪問必須全部可估算,不允許 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ù)字,你說從低到高凡是質(zhì)數(shù)的位上都是1就是這個(gè)“2693408940”的數(shù)字了嗎?有沒有缺掉某個(gè)數(shù)字?是不是在原理上沒有錯(cuò)誤?

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

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

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

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

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

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

#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)的過程中出現(xiàn)錯(cuò)誤。

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

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

那么為什么ADA更適合軍用代碼呢?如果我們把C語言轉(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)容都是平鋪直敘接近于自然語言所書寫的。在這種狀態(tài)下即便是一個(gè)沒有太多程序經(jīng)驗(yàn)的審計(jì)人員也可以很迅速的理解這些代碼所代表的含義。這在軍用系統(tǒng)中十分重要。

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

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

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

特別聲明:以上內(nèi)容(如有圖片或視頻亦包括在內(nèi))為自媒體平臺(tái)“網(wǎng)易號(hào)”用戶上傳并發(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)推薦
又有5國(guó)參戰(zhàn)!中東亂成一鍋粥,美媒再爆料:沙特欺騙了全世界

又有5國(guó)參戰(zhàn)!中東亂成一鍋粥,美媒再爆料:沙特欺騙了全世界

東極妙嚴(yán)
2026-03-02 15:50:51
美軍瞞不住了!炸航母基地,炸11億美元雷達(dá),幾十萬噸燃油被點(diǎn)燃

美軍瞞不住了!炸航母基地,炸11億美元雷達(dá),幾十萬噸燃油被點(diǎn)燃

夢(mèng)史
2026-03-01 11:22:23
研究警告:越來越多家庭因吃它中毒!冰箱里這類肉別超3個(gè)月!

研究警告:越來越多家庭因吃它中毒!冰箱里這類肉別超3個(gè)月!

全球軍事記
2026-02-28 10:12:38
從設(shè)計(jì)院到包子店:一位45歲建筑師靠“打零工”重啟人生

從設(shè)計(jì)院到包子店:一位45歲建筑師靠“打零工”重啟人生

北青深一度
2026-02-28 16:09:26
霍爾木茲海峽關(guān)閉!中國(guó)化工全產(chǎn)業(yè)鏈承壓

霍爾木茲海峽關(guān)閉!中國(guó)化工全產(chǎn)業(yè)鏈承壓

新浪財(cái)經(jīng)
2026-03-02 11:48:58
西甲前瞻|皇馬1-2赫塔菲:殘陣出擊,恐遭滑鐵盧

西甲前瞻|皇馬1-2赫塔菲:殘陣出擊,恐遭滑鐵盧

體育世界
2026-03-02 17:53:33
張?jiān)迄i尋親25年終團(tuán)圓,爸爸送羽絨服下跪謝子,媽媽缺席引人心疼

張?jiān)迄i尋親25年終團(tuán)圓,爸爸送羽絨服下跪謝子,媽媽缺席引人心疼

閱微札記
2026-03-02 19:31:55
小米車主敗訴!小米SU7Ultra挖孔機(jī)蓋案宣判,法院:不涉及虛假宣傳銷售欺詐

小米車主敗訴!小米SU7Ultra挖孔機(jī)蓋案宣判,法院:不涉及虛假宣傳銷售欺詐

DeepAuto車探
2026-03-02 11:45:43
朝鮮閱兵式現(xiàn)場(chǎng)大將僅剩5人!戰(zhàn)略軍直接被裁?

朝鮮閱兵式現(xiàn)場(chǎng)大將僅剩5人!戰(zhàn)略軍直接被裁?

IN朝鮮
2026-02-28 10:45:32
沙特瞞天過海?中東戰(zhàn)火再燃,中美都被耍了

沙特瞞天過海?中東戰(zhàn)火再燃,中美都被耍了

咣當(dāng)?shù)厍?/span>
2026-03-02 20:47:41
伊朗前總統(tǒng)內(nèi)賈德的死亡消息被其家屬否認(rèn)

伊朗前總統(tǒng)內(nèi)賈德的死亡消息被其家屬否認(rèn)

財(cái)聯(lián)社
2026-03-02 13:25:39
小酒窩送董璇老師拉布布!滿墻手辦價(jià)值百萬,毫無張維伊生活痕跡

小酒窩送董璇老師拉布布!滿墻手辦價(jià)值百萬,毫無張維伊生活痕跡

查爾菲的筆記
2026-03-02 19:11:48
天道好輪回!小蘋果還是走上母親葛薈婕的老路,汪峰也是有苦難言

天道好輪回!小蘋果還是走上母親葛薈婕的老路,汪峰也是有苦難言

光輝與陰暗
2026-03-02 16:54:29
伊朗強(qiáng)援已到!以色列集結(jié)十萬大軍,關(guān)鍵時(shí)刻,普京對(duì)中國(guó)做承諾

伊朗強(qiáng)援已到!以色列集結(jié)十萬大軍,關(guān)鍵時(shí)刻,普京對(duì)中國(guó)做承諾

悅心知足
2026-03-02 20:27:53
扎心!農(nóng)村二三代已無形中陷入到天倫絞殺局,已無回頭路了!

扎心!農(nóng)村二三代已無形中陷入到天倫絞殺局,已無回頭路了!

裝修秀
2026-02-28 11:45:03
美國(guó)搞不好會(huì)玩脫,伊朗準(zhǔn)備發(fā)射不亞于東風(fēng)-17的航母克星。

美國(guó)搞不好會(huì)玩脫,伊朗準(zhǔn)備發(fā)射不亞于東風(fēng)-17的航母克星。

李博世財(cái)經(jīng)
2026-03-02 14:22:30
突發(fā),美伊沖突!全球金融市場(chǎng)巨震,最全沖突概念個(gè)股清單揭秘!

突發(fā),美伊沖突!全球金融市場(chǎng)巨震,最全沖突概念個(gè)股清單揭秘!

小白鴿財(cái)經(jīng)
2026-03-02 10:06:44
郭晶晶12歲女兒霍中妍最近火出圈了!她正臉照和奶奶朱玲玲有相似

郭晶晶12歲女兒霍中妍最近火出圈了!她正臉照和奶奶朱玲玲有相似

科學(xué)發(fā)掘
2026-03-02 16:32:35
深圳男子突發(fā)心絞痛,人送到醫(yī)院心臟就停了!停跳整整兩天!醫(yī)生用ECMO搶回一命!罪魁禍?zhǔn)子质撬?>
    </a>
        <h3>
      <a href=深圳晚報(bào)
2026-03-02 21:00:39
印度游客添亂,泰國(guó)悔悟:還是中國(guó)游客香

印度游客添亂,泰國(guó)悔悟:還是中國(guó)游客香

華山穹劍
2026-02-27 19:47:38
2026-03-02 22:08:49
軍武數(shù)據(jù)庫
軍武數(shù)據(jù)庫
軍事類興趣頻道,介紹各國(guó)武備
1142文章數(shù) 6459關(guān)注度
往期回顧 全部

科技要聞

榮耀發(fā)布機(jī)器人手機(jī)、折疊屏、人形機(jī)器人

頭條要聞

伊朗公布最新戰(zhàn)況 通報(bào)還披露內(nèi)塔尼亞胡行蹤

頭條要聞

伊朗公布最新戰(zhàn)況 通報(bào)還披露內(nèi)塔尼亞胡行蹤

體育要聞

“想要我簽名嗎” 梅西逆轉(zhuǎn)后嘲諷對(duì)手主帥

娛樂要聞

美伊以沖突爆發(fā),多位明星被困中東

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

油價(jià)飆升 美伊沖突將如何攪動(dòng)全球經(jīng)濟(jì)

汽車要聞

國(guó)民SUV再添一員 瑞虎7L靜態(tài)體驗(yàn)

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

本地
親子
房產(chǎn)
手機(jī)
軍事航空

本地新聞

津南好·四時(shí)總相宜

親子要聞

姐姐比弟弟大6歲,有個(gè)弟弟真好,能給姐姐撐腰了

房產(chǎn)要聞

方案突然曝光!??诒睅煷蟾叫#钟袝蟊P殺出!

手機(jī)要聞

小米17 Ultra徠卡版黑銀色預(yù)售:徠卡設(shè)計(jì)師親自操刀 7999元起

軍事要聞

美國(guó)中央司令部透露對(duì)伊朗動(dòng)武全部武器裝備清單

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