本文基于我个人的一些学习和开发经验,以机器语言、汇编语言、C/C++、Java、C#为例,谈谈我的看法,如有不对的地方,欢迎指出。感谢我的老师和师兄师姐在我提出这个问题后,给出了他们的看法。本文尽可能用更容易理解的角度去编写,帮助理解编程语言。

对于编程语言的初学者,以及学过一些编程语言的科班学生、培训机构的学生等等而言,编程语言似乎很难理解。为什么会有这么多编程语言?为什么需要这么多编程语言?为什么有了这么多编程语言了还不停出新的编程语言?编程语言之间的区别是什么?等等一系列的问题就出来了。如果不能很好地去理解,望着层出不穷的编程语言,以及语言流行上不断变化的最火的编程语言,最火的框架,然后我们就开始害怕,开始犹豫,开始抱怨,开始焦虑,开始跟不上时代的步伐。

这样的感觉我也有过,但是我并没有后面这么复杂的情绪,因为我还只是个大三的学生。但是,我知道如果我没有去解决这个问题,我以后的情绪可能会更复杂。百度、谷歌很难找到合适的答案,说的过于抽象或者太深,所以,我还是决定说说自己的理解,简单谈谈。

最开始出现的,就是传说中的机器语言,就是那一大串0和1做成的符号。我们都知道,计算机比较笨,它所能理解的状态只有两种,开(1),关(0),你也可以看成开关变量。为什么只有它只能理解两种状态?不深入讲,从浅层来说,有一个电路,最简单的控制方式是什么?毫无疑问,给它一个开关,开(1)对应的电路就开始工作,关(0)对应电路就不工作。所以,机器语言的操作就是基于二进制(0,1)来操作,最接近底层,计算机能看懂的语言。然后就出现了一大串0,1的代码,你也可以称作操作码,但是计算机是看着舒服了,可苦了编写机器语言的程序员了。前几天刚写完的代码,成就感满满,然后招了新人进来,新人看了好久才看懂,密密麻麻的0和1。所以,那时候能编程的人都非常厉害,但是谁又愿意一直看着这一堆可怕的0和1呢?

后来,想出了一个办法,给特定的操作加上一些英文符号,用来代替机器指令的操作码,这样看起来就容易懂很多了,编写、维护和阅读都方便了很多,最具代表性的,就是汇编语言了。容易懂,当然是相对于机器语言来说。我们最常见到的可能就是MOV这个指令了,亲切而自然。但是汇编中还是涉及到了大量的硬件方面的知识,比如寻址方式、寄存器,并且不同的机器中,对应着不同的汇编指令集,这让汇编基本不可能做到跨平台。那么,我们能不能再封装一层,让编程与当前的硬件环境再分一分,然后去掉汇编中那些相对难理解的知识,让编程更加贴近我们的思维,更加简单一点?

时光加速一下,我们便来到了我们高级语言的世界了,最负盛名的便是C语言了。函数、条件、分支、循环等等用的非常舒服,而指针,相对于汇编来说就容易理解多了,虽然也有地址的概念,但是也做了相当多的包装,理解起来也相对容易很多。而C语言又相对好地解决跨平台的问题(没有完全解决,但是语法上已经没有什么差异了,移值性也非常强了),并且指针的操作也能让我们更贴近底层去编写高速运行的代码。经常听到一种说法,C语言是高级语言中的低级语言,高级贴近我们人类的思维,而低级在于贴近底层,有指针能直接操作地址,甚至寄存器。C语言的优秀,我们不需要去质疑,一门语言能流行这么长时间,自然是有它的强大之处。

