百科问答小站 logo
百科问答小站 font logo



如何写出军工级的代码? 第1页

  

user avatar   bei-ji-85 网友的相关建议: 
      

看到有人提到友商的系统了,作为竞争对手我也来说两句:

军工(和航天)代码没那么神秘,就是需要准守一些特定的规范,规范就是

@高天

的回答里写的那些。

简单点说,就是整个操作系统的运行必须是确定的:

不能有动态内存分配,不能有动态任务创建、删除……总之一切不确定性的东西都不允许有;

很多人都只有x86的CPU有个超线程的概念吧,一个核上跑两个线程,但超线程会影响两个线程执行的确定性,在军工航天领域,超线程必须关掉;

现代操作系统都支持虚拟内存吧,但缺页中断的执行时间是不确定的,所以必须关掉虚拟内存,必要的时候关掉页表也是可以的。

代码的确定性可以大概理解为:如果天上有个卫星,上面的OS某个任务跑了10秒,地面上有一个一模一样硬件配置的计算机同样的OS,也跑了10秒,在输入状态一致的情况下,两个计算机里的东西应该是一模一样的。

军工航天类的代码要求的规范和限制比较多,比如必须符合某某规范才能在飞行器上使用(具体的看这个回答:

如何评价中航计算机所研制的天脉操作系统? - 嵌入式系统

)等等。

要求多并不意味着代码质量一定很高,因为要求多、限制多,代码往往看起来比较奇怪。而且由于历史原因,如果一个代码能工作,轻易是不允许改的,改动代码要经过的审查流程往往比改代码麻烦多了。比如现在个人电子市场早就进入64位时代了,但军工航天领域很多还是32位的,这些代码要是放到64位系统里肯定挂,但因为军工航天不需要这些,所以就不能改,也不需要改。

不要对军工代码有什么神秘感,其实一点都不神秘,就是要求多,测试严,审查多。在规范允许的范围内,代码写的再烂也没关系。

另外,由于code review是要花钱的,所以代码一般都不长,否则对于OS厂商来说,code review的成本就太高了(注:第三方公司负责review,一行大概几美元)。

美国军工行业用的Integrity是GreenHills的,这个公司要求所有写代码的人必须是美国公民或者持美国绿卡的人,公司不大,全靠国防部养着,我估计知乎上没有人能说清楚具体的细节。

国内大部分用的是VxWorks的改版,说是改版,可以理解为合理的学习、复制等等,安全性倒不是问题,因为能拿到的东西都是有源码的,细节就不展开说了。

如果题主对军工代码有兴趣,可以先研究一下ARINC的规范,这东西跟军工上用的差不太多,不过要找到能支持这种规范的开发环境就很麻烦了,有兴趣题主可以自己构造一个,难倒是不难,就是用起来很不舒服。


user avatar   minmin.gong 网友的相关建议: 
      

F-35 (JSF)的C++编码规范,拿去,不谢

stroustrup.com/JSF-AV-r

user avatar   zhang-chun-song-30 网友的相关建议: 
      

