让我们忘记VMs一秒钟(我们会回到下面的那个,我保证),并从这个重要的事实开始:

C没有垃圾收集。

对于提供垃圾回收的语言,必须要执行一些“运行时”/运行时环境/事物。

这就是为什么Python,Java和Haskell需要一个“运行时”,而C不能直接编译为本地代码。

请注意,psyco是一个Python优化器,它将Python代码编译为机器代码,但是很多机器代码包含对C-Python运行时函数的调用,如PyImport_AddModule,PyImport_GetModuleDict等。

Haskell / GHC与psyco编译的Python类似。 Ints作为简单的机器指令添加,但更复杂的东西分配对象等,调用运行时。

还有什么?

C没有“异常”

如果我们添加C的例外,我们生成的机器代码将需要为每个函数和每个函数调用做一些事情。

如果我们再添加“关闭”,还会添加更多的东西。

现在,我们可以将每个功能中的代码机器代码重复,而不用再调用子程序来执行必要的操作,比如PyErr_Occurred。

所以现在,基本上每一个原始的源代码行映射到一些函数的一些调用和一个较小的独特的部分。

但是,只要我们每个原始源代码行都做这么多的东西,为什么还要打扰机器代码?

这是一个想法(btw我们称之为“虚拟机”)。

我们来代表你的Python代码,例如:

def has_no_letters(text):

return text.upper() == text.lower()

作为内存数据结构,例如:

{ 'func_name': 'has_no_letters',

'num_args': 1,

'kwargs': [],

'codez': [

('get_attr', 'tmp_a', 'arg_0', 'upper'), # tmp_a = arg_0.upper

('func_call', 'tmp_b', 'tmp_a', []), # tmp_b = tmp_a() # tmp_b = arg_0.upper()

('get_attr', 'tmp_c', 'arg_0', 'lower'),

('func_call', 'tmp_d', 'tmp_c', []),

('get_global', 'tmp_e', '=='),

('func_call', 'tmp_f', 'tmp_e', ['tmp_b', 'tmp_d']),

('return', 'tmp_f'),

]

}

现在,我们来写一个执行这个内存数据结构的解释器。

我们来讨论这个直接来自文本解释器的好处,然后讨论编译到机器代码的好处。

虚拟机对直接从文本解释器的好处

>在执行代码之前,VM系统会提供所有的语法错误。

>在评估循环时,VM系统每次运行时都不会解析源代码。

使虚拟机比直接从文本解释器更快。

因此,直接解释器运行速度较慢,具有长变量名称,并且具有较短的变量名称。这鼓励人们写出诸如wt(f,d(o,e),s)=(i,s)cr(a,p * d o)的令人印象深刻的数学家风格的代码,

虚拟机对编译到机器代码的好处

>描述该程序的内存中数据结构或“VM代码”可能会比全面的机器代码要紧凑得多,对于每个原始代码行,它都会一次又一次地执行相同的操作。这将使VM系统运行更快,因为需要从内存中提取更少的“指令”。>创建虚拟机比创建机器代码的编译器要简单得多。现在你甚至可以不知道任何程序集/机器代码。

