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 标识符中与 A
或 7
一样合法(在您的普通支持 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语言学习笔记 — 基础 — 基本语法 — 常量与变量 — 变量的生命周期:变量逃逸分析 —— go编译器自动决定变量的内存分配方式(堆还是栈),提高程序运行效率