JavaScript 与 C++ 的差异

news2024/11/25 22:41:59

在正式开始向各位前端开发者介绍 C++ 语言之前,我们先讨论一下 C++ 语言与 JavaScript 语言的差异(为了约束讨论的范围,这里就不提 HTML 和 CSS 了)。

C++ 语言于 1979 年由贝尔实验室的 Bjarne Stroustrup(本贾尼·斯特劳斯特卢普)研发,1983 年正式命名为 C++。而 JavaScript 于 1995 年由网景公司的 Brendan Eich(布兰登·艾克)研发。可以说,这两门语言都经历了时间的检验,各自拥有大量的拥趸,也都形成了独立的社区和生态

本来两门语言各有各的战场,并没什么交集,但自从 Node.js 框架出现之后,JavaScript 就摆脱了浏览器的樊笼,开始渗透进入系统应用的领域;WebAssembly 技术出现之后,C++ 也有了进入 Web 领域的渠道了(不谈原生浏览器插件),所以,现在越来越多的开发者开始同时关注这两门语言。

当你深入了解之后,你就会发现这两门语言差异非常之大。接下来我们就介绍一下它们的差异,让各位前端开发者对 C++ 语言有一个初步的认识。

运行环境的差异

  • C++ 属于编译型语言编译型语言就是指那些要事先把源代码编译成机器代码才能在目标机器上运行的语言。

  • JavaScript 语言则属于解释型语言解释型语言是指那些可以直接在目标机器的解释器里运行的语言。

也就是说,如果我们用 C++ 语言开发了一个可执行程序,那么这个程序可以在指定的机器上,不依赖任何其他程序运行。这里说的指定的机器,是编译 C++ 代码时指定的(比如编译 C++ 代码时要指定 x86 架构或 Arm 架构)。如下图所示:

JavaScript 语言则不同,开发者开发的 JavaScript 代码可以在任何机器的 JavaScript 解释器里运行。也就是说 JavaScript 运行时是要依赖解释器的,Node.js 或者 Chrome 浏览器都内置了 JavaScript 解释器(也就是 V8 引擎)。如下图所示:

V8 引擎内部还有即时编译器,并不是一个简简单单的 JavaScript 解释器,但本小册不讨论 JavaScript 解释引擎的 JIT 能力。Webpack 或 Rollup 等工具并没有编译 JavaScript 代码,它们只完成了 JavaScript 代码的捆扎和压缩工作。

C++ 的编译器里包含预处理器、链接器等工作部件,并不是一步到位就能把 C++ 代码变成二进制可执行程序的。另外,还有一些语言会先编译成字节码,再通过运行时环境执行字节码,比如 C# 或 Java 就是这类语言。这些内容都超出了本小册所讨论的范畴,不再深入介绍。

这两种语言运行在不同的环境中,可以说从根源上就是不一样的。

前端开发者的现代 C++ 课 - 刘晓伦liulun - 掘金小册专门为前端开发者“定制”的现代 C++ 编程指南。「前端开发者的现代 C++ 课」由刘晓伦liulun撰写,490人购买https://s.juejin.cn/ds/kUo6RHC/

执行效率的差异

我们知道 C++ 开发的程序不依赖任何解释器,可以直接访问操作系统 API ,控制目标机器的内存和 CPU 。而 JavaScript 开发的程序要先经过解释器解释,再通过解释器访问操作系统的 API ,控制目标机器的内存和 CPU 。完成相同的任务 C++ 非常直接,而 JavaScript 则要绕很大一段路,这是 JavaScript 性能表现不及 C++ 的原因之一

我们可以说 JavaScript 解释器就是 JavaScript 的“保姆”,它负责看护着 JavaScript 的运行,由于有这么个“保姆”的存在,所以 JavaScript 语言设计得非常灵活。比如,JavaScript 开发者完全不用担心垃圾收集的问题(变量超出作用域之后,它占用的内存该如何释放),“保姆”会帮开发者完成这项任务。

然而“保姆”在做垃圾收集工作时非常拖沓(递归查找未被引用的变量),而且不一定在最合适的时机完成任务(新生代内存快满时才有可能执行垃圾收集),类似这样的事还有很多,比如字符串操作、容器管控等,JavaScript 程序员都没办法深入底层控制细节,这是 JavaScript 性能表现不及 C++ 的原因之二

