我理解的代码

C、C++、Java、javascript、数据库语言

 

我想从上面五个具有代表性的语言,来整理我对代码的理解:

  在起初,没有编程语言,计算机刚发明的时候,计算机只认识二进制,即0和1 ,而且只能完成数学运算,因为二进制 十进制本质上是数字的不同表达方式,虽然仅仅只能完成数学运算,但是我们可以编写一道方程让计算机求解,而且计算机可以完成复杂的方程求解,我们甚至可以编写分支运算,所以在计算机发明之后,很快 在政府 科研 宇宙探索三个方面施展拳脚,因为这三个领域 都需要复杂的数据统计和运算。后来IBM推出了商业电脑,即大型机 主打银行 公司和学校,因为其价格相对低廉,同时大型机支持客户编写程序然后在上面运算,但是IBM不可能让所有人使用二进制编写程序,所以汇编语言出现了,汇编语言是在二进制上面的再次封装,通过友好的语义化命令,使得客户可以轻松编写程序,同时 计算机会将汇编语言转为二进制来执行,再到后来,新的问题出现了,因为IBM每个大型机都是单独定制的系统,每次需要更换电脑的时候,意味着原来的程序需要新写一遍,客户非常抱怨,于是IBM推出了IBM360,这是一个全新的领域,IBM首次提出了操作系统,即把计算机硬件与软件分离,每次客户需要更换电脑的时候,不需要再重新编写程序,因为每个大型机上面的操作系统都是一个系统,而IBM这套系统是使用汇编语言编写的,汇编语言在编写小型程序非常有效,但是在编写非常庞大的项目的时候,汇编语言的问题就出现了,因为在庞大的系统里面,诸如if switch 数据类型 内存操作 文件读取 数据操作等等是非常常用的操作,而汇编语言没有这些概念,开发人员需要先先把if实现 才能去使用if,于是新的语言出现了,这就是C,C是在汇编语言更上一层,他封装了大型项目所需要的一些基本的概念,使得开发人员可以专注于业务的编写,用C语言编写的程序同样可以使用汇编语言完成,只是c语言会更快的开发完成而已,c语言本质上是将在汇编语言开发过程中 常用的一些概念给封装成语言,最终使用c语言开发出来的程序还是会被编译成汇编语言,汇编语言是底层cpu可以执行的命令,就这样c语言逐渐流行开来,后面随着需求越来越多,项目越来越大,代码的组织逐渐成为问题,因为c语言没有封装的概念,所有的代码最终是在一起的,开发人员在合作开发过程中不得不小心的处理代码,因为在C++出现的时候,人们开发的都是操作系统,操作系统所需要的代码量是非常大的,于是C++出现了,他提出了 面向对象 模块化两个重要的概念,使得多人合作开发的问题大大缓解,C++底层应该也是直接编译为汇编语言或者直接编译为机器语言,所以汇编 C C++在运行效率上面应该是一致的,他们本质上都是将二进制语言进行的更高程度的封装,人们在编程语言从1960年到1980年探索了20年,最终精炼出了C++,实际上 是在不断的开发过程中 将一些共用的部分 已经思想用语言的方式给抽象出来,如果说汇编 c c++属于全人类的共同探索,后面的语言 则主要是依据商业决策而创造出来的语言,java的诞生 是因为sun公司希望 实现在所有的物理设备上运行一款操作系统,这样就可以实现物联网,sun公司的策略是 编写一个java虚拟机,然后java虚拟机运行在操作系统中,然后使用java语言编写出一套可以在java虚拟机运行的系统,最终java虚拟机还是将java字节码 转为机器码执行,所以java虽然实现了跨平台,但是从效率而言 是不如c++ c的,javascript是浏览器层面了,如果我们仔细思考一下,浏览器本质上是实现了sun公司的愿望,浏览器本质上就是一个虚拟机,而javascript本质上就是java,所以我们使用js编写好程序之后,最终浏览器需要将js字节码转化为机器码 然后让机器取执行,所以js的运行效率 也是极慢的,数据库语言 是人们发现数据的操作是非常频繁和耗时的,所以我们发明了数据库 专门用于数据的处理,数据库软件针对数据的查询 操作等做了极致的优化,代价是 你必须使用它的语言来编写,这很好理解,其实就是你使用他的规则 然后来利用他的优化措施 来达到数据操作优化的目的,所以语言本质上是分两种 一种是直接运行在计算机上的语言,一种是运行在软件上的语言,java js 数据库语言就是运行在软件上的语言,而c c+是直接运行在计算机上的语言,运行在软件上的语言 也叫做解释型语言,即软件需要不断地解释程序 然后转化为底层二进制命令,这里面存在一个读取 转化的时间,这也是为什么js很慢的原因.

  编程语言有几十种,但是其实是可以概括起来的,

    1:语言本身的特性

      从c c++到java js我们发现总有一些概念是一致的,这包括 数据类型、变量常量、分支循环、函数、模块化、面向对象,虽然他们实现的手法不一样,但是这些理念是基本一致的,只是不同的表现形式而已

    2:所在平台的api

      每个语言的诞生 都有其意义,在c++之前,api更多的是与计算机打交道 主要包括 文件读取、多线程、内存处理、网络通信。然而在js这里事情出现了变化,js阉割了文件读取和多线程这两个领域,在最近才加入内存处理这块内容,在03年才出现ajax处理网络读取,相应的js增加了dom和bom用来访问所在平台的api,而所在平台的api本质上是读取所在平台的信息以及使用平台完成特定的功能,如果后面vr成熟,必然会出现一个vr语言,他除了包括前面所说的语言特性,还包括使用vr的api 来完成特定的功能。

    3:所属行业的协议

      在商业语言出现之后,语言更多的与行业挂钩,erp软件 对于业务知识极为看重,银行领域的it可能不是你的技术有多高,而是你在该行业的沉淀,你是否能将你的技术与业务相结合已解决特定问题,每个行业都会指定共同的协议,web行业在tcp之上构建了http1.0 http1.1 http2.0,在erp行业应该也会存在一些约定俗成的规范 协议,

   

    代码本身的组织:

      语言本事只是一个载体,我们通过根据语言和平台api来实现特定的功能,随着项目越来越大,代码的组织和维护逐渐成为问题,面向对象和mvc这两种思想的本质是解耦,我们需要将一个复杂的项目进行解耦,而解耦目前有两种通用的解决方案:面向对象和mvc 他们分别解决两个层面的问题,面向对象是在复杂软件开发过程中 通过对不同事物的抽象来达到理清项目逻辑的问题,而mvc是在特定的界面开发过程中凝结的一种思想,通过将视图与数据分开实现降低项目复杂度 实现并行开发和代码复用,

 

  jquery backbone angula react vue loadsh属于什么范畴?

    在之前我们说到mvc是一种通用的用于项目解耦的手段,同时js借助浏览器实现了跨平台,但是由于浏览器不是由一家掌握的,而是由很多不同的公司开发的,对于bom dom的实现可能会有偏差,因为web标准本身也是在不断的演化过程中,所以在这种不确定环境下,浏览器兼容问题始终困扰着开发人员,而jquery旨在解决浏览器兼容性问题,提高开发人员的开发效率,当然你也可以不适用jquery,自己去解决浏览器兼容性问题,而backbone则是把mvc的理念引入到了js中,我没有使用过backbone,但是了解过,backbone没有c的概念,只有view和model,backbone+underscore+jquey是一对常见的组合,其中jquery用来做dom操作,underscore提供模板渲染和方法库,backbone提供v和m的规范,angular的出现是首次提出了双向绑定的概念,即将backbone+underscore+jquey组合中的jquery去掉,然后使用双向绑定代替dom操作,同时angular自带了模板渲染,所以我们也不需要underscore中模板渲染功能了,而且angular相比backbone 重新定义了前端mvc,angular具有明显的controller,如果我们把model层单独作为一个层的话,angular构建出了一个大而全的框架。而react的出现是为什么呢?react提出了组件的概念,react与angular是不同的,angular专注于整个前端的代码组织,而react只是专注于view层,因为react我们知道了组件式开发,组件和模板有什么会混淆,模板只是一个静态的html,他需要model层的数据来渲染,同时需要controller的方法来支持操作,而组件更像是 将一个场景给抽象出来,然后使用属性和事件对外暴露配置,然而仅仅使用react是不足的,因为我们不知道如何组织项目中其他部分的代码,所以flux思想出来了,flux思想旨在解决 当业务逻辑非常复杂的时候,业务逻辑如何与组件很好的结合,flux提出了store和action的概念,指出我们可以将所有业务数据放入store中,同时使用指定的action操作数据,然后组件订阅store,当store更改的时候可以收到通知,通过这种模式实现先组件与model层的解耦,而redux很好的贯彻了这种思想,所以我们现在的组合使用react+redux,而vue也在这个时候出现了,如果从最终的带来的开发理念来说:vue和react都是崇尚组件式开发 单向数据流,以及在此基础上提供一些其他附属品,尽管在具体实现上有差异,但是我觉得本质上vue和react是一样的,在视图层不断的演进过程中,函数式开发也不断流行,从underscore到loadsh再到ramda,函数式开发算是项目中的一个很好的补充,所以我们最终的使用变为react+redux+loadsh或者vue+vuex+loadsh。任何事物的发展都有一个循序渐进的过程,我们最终为何走向这里 是因为问题不断出现。当最终回头的时候 发现使用jquery已经变成一个很艰难的选择了。

 

  如果我们根据以上的整列来理解一个代码的话,这里以shell语言为例:

    我么可以先梳理出语言特性:

      变量、字符串、数组、运算符、控制语句、函数 任何语言都会有关于这些功能的实现,只是具体实现不一致而已:

        局部变量声明:word="hello"
        环境变量声明:export word="hello"
        变量使用:${word}

        字符串操作:获取长度${#text} 截取字符串${text:2:2}

        创建数组(colors=(red yellow "dark blue"))访问数组(${nums[1]})

        关系运算符、逻辑运算符、算数运算符

        控制语句:if [[ 1 -eq 1 ]]; then echo "1 -eq 1 result is: true"; else: echo '' fi

        循环语句:  

            for (( i = 0; i < 10; i++ )); do
            echo $i
            done
            while [[ condition ]]
            do

        函数定义:calc(){}

        函数调用:calc 1 2

        函数参数获取:$1第一个参数 $2第二个参数

        表达式:表达式需要写在[]里面,而且需要有空格[  ]

      

    然后我们梳理出平台api:

      因为shell是在linux系统下,而linux系统主要是计算机方面的操作,所以主要的api有 文件目录操作、流、远程访问、用户组管理、权限管理、进程管理、输出输入

        文件操作:

          ls 显示文件目录信息

          cd切换到指定目录

          cp rm mv diff ln

          cat 读取文件到窗口

          vi 编辑文件

          touch 新家文件

          grep 文本搜索工具

 

         用户信息: 

          groupadd 添加组
          useradd 添加用户
          chown 更改文件或目录的所有者
          chgrp 更改文件或目录的所有组

          su 切换用户

          who 显示登录用户

          reboot 重启计算机
          halt 关闭计算机

         

         进程相关:

          ps 显示进程相关信息
          kill 杀掉某个进程

 

         远程访问:

          telnet 登录到远程计算机

 

         输入输出:

          echo 输出信息到屏幕上
          printf 格式化输出信息到屏幕上

          read 读取输入内容

 

      同样我们也可以以es6来理解这种分类:

        es6是在es5构建而来,其实es6只不过是把一些在开发过程中约定俗成的东西给规范了而已,纵观整个编程语言发展史,这种将已经成为习惯的东西定义为语言的一部分 不就是语言的由来吗?在C语言诞生之初,为什么会定义数据类型 控制流程 分支流程 以及内存操作,因为在汇编语言时期这些概念已经出现了,而C语言把这些封装起来,而C++是在其作者多年研究模块化编程之后总结出的一套规律,如果不谈编程语言,只谈人类的自然语言,其实自然语言也是在人类的不断演进过程中 将发音与意图进行映射,最终组成了语言,然后与其他人沟通 其他人也认可这个单词,es6的数据操作就是这样,es6的数据操作 很多可以在loadsh中看到影子,

      

posted @ 2019-11-19 19:09  dami.white  阅读(224)  评论(0编辑  收藏  举报