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

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

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

0
分享至

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

當(dāng)然了,從軟件工程學(xué)、項(xià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ù)判斷的問題上。



事情很簡單需要判斷出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根本不擅長這樣的操作。

反而,反直覺的操作會(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)。在咱們國內(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)不是前面寫了一兩行代碼這么簡單的事情了。

軍工級(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)推薦
女孩在家被人打傷后續(xù)!被認(rèn)定互毆,警方回應(yīng),上門家長錄音克制

女孩在家被人打傷后續(xù)!被認(rèn)定互毆,警方回應(yīng),上門家長錄音克制

奇思妙想草葉君
2025-12-28 01:17:28
國家隊(duì)下令停職8年后,50歲孔令輝近況被曝,何止早年風(fēng)光不再

國家隊(duì)下令停職8年后,50歲孔令輝近況被曝,何止早年風(fēng)光不再

寒士之言本尊
2025-12-31 20:24:03
打世俗臉的婚禮:新娘是上海的主治醫(yī)生、博士,新郎是大廠高管

打世俗臉的婚禮:新娘是上海的主治醫(yī)生、博士,新郎是大廠高管

詩意世界
2025-12-31 17:04:37
財(cái)經(jīng)聚焦|跨年消費(fèi),場(chǎng)景煥新,有哪些新看點(diǎn)?

財(cái)經(jīng)聚焦|跨年消費(fèi),場(chǎng)景煥新,有哪些新看點(diǎn)?

新華社
2025-12-30 19:00:19
12月30日俄烏:精心包裝的謊言,遠(yuǎn)比不上澤連斯基的睿智

12月30日俄烏:精心包裝的謊言,遠(yuǎn)比不上澤連斯基的睿智

山河路口
2025-12-30 17:48:08
空砍新高40分,敗人品后遭迎面絕殺!你被交易甩賣真是一點(diǎn)都不冤

空砍新高40分,敗人品后遭迎面絕殺!你被交易甩賣真是一點(diǎn)都不冤

鍋?zhàn)踊@球
2025-12-31 16:13:58
俄羅斯再征召26.1萬人入伍,被澤連斯基說中了?

俄羅斯再征召26.1萬人入伍,被澤連斯基說中了?

山河路口
2025-12-30 19:36:45
特斯拉4680電池黃了!曾毓群早告訴過馬斯克:永遠(yuǎn)不會(huì)成功

特斯拉4680電池黃了!曾毓群早告訴過馬斯克:永遠(yuǎn)不會(huì)成功

智能車參考
2025-12-30 17:20:40
西安事變沒那么簡單,實(shí)際傷亡很大,蔣家多位子侄外甥為保蔣死亡

西安事變沒那么簡單,實(shí)際傷亡很大,蔣家多位子侄外甥為保蔣死亡

大千世界觀
2025-12-30 20:48:18
一女子竟將出軌丈夫多年珍藏卡片拿去拍賣......

一女子竟將出軌丈夫多年珍藏卡片拿去拍賣......

超級(jí)數(shù)學(xué)建模
2025-12-30 23:04:29
敗人品!北京某球迷私信怒罵CBA超級(jí)外援,布朗曬出冠軍戒指回懟

敗人品!北京某球迷私信怒罵CBA超級(jí)外援,布朗曬出冠軍戒指回懟

體壇野秀才
2025-12-31 17:02:01
終究是馬筱梅輸了,汪小菲深夜又睡不著了,凌晨發(fā)動(dòng)態(tài)和大S有關(guān)

終究是馬筱梅輸了,汪小菲深夜又睡不著了,凌晨發(fā)動(dòng)態(tài)和大S有關(guān)

最美的開始
2025-12-31 22:41:27
大消息!工行、農(nóng)行、中行、建行、交行、郵儲(chǔ),國有六大行集體宣布

大消息!工行、農(nóng)行、中行、建行、交行、郵儲(chǔ),國有六大行集體宣布

中國基金報(bào)
2025-12-31 16:26:28
多家國有大行公告:明年1月1日起數(shù)字人民幣實(shí)名錢包余額將按照活期存款掛牌利率計(jì)息

多家國有大行公告:明年1月1日起數(shù)字人民幣實(shí)名錢包余額將按照活期存款掛牌利率計(jì)息

澎湃新聞
2025-12-31 12:42:26
打臉了!《瘋狂動(dòng)物城2》破100億,《阿凡達(dá)3》破45億!

打臉了!《瘋狂動(dòng)物城2》破100億,《阿凡達(dá)3》破45億!

阿廢冷眼觀察所
2025-12-30 07:45:34
嘴上不捂裹腳布,人話才能得人心!蔣萬安上海演講虜獲無數(shù)大陸粉

嘴上不捂裹腳布,人話才能得人心!蔣萬安上海演講虜獲無數(shù)大陸粉

瑜說還休
2025-12-30 13:21:41
英超最新積分戰(zhàn)報(bào):曼聯(lián)爆冷,維拉潰敗,切爾西掉鏈子

英超最新積分戰(zhàn)報(bào):曼聯(lián)爆冷,維拉潰敗,切爾西掉鏈子

足球狗說
2025-12-31 06:27:16
這10個(gè)稀奇古怪的“宜家單品”絕了!一開始沒看懂,看懂后:真香

這10個(gè)稀奇古怪的“宜家單品”絕了!一開始沒看懂,看懂后:真香

美家指南
2025-12-31 20:42:19
魏延守了漢中15年,跟鐵桶似得,怎么到姜維手里一個(gè)月都扛不住?

魏延守了漢中15年,跟鐵桶似得,怎么到姜維手里一個(gè)月都扛不住?

大千世界觀
2025-12-29 20:25:57
上海:明起存量個(gè)人住房公積金貸款將執(zhí)行新利率

上海:明起存量個(gè)人住房公積金貸款將執(zhí)行新利率

澎湃新聞
2025-12-31 18:37:04
2025-12-31 23:52:49
軍武數(shù)據(jù)庫
軍武數(shù)據(jù)庫
軍事類興趣頻道,介紹各國武備
1139文章數(shù) 6464關(guān)注度
往期回顧 全部

科技要聞

老羅,演砸了,也封神了?

頭條要聞

快手稱打卡365天可領(lǐng)3650元 男子堅(jiān)持300天"被迫"中斷

頭條要聞

快手稱打卡365天可領(lǐng)3650元 男子堅(jiān)持300天"被迫"中斷

體育要聞

上海大勝遼寧5連勝 張鎮(zhèn)麟弗格戰(zhàn)舊主合砍28分

娛樂要聞

官宣才兩天就翻車?七七被連環(huán)爆料

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

高培勇:分配制度改革是提振消費(fèi)的抓手

汽車要聞

凱迪拉克純電中型SUV 售價(jià)不足24萬/33寸曲面屏

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

手機(jī)
藝術(shù)
親子
旅游
軍事航空

手機(jī)要聞

三星Galaxy S26 Ultra:藥丸相機(jī)島+圓角邊框,配置細(xì)節(jié)也清晰了

藝術(shù)要聞

中國博物館全書!看遍中國8000年頂流審美

親子要聞

以為只是孩子會(huì)得ADHD,沒想到啊,羅永浩自曝ADHD困擾

旅游要聞

好吃好玩更好看 跨年夜內(nèi)江“四方塊”太火爆

軍事要聞

沉浸式感受"正義使命-2025"演習(xí)現(xiàn)場(chǎng)

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