6778年Electronicdesign Ochem595x335

强类型产生强编程

2014年1月8日
强类型不仅仅是为了避免bug。它还涉及遵循良好的软件工程原则,并在各个级别检查一致性。

> >网站资源
..> >图书馆:TechXchange
. . . .>> TechXchange:嵌入式软件
. . . . . .>>主题:Ada和SPARK

强类型的概念通常与高完整性和其他关键应用程序相关联。事实上,在这些情况下,错误可能会产生严重的影响,来自语言的任何帮助都有很大的价值。然而,强类型不仅仅是为了避免bug。它还涉及遵循良好的软件工程原则,并在各个级别检查一致性。这就是这个故事的寓意。

学习曲线

我在2002年以实习生的身份加入AdaCore,负责在我们的集成开发环境(IDE)中开发“快速修复”功能。由于我正在学习计算机工程,还不熟悉软件开发的一些细节,我很容易陷入一些令人讨厌的编程陷阱。

特别是,我不太理解字符串中的字符偏移量和编辑器中的列之间的区别。当然,大多数情况下是没有的——也就是说,直到IDE用户按下tab键,突然一个字符串字符可能意味着屏幕上的8列。或7。或四个。或一个……

唉。写了一万行代码,三年后,我回到了AdaCore,这次作为一名员工,我的任务之一是修改我原来的实习生代码。与此同时,该特性已经集成到IDE中,在出现选项卡时表现不佳。

在我当时的代码中,列和缓冲区索引是作为整数实现的。没有办法区分它们被用于完全不同的目的。它们表示的对象在系统中具有完全不同的语义,但使用的是相同的类型。

因此,不可能跟踪代码的哪一部分将数据作为列号操作,比如在编译器消息中,以及代码的哪一部分将数据作为索引号操作,比如在缓冲区修改中。这种隐性的混合导致了各种崩溃和不一致性。

解决方案

这就是编程语言可以帮助的地方。Ada允许开发人员定义语义不同但共享兼容表示的类型。让我们举另一个例子来说明这一点。英里和公里可以使用浮点值进行建模。然而,增加里程值和公里值是没有意义的。您需要首先将一个单元转换为另一个单元,并根据区域设置决定转换哪个单元。

这正是艾达允许你做的。它将禁止将一种类型隐式转换为另一种类型的操作(即使它们在结构上是兼容的),并强制进行显式转换。虽然一开始感觉这像是一个符号负担,但它让开发人员从手工和容易出错的一致性检查中解脱出来(见图)。我很确定火星气候轨道器的人会同意。

不管怎样,回到我的问题。因为我最初没有考虑到这个设计方面,所以编译器无法检测到任何不一致。然而,我可以在事后修改设计。我在我的模块的接口上引入了两个新类型Offset_Type和Column_Type,一个用于操作偏移量(例如在空字符串中),另一个用于操作列(在编辑器原语中)。这在代码中生成了第一层编译器错误,我要么混合了整数和偏移量,要么混合了整数和列。

通过不断地纠正字段和变量的类型,我可以在代码的深层部分指定正确的输入。否则这些块就会完全模糊。很快,我就遇到了偏移量和列混合在计算中的位置。这就是需要进行显式转换和计算的地方。几天之内,代码就被完全修复了。

这个例子让我感到惊讶的是,它利用了Ada的特性,而该语言并不是专门为图形界面和IDE设计的。但在这种情况下,良好的工程原则和支持这些原则的工具已被证明在提高生产率方面是有效的。

Ada禁止将一种类型隐式转换为另一种类型的操作(即使它们在结构上是兼容的),并强制进行显式转换。因此,开发人员不必执行手动和容易出错的一致性检查。

昆汀Ochem具有软件工程背景,专门从事关键应用软件开发。他有超过10年的Ada开发经验。如今,他是AdaCore的技术客户经理,负责与航空电子、铁路、太空和国防工业相关的项目。他还在巴黎EPITA大学教授航电标准DO-178B课程。

> >网站资源
..> >图书馆:TechXchange
. . . .>> TechXchange:嵌入式软件
. . . . . .>>主题:Ada和SPARK

受欢迎的合作伙伴的内容

高性能背光LED驱动器的各种屏幕尺寸

我们的大型升级(增强)LED驱动器组合利用全球调光技术用于LCD背光。你可以使用单通道选项…

36 v, 4-A降压电源模块在小5.5 x 5 x 4 mm增强型HotRod™QFN占地面积简单

36 v, 4-A降压电源模块在小5.5 x 5 x 4 mm增强型HotRod™QFN占地面积简单

功率因数校正基础和设计考虑

功率因数校正(PFC)基础知识和设计考虑。本系列讨论PFC基础知识、拓扑比较和设计注意事项。

宽输入电压和高功率升压控制器的广泛组合

我们的同步和非同步升压控制器的组合,旨在通过宽电压inp减少保护组件的需要。

声音你的意见!

本网站要求您注册或登录后发表评论。
目前还没有任何评论。想开始对话吗?
Baidu