code: function(node, frame) {
                  // ...? 目的是
                  if (frame) {
                      this.fail("compileRoot: root node can't have frame");
                  }
  
                  frame = new Frame();
                  // ... 生成函数的开始部分代码
                  // 
                  // function root(env, context, frame, runtime, cb) {
                  //     var lineno = null;
                  //     var colno = null;
                  //     var output = "";
                  //     try {
                  this.emitFuncBegin('root');
                  this._compileChildren(node, frame);
                  if (this.isChild) {
                      this.emitLine('parentTemplate.rootRenderFunc(env, context, frame, runtime, cb);');
                  }
                  this.emitFuncEnd(this.isChild);
  
                  // When compiling the blocks, they should all act as top-level code
                  this.isChild = false;
  
                  // ...? 查找当前的节点中的Block节点 待分析
                  var blocks = node.findAll(nodes.Block);
                  for (var i = 0; i < blocks.length; i++) {
                      var block = blocks[i];
                      var name = block.name.value;
  
                      this.emitFuncBegin('b_' + name);
  
                      var tmpFrame = new Frame();
                      this.compile(block.body, tmpFrame);
                      this.emitFuncEnd();
                  }
  
                  this.emitLine('return {');
                  for (var i = 0; i < blocks.length; i++) {
                      var block = blocks[i];
                      var name = 'b_' + block.name.value;
                      this.emitLine(name + ': ' + name + ',');
                  }
                  this.emitLine('root: root\n};');
              }
docs: ... 编译根节点