围棋中的破碎抽象
发布于2010年3月29日,星期一。
去吧
移动$1,0(SP) 移动$2,4(SP) MOVL$3,8(标准普尔) 呼叫f(SB)
移动$1,0(SP) 移动$2,4(SP) 平均$3,8(SP) PUSHQ$f(SB) PUSHQ 12美元 CALL runtime.newproc(SB) POPQ AX系列 POPQ AX系列
推迟
ADDL$48,SP//或任何框架尺寸 转塔
CALL runtime.deferreturn(SB) ADDL$48,标准普尔 转塔
结构延迟 { int32大小; 字节*sp; 字节*fn; 延迟*链接; 字节参数[8];// 填充到实际大小 };
空隙 延迟返回(uintptr arg0) { 字节*sp,*fn; 延迟*d; sp=(字节*)&arg0; d=g->推迟; 如果(d==零|| d->sp!= 服务提供商 ) 回报; mcpy(d->sp,d->args,d->siz); g->defer=d->链接; fn=d->fn; 免费(d); jmpdefer(fn,sp); }
论抽象
-
巴里·凯利 (2010年3月29日上午9:49) 从代码中删除抽象显然是编译器的工作。 最终,它需要删除所有抽象,直到剩余的比特流能够向硬件发出信号,以在物理世界中生成所需的效果。 所以,是的,当你实现一个编译器时,你需要意识到一个事实,那就是你的工作就是破坏抽象,把它映射到正确性允许的适当层。 但这与打破抽象是件好事不同。
-
自残性窒息 (2010年3月29日上午9:57) 堆栈上传递的参数也是64位的吗? call/ret-5诡计如何影响现代处理器上的call/ret预测?
-
俄罗斯考克斯 (2010年3月29日上午10:21) @巴里:如果一直这么做,那不是一件好事,但偶尔也会是件好事。 @aa:f调用了deferreturn,它调用了jmpdefer,它直接返回到f,这已经打破了RET的预测。 倒带CALL指令不会使情况变得更糟。;-)
-
彼得 (2010年5月19日9:21 PM) 我非常确信,通过充分利用Java接口,您可以编译Go to JVM。 这肯定不会很好看- D类
-
I可拆卸 (2011年1月4日下午5:30) 为什么go-helper runtime.newproc不自动弹出known-to-be函数地址和arglist字节大小,而不是依赖调用方弹出它们? 这将扭转局面: 移动$1,0(SP) 移动$2,4(SP) 平均$3,8(SP) PUSHQ$f(SB) PUSHQ 12美元 CALL runtime.newproc(SB) POPQ AX系列 POPQ AX系列 进入之内 移动$1,0(SP) 移动$2,4(SP) MOVL$3,8(标准普尔) PUSHQ$f(SB) PUSHQ 12美元 CALL runtime.newproc(SB) 哪种管道尺寸更好?
-
卡斯滕·米尔考 (2011年5月27日上午5:08) 我想知道为什么 defer<函数体> 转到<FunctionBody> 还没有变成(词汇上的)同义词 defer函数() go func()<FunctionBody>() 遵循go的一般设计模式以避免样板。 IMHO这是相当直接和明确的,记住匿名函数是闭包。 defer和go关键字非常突出,足以提醒这是一个匿名函数调用,而不是一个普通的块。 然而,在许多情况下,这种差异并不重要,在这些情况下,相似性甚至是一个优点。