gnatmake source.adb
所以我不知道gnatmake实际上做了什么或者是什么(脚本?二进制?其他什么?)。无论如何,我想知道编译器本身(也是解析器,如果用不同的语言编写)用什么语言编码?
答案 0 :(得分:5)
您的典型编译器带有两个基本工具:编译器和链接器。
编译器将语言源代码(文本)转换为机器语言对象文件(二进制文件)。它可能包含一些对象重定位信息,以帮助链接器。
链接器接受多个机器语言目标文件,并将它们全部链接到一个机器可执行文件中。
您通常必须告诉编译器在哪里可以找到执行编译所需的所有额外文件,然后您必须告诉链接器将您的可执行文件(包括系统库)链接在一起所需的每个文件的名称。使用。这可能会变得非常复杂,这就是make
等构建工具的用武之地。
Ada的定义方式应该始终有某种图书馆员来跟踪这些信息。因此,要执行系统的完整构建,您应该做的就是让图书管理员为您构建可执行文件。
Gnat
处理此库管理程序功能的方式是假设(除非另有说明)Ada单元(包)名称与源文件名和目标文件名之间存在一对一的对应关系。因此,如果它需要X
的规范来完成编译,它就知道转到X.ads
来查找规范文件。当它的链接时间,它知道它将在X.o
中找到它的目标文件。这意味着如果它需要从包X
开始成功链接的例程,它就知道如何为你做这件事,一个愚蠢的链接器只会失败并告诉你“符号”的半加密名称找不到。
因此,您不必为程序中的每个单元键入单独的编译命令,就像使用C或C ++一样,您只需使用gnatmake
来编译给定可执行名称所需的每个单元,并且然后将它们链接在一起。一步,容易腻。
关于你的上一个问题,Gnat Ada编译器几乎完全是用Ada编写的。编译器用他们自己的语言编写并使用自己编译是很典型的。这称为self-hosting。
但是,它与GCC相关联,因此GCC中常见的部分(从树格式转换为目标对象代码的部分和我认为的链接器)都是用C语言编写的。
答案 1 :(得分:4)
在GCC源代码树(gcc/ada
)的Ada部分中,有大约2000个Ada源文件和~50个C源文件。 C充当操作系统和GCC其他部分的粘合剂。一些(至少50个)Ada源文件用于gnatmake等工具。
您可以通过各种方式使用gnatmake
选项详细了解-v
的内容:我最常使用的选项gnatmake -v source.adb
用于概述,gnatmake source.adb -cargs -v
到显示如何调用编译器,gnatmake source.adb -largs -v
以概述GNAT链接器gnatlink
的作用,并gnatmake source.adb -largs -Wl,-v
详细说明gnatlink
如何调用系统链接器。
答案 2 :(得分:2)
gnatmake只是一个用Ada编写的工具。它就像制作一样。编译器本身也是GNAT,也是用Ada编写的。它是GCC的一部分,用很多语言编写。
答案 3 :(得分:1)
回答问题的部分“它是什么?”并且假设您使用的是unix / linux类型系统:
$ which gnatmake
/usr/bin/gnatmake
$ file /usr/bin/gnatmake
/usr/bin/gnatmake: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.15, stripped
...所以它是二进制:)