在计算机编程中,入口点是在程序中执行第一条指令的地方,和程序访问命令行参数的地方。要开始一个程序的执行,装载器或操作系统会将控制权传递到它的入口点。(在引导期间,操作系统自身就是这个程序)。这标志着从装载时(和动态连接时,如果存在的话)到运行时的转变。
对于某些操作系统和编程语言,入口点是运行时库,它是一组对语言的支持函数。库代码初始化程序并且接着把控制权传递给程序本身。在其他情况下,程序自身可以初始化运行时库。在简单的系统中,执行开始于第一条语句,这常见于解释型语言,简单的可执行格式,和引导装载器中。在其他情况下,入口点是在某个其他已知内存地址,这可以是绝对地址或相对地址(偏移量)。
可作为替代选择,程序的执行可以开始于命名点,要么是编程语言或操作系统定义的约定名字,要么是调用者指定的名字。在很多C家族语言中,这是叫做main
的函数;作为结果,入口点经常叫做主函数。在JVM语言比如Java中,入口点是叫做main
的静态方法;在CLI语言比如C#中,入口点是叫做Main
的静态方法。
在现代的计算机体系中,CPU 下一次要执行的指令地址由一个寄存器指出,称为“指令指针”(Instruction Pointer、IP)或“程序计数器”(Program Counter、PC)。该寄存器在系统上电或复位时由硬件电路置为某地址值,位于该地址的程序即可视为整个程序的入口点。这个概念一般只在嵌入式程序(固件)或操作系统的引导代码中使用,因为给非嵌入式系统写的程序通常包含数量庞大的机器指令、以至于关注一两个机器指令是没有意义的。
而所谓的“可执行”,说白了就是这个文件存储了一些信息、好创造某个让程序可以开始运行的内存状态,而操作系统装载并创建进程的步骤就是把这个满是机器指令的内存状态复原出来并开始运行。因此,可执行文件中的“程序入口点”表示把加载进来的哪个地址当作“开始运行”的那一条指令。
在C语言或C++编程语言,main
的函数原型如下所示:
int main(void)int main()int main(int argc, char *argv)