为什么我有个朋友和我说php就像组装机,java和c#那些就像品牌机?怎么理解?

零基础学习PHP编程——认识程序和编程语言

注意: 本文主要写给零基础的同学,作为编程的入门引导, 如有不当之处,还请指正。

回顾上一节,我们已经知道计算机的一些基本概念了,如硬件系统及其组成,操作系统和应用程序等,本小节主要想讲明白什么是程序,什么是程序语言,以及高级语言的一些特点。

一、 什么是计算机程序?

摘一段百科上的描述: 计算机程序(Computer program),也称为软件(software),简称程序(Program),是指一组指示计算机或其他具有信息处理能力装置每一步动作的指令,通常用某种程序设计语言编写,运行于某种目标体系结构上。

计算机程序,就是运行在计算机上能完成特定功能的指令集合,计算机程序的复杂程度由所需完成的逻辑功能来决定,计算机程序有简单的也有复杂的,如编写简单的程序可以计算一个一元二次方程方程的解,而一个功能强大的游戏程序,可以给你带来不一样的游戏体验,程序的本质就是运行在计算机之上的一组有序指令的集合,这些指令可以让计算机执行一些具体的运算,能实现特定的功能。

在计算机开机后,进入操作系统如Windows/Linux/Mac等,操作系统会加载并执行许多程序,操作系统本质也是由一组计算机程序组成的,通常意义上表述的计算机程序,一般指的是能完成某些特定功能,相对比较独立的程序,如视频/音频播放器,Web浏览器,社交工具的客户端Wechat/QQ等;而一般由许多计算机程序共同协作来完成比较复杂的任务的一系列程序,通常被称为系统,如操作系统等。

百科描述中所说的指令运行于某种目标体系结构上,对于绝大多数计算机来说,从计算机体系结构的大分类来看,这里的目标体系结构通常都是指最常见的冯诺依曼体系结构,也就是上一节所讲述计算机的基本结构,而在冯诺依曼体系结构设计之下,CPU(运算器和控制器)的设计也可以划分不同的体系结构。

再了解一下什么是指令集,指令集是存储在CPU内部,对CPU运算进行指导和优化的硬程序,也就是说CPU的运算器只能执行CPU的指令集体系所支持的指令,之所以出现不同的CPU架构,就是由于指令集的设计不同,常见的CPU架构有Intel公司的X86架构和ARM公司的ARM架构,对应的指令集分别为复杂指令集(CISC)和精简指令集(RISC), X86和ARM处理器的主要区别就是,前者使用复杂指令集(CISC),而后者使用精简指令集(RISC)。X86架构的CPU常见于笔记本、台式机和服务器上,而ARM架构的CPU多用于手机及嵌入式系统里,指令集的细分类型还有许多,感兴趣的可以具体了解一下。

二、 什么是程序语言?
上面讲述了什么是计算机程序,计算机程序的本质就是运行在某种目标体系结构(可暂且理解为某种CPU架构)上面的指令集合,而这些指令的集合都应该能被该CPU架构所支持,即该CPU的运算器可以执行该指令集合中的所有指令,也就是说在不同的CPU架构上编写相同功能的程序,最后生成的该程序所对应的指令集合很可能是不一样的。

通过CPU架构所支持的指令集可以编写出成千上万的程序,而由指令集所组成的程序,可以被CPU直接解读和执行, 由指令集生成程序的过程就如同,通过文字去编写文章,单个的字或词就是某一条具体的指令,不同字或词(指令)通过一定规则组合起来,就是一篇文章(程序),所以CPU架构所支持的指令集的体系,也可以看做是一门语言,这门语言就是通常所说的机器语言,又称为机器码。不同的CPU架构所支持的不同指令集可以看做是不同的机器语言,就如同文字也分为汉语、English等许多语言,机器语言的道理也一样。


通过机器语言就可以编写出许多各种功能的程序了,但是用机器语言编写程序,编程人员要首先熟记所用计算机的全部指令代码和代码的涵义,手编程序时,程序员还需要自己处理每条指令和每一数据的存储分配和输入输出,还得记住编程过程中每步所使用的工作单元处在何种状态。这是一件十分繁琐的工作。编写程序花费的时间往往是实际运行时间的几十倍甚至几百倍,而且,编出的程序全是些0和1的指令代码,直观性差,还容易出错,那该怎么办了?
这时候汇编语言便产生了,汇编语言的主体是汇编指令。汇编指令和机器指令的差别在于指令的表示方法上,汇编指令是机器指令便于记忆的书写格式,如执行一个操作:寄存器BX的内容送到AX中(具体什么含义可以不用深究,明白是一条完成特定功能的指令即可)

很容易可以看出,同样一个操作,下面的汇编指令更容易被人熟记,汇编语言的出现是程序发展的一大进步,相比机器语言主要有以下几个特点:

