提要:
url anchor (ajax) => javascript engine (1~4 articles) => java VM vs. python interpreter => pypy

##
前两天在写《HTTP 初步探究》时,碰见一个问题,放到了 stackoverflow 上,简单讲,就是对于/#wd=keyword 形式的链接,在 Fiddler 抓包里,并没有看见 wd=keyword 被上传到服务器,但最终,keyword 被正确处理了(HTTP 交互里出现了 GET /s?wd=keyword HTTP/1.1 请求),而整个 HTTP 交互期间没有出现 HTTP/1.1 302 之类的回应。

根据下方的一个回答「The component of the url after the # sign is called the URL Fragment. It is not directly sent to the server as a part of the HTTP request (which is why you don't see it in Fiddler); it is only accessible by the JavaScript running on the page.」以及评论里的补充可知,# 后面的这部分,被称作 URL fragment,仅可被页面运行的 js 处理,顺带还提供了一个链接,是关于不同浏览器对于重定向场景下 #url_fragment 的不同处理。另外,我也找到了一篇博客,《QQ 密码修改的小问题》,也是类似的问题。

两点印象:1. 前端蕴含丰富的技术含量(请原谅先前滴无知),要懂各种标准、理解网页排版、会做 profiling 以优化页面显示、浏览器兼容性,最深的误解莫过于「用 Dreamweaver 画网页的」;2. Javascript 目测很强大。

##
读了四篇系列文章《The race for speed》(整体观感是不明觉厉…… 囧)。讲述的是,Javascript 是如何从一个未被标准化的浏览器脚本语言(最初的 runtime environment 仅有 Netscape – 即后来的 Mozilla Firefox)演变为现如今拥有庞大社区的通用语言(其运行时除了浏览器,也出现了 Node.js 这样的可编写服务器端网络程序的平台)。

从「Javascript => machine code」的基本流程是「lexical analysis =(tokenised_code)=> parser =(Abstract_Syntax_Tree)=> translator =(byte_code)=> byte code interpreter =(native_code)=> rendering / executing process」,除此之外,类似 Firefox SpiderMonkey 和 Google V8 Javascript engine 都做了大量的优化工作,来更好折衷「更快的载入运行 js 代码」和「让 js 代码跑得更快」,以达成使用 web app 替代 native app 的宏大远景(可谓 think big and do right things to make it happen)。

第三篇文章里看,这些优化工作,似乎不少都和 Javascript 的动态语言特性密不可分,比如 type inference 和 hidden classes,甚至 inline caching 都需要考虑多态缓存……
所谓的「Just-In-Time compilation」则是在一条条编译执行的基础上,缓存一部分编译过的 building block 以降低重新编译的性能损耗(可能还有其他高大上的加速思想);由于 Javascript 的动态特性,还要区分 typed JIT 和 un-typed JIT,有点像「分支预测」,如果 type inference 预测正确,则执行先前已经编译并缓存的机器码,否则算是 miss 并提交给 un-typed JIT 执行进一步编译和执行。

这个系列的最后一篇,展望了 Javascript 的未来。其中提到了正在标准化的 ECMAScript 6 和越来越强大的 WebGL,唔,觉得未来 web app 还真可能会大面积替代 native app,Google 当年的宏大远景很牛逼。点赞。

还有两篇可扩展视野的文章,未读,备份一下:《Chrome V8 Degisn Elements》《Explaining JavaScript VMs in JavaScript - Inline Caches》。后面那篇似乎很厉害的样子,「I want to help JavaScript developers understand how JS engines work. I think understanding the tools you are wielding is of uttermost importance in our trade. The more people would stop seeing JS VM as a mysterious black box that converts JavaScript source into some zeros-and-ones the better.」如果是用 Node.js 开发者,可能深入了解一些 internals 有益于更上一层楼。俺这里就纯粹先 #mark# 了……

##
理清了一下 virtual machine 和 interpreter 的异同,这两天经常看见这两个词,表示略微傻傻分不清楚,伤不起…… 参考这个 stackoverflow 链接回答一回答二,前者讲的比较抽象,后者讲的比较实在(community wiki),读完了就比较清晰了。

理论上:
virtual machine 是提供了一组类似汇编语言 primitive operation 的运行时环境,也是其上所运行 byte code 的沙盒环境,JVM 不仅仅可以运行 Java 程序生成的字节码,也可以运行 python => JVM byte code 的字节码(只要你可以完成这个编译转换),换句话讲,是和语言无关的。
interpreter 则是和语言息息相关,其名称由来也和动态语言密不可分,静态类型(static typed)语言一般不需要「解释」,类型都是固定的,还解释个毛线呢,直接编译链接执行就完事儿了;但动态类型的语言,可能源程序里写着 someDict 的变量在第一轮循环里是哈希字典、第二轮循环里就变成了字符串,所以,需要 interpreter 好好「解释」。第二个回答里提到「The moral of the story is that primitive data type information is really helpful to a compiler/virtual machine.」值得好好体会,其中的 primitive data type 就是指那些 in-memory storage size 固定已知的元类型……

实际上:
在追求效率的场景越来越多的时代,类似 Python 这样的动态语言,也有 PyPy 这样的第三方实现,能够类似 SpiderMonkey / V8 对 Javascript 所做的那样,通过一系列优化,以提升解释执行的速度、优化内存使用、通过微线程提升并发效率。
有两篇和 PyPy 相关的文章,似乎不错,未读,备份先。《Why PyPy is the future of Python》《Wikipedia processing. PyPy vs CPython benchmark》。#mark# 另外,还有一篇官方文档《Python Speed – performance tips》,有时间通读一遍(总觉得有点 pre-mature optimization 的味道,由于 cPython 的优化不够所以需要在 code 层面避免掉坑。囧 如果真是这样,也算是某个历史阶段的 practical practice 吧,动态语言嘛,有得必有失……)。

