从标准的角度理解程序设计语言
相信有很多人在大学开始接触C++的时候都是从Visual C++6.0开始的,我也不例外。对Complie、Build、Run那三个小按钮记忆犹新啊,以至于后来再用Visual Studio、Eclipse、CodeWarrior的时候总有一种异样的感觉,怎么没有Complie按钮,怎么没有Run按钮呢,Build怎么改名Make了。。。最惨的是到了Linux下,发现连IDE都没有了(那时其实也不知IDE为何物),程序在gedit里写,编译要到命令行下面去,编译前先改makefile,Build按钮已不知沦为何物。。。。。。一夜回到解放前有木有!
先入为主这种东西真可怕,VC6.0的先入为主,让我在很长一段时间里都觉得C++就等于VC6.0,写个C++程序就是在VC6.0里建一个“Win32 Console Application”工程(话说我怎么从未怀疑过为什么那么多工程选项我们却每次都着了魔一样必须选“Win32 Console Application”呢,已经被控制台编程培养出奴性了吗),然后在Source Group里的main.c中写上自己的代码,最后Complie-〉Build-〉Run(红色感叹号),结果打印在小黑窗上,按任意键退出......这是多么天经地义、喜大普奔的啊。
但是这一切真的就是C++的全部吗,为什么要用工程组织源文件,工程如何组织源文件,IDE如何组织编辑器、编译器、链接器和调试器?直到我知道了有一个名为ISO/IEC 14882的国际标准,即标准C++后,我才发现我已坐井观天好多年,呜呼哀哉!
C++是一门程序语言,不是一个程序开发软件。既是语言,便牵扯两方面,一是如何说,即如何将自己的思维结果用语言表达出来;二是如何听,即如何复现语言所承载的思维结果,使之超越语言本身。当初Stroustrup在设计C++时,同时设计了C++语言本身和其编译器。C++语言所包含的元素及语法即是规范了我们如何说的问题,而编译器按照语言的设计规则对语言进行解析,即是解决了计算机如何听的问题。
本质来说任何语言都一样,都是一系列约定俗成的元素(语素)与规则(语法)的集合,最终目的是传达思想(语义)。只有大家基于同一套规则和元素集输出,再基于同样的规则和元素集对输入进行解析,才能实现完整无误的信息传递。而这套规则与元素集,就是标准。所以,语言是一种标准且仅是一种标准。当我们用语言来表达我们的思维结果时,就有了程序。为了确保我们的思维结果能够被计算机正确理解,且能够被许多种不同平台的计算机所理解,我们都应遵循该标准进行输出,同时所有的编译器也都以该标准作为解析的唯一标准,于是我们的思维就可以成为计算机上成功运行并能完成一定功能的程序。
简单的说,语言是一种标准,有了标准就可以消除语言差异对于可移植性的障碍。为了在不同平台上实现一次编写,到处运行,大家都应该遵循统一的规则,即标准。
--------------------------------------------------------------------------------------------
下面再简单记录一些零散的知识点,由下面这些想到了上面的那些。
ANSI C是现行的C语言标准,在此之前,普遍以K&R C作为一种事实上的标准(Classic C)。 ANSI C不仅定义了C语言,还定义了一个ANSI C实现必须支持的标准C库。
类似的,贝尔实验室最初的C++版本也被作为事实上的标准,直到ANSI/ISO C++标准的出现,该标准也提供了C++标准类库的定义。
因此对于使用非标准库(或标准类库)的程序,则要考虑该库是否具备可移植性。
任何仅仅使用标准C并且没有任何硬件依赖假设的代码实际上能保证在任何平台上用遵循C标准的编译器编译成功。
C++的实现(由标准变成可运行的程序,由抽象到具体):
1.VS系(Microsoft Visual C++,Borland C_++,Watcom C++,Symantec C++,Codewarrior等),特点是提供集成开发环境(IDE),管理程序开发的所有步骤;
2.GNU系(AT&T C++,Unix/Linux上的GNU C++等),非集成开发环境,单纯的编译器程序,只能处理编译和链接阶段。
不同的系统下使用不同的编译器(跨平台特性),则会有不同的调用方法,生成的可执行文件也是依赖于系统的,不可能都是.exe。
UNIX/Linux/MS-DOS下一般都为命令行编译器,需要用户手动在命令行下启动编译器编译保存为“标准ASCII文本格式”的源代码文件。 Windows下采用IDE开发,一般需要创建工程并向工程中添加文件。必须确定的非常重要的一点是,需要创建的是什么类型的程序。若要编写通用的不要求平台特定代码的程序,即以字符模式运行的程序,则应选择Win32 Console App。总的来说应检查是否有COnsole、字符模式或DOS可执行等的选项,并使用之。
IDE通常提供Compile,Build/Make,Build All和Run,具体含义:
Compile 通常意味着对当前打开的文件中的代码进行编译。
Build/Make 通常意味着编译工程中所有源代码文件的代码(只重新编译被修改的文件)。
Build All 通常意味着重新编译所有的源代码文件。
Run 运行程序,如果没有执行前面的步骤,则会在运行程序前完成这些步骤。