- 浏览: 3052748 次
- 性别:
- 来自: 海外
文章分类
- 全部博客 (430)
- Programming Languages (23)
- Compiler (20)
- Virtual Machine (57)
- Garbage Collection (4)
- HotSpot VM (26)
- Mono (2)
- SSCLI Rotor (1)
- Harmony (0)
- DLR (19)
- Ruby (28)
- C# (38)
- F# (3)
- Haskell (0)
- Scheme (1)
- Regular Expression (5)
- Python (4)
- ECMAScript (2)
- JavaScript (18)
- ActionScript (7)
- Squirrel (2)
- C (6)
- C++ (10)
- D (2)
- .NET (13)
- Java (86)
- Scala (1)
- Groovy (3)
- Optimization (6)
- Data Structure and Algorithm (3)
- Books (4)
- WPF (1)
- Game Engines (7)
- 吉里吉里 (12)
- UML (1)
- Reverse Engineering (11)
- NSIS (4)
- Utilities (3)
- Design Patterns (1)
- Visual Studio (9)
- Windows 7 (3)
- x86 Assembler (1)
- Android (2)
- School Assignment / Test (6)
- Anti-virus (1)
- REST (1)
- Profiling (1)
- misc (39)
- NetOA (12)
- rant (6)
- anime (5)
- Links (12)
- CLR (7)
- GC (1)
- OpenJDK (2)
- JVM (4)
- KVM (0)
- Rhino (1)
- LINQ (2)
- JScript (0)
- Nashorn (0)
- Dalvik (1)
- DTrace (0)
- LLVM (0)
- MSIL (0)
最新评论
-
mldxs:
虽然很多还是看不懂,写的很好!
虚拟机随谈(一):解释器,树遍历解释器,基于栈与基于寄存器,大杂烩 -
HanyuKing:
Java的多维数组 -
funnyone:
Java 8的default method与method resolution -
ljs_nogard:
Xamarin workbook - .Net Core 中不 ...
LINQ的恶搞…… -
txm119161336:
allocatestlye1 顺序为 // Fields o ...
最近做的两次Java/JVM分享的概要
今天原本是在cnBeta上看新闻的,看到KDE 4.0.1的发布消息时留意到其中提到Konquerer的JavaScript引擎(KJS)的更新,突然就心痒起来,到KDE的SVN去抓了KJS的代码下来看。粗略浏览了几个文件,做点记录。
KDE的svn trunk地址:svn://anonsvn.kde.org/home/kde/trunk/KDE
其中KJS的部分是:svn://anonsvn.kde.org/home/kde/trunk/KDE/kdelibs/kjs
今天抓到的是revision 772368。话说代码里不是考虑到了MSVC的兼容性了么,为什么没见到MSVC的project/workspace/solution文件的?难道是在KDE的大包里么……回头得再找找。或者回头试试在MinGW里build一下看行不行。
KJS是由Harri Porten为KDE的浏览器Konquerer而编写的JavaScript引擎,目前支持的是ECMAScript 3。在一些实现细节上,KJS似乎更倾向于与IE的JScript的行为相兼容(相比于倾向Mozilla/FF)。未实现E4X。实现了Mozilla扩展的__getter__和__setter__以及相关设施。
Apple的WebKit中的JavaScript引擎JavaScriptCore基于KJS。Safari自然也是使用JavaScriptCore的咯。在JavaScriptCore的介绍页面上的todo-list有点意思。
对了,不要忘记看看John Resig制作的ECMAScript族谱哦:http://ejohn.org/files/ecma-cloud.png
KJS的代码看起来很干净。阅读的时候感觉比较轻松。在我读过的JavaScript引擎的源代码中,KJS可能是第二容易阅读的。第一是Rhino,再怎么说用Java来写代码便是限制住了些恶心的东西(例如我很讨厌的宏……),而且也不用自己写GC了,交给下面的JVM就行。而Rhino的兄长,Mozilla SpiderMonkey则有不少恶心代码;嗯,不过应该说还算好的了。想来我读过的JavaScript-like语言的实现中最恶心的可能还是吉里吉里2里的TJS……以上纯粹个人喜好意义上的评论。
KJS中,解释器前端的lexer是手写的(lexer.h/cpp),没什么特别,就是一个ad hoc的DFA。没有用到正则表达式的库。关键字匹配是委托给Lookup类完成的,其中用到了hash table。lexer.h里有个奇怪的地方,明明声明了int lookupKeyword(const char *);却没有任何地方实现了这个方法,是refactor的时候漏了改么。lexer.cpp, line 578的有这么行注释:
想起之前在es4-discuss上讨论关于FunDeclInSmt的问题,记个链接:Function declarations in statements。上面那行注释对应的是FunExpr的状况。嗯回头留意下别的JavaScript引擎是怎么处理这个语法的。
Parser则是bison生成的(grammar.y/h/cpp,Parser.h/cpp)。中间是一棵抽象语法树。后端是一个tree-walker形式的解释器(主要在interpreter.h/cpp)。
解释器状态在ExecState中保存(ExecState.h/cpp)。每个解释器实例应使用一个独特的JSObject作为globalObejct。解释器允许在多线程环境下使用,为了保证线程安全,引擎实现了锁(JSLock.h/cpp)。
基本的类型层次从JSValue类开始。
GC则是使用mark-and-sweep算法。没有分代。mark用bitmap来记录。GC功能主要在collector.h/cpp中实现。
KJS中注册native function的方式真独特。以前还没见过这么做的,唉唉,孤陋寡闻了。
举个例子,看看KJS中Boolean.prototype的实现部分。
bool_object.h, line 52:
bool_object.cpp, line 65:
像这样,Boolean.prototype.ToString()和Boolean.prototype.ValueOf()就被实现为一个JSObject::callAsFunction()了,在callAsFunction()里通过id来区别具体要调用的是哪个函数。id所用到的值得范围则是由一个enum提供的。
天啊。在Boolean里还好只有2个方法,但在Math和Date里,原生提供的方法就多多了,Object.prototype也是……结果看到的是这种代码:
math_object.h, line 37:
math_object.cpp, line 85:
math_object.cpp, line 131:
这里可是26个方法给switch(id)了……
KDE提供了一个方便将KJS嵌入别的KDE/Qt应用的库KJSEmbed。不知道KJSEmbed里是怎么将native function绑定到JavaScript端的,不过想来跟KJS的做法应该一样(因为被KJS的JSObject固定了)?
(更新:顺便就把KJSEmbed也抓了下来。svn trunk: svn://anonsvn.kde.org/home/kde/trunk/KDE/kdelibs/kjsembed
其中qobject_binding.h(197)/qobject_binding.cpp(604),static_binding.h(49,93)/static_binding.cpp(41)确实也出现了callAsFunction()。不过却没有前述的enum+switch(id);SlotBinding类里有个switch(returnTypeId),不过跟前面的那种switch比较不一样了。
取而代之,恶心的宏出现了 T T
qobject_binding.h, line 38:
这这这……我讨厌这样的宏 T T
但我也确实没见过什么别的好办法。总不能每次都重复的手写那些代码吧。
)
以后想起来了再慢慢更新……
P.S. 祝大家新年快乐噢~
KDE的svn trunk地址:svn://anonsvn.kde.org/home/kde/trunk/KDE
其中KJS的部分是:svn://anonsvn.kde.org/home/kde/trunk/KDE/kdelibs/kjs
今天抓到的是revision 772368。话说代码里不是考虑到了MSVC的兼容性了么,为什么没见到MSVC的project/workspace/solution文件的?难道是在KDE的大包里么……回头得再找找。或者回头试试在MinGW里build一下看行不行。
KJS是由Harri Porten为KDE的浏览器Konquerer而编写的JavaScript引擎,目前支持的是ECMAScript 3。在一些实现细节上,KJS似乎更倾向于与IE的JScript的行为相兼容(相比于倾向Mozilla/FF)。未实现E4X。实现了Mozilla扩展的__getter__和__setter__以及相关设施。
Apple的WebKit中的JavaScript引擎JavaScriptCore基于KJS。Safari自然也是使用JavaScriptCore的咯。在JavaScriptCore的介绍页面上的todo-list有点意思。
对了,不要忘记看看John Resig制作的ECMAScript族谱哦:http://ejohn.org/files/ecma-cloud.png
KJS的代码看起来很干净。阅读的时候感觉比较轻松。在我读过的JavaScript引擎的源代码中,KJS可能是第二容易阅读的。第一是Rhino,再怎么说用Java来写代码便是限制住了些恶心的东西(例如我很讨厌的宏……),而且也不用自己写GC了,交给下面的JVM就行。而Rhino的兄长,Mozilla SpiderMonkey则有不少恶心代码;嗯,不过应该说还算好的了。想来我读过的JavaScript-like语言的实现中最恶心的可能还是吉里吉里2里的TJS……以上纯粹个人喜好意义上的评论。
KJS中,解释器前端的lexer是手写的(lexer.h/cpp),没什么特别,就是一个ad hoc的DFA。没有用到正则表达式的库。关键字匹配是委托给Lookup类完成的,其中用到了hash table。lexer.h里有个奇怪的地方,明明声明了int lookupKeyword(const char *);却没有任何地方实现了这个方法,是refactor的时候漏了改么。lexer.cpp, line 578的有这么行注释:
// Hack for "f = function somename() { ... }", too hard to get into the grammar
想起之前在es4-discuss上讨论关于FunDeclInSmt的问题,记个链接:Function declarations in statements。上面那行注释对应的是FunExpr的状况。嗯回头留意下别的JavaScript引擎是怎么处理这个语法的。
Parser则是bison生成的(grammar.y/h/cpp,Parser.h/cpp)。中间是一棵抽象语法树。后端是一个tree-walker形式的解释器(主要在interpreter.h/cpp)。
解释器状态在ExecState中保存(ExecState.h/cpp)。每个解释器实例应使用一个独特的JSObject作为globalObejct。解释器允许在多线程环境下使用,为了保证线程安全,引擎实现了锁(JSLock.h/cpp)。
基本的类型层次从JSValue类开始。
JSValue <- primitive type及Object的实现类的基类。但只有primitive type直接继承自该类 └JSCell <- 为GC需要而设立的一个基类 └JSObject <- Object的实现类,也是其它non-primitive type的基类。
GC则是使用mark-and-sweep算法。没有分代。mark用bitmap来记录。GC功能主要在collector.h/cpp中实现。
KJS中注册native function的方式真独特。以前还没见过这么做的,唉唉,孤陋寡闻了。
举个例子,看看KJS中Boolean.prototype的实现部分。
bool_object.h, line 52:
/** * @internal * * Class to implement all methods that are properties of the * Boolean.prototype object */ class BooleanProtoFunc : public InternalFunctionImp { public: BooleanProtoFunc(ExecState*, FunctionPrototype*, int i, int len, const Identifier&); virtual JSValue *callAsFunction(ExecState *exec, JSObject *thisObj, const List &args); enum { ToString, ValueOf }; private: int id; };
bool_object.cpp, line 65:
// ECMA 15.6.4.2 + 15.6.4.3 JSValue *BooleanProtoFunc::callAsFunction(ExecState* exec, JSObject *thisObj, const List &/*args*/) { // no generic function. "this" has to be a Boolean object if (!thisObj->inherits(&BooleanInstance::info)) return throwError(exec, TypeError); // execute "toString()" or "valueOf()", respectively JSValue *v = static_cast<BooleanInstance*>(thisObj)->internalValue(); assert(v); if (id == ToString) return jsString(v->toString(exec)); return jsBoolean(v->toBoolean(exec)); /* TODO: optimize for bool case */ }
像这样,Boolean.prototype.ToString()和Boolean.prototype.ValueOf()就被实现为一个JSObject::callAsFunction()了,在callAsFunction()里通过id来区别具体要调用的是哪个函数。id所用到的值得范围则是由一个enum提供的。
天啊。在Boolean里还好只有2个方法,但在Math和Date里,原生提供的方法就多多了,Object.prototype也是……结果看到的是这种代码:
math_object.h, line 37:
enum { Euler, Ln2, Ln10, Log2E, Log10E, Pi, Sqrt1_2, Sqrt2, Abs, ACos, ASin, ATan, ATan2, Ceil, Cos, Pow, Exp, Floor, Log, Max, Min, Random, Round, Sin, Sqrt, Tan };
math_object.cpp, line 85:
JSValue *MathObjectImp::getValueProperty(ExecState *, int token) const { double d = -42; // ;) switch (token) { case Euler: d = exp(1.0); break; case Ln2: d = log(2.0); break; //... other cases omitted } return jsNumber(d); }
math_object.cpp, line 131:
JSValue *MathFuncImp::callAsFunction(ExecState *exec, JSObject* /*thisObj*/, const List &args) { double arg = args[0]->toNumber(exec); double arg2 = args[1]->toNumber(exec); double result; switch (id) { case MathObjectImp::Abs: result = ( arg < 0 || arg == -0) ? (-arg) : arg; break; case MathObjectImp::ACos: result = ::acos(arg); break; case MathObjectImp::ASin: result = ::asin(arg); break; //... other cases omitted } return jsNumber(result); }
这里可是26个方法给switch(id)了……
KDE提供了一个方便将KJS嵌入别的KDE/Qt应用的库KJSEmbed。不知道KJSEmbed里是怎么将native function绑定到JavaScript端的,不过想来跟KJS的做法应该一样(因为被KJS的JSObject固定了)?
(更新:顺便就把KJSEmbed也抓了下来。svn trunk: svn://anonsvn.kde.org/home/kde/trunk/KDE/kdelibs/kjsembed
其中qobject_binding.h(197)/qobject_binding.cpp(604),static_binding.h(49,93)/static_binding.cpp(41)确实也出现了callAsFunction()。不过却没有前述的enum+switch(id);SlotBinding类里有个switch(returnTypeId),不过跟前面的那种switch比较不一样了。
取而代之,恶心的宏出现了 T T
qobject_binding.h, line 38:
/** * A simple pointer syle method. * This will extract the pointer, cast it to the native type and place it in "value". * Any data that should be returned from this method should be placed into "result"; * */ #define START_QOBJECT_METHOD( METHODNAME, TYPE) \ KJS::JSValue *METHODNAME( KJS::ExecState *exec, KJS::JSObject *self, const KJS::List &args ) \ { \ Q_UNUSED( args ); \ KJS::JSValue *result = KJS::jsNull(); \ KJSEmbed::QObjectBinding *imp = KJSEmbed::extractBindingImp<KJSEmbed::QObjectBinding>(exec, self ); \ if( imp ) \ { \ TYPE *object = imp->qobject<TYPE>(); \ if( object ) \ { /** * End a variant method started by START_QOBJECT_METHOD */ #define END_QOBJECT_METHOD \ } \ else \ KJS::throwError(exec, KJS::ReferenceError, QString("QO: The internal object died %1:%2.").arg(__FILE__).arg(__LINE__));\ } \ else \ KJS::throwError(exec, KJS::ReferenceError, QString("QObject died."));\ return result; \ }
这这这……我讨厌这样的宏 T T
但我也确实没见过什么别的好办法。总不能每次都重复的手写那些代码吧。
)
以后想起来了再慢慢更新……
P.S. 祝大家新年快乐噢~
发表评论
-
Function.prototype.bind
2013-09-24 18:07 0polyfill http://stackoverflow. ... -
Nashorn各种笔记
2013-07-15 17:03 0http://bits.netbeans.org/netbea ... -
JavaScript global properties are bound by name, not by value
2013-06-04 14:42 0function a() { console.log('a1' ... -
PICs and prototypes
2013-05-30 13:10 0In a lot of the implementations ... -
Nashorn notes
2013-05-28 10:44 0Nashorn NodeVisitor: the same a ... -
Building Blocks of a JavaScript Engine
2013-05-23 00:49 0sketches of my new book "B ... -
读《JavaScript语言精髓与编程实践(第二版)》
2013-05-21 00:32 02008年逛书店的时候偶 ... -
V8与c1visualizer
2011-08-21 21:00 0Subject: [v8-dev] Improved c1vi ... -
Rhino的JavaScript与Java的整合
2011-05-05 14:40 0http://www.mozilla.org/rhino/Sc ... -
this = null的杯具
2011-03-09 17:04 0this不允许赋值? FireFox表示吐槽 Chrome却欣 ... -
简单替换URL中查询字符串的参数值的代码
2010-04-11 17:49 6190刚有个需求是要把URL中query部分的一个指定参数的值替换为 ... -
JägerMonkey的组件介绍
2010-03-16 13:00 0David Mandelin JägerMonkey & ... -
眼见为实——V8的隐藏类与inline cache的例子
2010-03-02 13:42 0src/globals.h // State for inli ... -
JavaScript一些难以优化的地方
2010-03-02 08:54 0arguments with eval -
JägerMonkey与Carakan动态更新
2010-02-28 22:08 3043今天读了几篇与JavaScript引擎相关的帖。三篇关于Moz ... -
Opera的JS引擎,Carakan
2009-12-03 01:47 0Wikipedia 引用Presto is a layout ... -
with的陷阱
2009-11-21 18:41 0让eval()全局作用域执行的方法深入研究 用with(win ... -
虚拟机随谈(一):解释器,树遍历解释器,基于栈与基于寄存器,大杂烩
2009-10-17 02:52 133354(Disclaimer:如果需要转 ... -
再谈Google V8和Webkit Nitro
2009-08-21 18:11 0JavaScriptCore SquirrelFish -&g ... -
把列表里连续的数字合并到连续范围里
2009-06-07 20:46 3388论文写得快疯了嗯。上来换口气。 刚才看到问答频道的一个问题, ...
相关推荐
《EPPC-1282KJS说明书》是一份详细阐述EPPC-1282KJS设备操作、配置及维护的综合资料。这份文档对于理解和使用该设备至关重要,无论你是技术专家还是普通用户,都能从中获取必要的信息。 EPPC-1282KJS可能是某种电子...
"chrome-kjs-crx插件"是一款专为Web开发者设计的高效工具,它支持英语和简体中文,旨在提升开发者的生产力。这款扩展程序在Chrome浏览器中安装后,能够为开发者提供一系列实用的功能。 首先,该插件的一个关键特性...
派特莱KJS 系列多层小型方形旋转报警灯2D CADdxf,特点:发挥旋转报警灯的散光优势,提高报警可视范围,自然提升视觉反应。体积小节省平面空间,带内置蜂鸣器,是大型机器,重工机械的最佳选择。科学的抛物线反射镜,...
### Qt webkit 学习笔记知识点详述 #### 一、Qtwebkit简介 **1. Qt** Qt 是一款跨平台的应用程序开发框架,通常被称为 C++ 组件工具箱。它被广泛应用于各种知名的软件和产品中,比如 KDE 桌面环境、Opera 浏览器...
【JAVA语言】 1. **面向对象的特性**:面向对象编程是Java的核心,它包括三个基本特征:继承、封装和多态。继承允许一个类(子类)继承另一个类(父类)的属性和方法,封装是将数据和操作这些数据的方法绑定在一起...
看不到源码KJS:JavaScript 的完整形式语义 KJS 是迄今为止最完整且经过彻底测试的 JavaScript 形式语义。 作为可执行文件,KJS 已针对 进行了测试,并通过了所有 2,782 项核心语言测试。 除了 JavaScript 的参考...
Web开发辅助插件,集成二维码、常见的加密方法... Web开发辅助插件,集成地址栏url生成二维码,鼠标右键菜单增加自定义搜索引擎搜索选中文字 支持语言:English,中文 (简体)
这是WebKit KJS的Titanium Mobile分支。 所有更改都可以在Apache Public License(版本2)下获得。 要构建,首先运行WTF脚本,然后运行TiCore脚本。 生成的库以及来自WTF和JavaScriptCore项目(调试器/探查器/钛...
开发者自谦地表示他们的编程水平有限,可能意味着代码质量或设计可能不是最优,也提醒了使用者在遇到问题时需要有一些宽容和理解。此外,描述中没有提及具体的实现细节,但提到了可能存在错误,暗示使用者在部署或...
扢 语言:英语| 一个最小的,侧边栏,响应式Web设计Jekyll主题,专注于文本演示。 旨在帮助您轻松记录和共享知识。 目录 特征 已标记的帖子 可配置主题模式 双层类别 帖子的上次修改日期 ... 从RubyGems安装-易于更新...
如何打造仅1k大小的纯JS脚本3D玫瑰 源码,可直接运行
WebKit是一个开源项目,主要由KDE的KHTML修改而来并且包含了一些来自苹果公司的一些组件。 传统上,WebKit包含一个网页引擎WebCore和一个脚本引擎JavaScriptCore,它们分别对应的是KDE的KHTML和KJS。不过, 随着...
同时WebKit 也是苹果Mac OS X 系统引擎框架版本的名称,主要用于Safari,Dashboard,Mail 和其他一些Mac OS X 程序。WebKit 所包含的 WebCore 排版引擎和 JSCore 引擎来自于 KDE 的 KHTML 和 KJS,当年苹果比较了 ...
同时WebKit 也是苹果Mac OS X 系统引擎框架版本的名称,主要用于Safari,Dashboard,Mail 和其他一些Mac OS X 程序。WebKit 所包含的 WebCore 排版引擎和 JSCore 引擎来自于 KDE 的 KHTML 和 KJS,当年苹果比较了 ...
同时WebKit 也是苹果Mac OS X 系统引擎框架版本的名称,主要用于Safari,Dashboard,Mail 和其他一些Mac OS X 程序。WebKit 所包含的 WebCore 排版引擎和 JSCore 引擎来自于 KDE 的 KHTML 和 KJS,当年苹果比较了 ...
同时WebKit 也是苹果Mac OS X 系统引擎框架版本的名称,主要用于Safari,Dashboard,Mail 和其他一些Mac OS X 程序。WebKit 前身是 KDE 小组的 KHTML,WebKit 所包含的 WebCore 排版引擎和 JSCore 引擎来自于 KDE 的...
用于js中实现GBK编码。适合使用js进行页面参数传递时,给GBK编码页面传递参数,解决乱码问题。使用时直接引入,然后decode即可,示例如下: const GBK = require("gbk.js"); GBK.decode(data);
目的 这个项目的目的是帮助那些熟悉 JavaScript 生态系统但不想经历设置 JS13k 特定构建环境的麻烦的人更容易地构建项目。 这个项目的大部分是一个配置,它执行以下操作: 转译 TypeScript(如果有) ...