首页 web前端 js教程 创建运行时

创建运行时

Oct 27, 2024 am 09:55 AM

Criando uma Runtime

你好,我的名字是 Lucas Wasilewski,就像自从我开始使用 NodeJS 编程(2021 年初)以来我在 github 上添加项目描述一样,我一直想写一些看起来像工具的东西,在我观看有关该项目的纪录片后,这种情况才有所增加,我惊讶于开源世界如何能够有一些曲折,并且在需要时非常受欢迎。经过一周的大量头痛之后,我决定写这篇文章,以便未来想要这个挑战的疯狂程序员不会犯我犯过的同样的错误。

JavaScript 运行时

这个术语很容易误导那些不太了解该主题的人,因此需要一个好的定义:

Javascript 运行时是一种允许您在浏览器之外运行语言的工具

现在有 3 个流行的运行时:NodeJS、Deno (Node Killer) 和 Bun (Deno Killer),但它们基本上做同样的事情:它们允许您在浏览器之外使用 javascript 并使用其他库来创建新功能,这非常好,因为您可以使用它们中的任何一个来构建服务器、创建库甚至移动或终端应用程序。

Node 和 Deno 都是由同一个人创建的:Ryan Dahl,早在 2009 年,他就创建了该工具,使开发人员能够创建“异步 IO”应用程序,也就是说,不会阻塞主线程,但仍会继续响应请求,考虑到这一点,他创建了 Libuv,一个专门做这件事的库。在那之前,这个项目只是一大堆 C,如果他想让更多人使用这个工具,他需要一些更容易理解和使用的语言,巧合的是,谷歌同时推出了 V8,总的来说,这是一个超快速的 javascript 编译器,这使他将两者结合起来,从而创建了 Node.

一段时间后(更具体地说是 9 年),Ryan 离开了该项目并开始从事其他他认为更有趣的事情,这让他意识到一些可以在 Node 中修复的错误,但社区已经非常大了退一步是不可能的,所以,决心做得更好,他创建了 Deno,另一个承诺比 Node 优越得多的 IO 运行时,从今天(2024 年)开始,Deno 是 2.0 版本,非常好用。对于项目和社区来说都是稳定的。

这整个故事让更多的人加入了运行时社区,这也导致我们创建了 Bun,更好的是,我的和你的运行时!现在让我们开始正题吧。

编译V8

如前所述,V8 是 Node 引擎,因此我们必须实际下载它并手动编译它才能访问其库和标头。由于它是一个 Google 项目,他们有自己的下载和编译方法,因此为此我们必须遵循他们的手册:链接,只需复制和粘贴即可到达最终命令。

但是,我在这里犯了一个错误,花了三天时间我才意识到我做的一切都是错的。使用以下命令生成构建配置文件后:

tools/dev/v8gen.py x64.release
登录后复制
登录后复制

您需要非常小心out.gn/x64.release/文件夹中的args.gn文件,因为它包含ninja(编译工具)将用来生成库文件的构建配置,一些旧教程使用 v8_monolithic = true 参数,但在最近的版本中不再使用。根据这个 StackOverflow 评论,我们现在需要使用 is_component_build = true 参数来生成正确的文件并在编译文件时修改标志,这是一个非常愚蠢的事情,如果您不注意的话可能会浪费宝贵的时间。

正确放置其余标志后,我们只需要运行命令来编译项目

ninja -C out.gn/x64.release

同时,去吃点东西吧,因为 V8 是一个非常广泛的项目,有无数的测试,根据您的机器,这个过程很容易需要 1 小时或更长时间,所以让它运行并继续阅读。

控制台.log 在哪里?

编译完成后,您可以查看 v8/samples/hello-world.cc 并开始了解如何编译 javascript,但具体是以下几行:

v8::Local<v8::String> source =
          v8::String::NewFromUtf8Literal(isolate, "'Hello' + ', World!'");

