编程语言的过去、现在和未来

ancientcc 2014-12-15 10:45:20
两种动力在推动编程语言向前发展,一是各种国际组织,二是商业公司。对于形成语言规范来说,它们或许是各占一半,但以程序员选择哪种语言,那肯定是商业公司占主导地位。

一、微软
没有之一,微软是迄今为止最伟大软件公司。它造就了Windows神话,这里不说Windows,说它的编程工具:Visual Studio。透过Visual Studio十多年历程,或许能看到这十多年软件编程的大概走向。在深入分析前让先看两个概念:编译语言和脚本语言。

按编写出的代码是否须要编译,把语言分编译语言和脚本语言。

编译语言
编译语言主有特点。1)编写出的代码须经过编译形成二进制格式;2)发布向终端的是二进制代码;3)一般不须安装额外解释程序。C、C++、Object-C属于编译语言。

脚本语言
脚本语言主有特点。1)发布向终端的一般是源码文件;3)须要安装额外解释程序。C#、Java、PHP、Lua属于脚本语言。

两种类型语言能完成同一任务,不可避免要存在冲突,但它们的确是可以互补,程序员应该有这样一个认识:一个好的程序是这两种类型语言的完美结合。微软知道这点,所以每个Visual Studio版本都是两种语言齐头并进,微软力推语言不只两种,这里从中抽取它们的代表:C/C++、C#。两种类型语言要通过某种混合策略去达到写出优质应用这一目标,那微软策略是什么。

C/C++编写各类插件,C#编写最终应用。

微软把程序员分为两种,一种人写核心、一种人写应用。他建议写核心人用C/C++,用C/C++编写出各样插件,如果把一个应用比喻成一座房子,那么C++就去写门、梁、窗。有了这些组件后,C#则用于把这些门、梁、窗拼凑起来搭出一间最终房子。

它是微软傻瓜化编程核心,但我想说,它太想当然,很重要一点是不顾及C/C++程序员感受。“对于能实现同样功能语言,除非有极高利益驱使,否则不会去学第二种语言”,那些写惯了C/C++代码的程序员,他们只能做痛苦选择,但面对执行效率还低一等级的C#,很有可能还是继续用C/C++写最终应用。

傻瓜化真是吸引程序员用它开发应用的第一动力吗?不是!一个程序员会去学哪种语言,不是在于这语言功能有多强、能让编程有多简单,而是取决这语言能不能让他赚钱。

但那些年微软几乎垄断了应用平台,它给的方向几乎等同程序员能赚钱方向,C/C++程序员只能自发牢骚,或许没微软预料中的快,C#的使用率的确在缓慢上升。如果没那些意外,微软真可以使C#的占用率高过C/C++,但现实没如果,iOS烟花炸放,它一下打破了编程语言原有平衡,直接导致微软傻瓜化编程走向终结,同时熄灭了指引C#前进的那盏灯。

基本可以断言,微软希望出现的两类程序员分工已经不可能实现。今后程序将越来越注重跨平台,而出于自个利益考虑,iOS、Andoird若无意外不可能原生支持C#。一旦要再装一个解释环境,这就失去了在那平台上的竟争优势。

由于无法做到跨平台,微软建议的多语言混合策略已走向死胡同。它不行不代表所有都不行了,让再看一种策略。

以可跨平台的编译语言书写最终应用。
以脚本语言书写配置,堆叠模块。
两种语言可相互调用对方的功能模块。

使用这种方法后,修改脚本语言文件,不必再重新编译程序,保证了部署灵活性;编译语言则保证了执行效率。为实现以上目标,脚本语言须支持几个特性。

一、解释脚本语法的代码要少,最好直接融入目标工程,避免须安装额外解释程序。
二、脚本语言实现基本的动态配置功能,至少要支持条件判断,像if、while。
三、除去配置,脚本语言要能和编译语言互调模块。
四、编译语言在解释脚本语法和互调上要尽可能快。

这种结合已不是理论阶段,不少软件都在按这方法走了。使用最多的编译语言是C/C++,最能符合要求的脚本语言是Lua。