之前有个人和我撕,我说当年东风5上用加法累积求和来替代乘法运算减少运算量,当年背景数字计算机才刚应用,有个人不信说一个乘法器就可以解决问题,数字电路还搞不定一个简单的乘法运算,当时我也不知道怎么反驳,最近在看工程控制论时候才发现,里面的确有提当年(书出版年代已经是80年代)因为数字计算机运算能力太弱,简单的微分积分也要进行变化让计算机能够运算,东风5研制的年代是60年代,那个时候的数字计算机运算能力能用现在的计算机眼光能衡量么?数字计算机一般是只有加法和减法的指令的,靠数值算法实现微分和积分,不是么?
具体的不清楚,不过可以说几件小事情,就当是分享下(本来以为没人看的,但是这二天收到几十个感谢和点赞,还是挺感动的,会继续添加更新补充,欢迎关注)
注:最新消息,就在上周四,阿波罗11号登月源代码正式对外公布!有兴趣的同学可以看看!
1 很多人都以为全世界写代码最多的企业是微软,其实不是的,是洛克希德马丁,下属的一家信息部门写的代码总行数超过了微软。
2 写军工代码也要考虑版本迭代问题,比如洛克希德马丁的F35项目,其系统代码行数远远超出最初设计行数,软件包臃肿,并且版本修改了很多次,原因是因为F35要同时满足空军和海军的需求,满足不同的使用环境,后期出了很多不可控因素,导致系统需要兼容很多使用环境,据说F35的软件代码量是至今为止的军工项目中量最大的。
3 军工项目,尤其是在航天领域,一旦在任务进行中,一个BUG出现的结果可能就是火箭发射失败或者是太空任务的失败,虽然也能进行远程调控,但是仍然要杜绝在软件的最终版本中出现bug,保证是零bug的,当然了某些原因需要养bug以好给自家的技术支持人员混口饭吃,我不想说什么,因此执行航天任务的代码私以为首先要保证高可靠性,否则要远距离进行代码的调试和修改,是一件多么困难的事,日本的H2B火箭、欧洲的阿丽亚娜4火箭、美帝的宇宙神和那个spacex的火箭等,都出现过因为控制系统的一个BUG出现,导致最后火箭发射失败,貌似我们国家航天领域的控制系统都是用的VXWORKS(f当然了,是我们拿到了源代码然后改过了),即使除了军工领域,很多民用领域也有这种要求,例如现在的无人驾驶汽车,完完全全可以按照军工编码标准来要求,要做到零BUG,一个BUG可能就是车毁人亡。
出于航天任务的特殊性和高可靠性,航天领域的OS内核都有任务调度,支持优先级任务抢占,支持任务的中断,尤其是实时性,OS必须能够保证快速响应任务,具体体现在
1)能够在规定的时间内对任务作出响应
2) 可以调度一切资源来完成任务
3)可以控制实时任务间的同步

在这里岔开一段,在我印象中最深刻的一次航天任务就是阿波罗登月,关键部分就是阿波罗飞船在月球上空控制登月舱降落,这对任务实时性有极高要求,降落的过程必须严格控制时间,稍微有点差错登月舱就会直接砸到月球上,而且那个年代,还用的汇编语言,难度可想而知。