// Compile the source code.
v8::Local<v8::Script> script =
          v8::Script::Compile(context, source).ToLocalChecked();
登录后复制
登录后复制

继续使用包含“Hello World”的字符串,创建函数、循环、条件,当您意识到如果包含经典的 console.log() 时,您将收到一个未定义的消息,这让您感到很困惑对我来说,我一直认为 console 对象是 V8 本身的一部分,但事实上 Node 本身包含它,并且浏览器将它作为 DOM 的一部分包含(2012 年的帖子说浏览器可能不支持 console.log),这意味着我们必须自己创建它。

你好世界!

为了能够创建我们自己的函数,我们首先需要了解 V8 适用于多个范围,其中之一是上下文,通过它,运行时知道在其中的位置以及如何单独执行脚本可能有一个全局对象在所有其他对象之间共享,我们将在其中插入自定义函数。

tools/dev/v8gen.py x64.release
登录后复制
登录后复制

通过这些行,我们能够创建一个名为 global 的对象,我们插入了一个“打印”函数模板,该模板在执行时调用 Print 函数。

v8::Local<v8::String> source =
          v8::String::NewFromUtf8Literal(isolate, "'Hello' + ', World!'");

// Compile the source code.
v8::Local<v8::Script> script =
          v8::Script::Compile(context, source).ToLocalChecked();
登录后复制
登录后复制

Print 函数接收这个疯狂的参数,其中包含有关 javascript 中函数调用的信息,通过它,我们迭代其中的所有项目,将它们转换为 C 字符串并将它们打印在屏幕上,非常直接,非常简单,它完成了它的作用,这足以将它放入一个文件中,读取它并在 V8 上播放它(我把那个留在你手中)。

v8::Local<v8::ObjectTemplate> global = v8::ObjectTemplate::New(GetIsolate());
global->Set(GetIsolate(), "print", v8::FunctionTemplate::New(GetIsolate(), this->Print));
v8::Local<v8::Context> context = v8::Context::New(GetIsolate(), nullptr, global);
登录后复制

利布夫

好吧,我希望到目前为止您已经能够跟上,甚至已经停止阅读来为您的自制 Node 进行一些独特的实现,但是 V8 只会带我们到目前为止,以便我们能够更接近专业运行时我们需要让 javascript 能够执行更多操作,为此我们将使用 Libuv,它正是为此创建的。

您可以在这里找到安装和编译的教程。这里需要注意的重要一点是,它使我们可以自由地执行异步操作,即不阻塞主线程,从而允许程序在执行较繁重的工作(例如打开文件或等待服务器中的请求)时继续执行插座)。

它本身已经内置了创建 http 服务器的功能,因此我们只需将其与 V8 调用同步即可。毫无疑问,这不是一件容易的事,因为这两个库的接口有很大不同,因此很难将两者连接起来,但总有一种方法,并且节点源代码是开放的,因此请务必从其中窃取一些想法那里

结论

我们已经到了另一篇文章的结尾,我们通过它来看看我在实现过程中注意到的一些细节。首先肯定是复杂性,当然,这不是一个简单的项目,但是一旦你了解了如何与 V8 界面交互,事情就会进展得很快。

这个项目也让我更好地理解了 Node。事实上,运行时只是库通信的集合体,这使得理解更复杂的事物(如“事件循环”)如何工作变得非常容易。

如果你想看看我做对了什么,或者可能做错了什么,请看一下 github 上的项目:done

空谈很便宜,给我看看代码 - Linus Torvalds

## 参考文献

https://github.com/libuv/libuv
https://v8.dev/docs
https://stackoverflow.com/questions/71213580/cant-get-v8-monolith-to-genorate
https://github.com/ErickWendel/myownnode
https://github.com/WasixXD/done

以上是创建运行时的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

热门话题

