Python番外篇之责任转移:有关于虚拟机编程语言的往事

编程之痛

如果,你像笔者一样,有过学习或者使用汇编语言与C、C++等语言的经历,一定对下面所说的痛苦感同身受。

汇编语言

将以二进制表示的一条条CPU的机器指令,以人类可读的方式进行表示。虽然,人类可读了,但是太底层了,要实现一个简单的需求,都要堆砌很多个指令,很繁琐,编程起来很痛苦。
只是人类可读,显然不够,因为可读的层级太底层。真正写出来的汇编程序,写起来费劲,读起来更费劲……
此外,可扩展、可移植,更是想都不用想了,也很困难。毕竟,是对照机器指令逐一映射的。

C/C++

以C/C++为代表的这些高级语言,帮我们从一条条机器指令中解放出来,人类可读的层级被拔高了一些,写起来、读起来也更加容易了。其实,Java、Python等语言,在读、写代码方面,跟C/C++没有太多的本质区别。
毕竟,任何一个编程语言需要具备的核心是相通的:数据的表达和数据的处理,仅此而已。只是,不同语言的方式不同,无明显高下之分,各有千秋。
关于最好的编程语言的论战,其实,见仁见智,更多的是对编程语言设计背后思想的认同与否。所以,当听到别人说PHP是最好的编程语言,我们不应该一上来就跳起来反驳。我们也不应该随便地说出,Python是最好的编程语言,而应该更加客观、理性的说,“Python的设计理念、思想跟我比较契合,我用起来特别舒服”,虽然说是理性、客观,其实,那还是一种感觉。
从直觉上来说,有些人不太喜欢使用C/C++,大概有以下两点:
1、开发者要担起自己的责任,内存管理,自己申请,自己释放,不要期待别人给你擦屁股;
2、可迁移性差,从整个生态来看,扩展性不及Python或者Java。
我也是出于以上两点,对C/C++有些仰视、畏惧的心理。

虚拟机的出现

责任转移:从能用到好用

一个产品好用还是不好用,其实最本质的在于,产品设计者关于各种事项的责任范围界定的问题。
如果实现同样的需求,基于产品A,用户只需要点一下按钮就可以了;基于产品B,用户需要先填入一堆表单,然后点按钮,又反复调整错误的录入,最后才能提交。对比一下,显然A更好用,B只是能用。
一个产品从能用不断迭代到好用的过程,其实就是把本来界定为是用户自己的责任范围,不断缩小再缩小,产品自身需要承担的责任不断扩大再扩大。

虚拟机:编程语言设计中的责任转移

编程语言的好用与否,也是如此。这里,需要再次强调一下,还是设计思想上的认同与否,见仁见智。

如果有的用户觉得内存管理,由自己来管理太痛苦、太麻烦;
如果有的用户觉得每次都要自己处理不同平台的移植的问题,也太痛苦、太麻烦。

将这些本由用户自行承担的责任,由编程语言来承接,用户只需要考虑写代码实现需求就好了。

自然而然就诞生了虚拟机的设计,比如Java虚拟机、Python虚拟机等。
由对应的虚拟机来帮助用户进行内存的申请、垃圾回收,帮助用户屏蔽硬件的差异。

Java语言在早期推广的时候,就以"Write Once, Run Everywhere"为其宣传的重要特性。

虚拟机要帮助开发者实现对硬件差异的屏蔽,自然是责任转移思想的体现;而如何才能实现对硬件差异的屏蔽,则是类比、封装的进一步应用。

如同计算机操作系统屏蔽用户对硬件的感知一样,如同汇编语言对机器指令的屏蔽一样。虚拟机的设计上,是对汇编指令、对操作系统差异的进一步屏蔽。

一般虚拟机都会提供一套统一的字节码指令,其设计上,类似于汇编指令,人类可读。不同于汇编指令的硬件相关性,字节码指令是统一的,只有一套,跟硬件、操作系统无关。

责任转移的思想是转移,而不是消失。一件事情A不做了,自然有B来把它做了。

