从编程语言的发展谈起(编译原理0-1) - Go语言中文社区

从编程语言的发展谈起(编译原理0-1)


"第一个编程语言比现代的计算机还早诞生。首先,这种语言是种编码(en:code)" 

                                                                                                                                           ------编程语言历史wiki

一 计算与可编程

    "1937年,在墨拉维亚,人们发现一根旧石器时代狼的桡骨,上面刻有55道痕迹"(引自网络)

    计算是重要的,在古代似乎算盘已经满足人类的计算需求,但随着人类的认识不断扩大,计算已经非常"大"了


    1.计算机器

      Wilhelm Shickard的计算时钟是历史上最早的计算机器(1623年)

      Blaise Pascal通过计算机器“Pascaline”,说明了机械化运算的可能性(1642)

    2.可编程性

      但所有这些机器的问题是有限的执行连续计算

      Vaucanson的可设计的机器人(1738)

      Vaucanson(1749)制造了第一个自动织布机---通过一个穿孔的金属桶接受命令

      Jacquard(1804)改善了可编程织布机---利用一系列打孔的卡片

      可编程的时代渐渐到来......


二 从机器语言开始

    1.这一切都是计算机器,从第一个自动织布机开始便有了机器语言,什么是机器语言?

      机器语言是一些命令(现在.指令集),发出这些命令的人应该足够精明,精明到不会让织布机织错一朵小花的一个花蕊

      (不知这个自动织布机有没有这么厉害), 人要精明,机器也要一定准确(可靠性)

    2.但是这么精明的人不多啊,用机器语言编程....(谁想试试看!!),不过前辈都受不了了

      发明了汇编(让人们很容易明白给机器说了些什么,不错!),"IBM公司工程师J. Backus因深深体会编写程序很困难,

      而写了一份备忘录给董事长Cuthbert Hurd,建议为IBM704系统设计全新的电脑语言以提升开发效率。

      当时IBM公司的顾问冯诺依曼强烈反对,因为他认为不切实际而且根本不必要"

      老冯都反对看来汇编真的不错!不过J.Backus的建议怎样呢?


三 走向高级语言

    1.Fortran诞生

      "但Cuthbert Hurd批准了这项计划"(接上)

      就这样历史上第一个高级语言FORTRAN在1957年被开发出来

      这里维护了一个包括50种主流编程语言的发展图

      

      想看清楚这张彩图点这里


    2.第一个FORTRAN的编译器只能用低级的机器或汇编写成,那之后呢?

      我们用这个结构描述源语言,目标语言,编译程序实现语言的关系

     

      那么我们表示一下用FORTRAN实现FORTRAN的编译器的情况

     

      好我们的目标实现了,就是3

      我们为什么要这样做呢?

      我们有一个可靠的Fortran编译器1(实现了Fortran的一些简单特性), 但是我们的Fortran需要增加一个好用的特性, 再用低级的语言实现,

      似乎难度很高(编程时的耗时多,实现以后检验可靠性的耗时多),而我们如果用已有的Fortran实现自己的编译程序这些问题就好多了


      我们现在又发明了一门语言怎么办?

     

      3就是你!

      这就是滚雪球的原理,当然这个效应不止适用于经济学

      我们今天用的高级语言java,python,vhdl,prolog,Fortran...,这些已经很强大了


    3.关于编译程序的移植

      语言在发展,处理器也在发展,不同的需求产生了不同体系结构的处理器,当然编程语言对处理器体系也产生了许多影响

      那么我们怎么得到别的平台(不止是不同体系的处理器,还有操作系统)下的某语言的编译程序呢?

     

      5啊!我们实现了L1从A到B的移植

      我们为什么要这样做呢?

      <1>.高级语言的重要性

      谁不在用高级语言编写程序?

      现在那个软件不是用高级语言实现的(即使是操作系统,其中也只有N牛一毛是用汇编写的)?

      <2>.通用处理器的低成本生产(这都是我自己的了解与理解,仅供参考)

      现在的处理器是怎么生产出来的?

      +体系结构的确定,指令集的定义(由于高级语言不可替代的地位<你会了解到它的重要性的>,

        为了让编译器生成的机器程序达到更高的执行效率(更加有效的利用处理器)这些东西的定义不得不考虑编译器的实现)

      +通过VHDL,Verilog,HDL等硬件设计语言模拟出机器

      +如果这个处理器需要高级语言的支持(有些计算机器是直接用硬件实现的,e:简单的计算器)

        那么同时便是此机器上某语言的编译程序的实现(通用机一般都先实现C语言)

       为什么要实现它?

       +这个机器的操作系统不是用重机器语言写的吧?

         我们要用高级语言实现这个操作系统(C是目前非常好的系统编程语言,执行效率和语言的高级性很好的折中)

         然后用这个编译器去编译它(可想编译器的重要性)

         我们怎样实现这个编译器呢?

         一般是这样的

       


        这里的编译程序被称为交叉编译程序(交叉编译器)


        那么交叉编译呢?

        上面的也算是交叉编译,但一般的交叉编译是这样的?

        

        为什么要这样做呢?

        .目标平台上不允许或不能够安装我们所需要的编译器,而我们又需要这个编译器的某些特征;

        .目标平台上的资源贫乏,无法运行我们所需要编译器,目标平台还没有建立,连操作系统都没有,根本谈不上运行什么编译器;

          "在项目的起始阶段,目的平台尚未建立,因此需要做交叉编译,以生成我们所需要的bootloader(启动引导代码)以及操作系统核心;

        其次,当目的平台能启动之后,由于目的平台上资源的限制,当我们编译大型程序时,依然可能需要用到交叉编译"引自百度百科

       我没吃过猪肉,但见过猪就是这样跑得,这种情况是很真实的

       交叉编译有很多限制,有时候这都是不得已的行为


      关于可变目标编译器

     

      这样的编译器被称为可变目标编译器(e:LCC)


