delorean工具
这些天,我的标志性业余爱好项目是我的汽车的计算机仪表盘,恰好是DeLorean 。 但是,每当我向某人展示它时,我通常不得不花一些时间惊叹于汽车,然后他们才发现仪表板上有计算机屏幕。 当我开始描述软件时,也会遇到类似的问题。 程序员立即挂断了“为什么要使用Perl ???” 当他们得知仪器数据的实时OpenGL渲染全部用Perl编码时。 因此,对我的项目的任何讨论通常都始于DeLorean的历史或Perl与其他更可能的工具的优劣的讨论。
我在2010年启动了该项目,最初的想法是将计算机集成到仪表板中以充当个人助理,但该项目很快就变成了用软件渲染的东西替换股票仪表盘的项目。 根据我想要的处理水平(我梦dream以求的)和想要的屏幕尺寸,我决定不使用人们可能会使用的通常的高端微控制器,而是选择配备了完整的Linux PC和带有低端微控制器的台式机显示器。从汽车上读取模拟测量值。 当时我在工作中使用OpenGL和C ++,所以这是我的首选软件。 我可以写多篇有关硬件选择的文章,但我将尽力专注于此方面的软件。 (您可以在我的网站nrdvana.net上找到有关该故事的更多信息 。)
同时,我的日常工作已经转移到Perl上工作。 我并不是一个人寻找Perl。 这只是紧急项目的推动力。 但是,在短短的几个月内,它的可能性使我着迷,现在它是我最喜欢的语言。
输入Perl
2014年,我尝试了一下,重新编写了Perl中的组合仪表软件。 经过数年与C ++的结合,我能够在几个月内获得一个工作原型(至少是软件原型),并于2015年完成硬件和微控制器的开发。
我的Perl小成功故事主要是关于敏捷性的。 我不是真正的流行语爱好者,也不是那种阅读有关方法论的书的人,但是“敏捷”现在对我而言绝对意味着什么。 我感觉Perl达到了神奇的甜头,它提供了足够的结构来构建正确的高性能程序,同时又最小又通用,足以轻松地将它们插入,甚至提供了足够的语法功能来以简洁但可读的代码表示复杂的操作。 (如果您不熟悉Perl的功能,请参阅我的配套文章“ 从系统程序员的角度看 Perl”,其中详细介绍了Perl如何适合系统工作。)
持续的主要好处是可以进行临时更改。 由于我没有太多时间来计划对象的全部需求,因此极大地提高了生产率,只需在不怀疑的对象上添加其他几个属性,或根据以下内容快速排序对象列表即可:要求使用Java或C ++编写笨拙的反射代码的标准。 如果我决定喜欢更改,请返回并使用正确声明的属性和接口将其重写。 我发现我可以在不到一个小时的时间内编写一个新的图形小部件,其中包括动画。
工具链
我项目的C ++版本真正的杀手之一就是保持所有二进制级别的代码同步。 各个组件(渲染,消息总线,逻辑核心,微控制器固件,控制工具,调试工具)都共享二进制数据结构,而将相关性直接保持在makefile
中令人头疼。 我个人对automake工具系列感到不满意,因此,每当我需要做一些奇怪的事情(例如使用avr-gcc
编译微控制器代码)时,我都会感到沮丧并绕道而行,绕开了一个新的宏伟计划来创建自动工具的替代品(当然,我不需要浪费时间)。
在更改为Perl的过程中,我将微控制器转换为Linux串行设备,并将协议更改为短文本表示法的字符串。 (消息实际上比我以前使用的二进制数据包结构小。)这使我可以在/dev/ttyS0
上使用一个简单的socat
对其进行调试。 它还简化了与微控制器通信的守护程序。 自从我使用libusb
以来,C ++版本是用两个线程编写的,其最简单的操作模式是阻塞读取方法。 Perl版本仅打开字符设备的流并读取文本行。
我对主机端通信进行了类似的更改,并使守护程序生成JSON行而不是二进制数据包。 由于使用AnyEvent之类的库在Perl中实现此功能非常容易,因此我完全放弃了“消息总线”的想法,只是让每个程序创建自己的Unix套接字,其他程序可以根据需要连接到该套接字。 调试单个线程的痛苦要小得多,而且无论如何也没有太多调试要做,因为AnyEvent为我完成了大部分工作。
通过将所有内容作为JSON传递,不再需要担心任何消息结构。 我的Perl程序make
不再需要make
过程,因此项目中唯一仍带有makefile
是微控制器固件,它非常简单,我只需要手工编写即可。
性能
直接使用Perl处理低级数学可能会很慢,但是在性能很重要的情况下使用Perl的最佳方法是将C库粘合在一起。 Perl有一个名为XS的扩展系统,可以帮助您将C代码绑定到Perl函数,但更好的是,还有一个名为Inline的CPAN存储库模块,它可以让您直接将C或C ++(及其他)粘贴到Perl模块中,并编译第一次加载模块。 (但是,是的,在构建汽车的固件映像之前,我会对其进行预编译。)
感谢Inline,我可以根据需要将代码从Perl来回移动到C,而无需弄乱库的版本。 我能够将我的一些C ++类直接带入新的组合仪表Perl版本。 我还能够包装FreeType for OpenGL( FTGL )库的C ++对象,这是我不想重新发明的重要部分。
使用C ++实现,系统的CPU使用率约为15%。 使用Perl大约占40%。 几乎所有这些都是渲染代码,因此,如果需要,我总是可以将更多代码推回C ++中。 但是,我也可以升级计算机,而40%甚至都不是问题,因为我每秒保持完整的60帧(并且我正在运行6.4瓦处理器)。
广阔的视野
与其他语言相比,Perl的CPAN公共软件包存储库特别庞大,文档化,经过测试且稳定。 当然,这取决于各个作者(并且有很多反例),但是测试覆盖面和有用文档的普遍文化给我留下了深刻的印象。 安装和使用新的Perl模块也非常容易。 我不仅避免了C / C ++的工具链工作,而且还获得了Perl作者的优势,他们已经克服了相互冲突的线程模型,事件循环或日志记录系统,从而为我提供了插件体验。
使用Perl编写的所有内容,我都可以从CPAN中获得所有我喜欢的东西。 例如,我可以让汽车向我发送电子邮件或文本消息,托管一个用于通过电话控制功能的Web应用程序,编写燃油里程的Excel文件,等等。 我还没有开始使用这些功能,但是障碍消除了,感觉很好。
回馈
在使用C ++的十年中,我从未发布过供公众使用的库。 很多原因是由于自动工具的极端笨拙,以及即使没有正确打包以进行分发的情况下,仅创建系统安装的C ++库也是一个皇家难题。
Perl使模块的创作,测试和文档变得非常容易。 我很容易为自己的利益为Math-InterpolationCompiler编写测试用例和文档,然后在CPAN上发布它们,因为“为什么不呢?” 我还成为X11-Xlib的维护者,并大大扩展了它的API,然后编写了X11-GLX,以便最终可以按正确的顺序使用所有OpenGL设置代码。 (这也是我尝试将仪器渲染器变成合成窗口管理器的一部分,事实证明这比我预期的要困难得多。)目前,我也在努力将地图/导航数据库也变成CPAN模块。
但是为什么不...
您说“但是,为什么不使用Language X”,而“ Python”是X的共同价值。那么,我知道,Perl比Python多得多。 我使用了许多深层次和高级的Perl功能,因此选择Python将是另一个大学习曲线。 我也喜欢Perl的工具链,尤其是诸如prove
和perldoc
类的元素。 我怀疑也可以在Python中完成所有操作,但是我没有令人信服的理由进行切换。 对于X的任何其他语言,……还有其他语言无法与Perl或Python提供的大量软件包相匹配,因此我不太愿意尝试使用它们。 因为我的项目包含多个流程,所以我可以混合使用多种语言,但是将所有内容都用相同的语言表示我可以更轻松地在程序之间共享代码。
“为什么不使用Android?” 是另一个常见的问题。 实际上,平板电脑是比整个PC机更嵌入式的设备,并且可以访问地图应用程序。 显而易见的第一个问题是,我将重新使用Java并失去大部分宝贵的敏捷性。 其次,尽管可能会有一种方法,但我不知道有任何方法可以合并单独应用程序的图形(例如使用Google Maps作为仪表板中的纹理)。 第三,我一直在研究一项功能,以获取视频提要并将它们作为纹理直接绑定到图形中。 我不知道有任何平板电脑能够以足够低的延迟实时捕获来自外部源的视频,更不用说直接捕获到图形纹理缓冲区中了。 Linux桌面软件对这种深度操作更为开放,因此我可能会继续进行下去。
总的来说,我很高兴自己已经完成了足以驾驶DeLorean的比赛。
翻译自: https://opensource.com/article/18/1/my-delorean-runs-perl
delorean工具