4 看到其他答案都是从航天领域来讲的,就想到一点,NASA的CIP,协作式信息管理系统(Collaborative Information Portal)有兴趣了解详细内容可以在下面评论告诉我,我会补充
5 军工领域,例如航空领域,四代战斗机(新标准,即传统的三代战斗机)的标配有一项就三轴四余度飞控系统,这个对软件要求很高,那我们当年是怎么解决这个问题的呢,其实部分原因就是当年的珍珠和平计划,歼八2 改项目虽然最后失败,但是当年的中国技术人员也是通过这个项目才接触到当年的先机战机信息系统该怎么做标准,怎么编写相关的操控软件,美帝还是给了很大的帮助的,然后我们就自己搞出了四余度飞控系统。(当然以色列也有部分帮助)
6 至于那个高票答案说的B1B的INTEGRITY系统代码一直被沿用,被后面的F16,B2,F22等沿用,其实原因也很简单呀,因为美国的军工体制下,不是说一家军工企业获得一个项目,所有的工作都在这家企业完成,而是分包制度,比如说F16,虽然说是洛克希德马丁的产品,但是F16下面的很多子系统被分包给了其他的企业,雷神也参与了、波音也参与了,这样子做的目的就是一方面不让出现一家独大,饿死其他企业,另一方面也能控制和降低成本,最大化利用现有技术,可能美国很多的战斗机上的系统就是一家系统承包的,例如雷神(不一定,我只是打个比方),在这种情况下,一个系统被用了几十年也是很正常的,更何况F16/F22/F35三个项目都是洛克希德马丁作为承包商承包的,沿用一种战斗机操控系统不是情理之中么。
7 在我心里,其实挺佩服毛子写的军工代码的,为什么呢?因为毛子的军工领域,有很多模电部分就算了,带数电和计算机的,其运算能力也是弱的可怜,内存还是停留在几M甚至几百KB的程度,要在很弱的硬件水平下完成高要求作战任务,这对代码就有要求了,如何能在保证任务前提下写出最简洁的代码,举几个简单的例子,苏俄的S-300系列防控系统,因为要求雷达能够同时跟踪大于N个目标,并且同时控制N枚导弹,这对数据处理要求比较高,但是S300系统里的计算机配置却很弱,真的很弱,但是毛子却能够做到这一点了,S300算是世界上最好的防空导弹系统吧?再看看爱国者那个计算机配置,好的不是一点点,相同的还有现代级驱逐舰,整个控制系统的是一台很大很老占了一个舱室的计算机控制,但是同样的这台计算机运算能力也是弱的可怜,但就是这么弱的计算机要负责为现代级的雷达系统、火控系统等提供运算,毛子的技术人员是怎么为这些系统编程的,相比较之下美国的伯克级上的宙斯盾系统采用的计算机配置,不能说最顶尖,但是远远的甩毛子一千条街。
8 印象中,写代码比较厉害的几家军工企业,除了洛克希德马丁,其次还有雷神公司,美国的大部分导弹就是出自雷神系统,还有部分轰炸战斗机的控制部分也是由雷神操刀,法国的达索公司,英国的BAE集团,编程水平都挺可以的。
9美国的X 47B无人机在航母上自主起飞,据说那家无人机的系统代码行数是1700万行(具体的还有待考证,有知道的欢迎指正)
10再讲一个小细节,当年的SU27引进回来后,我们想使用国产武器,但是问题来了,苏27的火控系统无法支持国产武器,系统完全不兼容,如何我们硬是把整个系统给换掉,又会导致其他问题,没办法换系统,当时的解决办法,就是逆向破解系统,弄到系统源代码,可是我们不可能找俄罗斯帮忙的,俄罗斯怎么可能会帮我们做这种事呢?后来怎么解决的,恩,毛二乌克兰出现了!神奇的乌克兰,帮助我们逆向破解了系统,然后那批苏27也能使用国产武器了。
11 其实一家先进战斗机的气动性能,除了取决于气动外形设计,还有一点就是要有一套先进的飞控软件,苏式战斗机通过无限挖掘气动外形潜力,其三代战斗机苏27拥有很高的机动性能,但是,美国的战斗机,在气动外形这一块并没有刻意追求,而是在飞控软件上下功夫,最典型的就是F22,宝石柱信息系统在当年是超越时代的存在,即使放到现在也一点也不落后,在飞控软件和大推力矢量发动机的帮助下,F22能作出许多逆天的飞行动作,比如我们的歼20,飞控软件也一定很复杂吧,为什么苏联和俄罗斯搞5代战斗机没有做鸭翼,隐身和气动性能是一点,还有个原因,这对飞控系统要求太高太高,对计算机的运算能力要求又高,而当年苏联的计算机普遍黑大粗,放在地面和舰艇上这一问题还不突出,但是在狭小的飞机上,这一问题就很致命了,我想这也是苏联的飞机设计过于追求外形设计而不是在飞控系统上下功夫的原因之一,苏联和俄罗斯的技术人员编程能力我觉得是绝对可以的,俄罗斯到现在的编程水平也不用怀疑,但是再好的代码也不能弥补硬件上的弱势吧。
12 导弹这块,嵌入式编程这块,导弹的一个核心部件就是导航控制系统,又要谈到苏联和美国的比较了,可以发现一个现象,苏联的导弹普遍做的比较粗大,无论是洲际导弹、弹道导弹、还是反舰导弹、地空导弹、空空导弹等等,基本上都要比美国的粗大一点(不是绝对),原因除了苏联追求大射程和威力外,还有一个很现实原因,苏联的电子水平(又是这个梗),很多型号的导弹还在用模电,体型普遍要比数电做的要大一号(但是模电的好处就是稳定,不怕核辐射,苏联人就是这么想的),而苏联,还在苦苦的执着于模电,一直到苏联末期才开始搞数电,这在大型导弹上还不吃亏,但是空空导弹、地空导弹等对体积有要求过高的地方,问题就很严重了,但是苏联人另辟蹊径,用了一个挺巧妙的思路,就是把导弹捕捉的数据信号统统的传回到地面计算机,让地面计算机进行运算处理再返回给导弹,如今有的小型机器人也是这样子做的,这样就解决计算机占导弹内部体积的问题了。
然后苏联这一方面做到极致的就是SN-A-22花岗岩反舰导弹,同时发射N枚,其中一枚作为控制导弹弹,承担主要的运算工作,将数据传输给剩下的导弹,来发动攻击,颇具有人工智能的感觉,但是具体怎么通过编程做到的,就不得而知了,但是这种导航控制,的确很巧妙。
所以我想到,现在的嵌入式领域,很纠结于体积、处理器运算能力、和能耗问题,也可以借