四 编程语言的分类

    1.按程序语言的发展分类

   

      这里的代反应了程序设计语言的进步

      GPDL通用程序设计语言(C,FORTRAN)

      DSL领域特定语言(SQL,NOMAD)

      第五代是基于逻辑约束的语言(Prolog,OPS5)

      抽象级别的不断提高,编程的简易性不断提高

    2.术语冯诺依曼式语言

      以冯诺依曼计算机体系结构为计算模型的语言(FORTRAN,C,JAVA..)

      因为现在的计算机并没有摆脱冯诺依曼体计算机原理(存储,程序,控制), 所以一般贴近机器的语言都为冯诺依曼语言

    3.什么是脚本语言

      脚本:“表演戏剧、拍摄电影等所依据的底本电影脚本,载有台词 故事情节等”

      脚本语言:"是具有高层次运算符的解释型语言,它通常被用与把多个计算过程“粘合”在一起"(python,php,perl,awk...)

      脚本语言就是表演的剧本;

      计算过程,就是戏剧中的故事情节;

      我们的这个剧本(脚本)组织了这些故事(计算过程),使它们生动表演一台戏(脚本程序)

    4.学习语言重要的东西----范式(范型,模态,方法)范式分类法

       wiki列出了许多语言范式,但鉴于本人的理解,只列出下列


     

   

      世界上第一个高级语言属于命令式语言

      编程语言总体分为俩类,这是大家公认的,命令式声明式,这两个范式是相对立

      自Fortran以后,没过几年程序设计语言便产生的分支(贴近机器,贴近数学)

      1970年左右,编程语言处于发展的鼎盛时期,基本的范式都已经产生(面向过程,面向对象,函数式,逻辑式...)

     

      这里我们主要讨论命令式与声明式的区别

      <1>.从表达上看

        命令式语言,注重怎么做(How to do what);

        声明式语言,注重做什么(where to do what);

        从我家到你家,命令式:向南走400米,左拐走354米;

                                 声明式:给这是地图,你自己看吧;

        那么这个地图是那里的,以此推下去,总会找到某个东西的命令式实现.因为我们的机器就是命令驱动的,

        指令集是这个机器完整的命令集.我们的软件都是建立指令集之上的,编译器会提供”种子“(这是命令式实现的),

        让你用这样的方式(声明式)去编程

     <2>.从符号的性质看

       关于 x = x + 1的疑问

       在没有学习计算机之前,我们不敢相信这样的事情! 那什么让这成为了可能?内存!

       命令式:符号是内存的抽象

       声明式:符号就是在你没学习计算机之前所认识的数学符号,它可能是自变量,可能表示一种关系等等

      命令式语言是用副作用编程

      声明式语言是用数学方法去编程

    imperative还有“迫切”之意,发出的命令要立即执行(命令式通常也做强制式);

    而声明式这种注重表述的语言中实时性性似乎不那么理会;

    所以在顺序性比较强的地方,

       print "像这种先提示,后输入的语句"

       input()

    声明式编程逊色不少,正因为如此,声明式语言也具有命令式的一些特点

    命令式和声明式是相互交融的

    学习语言最重要的是编程范式的学习


    编程语言现在向着更加声明式,元编程, 多范式以及提供扩展语法接口的方向发展

    具体见这里


                                                   转载请注明出处哈喽易

                                                   注:文中有任何不当或有任何疑问请指出! 谢谢!

版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/HScccc/article/details/9724265
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 发表于 2020-03-01 21:02:49
  • 阅读 ( 1659 )
  • 分类:

0 条评论

请先 登录 后评论

官方社群

GO教程

推荐文章

猜你喜欢