用户编写的高级语言代码,被编译成统一的字节码指令的表示。虚拟机负责将这些字节码表示,翻译为对应的硬件相关的机器指令,然后交给特定的硬件执行。

所以,Write Once, Run Everywhere的背后,是不同操作系统、硬件平台上的虚拟机的不同实现,在默默负重前行。

一切都是Trade Off

虚拟机等责任转移所带来的便捷性,其背后是对一部分灵活性的放弃。
如果,你在自己管理内存的痛苦中苦苦挣扎,虚拟机类的Python、Java,对你来说也许是一个更好的选择;
如果,你总是要考虑跨平台移植的兼容性,虚拟机类的Python、Java,对你来说也许是一个更好的选择。
但是,如果你很享受自己管理内存使用的自由,你很享受跨平台移植的挑战,虚拟机显然不合你的胃口。

进一步抽象封装的背后,是对一部分性能的放弃。
从直接编译为机器指令然后执行,变成了编译为字节码指令,然后由虚拟机解释为机器指令,然后才能执行。
处理环节的增加,必然带来性能上的影响。

世间安得双全法。
资源、场景约束下,选择什么,放弃什么,一切都是在不断权衡、取舍。
不好的一定会不断被更好的所取代,但是,从来就没有最好的,只有在特定场景、特定需求下的更好的,最适合的才是更好的。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

thinksboard新建table表格

html文件 <div fxFlex fxLayoutAlign"left top" style"display: block"> <!-- <mat-card appearance"raised" style"max-height: 80vh; overflow-y: auto;">--><div><button mat-raised-button (click)&…

数据结构(JAVA)—代码题

