为什么不发明一个语音编程语言?

马里奥碰到花朵就变身

什么是馬里奥?一个装着 16 × 32 个小色块的长方形其中一些色块填着颜色,另一些没有什么是花?一个 16 × 16 的正方形什么是「变身」?把马里奥這个方块里面代表衣服的褐色变成红色代表背带裤的红色变成白色。什么是褐色暂且说它是 0x887000 这个数字。什么是「碰到」马里奥的长方形与花朵的正方形有所重叠。什么是「重叠」假设马里奥的这个方块占据屏幕(什么是屏幕?一个能装下 256 × 240 个小色块的矩形)中 X 方向 101 箌 116、Y 方向 21 到 52 之间的区域那么只要这个区域内有一点或更多点也被花朵所占据(比如花朵处在 X 116 到 131、Y 21 到 36 之间的区域内),我们就认为两者有所重叠

若给定以八个数值代表的两个矩形区域,请写出判断两个区域是否有重叠的 C 语言程序如果你能写出来,那么祝贺你如果有朝┅日你想自己用 C 做一遍 NES 版本的《超级马里奥》,你至少知道让他变身需要做什么了

是的,C 语言也许「只能」做数学题可是,绝大多数遊戏的运行过程就是不停地做数学题而所谓编写游戏,也就是把游戏的规则和游戏的效果转化为数学题而已其中不少题目电脑都已经知道怎么解——是别的程序员事先告诉它的——比如「求一堆散落在三维直角座标系之中的多面体在 8(x?3)?10(y+1)?11(z?1)=0 这个平面上一个给定范围内嘚投影」或者「给定一些彼此相连的顶点,求任意两点之间的最短路径」之类的数学题它只需要千万分之一秒就能给你解好。这种能力囿什么用电脑上 FPS 游戏的本质活动就是不停地求三维座标系下的多面体经过变换之后在二维平面上的投影,不停地判断两个多面体是否彼此重叠以及不停地寻找两个顶点之间的最短路径,最终达到让怪物冲到你面前咬你一口的目的不止游戏如此,其他软件也都差不多烸一个细节都是某种数学题——比如知乎页面顶端的蓝色导航条背景,是 CSS 描述的一个浅蓝到深蓝的渐变——渐变是怎么回事呢给出两个數字分别代表两种颜色,以及第三个数字代表一段距离求一系列颜色的数值以及次序,使得这段距离中任意两种相邻颜色之间的变化最尛数学题。别说 C 语言一切编程语言语言最终都只能做数学题,根据给定的数据算出另一些数据,算出更多的数据然后存贮、发送戓者呈现算出的数据。总结来说由于数学可以解释真实的世界,所以能用于创造虚拟的世界真实世界里的炮弹会以近似抛物线的轨迹丅落,所以你在游戏里以抛物线不断绘制一枚炮弹它看起来就很真实。

不过我能理解你的困惑投入大量时间看完教程,结果只能在黑框里输出一串数字这是在学编程语言还是在向七十年代致敬?编程语言是这样无法给人成就感的活动吗是,也不是看你的表述,应該不是小孩子了因为小孩子不会因为初学编程语言能做的事情很少而没有成就感,或者说觉得这样做没有成就感的小孩子根本不会继續学下去。最初学编程语言的成就感单纯来自于「我居然可以指挥机器做一些事」至少我小时候用中华学习机编一个程序帮我算暑假作業上的四则运算题时是这样感觉的。写出这些程序并用它解题虽然远比自己动笔去把题目算出来费时却让人乐此不疲。那时候我还不知噵马里奥碰到花会变身这种事情其实也是靠编程语言编出来所以我也不会去想学编程语言「并不能做什么」。

无奈大多数人过了一定年紀就很难再靠「我能指挥机器」这种简单原始的快乐来驱动自己学编程语言见过世面,听过传言欲望和野心变得复杂而庞大,你想要圖形界面音乐音效,人工智能云端同步,可是你闷头学了几堂课还是只学会在黑框里显示一串数字。你怀疑这是学 C 语言的错于是伱到知乎上来问了这个问题。

如果能把编程语言学下去日后你就会明白,任何程序都是一座冰山最终用户能看到的界面和使用的功能,只是程序浮在水面上的十分之一知乎这个网站其实也是个运行在某台电脑上的程序,你能看到的十分之一是用什么编写的呢HTML,CSSJavaScript,戓者 Objective-C而你看不到的那十分之九是用什么编写的呢?Python这些你无法直接观测到的 Python 程序运行在世界某个角落的某些计算机上,隔着光缆、双絞线和无线基站为你面前或掌上的用户界面注入生命。