关于字符串的处理,Chromium 的开发者曾说,网页操作字符串的调用次数占内存管理器调用总次数的一半以上,相信这些字符串操作有很大一部分都是由 JavaScript 造成的。

另外,JavaScript 的设计者把 JavaScript 设计成单线程执行的语言(尽管各个 JS 运行环境都提供了多线程机制,比如:Web Worker 和 Worker thread,但这并不意味着 JavaScript 本身拥有多线程的能力),当 JavaScript 完成大量计算工作的任务时,比如编解码、大数据格式化等,JavaScript 的运行线程就会被阻塞,无法再处理其他任务了,只有当前任务执行完成之后,才能再继续执行挂起的任务。而 C++ 则没有这方面的限制,开发者可以很从容地使用多线程技术完成并行任务的处理逻辑。这是 JavaScript 性能表现不及 C++ 的原因之三

类似的原因还有很多,但更多的时候一个应用程序性能的优劣还是取决于开发者的编码水平,C++ 表现再好,开发者能力不足,也会写出性能表现差劲的应用程序。

编程风格的差异

一开始 C++ 语言只是 C 语言的增强版,C++ 语言最初的名字就是 C With Classes,顾名思义就是具备类型特性的 C 语言。后来经过长时间的发展,C++ 变成了一个支持多种语言范式的编程语言,它同时支持过程范式、面向对象范式、函数范式、泛型范式、元编程范式等编程范式。所以,开发者可以使用不同的编程风格用 C++ 开发应用程序。

JavaScript 的发展路线则非常简单,很长时间以来 JavaScript 都是以函数式编程范式为主,JavaScript Class 关键字出现之前,想要使用 JavaScript 封装对象还要使用如下这样蹩脚的方法:

function Person(name) {
  this.name = name;
  this.run = () => {
    console.log(`${this.name} run`);
  };
}
let person = new Person("allen");
person.run();

自从 JavaScript 引入了 class 、extends 等关键字之后,再加上 TypeScript 语言的帮助,它在面向对象领域的发展越来越好,目前 JavaScript 语言开发者主要使用函数泛式和面向对象泛式开发应用程序。

另外,C++ 在创建一份数据(变量、参数、返回值等)时,需要显式指明该数据的类型。通常情况下(未经类型转换操作),这些数据的类型一旦被定义,那么它永远就是该数据类型,在程序的整个生命周期也不再改变。因此,我们说 C++ 是强类型的语言

JavaScript 在创建一份数据时并不强制定义数据的类型,数据的类型也会随着环境的改变而改变,给数据赋予不同的值,数据将得到不同的类型。不需要经过明确的类型转换操作。因此,我们说 JavaScript 是弱类型的语言

除此之外,C++ 语言细节特别多,JavaScript 则比较少,虽然两门语言都支持面向对象编程范式和函数式编程范式,但在这两个方向上 C++ 的语法细节比 JavaScript 语法细节多了一倍恐怕还不止,这也是社区里抱怨 C++ 难学、学习曲线陡峭、坑多的原因之一。

C++ 的长处更多在于它对许多问题都是很好的解决途径,而不在于它对某个特定问题是最好的解决途径。C++ 最有实力的地方并不是它的某个独到之处特别伟大,而在于它在事物的大范围变化中的表现都很不错。

除了这些风格上的差异之外,JavaScript 与 C++ 还有很多差异,我们将在后续的章节中细细介绍。

程序能力的差异

由于 JavaScript 是在解释器内执行的,所以解释器提供了什么能力,JavaScript 就拥有什么能力。比如:JavaScript 在浏览器内可以通过 WebGPU 访问 GPU 硬件,但无法访问客户端的文件系统。

JavaScript 在 Node.js 环境下可以通过 Node.js 内置的 fs 模块访问客户端的文件系统,却没办法直接访问 GPU 硬件。无论 JavaScript 在浏览器中运行,还是在 Node.js 环境中运行,都没办法直接创建操作系统服务。

除此之外,不同的解释器解释 JavaScript 的方式也不一样,同样的代码在不同的解释器环境中可能拥有不同的能力表现,这种现象在浏览器发展的早期,标准尚未确定时非常常见。

