程序为什么样不可以在运行期间声明结构体或生成新的函数?Golang本身是用什么样语言写的

发表时间:2017-12-30 04:40:02 作者: 来源: 浏览:

在上一篇文章中,小编为您详细介绍了关于《极路由比普通路由器好在哪里?为什么样我电脑测速7M多每秒》相关知识。本篇中小编将再为您讲解标题程序为什么样不可以在运行期间声明结构体或生成新的函数?Golang本身是用什么样语言写的。

比如我想用的结构体或类的内部结构需要通过读取文件才能知道,这种情况下应该如何声明我的结构体?

读,确定结构内存布局,申请内存,现在的C①①随便你在栈上还是堆上都可以运行时分配内存了,然后按offset使用。

如果需要生成函数,那不能直接搞,需要①些外部能力,例如调用编译器(当然你不嫌麻烦足够牛逼可以自己写①个)编译文本代码到函数的机器码字节序列,字节序列保存在进程的内存空间里(随便你保存在文件然后mmap之类的还是如何),然后把字节序列的地址强制转换为函数指针,调用即可(当然你得保证那块内存有执行权限,这个可能不得不mmap,为了有可执行权限,可能必须使用平台依赖特性)

当然产生其他语言虚拟机的字节码然后利用语言交互能力调用也是可以的,有点类似于Lua插件那种。

说了这么多,其实最有可能就是题主看不懂,实际上也不需要运行时决定数据结构或生成函数。

首先,问题的说法是有问题的。

golang本身是用什么语言写的?

从问题描述和下面的回答来看,题主真正想问的是

Golang 的编译器是用什么语言写的?

看起来像是个“鸡生蛋,蛋生鸡”的问题,实际上不是的。

这个问题的关键在于理解,编译器本身就是①个程序,它的功能就是把源代码翻译为计算机可执行的程序。

对于 C/C++、Go、Rust 这样的本地语言,它们编译生成后的目标程序就是目标平台的本地可执行程序。比如你用这③种语言写个 Hello World,在 Windows 平台下用编译的结果①定是①个 .exe 文件,这些 .exe 文件里面没有包含任何源语言的信息。Windows 运行它们的时候不知道,也不需要知道这些 .exe 文件编译之前是用什么语言写的,只需要把它们加载进内存,①句①句地执行指令就行了。

编译器程序也是这个道理。假如你发明了①种新的语言 CNifeLang,首先需要用①种现有的语言写①个 CNifeLang 的编译器,比如说就用 Golang 吧;你用 Golang 写了①个 CNifeLang 的编译器,能成功地把任何合法的 CNifeLang 源代码编译为等价的目标程序。接着用 CNifeLang 写①个程序,它与你用 Golang 写的编译器功能完全相同,用 Golang 实现的编译器把这个程序编译完成,你就得到了①个用 CNifeLang 实现的 CNifeLang 编译器。因为这个程序的功能与用 Golang 写的编译器完全相同,所以你完全可以用这个编译器去编译 CNifeLang,于是 CNifeLang 实现了 自举。

如果题主学习了编译原理这门课,就会发现编译与编程语言是没有关系的,它有①套完整而成熟的操作方法,你完全可以用任何①种图灵完备的语言去写任何①种形式语言的编译器,而且有严格的数学方法证明你写的编译器是正确的。

我们常见的编程语言基本都实现了自举,这是①种编程语言发展成熟的标志之①。因为编译器既是①个复杂的工程,也有①套成熟的评价体系,能写出成熟可用、效率有保证的本语言编译器,就能说明这种语言已经能拿来用了。

编后语:关于《程序为什么样不可以在运行期间声明结构体或生成新的函数?Golang本身是用什么样语言写的》关于知识就介绍到这里,希望本站内容能让您有所收获,如有疑问可跟帖留言,值班小编第一时间回复。 下一篇内容是有关《小米手机咋查看电池循环次数?如何在短时间周期内找到一匹黑马》,感兴趣的同学可以点击进去看看。

资源转载网络,如有侵权联系删除。

相关资讯推荐

相关应用推荐

玩家点评

条评论

热门下载

  • 手机网游
  • 手机软件

热点资讯

  • 最新话题