……可是 Python 是用什么编写的呢C 语言(当然,这么说并不严谨Python 理论上可以用任何其他语言实现,实际上也已经被用很多其他语言实现了不过这并不是重点)。任何编程语言语言都是实现某个功能的工具Python 实现了知乎這个网站的大部分功能,而 C 实现了「用 Python 写程序」这个功能为什么是 C?

C 很别扭又缺陷重重却异常成功。固然有历史的巧合推波助澜可吔的确是因为它能满足对于这样一种系统实现语言的需要:既有相当的效率来取代汇编语言,且又足够地抽象而流畅能够用于描述各种各样的环境之下的算法与交互。

C 是初代程序员所使用的语言那时候硬件很贵,软件必须高效;而计算机的用户都是职业程序员对于硬件有足够的理解。C 贴近硬件就意味着它容易译成机器能懂的语言,而它的设计者也并不需要操心普通人学起来可能会比较困难——而且说真的,其实也不很难但是,这么多年过去之后软件规模变得越来越大,C 就像锤子和手锯修小木屋得心应手,造摩天楼就比较力鈈从心;但 C 语言可以用来造出其他更适合建造摩天楼的工具乃至组成摩天楼的预制件,就好比用锤子和手锯造出挖掘机和吊车、混凝土板和一体门窗一样(当然这个类比并不十分贴切。可是没有什么类比能贴切地描述软件工程因为软件工程像许多东西,却又什么东西嘟不像)

所以,回到你的问题上来是的,学会 C 计算机语言真的可以开发出很多东西但除非内力深厚,场合适当并且闲得蛋疼,大哆数人不会拿 C 或者只拿 C 来开发太大的东西如果你只是想要一门能够让你「编辑出一个啥子游戏或者软件出来」的语言,而且你用 Windows那建議你转去学学 C#。它长得和 C 挺像但却能迅速地写出至少是带有图形界面的程序,用起来也很方便鼠标点一点就能让你对自己的程序看起來什么样有个比较直观的印象。还有在国内,C# 的教材也相当容易找到当然 Python 也是一个很好的选择。

另外还有一件事你必须弄明白:现玳的所谓编程语言这一活动,其实大部分时候是在「合理地堆砌别人已经实现的功能来实现新的功能」C 语言莫不如是,比如 printf 这个东西昰别人做出来的「把一些数据按照指定格式输出到屏幕上」这一功能。而别人还做出来许多其他功能比如「在发现用户短时间内连续两佽按下鼠标又松开的时候调用你写好的一个函数」。学会怎样在 C 或者其他任何程序语言中使用这些既有功能也是学习编程语言的一门重頭戏。等你弄明白这一点你也就找到了你问题的答案。

尾注1:题图画错了马里奥身宽应为 16 像素,我画成了 17

尾注2:NES 上的超级玛利奥使鼡 6502 汇编完成,并不是 C碰撞检测也不是像素级的。

尾注3:我不是易语言发明者

}

钟林:说来话长这事得从20年前說起。从1996年起我就开始了汉字数字化研究工作,其目标是通过汉字数字化研究发明一种适合我们中国人使用的、效率超越英文的人机通用语言――汉字数码,进而发明一种适合人类各种语言转换的、人人都能掌握应用的人机通用语言――通用数码利用全球乃至宇宙唯┅通用语言――数字语言,方便高效地实现人与人之间的沟通、人与机器之间的沟通、机器与机器之间的沟通所以,我最初并没有想到偠将手势语言与人类语言文字联系起来

钟林:经过10多年研究,我发现汉字是由八个字母像搭积木一样构建起来的。我们用八个阿拉伯數字来表示八个汉字字母就将最复杂的汉字语言转换为最简单的数字语言。我们提取汉字字母在数字键盘上输入汉字时就将汉字输入效率提高到了空前水平。我们提取汉字首字母以构成汉字字母指令进而转换为汉字数码指令时,在有限指令集中竟然实现了各个汉字指令的不重复数字表达,令我们发明人都觉得不可思议
    记者:您说的汉字数码将汉字输入提高到了空前水平,是什么意思呢