不一定要很复杂、很高明,但可以做的很巧妙。
14 岔开一个话题,其实早年因为硬件问题,军工领域因为作战环境的特殊性对硬件本身要求偏高要保证寿命、抗过载和辐射等,导致硬件性能过低,内存和存储容量小的可怜,运算能力也弱,苏联早年选择模电路线也是有原因的,所以军工领域的OS和软件都是专门编写的,内核要做的精简、软件要编的简洁,例如那个VXWORKS,内核做的很小,但是到了90年代往后,军工领域开始出现一个趋势,就是直接采用商业货架产品,意思就是说直接用商业的计算机硬件,硬件性能上涨带来的一个结果就是OS和软件也能做的更大,例如有把linux内核裁剪过来用的军工产品,比较有代表性的就是阿利伯克级驱逐舰,较新的批次上的计算机和服务器是直接用的戴尔的货架产品,带来的一个好处就是计算机整个运算性能得到提升(还有成本降低什么),宙斯盾系统的软件也做的越来越复杂,包括支持拦截弹道导弹,F35上的很多计算机也是拿的民用商品,说这点的意思就是,军工级别的代码标准也不会是一成不变的,随着硬件性能提升,当年的标准或许就不使用了。
15 再讲一个有意思的小细节,其实大家知道最早的计算机是为了二战时候为了支持弹道运算诞生的,那最早的操作系统出现也是有原因的,当年苏联搞出了洲际导弹,美国为了应对搞出了拦截导弹,那个年代要拦截导弹必须要进行复杂的运算、计算机要连接和处理雷达数据、控制引导导弹发射跟踪和通信系统,需要连接几个单元,在那个局面下,最初的那种没有操作系统、还要采用计算机指令和汇编语言的计算机显然不能满足任务需求,然后美帝的技术人员搞出了最早的最原始的那种操作系统,虽然用现在眼光看,已经low的不行,但是那个年代的确实实在在解决了问题,虽然最后那个防空导弹项目也失败了。
苏联那边也差不多,搞出了橡皮套防空系统,也是带OS的计算机在背后控制。
自己总结下军工代码的要求
1 可靠性是第一位,因为战场上,一个bug的出现代价可能就是死亡,即使在民用领域,我们也应该严谨要求自己。
2 能够根据设计目标和任务要求来制定代码的要求,尽量做到满足任务的需求特点。
3 军工级别的代码,也不用做的很高大上,也不用一定要用到多高大上的编程技巧,但是编程思路可以灵活一些、巧妙一些,如何在保证前面二点的要求下用巧妙的思路最好的解决任务要求,不一定非要偏执于一条路这也是军工代码给的一些启示。


user avatar   gao-tian-50 网友的相关建议: 
      

INTEGRITY 178B,最开始为了B1B(核弹轰炸机)设计,后来被用作B2,F16,F22,F35(都是战斗机)的操作系统,再后来也被用于民航(787 A380)的操作系统。这是我们公司(Green Hills Software,我们sponsor h1b,欢迎广大在美国读CS的同学前来应聘!简历可以发到我的邮箱gaotian@ghs.com或者公司招聘邮箱jobs@ghs.com,私货夹藏完毕!)的一个产品。

迄今为止唯一一个过了EAL 6+的软件(应该绝后了,因为6+好像由于太难达到取消了)。

有人说军工软件比较low,从科技进步的角度说,这是毫无疑问的。拿INTEGRITY 178B来说,这个操作系统没有动态分配内存的功能,没有动态分配address space的功能,没有动态增加task的功能。scheduler里面提前分配好了每个task可以占用的时间,甚至包括所有的中断可能占用的时间。这种OS的效率可以说低得令人发指。更不要说这个OS根本没有什么USB啊蓝牙之类的driver了。

然而从另一个角度说,这是一个无比先进的技术。现在的OS大多是priority分配,任务有优先级。而优先级分配资源的特点在于,只保证最高优先级task的资源。换言之,当你最高优先级的task开始吃资源(内存泄漏或者死循环)时,基本上其他task就废掉了。而这种情况在飞机上是不允许出现的。说30ms需要响应一次,就必须响应,晚了30ms飞机可能就掉下来了(尤其对于极其依赖发动机控制,空气动力学不稳定的战斗机)。而这种“低端”的操作系统,在设计的正确的情况下,是可以满足飞机需求的。毕竟战斗机飞行员不太需要在飞机上听歌。

