一个例子可能会有所帮助:如果我用 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 库包装器调用底层系统调用。
当编译器构造对这些函数的调用时,它必须遵循 C 调用约定并执行与调用语言的数据类型之间的任何转换。除此之外,这里没有魔法。进入运行时库后,您可以调用其他 C 库(如 libc)。