微软一旦进入一领域,一般就已有宏伟计划,在PC操作系统领域,它实现了,让Windows基本处于垄断地位,但在“统一”编程思想上,它失败了。它已处在十字路口,或继续维持既定思维把自个开发环境锁定在Windows平台,或是放开手脚承认跨平台,让Visual Studio写出的应用适应跨平台。

C/C++
由于微软把C/C++定位在主要开发插件,使得Visual Studio中的C/C++ SDK是三根柱子,站不稳的。SDK主要包括两个库:MFC和ATL,ATL主要是支持COM开发,MFC才可说是直接面向应用。MFC是个失败SDK,对编程新手来说,或许都不知道这是个什么东西。

MFC面面俱到,用着N多类去封装,可它们之间似乎看不到关联。MFC很大一个失败是没有向程序员提供一条驱动应用发展的清晰主线,使得那些个类平行向前发展,没有交集。

SDK应该使提供的各模块绞在一起,绞在一起向前伸,伸去的方向清晰指出了应用的编程方向。

可以这么认为,一个应用任何时刻都处在两种模式中的一种,对话框模式、场景模式。对话框模式下,它是按下框中控件推动应用向前发展,场景模式时,存在一张大地图,主要是用户在大地图中操作推动应用向前发展。由此扩展开来,SDK在框架逻辑上要能清晰支持这两种模式。SDK不该仅仅是提供封装类,它至少应该提供编程的框架逻辑。

UNICODE
软件要支持国际化,微软认为应该以UNICODE去编写,但国际化软件的统一码更适合用UTF-8。由于这个认识上差异,悲剧上演了。

为什么要选用UTF-8,UNICODE处理ASCII字符多耗内存是次要的,主要是UNICODE无法做到和市面上的C/C++库兼容。微软知道后者问题严重性,它势必阻碍推广UNICODE编程,于是开始按自已规则改造已有C/C++库,正是这个改造,让走了条很难回头的不归路。

把运行库中C函数分两个版本,在传统函数名前上缀“_t”字符,——这种做法的结果是写出的软件离跨平台越来越远。当iOS、Andoird兴起,开始和微软共分编程语言蛋糕时,它提供的库因残废而无人问津。除了放弃“_t”回归原函数名,我想不出微软该怎么处理它的运行库。

二、苹果
苹果是一个极度偏执公司,它对自个想法坚持几乎可用变态去形容,正是这种偏执造就了iOS成功,但也正是这种偏执行,有可能会使苹果再度衰败。

以实现功能、执行效率上看,Object-C和C/C++有什么差别!可就是在全世界都把C/C++做为编程教材的首选语言,它却执意要使用Object-C。

苹果硬推Object-C,目前市场占有率上看似成功了,但Object-C正是苹果最大致命伤。

不要幻想Windows、Andoird会支持Object-C!于是可以想见了,当你应用是Object-C写时,它注定无法做到跨平台(虚拟机的就算了),这个断脚不是你靠后天可去弥补的。

正规学校教编译型语言,必修课不会用Object-C。学生要学习编程内核,那里的编程非C莫属,作为它的过渡,之后编程应用时自然会使用C/C++。不要小看程序员对同功能语言的离斥力,一旦基于苹果平台的盈利开始下滑,这种离斥力就会占据主要地位,很快就会导致Object-C使用率下降。

C/C++
总体来说,苹果一直到现在都支持C/C++写最终应用。在调用系统API时,程序的确须要使用Object-C,但苹果支持C/C++和Object-C混和编程。可以把底层调用封装成一个库,这个库向上提供纯C接口,然后C/C++应用去调用这个库,这正是SDL在用的编程思路。

三、Google
互联网造就了Google,Google是互联网时代发展最成功的公司。进入移动时代,Google希望用Andoird获得一席之地,但结果会怎么还真不好说。

Android、Java是Google在编程领域两个名词。对于Android,我认为要不是Google动不动就拿触犯专利说事,市场早已是若干类Andoird系统共存的局面。相比于iOS,Andoird真的差好多,而这个差好多,根就出在Android用了Java。

