我正在为项目创建自己的编程语言,并正在实现扫描程序,解析器和语义分析器。我希望这种语言与Java或C ++类似,因为它们有一个名为main的方法,它被执行。我的语法允许程序由一个或多个方法组成(理想情况下,一个方法将命名为main
),但语法只是查找标识符作为方法名称。由于main不是Java或C ++中的保留字,它们如何能够强制使用名为main的方法?拥有一个没有main方法的程序(除了类文件或接口,它们通常没有)是一个错误。这是在语义分析部分完成的吗?或者这会在稍后的链接器/加载器中发生?
我一直想知道的其他主要方法是如何首先执行。我知道当我编写一个程序时,例如,有5个方法(其中一个是main),当我运行程序时,在开始执行的程序是main。这是我被教导和接受的事情之一,并且为什么会这样,这是有意义的。但是,编译器如何知道从其他方法执行该特定方法?
答案 0 :(得分:0)
您的main
ISN' T首先执行 - 它将成为一些样板启动代码,用于设置程序运行所需的环境(例如,初始化全局变量)。编译完成后,将调用链接器,将此启动文件指定为第一个目标文件(在编译器从源文件生成的目标文件之前)。首先执行启动代码仅仅是因为最终可执行文件中的这个显着位置;它最后要做的就是打电话给你main
。链接器的一部分工作是解析对名为main
的实际函数/方法的引用,无论它在对象文件中的哪个位置。
缺少main
不是语法错误 - 毕竟,它可能在与您当前正在编译的源文件不同的源文件中定义。该错误实际上是由于链接器无法从启动代码中解析该引用。
(请注意,我的语言非常笼统,关于一整套已编译的编程语言。不同语言,同一语言的不同实现以及平台之间的细节会有所不同。)