Cheerp 3.0,C/C++ 到 JavaScript 编译器,已转换为 Apache 2.0 和 LLVM 许可证

引入了 Cheerp 3.0 编译器,允许您将任何 C/C++ 代码编译为 WebAssembly 或 JavaScript。 新分支的显着之处在于将编译器和附带库移至使用宽松的 Apache 2.0 和 LLVM 许可证,而不是之前应用的有限许可政策,为非商业项目提供 GPLv2 许可证选项,为商业项目提供专有许可证。 编译器代码基于 LLVM 和 Clang 的开发,并包含额外的优化以提高性能并减少编译结果的大小。

Cheerp 既可用于移植现有的 C/C++ 库和应用程序以在浏览器中运行,也可用于从头开始创建高性能 Web 应用程序和 WebAssembly 组件。 该项目允许您将 C/C++ 和 JavaScript 代码组合在一个 Web 应用程序中,并且能够从 JavaScript 代码访问最初用 C/C++ 开发的函数,以及从 C/C++ 代码访问 JavaScript 对象、JavaScript 库、Web API 和所有功能 DOM。 可以创建组合程序集,其中部分代码编译为 JavaScript,部分代码编译为 WebAssembly。 它支持构建使用 libc 和 libc++ 标准库的项目。

与 Emscripten 编译器相比,Cheerp 生成更优化、更紧凑的 WebAssembly 中间代码(生成的文件平均小 7%)。 从概念上讲,不同之处在于 Emscripten 用作 WebAssembly 对象格式,并在 WebAssembly 后处理阶段(wasm-opt)进行链接和优化。 Cheerp 使用 LLVM 字节码作为库和目标文件的中间表示,允许跨越整个项目进行更广泛的优化,并利用 LLVM 级元数据,而无需进行后处理。

此外,Cheerp 使用预执行器优化器,确保在编译阶段抢先执行代码,例如,将用于初始化全局对象的构造函数转换为常量。 另外,在编译过程中,使用了PartialExecuter,它根据函数参数的分析,删除执行过程中保证不会使用的代码。

Cheer 还可以生成 JavaScript 代码来动态操作垃圾收集器覆盖的内存。 特别是,Cheerp 没有使用类型化数组来模拟传统的地址空间,而是提供了 C++ 对象到 JavaScript 对象的直接映射,这减少了内存消耗,因为 JavaScript 垃圾收集器能够删除未使用的对象。 为了提高性能,生成的 WebAssembly 中间代码使用允许数据操作并行化的 SIMD 扩展。

Cheerp 可以用作用 C++ 创建集成客户端/服务器 Web 应用程序的平台。 在当前实践中,通常开发一个用 JavaScript 编写的单独的浏览器内前端和一个用 PHP、Python、Ruby 或 JavaScript/Node.js 编写的单独的后端。 Cheerp 提供了用 C++ 创建完整 Web 应用程序的工具,其中后端和前端在单个代码库中得到支持。 在编译过程中,服务器端被编译为本机代码,接口被转换为 JavaScript 表示。 所有项目组件的调试,包括转换为JavaScript的组件,都是通过Source Map技术使用C++中的源文本进行的(如果出现错误,可以看到一段C++代码;支持在C++代码中设置断点和逐行设置) C++ 代码的行逐步执行)。

来源: opennet.ru

添加评论