于是抛弃所有利益的考虑,遵循内心,好好追逐cljs一番:D cljs就是ClojureScript的缩写,就是让Clojure代码transpile为JavaScript代码然后运行在浏览器或其他JSVM 由于宿主环境的不同,因此只能与宿主环境无关的Clojure代码可以在JVM和JSVM间共享,并且cljs也未能完全实现clj中的所有语言特性,更何况由于JSVM是单线程因此根本就不需要clj中STM等特性呢 => (finally expr*) ; throw,将e-expr运算结果作为异常抛出 (throw e-expr) 进阶 与JavaScript互操作(Interop) cljs最终是运行在JSVM 问题真心是在clojurescript.net上,下一篇(cljs/run-at (JSVM. :browser) "搭建刚好可用的开发环境!")
前言 作为一门函数式编程语言,深入了解函数的定义和使用自然是十分重要的事情,下面我们一起来学习吧! 3种基础定义方法 defn 定义语法 (defn name [params*] exprs*)
);// 创建虚拟机作用域JSVM_EXTERN JSVM_Status OH_JSVM_OpenVMScope(JSVM_VM vm,JSVM_VMScope* result);// 创建上下文环境JSVM_EXTERN ,JSVM_Env* result);// 创建上下文环境作用域JSVM_EXTERN JSVM_Status OH_JSVM_OpenEnvScope(JSVM_Env env,JSVM_EnvScope result);// 执行一段JS代码并返回结果JSVM_EXTERN JSVM_Status OH_JSVM_RunScript(JSVM_Env env,JSVM_Script script,JSVM_Value ;// 销毁上下文环境JSVM_EXTERN JSVM_Status OH_JSVM_DestroyEnv(JSVM_Env env);// 关闭虚拟机作用域JSVM_EXTERN JSVM_Status OH_JSVM_CloseVMScope(JSVM_VM vm,JSVM_VMScope scope);// 销毁虚拟机实例JSVM_EXTERN JSVM_Status OH_JSVM_DestroyVM
前言 作为一门函数式编程语言,深入了解函数的定义和使用自然是十分重要的事情,下面我们一起来学习吧! 3种基础定义方法 defn 定义语法 (defn name [params*] exprs*)
下一篇(cljs/run-at (JSVM. :browser) "简单类型可不简单啊~")
前言 动态类型语言,少了静态类型语言必须声明变量类型的累赘,但也缺失了编译时类型检查和编译时优化的好处。cljs虽然作为动态类型语言,但其提供Metadata让我们在必要的时候可选择地补充类型提示,以便提高代码可读性和供编译器优化使用。除了上述以外,Metadata还让我们在不影响对象本质的前提下,附加额外信息增强元编程能力。 Metadata附加的目标 首先要明确一点的是,Metadata不是任何对象/值都拥有的。只有如下的对象才可附加Metadata Symbol Var Collections(L
前言 动态类型语言,少了静态类型语言必须声明变量类型的累赘,但也缺失了编译时类型检查和编译时优化的好处。cljs虽然作为动态类型语言,但其提供Metadata让我们在必要的时候可选择地补充类型提示,以便提高代码可读性和供编译器优化使用。除了上述以外,Metadata还让我们在不影响对象本质的前提下,附加额外信息增强元编程能力。 Metadata附加的目标 首先要明确一点的是,Metadata不是任何对象/值都拥有的。只有如下的对象才可附加Metadata Symbol Var Collections(L
前言 习惯了Ramda.js就会潜意识地认为函数均已柯里化,然后就可以随心所欲的用函数生成函数,或者使用compose组合多个函数来生成一个新函数。如下 const f = a => b => a + b const g = c => d => c - d const compose = f => g => x => f(g(x)) const add1 = f(1) add1(2) // 返回3 const addThenMinus = compose(g(2), f(1)) addThenMinu
然后 其实 hook 一下 CryptoJs parse啊 encrypt 就可以知道了
(cljs/run-at (JSVM. :browser) "命名空间就这么简单")
下一篇(cljs/run-at (JSVM. :all) "细说函数"),我们一起细说吧! REF http://www.cnblogs.com/or2-/p/3579745.html
前言 在项目中我们一般会为实际问题域定义领域数据模型,譬如开发VDOM时自然而言就会定义个VNode数据类型,用于打包存储、操作相关数据。clj/cljs不单内置了List、Vector、Set和Map等数据结构,还提供deftype和defrecord让我们可以自定义数据结构,以满足实际开发需求。 定义数据结构从Data Type和Record开始 提及数据结构很自然就想起C语言中的struct,结构中只有字段并没有定义任何方法,而这也是deftype和defrecord最基础的玩法。 示例 (de
JSVM(JavaScript Virtual Machine)项目 JSVM。路过的大家有谁听说过这个项目没有? 总之,这是一个由国人万常华(wch3116)在2003年搞出来的,结构上仿照标准Java,原理上酷似于BicaVM的开源项目(第一版最像,JSVM2差点,当然,正确的语序应该是BicaVM酷似JSVM) 倒退十年国内就有这样的人才,我敢拿人头保证,绝对是先有JSVM后有BicaVM(虽然两者实现上有差别,但原理并无二致,都是结构上的JS仿Java,而且JSVM直接使用原生JS(当然,也有自己的JSC语法甚至允许自由扩展 公道自在人心,大家有空时可以结合2004年的JSVM旧文,再结合当前的BicaVM,也比较一下国内对中西同性质,不同效率项目(明显JSVM更快)的不同评价吧。 PS:个人始终喜欢JSVM第一版,也就是高仿Java结构的那版,后来的JSVM2或许因前版性能被某些闲人诟病,于是作者牺牲了太多Java特性而搞了JSVM2,改的已经不像Java类库,更贴近JQuery
前言 在项目中我们一般会为实际问题域定义领域数据模型,譬如开发VDOM时自然而言就会定义个VNode数据类型,用于打包存储、操作相关数据。clj/cljs不单内置了List、Vector、Set和Map等数据结构,还提供deftype和defrecord让我们可以自定义数据结构,以满足实际开发需求。 定义数据结构从Data Type和Record开始 提及数据结构很自然就想起C语言中的struct,结构中只有字段并没有定义任何方法,而这也是deftype和defrecord最基础的玩法。 示例 (de
JSVM是我们要学习的第一个概念。 既然JSCore被认为是一个虚拟机,那JSVM又是什么?实际上,JSVM就是一个抽象的JS虚拟机,让开发者可以直接操作。在App中,我们可以运行多个JSVM来执行不同的任务。 而且每一个JSContext(下节介绍)都从属于一个JSVM。但是需要注意的是每个JSVM都有自己独立的堆空间,GC也只能处理JSVM内部的对象(在下节会简单讲解JS的GC机制)。 这意味着,在一个JSVM中,只有一条线程可以跑JS代码,所以我们无法使用JSVM进行多线程处理JS任务。如果我们需要多线程处理JS任务的场景,就需要同时生成多个JSVM,从而达到多线程处理的目的。 JSContext和JSVM是多对一的关系,一个JSContext只能绑定一个JSVM,但是一个JSVM可以同时持有多个JSContext。
实际上,JSVM就是一个抽象的JS虚拟机。在APP中我们可以运行多个JSVM来执行不同的任务。而且每一个JSContext都会从属于一个JSVM。 需要注意的是,每一个JSVirtualMachine都有自己独立的堆空间,GC也只能处理JSVM内部的对象。所以说,不同的JSVM之间是不能传递值的。 在前面我们提到过JS的单线程机制,这也就意味着在JSVM中,只有一条线程可以跑JS代码,所以我们无法使用JSVM进行多线程处理JS任务。 如果我们需要多线程处理JS任务的场景,那么就需要同时生成多个JSVM,从而达到多线程处理的目的。 JSContext和JSVirtualMachine是多对一的关系,也就是说,一个JSVM可以持有多个JSContext,但是一个JSContext只能绑定一个JSVM。
下面我会综合刚刚提到的几个点,并选择了 JavaScriptCore,V8,Hermes 和 QuickJS 这 4 个 JSVM,说说它们的优点和特点,再谈谈他们的不足。 2.V8 mobile_JSVM_V8 V8,我想我不用过多解释了,JavaScript 能有如今的地位,V8 功不可没。 一般来说 JSVM 启动后,第一步往往是解析 JS 文件,这个还是比较耗时的,V8 支持预先生成 Heap snapshots,然后直接加载到堆内存中,快速的获得 JS 的初始化上下文。 综合来看 V8 的确是 JSVM 中的性能王者,Android 端使用时可以完全发挥它的威力,但是 iOS 平台因为主场劣势,并不是很推荐。 4.QuickJS mobile_JSVM_quickjs 正式介绍 QuickJS 前我们先说说它的作者:Fabrice Bellard。
它提供了调用 JS 运行环境以及 OC 和 JS 互相调用的能力,主要包含了 JSVM、JSContext、JSValue、JSExport 四个部分(其实只是想讲 JSVM)。 JSVM JSVM 全称是 JSVirtualMachine,简单来说就是 JS 的虚拟机。那么什么是虚拟机呢? 而 JSVM 则提供了 JS 的运行环境,也提供了内存管理。每个 JSVM 只有一个线程,如果想执行多个线程,就要创建多个 JSVM,它们都自己独立的 GC,所以多个 JSVM 之间的对象无法传递。 生成的指令字节码,会被立即被 JSVM 进行逐行解释执行。 字节码 ❝ 字节码是已经经过编译,但与特定机器码无关,需要解释器转译后才能成为机器码的中间代码。
从功能实现来看,我们可以通过新增iframe加载同域页面来创建JSVM进程执行运算从而避免造成界面卡顿的问题。 Web Worker详解 Web Worker分为Dedicated Web Worker和Shared Web Worker两类,它们的特性如下: Dedicated Web Worker仅为创建它的JSVM 进程服务,当其所属的JSVM进程结束该Dedicated Web Worker线程也将结束; Shared Web Worker为创建它的JSVM进程所属页面的域名服务,当该域名下的所有JSVM进程均结束时该
下面我会综合刚刚提到的几个点,并选择了 JavaScriptCore,V8,Hermes 和 QuickJS 这 4 个 JSVM,说说它们的优点和特点,再谈谈他们的不足。 2.V8 mobile_JSVM_V8 V8,我想我不用过多解释了,JavaScript 能有如今的地位,V8 功不可没。 一般来说 JSVM 启动后,第一步往往是解析 JS 文件,这个还是比较耗时的,V8 支持预先生成 Heap snapshots,然后直接加载到堆内存中,快速的获得 JS 的初始化上下文。 综合来看 V8 的确是 JSVM 中的性能王者,Android 端使用时可以完全发挥它的威力,但是 iOS 平台因为主场劣势,并不是很推荐。 4.QuickJS mobile_JSVM_quickjs 正式介绍 QuickJS 前我们先说说它的作者:Fabrice Bellard。