zoukankan      html  css  js  c++  java
  • 任何语言都有开发出来编译器的可能?

    任何语言都有开发出来编译器的可能?

    今天在思考一个问题,毕竟学完编译原理一段时间了,编译器到底可以由哪种语言开发呢?

    我们都知道编译程序通常分为下面五个阶段:
    1)词法分析
    2)语法分析
    3)语义分析与中间代码产生
    4)优化
    5)目标代码生成

    当然最难的一点就是目标代码的生成,这一阶段实现了最终的翻译,就是真正把原码翻译成可以被CPU直接计算的机器码(NativeCode)。


    在网上看了看,有的网友说C语言的第一代编译器是由B语言写的,因为C语言毕竟是在B语言的基础上设计出的一种新语言。

    但是B语言由A语言修改而成的语言,当然B语言的编译器肯定是A语言生成的,那A呢?无穷递归,总有一个结束的地方。

    那就是汇编语言,汇编语言写出了第一个简单的编译器,然后这个编译器再生成编译器,不断的生成新的编译器,不断的抛弃旧编译器,这样编译器就越来越成熟,越来

    越好用了。

    也就是下面的这句话:

    机器生汇编,汇编生A,A生B,B生C,C生万物。

    理论上来讲,用什么语言都可以编写出编译器,只是效率的问题,因为经过很多步骤的翻译,都最终翻译成了机器码,有的步骤多,效率低,有的步骤少,效率高,当然,我

    们现在用的就是效率高的这种。


    其实我在想为什么汇编语言生成一个简单的编译器后,可以用新生成的编译器再次生成编译器,例如,C语言开发C的编译器呢?

    这是一个递归的思想,举个例子一看就明白了

    用一个大的模具可以生成一个A模具,A模具可以做出来B模具,依次往下推,最终这个小模具可以做出来小盒子用来装东西。

    第一个大模具肯定是手工做出来的第一个模具,但是有了这个大模具后,后面就可以用他自动的生成更多的模具,后面的各种模具加起来又可以造出来更精致的模具,

    所以,自动第一个大模具造出来模具的时候,大模具就可以被抛弃了。

  • 相关阅读:
    Oracle
    Oracle11g服务详细介绍及哪些服务是必须开启的?
    数据结构——二叉树树的遍历理论与实现
    MapReduce新版客户端API源码分析
    【编程范式】汇编解释swap方法
    iPhone、iPod和iPad离线固件升级的方法
    Linux备份
    mysql下用户和密码生成管理
    The secret of ROWID
    linux文件权限解说
  • 原文地址:https://www.cnblogs.com/greatfish/p/5925570.html
Copyright © 2011-2022 走看看