tag : JavaScript

前端构建C语言解释执行环境调研

关于编译器有没想过在浏览器中直接运行其他语言?有没有想过写完c语言,能够立即在浏览器上编译运行。其实也没什么卵用了。只不过是的确可以基于js语言来构造其他语言的解析器。 编译执行与解释执行一种高级编程语言,从源代码开始,一直到被执行生成相应的动作,大约经历了这几个步骤:12 编译 执行 执行源代码====>(中间表示形式====>)基本操作序列====>生成最终动作 编译型和解释型语言的不同指出只是在于,这些过程发生的时机不一样。 编译型语言的代表是C,源代码被编译之后生成中间文件(.o和.obj),然后用连接器和汇编器生成机器码,也就是一系列基本操作的序列,机器码最后被执行生成最终动作。 解释型的语言以Ruby为例,也经历了这些步骤,不同的是,C语言会把那些从源代码“变”来的基本操作序列(保存)起来,而Ruby直接将这些生成的基本操作序列(Ruby虚拟机)指令丢给Ruby虚拟机执行然后产生动作了。 所以我们看到的现象是,编译型语言要先编译再运行,而解释性语言直接“运行”源代码。除了BASIC这样特别早期的解释型语言,是直接解释执行,现在的解释型语言都采取将代码编译为某种特定的虚拟机代码或者机器码的形式,然后再执行那些编译好的代码。BASIC这种直接解释的,我们可以将他的基本操作序列理解为直接执行基本操作的那些函数。 现在关于解释和编译的界限也不是特别清晰了。Java需要预先把代码编译成虚拟机指令的,然后在运行这些虚拟机指令,有的教科书上会成为混合型或者半编译型。像Python和lua这样就更不好分了,可以直接解释源代码运行,也可以编译为虚拟机指令然后再运行。php编译之后的结果可以被Web Server缓存起来,甚至还可以先被翻译为C++,然后再编译。.NET 的CLR运行时是Windows的组成部分,编译好的.NET 系列语言的代码直接生成可执行文件,然后被“直接”执行,看起来跟C没有什么太大的差别。JavaScript可以被V8引擎编译为机器码然后执行,如果在node.js下,这个编译结果被缓存起来了,你说这跟编译好再执行的C有什么区别。 基于JavaScript构造c语言运行环境目前有三种基本的方案:1)基于JS构建c语言解析执行环境(论文中方案,前端解析执行)论文中采用PEG( parsing expression grammar)解析表达式语法编写c语言解析器,在调研中发现还有类似的解决方案chevrotain,主要基于LL(K)词法分析。参考:peg方案 - https://pegjs.org/ , LL(K)方案 - https://github.com/SAP/chevrotain

polyfill,shim,shiv之间有什么区别?

什么是polyfill和shim搜索了一下:在JavaScript的世界里,有两个词经常被提到,shim和polyfill.它们指的都是什么,又有什么区别?一个shim是一个库,它将一个新的API引入到一个旧的环境中,而且仅靠旧环境中已有的手段实现;一个polyfill就是一个用在浏览器API上的shim.我们通常的做法是先检查当前浏览器是否支持某个API,如果不支持的话就加载对应的polyfill.然后新旧浏览器就都可以使用这个API了。

如何理解function

想过function吗?Function作为Javascript的核心技术之一,清晰的理解function的机制和用法,对我们进行javascript开发非常重要。你有想过function是什么吗?ECMAScript 的函数实际上是功能完整的对象。其中function是javascript中定义函数的关键字,由function定义的函数是一个由代码集合而成的对象,属于引用类型。而Function则是javascript中的引用类型中的一种,类似Number和String和Object和Boolean。Function类可以表示开发者定义的任何函数。

函数调用的角度理解call

问题引入大家都听过自执行函数吧,很多插件代码也都是写成了自执行函数的形式,加载插件的时候,执行本省,完成初始化。那么,你清楚其中的函数调用的原理吗?知道其他的写法吗?this的变换呢?这里我们先给个问题,然后再解释。

前端工程师学习系列教程

前端工程师学习系列教程本教程只是自己平时总结的零零总总学习大前端的知识,需要说明的是本系列教程并不是连续的由浅入深的内容,只是博主自己平日积累的。而且可能部分内容摘自互联网,请勿见怪,有出处的,我尽量会附上原网址链接。前端工程师本来对于技术就是不断积累和深化的过程,所以想进阶高级工程师,或者资深工程师,请务必牢记,踏踏实实学习积累,没有捷径。

AMD与CMD规范-javascript模块化

模块化思想模块化是指在解决某一个复杂问题或者一系列的杂糅问题时,依照一种分类的思维把问题进行系统性的分解以之处理。模块化是一种处理复杂系统分解为代码结构更合理,可维护性更高的可管理的模块的方式。可以想象一个巨大的系统代码,被整合优化分割成逻辑性很强的模块时,对于软件是一种何等意义的存在。对于软件行业来说:解耦软件系统的复杂性,使得不管多么大的系统,也可以将管理,开发,维护变得“有理可循”。

异步回调之Promise对象

异步思想你可能知道,Javascript语言的执行环境是”单线程”(single thread)。所谓”单线程”,就是指一次只能完成一件任务。如果有多个任务,就必须排队,前面一个任务完成,再执行后面一个任务,以此类推。 这种模式的好处是实现起来比较简单,执行环境相对单纯;坏处是只要有一个任务耗时很长,后面的任务都必须排队等着,会拖延整个程序的执行。常见的浏览器无响应(假死),往往就是因为某一段Javascript代码长时间运行(比如死循环),导致整个页面卡在这个地方,其他任务无法执行。

正确使用“use strict”

前言看一些开源项目的时候,觉得别人的代码确实写得好,一些细节都做得很到位。这里介绍一下如何合理使用“use strict”,自己写一些js类库的时候,不放严格要就自己。从多角度考虑,避免细节出错。