Java教程
1662
14
CakePHP 教程
1419
52
Laravel 教程
1311
25
PHP教程
1262
29
C# 教程
1235
24
神秘的JavaScript:它的作用以及为什么重要 神秘的JavaScript:它的作用以及为什么重要 Apr 09, 2025 am 12:07 AM

JavaScript是现代Web开发的基石,它的主要功能包括事件驱动编程、动态内容生成和异步编程。1)事件驱动编程允许网页根据用户操作动态变化。2)动态内容生成使得页面内容可以根据条件调整。3)异步编程确保用户界面不被阻塞。JavaScript广泛应用于网页交互、单页面应用和服务器端开发,极大地提升了用户体验和跨平台开发的灵活性。

JavaScript的演变:当前的趋势和未来前景 JavaScript的演变:当前的趋势和未来前景 Apr 10, 2025 am 09:33 AM

JavaScript的最新趋势包括TypeScript的崛起、现代框架和库的流行以及WebAssembly的应用。未来前景涵盖更强大的类型系统、服务器端JavaScript的发展、人工智能和机器学习的扩展以及物联网和边缘计算的潜力。

JavaScript引擎:比较实施 JavaScript引擎:比较实施 Apr 13, 2025 am 12:05 AM

不同JavaScript引擎在解析和执行JavaScript代码时,效果会有所不同,因为每个引擎的实现原理和优化策略各有差异。1.词法分析:将源码转换为词法单元。2.语法分析:生成抽象语法树。3.优化和编译:通过JIT编译器生成机器码。4.执行:运行机器码。V8引擎通过即时编译和隐藏类优化,SpiderMonkey使用类型推断系统,导致在相同代码上的性能表现不同。

JavaScript:探索网络语言的多功能性 JavaScript:探索网络语言的多功能性 Apr 11, 2025 am 12:01 AM

JavaScript是现代Web开发的核心语言,因其多样性和灵活性而广泛应用。1)前端开发:通过DOM操作和现代框架(如React、Vue.js、Angular)构建动态网页和单页面应用。2)服务器端开发:Node.js利用非阻塞I/O模型处理高并发和实时应用。3)移动和桌面应用开发:通过ReactNative和Electron实现跨平台开发,提高开发效率。

Python vs. JavaScript:学习曲线和易用性 Python vs. JavaScript:学习曲线和易用性 Apr 16, 2025 am 12:12 AM

Python更适合初学者,学习曲线平缓,语法简洁;JavaScript适合前端开发,学习曲线较陡,语法灵活。1.Python语法直观,适用于数据科学和后端开发。2.JavaScript灵活,广泛用于前端和服务器端编程。

如何使用Next.js(前端集成)构建多租户SaaS应用程序 如何使用Next.js(前端集成)构建多租户SaaS应用程序 Apr 11, 2025 am 08:22 AM

本文展示了与许可证确保的后端的前端集成,并使用Next.js构建功能性Edtech SaaS应用程序。 前端获取用户权限以控制UI的可见性并确保API要求遵守角色库

从C/C到JavaScript:所有工作方式 从C/C到JavaScript:所有工作方式 Apr 14, 2025 am 12:05 AM

从C/C 转向JavaScript需要适应动态类型、垃圾回收和异步编程等特点。1)C/C 是静态类型语言,需手动管理内存,而JavaScript是动态类型,垃圾回收自动处理。2)C/C 需编译成机器码,JavaScript则为解释型语言。3)JavaScript引入闭包、原型链和Promise等概念,增强了灵活性和异步编程能力。

使用Next.js(后端集成)构建多租户SaaS应用程序 使用Next.js(后端集成)构建多租户SaaS应用程序 Apr 11, 2025 am 08:23 AM

我使用您的日常技术工具构建了功能性的多租户SaaS应用程序(一个Edtech应用程序),您可以做同样的事情。 首先,什么是多租户SaaS应用程序? 多租户SaaS应用程序可让您从唱歌中为多个客户提供服务

See all articles