runtime engine VM的一些随想

2023-10-29

这篇文章还是我在写作的新书《新时期的Node.js》入门的一部分

一些比喻

我们可以通过一些现实的比喻来理解接下来要讲述的概念。

苏联是社会主义的一种运行时

这大概是我这辈子能想到的最贴切的比喻了(笑),社会主义只是一种思想,可以看做是一门编程语言,而苏联为其提供了运行时环境,而俄罗斯就是其底层的硬件

斯大林模式是一种虚拟机

虽然它并不像java VM那样完美,斯大林模式屏蔽了底层的接口,使得社会主义可以移植到不同国家(操作系统)上

什么是Node

在讨论所有Node相关的问题之前,我们必须要明确一个问题,什么是Node?
这看起来是一个再简单不过问题,或许有人说Node就是用javascript实现的一门编程语言,这种说法其实是不准确的。

Node是一个javascript运行时(runtime)环境,所谓的runtime直译过来就是运行时组件,不过这种说法有些抽象了,读者可以将其想象成一种编程语言的运行环境。这个运行环境包括了编译器,操作系统的底层支持等等。
当我们在讨论一门编程语言时,语法本身并不重要,重要的是编译器(解释器)将如何对待这些语法,Node底层是用c语言和c++来实现的,如果创始人愿意,他完全可以将Node创造成一个新的java或者python,只要修改一下底层的实现就可以做到,不过名字大概就要改成Node.java或者Node.py了。

什么是编程语言

编程语言本身是一种抽象的规范,例如c++,真正的c++不存在与任何计算机上,它其实是厚厚的一摞文档,上面规定了每一个语言细节以及每一个有效输入对应的输出值。
开发者平时所使用的C++,其实是一种C++实现。

RunTime

关于运行时最出名的大概就是VC++了,微软出品的这套应用程序组件可以使开发者编写的c/c++语言程序在其中运行。VC++本身对C++还做了一些扩展,例如MFC。
VC++可以编译和执行用户编写的c语言代码,而开发者不考虑这背后到底是怎样实现的。那么一个功能完备,集成了编译和执行的C++编译器可以看做是一个运行时吗?笔者认为是可以的。

站在开发者的角度来说,一个x语言的runtime代表可以用x语言编写的代码在这个runtime上运行,那么将这个概念扩大一些,chrome也是一个javascript运行时,但它背后驱动runtime是靠javascript engine来进行的,二者之间的界限就有点暧昧了。
那么就有了新的问题,对于chrome来说,v8 engine算不算javascript runtime的一部分呢?
笔者认为是算的,runtime可以是多种多样的,对于chrome这一javascript runtime,v8是不可或缺的一部分,当然如果换成别的浏览器,engine就要变成spiderMonkey或者其他的engine了。

例如
Node实现了ECMAscript的语法规范,前面也说到了,当我们谈论一门语言,其实是在谈论它的编译器实现
例如下面的代码,我们无法分辨这是一段Node代码或是javascript代码,虽然他们都能产生相同的输出

var name = "Lear";
function greet(name){
    console.log("I am",name);
}

如果一门X语言实现了ECMAScript规定的语法,那么上面也可能是X语言的代码

Runtime Engine VM

在各种编程语言中经常可以看到上面三个名词的身影
Runtime 就像上面讲述的那样。
例如VC++就是c语言和c++的一个runtime,

VM
VM的概念比较广泛,通常可以认为是在硬件和二进制文件的中间层,
在C++中,编译好的二进制文件可以直接被操作系统调用,而在java中,编译好的字节码是交给虚拟机来运行的,这样的好处就是对开发者屏蔽了操作系统之间的差异,对于不同操作系统的处理交给了虚拟机来完成,从这个角度看来,vm是对不同计算机系统的一种抽象。

Engine
engine的概念其实十分模糊,它和runtime和VM的概念都用重叠之处,以V8为例,它可以看做是一个VM吗?
好像可以,因为它确实可以运行在不同操作系统下,而且确保用户编写的代码是平台无关的。
那它可以看做是一个runtime吗,好像也可以,这就需要读者自己把握了。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

runtime engine VM的一些随想 的相关文章

