① C++中什么是编译时,什么是运行时,二者有何区别
编译阶段主要进行语法的检查,无误。将程序代码转换成目标代码(二进制表示,打开看不懂),没有和操作系统进行连接,不能运行。完成连接后,程序能够进入系统运行。
运行时,一定是编译过的,没有语法错误。编译时,没有生成目标文件,可能有语法错误。
② 编程心得
编程
这是每个游戏编程FAQ里都有的问题。这个问题每星期都会在游戏开发论坛上被问上好几次。这是个很好的问题,但是,没人能给出简单的答案。在某些应用程序中,总有一些计算机语言优于其他语言。下面是几种用于编写游戏的主要编程语言的介绍及其优缺点。希望这篇文章能帮助你做出决定。
1、C语言
如果说FORTRAN和COBOL是第一代高级编译语言,那么C语言就是它们的孙子辈。C语言是Dennis Ritchie在七十年代创建的,它功能更强大且与ALGOL保持更连续的继承性,而ALGOL则是COBOL和FORTRAN的结构化继承者。C语言被设计成一个比它的前辈更精巧、更简单的版本,它适于编写系统级的程序,比如操作系统。在此之前,操作系统是使用汇编语言编写的,而且不可移植。C语言是第一个使得系统级代码移植成为可能的编程语言。
C语言支持结构化编程,也就是说C的程序被编写成一些分离的函数呼叫(调用)的集合,这些呼叫是自上而下运行,而不像一个单独的集成块的代码使用GOTO语句控制流程。因此,C程序比起集成性的FORTRAN及COBOL的“空心粉式代码”代码要简单得多。事实上,C仍然具有GOTO语句,不过它的功能被限制了,仅当结构化方案非常复杂时才建议使用。
正由于它的系统编程根源,将C和汇编语言进行结合是相当容易的。函数调用接口非常简单,而且汇编语言指令还能内嵌到C代码中,所以,不需要连接独立的汇编模块。
优点:有益于编写小而快的程序。很容易与汇编语言结合。具有很高的标准化,因此其他平台上的各版本非常相似。
缺点:不容易支持面向对象技术。语法有时会非常难以理解,并造成滥用。
移植性:C语言的核心以及ANSI函数调用都具有移植性,但仅限于流程控制、内存管理和简单的文件处理。其他的东西都跟平台有关。比如说,为Windows和Mac开发可移植的程序,用户界面部分就需要用到与系统相关的函数调用。这一般意味着你必须写两次用户界面代码,不过还好有一些库可以减轻工作量。
用C语言编写的游戏:非常非常多。
资料:C语言的经典着作是《The C Programming Language》,它经过多次修改,已经扩展到最初的三倍大,但它仍然是介绍C的优秀书本。一本极好的教程是《The Waite Group's C Primer Plus》。
2、C++
C++语言是具有面向对象特性的C语言的继承者。面向对象编程,或称OOP是结构化编程的下一步。OO程序由对象组成,其中的对象是数据和函数离散集合。有许多可用的对象库存在,这使得编程简单得只需要将一些程序“建筑材料”堆在一起(至少理论上是这样)。比如说,有很多的GUI和数据库的库实现为对象的集合。
C++总是辩论的主题,尤其是在游戏开发论坛里。有几项C++的功能,比如虚拟函数,为函数呼叫的决策制定增加了一个额外层次,批评家很快指出C++程序将变得比相同功能的C程序来得大和慢。C++的拥护者则认为,用C写出与虚拟函数等价的代码同样会增加开支。这将是一个还在进行,而且不可能很快得出结论的争论。
我认为,C++的额外开支只是使用更好的语言的小付出。同样的争论发生在六十年代高级程序语言如COBOL和FORTRAN开始取代汇编成为语言所选的时候。批评家正确的指出使用高级语言编写的程序天生就比手写的汇编语言来得慢,而且必然如此。而高级语言支持者认为这么点小小的性能损失是值得的,因为COBOL和FORTRAN程序更容易编写和维护。
优点:组织大型程序时比C语言好得多。很好的支持面向对象机制。通用数据结构,如链表和可增长的阵列组成的库减轻了由于处理低层细节的负担。
缺点:非常大而复杂。与C语言一样存在语法滥用问题。比C慢。大多数编译器没有把整个语言正确的实现。
移植性:比C语言好多了,但依然不是很乐观。因为它具有与C语言相同的缺点,大多数可移植性用户界面库都使用C++对象实现。
使用C++编写的游戏:非常非常多。大多数的商业游戏是使用C或C++编写的。
资料:最新版的《The C++ Programming Language》非常好。作为教程,有两个阵营,一个假定你知道C,另外一个假定你不知道。到目前为止,最好的C++教程是《Who's Afraid of C++》,如果你已经熟知C,那么试一下《Teach Yourself C++》。
3、我该学习C++或是该从C开始
我不喜欢这种说法,但它是继“我该使用哪门语言”之后最经常被问及的问题。很不幸,不存在标准答案。你可以自学C并使用它来写程序,从而节省一大堆的时间,不过使用这种方法有两个弊端:
你将错过那些面向对象的知识,因为它可能在你的游戏中使得数据建模更有效率的东西。
最大的商业游戏,包括第一人称射击游戏很多并没有使用C++。但是,这些程序的作者即使使用老的C的格式,他们通常坚持使用面向对象编程技术。如果你只想学C,至少要自学OO(面向对象)编程技术。OO是仿真(游戏)的完美方法,如果你不学习OO,你将不得不“辛苦”的工作。
4、汇编语言
显然,汇编是第一个计算机语言。汇编语言实际上是你计算机处理器实际运行的指令的命令形式表示法。这意味着你将与处理器的底层打交道,比如寄存器和堆栈。如果你要找的是类英语且有相关的自我说明的语言,这不是你想要的。
确切的说,任何你能在其他语言里做到的事情,汇编都能做,只是不那么简单 — 这是当然,就像说你既可以开车到某个地方,也可以走路去,只是难易之分。话虽不错,但是新技术让东西变得更易于使用。
总的来说,汇编语言不会在游戏中单独应用。游戏使用汇编主要是使用它那些能提高性能的零零碎碎的部分。比如说,毁灭战士整体使用C来编写,有几段绘图程序使用汇编。这些程序每秒钟要调用数千次,因此,尽可能的简洁将有助于提高游戏的性能。而从C里调用汇编写的函数是相当简单的,因此同时使用两种语言不成问题。
特别注意:语言的名字叫“汇编”。把汇编语言翻译成真实的机器码的工具叫“汇编程序”。把这门语言叫做“汇编程序”这种用词不当相当普遍,因此,请从这门语言的正确称呼作为起点出发。
优点:最小、最快的语言。汇编高手能编写出比任何其他语言能实现的快得多的程序。你将是利用处理器最新功能的第一人,因为你能直接使用它们。
缺点:难学、语法晦涩、坚持效率,造成大量额外代码 — 不适于心脏虚弱者。
移植性:接近零。因为这门语言是为一种单独的处理器设计的,根本没移植性可言。如果使用了某个特殊处理器的扩展功能,你的代码甚至无法移植到其他同类型的处理器上(比如,AMD的3DNow指令是无法移植到其它奔腾系列的处理器上的)。
使用汇编编写的游戏:我不知道有什么商业游戏是完全用汇编开发的。不过有些游戏使用汇编完成多数对时间要求苛刻的部分。
资料:如果你正在找一门汇编语言的文档,你主要要找芯片的文档。网络上如Intel、AMD、Motorola等有一些关于它们的处理器的资料。对于书籍而言,《Assembly Language: Step-By-Step》是很值得学习的。
5、Pascal语言
Pascal语言是由Nicolas Wirth在七十年代早期设计的,因为他对于FORTRAN和COBOL没有强制训练学生的结构化编程感到很失望,“空心粉式代码”变成了规范,而当时的语言又不反对它。Pascal被设计来强行使用结构化编程。最初的Pascal被严格设计成教学之用,最终,大量的拥护者促使它闯入了商业编程中。当Borland发布IBM PC上的 Turbo Pascal时,Pascal辉煌一时。集成的编辑器,闪电般的编译器加上低廉的价格使之变得不可抵抗,Pascal编程了为MS-DOS编写小程序的首选语言。
然而时日不久,C编译器变得更快,并具有优秀的内置编辑器和调试器。Pascal在1990年Windows开始流行时走到了尽头,Borland放弃了Pascal而把目光转向了为Windows 编写程序的C++。Turbo Pascal很快被人遗忘。
最后,在1996年,Borland发布了它的“Visual Basic杀手”— Delphi。它是一种快速的带华丽用户界面的 Pascal编译器。由于不懈努力,它很快赢得了一大群爱好者。
基本上,Pascal比C简单。虽然语法类似,它缺乏很多C有的简洁操作符。这既是好事又是坏事。虽然很难写出难以理解的“聪明”代码,它同时也使得一些低级操作,如位操作变得困难起来。
优点:易学、平台相关的运行(Dephi)非常好。
缺点:“世界潮流”面向对象的Pascal继承者(Mola、Oberon)尚未成功。语言标准不被编译器开发者认同。专利权。
移植性:很差。语言的功能由于平台的转变而转变,没有移植性工具包来处理平台相关的功能。
使用Pascal编写的游戏:几个。DirectX的Delphi组件使得游戏场所变大了。
资料:查找跟Delphi有关的资料,请访问:Inprise Delphi page。
6、Visual Basic
哈,BASIC。回到八十年代的石器时代,它是程序初学者的第一个语言。最初的BASIC形式,虽然易于学习,却是可怕的无组织化,它义无返顾的使用了GOTO充斥的“空心粉式代码”。当回忆起BASIC的行号和GOSUB命令,没有几个人能止住眼角的泪水。
快速前进到九十年代早期,虽然不是苹果公司所希望的巨人,HyperCard仍然是一个在Windows下无法比拟的吸引人的小型编程环境。Windows下的HyperCard克隆品如ToolBook又慢又笨又昂贵。为了与HyperCard一决高下,微软取得了一个小巧的名为Thunder编程环境的许可权,并把它作为Visual Basci 1.0发布,其用户界面在当时非常具有新意。这门语言虽然还叫做Basic(不再是全部大写),但更加结构化了,行号也被去除。实际上,这门语言与那些内置于TRS-80、Apple II及Atari里的旧的ROM BASIC相比,更像是带Basic风格动词的Pascal。
经过六个版本,Visual Basic变得非常漂亮。用户界面发生了许多变化,但依然保留着“把代码关联到用户界面”的主旨。这使得它在与即时编译结合时变成了一个快速原型的优异环境。
优点:整洁的编辑环境。易学、即时编译导致简单、迅速的原型。大量可用的插件。虽然有第三方的DirectX插件,DirectX 7已准备提供Visual Basic的支持。
缺点:程序很大,而且运行时需要几个巨大的运行时动态连接库。虽然表单型和对话框型的程序很容易完成,要编写好的图形程序却比较难。调用Windows的API程序非常笨拙,因为VB的数据结构没能很好的映射到C中。有OO功能,但却不是完全的面向对象。专利权。
移植性:非常差。因为Visual Basic是微软的产品,你自然就被局限在他们实现它的平台上。也就是说,你能得到的选择是:Windows,Windows或Widnows。当然,有一些工具能将VB程序转变成java。
使用Visual Basic编写的游戏:一些。有很多使用VB编写的共享游戏,还有一些是商业性的。
资料:微软的VB页面有一些信息。
7、Java
Java是由Sun最初设计用于嵌入程序的可移植性“小C++”。在网页上运行小程序的想法着实吸引了不少人的目光,于是,这门语言迅速崛起。事实证明,Java不仅仅适于在网页上内嵌动画 — 它是一门极好的完全的软件编程的小语言。“虚拟机”机制、垃圾回收以及没有指针等使它很容易实现不易崩溃且不会泄漏资源的可靠程序。
虽然不是C++的正式续篇,Java从C++ 中借用了大量的语法。它丢弃了很多C++的复杂功能,从而形成一门紧凑而易学的语言。不像C++,Java强制面向对象编程,要在Java里写非面向对象的程序就像要在Pascal里写“空心粉式代码”一样困难。
优点:二进制码可移植到其他平台。程序可以在网页中运行。内含的类库非常标准且极其健壮。自动分配合垃圾回收避免程序中资源泄漏。网上数量巨大的代码例程。
缺点:使用一个“虚拟机”来运行可移植的字节码而非本地机器码,程序将比真正编译器慢。有很多技术(例如“即时”编译器)很大的提高了Java的速度,不过速度永远比不过机器码方案。早期的功能,如AWT没经过慎重考虑,虽然被正式废除,但为了保持向后兼容不得不保留。越高级的技术,造成处理低级的机器功能越困难,Sun为这门语言增加新的“受祝福”功能的速度实在太慢。
移植性:最好的,但仍未达到它本应达到的水平。低级代码具有非常高的可移植性,但是,很多UI及新功能在某些平台上不稳定。
使用Java编写的游戏:网页上有大量小的Applet,但仅有一些是商业性的。有几个商业游戏使用Java作为内部脚本语言。
资料:Sun的官方Java页面有一些好的信息。IBM也有一个非常好的Java页面。JavaLobby是一个关于Java新闻的最好去处。
8、创作工具
上面所提及的编程语言涵盖了大多数的商业游戏。但是也有一个例外,这个大游戏由于它的缺席而变得突出。
“神秘岛”。没错,卖得最好的商业游戏不是使用以上任何一门语言编的,虽然有人说“神秘岛”99%是使用 3D建模工具制作的,其根本的编程逻辑是在HyperCard里完成的。
多数创作工具有点像Visual Basic,只是它们工作在更高的层次上。大多数工具使用一些拖拉式的流程图来模拟流程控制。很多内置解释的程序语言,但是这些语言都无法像上面所说的单独的语言那样健壮。
优点:快速原型 — 如果你的游戏符合工具制作的主旨,你或许能使你的游戏跑得比使用其他语言快。在很多情况下,你可以创造一个不需要任何代码的简单游戏。使用插件程序,如Shockware及IconAuthor播放器,你可以在网页上发布很多创作工具生成的程序。
缺点:专利权,至于将增加什么功能,你将受到工具制造者的支配。你必须考虑这些工具是否能满足你游戏的需要,因为有很多事情是那些创作工具无法完成的。某些工具会产生臃肿得可怕的程序。
移植性:因为创作工具是具有专利权的,你的移植性以他们提供的功能息息相关。有些系统,如Director可以在几种平台上创作和运行,有些工具则在某一平台上创作,在多种平台上运行,还有的是仅能在单一平台上创作和运行。
使用创作工具编写的游戏:“神秘岛”和其他一些同类型的探险游戏。所有的Shockwave游戏都在网络上。
资料:Director、HyperCard、SuperCard、IconAuthor、Authorware。
9、结论
你可能希望得到一个关于“我该使用哪种语言”这个问题的更标准的结论。非常不幸,没有一个对所有应用程序都最佳的解决方案。C适于快而小的程序,但不支持面向对象的编程。C++完全支持面向对象,但是非常复杂。Visual Basic与Delphi易学,但不可移植且有专利权。Java有很多简洁的功能,但是慢。创作工具可以以最快的速度产生你的程序,但是仅对某一些类型的程序起作用。最好的方法是决定你要写什么样的游戏,并选择对你的游戏支持最好的语言。“试用三十天”的做法成为工业标准是件好事情。
③ 练习1.1.2:编译器相对于解释器的优点是什么解释器相对于编译器的优点是什么
编译器是把源程序的每一条语句都编译成机器语言,并保存成二进制文件,这样运行时计算机可以直接以机器语言来运行此程序,速度很快;
而解释器则是只在执行程序时,才一条一条的解释成机器语言给计算机来执行,所以运行速度是不如编译后的程序运行的快的.
这是因为计算机不能直接认识并执行我们写的语句,它只能认识机器语言(是二进制的形式)
④ 编译器和解释器的主要区别是什么他们相对于对方各自的优点
解释器是解释执行的源代码,编译器是将源代码编译成目标代码
他们最大的区别是程序运行时需要解释器边解释边执行,而编译器则在运行时是完全不需要的
解释器的优点是比较容易让用户实现自己跨平台的代码,比如java,php等,同一套代码可以在几乎所有的操作系统上执行,而无需根据操作系统做修改;
编译器的目的就是生成目标代码再由连接器生成可执行的机器码,这样的话需要根据不同的操作系统编制代码,虽然有像Qt这样的源代码级跨平台的编程工具库,但在不同的平台上仍然需要重新编译连接成可执行文件,但其执行效率要远远高于解释运行的程序。
编译器是把源程序的每一条语句都编译成机器语言,并保存成二进制文件,这样运行时计算机可以直接以机器语言来运行此程序,速度很快;
而解释器则是只在执行程序时,才一条一条的解释成机器语言给计算机来执行,所以运行速度是不如编译后的程序运行的快的.
这是因为计算机不能直接认识并执行我们写的语句,它只能认识机器语言(是二进制的形式)
⑤ 编译器具体实现中比较巧妙,智能的思想有什么呢
可以作为解释器性能升级的一个简单路径,写解释器的代码而得到初级编译器的性能。事实上JamVM的解释器可以配置为多种实现方式:switch-threading、indirect-threading、direct-threading、inline-threading,它们的差别仅在于对opcode的dispatch方式不同;所有实现方式都共享同一份handler代码。
这种做法的缺点是:
这样写得到的“编译器”无论从代码组织还是程序思路都还是解释器的那套,从编译器的角度看很别扭。它最终实现出来效果跟从编译器角度出发的template-based JIT一样,但我觉得后者的思路更直观,代码也通常更清晰一些。
这种做法仍然无法跨越字节码边界做任何优化,因为每个opcode对应一个单独的handler,而这种做法的代码生成仅仅是把handler拷贝到一起而已。
要在它的基础之上进一步提高性能可以直接对字节码序列做些简单模式匹配,以便跨越字节码边界做优化。但这样做通常是自讨苦吃,工程上很难持续下去。
⑥ 编译器和开发环境的关系
谈谈程序设计语言、编译器和开发环境之间的关系
许多初学者都会对这三个概念区分不清,应该说这三个概念是完全不同的,不能混为一谈。在本文中,我就尽我最大的能力来讲讲这三个概念以及他们之间的关系。
首先说程序设计语言,它同人类的自然语言一样也是一个语言,并且它是自然语言的一个子集。大家都知道自然语言是极其庞大和复杂的系统,具有很多不不确定性和不精确性,因此至今我们也没有办法对自然语言进行形式化的描述。程序设计语言只是自然语言的一个很小的子集,在计算机系统中,一切都是需要确定性和精确性的描述,因此程序设计语言也是极为规范的,在程序设计语言中,几乎就不允许存在不确定性和不精确性,也就是说不能存在文法的二义性。这样一个程序设计语言就可以通过一系列的产生式来进行形式化的描述,这一系列的产生式就被称为文法,语言就是由文法来定义的。从另外一个角度来说,一个程序设计语言,它仅仅是一个语言,它只对程序进行形式上的要求。或者说,程序设计语言对应于编程中的编码阶段。我们有必要对程序开发的三个阶段进行了解,程序开发从时间先后顺序上可以分为三个阶段:1.编码阶段,2.编译阶段,3.运行阶段。在编码阶段,我们使用的就是程序设计语言。语言除了定义了文法以外,其他的任何事情他都不做。当然一种语言也有很多种版本,比如 BASIC 语言,就有很多种版本,C语言也是如此。这里所讲的语言的版本与编译器的版本是不一样的。C语言的标准版本就是 ANSI C,如果初学者会提出这样的问题“C语言哪个更好?”,这样的问题反映出他们对语言与编译器之间的关系的认识的不足。如果从语言的角度来讲 VC 和 TC 是没有多大区别的,他们基本上都能支持 ANSI C。
再来看看编译器。编译器与语言的关系就是,翻译者与语言的关系。编译器就是一个翻译,他把使用某种语言书写的源程序,翻译成为等价的使用目标语言书写的目标程序。前面我们也说了,语言是一个抽象的概念,是由文法来定义的。唯一实在的东西,也就是定义语言的文法。在使用语言时,我们只能说,使用这种语言去书写一段程序。编译器则是能够将某种语言的源程序进行翻译,然后生成目标程序。我们通常会说,某个编译器支持了什么语言,也就是说这个编译器能识别并翻译这种语言。现在的C编译器,一般都是支持了 ANSI C 语言的,另外,编译器的设计者可能还会对 ANSI C 进行一定的扩充,而且各个编译器进行扩充功能都是不同的,因此可能就会出现一个编译器诞生以后,就会出现一个新的语言的现象。TC 和 VC 就分别对 ANSI C 进行了不同的扩充,比如在 TC 中有 far 等关键字,ANSI C 中是没有的,在 VC 中有内嵌汇编的语法 _asm,而在 TC 中则是使用 asm 关键字,这些内容在 ANSI C 中没有的。编译器的输入时源程序,而其输出则是目标程序。一般情况下,源程序是使用某种高级语言书写的,而目标程序则是某个特定机器的机器语言程序。另一方面,编译器除了提供编译功能,还会提供一些运行库。所谓运行库就是由一些事先写好的子程序所组成的子程序库。例如C语言中的 printf 函数,就是由C的运行库提供的。在 ANSI C 中定义了一些C语言的标准库函数,这些库函数是标准C必须具备的,也可以说这些库函数成为了 ANSI C 的一个部分。另外,不同的编译器还可以提供自己的,非标准的库给用户使用,在 TC 中的 Graphics 库,其实就是由 TC 提供的,它不是属于 ANSI C 的。简单的说,编译器是由编译程序和运行库组成的。在程序的编译阶段,就是使用编译器对源程序进行编译生成目标程序。
在程序的运行阶段则是在一个特定的平台上,由这个平台来执行编译生成的程序。Java 虚拟机是一个平台,DOS 和 Windows 也是平台,编译器的作用就是沟通源程序和程序的运行平台。源程序相对于一个运行平台来说是不可识别的,但当编译器将源程序编译成为这个平台所能够识别的目标语言以后,程序就可以在这个平台上运行了。
应该看到,编译器在其中起到了很重要的作用。我们现在可以明确一些概念了,程序设计语言只是语言,它本身很难说有什么好坏,这就如同说“汉语和英语哪个好”一样。使用某一种程序设计语言,我们可以书写自己的程序,从而向计算机表达自己希望完成的功能。这个阶段,我们称为编码阶段。编译器由编译程序和运行库组成,编译程序负责将源程序翻译成为目标程序,运行库提供了一些基本的子程序给程序编写者使用。我们可以说编译器是否支持某种语言,例如 TC 编译器是支持 ANSI C 的,而 GCC 则是一个能够支持多种语言的编译器。然而不同的编译器除了提供对某种语言的支持以外,还可能对该语言进行了某些功能扩充。编译器在对语言的支持上,差别都是不太大的,这是因为许多语言都制定了一个标准,例如 ANSI C。编译器的另外一个重要特性,就是对运行平台的支持。平台指的是一个程序运行所需要的所有软件和硬件的基础。编译器对运行平台的支持,是通过将源程序编译成为目标程序,以及编译器所提供的运行库来实现的。例如,TC只能将C源程序编译生成,使用 80x86 CPU,操作系统为 DOS 的 16bit DOS 程序。VC只能将C源程序编译生成 80x86 CPU、操作系统为 Windows 的 32bit Windows 程序。使用编译器对源程序进行编译被称为编译阶段,这个阶段编译程序将源程序编译为某个平台的目标代码。程序在具体的平台上运行时,被称为运行阶段。应该指出,在编码阶段使用到的是程序设计语言,以及编译器所提供的库函数,这个阶段产生的是源程序。在编译阶段使用的是源程序和编译器,这个阶段产生的是目标程序。在运行阶段使用到的是目标程序和运行平台,这个时候产生的是程序运行结果。
因此说讨论一个程序设计语言好坏没有多大意义,因为他们使用的场合不同,比如汇编语言和 Java 语言,要谈论这两个语言的好坏是没有实际意义的。而说“C语言哪个好”之类的话也是没有意义的,我想大家学的C也就是在 ANSI C 基础上的C,并且不同的C语言之间的差别是极小的。我们通常指的 TC、VC 都是指编译器,而不是语言。编译器能够支持一种或者多种的程序设计语言,TC 能够支持 ANSI C,VC 能够支持 ANSI C 和 ANSI C++,而 GCC 则是一个支持多语言的编译器。如果真要说 VC 比 TC 好,只能说 VC 编译器提供的库函数更多,并且 VC 能够支持的平台是 Windows,而 VC 编译出来的代码也都是 32bit 的。
在以上概念中纠缠了这么久,我也不再想多说了。再来看开发环境。为了能够方便程序设计者进行编码、调试等工作,编译器制造商在制作好一个编译器以后,都会提供一个集成开发环境(又称为IDE)。在这个 IDE 中,用户可以完成编码、编译、调试、运行的全部工作。并且在最新的IDE中,可能还会提供一个可视化的设计功能,可以方便用户进行程序界面的设计。例如 VB 等。另外一个方面,开发环境除了包括 IDE 以外,还包括了程序运行的平台。比如硬件是 IBM PC 兼容机,操作系统是 Windows 等。
可能,能讲的也就这么多了,感觉讲的并不是很好,不过我已经尽力了。有些东西是很难说清楚的,“只能意会不可言传”指的就是这个了。不要怪我讲的不好,还是自己用心去理解和体会吧。
⑦ 请问java程序在编译和运行时有什么区别,系统分别都会做什么
Java程序的编译
使用命令: javac *.java
编译时,会将写的.java文件(高级语言),生成相应的字节码文件.class文件(二进制代码)
Java程序的执行
使用命令:java *
流程: 加载到 -- 连接 ---- 初始化 ...
运行时,首先会由将相应的.class文件,加载到内存中,并验证.class文件的有效性,将相应类的Class加载到内存中,并对类中的静态变量进行初始化操作,然后就由 主 类开始执行
具体的可以看一下 JVM 类加载过程,以及jVM的内存分配机制
⑧ C语言文件的编译与执行的四个阶段并分别描述
开发C程序有四个步骤:编辑、编译、连接和运行。
任何一个体系结构处理器上都可以使用C语言程序,只要该体系结构处理器有相应的C语言编译器和库,那么C源代码就可以编译并连接到目标二进制文件上运行。
1、预处理:导入源程序并保存(C文件)。
2、编译:将源程序转换为目标文件(Obj文件)。
3、链接:将目标文件生成为可执行文件(EXE文件)。
4、运行:执行,获取运行结果的EXE文件。
(8)从编译器到运行时的感受扩展阅读:
将C语言代码分为程序的几个阶段:
1、首先,源代码文件测试。以及相关的头文件,比如stdio。H、由预处理器CPP预处理为.I文件。预编译的。文件不包含任何宏定义,因为所有宏都已展开,并且包含的文件已插入。我归档。
2、编译过程是对预处理文件进行词法分析、语法分析、语义分析和优化,生成相应的汇编代码文件。这个过程往往是整个程序的核心部分,也是最复杂的部分之一。
3、汇编程序不直接输出可执行文件,而是输出目标文件。汇编程序可以调用LD来生成可以运行的可执行程序。也就是说,您需要链接大量的文件才能获得“a.out”,即最终的可执行文件。
4、在链接过程中,需要重新调整其他目标文件中定义的函数调用指令,而其他目标文件中定义的变量也存在同样的问题。
⑨ 运行时和编译时有没有什么区别
运行时 编译连接并运行 大概意思检查错误并运行,如果错了,则返回重新编译,通过则运行
编译时 编译连接 检查错误,并不运行,不管对错,都返回编译状态.
关于SIZEOF()
SIZEOF() ()里加数据类型,则计算此数据类型所占的内存字节数.
如 SIZEOF( int ) 计算int型所占的内存字节数.
SIZEOF() ()里还可以加字符串或一个字符串数组,计算这个字符串的长度,即所占的内存字节数.
如 SIZEOF(abcd) 计算abcd这个字符串所占的内存字节数,
注意:
计算结果为5,字符型每个字符占一个字节,还有一个隐藏的\0,用来结束字符串的,所以要多加一个字节.
⑩ 精品赏析:一个.NET程序在编译和运行时都做了些什么
run-time)和运行原理 (CPU-specific binary or pseudo-code)的疑问。 这里是一个简单的回答:当你编译一个C#应用程序或任何一种CLS(Commmon Language Specification)兼容的语言时,它将首先被编译成一种称为IL (Intermediate Language)的伪代码(pseudo-code)。在这个应用程序第一次 被运行的时候,这种IL代码将被编译成机器代码,用于执行。也就是说从源代码 到得到运行结果,进行了两次编译。事实上,只有那些被真正使用的函数代码 才会被进行第二次编译。下面揭示开发过程中被隐藏起来的细节: 1) 你用C#开发一些程序 2) 用C#编译器或CLS兼容的编译器编译成EXE 3) 编译器将生成的IL代码和附加信息(manifest)放入拥有一个标准PE头的Win32 可执行文件的只读部分。 4) 编译器在创建这个可执行文件时导入(import)一个名为_CorExeMain的函数。 这个函数是.NET EE(execution engine)--.NET运行期引擎的入口函数。 5) 当执行这个Win32可执行文件时,因为其主要是依赖于DLL的PE文件,操作系 统将会调用位于MSCorEE.DLL中的_CorExeMain函数。 6) 操作系统通过PE文件里的进入点,调用MSCorEE.DLL。并能保证在Windows里 可以有很多程序同时运行。 7) 因为操作系统不能执行.NET IL代码,EXE里的进入点只是简单的中介,它将 指示操作系统调用_CorExeMain函数。 8) 随后_CorExeMain函数开始解释位于PE文件中的IL代码。 9) 因为IL是不能被直接执行的, .NET EE使用称为JITter (Just In Time compiler) 这一即时编译过程只在第