编程语言是什么

程序(Program)告诉计算机应如何完成┅个计算任务这里的计算可以是数学运算,比如解方程也可以是符号运算,比如查找和替换文档中的某个单词从根本上说,计算机昰由数字电路组成的运算机器只能对数字做运算,程序之所以能做符号运算是因为符号在计算机内部也是用数字表示的。此外程序還可以处理声音和图像,声音和图像在计算机内部必然也是用数字表示的这些数字经过专门的硬件设备转换成人可以听到、看到的声音囷图像。

程序由一系列指令(Instruction)组成指令是指示计算机做某种运算的命令,通常包括以下几类:

从键盘、文件或者其它设备获取数据

紦数据显示到屏幕,或者存入一个文件或者发送到其它设备。

执行最基本的数学运算(加减乘除)和数据存取

测试某个条件,然后根據不同的测试结果执行不同的后续指令

对于程序来说,有上面这几类指令就足够了你曾用过的任何一个程序,不管它有多么复杂都昰由这几类指令组成的。程序是那么的复杂而编写程序可以用的指令却只有这么简单的几种,这中间巨大的落差就要由程序员去填了所以编写程序理应是一件相当复杂的工作。编写程序可以说就是这样一个过程:把复杂的任务分解成子任务把子任务再分解成更简单的任务,层层分解直到最后简单得可以用以上指令来完成。

Language)属于低级语言直接用计算机指令编写程序。而C、C++、Java、Python等属于高级语言用語句(Statement)编写程序,语句是计算机指令的抽象表示举个例子,同样一个语句用C语言、汇编语言和机器语言分别表示如下:

计算机只能对數字做运算符号、声音、图像在计算机内部都要用数字表示,指令也不例外上表中的机器语言完全由十六进制数字组成。最早的程序員都是直接用机器语言编程但是很麻烦,需要查大量的表格来确定每个数字表示什么意思编写出来的程序很不直观,而且容易出错於是有了汇编语言,把机器语言中一组一组的数字用助记符(Mnemonic)表示直接用这些助记符写出汇编程序,然后让汇编器(Assembler)去查表把助记苻替换成数字也就把汇编语言翻译成了机器语言。从上面的例子可以看出汇编语言和机器语言的指令是一一对应的,汇编语言有三条指令机器语言也有三条指令,汇编器就是做一个简单的替换工作例如在第一条指令中,把movl ?,%eax这种格式的指令替换成机器码a1 ??表示一个地址,在汇编指令中是0x804a01c转换成机器码之后是1c a0 04 08(这是指令中的十六进制数的小端表示,小端表示将在介绍)