钟林:第┅,我们实现了七万多个常用字词无重码输入平均两个数字唯一表达出了一个汉字,就是说平均击两次数字键就能输入一个汉字,这昰个无人相信的奇迹我们创造了这个奇迹;第二,在有重码、要选择的条件下我们实现了最多击三键出单字,最多击四键出两字词朂多击五键出三字词,最多击六键出四字词第三,在击键次数很少的情况下字词选项还比较少。比如最多三键出字时,共有700多对数碼对应着3000多个常用汉字而拼音只有400多个音节;又比如,拼音输入时平均要击四次键才出字而数码输入时最多击四次键,已经敲出来了┅串两字词语
    记者:汉字数码输入法的发明有什么重要意义?
    钟林:汉字数码输入法的发明解决了在数字键盘上输入汉字时击键次数哆、选项多、输入速度慢的问题。利用汉字数码输入法在数字键盘上输入汉字的击键次数比在字母键盘上拼音输入单字的击键次数还少,平均选项也比拼音输入少由此创造了在数字键盘上单手打字速度超越在字母键盘上双手打字速度的奇迹。这对于那些使用微型智能终端的用户来说无疑是个福音。


    记者:您说的汉字指令不重复数字表达有什么价值呢?
    钟林:大家知道英语指令是英语单词的缩写形式,通常取四个字母每条英语指令所对应的字母组合都不重复。汉字字母指令则是汉字首字母的组合通常也是取四个字母,每条汉字指令所对应的字母组合也不重复更奇妙的是,由字母组合转换而来的数字组合还不重复不重复的数字组合才能用作数字指令,因为面對多义的数字指令电脑是无法保证选择的绝对正确性的。
    记者:为什么要将汉字指令转换为数字指令呢
钟林:这些年来,汉语编程语訁语言之所以迟迟发展不起来其致命因素在于,一是汉字输入不便二是要有汉字库支持,这两者都显著降低了汉语编程语言语言的生荿效率、运行效率和应用范围试想用一个低效率、低用户体验、尚未普及的编程语言语言去替代另一个高效率、高用户体验、广为普及嘚编程语言语言,会是什么样的结局而将汉语编程语言语言转换为数字编程语言语言,情形就大不一样了这是因为数字编程语言语言嘚生成效率、运行效率和应用范围都要显著高于字母编程语言语言。


    记者:数字指令与字母指令比较具有哪些优势?
    钟林:首先是输入簡单了若采用键盘输入,字母指令输入要配置标准键盘数字指令输入只配置数字键盘;若采用语音输入,字母输入涉及很多音节如漢语拼音有400多个音节,英语音节则要多得多而数字输入仅涉及10个音节。其次是数字编程语言效率比英语编程语言效率要高得多比如,漢字指令“删除文件”只取每字首字母与之对应的数码指令是“3356”、英文指令却是“dele 钟林:在产品化过程中,我们发现在智能终端触屏上输入数字指令虽然要比输入字母指令方便得多、快捷得多,却不是突破性的进展因为输入数字指令仍然离不开键盘,仍然做不到盲輸入而在用户通过语音输入数字指令时,经常会遇到像“11”“555”这样的连续发音其识别率甚至还不如汉语语音。由此造成在应用市场仩数字语音技术无法与汉语语音技术匹敌。我们发明了世界上独一无二的数字语音技术但我们却看不到她的前途。

}

  很多人觉得学编程语言语言昰一件很枯燥的事情比如大量的抽象概念,写代码的时候经常出错而又找不到错误的源头认为很多逻辑思维问题想都想不明白。

()专家介绍说学了Java以后,你会觉得它越来越有趣为什么呢?因为它掌握了宇宙真理

什么时候宇宙真理,就是公认存在的事实这个事实是无法反驳的事实。如果它是错的那么宇宙也就不存在了。那么宇宙真理到底是什么呢

六个字--一切都是物体

其实是一门很有趣的语音

太阳是物體地球是物体,我们肉眼看不到的微生物是物体空气是物体,水是物体宇宙的一切都是物体。而对于我们人来说我们看到的物体,都是对象所以,Java掌握了宇宙真理在Java的世界中,一切都是对象

而你,作为一名JAVA的程序员首先你是一名发明家,因为你可以new出无数個对象其次你是一位皇帝,你可以派你new出来的对象去做任何事情

在这些对象中,我们首先要给对象分类就像世间万物,物以类聚囚以群分。

作为地球的霸主人来说,我们都是同一个类叫做人类。和Java的类一样都具有继承,多态封装和抽象等特征。

的四大特性昰继承封装,多态和抽象这就好比人的出生一样,我们是被父母给New出来的所以,我们继承了他们的基因我们出生后,不需要知道昰如何被New出来的因为整个出生的过程,都已经被父母和医生以及生理的变化给封装起来,当来到这个世界以后我们学会了哭,学会叻笑这就是多态,同一个人有着不同的表现形式。对于刚刚来到这个世界我们一无所知,正因为我们的无知才有了抽象的方法。所以那些抽象的方法并不能被实例化除非等到我们慢慢的长大,才可以重写他们的方法

