新项目是否适合使用Ada语言?

21

我们目前正在为基于Atom的航空电子设备开发一个非关键性移动地图导航通信解决方案。原型是用Python/Qt完成的,现在我需要决定用哪种语言来开发“真正”的应用程序:Ada还是C/C++?我已经是一名C++开发人员了12年,但对这种语言感到厌烦。Ada似乎很有前途,但我有点担心它的支持基础设施、可用库、开发者可用性等方面。这里有没有人经历过类似的情况?你们得出了什么结论?


7
不确定你是否会看到这条评论,但你最终选择了哪种语言?结果如何? - Erik Kaplun
5
我们将一些应用程序的核心部分移植到C++,其余部分保留在Python中。不幸的是,在我们拥有一个很棒的可工作驾驶舱设备之前,公司已经破产了。尽管没有取得认证,但通过小改动我们设法将它安装到了几个驾驶舱里。话虽如此,语言使用并不是我们最大的问题,而是Ipad和Android设备的冲击。 - zeroc8
7个回答

40

(一位Ada开发者的回复)

与其即将消亡的预测相反,Ada仍然非常流行。目前版本为Ada 2005Ada 2012的更新正在完成过程中。

随着工业界不断开发新的软件工程特性和实践方法,Ada继续进行现代化并加入这些特性。反过来也是如此--自1983年以来,内建并发一直是Ada的核心特性,而现代编程语言现在才开始采用这个功能。 :-)

并不是每一个新特性和实践方法都会被Ada采用,比如Ada不会变成一个函数式语言。但那些增强软件生产力、可靠性和安全性的特性会以与Ada的基础架构和意图一致的方式被纳入到其中。

当然,Ada并不是一种广泛使用的编程语言,但它有一支忠诚的开发者社区,他们几乎总是愿意帮助那些正在开发项目和学习该语言的人解决问题、提出疑虑和给予建议。资源包括StackOverflow(查看Ada标签)、comp.lang.ada,甚至Reddit等。

至于Ada开发者的可用性,这是一个“进退两难”的情况。由于它没有被广泛采用,因此开发者数量较少。由于开发者较少,公司不愿意在项目中使用它,而由于它不被用于项目中,开发者也不会寻找在其中的工作。

我可以证明,现在和过去有很多熟悉Ada编程语言的程序员喜爱使用它,并且会特别感兴趣为你描述的这种应用程序工作 - 如果他们知道它的存在。 如果您决定选择Ada,并且毫不掩饰地在Monster、其他广告平台或者含蓄地在comp.lang.ada或Reddit上发布Ada开发者的招聘信息,我相信Ada开发者的可用性会让您和其他怀疑者感到惊讶。

祝你的项目好运。