C语言虽然很优秀,但是随着需求的增大,代码量的增大,是不是可以对C语言进行拓展?C语言的思路是将整个过程完整地做下来,更加侧重于实现的过程,我们往往称之为面向过程的语言。但是如果我们换一种思路,把我们的需求分成几个对象,每个对象都有自己的特性、还有自己特有的动作,然后我们再将这些对象的关系处理一下,然后便完成了整个程序的编程工作。但是仅仅有对象可不行,如果我把一个学生看成一个对象,那么我一个班有50个学生怎么办?难道也要写50个对象?当然不是,我们把对象再抽象一下,把他们的共性都找出来装在一起,我们称之为类。这样是不是更加贴近我们日常生活的思维?把现实中的事物看成对象,再抽象成装有共性的类。面向对象思维的优势就不描述了,可自行百度、谷歌。

这样在C语言的基础上不断做新的拓展,然后就成为了我们非常熟悉的C++了。从后面的“++”就可以明显看出,C++的特性了,能向下兼容C语言,我们常用的指针在C++中也非常出色。当然,这样也使得C++的难度变得很高,掌握如此大量的API并非易事。并且,指针操作也让很多程序员饱受折磨,即使是很厉害的程序员也不例外。终于还是有一批程序员受不了了,决定出逃,建立他们的新天地,编写一门更加简单易用的编程语言。

他们决定将他们最痛恨的指针打入禁地,封起来,自己研制了一套很好的方案,由他们自己编写的库去操作指针。然后他们包装包装,形成了一个虚拟机,专门用于转化。上层开发人员都不能直接使用,一用就给你报错。封好指针后,他们就开始编写API/库,将一些常用的操作都封装起来,供开发人员调用,然后慢慢形成了一门新的语言。因为它是在C++的基础上做了简化,那就叫它C++--吧。可是又太长了,一番折腾考虑之后,决定叫Java。没错,就是鼎鼎大名的Java,上面的虚拟机就是Java虚拟机,API/库就是JDK。

简单易用的特性,让越来越多的程序员转向了Java,Java越混越好。后来又出现了一门语言,C#。接触过Java和C#的人,就会发现两种语言的相似度很高。C#可以看做C++++,只是后面的“++”不再是拓展的意思,更有一些简化优化的意思,添加了一些很不错的特性,也更加简单易用,同时向下兼容C/C++,但C#一直不温不火。

上面是一部跳跃版的编程语言发展史,阅读下来后,相信大家对编程语言已经有了自己的理解和看法。对于第一段提出的问题,相信也已经有了自己的答案。可以简单地理解为:

编程语言从来都只是工具,帮助我们解决问题的工具,并一直致力于成为简单易用的工具。

后记:

第二篇已经更新,可以继续查看,简单谈谈编程语言(二)

不定时更新文章,尽可能坚持下去。

