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,一经查实,立即删除!

相关文章

Java后端开发的最佳工程实践与规范

Java后端开发的最佳工程实践与规范 大家好,我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿!今天我们将探讨Java后端开发中的最佳工程实践与规范,这些实践可以…

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

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

拓扑学习系列(1)拓扑球与拓扑环面与同胚

拓扑球与拓扑环面 在拓扑学中,"Topological Sphere" 和 "Topological Torus" 是两种不同的拓扑空间,它们具有特定的拓扑性质和几何特征。 Topological Sphere(拓扑球): 拓扑球是一个二维曲面&…

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

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

电脑有线网卡和无线网卡的MAC地址

电脑上的无线网卡和有线网卡是两种不同类型的网络接口卡,它们各自有不同的功能和连接方式。 无线网卡: 功能:无线网卡允许计算机通过无线信号连接到网络,通常是Wi-Fi网络。连接方式:无需物理电缆,通过无线…

编程与教学的奇妙交织:探索未来的教育模式

编程与教学的奇妙交织:探索未来的教育模式 在当今快速发展的科技时代,编程与教学之间的融合已经不再是遥不可及的梦想,而是逐渐成为教育领域的一股新浪潮。本文将从四个方面、五个方面、六个方面和七个方面深入探讨编程与教学的奇妙交织&…

Mac批量替换文件夹下所有文件内容

今天接了一个小需求,将文件夹下字段为% XXDM %替换成#{XXDM} 在苹果系统(macOS)下,可以使用命令行工具find结合sed来实现对A文件夹下所有文件内容的批量替换。具体操作步骤如下: 1、打开终端(Terminal&am…

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

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

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

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

Spring 框架中都用到了哪些设计模式:单例模式、策略模式、代理模式

Spring 框架是一个功能强大的企业级应用开发框架,它使用了多种设计模式来提高代码的可维护性、可扩展性和可重用性。以下是 Spring 框架中常见的几个设计模式,并简要说明它们的应用场景: 1. 单例模式(Singleton Pattern&#xff…

SpringCloud_Eureka注册中心

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

白骑士的Python教学实战项目篇 4.1 数据分析与可视化

系列目录 上一篇:白骑士的Python教学高级篇 3.4 Web开发​​​​​​​ 在本篇内容中,我们将介绍如何使用Python进行数据分析与可视化。数据分析与可视化是数据科学的重要组成部分,能够帮助我们从数据中提取有价值的信息和洞察。我们将使用P…

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

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

MPP和Hadoop的架构与场景分析

1、架构: MPP: MPP (Massively Parallel Processing)大规模并行处理,最开始的设计目的是为了消除共享资源的使用。 MPP数据库是:采用非共享架构(Shared Nothing)架构的分布式并行结构化数据库集群&#xff…

PyTorch从零开始实现LSTM

文章目录 LSTM基础理论从零开始实现LSTM简洁版LSTM实现参考资料 LSTM基础理论 关于LSTM的基础理论不再赘述,可以参考资料: RNN神经网络-LSTM模型结构https://github.com/ShusenTang/Dive-into-DL-PyTorch/blob/master/docs/chapter06_RNN/6.8_lstm.md …

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

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

【Android面试八股文】性能优化相关面试题:如何查找CPU占用?

文章目录 一、 如何查找CPU的占用问题二、TraceView的使用关于TraceView和Android Studio的Profiler第一步、通过Android studio 打开`Android profiler`第二步、使用步骤第三步、技术说明第四步、CPU占用相关指标说明扩展阅读一、 如何查找CPU的占用问题 在Android开发中,如…

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开发探索:父子组件手势绑定问题处理

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