直接进行系统调用的语言

Languages that make system calls directly

我一直在学习 linux 中的系统调用,以及 GNU C 库函数实际上只是最终调用实际系统调用的包装器。我还读到 lot/a 少数其他语言实际上并不进行自己的系统调用,而只是调用 C 并让 C 库为其进行系统调用。
所以我的问题是是否有一种编程语言可以让系统调用自己而不与 C 库交互?比如中断和设置寄存器等?
我已经尝试查找一些但是没有信息或者他们只是调用 C。
谢谢。

Go (golang) 就是这样做的。这是设置寄存器的 Go Linux AMD64 syscalls 的部分源代码(x86_64 上的 Linux 使用 syscall 而不是 int 0x80):

// func Syscall6(trap, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2, err uintptr)
TEXT ·Syscall6(SB),NOSPLIT,[=10=]-80
    CALL    runtime·entersyscall(SB)
    MOVQ    a1+8(FP), DI
    MOVQ    a2+16(FP), SI
    MOVQ    a3+24(FP), DX
    MOVQ    a4+32(FP), R10
    MOVQ    a5+40(FP), R8
    MOVQ    a6+48(FP), R9
    MOVQ    trap+0(FP), AX  // syscall entry
    SYSCALL
    CMPQ    AX, [=10=]xfffffffffffff001
    JLS ok6
    MOVQ    $-1, r1+56(FP)
    MOVQ    [=10=], r2+64(FP)
    NEGQ    AX
    MOVQ    AX, err+72(FP)
    CALL    runtime·exitsyscall(SB)
    RET
ok6:
    MOVQ    AX, r1+56(FP)
    MOVQ    DX, r2+64(FP)
    MOVQ    [=10=], err+72(FP)
    CALL    runtime·exitsyscall(SB)
    RET

这有一个可预见的缺点,即必须为每个内核约定乘以每个支持的体系结构编写和维护一个文件。 The directory 目前有文件表明支持以下各项:

  • aix_ppc64, darwin_386, darwin_amd64, darwin_arm, darwin_arm64, freebsd_arm, linux_386, linux_amd64, linux_arm, linux_arm64, linux_mips64x, linux_mipsx, linux_ppc64x, linux_s390x, nacl_386, nacl_amd64p32, nacl_arm, netbsd_arm, openbsd_arm, plan9_386, plan9_amd64, plan9_arm, solaris_amd64, unix_386 , unix_amd64

对于不受支持的组合或新端口,也可以针对 libc link,但 go1.11.4 linux/amd64 默认直接使用系统调用。