当前位置: 首页 > 后端技术 > Node.js

Emscripten安装使用,让C语言出现在前端

时间:2023-04-03 11:37:09 Node.js

下载安装官方推荐方式,先下载emsdk:gitclonehttps://github.com/emscripten-core/emsdk.gitcdemsdk#下载安装最新的SDK工具../emsdkinstalllatest#为当前用户激活最新的SDK。(写入.emscripten配置文件)./emsdkactivatelatest#激活当前PATH环境变量source./emsdk_env.sh注意Windows下运行emsdk,不是./emsdk和emsdk_env.bat代替。source./emsdk_env.sh会安装sdk-release-upstream,node.js等,因为对应的软件包是从https://storage.googleapis.com/下载的,如果因为这个域名无法直接访问网络原因,可能需要设置代理下载。安装验证确保已下载并安装Emscripten(具体的安装方法取决于您的操作系统:Linux、Windows或Mac)。使用Emscripten编译器前端(emcc)访问Emscripten。该脚本调用构建代码所需的所有其他工具,并可用于代替_gcc_或_clang_等标准编译器。在命令行上使用./emcc或调用它./em++。$emcc--versionemcc(Emscriptengcc/clang-likereplacement)1.40.1...编译接下来,您可以编译代码。我们来试试一个千百年不变的Helloworld:#includevoidmain(){printf("Helloworld!");}可以和第一种情况比较:emcchello.c和,第一种两种情况:emcc-O2hello.c-ohello.wasm进行编译,感受一下区别。第一种情况,编译会生成一个2500多行的JavaScript文件a.out.js和一个近万行代码的a.out.wasm文件,默认可以反编译成文本wat格式。它太多了,但不要害怕,我们稍后会告诉你如何让它们变小。a.out.js是一个胶水,用于为wasm搭建不同条件下的执行环境。不管它是什么,首先尝试运行它:nodea.out.js不幸的是,没有人向你问好世界。相反,它会向您发出一堆警告:stdiostreamshadcontentinthemthatwasnotflushed。您应该将EXIT_RUNTIME设置为1(请参阅常见问题解答),或者确保在printf等时发出换行符(这也可能是由于不包括完整的文件系统支持-尝试使用-sFORCE_FILESYSTEM=1构建)英语意味着编译后的wasm默认不会退出运行时。这是Web环境中的预期方式。虽然主程序main已经运行完毕,但是模块并没有退出。静态变量可以保存在内存中而不被释放。.同时,标准I/O缓冲区没有被刷新,所以你看不到Helloworld!听人建议,加参数编译:emcchello.c-sEXIT_RUNTIME=1然后用node.js运行:nodea.out。js你好世界!预期的Helloworld!没有更多可怕的警告。你可能会问,我编译了hello.c,为什么a.out.js出来了?这还真有点历史传统。你可以将a.out理解为汇编器输出。这个*nix可执行文件也称为a.out格式(比较ELF格式)。如果你看起来不舒服,你可以指定你自己的名字。让我们看看如何在下面指定您自己的名字。第二种情况emcc有两个常用的编译参数,big和smallohm(O,o),bigohmO指定优化级别,smallohmo指定输出文件和类型。有五个优化级别-O0、-O1、-O2、-O3-Os。如果不指定,则为-O0,即不做优化。一般在开发时指定为-O0或-O1,这样编译速度快,调试方便。正式发布时可以是-O2或-O3,这样代码会优化,执行速度更快。-os不仅执行速度快,而且优化大小生成更小的可执行文件。emcc小欧的o选项指定输出文件类型:js、wasm、html。我们尝试生成html:emcc-ohello.htmlhello.c这次会生成三个文件:hello.html,hello.js,hello.wasm在当前目录执行live-serverlive-server如果你在机器上如果没有live-server,可以使用npminstalllive-server来安装。live-server会启动一个web服务器,默认监听本机8080端口,自动打开浏览器:点击hello.html:显示两个黑洞页面,我的Helloworld!?好吧,页面也有页面的怪癖。使用printf打印时,由于缓冲区没有刷新,所以看不到我们的Helloworld。添加编译选项:emcchello.c-ohello.html-sEXIT_RUNTIME=1CTRL+C停止live-server,重新编译,再次启动live-server,再次刷新页面:OK,我们的Helloworld!闪闪发光,好可爱!我们经历了什么?我们安装了emscripten编译工具链,将用C语言编写的代码移植到Node.js的命令行中,在Web页面上执行。谁说C语言不能当前端?不过,我暂时还看不出这样的折腾有什么用,那我来汇集一个能说明问题的用例吧?你关注我,我持续更新!是时候学习WebAssembly了!