随机推荐

  • 拯救小鸡

    问题 B 拯救小鸡 时间限制 1 Sec 内存限制 128 MB 提交 91 解决 44 提交 状态 讨论版 题目描述 鸡国最近遇到了一件很棘手的事情 经常有一只老鹰想来抓小鸡 经鸡国情报员探查 这只老鹰打算共来袭击 n 次 第 i 次来的
  • Vue的概念

    一 vue的基本概念 Vue 读音是 vju 是一套用于构建用户界面的渐进式框架 自底层向上应用 Vue的核心库只关注视图层 容易入门 可以和第三方库或者已有的项目进行整合 可以做复杂的单页应用 简单的说 vue是一套前端的开发框架 vue
  • react-document-title单页应用改变title

    原文地址 在使用react框架开发单页应用时 通常会遇到页面跳转但不知要如何去改变document title页面标题的情况 react document title插件较为完美的帮助我们解决了这一问题 npm文档链接 官方介绍 react
  • OpenCV - 车牌识别新手入门级讲解

    目录 0 引言 1 MFC中的车牌显示 2 车牌定位 3 字符提取 4 文字识别 5 文字预测 0 引言 第一次使用OpenCV完成一个完整的功能 有所收获 特此记录 这篇博客中的车牌识别功能比较简单 只能识别一般的蓝色车牌 只能识别拍摄较
  • Python中数据处理(npz、npy、csv文件;元组、列表、numpy数组的使用)

    目录 1 npz文件 2 npy文件 3 csv文件 4 列表 元组 numpy矩阵 列表 元组 不可变列表 Numpy数组 Numpy矩阵 1 npz文件 npz是python的压缩文件 读取文件 独取文件 读取当前文件夹下的data的m
  • jdk11配置javafx

    下载javafx的jar包 网站 https openjfx io 进去之后直接点下载 下载对应操作系统的版本 这里下载windows系统的 下载完之后是一个压缩包文件 解压 刚开始写好之后是这样的 找不到javafx的类 接下来导入jar
  • [机器学习与scikit-learn-37]:算法-分类-支持向量机-核函数与线性不可分-原理

    作者主页 文火冰糖的硅基工坊 文火冰糖 王文兵 的博客 文火冰糖的硅基工坊 CSDN博客 本文网址 https blog csdn net HiWangWenBing article details 123804551 目录 前言 第1章
  • junit测试案例

    JUnit测试是以Java写成的 使用Java测试Java软件形成一个介于测试及程序代码间的无缝 seamless 边界 在测试的控制下测试变成整个软件的扩充同时程序代码可以被重整 Java编译器的单元测试静态语法检查可已帮助测试程序并且确
  • TCP的三次握手与四次挥手理解及面试题

    序列号seq 占4个字节 用来标记数据段的顺序 TCP把连接中发送的所有数据字节都编上一个序号 第一个字节的编号由本地随机产生 给字节编上序号后 就给每一个报文段指派一个序号 序列号seq就是这个报文段中的第一个字节的数据编号 确认号ack
  • LeetCode: 91 解码方法

    方法一 用递归来做 这道题一开始以为是简单的递归问题 按照从前往后的顺序递归 总是在 10 这个输入上报错 按照从后向前的方法递归 应对短序列没有问题 但是面对长序列 因为存在大量重复计算 所以超时 如果用递归来做 应该用记忆化递归 cla
  • 【linux操作系统】——页表的深入理解

    作者 努力学习的少年 个人简介 双非大二 一个正在自学c 和linux操作系统 写博客是总结知识 方便复习 目标 进大厂 如果你觉得文章可以的话 麻烦你给我点个赞和关注 感谢你的关注 在每一个进程中 每个进程都有自己的虚拟内存空间 该内存空
  • 【SpringBoot】yml配置时区的配置项

    时区参数定义yml文件 environment TZ Asia Shanghai services systemManage image ports 8082 8082 environment spring profiles active
  • git回滚reset到指定分支

    在git中我们经常会遇到提交代码之后需要进行回滚的操作 可以通过git reset 命令进行回滚 首先找到需要回滚到的提交的commit id 然后通过 git reset hard 老的commit id 然后更新当前分支到最新提交 gi
  • 16 单台与多台机器配置https证书、全站https(以discuzx为例)

    HTTPS 1 HTTPS基本概述 为什么需要使用HTTPS 因为HTTP不安全 当我们使用http网站时 会遭到劫持和篡改 如果采用https协议 那么数据在传输过程中是加密的 所以黑客无法窃取或者篡改数据报文信息 同时也避免网站传输时信
  • angularJS1笔记-(1)-多控制器

    前端写好 div div div div
  • ubuntu安装lxml

    ubuntu安装lxml 可以参考一下 先执行 sudo apt get install libxml2 dev libxslt dev python dev 然后执行 sudo easy install lxml
  • 用户态、内核态的基本概念及切换方式

    用户态 内核态 一 用户态 内核态的基本概念 二 用户态 内核态的切换方式 一 用户态 内核态的基本概念 用户态 用户态运行的进程可以直接读取用户程序的数据 内核态 内核态运行的进程或程序几乎可以访问计算机的任何资源 不受限制 两者最重要的
  • MySQL8.0.15重置密码 windows10 64位 (忘记密码或者无法登录)

    经过多次试验最终 重置密码的步骤如下 1 以管理员身份 打开命令窗口cmd 输入命令 net stop mysql 停止MySQL服务 2 开启跳过密码验证登录的MySQL服务 输入命令 mysqld console skip grant
  • Linux Ubuntu 设置脚本开机启动

    主要参考下面这个博客 ubuntu18开机启动脚本 但是要注意 有的ubuntu里面并不存在这个目录 在一开始的 vim etc systemd system rc local service 这一步就会失败 比如我的系统 最后我使用fin
  • runtime engine VM的一些随想

    这篇文章还是我在写作的新书 新时期的Node js 入门的一部分 一些比喻 我们可以通过一些现实的比喻来理解接下来要讲述的概念 苏联是社会主义的一种运行时 这大概是我这辈子能想到的最贴切的比喻了 笑 社会主义只是一种思想 可以看做是一门编程