而这个OS的审批过程也是历尽艰辛(毕竟是要上核弹轰炸机的),用一个过程来管中窥豹,这个OS给了NSA做白箱检查,也就是上交全部源代码,让他们找bug和vulnerability,是否会被hack,他们花了18个月,没有找到任何缺口,这才让用。对比一下,linux kernel大概是3天左右出一个 vulnerability(

Linux Linux Kernel : CVE security vulnerabilities, versions and detailed reports

, 感谢一下

@冰橙

指出的我的错误,和提供的链接)。

这个OS过了审批之后,再想修改其中的一行代码,需要层层上报,获得批准。绝不是一个approve from manager就完事的。当然这个OS似乎之后几乎没改过。

当然,这个操作系统,由于显而易见的原因,我是没见过的:)

他的兄弟,INTEGRITY的民用版,我是见过的。这个OS目前大量被用在汽车里做核心系统,据我了解toyota近几年的车应该都用的INTEGRITY。当然INTEGRITY也有很多其他领域的比较追求安全性而非效率和酷炫的用户,比如医疗器械之类的。

不过即便是INTEGRITY的民用版,我也没有commit code的资格。(而且似乎还限制卖到敌对国家(伊朗伊拉克朝鲜古巴还有。。你懂的。。)

当然了,这些故事都是我们老板在公开场合讲过的,又非常基础,太深入的东西我也不懂了,就算懂估计也不能乱说了,哈哈!


user avatar   gashero 网友的相关建议: 
      
“人情畏死,众人以死奉王,此天授也。“——《旧唐书·尉迟敬德传》

这个问题下面竟然没有人提尉迟敬德吗?

著名的“三次救主”了解一下?

第一次,李世民征洛阳期间亲侦敌阵猝遇单雄信,尉迟敬德横刺之落马:

因从猎於榆窠,王世充出步骑数万来战,贼将单雄信恃其骁悍,领骑直入,以趋太宗。敬德乃跃马大呼,横刺单雄信,中之。贼徒稍却,敬德翼太宗以出围,因率骑兵与王世充交战数合,其众大溃。擒伪将陈智略等,获排槊兵六千人。——《册府元龟·帝王部·推诚》

第二次,河北对阵刘黑闼期间,李世民为了营救李世勣身陷重围,尉迟敬德率领敢死队破围而出:

又从讨刘黑闼于临洺,黑闼军来袭李世勣,太宗勒兵掩贼,复以救之。既而黑闼众至,其军四合,敬德率壮士犯围而入,大破贼阵,太宗与江夏王道宗乘之以出。——《旧唐书·尉迟敬德传》

(李世勣:真正的名将敢于直面最黑的黑历史,“发现我的笑容成长在你哭泣里”就是写给我的没错。)

第三次,在玄武门当天射杀了正要勒住李世民脖子的齐王元吉。

太宗所乘马又逸于林下,横被所繣,坠不能兴。元吉遽来夺弓,垂欲相扼,敬德跃马叱之,于是步走,欲归武德殿,敬德奔逐射杀之。——《旧唐书·尉迟敬德传》

嗯对,之后“擐甲持矛”地去“保护”李渊的也是他,这个地球人都知道就不说了。

要说有什么“遗憾”的地方,大概就是不太符合题目中“无论兴衰”的要求,因为李世民没有给过尉迟敬德衰败的机会。

只有当唐军众将都怀疑尉迟敬德投降的诚意时,李世民会将尉迟敬德引入卧内,对他说:“大丈夫以意气相期,勿以小疑介意,寡人终不听谗言以害忠良”

当尉迟敬德果真救主报恩,李世民会在战斗结束憩于古丘的间歇,对他说:“天诱我意,福善有征,何相报之速也”

当闲来无事,李世民与玄甲军众将漫步汜水滨顺便考察敌营时,会独独对尉迟敬德说:“吾执弓矢,公执槊相随,虽百万众若我何?”

——贼见我而还,上策也。

惜字如金的史书从未记载那天天气如何,但是每次看到这句话,脑海里浮现出来的,一定是一个晴朗得可以奋衣而云翔,回雕戈于日光的四月天(别想多,真的是阳历四月。)

以及,当尉迟敬德回朝之后遭人构陷,被高祖李渊“下狱讯验,将杀之”,李世民会不顾自身亦处于猜忌之地,跑到高祖面前去“固谏”,终获保释。

这大概就应了那句著名的心灵鸡汤:没有人值得你为他去死,因为值得你为他去死的人是不会让你死的。


不过呢,在尉迟敬德的生平事迹中,最为传奇的不是三次救主,不是背锅逼宫,而是一场“无关生死兴衰的小事”:

王世充兄子伪代王琬,使於建德军中。乘隋主所御骏马,铠甲鲜华,出於军前。太宗眄之曰:“彼之所乘,真良马也!”敬德曰:“请往取之。”因与高甑生、梁建方两三骑直入贼军,擒琬,引其颈、持其肘以归。贼众无敢当者。——《册府元龟·将帅部·勇敢》,并《旧唐书·尉迟敬德传》

没错就是这个虎牢关决战当天「阵前夺马」的故事。

之所以说这个故事最为传奇,是因为:

战场厮杀,是将军之职;

临危救主,是部下之命。

“阵前夺马”属于哪一种???

若说“两军对阵,气势为先”吧,然而先声夺人可以有无数种方式,比如窦建德派人来“请选锐士数百”先小试一个回合的时候,就可以陪他玩玩嘛!何必非要选择如此高难度如此挑战想象力的玩法?

这就好比什么呢?

最初读到这个故事的时候,正值红得发紫的小甜甜布兰妮刚刚发表了《Oops I did it again》(暴露年龄系列)。其中间奏部分有一段对白是这样的:

  • 男主:Britney,我有东西要送给你。
  • 小甜甜:哦,好漂亮……等一下,我记得那老太太不是把它给扔到海里去了吗?(冰山撞船梗,指露丝将“海洋之心”丢入海中)
  • 男主:是的,我下去帮你找回来了。
  • 小甜甜:Oh you shouldn't have…

当年尚不能理解歌词的我,听完之后满脑子就记住了这一个经典句型 "Oh you shouldn't have~~~"

你品,你细品。

“岂可以一马丧猛士?”——李世民如是说。

实际上心里是不是甜到爆炸就不知道了。


所以我也很能理解为什么后来尉迟敬德会变得那么轴,直至在国宴上因为座次问题当着李世民的面大打出手。

天下太平已久,那一段“只要敢冲上去干仗就能牢牢占据主君身边最重要的位置”的日子一去不复返了,李世民再也不需要尉迟敬德为他栏枪夺马了。

这对于当年主君亲口盖章“天下有我们两个人就能搞定”犹在耳畔的人来说,的确很失落吧?

好在后人并没有忘记尉迟敬德。

北宋名臣田锡在其《鄂公夺槊赋》中用一句「非太宗不能得我之死力,非我不能赴太宗之指踪」高度概括了尉迟敬德的一生。直到现在这种认知依旧是大多数历史爱好者心中对尉迟敬德的形象注解。


这是某著名直男引战论坛前几天搞的投票贴,尉迟敬德如果泉下有知,想必会非常开心。




  

相关话题

  各种编程语言的成功/代表产品有哪些? 
  既然报个培训班就可以成为码农,那学计算机专业有什么用? 
  高中就已经写过 10w 行代码的人都是什么人? 
  句柄是什么? 
  为什么程序比较难写、bug 比较难调呢? 
  请问这段代码是什么意思,据说能让人月入过w? 
  汉语编程只需要学习几十个汉字就可以编程了,外国人为什么不能汉语编程呢? 
  为什么我们需要了解编程的历史? 
  码农们最常说的「谎言」有哪些? 
  如何才能创造一门世界顶尖的中文编程语言? 

前一个讨论
目前乌克兰局势动荡,乌克兰国内和附近国家(比如波兰)游戏公司们会受到影响吗?
下一个讨论
小卡德罗夫手下的车臣军队实力如何?这支军队与俄军关系如何?





© 2024-05-20 - tinynew.org. All Rights Reserved.
© 2024-05-20 - tinynew.org. 保留所有权利