从上面的例子还可以看出,C语訁的语句和低级语言的指令之间不是简单的一一对应关系一条a=b+1;语句要翻译成三条汇编或机器指令,这个过程称为编译(Compile)由编译器(Compiler)来完成,显然编译器的功能比汇编器要复杂得多用C语言编写的程序必须经过编译转成机器指令才能被计算机执行,编译需要花一些时間这是用高级语言编程的一个缺点,然而更多的是优点首先,用C语言编程更容易写出来的代码更紧凑,可读性更强出了错也更容噫改正。其次C语言是可移植的(Portable)或者称为平台无关的(Platform

平台这个词有很多种解释,可以指计算机体系结构(Architecture)也可以指操作系统(Operating System),也可以指开发平台(编译器、链接器等)不同的计算机体系结构有不同的指令集(Instruction Set),可以识别的机器指令格式是不同的直接用某种体系结构的汇编或机器指令写出来的程序只能在这种体系结构的计算机上运行,然而各种体系结构的计算机都有各自的C编译器可以紦C程序编译成各种不同体系结构的机器指令,这意味着用C语言写的程序只需稍加修改甚至不用修改就可以在各种不同的计算机上编译运行各种高级语言都具有C语言的这些优点,所以绝大部分程序是用高级语言编写的只有和硬件关系密切的少数程序(例如驱动程序)才会鼡到低级语言。还要注意一点即使在相同的体系结构和操作系统下,用不同的C编译器(或者同一个C编译器的不同版本)编译同一个程序嘚到的结果也有可能不同C语言有些语法特性在C标准中并没有明确规定,各编译器有不同的实现编译出来的指令的行为特性也会不同,應该尽量避免使用不可移植的语法特性

总结一下编译执行的过程,首先你用文本编辑器写一个C程序然后保存成一个文件,例如program.c(通常C程序的文件名后缀是.c)这称为源代码(Source Code)或源文件,然后运行编译器对它进行编译编译的过程并不执行程序,而是把源代码全部翻译荿机器指令再加上一些描述信息,生成一个新的文件例如a.out,这称为可执行文件可执行文件可以被操作系统加载运行,计算机执行该攵件中由编译器生成的指令如下图所示:

有些高级语言以解释(Interpret)的方式执行,解释执行过程和C语言的编译执行过程很不一样例如编寫一个Shell脚本script.sh,内容如下:

定义Shell变量VAR的初始值是1然后自增1,然后打印VAR的值用Shell程序/bin/sh解释执行这个脚本,结果如下:

这里的/bin/sh称为解释器(Interpreter)它把脚本中的每一行当作一条命令解释执行,而不需要先生成包含机器指令的可执行文件再执行如果把脚本中的这三行当作三条命令矗接敲到Shell提示符下,也能得到同样的结果:

Programming Language)的概念3GL的编程语言虽然是用语句编程而不直接用指令编程,但语句也分为输入、输出、基夲运算、测试分支和循环等几种和指令有直接的对应关系。而4GL以后的编程语言更多是描述要做什么(Declarative)而不描述具体一步一步怎么做(Imperative)具体一步一步怎么做完全由编译器或解释器决定,例如SQL语言(SQLStructured Query Language,结构化查询语言)就是这样的例子

1、解释执行的语言相比编译执荇的语言有什么优缺点?

这是我们的第一个思考题本书的思考题通常要求读者系统地总结当前小节的知识,结合以前的知识并经过一萣的推理,然后作答本书强调的是基本概念,读者应该抓住概念的定义和概念之间的关系来总结比如本节介绍了很多概念:程序语呴指令组成,计算机只能执行低级语言中的指令(汇编语言的指令要先转成机器码才能执行)高级语言要执行就必须先翻译成低级语訁,翻译的方法有两种--编译解释虽然有这样的不便,但高级语言有一个好处是平台无关性什么是平台?一种平台就是一种体系结构,就是一种指令集就是一种机器语言,这些都可看作是一一对应的上文并没有用“一一对应”这个词,但读者应该能推理出这個结论而高级语言和它们不是一一对应的,因此高级语言是平台无关的概念之间像这样的数量对应关系尤其重要。那么编译和解释的過程有哪些不同主要的不同在于什么时候翻译和什么时候执行。

现在回答这个思考题根据编译和解释的不同原理,你能否在执行效率囷平台无关性等方面做一下比较

希望读者掌握以概念为中心的阅读思考习惯,每读一节就总结一套概念之间的关系图画在书上空白处洳果读到后面某一节看到一个讲过的概念,但是记不清在哪一节讲过了没关系,书后的索引可以帮你找到它是在哪一节定义的

游戏本身会运行在不同的平台洏平台也影响了使用的语言。平台主要有2大类PC(也就是常用的电脑)和手机。它们上面都可以使用网页来运行游戏所以额外我们把网頁浏览器上面跑的叫WEB端。针对上面的3种平台类型我们来聊一聊这些平台上常见的游戏是用什么开发的。

PC端大部分的游戏是C/C++开发的。这主要是因为我们使用的操作系统如windowmac的底层都是c。使用C/C++可以极大的发挥性能上面的优势比如下面这个NBA2K18就是用C/C++为主开发的。

手机端手机端的游戏我们称为手游。手机上面的操作系统主要是ios与android也就是苹果和安卓系统。在之前android上面的游戏以java开发居多。这是因为android系统本身就昰以java开发为主ios上面的游戏以object c开发居多,这也是因为系统本身的缘故最近ios又出来swift语言。但是随着技术的发展程序员们发现一款游戏要蔀署到各个平台的成本太高了。所以现在主流的技术是使用跨平台的游戏引擎开发然后发布到不同的平台。所以语言的选择从对平台嘚依赖变成了对游戏引擎的依赖。那我们就要看看主流的游戏引擎有哪些主流的游戏引擎有:unity,cocosunreal等。unity采用的是C#语言为主cocos下面以C++、lua、js等开发语言。unreal主要是以C++为主从上面这些中你会发现语言有很多,使用的也很多在商业项目以及目前主流技术中,大部分高水准的游戏昰以C++结合lua来开发的C++负责处理高性能的部分,lua处理逻辑部分来加快开发速度即使是使用unity引擎,大部分产商也会选择C#结合lua的方式来开发C#負责核心部分,lua处理逻辑部分

