动态:CGO

CGO

混合编程,在 Go 和 C 代码间相互调用:

  • CGO 不是 Go
  • 直接在 Go 源文件内嵌入 C 代码
  • 直接编译(链接)C 源码文件
  • 导入动态库(.so)

混合编程很常见,现在很多项目使用不同语言也是一种混合编程,只不过很少基于编译器混合编程。

编译分成编译和链接部分。编译前端生成 .obj 文件,链接器生成可执行文件。换句话说,无论前端是什么语言,使用不同的前端翻译成同样格式的 obj 文件,接下来后端完成汇编的优化和链接。

混合编程关键在于编译器能支持多少种语言的编译,现在编译器支持很多前端,后端必须保证 ABI 的兼容。ABI 包含调用函数参数怎么入栈、入栈是什么顺序、调用方分配内存还是函数分配内存、返回值怎么处理,甚至使用什么寄存器诸如此类的规则。这些规则基于二进制保持一种相同的调用格式,无论什么语言生成的汇编都是一致的都可以实现调用。所以 ABI 保证二进制层面上的稳定性,另外操作系统的系统调用也属于 ABI 的内容。

Go 语言对前端的支持除了默认 Go 以外,还通过 CGO 支持 C 语言,Go 语言通过 CGO 把 C 语言处理成相同的汇编 ABI 格式,最后去调用,这会有一些转换的过程。

Go 最早的定位是 Next C,必然要继承 C 的遗产。除了语法设计上有相似以外还想使用 C 的资源。CGO 和 Go 语言没关系,编译器有 CGO 后端工具,Go 语言没有定义任何跟 C 进行交互的东西。

我们来看一个简单的例子:

/*
#include <stdio.h>
void hello()
{
    printf("hello, world!
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值