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

news2024/11/17 4:25:36

编程之痛

如果,你像笔者一样,有过学习或者使用汇编语言与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.coloradmin.cn/o/1884440.html

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

相关文章

Android Studio 2023版本切换DNK版本

选择自己需要的版本下载 根目录下的配置路劲注意切换 build.gradle文件下的ndkVersion也要配好对应版本

【web APIs】快速上手Day03

目录 Web APIs - 第3天全选文本框案例事件流事件捕获事件冒泡阻止冒泡解绑事件on事件方式解绑addEventListener方式解绑 注意事项-鼠标经过事件的区别两种注册事件的区别 事件委托综合案例-tab栏切换改造 其他事件页面加载事件元素滚动事件页面滚动事件-获取位置页面滚动事件-滚…

【java高级】【算法】通过子节点 反向获取 树路径父节点 且不获取无关节点

有一个奇葩需求 要求 用户配置在某选择框的选项 例如 然后在选择时显示 用户配置的选项 依旧是返回树,但是只包含 选择的子节点。 以及涉及的父节点,树路径 不返回无关节点 【一般】我们开发中都是直接通过 树节点 返回 其下子节点 这个需求的确很奇葩。 而且还要考…

生命在于学习——Python人工智能原理(3.1.1)

Python部分结束了,开始概率论部分 一、概率基本知识 1.1 事件与概率 1.1.1 事件的运算与关系 (一)基本概念 定义1 随机试验 如果一个试验满足如下条件: 在试验前不能断定其将发生什么结果,但可明确指出或说明试验…

Python系统教程01

Python 是一门解释性语言,相对更简单、易学,它可以用于解决数学问题、获取与分 析数据、爬虫爬取网络数据、实现复制数学算法等等。 1、print()函数: print()书写时注意所有的符号都是英文符号。print()输出内容时,若要输出字符…

【RabbitMQ问题踩坑】RabbitMQ设置手动ack后,消息队列有多条消息,只能消费一条,就不继续消费了,这是为什么 ?

现象:我发送5条消息到MQ队列中,同时,我在yml中设置的是需要在代码中手动确认,但是我把代码中的手动ack给关闭了,会出现什么情况? yml中配置,配置需要在代码中手动去确认消费者消费消息成功&…

赋能心理大模型,景联文科技推出高质量心理大模型数据库

生成式大模型作为当前发展势头最为强劲的人工智能前沿技术,其在临床心理学领域中的创新应用已成为社会关注和医学聚焦的热点之一。 心理大模型在落地应用过程中可能面临的痛点主要包括以下几个方面: 数据隐私与安全:确保敏感的个人信息在模型…

uniapp微信小程序电子签名

先上效果图,不满意可以直接关闭这页签 新建成单独的组件,然后具体功能引入,具体功能点击签名按钮,把当前功能页面用样式隐藏掉,v-show和v-if也行,然后再把这个组件显示出来。 【签名-撤销】原理是之前绘画时…

全球首款搭载Google Gemini和GPT-4o的智能眼镜发布

智能眼镜仍然是一个尚未完全成熟的未来概念,但生成式人工智能的到来显著提升了这些设备的能力。Meta 的 Ray-Ban 智能眼镜被许多人视为当今最好的选择之一,而现在 Solos AirGo Vision 正在为其带来竞争,这款眼镜还集成了 Google Gemini 支持。…

burpsuite 设置监听窗口 火狐利用插件快速切换代理状态

一、修改burpsuite监听端口 1、首先打开burpsuite,点击Proxy下的Options选项: 2、可以看到默认的监听端口为8080,首先选中我们想要修改的监听,点击Edit进行编辑 3、将端口改为9876,并保存 4、可以看到监听端口修改成功…

JUC基础学习

1.Java JUC简介 2.volatile关键字-内存可见性 3.原子变量-CAS算法 4.ConcurrentHashMap锁分段机制

【Unity Linux】模型导致的Unity项目崩溃

模型需勾选Strip Bones。如不勾选,则开启项目崩溃。 也可以删除有问题模型的.meta文件。 (Unity默认会自动勾选,所以不会崩溃) 或打开.meta文件,将optimizeBones的值,由0改为1。(对应面板上的…

Top 5 免费 PDF 转 Word 转换工具

PDF 是可移植文档格式的缩写,是一种文件格式,用于独立于软件、硬件或操作系统可靠地呈现和交换文档。PDF 不是为编辑而设计的,因此如果您想更改某些内容,可能需要将 PDF 转换为 Word/Doc 转换器。 Top 5 免费 PDF 转 Word 转换工具…

【Python实战因果推断】12_线性回归的不合理效果2

目录 Adjusting with Regression Adjusting with Regression 为了了解回归的威力,让我带您回到最初的例子:估计信贷额度对违约的影响。银行数据通常是这样的,其中有很多列客户特征,这些特征可能表明客户的信贷价值,比…

1972计算机毕业设计asp.net毕业生就业信息管理系统VS开发access数据库web结构c#编程计算机网页源码项目

一、源码特点 asp.net毕业生就业信息管理系统 是一套完善的web设计管理系统,系统具有完整的源代码和数据库,系统主要采用B/S模式开发。 asp.net毕业生就业信息管理系统 二、功能介绍 基于ASP.NET的毕业生就业信息管理系统主要满足以下几个方面的…

SQL 注入联合查询之为什么要 and 1=2

在 SQL 注入联合查询中,将 id 先置为假(如 id-1 或其他使查询结果为空的条件),通常是为了让前面的查询语句查询不到结果,从而使联合查询中后面的语句结果能够显示在回显位上

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

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

转运机器人帮助物流行业实现无人化运输,自动分拣

在物流行业日新月异的今天,智能化、无人化已成为大势所趋。富唯智能转运机器人凭借其卓越的性能和广泛的应用场景,正引领着物流行业的新一轮变革。 1、高效转运,轻松应对 富唯智能转运机器人,拥有高达1000kg的负载能力&#xff…

django学习入门系列之第三点《BootSrap初了解》

文章目录 初识BootStrap往期回顾 初识BootStrap BootSrap是什么? 是别人帮我们已写好的CSS样式,我们如果想要使用这个BootSrap: 下载BootStrap使用 在页面上引入BootStrap编写HTML时,按照BootStrap的规定来编写 自定制 官网&…

GoogleAI大动作:发布Gemma 2,开启新篇章

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…