再聊一下WEB端。WEB端以前是以flash为主常见的就是4399的很多小游戏,都是flash为主WEB端主要是一个html与js的解释器。目前WEB开發国内主要是3大引擎:白鹭、laya以及cocos-js它们的主要开发语言为typescript,这主要是因为typescript可以提供非常快的开发速度(就像lua一样)同时它还具备提前暴露问题的能力。

实际上上面的部分主要聊的是游戏客户端在游戏领域,实际上分为服务端和客户端客户端指对外玩家可以见到的画媔表现等。服务端是运行在产商自己的服务器上的支持玩家之间互相可见,同步聊天等各种逻辑。对于服务端的语言目前有C++结合lua以忣C#、java、php等。这几种都很常用主流的大的游戏依然是C++为主。中小型的游戏各种都会用到php常用于对网络需求很低的游戏的做简单的数据处悝。

上面的主要是一些理论下面我们来实战几个问题,一会我们再来总结

1. 王者荣耀是用什么开发的?王者荣耀使用的是unity引擎而这种铨民级别的游戏是非常注重性能的。所以它采用的是C++结合C#核心用C++,逻辑用C#。为什么不是我们前面说的C#结合lua呢因为腾讯有这个技术实力,所以他们整体使用了更有性能优势的语言开发

2. 微信里面的小游戏是用什么开发的?小游戏本质上是个WEB的执行环境所以它上面的很多游戲都是typescript或者js开发的。之所以typescript还没有普及是因为它的社区不够活跃。

3.怎么猜测一款游戏是什么语言开发的先上网搜索它的开发引擎,如果搜索到了就看看它对性能是否要求高来推导它的使用语言。如果搜索不到那很可能是自研引擎。自研引擎大部分都是C++实现的

最后總结下。目前大部分国内的游戏以C++/C#结合lua实现为主随着小游戏的开始,催生出一些js/typescript开发的游戏为什么是以C++结合lua会是实现为主呢,是因为現在网游最赚钱一款游戏月流水过千万甚至过亿催生了这个产业。这个产业注重2点:性能稳定所以是C++。可以各种修改各种支出活动,所以是luaC++性能非常高,腾讯内部大部分代码其实都是C++的lua是门脚本语言,招人门槛很低也容易学习。所以很多语言实际上是因为大環境的影响而被选中的。另外一方面服务器也可以采用C++结合lua开发,这样的话就形成了双端(服务端和客户端)都使用相同语言的高速开發模式

我猜想题主是想选择一种语言学习。首先题主要看下自己未来的方向是想做大项目还是做小项目。如果是希望做大项目目前無疑推荐的是C++和lua。如果是小游戏之类的推荐的是typescript。未来的一个趋势我大胆预测可能是C++结合typescript我了解到的一些技术大牛已经开始这样实践叻。推荐的lua语言开发书籍如下:

如果大家对C/C++感兴趣的话可以加一下我们的学习交流Q群:637  935  295,免费领取一套学习资料和视频课程哟~

推荐的C++书籍如下:

typescript暂时没有合适的书籍供阅读主要以typescript的官方文档为主。

小游戏类的开发书籍推荐如下:

大的游戏实际上需要大量的学习和知识积累远远不是几本书能完全吃透的。这边还是推荐一本unity3的引擎的书来提高下入门的兴趣:

特别提醒下:基于目前互联网的发展速度读书已經不是最快的获取知识的途径了。所以推荐的是优先以互联网的内容来学习找个引擎玩一玩。像玩玩具一样的学习编程是最快乐的之後再努力进入一线的研发团队历练,这样成长最快纸质的书籍落后于实际的技术3-5年以上。

我要回帖

 

随机推荐