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.mzph.cn/news/864497.shtml

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

相关文章

使用deep修改前端框架中的样式

目录 1.deep的作用 2.使用方式 3.特别说明 scoped 的实现原理: !important 1.deep的作用 /deep/、::v-deep 和 :deep 都是用于穿透组件作用域的选择器。它们的主要目的是允许开发者在父组件中直接选择并样式化子组件内部的元素,即使这些元素被封装在…

JVM原理(九):JVM虚拟机工具之可视化故障处理工具

1. JHSDB:基于服务性代理的调试工具 JHSDB是一款基于服务性代理实现的进程外调试工具。 服务性代理是HotSpot虚拟机中一组用于映射Java虚拟机运行信息的、主要基于Java语言实现的API集合。 2. JConsole:Java监视与管理控制台 JConsole是一款基于JMX的可视化监视、管理工具。…

千益畅行,旅游卡,如何赚钱?

​ 赚钱这件事情,只有自己努力执行才会有结果。生活中没有幸运二字,每个光鲜亮丽的背后,都是不为人知的付出! #旅游卡服务#

springboot拦截器,ThreadLocal(每个线程的公共区域)

拦截器 配置信息(拦截所有请求) 其实这种可以作为springAOP作日志记录

SpringCloud_Eureka注册中心

概述 Eureka是SpringCloud的注册中心。 是一款基于REST的服务治理框架,用于实现微服务架构中的服务发现和负载均衡。 在Eureka体系中,有两种角色: 服务提供者和服务消费者。 服务提供者将自己注册到Eureka服务器,服务消费者从Eureka服务器中…

软件著作权申请:保障开发者权益,促进软件创新

一、引言 在数字化时代,软件作为信息技术的核心,已成为推动社会进步和经济发展的重要力量。然而,随着软件产业的蓬勃发展,软件侵权和抄袭现象也日益严重。为了保护软件开发者的合法权益,促进软件产业的健康发展&#…

摄影后期色彩管理流程(Lightroom篇)

在摄影后期处理中,色彩管理是确保图像从捕捉到输出的一致性和准确性的关键。Lightroom 和 Photoshop 其实已经将这套色彩管理流程作为默认选项,如果实质操作时仍存在色彩偏差的问题,可参考以下内容。 ProPhoto RGB > Adobe RGB > sRGB …

linux 控制台非常好用的 PS1 设置

直接上代码 IP$(/sbin/ifconfig eth0 | awk /inet / {print $2}) export PS1"\[\e[35m\]^o^\[\e[0m\]$ \[\e[31m\]\t\[\e[0m\] [\[\e[36m\]\w\[\e[0m\]] \[\e[32m\]\u\[\e[0m\]\[\e[33m\]\[\e[0m\]\[\e[34m\]\h(\[\e[31m\]$IP\[\e[m\])\[\e[0m\]\n\[\e[35m\].O.\[\e[0m\]…

Golang内存分配

Go内存分配语雀笔记整理 Golang内存模型设计理念思考核心代码阅读mspanmcachemcentral中心缓存mheap分配过程 Golang内存模型设计理念思考 golang内存分配基于TCmalloc模型,它核心在于:空间换时间,一次缓存,多次复用;…

HarmonyOS开发探索:父子组件手势绑定问题处理

场景一:父子组件同时绑定手势的冲突处理 效果图 方案 在默认情况下,手势事件为非冒泡事件,当父子组件绑定相同的手势时,父子组件绑定的手势事件会发生竞争,最多只有一个组件的手势事件能够获得响应,默认子…

二、基础—常用数据结构:列表、元祖、集合、字典、函数等(爬虫及数据可视化)

二、基础—常用数据结构:列表、元祖、集合、字典、函数等(爬虫及数据可视化) 1,字符串2,最常用的是列表(重点掌握)3,元组4,字典(重要)5&#xff0…

【CSS in Depth 2 精译】2.3 告别像素思维

当前内容所在位置 第一章 层叠、优先级与继承第二章 相对单位 2.1 相对单位的威力 2.1.1 响应式设计的兴起 2.2 em 与 rem 2.2.1 使用 em 定义字号2.2.2 使用 rem 设置字号 2.3 告别像素思维 ✔️2.4 视口的相对单位2.5 无单位的数值与行高2.6 自定义属性2.7 本章小结 2.3 告别…

3D交互可视化编辑器求推荐,最好是针对企业级使用的?

企业级使用的3D交互可视化编辑器,支持编辑和调整2D、3D渲染及交互设置,以下几款可以关注了解一下: 1、Unity:一个广泛使用的跨平台游戏引擎,由Unity Technologies开发。支持开发者创建2D和3D游戏、交互式应用以及虚拟…

pdf压缩,pdf压缩在线网页版,在线压缩pdf网站

在数字化时代,pdf文件已经成为我们工作、学习和生活中不可或缺的一部分。然而,pdf文件往往体积庞大,传输效率低下,还占用大量存储空间。如何在不影响文件质量的前提下,减小pdf文件的大小呢?今天&#xff0c…

74HC595芯片验证

目录 0x00 74595芯片简介0x01 实现原理 0x00 74595芯片简介 74595芯片有很多种封装,不管是贴片的还是直插式的,它们的引脚定义都如下图所示: 其中 : Q0-Q7为并行数据输出口,可以输出高低电平。OE 为使能引脚&#…

MySQL之高可用性和应用层优化(一)

高可用性 故障转移和故障恢复 在应用中处理故障转移 有时候让应用来处理故障转移会更加简单或者更加灵活。例如,如果应用遇到一个错误,这个错误外部观察者正常情况下是无法察觉的,例如关于数据库损坏的错误日志信息,那么应用可…

Hugging Face发布重量级版本:Transformer 4.42

Hugging Face 宣布发布Transformer 4.42,该版本为流行的机器学习库带来了许多新功能和增强功能。此版本引入了几个高级模型,支持新工具和检索增强生成 (RAG),提供 GGUF 微调,并整合了量化的 KV 缓存&#x…

基于协同过滤的航空票务推荐系统的设计与实现(飞机票推荐系统)

💗博主介绍💗:✌在职Java研发工程师、专注于程序设计、源码分享、技术交流、专注于Java技术领域和毕业设计✌ 温馨提示:文末有 CSDN 平台官方提供的老师 Wechat / QQ 名片 :) Java精品实战案例《700套》 2025最新毕业设计选题推荐…

Android Studio 解决AAPT: error: file failed to compile

1.找到项目下的build.gradle 2.在android语块中添加下面代码 aaptOptions.cruncherEnabled false aaptOptions.useNewCruncher false 12

【数据结构】栈和队列-相互实现OJ题

前言: 本题目是关于栈和队列的OJ题目,需对栈和队列有一定了解再进行做题,若不了解可以根据我之前这篇文章进行学习:【数据结构】栈和队列-CSDN博客,题中需要的栈和队列的实现也在该文章中有源代码 目录 前言: 一.用…