学习爱一个刚性和不灵活的语言

2021-06-19 20:25:59

我已经足够大,以记住1970年代中期的新电脑语言的稻草人,雪橇,锡曼,熨斗和钢铁公司规范的出版物 - 这是一种成为ADA的语言。几年后,我读了C. A. R. HOARE'在批评AGLOL 68的复杂性之后,他在新的ADA语言上击败了他的凝视:

不要允许这种语言在其目前的状态下用于可靠性至关重要的应用程序中....由于编程语言错误,下一个火箭误入歧途......可能是一个源自我们自己的城市之一的核弹头。产生不可靠的计划的不可靠的编程语言构成了对我们环境的更大风险以及我们的社会而不是核电站的不安全汽车,有毒农药或事故。

在Hoare的讲话中很高兴,特别是寓言结束了没有皇帝的衣服,我忽略了Haare'后来支持ADA。也就是说,直到几年前,我对ADA的看法作为编程语言很清楚:只有在几个遗留的军事应用中只有在几个遗留的军事应用中有用的膨胀,不灵活的语言,对于使用高性能嵌入式代码的任何人都没有用。

直到Covid-19病毒出现,我曾经亲自参加英国的年度安全关键系统研讨会。一家名为Adacore的公司总是在那个研讨会上待命,同时在休息期间与他们的代表一起聊天。我的开幕式和克鲁格Gambit沿着“我使用高性能,嵌入式软件,所以你所提供的东西显然对我来说显然没有用”。我甚至可能结束那个笑声。

她的回答是一个简单的挑战:“你什么时候上次看Ada?”

承认我唯一的看待Ada已经非常肤浅,在此之前有35年,我给了Quentin Ochem'在C ++或Java开发人员和John Mccormick和Peter Chapin' S的高度完整性应用。我在航班上读到加拿大的航班,到达家,尝试了一个简单的程序。结果足以让我脱离生命。我试图写一个“Hello World”程序:

与ada.text_io;使用ada.text_io;程序主要是mystring:string(1 .. 20);开始mystring:="你好世界&#34 ;; put_line(mystring);最终主要;

编译器给了我一个警告,当然,我被忽略了 - 真正的程序员不读取编译器警告。当我运行该程序时,这会出现:

我的第一个想法是我试图将太多字符复制到mystring中,与c&#39不同,它的strcpy()ada的编译器抓住了我的错误。但是“你好世界”只有11个字符,肯定不到20人。这是Ada的强大打字踢:“你好世界”不是一个20个字符的弦,所以它不能进入​​mystring。

在世界安全关键的嵌入式系统中工作,我花了很多时间试图避免C语言的陷阱:我意识到人们努力定义CAS-C和SEI CERT C的C子集正在尝试将C语言减少到更安全的子集。我熟悉D和Reart的据说安全的子集,并追随我的“你好世界”实验的有趣结果,我以为时,我的时间再次来到ADA,特别是Spark子集。

我在2012年的ADA购买了John Barnes的强大(949页)编程,而我没有读取它的封面,我开始创建比我的第一个Hello World更大的程序。像其他程序员一样对我有关ADA的评论,我被编译器激怒了 - 直到我来欣赏它正在保护我。我也意识到ADA不是我所承担的死语言,而不是20世纪80年代初的开发停止的失败企业。在撰写本文时,最新版本是2012年的ADA和Spark 2014,今天充分近期有用,而不是未经证实的。

ADA的火花子集允许静态证明程序的正确操作。这种能力完成了我的觉醒,让我接受了Ada。当我为我教学的编程类准备了一个小的Spark榜样时发生了这一切。我对这个班的意图是:

再次运行箴言以向课程展示Spark Prover可以检测到错误的课程。

我的程序执行了简单的计算,非常效率地,找到整数的最小因子。它返回了最小的因素和“其他”因素:

Post => (n = n'旧/因子)和(n' old rem factor = 0)和(对于所有j在2中为2 .. factor-1 => n'旧rem j / = 0);

例如,调用N = 245489的小型Factor(n,f)应将n = 31作为最小因子返回,并且f = 7919作为“其他”因子。

步骤1和2进展顺利。我写了这个程序并用许多合适的输入测试了它(例如,245489),发现它正确工作 - 似乎是它。正是在步骤3,我的眼睛被打开了。 Spark Prover告诉我,我的程序不正确;如果输入为9,则程序提供错误的输出:

不能证明n = n'old / factore.g。当因子= 1和n = 3和n'old = 9时

我不需要插入小错误!我无意中插入了它,我在测试期间没有找到它。该程序对于除9以外的任何输入值的工作完全相同。感谢Ada和Spark,我有一个更好的教学例子,而不是我试图创造的。

虽然我被姗姗来迟地了解Ada,但是当一个联合黑莓Qnx和骗子客户想要使用ADA时,adacore再次出现。通过我的新发现热情,我成为了与古怪的黑莓QNX联系人之一。现在已经在BlackBerry®QNX®系统上提供了多年的涂抹编译器和库。

正如我写这一点,我有一个严肃的ADA程序,包括19个源代码文件,其中包含2,985条评论线和我的桌面上的ADA代码的6,253个。这是在目前正在进行的新QNX开发的半正式验证套件的一部分。在过去,我将在C或Python中写入此程序。在ADA中写作有时候一直在激励,因为我打开所有编译器警告并指定警告将被视为错误。然而,Ada的特点为我节省了几个小时的调试。获取干净的编译需要更长的时间,但这不仅仅是通过减少的调试工作来补偿。

在若干场合,我需要帮助,并从Stackoverflow和Adacore Suppor T书桌找到了ADA集团的优秀帮助。我的问题从“做了更多的是,是什么样的方式?”,对任务之间的比赛条件(“帖子”的竞争条件)的深刻问题。来自Stackoverflow和adacore支持的答案始终是提示,专业和礼貌的。

我非常喜欢ata and#39; s语法糖,例如,能够分解长整数和浮点值,以改善人类可读性:

但是,它是ADA的语义,显然是最重要的。使用高度线程的嵌入式代码,特别是像ADA的“受保护变量”的概念,一个可访问的变量仅限于一个线程(“在ADA-Speep中的”任务“),以及相关的受保护支持任务之间使用的共享缓冲区。

除了很短,跑步的程序之外,我必须承认Ada现在是我的首选语言。我的ADA编译器中我得到了很多用。