一个例子可能会有所帮助:如果我使用gfortran编译这样一个简单的Fortran程序:
PROGRAM HELLO
WRITE(*,*) "HELLO WORLD"
END
我得到的代码看起来像这样(在x86-64上):
000000000040079d :
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>
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>
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>
400808: c9 leaveq
400809: c3 retq
在那里&#xff0c;您可以看到对gfortran库函数的三次调用(例如 gfortran_transfer_character_write ) . 看起来像gfortran插入这些来实现 WRITE 语句 . 库函数是implemented in C&#xff0c;最终将通过C库包装器调用底层系统调用 .
当编译器构造对这些函数的调用时&#xff0c;它必须遵循C调用约定并对调用语言的数据类型执行任何转换 . 除此之外&#xff0c;这里没有魔力 . 一旦进入运行时库&#xff0c;就可以调用其他C库(如libc) .