已经决定半年后继续这个项目.
JavaScript同步调用异步的处理方式也确定了下来.
主要原理就是当同步函数调用异步函数时,
异步函数将返回一个Parallet对象.
同步函数可以用该对象查询状态,响应结束时间,得到返回值或异常信息.
而用JavaScript实现Parallet, 为了针对JavaScript的特点, 语法规则也会大幅度改变. 尽量兼容现有的JS语法, 方便开发者入门.
number类型是否允许为null, 的确是很头疼的问题.
Parallet的目标是脚本语言. (但它也可预先编译代码)
很多脚本语言的所有类型都允许为null的.
但是为了让number为null, 要付出的代价实在是太大了.
就按我的经验, number需要为null的情况, 非常非常少.
如果某些场合需要允许传递null, 大不了可以定义参数为var便可.
(虽然那样的话允许传递任何类型)
-
现在DotNet的版本依然有很多工作.
考虑到最近实在太忙, 这样进展太慢也不是办法.
-
Parallet要发展起来, 必须需要实在的项目用来支持它.
我是打算实现了DotNet的版本后, 先做一个P2P的项目用来验证, 然后再推出Web框架.
但是这个过程太漫长了.
现在HTML5太流行, JavaScript的不足和进展缓慢让人很遗憾..
就在自己的需求角度来看, 值得先在JavaScript上实现Parallet.
在JavaScript上实现Parallet, 将会对Parallet有以下好处:
1 - 可在主流浏览器上运行, 用于补充JS的不足, 可建立更强的HTML/AJAX应用.
2 - 可直接在V8引擎上,配合C/C++, 实现任何非HTML应用.
3 - Parallet它自身不需要考虑JIT. 只需要解释执行或编译成JS即可.
这个特征可以完全兼容不JIT的浏览器/设备, 如果浏览器/设备支持JIT后, Parallet直接得到好处.
4 - 可以用作移动设备的开发. 例如IPHONE.
只要我自己也用Parallet, 让它为我带来好处, 那么即使它进度再慢, 也不会被放弃掉.
-
现在要实现JS版本的Parallet, 唯一的设计难点就是同步函数的问题.
Parallet默认是异步函数. 但是在JS上实现的话, 需要非常紧密地与JS/DOM进行交互.
JS/DOM的函数是同步的. 这样就有兼容性问题. 简单来说, 就是
btn.onclick=MyParalletFunction;
由于MyParalletFunction是异步的,
那么MyParalletFunction里的逻辑, 异步执行时, onclick的event就会失效.
并且也不能给onclick指定返回值.
要解决这个问题, 可能需要强制引入关键字 synchronous:
synchronous function MyParalletFunction(event)
{
return false;
}
定义了synchronous的函数, 是'显式'的, 是不允许调用任何异步函数的.
它只能调用显式或隐式的synchronous函数.
如果它调用的隐式synchronous函数, 因为修改代码自动变成异步函数,
那么新的代码将产生编译错误, 用来保证程序员明确知道如何处理.
目前还有很多细节没做完. 说道一些细节, 如果没有写下来, 没有写成文档, 甚至是'规范', 有时我自己也会忘记某些细节的实现规则如何..
所以, 看来还是有必要继续在当前版本下点功夫, 然后一点一滴, 把细节搞定先. 这样, 有了一个规范, 才能让这个语言不变得模棱两可.
--
另外, 在重构DotNet版本之前, 我还想先去JVM那边做一个版本出来验证一下先.. 毕竟现在基于JVM的语言还是挺火的.
如果Parallet推出JVM版本, 未尝不是一件X事.
代码来源于 http://www.cnblogs.com/miloyip/archive/2010/07/07/languages_brawl_GI.html
在我的电脑上, C#_ref那个测得52秒, 而用Parallet解释执行, 则需要1350秒, 是C#的26倍时间.
由于编译执行没完全做好, 所以就还没做编译执行的测试.
C#的26倍时间, 和LUA差不多了, 比我想象中好很多, 毕竟LUA是C写的而且传说还用了CPU寄存器做卖点..
比起ChromeJS,也只相差5倍而已, 比之前差70倍的数学测试要好不少.
下一次等编译执行搞定后, 再来测试一下.
(备注:如果采用多线程并发模式, 则只需要575秒. CPU是双核+超线程, 超线程平均可提供额外30%的性能)
很简单的fibonacci数列性能测试.
C++用int,C#用int, Parallet用double,
int Fib(int a)
{
if(a<2)
return a;
return Fib(a-1)+Fib(a-2);
}
Fib(40) 所需时间分别为
C++ : 1500
C# : 1400
Parallet : 1750
C#竟然比C++快?
这个结果让我对在C++上实现Parallet的欲望减少了不少..
Parallet的第一版的任务是先把DotNet上的实现做好.
然后再考虑搞到Mono去, 然后才是JVM上, 然后才到C++..

