我想在 vim 上保存时运行 gofmt 而不安装任何插件。这是我尝试过的(灵感来自https://gist.github.com/tbrisbout/a91ac3419440cde40c5f54dc32c94427):
function! GoFmt()
let file = expand('%')
silent execute "!gofmt -w " . file
edit!
endfunction
command! GoFmt call GoFmt()
augroup go_autocmd
autocmd BufWritePost *.go GoFmt
augroup END
Run Code Online (Sandbox Code Playgroud)
这仅在没有格式错误时有效。但是,如果代码包含错误,它会在屏幕底部显示错误消息,并且(看起来)它以文本形式出现在缓冲区上,因此整个代码都会被破坏。有没有一种简单的方法可以在 vim 上处理此类工作?
在我的理解中,CPU为了优化而改变了写在机器代码上的操作顺序,这被称为乱序执行。
在术语“内存顺序”中,它定义了访问内存的顺序。例如,在宽松的顺序中,它定义了非常弱的排序规则,并且很容易发生执行重排序。
x86 中有一些内存排序模型,例如 TSO。在这样的存储器排序模型中,定义了处理器的存储器访问顺序的语义。
我不明白的是他们之间的关系。内存顺序是一种乱序执行吗?OoOe还有其他方法吗?
或者说,内存顺序是乱序执行的实现,处理器的所有重新排序都是基于语义的吗?
现在我正在尝试了解 RISC-V ISA,但我对机器代码和汇编有不清楚的地方。
我写了这样的C代码:
int main() {
return 42;
}
Run Code Online (Sandbox Code Playgroud)
然后,我通过以下命令生成了 .s 文件:
$ /opt/riscv/bin/riscv64-unknown-linux-gnu-gcc -S 42.c
输出是:
.file "42.c"
.option nopic
.text
.align 1
.globl main
.type main, @function
main:
addi sp,sp,-16
sd s0,8(sp)
addi s0,sp,16
li a5,42
mv a0,a5
ld s0,8(sp)
addi sp,sp,16
jr ra
.size main, .-main
.ident "GCC: (g5964b5cd727) 11.1.0"
.section .note.GNU-stack,"",@progbits
Run Code Online (Sandbox Code Playgroud)
现在,我运行以下命令来生成一个精灵。
$ /opt/riscv/bin/riscv64-unknown-linux-gnu-gcc -nostdlib -o 42 42.s
这样,就生成了一个二进制文件。我尝试通过 objdump 读取该内容,如下所示:
$ /opt/riscv/bin/riscv64-unknown-linux-gnu-objdump -d 42
所以输出是这样的:
42: file format elf64-littleriscv
Disassembly of section .text:
00000000000100b0 …Run Code Online (Sandbox Code Playgroud) 关于 int 类型上 Go 数据竞争的问题。当我运行下面的程序时go run -race main.go,
package main
import "fmt"
var i int
func main() {
go func() {
i = 10
}()
i = 5
fmt.Println(i)
}
Run Code Online (Sandbox Code Playgroud)
它显示数据竞争警告。
~ $ go run -race main.go
5
==================
WARNING: DATA RACE
Write at 0x000000605908 by goroutine 7:
main.main.func1()
/home/dty1er/main.go:80 +0x3a
Previous write at 0x000000605908 by main goroutine:
main.main()
/home/dty1er/main.go:83 +0x56
Goroutine 7 (running) created at:
main.main()
/home/dty1er/main.go:79 +0x46
==================
Found 1 data race(s)
exit status 66
Run Code Online (Sandbox Code Playgroud)
我知道为什么会发生这种数据竞争; …