js2c.py源码分析:

def main():
//将目标文件赋值给natives .sys.argv[0]是自身的文件名
natives = sys.argv[1]
//将所有要编译的JS文件加入到source_files列表中去
source_files = sys.argv[2:]
//下面这条if语句实际上变没有执行,不用理会
if source_files[-2] == ‘-t’:
global TEMPLATE
TEMPLATE = source_files[-1]
source_files = source_files[:-2]
//核心函数,将所有JS文件转换成数组,一一对应
JS2C(source_files, [natives])

def JS2C(source, target):
modules = []
consts = {}
macros = {}
macro_lines = []

for s in source:
//按照路径符对字符串解析,以macros.py结尾的文件读取存在列表中
if (os.path.split(str(s))[1]).endswith(‘macros.py’):
macro_lines.extend(ReadLines(str(s)))
else:
//将所有JS文件加到列表中
modules.append(s)

Process input from all *macro.py files

//用正则将读取的数据提到到字典里面,
(consts, macros) = ReadMacros(macro_lines)
//通过对数据分析发现consts是空的,MACROS的数据如下
“”"
name=DTRACE_HTTP_CLIENT_REQUEST macro=<main.TextMacro instance at 0x7fbf8282d200>
name=DTRACE_NET_STREAM_END macro=<main.TextMacro instance at 0x7fbf8282d3b0>
name=DCHECK_NE macro=<main.TextMacro instance at 0x7fbf8282d878>
name=DTRACE_HTTP_CLIENT_RESPONSE macro=<main.TextMacro instance at 0x7fbf8282d248>
name=CHECK_LT macro=<main.TextMacro instance at 0x7fbf8282d170>
name=DCHECK_LE macro=<main.TextMacro instance at 0x7fbf8282d7e8>
name=COUNTER_HTTP_CLIENT_REQUEST macro=<main.TextMacro instance at 0x7fbf8282d5f0>
name=CHECK_LE macro=<main.TextMacro instance at 0x7fbf8282d128>
name=DTRACE_HTTP_SERVER_RESPONSE macro=<main.TextMacro instance at 0x7fbf8282d2d8>
name=DCHECK_LT macro=<main.TextMacro instance at 0x7fbf8282d830>
name=CHECK macro=<main.TextMacro instance at 0x7fbf82820a28>
name=COUNTER_HTTP_SERVER_RESPONSE macro=<main.TextMacro instance at 0x7fbf8282d5a8>
name=COUNTER_NET_SERVER_CONNECTION_CLOSE macro=<main.TextMacro instance at 0x7fbf8282d4d0>
name=DTRACE_HTTP_SERVER_REQUEST macro=<main.TextMacro instance at 0x7fbf8282d290>
name=CHECK_NE macro=<main.TextMacro instance at 0x7fbf8282d1b8>
name=DCHECK_GT macro=<main.TextMacro instance at 0x7fbf8282d7a0>
name=DTRACE_NET_SERVER_CONNECTION macro=<main.TextMacro instance at 0x7fbf8282d368>
name=DCHECK_EQ macro=<main.TextMacro instance at 0x7fbf8282d710>
name=COUNTER_HTTP_CLIENT_RESPONSE macro=<main.TextMacro instance at 0x7fbf8282d680>
name=CHECK_GT macro=<main.TextMacro instance at 0x7fbf8282d0e0>
name=DCHECK_GE macro=<main.TextMacro instance at 0x7fbf8282d758>
name=COUNTER_HTTP_SERVER_REQUEST macro=<main.TextMacro instance at 0x7fbf8282d518>
name=CHECK_GE macro=<main.TextMacro instance at 0x7fbf8282d098>
name=COUNTER_NET_SERVER_CONNECTION macro=<main.TextMacro instance at 0x7fbf8282d440>
name=CHECK_EQ macro=<main.TextMacro instance at 0x7fbf8282d050>
name=DCHECK macro=<main.TextMacro instance at 0x7fbf8282d6c8>

“”"

Build source code lines

definitions = []
initializers = []
hash_initializers = [];

for name in modules:
//读取单个JS文件
lines = ReadFile(str(name))
//使用consts进行转换,由于consts为空,所以下面这句话基本没用
lines = ExpandConstants(lines, consts)
//使用macros进行转换,这段转换函数没仔细研读。直接看转换结果,发现其作用就是检测发现上面所列的name字段,然后将这个字段(一般是函数调用)置空
lines = ExpandMacros(lines, macros)
//这是转化前后的对比

deprecated_deps = None

