主程序

科普中国-科学百科 2018-02-13

  主程序,也称主函数,在许多命令式程序设计语言里,主函数main function)是程序开始运行的地方。而相对地,其它编程范式的语言中就很少会有这样一个概念。

  编程语言的相异性机器/汇编语言

  在现代的计算机体系中,CPU 下一次要执行的指令地址由一个寄存器指出,称为“指令指针”(Instruction Pointer、IP)或“程序计数器”(Program Counter、PC)。该寄存器在系统上电或复位时由硬件电路置为某地址值,位于该地址的程序即可视为整个程序的入口点。

  这个概念一般只在嵌入式程序(固件)或操作系统的引导代码中使用,因为给非嵌入式系统写的程序通常包含数量庞大的机器指令、以至于关注一两个机器指令是没有意义的。

  可执行文件

  所谓“可执行”,说白了就是这个文件存储了一些信息、好创造某个让程序可以开始运行的内存状态,而操作系统装载并创建进程的步骤就是把这个满是机器指令的内存状态复原出来并开始运行。因此,可执行文件中的“程序入口点”表示把加载进来的哪个地址当作“开始运行”的那一条指令。

  C/C++

  在C语言或C++编程语言,main的函数原型如下所示:

  int main(void)int main()int main(int argc, char *argv[])

  main的两个环境参数:argc(argument count)与argv(argument vector),两者个别自程序的指令列给予参数的数量与参数数组的指针地址。argc与argv这两个参数的名称,在编程语言的命名规则底下,虽然可以依照用户的喜好自行定义,但是一般在使用上,还是会以现有的名称argc与argv来进行程序的编写。其他具有相依平台的格式也可以被C与C++标准所接受;例如,UNIX(非POSIX.1)与Microsoft Visual C++有第三个参数,是用来接收程序的环境变量,利用其他方法访问环境变量,可以使用stdlib.h头文件定义的getenv函数:

  int main(int argc, char *argv[], char *envp[])

  Mac OS X与Apple Darwin有第四个参数,它含有操作系统支持性的信息,很像是运行二进制文件的路径:

  int main(int argc, char *argv[], char *envp[], char *apple[])

  由main传给操作系统的传回值,代表程序处理的结束状态,在C的标准里有定义两个传回值:EXIT_SUCCESS(通常是整数零0值)与EXIT_FAILURE。由于在实现上考量到各种的可能性,所以依照可能会发生的状态来定义传回值。

  依照一般使用的规则,指令列参数的第一个元素就是代码文件案的名称,假如代码文件案的名称为rm.exe,当用户在指令列输入rm file后,用户界面的程序shell会初始化rm.exe进程,设置环境变量argc = 2以及argv = ["rm", "file"]。

  main这个名称是一个特有的名称;正常来说,用户在每个C与C++程序自定的函数名称,必须不同于main这个名称。

  在C++里,main一定是在全域的名称空间内(例如:::main),它不可以是类别或是实体的成员函数。

  由于前置处理器的关系,以下main函数源代码可适用于Microsoft Visual C++与Dev-C++:1

  #ifndef _MSC_VERint#elsevoid#endifmain(int argc, char** argv){    // 程式码    system("PAUSE");    return#ifndef _MSC_VER    EXIT_SUCCESS#endif    ;}WinMain

  以微软视窗为基础的程序设计上,WinMain函数是视窗程序的进入点,函数原型如下所示:

  int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow);.Net 语言(C#、VB 等)

  以C#编写的程序,在开始运行时CLR会先去查找带有.entrypointIL标示的静态方法,而这个静态方法可能没有参数,或是只有单一string[]类型的参数,而且还有void或是int类型的传回值,找到后才会运行这个方法,而这个方法就是主函数。

  static void Main();static void Main(string[] args);static int Main();static int Main(string[] args);

  指令列参数会被引入到args变量内,引入的方式与Java相类似。但是,针对有整数传回值的Main而言,引入的方式类似C/C++,而指令列参数会被当成进程的结束状态,传回给操作系统或是运行它的外部环境。

  同为 .net 语言的Visual Basic .NET大体也是一样。不过不同的是,旧版本Visual Basic的程序可以选择在执行默认初始化步骤后以一个窗体启动,此时的主函数是不可见的;新版本为了兼容性和简化编码工作而保留了这个特性。

  Java

  Java编程语言是以main方法来当做程序开始的起点,方法如下:

  public static void main(String[] args)

  命令行指定参数是args。如同C和C++一样,“main”也是唯一的。Java的main方法无任何的传回值。

  Pascal

  Pascal的主要程序是不需命名的。因为Pascal程序的程序和函数在编写程序上比C、C++或是Java更加严格,在程序里主要程序通常才是最后的程序。Pascal没有main或是其他相类似的关键字。

  以下是Hello world示例:

  procedure hello() begin  writeln('Hello world')end;begin  hello() end.Pike

  Pike与C/C++的语法相类似。从main开始运行。“argc”代表环境参数的个数。“argv”代表环境参数的值。

  举例如下:2

  int main(int argc, array(string) argv)

  本词条内容贡献者为:

  张磊 - 副教授 - 西南大学

责任编辑:科普云

科普中国APP 科普中国微信 科普中国微博
科普中国-科学百科
是中国科协为深入推进科普信息化建设而塑造的全新品牌,旨在以科普内容建设为重点,充分依托现有的传播渠道和平台,使科普信息化建设与传统科普深度融合,以公众关注度作为项目精准评估的标准,提升国家科普公共服务水平。

猜你喜欢