1. 更具有可编程性,即使用汇编语言,程序员可以更加简便、更加快速、更容易理解的方式完成同样的编程任务;

2. 程序可移植性,上文介绍过不同的CPU架构支持不同的指令集体系(机器语言),所以通常以机器语言为某一类CPU架构编写的程序,不能运行在其它CPU架构之上,而有了汇编语言,可以想象同样一条汇编语句,运行在不同的CPU架构上时,只需要编译器把它编译(就如不同语言文字之间的翻译)成对应CPU架构所支持的机器码即可;

汇编语言的编译器,是可以把汇编语言翻译成目标CPU架构上机器语言的程序。

前面我们了解了什么是机器语言和汇编语言,汇编语言也是和机器语言一样,都是直接对硬件进行操作,但是汇编语言指令采用了英文缩写的标识符,更容易识别和记忆,但也只是相对于机器语言而言的。在实际编程中,汇编语言源程序也是十分复杂和冗长的,为了更加简单和高效的编写程序,于是高级语言就应运而生了。


高级语言并不是指一种语言,而是包括很多编程语言,比如C、C++、Java、php、python等等,是高度封装的编程语言。高级语言与计算机的硬件结构和CPU架构(指令系统)无关,汇编语言已经具备一定的可移植性了,编译器可以根据相应的CPU架构翻译成对应的机器语言,同样高级语言的可移植性更强,编译器也可以将高级语言翻译成目标CPU架构上的机器语言,至于是否是直接翻译成机器语言,还是先经过汇编再翻译成机器语言,取决于编译器的实现。

如今我们一般不需要学会如何用机器语言,汇编语言来进行编程,我们最多知道能如何看懂汇编语言就可以了。我们所编写的高级语言,被翻译成目标语言时,编译器会自动进行一些优化的处理。

高级语言的分类方式很多,根据设计思想特点可以划分为面向过程型(命令式)语言、面向对象型语言、函数式语言和逻辑式语言,而根据代码在执行之前被翻译的时间,划分为两类: 解释型语言和编译型语言。

面向过程型(命令式)语言

这种语言的语义基础是模拟“数据存储/数据操作”的图灵机可计算模型,十分符合现代计算机体系结构的自然实现方式。其中产生操作的主要途径是依赖语句或命令产生的副作用。现代流行的大多数语言都是这一类型,比如 Fortran、Pascal、Cobol、C、C++、Basic、Ada、Java、C# 等,各种脚本语言也被看作是此种类型。

现代语言中的大多数都提供面向对象的支持,但有些语言是直接建立在面向对象基本模型上的,语言的语法形式的语义就是基本对象操作。主流的支持面向对象的语言有 C++ 、Java、C#、PHP、Python等,一般的语言也都支持面向过程(命令式)的编程方式。

这种语言的语义基础是基于数学函数概念的值映射的λ算子可计算模型。这种语言非常适合于进行人工智能等工作的计算。典型的函数式语言如 Lisp、Haskell、ML、Scheme 、F#等。

这种语言的语义基础是基于一组已知规则的形式逻辑系统。这种语言主要用在专家系统的实现中,最著名的逻辑式语言是 Prolog。

虽然各种语言属于不同的类型,但它们各自都不同程度地对其他类型语言的运算模式都有所支持。

解释型语言又可以根据语言的主动和被动特点划分为: 标记语言和脚本语言。标记语言时被动的等待解释,不主动向计算机发出指令,脚本语言一般主动发出指令让计算机执行任务。

标记语言,是一种将文本(Text)以及文本相关的其他信息结合起来,展现出关于文档结构和数据处理细节的电脑文字编码。与文本相关的其他信息(包括文本的结构和表示信息等)与原来的文本结合在一起,但是使用标记进行标识。

脚本语言是为了缩短传统的编写-编译-链接-运行(edit-compile-link-run)过程而创建的计算机编程语言。它的命名起源于一个脚本“screenplay”,每次运行都会使对话框逐字重复。早期的脚本语言经常被称为批量处理语言或工作控制语言。一个脚本通常是解释运行而非编译。脚本语言通常都有简单、易学、易用的特性,目的就是希望能让程序员快速完成程序的编写工作。

编译型语言:程序在执行之前需要一个专门的编译过程,把程序编译成为机器语言的文件,运行时不需要重新翻译,直接使用编译的结果就行了。程序执行效率高,依赖编译器,跨平台性差些。

7. 不同类型高级语言的区别
1. 标记语言不用于向计算机发出指令,常用于格式化和链接。 

2. 脚本语言介于标记语言和编程语言之间,脚本语言脚本语言不需要编译,可以直接用,由解释器来负责解释。 