java 的vm是什么_java – 什么是VM,为什么动态语言需要一个?相关推荐

  1. java怎么让进程停止_JAVA:如何在进程停止时调用一个方法(甚至有可能吗?)

    Here is a pretty good guide to signal handling in Java.它还涵盖关闭和终止情况,包括Ctrl-C. 您想要的特定呼叫位于运行时间addShutdo ...

  2. java io 文件路径格式_java中iofile的路径问题,确定一个未知方法所需要的文件路径...

    今天遇到一个极其烦躁的问题,一个jar包中的一个方法,要求函数中要求传入一个String类型的参数,用于指示文件所在的路径.但是对于我们来说完全不知道他需要的路径是绝对路径还是相对路径,所以我尝试了很 ...

  3. java两个frame之间_java – JFrame中的两个JPanel,另一个是JP

    我的框架中有两个面板,我想将它们设置在另一个面板之下,这首先应该具有9/10 *屏幕框架的尺寸,以及第二个1/10. 我尝试过使用GridLayout(2行和1列),但我无法设置它们的具体大小. 我该 ...

  4. java中 会话的定义_Java Mail核心类中,( )类定义了一个基本的邮件会话。_学小易找答案...

    [单选题]下列说法不正确的一项是 [填空题]发送邮件的最后一步是使用 _____________类. [判断题]可以穿凉鞋.拖鞋和裙装进入操作区域 [判断题]ROBOGUIDE中的机械手仿真程序可以直 ...

  5. java 整型减去字符_Java:从char中减去’0’得到一个整数……为什么这个有效?...

    这工作正常: int foo = bar.charAt(1) - '0'; 但这不是-因为bar.charAt(x)返回一个char: int foo = bar.charAt(1); 似乎从char ...

  6. java二维数组添加元素_Java二维数组与动态数组ArrayList类详解

    java二维数组 java 语言中提供的数组是用来存储固定大小的同类型元素. 1.二维数组初始化和声明 数组变量的声明,和创建数组可以用一条语句完成,如下所示: int a[][] = new int ...

  7. java 文件指定位置插入_java中想在一个文件中的某一个位置插入内容,如何操作?...

    /** * * @param fileName 文件 * @param pos 插入位置 * @param insertContent 插入内容 * @throws IOException */ pu ...

  8. java为什么要用反射_Java中为什么需要反射?反射要解决什么问题?

    一句话概括就是使用反射可以赋予jvm动态编译的能力,否则类的元数据信息只能用静态编译的方式实现,例如热加载,Tomcat的classloader等等都没法支持 Java中编译类型有两种: 静态编译:在 ...

  9. 只知道java有反射可以说是动态语言,动态链接,早期晚期绑定、虚方法这些概念你知道吗

    目录 开局一张图 动态链接(或指向运行时常量池的方法引用) 为什么需要常量池呢? 早期绑定晚期绑定 静态链接 动态链接 虚方法与非虚方法 非虚方法 虚拟机中提供了以下几条方法调用指令 关于invoke ...

  10. java调节音量代码_用Java调用VC音量控制程序_java

    前言 本文通过java的Runtime接口来实现调用其他语言实现的应用程序,进而来实现对计算机硬件信息的监控和控制.本文是多媒体信息系统的一个部分,就是调整计算机音量. 使用VC编写音量控制程序 本控 ...

最新文章

  1. crontab FAQ
  2. 雅客EXCEL(1)--快速录入、统计、日期
  3. 亲测可用的github只下载一个文件夹的方法
  4. python sql注入脚本_python打造一个分析网站SQL注入的脚本
  5. eclipse中对单独JS文件取消报错的处理
  6. python连接redis失败、积极拒绝_python-django-redis拒绝连接问题解决_20191121
  7. python微控制器编程从零开始 豆瓣_从零开始(什么是编程)认识python
  8. 小括号教学设计导入_如何在教学中凸显出学生的主体地位呢?原来只需要做到这几点即可...
  9. 基于STM32F1单片机、ESP8266WIFI模块、DHT11温湿度传感的WIFI网络温湿度传输系统
  10. 计算机网络在金融领域的应用,计算机网络毕业论文计算机网络技术在金融领域的应用.pdf...
  11. channel带缓冲区和不带缓冲区的区别
  12. 13. Memcache 安装,启动,基本命令,URL
  13. 背单词App开发日记6(终章总结)
  14. 关于transform-style:preserve-3d的些许明了
  15. ecshop小京东后台首次上传商品不能上传相册的解决办法
  16. 机器指令、操作类型、寻址方式
  17. 用matlab处理表格,matlab删除excel表格数据-如何用matlab处理多个excel表格中的数据...
  18. java写 狐狸找兔子_狐狸找兔子(java 版)
  19. web界面测试用例(shelley_shu)
  20. vscode_历史版本下载_便携版/安装版

热门文章

  1. 解决两台路由器串联上网问题
  2. Firefox 和 Firefox Nightly 同步服务:切换国内和国际服务器的方法
  3. webAppRootKey
  4. android调用Camera.open方法报错“Too many cameras already open”
  5. 代码设置margintop_js获取css属性,更改margin-top属性,给每个a标签的margin-top属性在原基础上 +5px...
  6. 用C语言解“厘米换算英尺英寸”问题
  7. 有哪些比较好的国外知名广告联盟平台?
  8. 【DOORS】如何基于DOORS实施需求管理
  9. 为什么你的需求估算老是翻车?看看这个故事就明白了......
  10. 【SmartSvn】分支合并问题