C++ 则不同,C++ 编译后的程序是二进制的,可以直接在操作系统上运行的,并不像 JavaScript 一样受制于解释器,也就是说客户端操作系统提供了什么 API 它就拥有什么能力。无论是访问文件系统,还是访问设备硬件,都没有任何阻碍。

另外在一些嵌入式设备上,内存和 CPU 硬件资源有限,JavaScript 语言在这类设备上运行会显得力不从心,毕竟 JavaScript 内存占用较高,执行效率较差,C++ 语言则可以在这类设备上表现得很好。

总结

本章我们介绍了 JavaScript 和 C++ 两门编程语言的主要差异,包括运行环境的差异、执行效率的差异、编程风格的差异和程序能力的差异等知识。除了上文中介绍的这些差异之外,它们还在开发效率上存在差异(JavaScript 的开发效率要远高于 C++ 的开发效率),社区及生态上存在差异等。

不过相信各位前端开发者已经对 C++ 语言有了一个粗浅的认识,虽然 C++ 语言比 JavaScript 要难学,但 C++ 带给你的回报也是足够大的,它能拓展你的能力边界,开拓你的技术视野,为你创造更具市场竞争力的软件产品保驾护航,也会提升你在行业中的核心竞争力。总之,相对于其他编程语言来说,C++ 语言是前端开发者很值得投入时间和精力学习的编程语言

前端开发者的现代 C++ 课 - 刘晓伦liulun - 掘金小册专门为前端开发者“定制”的现代 C++ 编程指南。「前端开发者的现代 C++ 课」由刘晓伦liulun撰写,490人购买https://s.juejin.cn/ds/kUo6RHC/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/154067.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【web安全】——HTTP请求头注入

作者名:Demo不是emo主页面链接: 主页传送门创作初心: 舞台再大,你不上台,永远是观众,没人会关心你努不努力,摔的痛不痛,他们只会看你最后站在什么位置,然后羡慕或鄙夷座右…

uni-app开发常用点

前言 应该会不定时更新,主要记录自己在uni-app开发过程中经常用到的东西。 组件库推荐: 1、https://v1.uviewui.com/ 我们老项目用到是这个的1.x版本,新版本没用过 2、https://vant-contrib.gitee.io/vant/v2/#/zh-CN/ 3、https://uniapp.d…

智能在线客服系统源码 国际版多语言多商户智能机器人源码

一套智能在线客服系统源码 多商户网页客服系统源码 支持二十种国际语言 带机器人自动回复。 框架:Thinkphp5workerman, 环境:nginxphp7.3mysql5.6 支持H5公众号APP小程序 私信了解更多源码内容! 系统功能特点: 1、…

k8s创建数据库

参考配置1 [rootk8s-master1 ~]# cat deployment.yaml apiVersion: apps/v1 kind: Deployment metadata:labels:app: mysql #为该Deployment设置key为app,value为mysql的标签name: mysqlnamespace: test spec:replicas: 1 #副本数量selector: #标签选择器&#xf…

深挖你拥有的东西的背后的价值到底是什么,价值转换模型分析。

深挖你拥有的东西的背后的价值到底是什么。 我们先把它转换成为观众观看这条视频的动机,甚至是观众关注账号的动机。 例如你能帮助别人赚钱,你能帮助别人变美。你提供的价值是成长的价值,你提供的价值是精神追求的价值,是生活理念…

【ROS】—— ROS常用组件—rosbag与rqt工具箱(十二)

文章目录前言1. rosbag1.1 rosbag使用_命令行2. rosbag使用_编码2.1 C实现2.1.1 写bag2.1.2 读bag2.2 python实现2.2.1 写bag2.2.2 读bag3. rqt工具箱3.1 rqt安装启动与基本使用3.2 rqt常用插件:rqt_graph3.3 rqt常用插件:rqt_console3.4 rqt常用插件:rqt_plot3.5 rqt常用插件:…

python算法与数据结构2-栈、队列、排序算法

目录1、栈1.1 栈的介绍1.2 栈的代码实现2、队列2.1 队列的介绍2.2 队列的代码实现3、双端队列4、数据结构与算法_排序算法4.1 排序算法的稳定性4.2 冒泡排序4.3 选择排序4.4 插入排序4.5 快速排序1、栈 1.1 栈的介绍 栈:运算受限的线性表,其限制是仅允…

黑盒测试用例设计 - 功能图法