一个儿子,只有一个父母儿子不仅可以继承父母的一切,同时也可以继承别人的一切,但是Java并没有提供多继承的方法,却提供了接口有了多实现,代替了多继承可有人经常問,接口是类吗

不是!为什么?因为它的父亲不是Object所有的Java,都有一个祖先那就是Object。接口没有继承他所以它不是。但是有人又问?为什么不讓接口继承呢?我也不知道但是可能是为了保护Java的纯洁性——一切都是对象。

可是JAVA保持了他的纯洁性吗?没有!因为那里面还有一些非面向对潒的东西比如,八大基本类型

其实基本类型三个就可以了,字符数字和布尔。每个人每天都要讲话人与人之间的沟通,靠得就是芓符之间的传递每个人每天都在和数字打交道,因为每个人每天都在赚钱和花钱生产和消耗,每个人每天都在做无数道判断题因为伱做的每一件事情,要么对要么错,还不许反悔因为时间不会倒流。

但是为什么有八大类型呢?因为数字就占了6个分别是byte,shortint ,longfloat,double他们并没有面向对象,但同时Java把这些基本类型进行了包装,成了类参与了面向对象的计算。比如int就包装成了integer。这样Java就变成了完铨面向对象的语言了。

面向对象的核心是让我们New出来的对象去做事这就涉及到了过程语言,过程无非就三种顺序,分支和循环顺序結构就是从头做到尾。分支其实就是一种选择就像上课,我可以选择学习Java也可以选择学习IOS。循环就是当条件满足时,我可以循环多佽去做直到条件不满足为止,我就退出循环世间万物,所有的事情都用这三种方法,但如何运用就仁者见仁,智者见智

初学Java,朂痛苦的就是经常报异常比如空指针异常,数组下标越界这些错误,我们可以往外抛一直抛到MAIN方法,让JVM虚拟机去处理但最好别这樣,还是让我们通过Try/Catch自己去捕获异常吧实在不行,就用throw new Runtime Exception

对try/catch,我是又爱又恨爱它,是因为它经常帮我捕捉异常让我知道什么地方出錯。恨它是因为它总要我们抛异常,让原本十几行的代码变成了几十行。这一点尤其是在IO流时候,用的非常的多当我们不断在写叺或者读取的时候,我们都要用字节流去完成但是一个一个字节太慢了。

后来有了字符流,可以一次读取多个字节但还是不够,接著有了缓存流先把他们存在一起,最后一起读写这样够快了,读还好办如果是写,效率还是不高怎么办?打印吧!不管怎么说,打印機的速度可比人写字的速度快多了所以,用打印流的速度最快最好,最棒

学会了IO流学会了处理异常机制,只要我们学会了SOCKET通信方法那么,我们就可以做一个聊天软件了其实通信软件有什么难的呢?不就是传几个字符串吗?提到字符串,首先让我想到的它是一个引用變量,而且是final类达内java培训()专家提醒大家,它的初始化只有一次它是不可以改变的,但是StringBuild是可以改变的如果要对字符串地址进行频繁修改的话,那我们就可以用StringBuild可惜的是,它并不是线程安全的

提到线程安全,我一直以为我们每天使用的windows操作系统是多任务的,它可鉯一次处理多个任务但是我被骗了,被骗了整整18年

年前的那个秋天,WIN98刚刚上市3个月我花了3块钱,去新大地电脑城买了一个盗版的光盤回到家,安装好以后一边玩红色警戒,一边听歌感觉真的好爽,终于不像DOS操作系统一次只能运行一个任务了当我学了Java以后,发荇这一切原来都是假象它只不过是利用多线程的技术,利用电脑处理器的速度可以精确到毫秒甚至更快进行的切换而产生的结果。多線程的技术就是实现了并发性

是不是发现学会Java是那么的重要啊。原来Java是这么的有趣。

希望以上内容对你有所帮助!郑州达内JAVA培训有着国內首家完整的移动JAVA课程体系高度专注JAVA前沿技术。郑州JAVA培训项目全部来自于真实的企业项目单独项目代码量超过 6万行。郑州JAVA培训机构为叻让学员尽快的进入到企业开发的项目中郑州达内JAVA培训使用自主开发的产品和为客户定制的企业产品为案例,大批郑州JAVA培训开发学员都從中收益

我们是一群热爱IT的年轻人,如果你也爱IT、爱JAVA开发欢迎前来郑州达内JAVA培训中心参观学习,让我们共同为梦想发声


}

我要回帖

更多关于 编程语言 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信