//
# On Windows, “./foo.bar” in the .gyp file is passed as “foo.bar”
# so don’t assume there is always a slash in the file path.
if ‘/’ in name or ‘\’ in name:
split = re.split(’/|\\’, name)
if split[0] == ‘deps’:
if split[1] == ‘node-inspect’ or split[1] == ‘v8’:
deprecated_deps = split[1:]
split = [‘internal’] + split
else:
split = split[1:]
name = ‘/’.join(split)

//需要被转化的js文件路径,要不以lib开头要不以deps开头,上面这个正则的意思就是如果以lib开头就去掉lib,如果以deps开头
则在最前面加上internal.其它的则不变如下图//


//
# if its a gypi file we’re going to want it as json
# later on anyway, so get it out of the way now
if name.endswith(".gypi"):
lines = re.sub(r’#.*?\n’, ‘’, lines)
lines = re.sub(r’’’, ‘"’, lines)
name = name.split(’.’, 1)[0]
var = name.replace(’-’, ‘’).replace(’/’, '’)
key = ‘%s_key’ % var
value = ‘%s_value’ % var
//使用sha256算法计算x的散列并返回十六进制的值
hash_value = hashlib.sha256(lines).hexdigest()
//
definitions.append(Render(key, name))
definitions.append(Render(value, lines))
initializers.append(INITIALIZER.format(key=key, value=value))
hash_initializers.append(HASH_INITIALIZER.format(key=name, value=hash_value))
//
if deprecated_deps is not None:
name = ‘/’.join(deprecated_deps)
name = name.split(’.’, 1)[0]
var = name.replace(’-’, ‘’).replace(’/’, '’)
key = ‘%s_key’ % var
value = ‘%s_value’ % var
//
definitions.append(Render(key, name))
definitions.append(Render(value, DEPRECATED_DEPS.format(module=name)))
initializers.append(INITIALIZER.format(key=key, value=value))
hash_initializers.append(HASH_INITIALIZER.format(key=name, value=hash_value))

xx# Emit result

output //就是node_javascript.cc文件啦
output = open(str(target[0]), “w”)
//将所有JS生成的16进制数据format填充进去,然后写入到输出文件
output.write(TEMPLATE.format(definitions=’’.join(definitions),
initializers=’’.join(initializers),
hash_initializers=’’.join(hash_initializers)))
output.close()

到这里为止,就把所有的JS文件转化到node_javascript.cc里面,然后就是编译C++源码了
使用py生成node_javascript.cc 下面显示的数据实际在都是在同一行,没有换行.为了方面显示观看进行了换行处理.其中JS文件与文件之间是用空格隔开的.

python tools/js2c.py
“$(obj)/gen/node_javascript.cc”
lib/internal/per_context.js
lib/internal/bootstrap/cache.js
lib/internal/bootstrap/loaders.js
lib/internal/bootstrap/node.js
lib/async_hooks.js
lib/assert.js
lib/buffer.js
lib/child_process.js
lib/console.js
lib/constants.js
lib/crypto.js
lib/cluster.js
lib/dgram.js
lib/dns.js
lib/domain.js
lib/events.js
lib/fs.js
lib/http.js
lib/http2.js
lib/_http_agent.js
lib/_http_client.js
lib/_http_common.js
lib/_http_incoming.js
lib/_http_outgoing.js
lib/_http_server.js
lib/https.js
lib/inspector.js
lib/module.js
lib/net.js
lib/os.js
lib/path.js
lib/perf_hooks.js
lib/process.js
lib/punycode.js
lib/querystring.js
lib/readline.js
lib/repl.js
lib/stream.js
lib/_stream_readable.js
lib/_stream_writable.js
lib/_stream_duplex.js
lib/_stream_transform.js
lib/_stream_passthrough.js
lib/_stream_wrap.js
lib/string_decoder.js
lib/sys.js
lib/timers.js
lib/tls.js
lib/_tls_common.js
lib/_tls_wrap.js
lib/trace_events.js
lib/tty.js
lib/url.js
lib/util.js
lib/v8.js
lib/vm.js
lib/worker_threads.js
lib/zlib.js
lib/internal/assert.js
lib/internal/async_hooks.js
lib/internal/bash_completion.js
lib/internal/buffer.js
lib/internal/cli_table.js
lib/internal/child_process.js
lib/internal/cluster/child.js
lib/internal/cluster/master.js
lib/internal/cluster/round_robin_handle.js
lib/internal/cluster/shared_handle.js
lib/internal/cluster/utils.js
lib/internal/cluster/worker.js
lib/internal/crypto/certificate.js
lib/internal/crypto/cipher.js
lib/internal/crypto/diffiehellman.js
lib/internal/crypto/hash.js
lib/internal/crypto/keygen.js
lib/internal/crypto/pbkdf2.js
lib/internal/crypto/random.js
lib/internal/crypto/scrypt.js
lib/internal/crypto/sig.js
lib/internal/crypto/util.js
lib/internal/constants.js
lib/internal/dgram.js
lib/internal/dns/promises.js
lib/internal/dns/utils.js
lib/internal/domexception.js
lib/internal/encoding.js
lib/internal/errors.js
lib/internal/error-serdes.js
lib/internal/fixed_queue.js
lib/internal/freelist.js
lib/internal/fs/promises.js
lib/internal/fs/read_file_context.js
lib/internal/fs/streams.js
lib/internal/fs/sync_write_stream.js
lib/internal/fs/utils.js
lib/internal/fs/watchers.js
lib/internal/http.js
lib/internal/inspector_async_hook.js
lib/internal/linkedlist.js
lib/internal/modules/cjs/helpers.js
lib/internal/modules/cjs/loader.js
lib/internal/modules/esm/loader.js
lib/internal/modules/esm/create_dynamic_module.js
lib/internal/modules/esm/default_resolve.js
lib/internal/modules/esm/module_job.js
lib/internal/modules/esm/module_map.js
lib/internal/modules/esm/translators.js
lib/internal/safe_globals.js
lib/internal/net.js
lib/internal/options.js
lib/internal/print_help.js
lib/internal/process/esm_loader.js
lib/internal/process/main_thread_only.js
lib/internal/process/next_tick.js
lib/internal/process/per_thread.js
lib/internal/process/promises.js
lib/internal/process/stdio.js
lib/internal/process/warning.js
lib/internal/process/worker_thread_only.js
lib/internal/querystring.js
lib/internal/process/write-coverage.js
lib/internal/process/coverage.js
lib/internal/readline.js
lib/internal/repl.js
lib/internal/repl/await.js
lib/internal/repl/recoverable.js
lib/internal/socket_list.js
lib/internal/test/binding.js
lib/internal/test/heap.js
lib/internal/timers.js
lib/internal/tls.js
lib/internal/trace_events_async_hooks.js
lib/internal/tty.js
lib/internal/url.js
lib/internal/util.js
lib/internal/util/comparisons.js
lib/internal/util/inspect.js
lib/internal/util/inspector.js
lib/internal/util/types.js
lib/internal/http2/core.js
lib/internal/http2/compat.js
lib/internal/http2/util.js
lib/internal/v8_prof_polyfill.js
lib/internal/v8_prof_processor.js
lib/internal/validators.js
lib/internal/stream_base_commons.js
lib/internal/vm/source_text_module.js
lib/internal/worker.js
lib/internal/streams/lazy_transform.js
lib/internal/streams/async_iterator.js
lib/internal/streams/buffer_list.js
lib/internal/streams/duplexpair.js
lib/internal/streams/legacy.js
lib/internal/streams/destroy.js
lib/internal/streams/state.js
lib/internal/streams/pipeline.js
lib/internal/streams/end-of-stream.js
lib/internal/wrap_js_stream.js
deps/v8/tools/splaytree.js
deps/v8/tools/codemap.js
deps/v8/tools/consarray.js
deps/v8/tools/csvparser.js
deps/v8/tools/profile.js
deps/v8/tools/profile_view.js
deps/v8/tools/logreader.js
deps/v8/tools/arguments.js
deps/v8/tools/tickprocessor.js
deps/v8/tools/SourceMap.js
deps/v8/tools/tickprocessor-driver.js
deps/node-inspect/lib/_inspect.js
deps/node-inspect/lib/internal/inspect_client.js
deps/node-inspect/lib/internal/inspect_repl.js
deps/acorn/dist/acorn.js
deps/acorn/dist/walk.js
config.gypi
tools/check_macros.py
src/notrace_macros.py
src/noperfctr_macros.py
tools/nodcheck_macros.py

编译使用脚本js2c.py ,编译JS文件生存node_javascript.cc命令如下相关推荐

  1. python eel 安卓_测试Eel——进行py与js文件数据传输

    前言 放假在家无聊,翻开吃灰的收藏夹 收藏了这么久的的吗(=・ω・=) 看着这些尘封已久的宝典,自责不已,下定决心要好好学习一番(误)!编程新手,兴趣使然,纯属分享学习经历!有错误欢迎大佬指正. 准备 ...

  2. 关于uview-ui框架在uni-app(v3编译模式,app)中,http.interceptor.js文件中无法用的getApp({allowDefault: true})获取globalData

    // 此为自定义配置参数,具体参数见上方说明Vue.prototype.$u.http.setConfig({baseUrl: getApp({allowDefault: true}).globalD ...

  3. 网络安全-网站后台的寻找+网页JS文件信息收集

    网络安全-网站后台的寻找+网页JS文件信息收集 前言 一,我也是初学者记录的笔记 二,可能有错误的地方,请谨慎 三,欢迎各路大神指教 四,任何文章仅作为学习使用 五,学习网络安全知识请勿适用于违法行为 ...

  4. VSCode中,新建js文件中编译器自带jQuery提示失效的解决方法

    VSCode中,新建js文件中编译器自带jQuery提示失效的解决方法 在VSCode中,新建js文件可能会发生VSCode自带的jQuery提示引起失效,如下图 在HTML文件中进行编辑,<s ...

  5. uglifyjs压缩js文件(指令压缩/ 批量压缩/ 编程方式压缩)

    一.指令压缩 1.安装node,npm--详细见nodejs安装与使用入门 2.安装 uglifyjs--npm install -g uglify-js 3.压缩例子:1)uglifyjs  mai ...

  6. Vue中ESlint配置文件eslintrc.js文件详解

    最近在跟着视频敲项目时,代码提示出现很多奇奇怪怪的错误提示,百度了一下是eslintrc.js文件没有配置相关命令,ESlint的语法检测真的令人抓狂,现在总结一下这些命令的解释,方便以后查阅. 默认 ...

  7. python程序编译之后、找不到生成的pyc文件_为什么主要的可运行的Python脚本没有被编译为pyc文件,如模块?...

    当模块加载时,py文件被"字节编译"为pyc文件.时间戳记记录在pyc文件中. 这样做不会使其运行速度更快,但加载速度更快. 因此,当您加载它们时,"字节编译" ...

  8. VScode中html怎么引入js,vscode中如何使用typescript,如何自动编译成js文件

    使用vscode创建一个typescript程序 1:介绍 typescript是一个跨平台的编程语言,专门用于前端的语言,是由微软开发,在2013年6月正式发布,它是javascript的超集,扩展 ...

  9. gulp-babel 阻止了js文件编译的进程?

    现象 :   编译打包的js没有输出到目标文件夹里,只是单单的生成了一个目标目录,目录里没有文件 解决方法:gulp-babel ^8.0.0 使用了 ^7.0.1的 依赖插件.统一gulp-babe ...

最新文章

  1. 利用SparkSQL(java版)将离线数据或实时流数据写入hive的用法及坑点
  2. ejb 2.0 3.0_定义EJB 3.1视图(本地,远程,无接口)
  3. TK8亮度蒙版PS插件:TKactions V8 for Mac 兼容ps2021
  4. 解决 git pull/push 每次都要输入用户名密码的问题
  5. underscore api
  6. 全面提升AI语言理解能力,达摩院自研语言模型体系登顶6大权威榜单
  7. Qt5.9一个简单的多线程实例(类QThread)(第一种方法)
  8. 3分钟了解计算机基础知识,你对电脑还一无所知?3分钟带你全面了解电脑基础知识...
  9. TextView的属性
  10. Django book 2.0
  11. 【项目管理案例】第九期:如何做好项目整合管理
  12. 七大人脉宝典造亿万富翁
  13. VML标记与通用属性
  14. 基于大数据的精准营销与应用场景
  15. 2014年总结和2015年计划
  16. python的re模块替换文件字符串_Python 正则处理_re模块
  17. 【已注册】充QQ业务软件
  18. [扩展阅读] EasyGUI 学习文档【超详细中文版】
  19. 如何清除掉“无法删除”的顽固文件
  20. Vulkan_SSAO—屏幕空间环境光遮蔽

热门文章

  1. Java JAN学习
  2. window 10 多版本激活工具
  3. 戳气球--LeetCode312
  4. Windows桌面壁纸
  5. 安卓手机数据信号好的服务器,手机信号你真的看懂了?帮您找到最强信号
  6. 2018驾考宝典面试总结
  7. 自然语言处理之LDA:文本主题模型之隐含狄利克雷分布(LDA)
  8. 多台电脑在同一局域网之间ping不通的解决方案
  9. 与数论的厮守02:整数的因子分解—Pollard_Rho
  10. CSH 入门基础 2 -- csh(C Shell)对文件/目录的判断及对参数的处理