<cite id="ffb66"></cite><cite id="ffb66"><track id="ffb66"></track></cite>
      <legend id="ffb66"><li id="ffb66"></li></legend>
      色婷婷久,激情色播,久久久无码专区,亚洲中文字幕av,国产成人A片,av无码免费,精品久久国产,99视频精品3
      網易首頁 > 網易號 > 正文 申請入駐

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

      0
      分享至

      最近在監理一個項目,因此也就看了一群程序員寫的代碼。簡單的說感受,現在很多程序員就是一群造糞機器,寫的代碼就是一坨屎,臭不可聞。

      當然了,從軟件工程學、項目處理甚至于成本考慮,這群程序員做的程序并沒有什么問題。但從長遠考慮這是一個劣幣驅逐良幣的過程,而且現在的良幣已經被驅逐得差不多了。

      早上和這群家伙開會,會議上說的話有點重——“你們每行代碼都是對行業的侮辱!”



      為什么生這么大的氣?這是一個很小的項目,卻引入了30多個pip庫,最后卻卡在了一個質數判斷的問題上。



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

      于是就出現了這樣的代碼:

      def is_prime(n):if n <= 1:return Falsefor i in range(2, n - 1):if n % i == 0:# 找到了一個除數,不是質數return False# 循環結束,沒有找到除數,是質數return True

      這行代碼對不對呢?理論上是沒有錯誤的,畢竟,當初上學的時候大多數老師會這么教的,這段程序完美的展現了上學的時候老師說的“指在大于1的自然數中,除了1和該數自身外,無法被其他自然數整除”的質數最基本含義

      顯然,這比很多只會用python這種膠水語言無腦粘接各種庫的程序員強了那么一點點。

      不過,這件事依然不對,W君就說了一句“你們再想想”。

      于是代碼就改成了這個樣子:

      def is_prime(n):if n <= 1:return Falseif n == 2:return Truefor i in range(2, n - 1):if n % i == 0:# 找到了一個除數,不是質數return False# 循環結束,沒有找到除數,是質數return True

      程序員小A的說法是當n=2的時候,for循環實際上是沒有執行的,于是程序員小B則進一步跟進還得加上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:# 找到了一個除數,不是質數return False# 循環結束,沒有找到除數,是質數return True

      W君當時就氣笑了,說了一句“你們離真相更近了一步”,于是幾經討論,他們拿出來了這個!

      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個數字,不妨這樣寫。緊接著W君就說了那句“你們每行代碼都是對行業的侮辱!

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

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

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

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

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

      這時候小A在說,這么牛,難道這是軍工級的代碼嗎?

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

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

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

      理論上這是最快的方式,當然了,這僅僅是在理論上,2693408940展開為二進制為:10100000100010100010100010101100,在從低向高的質數位上放“1”,其余非質數位置上放0。我們只需要把這個二進制串直接移動n位就可以對應到是不是質數的判斷上。

      最多4個CPU時鐘周期就可以判斷完畢這個數字n是不是質數。

      而對于上面的“軍工級的代碼”查表法則需要大約2000多個時鐘周期才可以完成。

      但是誰腦子抽了才會用python算這么大的數字來移位計算呢?python根本不擅長這樣的操作。

      反而,反直覺的操作會更快:

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

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

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

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

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



      那么到了代碼層級,就遠遠不是前面寫了一兩行代碼這么簡單的事情了。

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

      你可能會覺得這種說法有些裝,但我告訴你,軍用代碼的世界和現在的商業程序猿們寫業務邏輯調API、對接數據庫的世界完全不是一個宇宙。

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

      與此同時,你的代碼還要具有極強的可讀性和可驗證特性。

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

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

      上面這種商業程序員認為的“軍工級代碼”實際上根本就是錯誤的

      原因在于哪個大聰明給你的這個“2693408940”數字,你說從低到高凡是質數的位上都是1就是這個“2693408940”的數字了嗎?有沒有缺掉某個數字?是不是在原理上沒有錯誤?

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

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

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

      同時,這段代碼的可維護性為0,如果哪天質數定義范圍改了,誰知道這段代碼還對不對?戰爭都開打了,還讓數學家來證明和定義具體哪個數字是質數嗎?

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

      所以,如果是一個軍工級代碼應該怎么寫呢?這樣

      #include #include #define PRIME_TABLE_SIZE 32Ustatic uint8_t prime_table[PRIME_TABLE_SIZE]; /* 0 = false, 1 = true *//* 判斷一個數是否為質數(布爾邏輯) */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;    }}/* 驗證表正確性 */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;}/* 接口函數 */bool is_prime(uint8_t n){    if (n >= PRIME_TABLE_SIZE) {        return false;    }    return (prime_table[n] == 1U);}

      首先,在代碼中并不會存儲一個不知所云的數字,例如“2693408940”,而是利用“prime_table_init”函數在初始化的時候生成這個質數列表。同樣,在生成后還需要對列表進行驗證(prime_table_verify),以確保在生產的過程中出現錯誤。

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

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

      那么為什么ADA更適合軍用代碼呢?如果我們把C語言轉成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;

      大部分的內容都是平鋪直敘接近于自然語言所書寫的。在這種狀態下即便是一個沒有太多程序經驗的審計人員也可以很迅速的理解這些代碼所代表的含義。這在軍用系統中十分重要。

      當然了,也正是有各自初始化和驗證的過程存在。軍用系統的啟動往往是這樣的:



      慢慢的一部分一部分的打開,相當具有“儀式感”。

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

      特別聲明:以上內容(如有圖片或視頻亦包括在內)為自媒體平臺“網易號”用戶上傳并發布,本平臺僅提供信息存儲服務。

      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.

      相關推薦
      熱點推薦
      油價大降1.72元/升,近3年最大下跌,油價降入6元時代后重新上漲

      油價大降1.72元/升,近3年最大下跌,油價降入6元時代后重新上漲

      豬友巴巴
      2026-02-14 15:50:03
      宋美齡價值2億的麻花手鐲,戴到離世:第一任主人僅花費4萬大洋

      宋美齡價值2億的麻花手鐲,戴到離世:第一任主人僅花費4萬大洋

      史之銘
      2026-01-13 22:55:09
      C羅又給人出難題!沙特聯賽現在很尷尬,拿一座冠軍體面離開?

      C羅又給人出難題!沙特聯賽現在很尷尬,拿一座冠軍體面離開?

      足壇劉脂導
      2026-02-15 17:18:34
      老板都是怎么把自己生意干黃的?網友:29.7收30,三個月不到就黃了

      老板都是怎么把自己生意干黃的?網友:29.7收30,三個月不到就黃了

      另子維愛讀史
      2026-02-02 21:22:54
      中日開戰可能性增大,但收場太難,若真動手,中方估計半步都不退

      中日開戰可能性增大,但收場太難,若真動手,中方估計半步都不退

      百態人間
      2026-01-03 16:42:15
      《白鹿原》里的兩家大戶,日常只吃油潑面,首富就這種水準?

      《白鹿原》里的兩家大戶,日常只吃油潑面,首富就這種水準?

      收藏大視界
      2026-01-25 17:56:42
      原來世界上真的有長得很標準的東西!網友:白色的云越看越紅!

      原來世界上真的有長得很標準的東西!網友:白色的云越看越紅!

      夜深愛雜談
      2026-02-02 18:29:01
      新研究發現:40至50歲人生“最吃力”的10年,只是成為朝氣蓬勃老年人的開端

      新研究發現:40至50歲人生“最吃力”的10年,只是成為朝氣蓬勃老年人的開端

      紅星新聞
      2026-02-14 17:24:14
      當第一次帶對象回山里老家時!我要笑死在評論區

      當第一次帶對象回山里老家時!我要笑死在評論區

      另子維愛讀史
      2026-02-13 19:35:51
      關鍵轉折!80歲華人女司機撞死蘋果高管一家四口,可能不用坐牢

      關鍵轉折!80歲華人女司機撞死蘋果高管一家四口,可能不用坐牢

      華人生活網
      2026-02-15 05:11:08
      一個非常不好的消息:中國超2億獨生子女面臨的非常嚴峻問題。

      一個非常不好的消息:中國超2億獨生子女面臨的非常嚴峻問題。

      百態人間
      2026-02-05 15:39:14
      姚晨新造型翻車,穿的像體操運動員賊顯壯,她和造型師有仇嗎?

      姚晨新造型翻車,穿的像體操運動員賊顯壯,她和造型師有仇嗎?

      東方不敗然多多
      2026-02-08 09:33:57
      蒸發8300億!原來是因為AI找到了500個連人類都找不到的致命漏洞

      蒸發8300億!原來是因為AI找到了500個連人類都找不到的致命漏洞

      李博世財經
      2026-02-13 14:26:29
      哈里王子新照很憔悴,眼神空洞表情悲傷,隔空請求威廉王子諒解

      哈里王子新照很憔悴,眼神空洞表情悲傷,隔空請求威廉王子諒解

      原夢叁生
      2026-02-15 10:38:47
      倒打一耙!小泉進次郎沒提中國,但句句不離中國

      倒打一耙!小泉進次郎沒提中國,但句句不離中國

      觀察者網
      2026-02-15 16:18:06
      哈佛大學驚人發現:壽命長的人,從來不是靠多運動,而是這幾點!

      哈佛大學驚人發現:壽命長的人,從來不是靠多運動,而是這幾點!

      劉哥談體育
      2026-02-14 22:08:45
      三亞天涯區轄區海域發生一起兩摩托艇碰撞事件,致1死1傷

      三亞天涯區轄區海域發生一起兩摩托艇碰撞事件,致1死1傷

      界面新聞
      2026-02-15 17:11:10
      原來這就是暗示性求助,警惕!

      原來這就是暗示性求助,警惕!

      另子維愛讀史
      2026-02-14 21:50:58
      比中國還大的西伯利亞,一年“冬眠”七個月,當地居民如何過冬?

      比中國還大的西伯利亞,一年“冬眠”七個月,當地居民如何過冬?

      阿諢體育
      2026-02-15 09:48:26
      銀行員工:若你60-80歲了,一定要停止存款,原因讓人意想不到

      銀行員工:若你60-80歲了,一定要停止存款,原因讓人意想不到

      王二哥老搞笑
      2026-02-12 11:18:57
      2026-02-15 18:51:00
      軍武數據庫
      軍武數據庫
      軍事類興趣頻道,介紹各國武備
      1140文章數 6460關注度
      往期回顧 全部

      科技要聞

      發春節紅包的大廠都被約談了

      頭條要聞

      杭州女子5年前在醫美機構充值8萬 5年后尷尬了

      頭條要聞

      杭州女子5年前在醫美機構充值8萬 5年后尷尬了

      體育要聞

      最戲劇性的花滑男單,冠軍為什么是他?

      娛樂要聞

      河南春晚被罵上熱搜!大量廣告滿屏AI

      財經要聞

      誰在掌控你的胃?起底百億"飄香劑"江湖

      汽車要聞

      奔馳中國換帥:段建軍離任,李德思接棒

      態度原創

      數碼
      家居
      旅游
      時尚
      本地

      數碼要聞

      存儲芯片漲價壓力來襲:消息稱蘋果已接受鎧俠閃存漲價100%

      家居要聞

      中古雅韻 樂韻伴日常

      旅游要聞

      連嗨三天!國際舞者快閃登陸天安千樹,還有半馬蘇河市集,新春打卡必去!

      推廣中獎名單-更新至2026年2月3日推廣

      本地新聞

      下一站是嘉禾望崗,請各位乘客做好哭泣準備

      無障礙瀏覽 進入關懷版