用php写个简单的编程,php程序开发教程
零基础学习PHP编程——程序的编写和运行过程
注意:本文主要是写给零基础的学生,作为编程入门指南。如有错误,请指正。
访问源站
欢迎交流QQ群:640765823
回顾上一节,我们已经基本了解了计算机程序和编程语言的基础知识。本节主要想讲的是从程序源代码的编译到程序运行的全过程,而且仅限于大概流程的介绍,不深究太具体的细节,让初学者从程序的开发到运行建立一个完整的体系。一、 如何编写一个计算机程序?
上一节我们已经知道计算机程序是特定的机器指令的集合,我们也知道程序可以用机器语言、汇编语言和高级语言编写,其中用汇编和高级语言编写的代码最终会被翻译成CPU可执行的机器指令的集合。
编程缩写为编程。编程就是用一种编程语言编写程序代码,让计算机解决一些特定的问题或者完成特定的功能。根据使用的编程语言不同,写出来的程序也不同。
用编程语言写的程序代码叫源代码。源代码经过编译器翻译,最终生成一个可以在目标架构上运行的程序。这个程序叫做可执行(运行)程序。在Windows上,最常见的是以。exe扩展名。在Linux和Mac系统上,可执行程序一般不添加任何扩展名,可以添加任何扩展名。它只需要给程序文件可执行的权限。编写一个计算机程序要做以下三件事1.选择一个程序开发和运行的平台(目标体系结构)。
普通的应用程序都运行在操作系统上,所以你需要选择一个运行环境来运行你的程序。通常,您会选择Windows、Linux或Mac操作系统之一作为开发和运行环境。
程序开发环境,通常包括用来编写和运行程序的操作系统,以及程序编辑器和编译工具等。程序的部署运行环境通常是指你要编写的程序要部署的操作系统,以及程序运行所需的依赖关系。通常,开发环境用于编写和调试程序代码,部署环境用于运行编译后的程序。两个环境可以是一致的,比如在Windows上开发最后部署在Windows上,或者在Mac上开发部署。
由于许多高级编程语言具有良好的可移植性,可以在一个操作系统上开发和调试程序,然后部署到其他操作系统上运行。例如,在Windows上开发的PHP或Python程序通常可以很容易地移植到其他平台上。
至于程序的移植性的大小,主要取决于编写的程序和操作系统的耦合程度,也就是通过编程语言调用了多少操作系统特有的函数。调用越多,耦合度越高,可移植性越差。通常有些脚本语言因为很少提供与操作系统直接相关的接口,所以移植性很好,而C和C语言可以直接调用操作系统提供的很多接口。当编写的程序使用许多独特的功能接口时,它们的可移植性就会很差。2.选择一门高级程序语言
上一节我们学习了高级语言的分类,按照运行过程大致可以分为编译型语言和解释型语言。如果选择编译语言,需要经历先写程序、编译程序、链接程序、执行程序的过程。只有将源代码编译链接后,才能生成可执行程序,并在相应的操作系统上运行。对于解释性语言,你需要先写好代码,然后使用该语言对应的解释器来解释和运行代码。解释性语言在调用程序之前不需要编译,解释器负责在运行时解释和执行指令。
对于初学者,建议选择一种脚本语言入门,比如PHP。脚本语言很简单,初学者很容易学习。掌握了一门脚本语言之后,再循序渐进地学习其他编程语言,对编程有了一定的了解之后,就可以事半功倍了。3.学习程序语言的语法规则
所有的编程语言都有相应的语法规则。掌握了一些基本的语法规则后,就可以愉快地编程了。下面是一个PHP程序,它打印出“Hello,World!”:
?服务器端编程语言(Professional Hypertext Preprocessor的缩写)
你好,世界!
?二、 几种高级语言应用场景介绍
回顾编程语言的发展轨迹,从最原始的机器语言,衍生出汇编语言,再演变成高级语言。语言向人类自然语言靠拢,语言的可用性、可读性、可移植性越来越强。每种高级语言的出现都有特定的背景。下面从语言功能和应用的角度简单介绍几种常见语言的功能特点。以下是2018年4月语言使用率排名:C/C++语言:计算效率高。理论上,C/C语言几乎可以实现任何东西,但从开发成本和难度来说,C/C在很多情况下并不是最佳选择。C语言因为接近操作系统,所以可以应用于系统底层开发,硬件驱动,其他高级语言的编译器等。c语言可应用于开发桌面应用、大型应用系统或大型游戏,如办公软件、深度学习框架(TensorFlow、Caffe.),Web服务器,LOL,魔兽世界等。C/C也有很多不适合的场景,比如常见的网站开发。使用PHP、Python等一些脚本语言效率要高得多。Java语言:运行在Java虚拟机上,移植性很强。只要能运行Java虚拟机的系统就能运行你写的Java程序,Java适合应用开发,比如桌面应用,安卓APP程序,网站后台开发等。PHP语言:PHP是一种开源的脚本语言,简洁高效。主要用于Web开发。它以开发效率和可移植性著称。Python语言:脚本语言,应用场景比PHP广得多,可用于Web开发、网络程序、科学计算、数据分析、文本图像处理、人工智能等领域。三、 编译型语言编译、链接和运行的过程
上面提到的C/C语言是一种编译语言。下面是C语言如何从源代码编译,编译,链接,然后执行。
C语言的编译链接过程需要把我们编写的一个C程序(源代码)编译链接成一个可以在硬件上运行的程序(可执行代码)。编译是将文本形式的源代码翻译成机器语言形式的目标文件的过程。链接是组织目标文件、操作系统的启动代码和用于形成最终可加载和可执行代码的库文件的过程。
编译由C语言编译器完成,链接由C语言链接器完成。编译器和连接器本质上是可执行程序,编译器和连接器有很多种。任何能把C源代码翻译成机器语言的程序都可以称为C语言编译器(比如gcc)。3.1 编译过程
编译过程可以分为两个阶段:编译和汇编。
编辑和翻译
编译是指编译器读取源程序(字符流),分析其词法和语法,将高级语言指令转换成功能等价的汇编代码。源文件的编译过程包括两个主要阶段:1 .预处理阶段,在正式编译阶段之前进行。预处理阶段将根据文件中已经放置的预处理指令修改源文件的内容。
2.在编译优化阶段,编译器要做的工作是通过词法分析和语法分析,确认指令符合语法规则后,将所有指令翻译成等价的中间代码表示或汇编代码。
编制
汇编是指汇编程序(as)将汇编语言代码翻译成目标机器指令的过程。目标文件中存储的是相当于源程序的目标的机器语言代码。文件由段组成。通常,一个目标文件中至少有两个段:1。代码段:这个代码段主要包含程序的指令。该段通常是可读和可执行的,但通常是不可写的。
2.数据段:主要存储程序中要用到的各种全局变量或静态数据。通常,数据段是可读、可写和可执行的。
3.2 目标文件
主要分为以下三类:1.可重定位(Relocatable)文件:由编译器和汇编器生成,可以与其他可重定位的目标文件组合创建一个可执行或共享的目标文件;
2.共享(Shared)目标文件:一种特殊的可重定位目标文件,可以在链接时添加到目标文件中(静态共享库),也可以动态加载到内存中,在加载或运行时执行(动态共享库);
3.可执行(Executable)文件:由链接器生成,可以作为进程执行的文件由加载器直接加载到内存中。3.3静态库和动态库
静态库是由相关的目标模块打包而成的独立文件,它有以下优点:1 .程序员不需要显式指定所有需要链接的目标模块,因为指定是一个耗时且容易出错的过程;
2.链接时,链接器只从静态库中复制程序引用的目标模块,从而减少磁盘和内存中可执行文件的大小。
动态库(dynamic library)是一个特殊的对象模块,可以加载到任何内存地址,也可以在运行时与任何程序链接。它具有以下优点:1 .更新动态库而不重新链接;对于大型系统,重新链接是一个非常耗时的过程;
2.运行时可以被多个程序使用,内存中只需要一个副本,节省内存。
3.4 链接过程
链接器主要是连接相关的目标文件,生成可加载和可执行的目标文件,其核心工作是符号表解析和重定位。
链接定时
编译的时候,就是源代码编译成机器码的时候(静态链接器负责);
加载时,即程序加载到内存时(加载器负责);
在运行时,它由应用程序实现(由动态链接器负责)。
链接的功能(软件复用)
使单独编译成为可能;
动态绑定:分离定义、实现和使用。
静态库搜索路径(由静态链接器负责)
以Linux下的编译过程为例:
Gcc先从-L看;
然后找到环境变量LIBRARY_PATH指定的搜索路径;
然后寻找缺省目录/lib /usr/lib /usr/local/lib,这是编译gcc时在程序中写的。
动态库搜索路径(由动态链接器负责)
编译目标代码时指定的动态库搜索路径-l;
由环境变量LD_LIBRARY_PATH指定的动态库搜索路径;
配置文件/etc/ld.so.conf中指定的动态库搜索路径;
默认动态库搜索路径/lib /usr/lib//usr/local/lib
静态链接(编译时)
链接器将函数的代码从它的位置(目标文件或静态链接库)复制到最终的可执行程序。这样,当程序执行时,这些代码将被加载到进程的虚拟地址空间中。静态链接库实际上是一个对象文件的集合,每个对象文件都包含库中一个或一组相关函数的代码。
为了创建可执行文件,链接器必须完成以下主要任务:
1.符号分析:链接目标文件中符号的定义和引用;
2.重定位:将符号定义与内存地址匹配,然后修改所有对符号的引用。
动态链接(加载,运行时)
这样,函数的定义就在动态链接库的对象文件或者共享对象中了。在编译的链接阶段,DLL只提供符号表等少量信息来保证定义所有的符号引用,从而保证编译成功。动态链接器(ld-linux.so)链接器在运行时根据记录的共享对象的符号定义动态加载共享库,然后完成重定位。当这个可执行文件被执行时,动态链接库的所有内容都会在运行时被映射到相应进程的虚拟地址空间。动态链接器会根据可执行程序中记录的信息找到相应的功能代码。3.5 加载过程
加载程序将目标文件复制到内存的数据段和代码段。然后,加载程序跳转到程序入口点(即symbol _start的地址),然后执行启动代码)四、 解释型语言运行的过程。
解释性语言是指代码在执行时由解释器动态翻译并逐行执行,而不是在执行前完成翻译。简单来说,解释型语言就是边翻译边执行。
解释器是一种高级语言翻译程序。它以源语言编写的源程序为输入,解释一句话然后提交给计算机执行,不形成目标程序。就像外语翻译中的“口译”一样,把一个句子翻译成另一个句子并不产生全文的译文。4.1 PHP语言的运行过程
对于初学者来说,先了解以下基本概念,PHP程序,PHP语法,PHP解释器:
1.PHP程序:用PHP语言编写的程序代码,俗称PHP脚本;
2.PHP语法:编写PHP代码要遵循一系列规则,这些规则定义了PHP语言的语法;
3.PHP解释器:安装在操作系统上的PHP软件,在Windows上通常以php.exe命名,根据PHP语法解释并运行PHP程序。
如图所示,PHP自下而上是一个4层系统:
1 1.Zend引擎:Zend整体用纯C实现,是PHP的核心部分。它将PHP代码(词法分析、语法分析等一系列编译过程)翻译成可执行的操作码,实现相应的处理方法,实现基本的数据结构(如hashtable、oo)、内存分配和管理,为外部调用提供相应的api方法。它是一切事物和所有外围功能的核心。
2.Extensions:围绕Zend engine,扩展以基于组件的方式提供各种基础服务。我们常见的内置函数(比如array系列)和标准库都是通过扩展实现的,用户也可以根据自己的需求实现自己的扩展,以达到功能扩展、性能优化等目的(比如贴吧正在使用的PHP中间层和富文本解析就是扩展的典型应用)。
3.Sapi:Sapi的全称是Server Application Programming Interface,即服务器端应用编程接口。sapi使PHP能够通过一系列钩子函数与外围数据进行交互,这是PHP非常优雅和成功的设计。通过SAPI成功实现PHP本身与上层应用的解耦隔离,PHP可以不再考虑如何兼容不同的应用,应用本身可以根据自身特点实现不同的处理方式。
4.上层应用:这是我们平时写的PHP程序。我们可以通过不同的sapi方法得到各种应用模式,比如通过webserver实现web应用,命令行下脚本模式运行等等。
如果PHP是一辆汽车,那么汽车的车架就是PHP本身,Zend就是汽车的引擎,Ext下面的各个部件就是汽车的轮子。Sapi可以看作是一条路,汽车可以在不同类型的道路上行驶,而一个PHP程序的执行就意味着汽车在道路上行驶。所以,我们需要:优秀的发动机,合适的车轮,正确的跑道。
PHP操作码的执行过程
我们来看看PHP代码执行的过程。
从图中可以看到,PHP实现了一个典型的解释性语言执行过程:源代码加载后,经过词法分析和语法分析,源代码会被翻译成操作码,然后ZEND虚拟机会依次执行这些指令,完成操作。PHP本身是用C实现的,所以最后调用的都是C的函数,PHP解释器的本质是C开发的程序。
核心是翻译出来的一条一条指令,也即opcode的PHP执行。
操作码是PHP程序执行的最基本单位。操作码由两个参数(op1,op2),一个返回值和一个处理函数组成。PHP程序最终被翻译成一组用于顺序执行的操作码处理函数。
访问源站
原创不容易。未经许可,严禁转载。
涉及
程序编译,链接过程
PHP——的工作机制和原理
PHP需要更多的程序员。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。