3. 编译型语言写的程序执行之前,需要一个专门的编译过程,把程序编译成为机器语言的文件,比如exe文件,以后要运行的话就不用重新翻译了,直接使用编译的结果就行了(exe文件),因为翻译只做了一次,运行时不需要翻译,所以编译型语言的程序执行效率高。

8. 高级语言的一般性特点
1. 高级语言接近算法语言,易学、易掌握,一般工程技术人员只要几周时间的培训就可以胜任程序员的工作;

2. 高级语言为程序员提供了结构化程序设计的环境和工具,使得设计出来的程序可读性好,可维护性强,可靠性高;

3. 高级语言远离机器语言,与计算机的硬件结构及指令系统无关,有更强的表达能力,因而所写出来的程序可移植性好,重用率高;

4. 由于把繁杂琐碎的事务交给了编译程序去做,所以自动化程度高,开发周期短,且程序员得到解脱,可以集中时间和精力去从事对于他们来说更为重要的创造性劳动,以提高程序的质量;

5. 高级语言编译生成的程序代码一般比用汇编程序语言设计的程序代码要长,执行的速度也慢。所以汇编语言适合编写一些对速度和代码长度要求高的程序和直接控制硬件的程序,高级语言程序“看不见”机器的硬件结构,不能用于编写直接访问机器硬件资源的系统软件或设备控制软件。为此,一些高级语言提供了与汇编语言之间的调用接口。用汇编语言编写的程序,可作为高级语言的一个外部过程或函数,利用堆栈来传递参数或参数的地址。


作为吃饭的工具,语言之间也形成了某种鄙视链,各大论坛里弥漫着剑拔弩张的气氛,众口难调。也难怪有很多初学者会有疑惑,为什么会有这么多编程语言,我到底应该学什么语言?

其实各种语言都各有千秋。接下来,我们就让这些语言一一登场吧。

Java给新人的印象应该是入门简单、代码优雅、活跃度高、跨平台、开源大家庭等等,不过JAVA没有什么特别强的方面,但每个方面都不弱。整体平均值,便非常高。JAVA还有一个比较突出的优势,就是它是/ target=_blank

它是现代编程语言的祖师爷,所以非常古老了。现在大学里面就有教C。绝大部分语言,写法都和差不多。常常用作学习其他语言的基础。而C语言当然也有其他语言不可替代的用途,C语言的学习会为你建立较好的逻辑思维能力、解决问题的能力和构思能力,是一种非常实用的软能力。

C++作为难度最高的语言,称之为神秘莫测一点都不过分,能游刃有余使用C++的,实在是少之又少。只要是用c++开发出来的软件,它的时效性、稳定性、可扩展性都可以得到很好的控制。这是任何高级语言都没有办法达到的。

PHP是用来做的,其实从技术角度,属于第一代的后端技术(植入式脚本技术),现在最新的后端技术,已经发展到第三代了(MVC),因此从技术上讲,PHP早该过时了,但由于市场需求的存在,所以它依然是做网站后台的主流之一。。就类似于XP一样,技术上太淘汰了,但市场却依然是主流,普及度依然很高。缺点一大堆,但又个最主要的优势,就是简单。。。MVC虽好,但学习难度远比PHP要高的多。

C#一般做网站、后台服务、桌面软件,虽然也算火爆,但却似乎一直有些力不从心的感觉,高级形态是语言的趋 势,因此像C#、Java、Object-c这种被高度封装的语言总会发光发热,毕竟再退回几十年前去,使用汇编甚至二进制去写代码的日子肯定是不会再到来了。

Python也是个很有历史的语言,诞生时间和JAVA,C#差不多,但今天却依然非常时髦。因为它的语法,简洁,优雅,风骚到了极致。像写信一样写代码。而又无所不能,JAVA和C#能做到的,Python几乎一样都不少。简单易学,尤其受到初学者喜爱。。但Python更像一把双刃剑,优点特别突出,缺点也特别明显,就是特别慢。一般认为,Python比JAVA慢25倍到50倍。

免责声明:本文部分内容借鉴自网络

声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:),我们将及时更正、删除,谢谢。

从1997年网景的Navigator 3浏览器开始就开始使用Javascript。当时,Javascript还只能做一些很简单的事情。我记得最酷的就是用Javascript实现mouseover特性,在那个时候已经算得上是高科技了!当鼠标移过去之后,文本内容就神奇的改变了。因为当时都是pre-DHTML,你根本不需要隐藏或则显示DOM元素。

DHTML是Dynamic HTML的简称,就是动态的html(标准通用标记语言下的一个应用),是相对传统的静态的html而言的一种制作网页的概念。所谓动态HTML(Dynamic HTML,简称DHTML),其实并不是一门新的语言,它只是HTML、CSS和客户端脚本的一种集成,即一个页面中包括html+css+Javascript(或其它客户端脚本),其中css和客户端脚本是直接在页面上写而不是链接上相关文件。

