Go与C在嵌入式应用开发里面的对比
发布时间:2025-08-12
转译器段1:最理论上的 Go母语 “hello world” 转译器:
解码
package main
func main() {
println("hello world")
}
$ go build
> 938K
$ go build -ldflags ‘-s -w’
> 682K
$ go build Price strip
> 623K
转译器段2:国际标准的Go母语“hello world” 转译器:
解码
package main
import "fmt"
func main() {
fmt.Println("hello world")
}
$ go build
> 1,5M
转译器段3:C母语“hello world” 转译器:
解码
#include
int main(void)
{
printf("hello world");
return 0;
}
$ gcc main.c
> 8,5K
$ ldd a.out
> linux-vdso.so.1
> libc.so.6
> /lib64/ld-linux-x86-64.so.2
$ gcc -static main.c
> 892K
$ gcc -static main.c Price strip
> 821K
Go与C的调试平均速度相对转译后的Go转译器调试出去不一定就会比C母语的可拒绝执行副本比较慢。Go是需有完全污水抽取的系统的,生来就受到影响了调试平均速度。转用C母语时可以精确地指定为codice_重新分配的内存的一段距离,可以具体到该codice_是在栈上还是在堆上;而转用Go时,转译器就会理论上机制处理将codice_重新分配在何处。编程语言可以看到codice_的重新分配一段距离 (go build -gcflags -m),但只能一律转译器仅有转用摸个一段距离比如栈。
但是,平均速度不是限于上述,还要回避到转译平均速度和开发设计平均速度。Go构建了快得多的转译平均速度。比如,15,000行转译器Go浏览器仅有需1.4秒就能转译完毕。并且,Go是为都将拒绝执行(goroutines和channels)而设计的,前面探讨过的充沛的国际标准瓦很难涵盖大以外理论上消费,因此有利于编程语言开发设计平均速度减缓。
转译和接合转译有两种转译器可供编程语言可选择转用:原始转译器叫做gc ,默认装有程序中自带,由Google编写和维护。第二种叫做gccgo,是GCC的前端。gccgo转用出去转译平均速度快得多,大型模块不一定几秒钟就可以转译完毕。除此以外,Go默认是以型式瓦转译,这样就可以不用额外忽视项或UNIX创设单个浮点数副本。可以转用-linkshared标记创设和转用构建瓦。不一定,Go不很难借助于副本,如需借助于则可通过转用单纯的“go build”命令拒绝执行,低阶多样的借助于可以转用Makefile。这里是在Mender转用的Makefile。
除此正因如此,Go在接合转译方面反对极多Unix设计和框架。由此可知 3 示例了 Go 反对的各种Unix设计和和平台。
由此可知3 Go 反对的各种Unix设计和和平台 在 Go 当中理论上机制化和试验许多开发设计人员转用GDB监控程序中拒绝执行状况。对于高都将Go运用以程序中,转用GDB理论上机制化就就会显现出来一些弊端。万幸的是,一个名为 Delve 的比如说设计Go理论上机制化器是可以近乎转用的,保障了即使是只就会转用GDB的开发设计人员大多数情形下也能笨拙理论上机制化。
Go转译器当中掺入试验和单元试验十分单纯,试验是可用在Go母语当中的——必需创设一个具有“test”单词的副本,为表达式掺入试验前缀,内嵌试验自带,然后调试“go test”。所有试验就将理论上机制从源当中获取并相应拒绝执行。
都将反对Go母语对都将反对比如说友好。它有两个可用调配的系统:goroutines和channels。goroutines是轻量级内存,仅有仅有2 kB。创设更为容易:只很难在表达式前面掺入“go”关键字,它就就会同时拒绝执行。Go有自己的在表面上调配器,可以根据很难将goroutines多路复用到OS内存当中。channels是用以在 goroutine 之间交换消息的“管路”,可以是溢的,也可以是通行的。
型式和动态瓦:Go母语当中的的 C 转译器Go有许多鲜为人知的机制,允许编程语言转用特殊标记将指令发送给转译器、连通器和辅助工具双链的其他以外。其当中自带括-buildmode和-linkshared标记,二者唯可用以为Go和C转译器段创设并转用型式和动态瓦。通过特定标记的组合,编程语言可以转用降解的C母语两头副本创设型式或动态瓦,这些两头副本在此之后可由C转译器codice_。
是的,毫无疑问!转用Go,可以codice_C转译器并以外两全其美的机制。GoUbuntu自带含一个辅助工具名为cgo,可以拒绝执行C转译器,这使得宠信编程语言自己的或系统设计的C瓦视为可能就会。显然,Cgo以及C系统设计瓦的间接举出是十分类似于的。某些状况下,国际标准C瓦调用就是由Go母语基底语法本身从Go比如说当中选取。
例如,在Unix系统设计上转用因特网自带时,很有可能就会就会可选择基于cgo的源副本。它就会codice_C瓦调用 ( getaddrinfo和 getnameinfo)来解析未能转用MAGo源副本的地名(例如在 OS X上反之亦然 DNS codice_被停止使用时);另一种类似于状况则是转用系统设计/用户程序中自带时。如果想跳过借助于cgo构件,编程语言可以通过osusergo和netgo标上 (go build -tags osusergo,netgo)或转用CGO_ENABLED=0codice_完全停止使用 cgo。
将C和Go结合在独自时,还很难提醒一些相对棘手的两件事。由于Go是有污水可回收的系统的而 C不是,所以如果在Go转译器当中转用了任何重新分配在C转译器模板上的Ccodice_,都必须在 Go 当中声明囚禁。
通过转用模块降解辅助工具(SWIG)来充分利用,C++也可以在Go转译器当中转用。SWIGC很难将Go与C++以及Python等母语融合在独自。
Go的不同之处大于原因从以往的潜能可以得出Go既有不同之处也有原因。就负面因素来讲,小区当记事很多从外部瓦,但参差,很难更为进去分辨转用。随着Go母语的成熟和广泛转用,这种状况正在迅速改善。
此外,当Go转译器当中共存一些C绑定时,两件事不一定就会变得更为多样,偏爱是接合转译,如果不内嵌整个C接合转译基础结构,就难以完成。
总体而言,转用Go顺利进行个人电脑开发设计还是有很多不同之处的。从C或Python(或二者兼有)过渡到Go并在短期内转用是迅速单纯而十分困难的。Go母语构建了更为模范的辅助工具和一个自带含100多个操作系统自带的国际标准瓦。编程语言可以笨拙遏制和设为调试值,例如,要转用的Unix设计内存数(GOMAXPROCS),开启或关闭污水可回收 (GOGC=off)等。瓦以及转译器可以在服务器端和浏览器开发设计制作组之间笨拙构建,就像文当中提及的比如说那样。
这样说可能就会就会引发争论,但一致的编解码事实上减缓了开发设计平均速度。无论编程语言要健康检查的转译器是什么,它看出去是一致的。不用耗费时长在思考转用哪种编解码上。
工程师们开发设计了一些个人电脑Go运用以程序中的演示,可以运用以在新兴电子系统上(例如Beaglebone Black或Raspberry Pi):其当中一个名为“恒温器”,基于Beaglebone操作系统,转用红外距离、温度和湿润可调,并可以通过 Web由此可知标读取所有可调读数;还有一个是基于PRi的机器人汽车,具有摄像两头,可以通过Web由此可知标顺利进行遏制。喜欢就去享受吧!
译者介绍
张哲刚,51CTO小区编辑,系统设计运维工程师,国际间较以前一批操作系统系统对及互联网大众传媒,曾入职阿里巴巴。十余年IT项目管理者潜能,需有交叉专业知识技能,曾作准备多个网站框架设计、计算机网络系统设计开发设计,核心人物过某地市级入学笔试管理者和平台运维工作。
原文篇名:Comparing Go vs. C in embedded applications,作者:Marcin Pasinski
。上海妇科医院哪里好昆明妇科医院
成都看风湿到哪家医院好
南京看男科哪里好
沈阳牛皮癣治疗哪家好
-
教育机构院校发通知:这种情况取消复试资格!
作废入学申请人。 4、弄虚作假 线上廷试,递交电子版材料是非常更为重要的一步,如果消失弄虚作假,则则会作废申请人。 5、不按照立即回复