简单谈谈编程语言(一)相关推荐

  1. 简单谈谈编程语言(外篇)

    本文是前三篇文章的外篇,主要讲讲我从C到C的编程语言之路,从上层应用到较底层开发,目前主攻C语言嵌入式开发.本文本来预想是两个星期前写的,但由于热身赛临近,需要投入大量的时间,所以迟迟抽不出时间来,加 ...

  2. mysql慢查询检查流程_简单谈谈MySQL优化利器-慢查询

    慢查询 首先,无论进行何种优化,开启慢查询都算是前置条件.慢查询机制,将记录过慢的查询语句(事件),从而为DB维护人员提供优化目标. 检查慢查询是否开启 通过show variables like ' ...

  3. html js脚本限制 正则,简单谈谈JS中的正则表达式

    1.正则表达式包括两部分 ①定义正则表达式的规则: ②正则表达式的模式(i/g/m): 2.声明正则表达式 ① 字面量声明: var reg = /表达式规则/表达式模式: eg:var reg = ...

  4. 微信小程序setinterval_简单谈谈setTimeout与setInterval

    感谢踩过的坑 sf社区的第一篇文章. 最近在做一个拍卖的微信小程序,用到了定时器setTimout和setInterval,简单谈谈这两个api. setTimeout 最常见的用法就是第二种(第三种 ...

  5. 简单谈谈setTimeout与setInterval

    感谢踩过的坑 sf社区的第一篇文章. 最近在做一个拍卖的微信小程序,用到了定时器setTimout和setInterval,简单谈谈这两个api. setTimeout 最常见的用法就是第二种(第三种 ...

  6. VR看房火热背后,简单谈谈拍摄VR全景图片——普及贴

    VR看房是云看房的标配,今年恒大的恒房通,一个月成交的房子合同超过了500亿元! 九商VR全景支持视频.音频.三维产品等全景互动功能,还可在微信.微博.网站.小程序等平实现高质量的全景展示和分享,并已 ...

  7. VR看房背后,简单谈谈如何拍摄VR全景图片

    VR三维全景看房是云看房的标配,那么重点来了. 今天给大家简单谈谈拍摄VR全景图片 1.设备选择 目前市场上的VR全景拍摄设备越来越多,菊花发布的手机号称能给月球做全景拍摄的功能.除了外,还有普通卡片 ...

  8. 荣耀v8升级android 8,荣耀逆向升级?简单谈谈荣耀V8升级荣耀8X感受

    荣耀逆向升级?简单谈谈荣耀V8升级荣耀8X感受 2019-03-09 17:11:43 1点赞 0收藏 1评论 话说在2016年底,家里老妈的红米note因卡机不断,最后经不起叨叨就给她换了手机.她的 ...

  9. 简单谈谈OAuth 2.0的四种认证方式

    简单谈谈OAuth 2.0的四种认证方式 一.基本认识 1.1 OAuth认证中的四种角色 二.认证方式 2.1 授权码认证 2.2 简化认证 2.3 密码认证 2.4 客户端认证 一.基本认识 在小 ...

  10. 简单谈谈js中的MVC

    MVC是什么? MVC是一种架构模式,它将应用抽象为3个部分:模型(数据).视图.控制器(分发器). 本文将用一个经典的例子todoList来展开(代码在最后). 一个事件发生的过程(通信单向流动): ...

最新文章

  1. Django连接数据mysql
  2. Linux系统Vi/Vim编辑器的简单介绍、安装/卸载、常用命令
  3. Caused by: org.apache.ibatis.reflection.ReflectionException我碰到的情况,原因不唯一
  4. Elections 思维
  5. inspinia前端模板怎样编写消息提示框点击确定后的回调方法
  6. 【临实战】CentOS 批量配置
  7. 图例符号居中显示_R可视化08|ggplot2图层-标度图层(scale layer)-图例篇
  8. 基于智能计算的降维技术研究与应用
  9. Scrapy 爬虫框架五—— 常见的反爬虫技术
  10. GRE 隧道配置案例(静态、动态路由)
  11. 2021 年全球知名开源项目
  12. 【OpenGL】glFinish()和glFlush()函数详解
  13. 宝藏软件:“小狼毫” 一款开源牛叉输入法
  14. 串口转usb驱动c语言程序,usb serial驱动下载-usb serial converter驱动下载 官方版usb转串口驱动程序-win7/8/10/xp32/64位-IT猫扑网...
  15. 软件程序开发步骤有哪些?如何简单制作手机App?
  16. 关于使用Python——写模拟手机通讯录查询系统
  17. Spire.XLS:一款Excel处理神器
  18. kindle电子书资源搜索及制作教程
  19. 生日快乐祝福。我遇见你 都是人间最好的事
  20. Convolutional Neural Networks for Sentence Classification用于句子分类的卷积神经网络

热门文章

  1. pandas填充空数组_pandas | DataFrame基础运算以及空值填充
  2. 什么是中药药浴?中药药浴的操作方法和注意事项
  3. 微型计算机咋样插网卡,PCI网卡怎么装及插在哪 PCI网卡安装使用图文教程
  4. ArcGIS 10.7基础:三种栅格影像裁剪操作
  5. php 函数 累乘 累加,如何实现EXCEL中的累加计算【累加累乘】
  6. 百度程序员猝死 是否过劳死引发争论
  7. 【学习笔记】图像纹理特征
  8. Fang Fang HDU - 5455 (思维题)
  9. C# NPOI 导出Excel 小数位数控制
  10. 重装系统原来这么简单,最详细的win7安装教程