01-数据结构—判断题 02-数据结构—选择题 03 数据结构—多选填空程序填空 ​ 01-顺序表的建立及遍历 import java.util.Iterator; import java.util.LinkedList; import java.util.ListIterator; import java.util.Scanner;public class Main {public static void main(St…

告别熬夜改稿:AI降重工具让论文降重变得轻松又有趣

已经天临五年了&#xff0c;大学生们还在为论文降重烦恼……手动降重确实是个难题&#xff0c;必须要先付点小经费去靠谱的网站查重&#xff0c;再对着红字标注去改&#xff0c;后面每一次的论文呢查重结果都像赌//博&#xff0c;谁也不知道明明是同一篇文章&#xff0c;第二次…

【C语言】union 关键字

在C语言中&#xff0c;union关键字用于定义联合体。联合体是一种特殊的数据结构&#xff0c;它允许不同的数据类型共享同一段内存。所有联合体成员共享同一个内存位置&#xff0c;因此联合体的大小取决于其最大成员的大小。 定义和使用联合体 基本定义 定义一个联合体类型时…

【MySQL】MySQL锁冲突排障纪要

【MySQL】MySQL锁冲突排障纪要 开篇词&#xff1a;干货篇&#xff1a;1.查看当前innodb status,里面包含事务,锁占用情况2.查看mysql进程状态3.查看innodb事务&#xff0c;锁&#xff0c;锁等待情况4.定位持有锁的线程信息 总结篇&#xff1a;一、锁冲突的原因二、锁冲突的表现…

【Python】列表

目录 一、列表的概念 二、列表的创建 1.变量名 [ ] ..... 2.通过Python内置 的I ist类的构造函数来创建列表 三、操作列表元素的方法 1. 修改 2. 增加元素 3. 删除 4. 其他操作 四、遍历列表 五、列表排序 六、列表切片&#xff08;list slicing&#xff09; 七、…

Python入门 2024/7/2

目录 格式化的精度控制 字符串格式化 对表达式进行格式化 小练习&#xff08;股票计算小程序&#xff09; 数据输入 布尔类型和比较运算符 if语句 小练习&#xff08;成人判断&#xff09; if-else语句 if-elif-else语句 练习&#xff1a;猜猜心里数字 嵌套语句 猜…

JavaScript中的Array(数组)对象

目录 一、Array数组对象 1、介绍 2、创建数组对象并赋值 3、访问数组元素 二、Array对象属性 1、constructor属性 2、length属性 3、prototype属性 三、Array对象的常用方法 1、isArray() 2、concat() 3、pop() 4、shift() 5、push() 6、unshift() 7、reverse(…

前端进阶:Vue.js

目录 框架&#xff1a; 助解&#xff1a; 框架&#xff1a; VUE 什么是Vue.js? Vue.js优点 Vue安装 方式一&#xff1a;直接用<script>引入 方式二&#xff1a;命令行工具 第一个Vue程序 代码 代码解释&#xff1a; 运行 Vue指令 v-text v-html v-tex…

git 中有关 old mode 100644、new mode 10075的问题解决小结

问题&#xff1a; 同一个文件被修改后&#xff0c;最后代码没有变&#xff08;代码刚开始修改了&#xff0c;最后又删除还原了&#xff09;&#xff0c;文件变了&#xff0c;导致提交了一个空文件 git diff 提示 filemode 发生改变&#xff08;old mode 100644、new mode 1007…

RabbitMQ进阶篇

文章目录 发送者的可靠性生产者重试机制实现生产者确认 MQ的可靠性数据持久化交换机持久化队列持久化消息持久化 Lazy Queue(可配置~)控制台配置Lazy模式代码配置Lazy模式更新已有队列为lazy模式 消费者的可靠性消费者确认机制失败重试机制失败处理策略 业务幂等性唯一消息ID业…

layui-页面布局

1.布局容器 分为固定和完整宽度 class layui-container 是固定宽度 layui-fluid是完整宽度

傻瓜交换机多网段互通组网、设备无法配置网关案例

记录一下&#xff1a; 一、傻瓜交换机多网段互通组网 1、客户在核心交换机上创建了VLAN10&#xff0c;VLAN20。 VLAN10&#xff1a;IP192.168.10.254 VLAN20&#xff1a;IP192.168.20.254 在核心交换机下挂了一台傻瓜交换机&#xff0c;傻瓜交换机接入了一台OA服务器IP&#…

从零开始:在Windows上部署大型模型

这是一个超详细安装教程&#xff0c;介绍了在 Window 电脑上如何部署 Qwen1.5 大模型。本文还涉及到 Python 及其环境的配置。 适合对象&#xff1a;有点后端编程基础&#xff0c;没有 Python 基础。 需要环境&#xff1a;Window10/11&#xff0c;支持 Cuda 的 Nvidia 显卡。…

数据结构与算法-动态规划-最长回文子串

最长回文子串 给你一个字符串 s&#xff0c;找到 s 中最长的回文子串。 示例 1&#xff1a; 输入&#xff1a;s "babad" 输出&#xff1a;"bab" 解释&#xff1a;"aba" 同样是符合题意的答案。示例 2&#xff1a; 输入&#xff1a;s "…

识图ACWP.BCWS.BCWP

将三个概念想象成三个角色&#xff08;如&#xff1a;勇士、法师、盗贼&#xff09;&#xff0c;其中&#xff1a; ACWP是勇士&#xff0c;代表实际力量&#xff08;实际成本&#xff09;&#xff1b;BCWS是法师&#xff0c;代表预期魔法&#xff08;预算成本工作量预测&#x…

vscode移动侧边栏到右边

vscode移动侧边栏到右边&#xff0c;的简单办法 直接在侧栏上单击右键&#xff0c;选择向右移动主侧栏

有哪些好的 Stable Diffusion 提示词(Prompt)可以参考?

Docker 作图咒语生成器 docker-prompt-generator 是一个开源项目&#xff0c;可以利用模型反推出提示词&#xff0c;让你偷偷懒&#xff0c;无需琢磨怎么写prompt&#xff0c;只需要找一个差不多的模型反推一下&#xff0c;直接用就好了&#xff0c;支持支持 MidJourney、Stab…

Go - 9.struct 使用指南

目录 一.引言 二.struct 定义 三.struct 实践 1. 初始化 struct 2. 嵌套 struct 3. func 与 struct 四.struct 进阶 1.Json Tags 2.Other Tags 五.总结 一.引言 在编程中&#xff0c;结构体&#xff08;struct&#xff09;是一种聚合数据类型&#xff0c;用于将多个…