欢迎大家关注我的公*号:embedded_bug
嵌入式Linux开发的编程语言选择2-高级语言比较
这里的嵌入式Linux环境是指非标准Linux发行版环境,比如通过buildroot创建的,相比于标准的Linux发行版比如ubuntu,debian,fedora,系统比较简陋,提供的库很有限,而且系统的各种配置文件和配置方式与标准Linux发行版差别很大,总之,这里的嵌入式Linux只保证系统能够基本的启动运行起来。
直接说结论,个人推荐:go>C++(11)+boost>c,其他语言目前还都不太适合。
上一篇文章对C和C++进行了说明,这篇文章讨论go及其他高级语言。我自己实测过的有go,java,python,kotlin native,dotnet core,rust
一、java,内存和空间占用大,速度慢
? java的缺点:
-
需要在嵌入式Linux中安装arm版本的java runtime,占用空间。 -
程序编译之后占用存储空间也较大,因为一个程序通常包含好多java包,合起来之后程序也不小 -
程序运行需要内存大,一个基本的hello world就需要几十兆内存,稍微写写程序内存占用就百兆了。 -
程序运行速度慢,毕竟是通过java解释器翻译的。 当然,java也有他的绝对优势,就是无敌的库,各种库简直太丰富了。总之,java可以适用于CPU,内存,磁盘都不是事的高性能嵌入式Linux环境中。
二、dotnet core(C#),目前只能用于标准Linux发行版
? dotnet core目前在嵌入式Linux环境中还无法正常使用,主要是dotnet core很多API需要访问Linux中的某些文件,而这些文件是与Linux发行版相关的,因此在嵌入式Linux这种不完整的环境下运行是有问题的。
? dotnet core程序运行有两种方式,方式一类似java,需要安装个dotnet core runtime,然后程序由dotnet core启动;另一个方式是直接将程序编译成可执行程序,但是这种方式会将dotnet core runtime也编译进程序中,造成程序很大,基本的hello world程序都要上百兆。
不过在dotnet core可以运行的情况下,个人还是十分推荐的,因为同样有很强大的库支持,并且运行速度,内存占用都不错。
三、python、php,依赖C库,速度慢
? python,php等脚本语言,主要问题如下:
-
需要在嵌入式Linux中安装python, php等,不过这个占用空间不算很大。 -
程序运行速度慢,毕竟是脚本型语言 -
最主要的问题还是依赖与C库,别看python,php好像各种库很丰富,但是为了速度,底层其实很多都是用的C库,所以你要使用相应的库,还需要移植对应的C库,得不偿失。 除非有特殊需要,不太建议嵌入式Linux中使用python,php等脚本语言。
四、kotlin native、rust,依赖C库
? kotlin native目前还比较初级,并且库也不是很丰富,很多功能底层还是依赖于C库,例如网络部分就高度依赖libcurl。导致的问题和python类似,你要使用相应的库,还需要移植对应的C库,得不偿失。
? rust的问题和kotlin native类似,也是很多功能还依赖于C库,需要移植C库。
? kotlin native和rust的交叉编译其实还是用的gcc交叉编译器,所以交叉编译的时候还需要下载对应的交叉编译器,对应平台的库函数等,不过这个过程可以通过命令自动完成。
五、go,不二选择
? 选用go的唯一缺点是可执行程序略大,但是也可以通过upx程序进一步压缩程序,压缩后的程序一般最大也就几MB,不是对空间要求十分苛刻的环境完全能够满足要求,选用go的优点就很多了:
-
编译完的程序只是单文件,不依赖于任何C库。 -
程序运行速度快,内存占用少。 -
丰富的库可供选择,并且几乎都是开源的,可根据自己要求修改。 -
交叉编译十分方便,只需要PC端安装go的sdk就行,完全不需要交叉编译器。 -
调试方便,因为go交叉编译方便,不依赖于C库,因此程序完全可以在PC端调试完成之后只简单交叉编译一下就可以在目标设备上运行。 go的交叉编译可看这两个链接: https://rakyll.org/cross-compilation/ https://golang.org/doc/install/source#environment 具体交叉编译命令如下:
GOOS=linux GOARCH=arm GOARM=7 go build .
GOARCH值为arm时表示32位arm,为arm64表示64位arm
当GOARCH为arm时,GOARM可以为5,6,7;具体含义如下:
GOARM=5: use software floating point; when CPU doesn't have VFP co-processor
GOARM=6: use VFPv1 only; default if cross compiling; usually ARM11 or better cores (VFPv2 or better is also supported)
GOARM=7: use VFPv3; usually Cortex-A cores
编译完的命令可以用readelf -d命令看下库依赖,可以看出程序不依赖于任何C库
|