Go 编译器运行时的语法和语义

Posted

技术标签:

【中文标题】Go 编译器运行时的语法和语义【英文标题】:The syntax and semantic of the Go compiler runtime 【发布时间】:2013-04-21 23:09:12 【问题描述】:

我正在查看 go runtime 中的 runtime.c 文件

  /usr/local/go/src/pkg/runtime

并看到了以下函数定义:

   void
   runtime∕pprof·runtime_cyclesPerSecond(int64 res)
   ...

int64
runtime·tickspersecond(void)
...

还有很多像

这样的声明
void    runtime·hashinit(void);

在 runtime.h 中。

我以前从未见过这种 C 语法(特别是带有斜线的语法似乎很奇怪)。 这是 std C 的一部分还是某些 plan9 方言?

【问题讨论】:

为时已晚,但***.com/questions/13475908/… 【参考方案1】:

· 和朋友只是有人决定放入函数名称的随机 Unicode 字符。晦涩的 Unicode 字符(edit: 在Annex D of the C99 standard (pages 452-453 of this PDF) 中列出;另请参阅here)在 C 标识符中与 A7 一样合法(在您的普通支持 Unicode 的编译器中) ,无论如何)。

Char|   Hex| Octal|Decimal|Windows Alt-code
----+------+------+-------+----------------
∕   |0x2215|021025|   8725|          (null)
·   |  0xB7|  0267|    183|        Alt+0183

在函数名称中放置看起来像运算符但不是的字符(特别是 U+2215 ,与 U+2F /(除法)太接近了)可能是一种令人困惑的做法,所以我会个人建议反对。显然,Go 团队中的某个人认为,无论出于何种原因将它们包含在函数名称中,都超过了混淆的可能性。

编辑:应该注意的是,U+2215 没有被附件 D 明确允许。正如 here 所讨论的,这可能是一个扩展。)

【讨论】:

@downvoter:解释一下?如果你告诉我这个问题,我可以修复它。 我不是反对者,但并非所有 unicode 字符在标准 (ANSI) C 标识符中都是合法的。见here。【参考方案2】:

这是 Go 包路径的特殊内部语法。例如,

runtime∕pprof·runtime_cyclesPerSecond

是包路径runtime∕pprof中的函数runtime_cyclesPerSecond

”字符是 Unicode 除斜线字符,用于分隔路径元素。 '·'字符是Unicode中间点字符,用于分隔包路径和函数。

【讨论】:

以上是关于Go 编译器运行时的语法和语义的主要内容,如果未能解决你的问题,请参考以下文章

Go语言入门篇-命令 与 语法

语法和语义和错误;

C语言编译时的错误

初识GO语言

go语言学习笔记 — 基础 — 基本语法 — 常量与变量 — 变量的生命周期:变量逃逸分析 —— go编译器自动决定变量的内存分配方式(堆还是栈),提高程序运行效率

gcc新版本号引起的编译错误(命令运行时的外部库输入位置)