Java是脚本语言,执行效率天生就低于C/C++、Object-C。对于一些耗内存小、运算不多程序,像俄罗斯方块,以着现在硬件条件是看不出区别,但没程序会嫌设备内存太大、CPU太快,当CPU、内存增强,程序自有办法把它消耗掉。举个例子,为省内存,过去存储图像用调色板,现在内存大了,基本放弃调色板,而且必备了Alpha通道,因为这样处理会使图像更逼真。Java执行效率低不是错,但把它作为有可能开发复杂应用的首选语言,这就错了。

Java最初目标是使用在家用电器等小型系统的程序语言,经过二十多年发展,Java还是有小家子气影子,这种小家子气的一个表现就是Android在安装拥有大资源包应用时显得很落伍。

至少近阶段看不到Android要去Java化,于是使用Java编写出应用除了得带上天生的执行效率低下毛病,还有带上了不能跨平台缺陷。Java说是跨平台语言,但它跨平台的一个必备条件是该平台已安装了解释程序,要能安装Andoird上的Java环境,至少微软、苹果都不会把它列入近期发展规划。

C/C++
Andoird不支持纯C/C++应用,但提供了NDK,采用NDK后,用C/C++再加少量Java就可编写出最终应用。当中混入的Java代码往往有着固定格式,像启动代码。

四、希望中的编程模式
虽说是希望,但这模式不能理想化,它应该是基于现在又超乎现在。面对移动时代,写的程序最好具备以下几个能力。
跨平台。
1)一次编写,跨平台运行。C#、Java等虽外称是跨平台,但它们须要设备安装解释程序,而平台商为自个利益往往设置阻碍,结果让它们名不符实。相反,C/C++却被所有平台原生支持,而且只要以着源码方式嵌入工程,它可以近乎达到“一次编写,跨平台运行”。2)跨各样设备屏,屏包括两个方面,一是像素分辨率,二是同样像素面下对应不同物理面积,负责跨屏的模块主要是窗口系统,要做到编写一次窗口配置就要能跨各样设备屏。

能够简单、快捷地重新布署
程序要做到不重编译情况下就可以布署新功能,这在游戏领域有个词叫MOD。这个布署自然是希望越强越好,最好能强到平台、应用相分离。编写平台用编译语言,应用则是通过编写脚本语言。

安装时不须要额外插件
但凡须要额外插件,这就意味着存在这么问题,你的软件将受到这平台有没有这个插件制约,就会给像跨平台带来阻力。对用户来说,能够简洁安装、卸载也是衡量体验的一部分。

能较好融合开源项目
软件技术在不断更新,往往很快会在开源社区体现出来。当程序可以较好融合开源项目时,意味着程序可以较好融入新技术,同时避免独个人在战斗。程序员应该有个共识,独个人战斗那是笨蛋才干的事。

针对以上要求,需要掌握的几种语言是C/C++、Lua、ML(标记语言,下面会说)、PHP。

C/C++。最流行编译语言。C在编写内核上有着独一无二作用,但凡工科毕业的读书时就写过C。至少目前流行的平台,Windows、iOS、Android、MacOS X、Linux都支持C/C++开发应用。

Lua。编写动态配置、和C/C++互调模块。它和C/C++互调时有着非常高执行效率。Lua库的源代码不多,很简单就能以源码嵌入工程,即程序不须要额外库自个就能解析Lua脚本。

ML。标记语言,Markup Language缩点,它太简单了,说它是语言还真有点牵强。用Lua编写静态配置,怎么说还是代价点大,ML就是用于弥足这个不足。ML语法很简单,就是“块、键=值”格式。
[block]
key=value
[/block]

一块下可存在多个“键=值”对,一块下可再级连块。

PHP。理论上说,C/C++和Lua就已能编写出希望的应用,但这里还是希望学会PHP。PHP语法很像C,有C底子去学它是很快的。编写服务器应用上,相比于C/C++,PHP更简洁、高效、易维护。随着应用要不断强调联网,像要和论坛通信,和网页通信,用PHP去写服务器端将成为程序员基本要求。

