text: /* @flow */
  
  import { parse } from './parser/index'
  import { optimize } from './optimizer'
  import { generate } from './codegen/index'
  import { createCompilerCreator } from './create-compiler'
  
  // `createCompilerCreator` allows creating compilers that use alternative
  // parser/optimizer/codegen, e.g the SSR optimizing compiler.
  // Here we just export a default compiler using the default parts.
  export const createCompiler = createCompilerCreator(
    /**
   * 在这之前做的所有的事情，只有一个目的，就是为了构建平台特有的编译选项（options），比如 web 平台
   *
   * 1、将 html 模版解析成 ast
   * 2、对 ast 树进行静态标记
   * 3、将 ast 生成渲染函数
   *    静态渲染函数放到  code.staticRenderFns 数组中
   *    code.render 为动态渲染函数
   *    在将来渲染时执行渲染函数得到 vnode
   */
    function baseCompile (
    template: string,
    options: CompilerOptions
  ): CompiledResult {
    // 将模版解析为 AST，每个节点的 ast 对象上都设置了元素的所有信息，比如，标签信息、属性信息、插槽信息、父节点、子节点等。
    // 具体有那些属性，查看 start 和 end 这两个处理开始和结束标签的方法
    const ast = parse(template.trim(), options)
  
    // 优化，遍历 AST，为每个节点做静态标记
    // 标记每个节点是否为静态节点，然后进一步标记出静态根节点
    // 这样在后续更新中就可以跳过这些静态节点了
    // 标记静态根，用于生成渲染函数阶段，生成静态根节点的渲染函数
    if (options.optimize !== false) {
      optimize(ast, options)
    }
    // 从 AST 生成渲染函数，生成像这样的代码，比如：code.render = "_c('div',{attrs:{"id":"app"}},_l((arr),function(item){return _c('div',{key:item},[_v(_s(item))])}),0)"
    const code = generate(ast, options)
    return {
      ast,
      render: code.render,
      staticRenderFns: code.staticRenderFns
    }
  })
  