2
谢谢,我刚刚订购了《使用Spark构建高可靠性软件》一书,我期待着学习它。 - user478389
4
你在问题中提到这个项目并不是很关键。既然如此,你可能会觉得SPARK有些过头了——普通的Ada语言,可能通过使用样式指南或更多自动化工具,例如AdaControl(http://adalog.pagesperso-orange.fr/adacontrol2.htm),应该达到MISRA C标准的水平。http://www.adaworld.com/pdfs/misracandada.pdf提供了一个相当不确定的比较。 - Simon Wright
感谢提供的链接,非常感激。 - user478389
8
一个小错误:虽然Ada确实不是函数式语言,但我通常喜欢以至少半函数式的风格编写它。 Ada处理字符串和数组的方式强烈鼓励这种方法。 - T.E.D.
@Marc C. -- 你能谈谈Ada 2012吗?因为你是一位专业的Ada开发者,我想听听你的看法。 - MicroservicesOnDDD

14

我会提出我的想法。为了快速了解背景:我目前在一家大公司(不是洛克希德,但足够接近)使用Ada进行工作。我本质上是一名C程序员。(同时也用过C ++、C#和Java)

Ada是一种不错的语言。它具有一些你无法在C / C ++中得到的好东西。对于实时关键系统,它非常好。需要一点时间来适应,但学起来还是很容易的。

缺点是语言的认知度。我认识的大多数喜欢并选择Ada的工程师年龄较大(45+)。其中有两种程序员类型:那些真正擅长Ada并且能够正确应用的人,以及那些“了解”Ada但是按照代表70年代的老语言编写的方式/风格编程。这些优秀的Ada程序员在这里备受重视。要让小公司把他们抢走,我认为您需要向他们提供相当可观的报酬。他们拥有4-5周的假期,6位数的薪水(即使在生活成本较低的地方),以及各种福利。我希望这不会显得年龄歧视,但这就是实际情况,而且作为小公司需要考虑的因素之一。如果您在达拉斯/沃斯堡等主要科技区域,可能还可以。正如您在评论中提到的,大多数年轻程序员并不热衷于学习Ada。它可能薪水高、语言也不错,但市场价值和吸引力远远不及其他语言。

如果我开始一个实时嵌入式系统项目,我会只使用C(或者如果需要面向对象编程(OO)则使用C++)。对于嵌入式系统,实际上我更喜欢使用C,而不是C ++,因为根据我的经验,工程师们试图将嵌入式系统强制转换为OO,并使用因为这些功能存在而使用它们,但您的情况可能有所不同。使用C或C ++: 1. 有巨大的程序员人才池可供选择。 2. 几乎所有的工具都已经可以与之配合使用(许多是免费的)。 3. 在网上的资源几乎无穷无尽。

这将使您能够立即开始工作。如果你有机会使用像Green Hills和VxWorks这样的JTAG调试器,它确实可以加快开发速度。


13

一般情况下,如果您的程序没有任何并发,并且有一些C++(而不是C)库可供使用,则使用C++可能是比较好的选择。

然而,如果您的系统设计需要并发处理,那么Ada语言是一个巨大的优势,因为它本身支持并发。我曾经从事的一个项目实际上编写了一个完全可移植的实时调度器。我们将整个仿真(> 100KSLOC)从vxWorks移植到一个完全不同的供应商的Windows编译器中,仅用了大约2个小时(全部花费用于处理它们不同的源代码库系统)。

任何具有C链接的库在Ada中都可以很好地使用,尽管有时您可能需要编写绑定。这需要稍微多做一点工作,但通常您会发现,对于要处理的相同库的其他人已经完成了此项工作。例如,我认为所有Win32的绑定都是可用的。但是,编写新绑定足够简单,以至于我经常这样做,只是为了提供我更喜欢的接口。

Ada还具有一些功能,在我的看法中,使其成为低级系统编程的首选语言。例如,该语言允许您指定一个记录中每个字段的位置和大小。这在处理硬件或与其他平台通信的数据时非常重要。C++目前仅允许您指定每个字段的大小,而我正在处理它,发现这非常令人沮丧。

系统编程的另一个杀手级功能是,默认情况下所有的数组都进行边界检查。如果需要效率,您可以将其关闭,但默认选项是安全性。在我的看法中,这应该是默认选项。在C++中,如果您想要安全性,则必须费尽心思地自己编写代码,或者使用类似std::vector这样的更安全的类(并且仅使用.at()方法)。您见过多少次有人这么做?从来没有?我也是。



7

Ada并不是一种广泛使用的编程语言,部分原因是因为大多数程序员想要快速而简单的方法。只需看看微软的Windows操作系统即可。他们最初用C语言(以及少量汇编语言)编写了前几个版本。整个庞大的项目花费了两年时间才完成,而且即使现在它还很脆弱。病毒和蠕虫能够轻易地侵入系统,以至于他们正在试图避开在Windows 8中使用Win32 API接口。我相信如果操作系统改用Ada语言编写,那么它将比现在更加健壮和安全。


2
我知道这已经很老了,但是Windows的第一个版本,在DOS上运行时是用Pascal编写的。 - Luke A. Guest
我以为这是基础...;-) - MicroservicesOnDDD

5

您可以使用特定的编译指示符来限制语言中某些功能,这可能是使用 Spark 的替代方案。


4
如果你写航空电子软件,通常不能使用很多库。通常,必须遵循许多编码规则。例如,禁止使用递归函数或动态内存分配。因此,当涉及到认证(例如DO-178C)时,库会引起很多麻烦。
我更喜欢Ada而不是C ++,因为它可以防止许多愚蠢的编码错误。原则上,您可以使用Ada和C ++执行相同的操作。但是,您必须定义许多编码规则以符合认证要求,并且必须证明符合这些规则。
在Ada中也一样,但比C++更少工作量。

0

这是一个好问题。

我已经专业地使用Ada、C和C++编写了多年,对两者都很喜欢。

对于任何一种语言,无论是Ada还是C/C++,都可能变得难以理解。只要在编码实践中遵循纪律,就可以让代码保持清晰。

使用C/C++,您更有可能找到一个便宜的编译器和支持。只要在编码实践中遵循纪律即可。


这并没有提供问题的答案。您可以搜索类似的问题,或者参考页面右侧的相关和链接问题来找到答案。如果您有一个相关但不同的问题,请提出新问题,并包含此问题的链接以帮助提供上下文。请参阅:提问,获取答案,无干扰 - Alessio
不,这是一个与话题无关的问题,需要关闭。 - LittleBobbyTables - Au Revoir

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接