___________________________________________________________
大概知道了各语言在最终应用扮演的角色,少说多做,接下是把想法附诸于自个编程。不论要写什么项目,无疑会遇到一个问题,从何开始,“不要重复发明轮子”,独个人战斗那是笨蛋才干的事,第一要选择一个好的SDK,该SDK必须具备跨平台能力。不论微软、苹果还是Google,商业公司总是把自个利益放在第一位,希望它们发布跨平台SDK,那估计须要很大耐心。好在除了商业公司还有开源社区,要改造社会,首先是适应社会,如果你热衷C/C++,并大致认同以上观点,欢迎加入Rose,一个C/C++跨平台SDK。
...全文
409 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2014-12-17
  • 打赏
  • 举报
回复
结构越复杂,越难修改,越难除错。 有时(甚至大多数时候),看上去越合理、越简洁的代码,运行起来性能越差,出错时查找原因越难,找到出错原因后改正越费劲。
ancientcc 2014-12-17
  • 打赏
  • 举报
回复
引用 4 楼 zhao4zhong1 的回复:
请牢记:源代码本身的书写是否结构化或面向对象或符合设计模式或敏捷…并不重要,重要的是你是否使用结构化或面向对象或符合设计模式或敏捷…的方法命名标识符、阅读、修改、检查、测试源代码。
特别去说到命名标识符、变量、函数名,这估计是有一定编程年头。我对此些的几个小结。 1、变量、函数名、类名等一律用小写。宏名用大写,enum值视情而定。 2、不采用微软的匈牙利记法。但class/struct名前一般会加“t”。 3、class内私有变量加后缀“_”,静态变量和struct内变量不加后“_”。 4、for、while、if后面会跟一空格。“=”两侧各留一空格。 我认为编写用于应用的SDK不采用面向对象编程是不可想象的。但如果一味在强调对象,而不把它们串联,像MFC,我认为又是失败的。 SDK应该清晰指出应用编程方向,我一般会采用一种办法:SDK定义运行逻辑基类,然后派生类从它派生,通关重载虚函数定制自已的运行逻辑。
赵4老师 2014-12-17
  • 打赏
  • 举报
回复
请牢记:源代码本身的书写是否结构化或面向对象或符合设计模式或敏捷…并不重要,重要的是你是否使用结构化或面向对象或符合设计模式或敏捷…的方法命名标识符、阅读、修改、检查、测试源代码。
Evankaka 2014-12-16
  • 打赏
  • 举报
回复
引用 2 楼 ancientcc 的回复:
[quote=引用 1 楼 Evankaka 的回复:] C++还是用来开发大游戏好。。。估计C++的市场份额不会再增加了
那是你还没看到C/C++的跨平台能力。这么多语言中,只有C/C++才是真正的跨平台。 随着移动时代到来,跨平台将成为一般应用的必备。 C/C++现在缺在的一个好的SDK。使得相比用其它语言编程,用它编程应用的要更复杂。 我现在发布应用,假设30天发布一新版本,那么前28天全是在Windows平台开发、调试,只有最后两天编译下iOS、Android,但30后,此应用完全支持Windows、iOS、Android。[/quote] 希望如此吧,我也是名c++程序员
ancientcc 2014-12-16
  • 打赏
  • 举报
回复
引用 1 楼 Evankaka 的回复:
C++还是用来开发大游戏好。。。估计C++的市场份额不会再增加了
那是你还没看到C/C++的跨平台能力。这么多语言中,只有C/C++才是真正的跨平台。 随着移动时代到来,跨平台将成为一般应用的必备。 C/C++现在缺在的一个好的SDK。使得相比用其它语言编程,用它编程应用的要更复杂。 我现在发布应用,假设30天发布一新版本,那么前28天全是在Windows平台开发、调试,只有最后两天编译下iOS、Android,但30后,此应用完全支持Windows、iOS、Android。
Evankaka 2014-12-15
  • 打赏
  • 举报
回复
C++还是用来开发大游戏好。。。估计C++的市场份额不会再增加了

15,440

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 非技术区
社区管理员
  • 非技术区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