目录功能图法原理介绍功能图法步骤案例:以QQ登录界面为例功能图法原理介绍 功能图方法其实是一种灰盒测试(因其兼有黑盒和白盒测试)用例设计方法;通常情况一个程序的功能说明通常由动态说明和静态说明组成,动态说明描…

UG/NX 二次开发(C#)自动出2D零件图思路

一、前言 项目需要自动出2D零件图,可是我之前没做过这方面的内容,没有一点思路。然后我就做了下面几件事: 1、百度、google翻了一遍,搜索关键字“UG二次开发自动出图” 2、csdn.com 和 cnblogs.com翻了一遍 3、平时逛的qq技术…

数字图像处理(第四版)-冈萨雷斯-学习过程的笔记

作者介绍1.绪论自己读书存在一个问题,书太厚,重点难以把握,对如此经典的书籍,希望自己的学习历程和重点记录下来。 目前在持续更新和学习中,觉得有帮助的话可以先收藏和关注我博客的内容--更新于2023/1/102.数字图像基…

C语言进阶——自定义类型——结构体

目录 一. 结构体类型的声明 结构体的声明 特殊的声明 二. 结构的自引用 三. 结构体变量的定义和初始化 定义 初始化 四. 结构体内存对齐 未完待续 一. 结构体类型的声明 结构体的声明 结构是一些值的集合,这些值称为成员变量。结构的每个成员可以…

08-Alibaba微服务组件Nacos配置中心实战源码分析

Nacos配置中心源码分析 Config相关配置 Nacos 数据模型 Key 由三元组唯一确定, Namespace默认是空串,公共命名空间(public),分组默认是DEFAULT_GROUP 配置中心的架构 nacos config client源码分析 获取配置 获取配置的主要方…

windows配置java环境

windows配置java环境下载JDK安装JDK配置环境变量java9及以上版本配置环境变量(以java17为例,只需要配置JAVA_HOME和Path变量)配置JAVA_HOME变量配置Path变量java8及以下版本配置环境变量(以java8为例,需要配置JAVA_HOM…

Unity官方本地化插件localization

官方文档地址:https://docs.unity3d.com/Packages/com.unity.localization1.0/manual/QuickStartGuideWithVariants.html 使用流程 安装 PackageManager搜索Localization完成对应插件的安装 配置 PlayerSetting->Localization 创建本地化相关配置 创建之后点…

python的安装以及pycharm的配置

大家好,我是csdn的博主:lqj_本人 这是我的个人博客主页:lqj_本人的博客_CSDN博客-微信小程序,html特效,vue2基础领域博主 哔哩哔哩欢迎关注:小淼前端 小淼前端的个人空间_哔哩哔哩_bilibili 本篇文章主要讲述python的安装以及pych…

【Linux】小程序进度条

目录回车换行问题日常中的换行代码中的回车换行倒计时函数进度条回车换行问题 日常中的换行 即: 回车:回到当前行的最开始 换行:列不变,新起一行 代码中的回车换行 我们先看一段代码: 这个是带\n的 🌍结…

什么是运动神经元 你们真的知道吗

大家好,你们知道什么运动神经元吗,你们有误入这些误区吗? 运动神经元是一种神秘的疾病,导致的原因尚且不明确。这种疾病的发生可能是体内的运动神经元细胞的减少或是凋亡导致的,是一种慢性发展的神经类疾病。虽然导致运…

【晶振】NTP网络校时服务器(卫星时钟)电路里的主心跳

【晶振】NTP网络校时服务器(卫星时钟)电路里的主心跳 【晶振】NTP网络校时服务器(卫星时钟)电路里的主心跳 晶振是NTP网络校时服务器(卫星时钟)电路板数字电路的"心跳",在…

阿狸(Hans设计卡通形象)的幸福生活 ---- 充满趣味性(可自定义更改)

Ali the fox 目录 一、前言 二、关于代码 三、效果展示 四、详细介绍 五、编码实现 index.html css 文件夹 88rh.css js 文件夹 img 文件夹 fonts 文件夹 六、获取源码 需要源码,可以私信我(⊙o⊙)?关注我? 一、前言 时光荏苒&…

MyBatis­Plus快速入门

介绍 MyBatisPlus(简称 MP)是一个 MyBatis的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。 特性: 无侵入:只做增强不做改变,引入它不会对现有工程产生影响&#xf…