学习Ada语言是否值得,而不是其他的语言[c++, c#]?

21

如果我要制作机器人,您会推荐我使用哪种编程语言?在我们的大学,我们可以选择几种编程语言。由于我们的老师使用Ada,大多数学生都选择了它。

经过一些调查,我发现Ada已经过时了。您有什么想法吗?学习它是否值得?


13
关于“旧”,Ada的最新版本是Ada 2012。 - NWS
1
为什么要用“instead”?为什么不用“alongside”? - user1804599
1
C++不算老吧?好吧,好吧,它比ADA年轻三岁。 :D - Jürgen A. Erhard
2
C++中的“++”与Ada的最早版本(1983年)一样古老。“C”部分更是比它早了十多年! - Zerte
你的老师使用Ada语言是选择Ada的最重要原因。他/她偏爱的语言是他/她最擅长教授的语言。 - TamaMcGlinn
C++用于嵌入式系统,C#用于Windows操作系统应用程序,Ada...这是一个观点。 - Cloud Cho
8个回答

34

是的,我个人认为Ada在两个常被其他编程语言忽视的方面非常出色:

  • 通用系统:包、函数和过程都可以是通用的。这对于实现DRY原则特别有效。当然,你也可以过度使用通用性,但我在其他语言项目中遇到的问题是,剪贴复制式编程似乎更为普遍(如果需要在代码某个位置修复一个bug,这会引入多个故障点)。
  • 本地多任务处理。语言级别的任务处理功能的优点之一是,多线程不会感觉像是“附加”在语言上的东西,也不会成为一种难以掌握的扩展,而是被整合到了语言中。

尽管如此,还有其他很好的理由去学习/使用Ada。其中一个理由是挑剔的编译器,通过这样的挑剔,它强迫你开始以自然减少编程错误的方式思考。(例如,在同一条件中禁止使用andor。)

另一个理由是子类型的概念;子类型与OOP中的对象相反,它不是随着派生越来越分散,而是随着距离基本类型越远,缩小类型(它可以接受的值)。{可以将其想象为适当集合;整数是你的基本类型,自然数是你的非负整数,正数是你的正整数...而且在Ada 2012中,你可以对子类型进行有趣的排除,例如是素数的子类型属于正数(对于最后一点我有些含糊,因为我还在学习2012版的内容)。}

使用Ada 2012,你还可以在你的子程序中设置前置和后置条件;仅此一点就可以使你的库更加稳定。 (像排除空指针一样)。


21

Peter Norvig的建议在这里可能很有用:

当被问及“我应该使用哪种操作系统,Windows、Unix还是Mac?”时,我的回答通常是:“使用你的朋友们在用的。”从朋友那里学习的优势将抵消任何操作系统之间或编程语言之间的内在差异。

十年自学编程指南

整篇文章都值得一读。

顺便提一下,Ada是我学过的第一门语言。学习Ada的一个主要优点是:没有人使用Ada,因此我不得不在做其他事情之前学习另一种语言,并因此获得了更多的视角。初学者程序员可能遇到最糟糕的问题之一是认为他们第一种语言中所做的事情就是“正确的”。学习新语言是容易且非常有价值的。


12
如果你的老师和大部分同学使用Ada,那么最好选择Ada。它是一种非常适合小型和大型程序的语言。它非常易读,并且在很多常见错误方面(在某种程度上)保护你。
Ada是用于软件工程的语言。正如darkestkhan所说,它不是一种“hack and hope for the best”语言。
Paul Stansifer的建议非常好:学习几种语言。确保你有足够的工具可供使用 - 不要限制自己只使用一种语言。学习不同语言带来的视角是非常有价值的。肯定有不止一种解决问题的方法 - 比如看看Haskell。你将获得全新的解决问题的视角。
语言语法是学习编程的最小问题。难点在于将复杂的现实世界问题建模为在编程语言的非常有限范围内有意义的东西。由于其强大的类型系统、任务模型、泛型和用于实时和并发编程的坚实工具,Ada非常适合这项工作。
既然你特别问到机器人技术,那么一个好书籍推荐可能是John W. McCormick、Frank Singhoff和Jerome Hugues所著的"Building Parallel, Embedded, and Real-Time Applications with Ada"。这是一本非常好的读物。 http://www.cambridge.org/gb/knowledge/isbn/item5659578/?site_locale=en_GB

8

Ada绝对值得一试。除了Shark8所写的两点外,还应该注意到几乎所有的编程语言都将重点放在书写简易性上,而不是阅读(大多数情况下,你只需要编写一次,但要进行多次阅读)。此外,围绕Ada的文化与主流有很大的区别 - 关注程序的正确运行和源代码的可读性,而不是“快速搞定并期望没有引入错误”的做法。

至于年龄 - 噢,拜托 - C语言甚至更老。语言本身的年龄有什么重要性呢?在谈论年龄成为问题之前,你应该先看看Ada 83中最初加入了什么(提示:主流语言直到90年代后半期才开始具备Ada 83的功能集合,并且许多功能[尤其是子类型]仍未被主流采纳)。另外,最新版本的Ada标准发布于2012年 - 如果你认为这已经太旧了,那我也不知道什么才算是“新”。


1
我有个想法,即即将到来的C++20标准在编译期检查能力方面可能会接近于Ada83。然而,基于控制流分析生成或不生成警告/错误的能力仍然缺失,似乎不太可能被添加。此外,C++的真正问题是你需要以某种方式禁止大量不安全的“遗留”结构,在最新标准之前这些结构是必需的。 - TamaMcGlinn

4

C++并不是一个新生的语言,它比Ada晚了十年。

更糟糕的是,C++和C#都是从C语言中派生出来的,而C语言实际上比Ada还要老十年。

C语言最初是为了让编译器的构建更容易(而不是程序员的工作),当时16KB的内存已经算是很多了,硬盘的大小只有工业级空调那么大。 C++基本上是在60年代后期的C语言上添加了面向对象的特性,而C#本质上是微软对C++进行了调整,使其更像Java。 从本质上讲,C#和C++实际上比Ada还要老。

现在有很多时髦的新语言需要学习(你应该在某个时候学习它们)。 然而,C++和C#并不是这些语言。


4
虽然 Shark8 对 Ada 作为一种语言有很好的评价,但是这个问题特别是关于机器人技术的。在这方面,我想说“不要费事了”。在超过10年的从乐高到最先进的机械臂和手的各种机器人经验之后,我从未见过使用Ada的机器人系统。
最终,机器人技术非常困难。如此困难,以至于你无法独自解决。这意味着必须利用现有的许多库和框架。这意味着你将使用它们的语言、接口等等。你的机器人系统可能包括大量代码,其中仅有一小部分是针对你特定应用的定制代码。虽然可能写一个 Ada 的小部分并编写适配器或接口使其与其它代码兼容。但我认为你会发现这需要很多工作,而且好处很少。
在开始新的机器人项目时,我采取务实的方法。我查看现有的工具、库和实用程序,并选择最适合我的需求的那一个。然后使用任何可行的语言来进行开发。95%的情况下是 C++ 或 Python。

8
在这种情况下,你的“务实”逻辑会支持使用Ada,因为这是老师和大多数其他学生正在使用的语言。 - T.E.D.
是的,机器人技术很难。这正是选择Ada语言的一个理由,因为它具有前置条件和后置条件来实现基于契约的设计(DBC,Bertrand Meyer开创了这一概念),以及其他工具来创建正确的代码,而不是快速复制粘贴编码混乱。我关注的人之一,Jack Ganssle,非常喜欢在嵌入式编程中使用Ada语言。 - MicroservicesOnDDD

3

相较于其他大多数编程语言,Ada更偏向工程化。与普通编程语言不同,Ada提供了强大的数据工程能力。也就是说,在Ada开发者开始开发算法之前,他们会先设计(工程化)数据。

Ada类型模型允许设计精确的数据。一个简单的例子是: type Channel is range 1..135;

在这个整数数据类型的每个实例中,都属于预设约束范围内的值。这极大地简化了使用这些实例的算法。

底层原则是,当数据被精确地工程化时,相关算法将会更加简单。这个特性在其他语言中很少见,在Ada中却是常见的实践。

通过支持这种数据工程化作为整个软件工程流程的子集,我们可以显着降低整体软件设计的圈复杂度。

我的例子只是Ada完整数据工程能力的冰山一角。然而,正是这种数据工程能力使它成为安全关键软件的最佳选择,在21世纪的软件环境中,这是它最常用的领域。


2

这取决于你想用这种语言做什么。Lisp比Ada还要古老,广泛应用于人工智能领域。学习你想要的语言,学习对你来说容易学习和理解概念的语言。然后你可以进一步学习更多的语言。


那么,我们将制作一些使用传感器、电机和其他电子组件的高级机器人。是否最好从例如C#开始学习,并完全掌握它,而不是学习一点Ada和其他语言的知识呢? - user1012032
4
@Alex90 - 你不可能只通过一两个小学校项目完全学会任何一门语言。 - T.E.D.
学习一门易于理解的语言,易于掌握其概念。在你的职业生涯中,每年学习一个你不了解的编程范式。学习一门简单的语言是很好的开始,但是克服更难的语言将教会你最多的东西,使你全面发展,并使你更具竞争力——你将成为更专业的程序员,致力于攻克困难问题,全面发展并不断投资自己。我推荐使用Factor和Lisp及其宏。 - MicroservicesOnDDD

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