最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • 编译器(你不知道的Javascript)

    正文概述 掘金(little_ice)   2020-12-28   453

    场景

    • ES6 编译成 ES5
    • Sass/Less 编译成 CSS
    • CSS 自动加前缀
    • ESLint
    • 把 A 语言编译成 B 语言

    工作过程

    大部分编译器的工作可以被分解为三个主要阶段:解析(Parsing),转化(Transformation)以及代码生成(Code Generation)

    1. 解析 将源码转换为一个更抽象的形式。

    2. 转换 接受解析产生的抽象形式并且操纵这些抽象形式做任何编译器想让它们做的事。

    3. 代码生成 基于转换后的代码表现形式(code representation)生成目标代码。

    解析

    解析一般被分为两个部分:词法分析和语法分析。

    1. 词法分析 通过一个叫做tokenizer(词素生成器,也叫lexer)的工具将源代码分解成一个个词素。

      词素是描述编程语言语法的对象。它可以描述数字,标识符,标点符号,运算符等等。

    2. 语法分析 收词素并将它们组合成一个描述了源代码各部分之间关系的中间表达形式:抽象语法树。

      抽象语法树是一个深度嵌套的对象,这个对象以一种既能够简单地操作又提供很多 关于源代码信息的形式来展现代码。

    比如下面的代码(LISP):

    (add 2 (subtract 4 2))

    上面代码产生的词素会像下面这样:

    [
       { type: 'paren',  value: '('        },
       { type: 'name',   value: 'add'      },
       { type: 'number', value: '2'        },
       { type: 'paren',  value: '('        },
       { type: 'name',   value: 'subtract' },
       { type: 'number', value: '4'        },
       { type: 'number', value: '2'        },
       { type: 'paren',  value: ')'        },
       { type: 'paren',  value: ')'        },
     ]
     
    

    而产生的抽象语法树会像下面这样:

        {
          type: 'Program',
          body: [{
            type: 'CallExpression',
            name: 'add',
            params: [{
              type: 'NumberLiteral',
              value: '2',
            }, {
              type: 'CallExpression',
              name: 'subtract',
              params: [{
                type: 'NumberLiteral',
                value: '4',
              }, {
                type: 'NumberLiteral',
                value: '2',
              }]
            }]
          }]
        }
    
    

    Javascript 的一句代码 let a = 1 ,转换成抽象语法树:

    编译器(你不知道的Javascript)

    转换

    编译器的下一阶段是转换阶段,这个过程接收解析生成的抽象语法树并对它做出改动。转换阶段可以改变抽象语法树使代码保持在同一个语言(列如Bable),或者编译成另外一门语言。

    ES6 的一段代码 class Dog {} 转换成 ES5 :

    function _instanceof(left, right) { if (right != null && typeof Symbol !== "undefined" && right[Symbol.hasInstance]) { return !!right[Symbol.hasInstance](left); } else { return left instanceof right; } }
    
    function _classCallCheck(instance, Constructor) { if (!_instanceof(instance, Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
    
    var Dog = function Dog() {
      _classCallCheck(this, Dog);
    };
    

    代码生成

    编译器的最后步骤是代码生成。有时候编译器在这个步骤也会执行转换阶段的一些行为,但是大体而言代码生成阶段的工作就是基于转换步骤产生的抽象语法树生成目标代码。

    代码生成器的工作方式多种多样,一些编译器会重新利用更早阶段产生的词素,还有一些编译器会创建一个独立的代码表达形式从而能够线性地打印节点,但大部分编译器还是使用的抽象语法树。


    起源地下载网 » 编译器(你不知道的Javascript)

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元