现代语言浅说


首先,必须声明,C语言是上世纪的计算机语言,不计入现代语言。(以下均称计算机语言语言

而且现在所谓的现代语言,有个上百种,但总是逃不过一些简单的特性。而掌握这些特性,并不能够给你的学习增加太大的辅助,因为每个语言的作者都有自己的中二设定,这些设定你得代入自己,才可能出现奇迹!

新语言都是C语言

很多人说,学好C语言(以下称C语言C)就能够学会很多语言,因为新的语言都是类C语言,它们的各种写法总是逃不过C的“阴影”,这些“阴影”笼罩着从新兴语言的诞生到它的死亡,不,应该说它们的发展。它们在各种形式上都逃不脱C语言给定的模式,主要还是当年C出生在了正确的时代,赶巧碰上了需要简化的时代,这是种比汇编还要简单的语言,语义化恰到好处,适用于当时。

  • 数据类型: 原子类型(整型,浮点型,字符型等等) 和 自定义结构类型
  • 标准化输入输出
  • 恰到好处的标准运算符
  • 循环语句: 所有语言都要继承它的for
  • 控制语句: 没有人回去抛弃ifelse
  • 数组: 顺序化存储,最简单的顺序表
  • 指针*: 虽然许多语言在禁用此类,但底层还是用了些东西去代替的,毕竟只有和地址配合的程序,才能提高质量

肯定不是说C以前的语言没有这些内容,而是新语言的这些结构,都继承了C的写法或者风格,极其巧妙且无可挑剔。这些内容精简到了极致,像物理学家到达经典物理学顶峰一般,以后的语言还有什么内容可以添加呢?

很明显,C已经十分简单了,明了的过程式编程,一个程序划分多个步骤,加上极致完美的算法。按部就班,一个萝卜一个坑,填啊填,几乎找不到什么东西是我C实现不了的东西了。

复杂的程序写起来,哪怕是最简单的语言也得复杂起来。

然而不得不承认,最近好多人长叹——C好难啊!

C的指针结构体等等都特别地考验人的毅力,需要你对C的信心才能维持学下去,或者一样考试,考得特别难的那种,而且你还得必须过的关乎你的生活的那种。你能较为基础地掌握这些东西,而深入还需要你继续坚持下去。我身边的许多人,都想放弃这些难的部分,因为实在太难了,感觉又什么作用都没有,没有用的东西学来又有些什么用呢?当然就是放弃不学啦!

所以肯定有那么一段时间,码农肯定少了,毕竟C语言有难人的一部分,让人难以理解,生产力不足,就无法解决某些主要问题。

必须简化C的困难部分

程序员迟早要更新换代,而且一个人的人生没有多少个几十年,想设计出好的程序,而且还要提高效率。单纯的使用C就没有办法达到这些效果了!

需要对象!

不是那个对象,但你必须得面向对象。面向过程有些弊端,就是反复操作会真的很繁复,因为一个过程中可能有很多因素,你需要考虑所有因素的存在,每一个过程有,你就得把每样东西放进去!

那么重复的东西我就删除了咯,借用标记来实现简单的重复利用,这种东西叫做函数。只是你写成了这样而已,你要写的过程还不是重复的吗?计算机编译出来的也是一样的呀!

那么这个时候封装过程的想法还是老式的处理方法,我想要对某类事物进行操作,这类事物分为许许多多的分类事物,在过程式中,我可以尝试将他们不断组合利用,需要的时候组合一次,不需要的时候……等你想要用的时候还是要组合的;如果我们能够将这些事物的各类操作都封装起来呢?不单只是封装过程,包括那些没有考虑使用的过程,所有情况下都需要操作的过程。全部封起来,到你想用的时候,你只要引用特定标记一下。

然后想办法把封装的东西暴露他们的特性,使得其他的操作可以继承此类甚至操作使用此类。那么剩下的事情就简单了,我想写个大程序,只需要把这些东西组合一下。到了后期我想把东西再做大一点,可以完全不理会之前的代码,直接往后面加一些东西就行了!Perfect!

这就是所谓的面向对象的封装和继承。而多态是主要对接口的描述,不需要太过深入的描述。

那么面向对象就有三个特性:

  • 封装
  • 继承
  • 多态

由此,C++出现了,解决这些重要的问题,提高的效率拯救了程序员的时光,这些也是所谓的高效模式。

用上库!

当然,C++也不过是上世纪的语言,你绝对是大量的实现了封装,而有些众所周知的程序,我们还是要重复地写,或者重复地复制粘贴。万一这些操作和你的程序有些奇怪的不兼容,你就还得重头开始检查。天啊,这是不是降低了效率?!

那么这个时候我们就得在语言底层写好对应的通用程序,直接外部调用不是很好吗?就像封装对象一样,封装一些常用的过程或者函数或者是算法,很好的方法!就这么做!

于是库来了,用Python的同学可能很常听过“调库大师”这个词语,只考虑各种的操作,具体实现全部交给库就行了。那么还有谁不会操作编程呢?这个效率是不是特别高了?真的,全民变成了“程序员”,全民编程绝对能够实现了。

这种事情和现在的本科生一样,继续往下下去,那么本科生就是当年的高中生。可能未来的程序员就是而今的普通人,没有必要去提升,这是进步,十分值得高兴。而真正的程序员呢?毋庸置疑的,是从很多情况上说,写语言底层的才是程序员,调库的大师们不过是普通的生产工人而已。

由此可见,这两样足够简化C的大部分了,而且编程变成了人们都能接触的东西了。当然“效率”也相应地提升上去了。

但复杂的东西呢?真的可以这么简单地组合能够解决了吗?那种拼凑的东西真的普遍适用吗?

回归本源

我这里是“浅说”,所以肯定定位不准,完全个人理解,希望大家谅解,兴许我最后会说:“真香!”

你不能否定语言确实可以实现了简化,但是一些本质的东西貌似我们忽略了。内存和地址的关系,我们忽视了,一味去封装,一味想简单,速度肯定降低好多。那怎么办呢?是不是考虑真正的底层了呢?

所谓真正的底层,必然说的是逃脱高级语言之外的二进制底层,优化这一部分,哪里还用担心所谓的速度了?

所以最近的语言,由原来的解释型语言回归到编译型语言,同时力求兼容所谓的开发中解析,生产中编译,达到开发生产的双重高效。比如说在争夺中的GoRust,而且也是我比较看好的语言,他们都在努力做到高效,当然他们涉及的方向都有所不同,也不可能是完全的全能语言。毕竟全能的话,必然会发生些繁琐的操作。比如现在的定位:

  • Go简单易学,适合Web编程
  • Rust定位底层语言,系统性语言,下一代写系统底层的语言

他们共同目标: 超越C++(不是C,毕竟C++是针对C做过升级的)。

显然现在他们还没有做到他们给自己定的目标,但仍然在不断发展当中。毕竟相对C++C的一些繁琐地方GoRust做得很好,比如安全指针和内存分配机制,通过这种机制,使得底层被简化了而且还能被你操作。而不像过去一样,只是单纯地避免用户操作底层。这种折中的方案确实挺好。

而很明显的,C的编译器多样,主要是VCgcc或者clang,但遗憾的是标准不一,遗憾的是错误提醒很难受。

程序自带查错

初步,坚决不往深处的说。你看C的错误提示,十分懵。可视化编程下,查看一下,确实能够定位到错误位置,但是具体什么错误,它就不愿意告诉你了!

那怎么办呢?

坚持标准,提醒报错

Go有个好的东西,叫做统一标准,其它语言也有这种类型特性。将标准统一,一件事情只有一种解决办法,避免内乱,避免某些为了显示水平,一个事情多种解法,整体风格写得乱七八糟,那样不适合后期阅读也拖延后期扩展。

Go做到了,而且效果也挺好的。(虽然有些自带的函数,在其他包中也含有这个函数,有点重复,但相信往下会做得更好)相信新的语言也会往下继承这种方式。

统一风格之后,每个人就能认准一种主要风格了,这个用这种语言的团队就少了沟通障碍,合作的效率就提高了。

编译,详细信息包含进去

C或者C++编译之后,编译器没有检测出来某种问题,运行中出错了,然后你查,查不到哇!已经二进制了,这个时候五门就得回到代码重新调试测试。

Rust没有这方面的功能,不过Go具备了这种特性,便于后续的操作。

解析编译我都要

语言已经成熟了,选择一样那都是小孩子的事情,那么大人当然全都要啦!

就是加快编译速度,将编译运行封装成解析而已,但是总的还是提高了开发效率。解析语言确实特别适合开发调试,降低了学习曲线,且提高了效率。

总结

那么总结起来,现代语言有以下特点(非特性):

  1. 依旧类C
  2. 包含库
  3. 双重特性,开发解析,生产编译
  4. 重视效率,重视算法操作,避免语言本身
  5. 降低学习曲线就是了

但重要的,还是C。如果C能够做到的,新语言都能做到,如果C语言做起来复杂的,那么新语言是在简化某些复杂的。

所以,安心学好C吧。然后开发生产用个高效的语言,人生不要都贡献给了C


发表评论

电子邮件地址不会被公开。