Javascript Engine, Java VM, Python interpreter, PyPy – a glance的更多相关文章

  1. 「2014-3-13」Javascript Engine, Java VM, Python interpreter, PyPy – a glance

    提要: url anchor (ajax) => javascript engine (1~4 articles) => java VM vs. python interpreter =& ...

  2. C、C++、Java、JavaScript、PHP、Python、Ruby 这些语言分别主要用来开发什么?

    C.C++.Java.JavaScript.PHP.Python.Ruby 这些语言分别主要用来开发什么? pansz,欢迎评论 此贴纯科普用,以下仅仅说主要用途,其他用途限于篇幅关系省略之,不要钻牛 ...

  3. javascript与java的相互调用,纯java的javascript引擎rhino(转载)

    1.下载Rhino安装包,下载地址:官网http://www.mozilla.org/rhino. 2.rhino环境配置,把解压出来的js.jar文件加入到系统的环境变量classpath 3.在命 ...

  4. C/C++、Java、Python谁是编译型语言,谁是解释型语言?

    最近各大互联网公司线上笔试,编程题目里的编译器只支持C/C++.Java,甚至有的支持javaScrpit和Pascal,就是不支持Python.让一直以来用惯了Python的我直吐血,于是今天痛定思 ...

  5. Python一键转Jar包,Java调用Python新姿势!

    粉丝朋友们,不知道大家看故事看腻了没(要是没腻可一定留言告诉我^_^),今天这篇文章换换口味,正经的来写写技术文.言归正传,咱们开始吧! 本文结构: 需求背景 进击的Python Java和Pytho ...

  6. windows 下用eclipse搭建java、python开发环境

    本人只针对小白!本文只针对小白!本文只针对小白! 最近闲来无事,加上之前虽没有做过eclipse上java.python的开发工作,但一直想尝试一下.于是边查找资料边试验,花了一天时间在自己的机器上用 ...

  7. [Python] Interpreter setting in Pycharm

    From: http://blog.csdn.net/u013088062/article/details/50135135 From: http://blog.csdn.net/u013088062 ...

  8. 常用脚本语言Perl,Python,Ruby,Javascript一 Perl,Python,Ruby,Javascript

    常用脚本语言Perl,Python,Ruby,Javascript一 Perl,Python,Ruby,Javascript Javascript现阶段还不适合用来做独立开发,它的天下还是在web应用 ...

  9. PHP、Java、Python、C、C++ 这几种编程语言都各有什么特点或优点

    PHP.Java.Python.C.C++ 这几种编程语言都各有什么特点或优点 汇编: C: Java: C#: PHP: Python: Go: Haskell: Lisp: C++: &l ...

随机推荐

  1. 使用c#调整图片质量

    //参数: 原始图片,保存路径,压缩比 private void CompressImage(MagickNet.Image img,string toPath, long ratio) { usin ...

  2. Java框架spring Boot学习笔记(三):Controller的使用

    Controller注解介绍 @Controller:处理http请求 @RestController: Spirng4之后新加的注解,其实是一个组合注解等同于@ResponseBody和@Contr ...

  3. IDEA 中tomcat日志位置

    参考 https://blog.csdn.net/dela_/article/details/78555977 /home/dela/.IntelliJIdea2017.1/system/tomcat ...

  4. Java反转二叉树

    // 二叉树节点定义 public class BinaryTreefanzhuan { class TreeNode{ int value; TreeNode left; TreeNode righ ...

  5. I/O多路复用、协程、线程、进程

    select注册fd,阻塞,当有fd状态改变时返回,确认对应的fd,做下一步处理.简单来说就是先注册,注册完后休眠并设置一个定时器醒来查看,有事件就通知来取,进行后续动作,没事件就继续睡,再设闹钟.用 ...

  6. 从零开始学spring cloud(十一) -------- hystrix监控

    一.官方文档阅读 服务启动后,可以通过/health和hystrix.stream查看效果,实际上,访问上述两个地址,会出现404,这是因为spring boot版本的问题, 我在这里使用的sprin ...

  7. 从零开始学spring cloud(十) -------- hystrix简单代码示例

    一.官网文档阅读 较低级别的服务中的服务故障可能导致级联故障一直到用户. 当对特定服务的调用超过circuitBreaker.requestVolumeThreshold(默认值:20个请求)且失败百 ...

  8. git log命令常用参数集合

    git log 查看 提交历史 默认不用任何参数的话,git log 会按提交时间列出所有的更新,最近的更新排在最上面. 常用的格式占位符写法及其代表的意义.选项 说明%H 提交对象(commit)的 ...

  9. Xcode9模拟器隐藏边框

    选中模拟器,在Mac顶部菜单栏找到Window-->Show Device Bezeles 取消勾选代表去除黑边,勾选代表展示黑边,根据个人喜好设置吧

  10. margin-top / padding-top 的百分比 到底是多少?

    之前,我以为 margin-top/padding-top 如果设置成%,得到的是 基于父对象总高度的百分比. 但是,这种想法是错的.因为在CSS标准里,是基于父对象宽度的百分比. <style ...