这个问题在这里已有答案:
通常,系统提供位于正常程序和操作系统之间的库或API . 在类Unix系统中,该API通常是C库(libc)实现的一部分,例如glibc,它为提供包装函数 . 系统调用 . 现在C程序可以调用这些库函数,因为这些库函数是用C编写的并进行系统调用 . 像Cobol或任何其他基于编译器的语言的语言如何在Linux上进行系统调用?这些语言无法调用系统提供的API .
编译语言被翻译(编译)成机器语言 . 操作系统在执行期间读取机器语言并进行适当的系统调用 .
所以,我不会说它是C,或任何编译语言,这使得系统调用 . 操作系统根据编译器生成的机器语言执行系统调用 .
一个例子可能会有所帮助:如果我使用gfortran编译这样一个简单的Fortran程序:
PROGRAM HELLO WRITE(*,*) "HELLO WORLD" END
我得到的代码看起来像这样(在x86-64上):
000000000040079d <MAIN__>: 40079d: 55 push %rbp 40079e: 48 89 e5 mov %rsp,%rbp 4007a1: 48 81 ec e0 01 00 00 sub $0x1e0,%rsp 4007a8: 48 c7 85 28 fe ff ff movq $0x4008e0,-0x1d8(%rbp) 4007af: e0 08 40 00 4007b3: c7 85 30 fe ff ff 03 movl $0x3,-0x1d0(%rbp) 4007ba: 00 00 00 4007bd: c7 85 20 fe ff ff 80 movl $0x80,-0x1e0(%rbp) 4007c4: 00 00 00 4007c7: c7 85 24 fe ff ff 06 movl $0x6,-0x1dc(%rbp) 4007ce: 00 00 00 4007d1: 48 8d 85 20 fe ff ff lea -0x1e0(%rbp),%rax 4007d8: 48 89 c7 mov %rax,%rdi 4007db: e8 c0 fe ff ff callq 4006a0 <_gfortran_st_write@plt> 4007e0: 48 8d 85 20 fe ff ff lea -0x1e0(%rbp),%rax 4007e7: ba 0b 00 00 00 mov $0xb,%edx 4007ec: be e7 08 40 00 mov $0x4008e7,%esi 4007f1: 48 89 c7 mov %rax,%rdi 4007f4: e8 57 fe ff ff callq 400650 <_gfortran_transfer_character_write@plt> 4007f9: 48 8d 85 20 fe ff ff lea -0x1e0(%rbp),%rax 400800: 48 89 c7 mov %rax,%rdi 400803: e8 78 fe ff ff callq 400680 <_gfortran_st_write_done@plt> 400808: c9 leaveq 400809: c3 retq
在那里,您可以看到对gfortran库函数的三次调用(例如 gfortran_transfer_character_write ) . 看起来像gfortran插入这些来实现 WRITE 语句 . 库函数是implemented in C,最终将通过C库包装器调用底层系统调用 .
gfortran_transfer_character_write
WRITE
当编译器构造对这些函数的调用时,它必须遵循C调用约定并对调用语言的数据类型执行任何转换 . 除此之外,这里没有魔力 . 一旦进入运行时库,就可以调用其他C库(如libc) .
2 回答
编译语言被翻译(编译)成机器语言 . 操作系统在执行期间读取机器语言并进行适当的系统调用 .
所以,我不会说它是C,或任何编译语言,这使得系统调用 . 操作系统根据编译器生成的机器语言执行系统调用 .
一个例子可能会有所帮助:如果我使用gfortran编译这样一个简单的Fortran程序:
我得到的代码看起来像这样(在x86-64上):
在那里,您可以看到对gfortran库函数的三次调用(例如
gfortran_transfer_character_write
) . 看起来像gfortran插入这些来实现WRITE
语句 . 库函数是implemented in C,最终将通过C库包装器调用底层系统调用 .当编译器构造对这些函数的调用时,它必须遵循C调用约定并对调用语言的数据类型执行任何转换 . 除此之外,这里没有魔力 . 一旦进入运行时库,就可以调用其他C库(如libc) .