在那个时候,Javascript的演化很慢,主要应用在表单验证。因此,不像今天这么火爆,并没有引起太多的关注。可以说只是一个锦上添花的附加物,你需要确保在浏览器禁用Javascript之后,你的应用依然可以正常使用。再往后,框架一个接着一个出现:jQuery,Knockout, Angular, React, Vue, 等等。

同样,Javascript也在加速演化。我们才使用ES6不久,现在人们几乎已经跳过ES7,开始讨论ES8了。

我们已经被太多的框架和语言所淹没,很难去跟踪和掌握所有的语言和框架。

当Javascript逐渐成熟,面向对象编程(OOP)的概念也渗入进来,而且我曾经很喜欢。

我开始尝试所有不同的方法来创建类,我最终也可以正确的使用继承。我对自己说:Javascript开始真的像一个语言了!

但是,直到多年以后我发现OOP是Javascript引入的最糟糕的一个设计!

我尝试将我对C#的理解带入到Javascript中去。一开始充满期待,但是后来发现真的太复杂,太烧脑了。

这主要是因为Javascript的原型继承和C#不一样,我已经习惯于每天编写类似于console.log(this)这样飘逸的代码。但是现在呢?如果我一不小心没按照规则来,那将会给我带来噩梦。私有方法和私有值必须要在名字前面加上下划线,甚至必须用闭包来保证私有性。

因此,不仅OOP导致了很多问题,同时也由于添加OOP带来了很多新的问题。

一开始我并不理解。我可以阅读并理解这些用函数式编写的代码,但是不知道为什么!最终,我强迫我自己去学习它。

函数式语言给了我一个全新的视角,让我从一个完全不同的方式去看待编程。

一开始会感到不自然,需要时间去适应。所有的定义都是基于函数,值不可更改,无状态。我用函数式的思维去解决问题。因为不熟悉,我花了更长的时间去学习。渐渐地,我熟练掌握了使用函数式的方法去编程。并且,我也知道所有代码这样编写的内在含义。

我的代码更加简洁了,而且容易复用。渐渐的,我以前使用的那些语言特性从代码中消失了,我的代码看上去完像是用另一个语言编写。我还在用Javascript吗?

我用const替代了var。通过函数式的设计,我的函数都是纯(pure)的。不会再去对一个变量进行值的变更操作,同样也是为了确保不会对其操作。

我会检查代码确保每一个var,甚至let,所有声明都使用const。

在学习程序语言的时候,我们一开始就会学到for循环。但是自从学习了函数式编程,我将for循环都改成了使用filter, map和reduce来实现。对于那些需要一些额外计算的需求,我会使用递归或则第三方库比如lazy.js。

如今我的代码里面完全没有for循环了,如果你看到了,告诉我我会把它消除。

3. if也可以被简化

我开始停止在if里面编写大块大块的代码。我将里面的逻辑抽取出来单独放在一个函数中。这样,我们就可以将if用三元算子(a?b:c)来简化。

如今我的代码里面几乎没有if语句。为了方便其他开发者理解我的代码,我很少使用它。

同样,我也不喜欢用switch,而是寻找一个函数式的写法。

对的,你没有听错!我们也可以完全消除this。

函数式的Javascript可以让你完全抛弃使用烦人的this
现在只有数据和函数,甚至数据不过是函数的一种特殊表达形式,你再也不需要this了。我开始将对象理解为函数式语言中状态(state)和函数。我甚至不需要把状态或则函数和对象绑定到一起,就像OOP中那样。

面向对象的设计不是必须的

现在往回看,我发现面型对象编程带来的复杂度真的是不必要的。我可以使用函数式语言实现同样的功能,完成相同的任务。而且,代码更加轻简,因为不在需要将这些复杂的对象传来传去。只有数据和函数,而且因为函数没有和对象绑定,更加容易复用。我不在需要担心传统的原型继承带来的所有的问题,Javascript设计的并不好。

Javascript缺乏私有、公有、内部或则被保护这类访问控制器也不再是一个问题。访问控制器是用来解决由于引入面向对象编程而设计的。在函数式的Javascript中,这些问题不复存在。

我的代码现在看上去完全不同。它包含了很多纯函数,我将它们做成不同的ES6模块。这些函数可以被使用来构建更加复杂的函数。很大一部分函数都是很简单的一行lambda表达式。

现在我看待软件的思维也变了:输入是一个数据流,然后程序作用到该数据流上对数据进行各种操作,然后返回新的数据。

函数式设计对程序语言的影响以及无处不在,C#中的LINQ就是一个最佳的例子。同样Java 8也引入了函数式语言的特性。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。

我要回帖

更多关于 好朋友就像星星 的文章

 

随机推荐