Send As SMS

2005-04-27

Re: [Wang Zai Xiang] 学习函数式语言

Ideas on implements a haskell vm on JVM:

  • define a bytecode one base of STG, the haskell bytecode file has suffix as .klass or packaged in .kjar
  • the ghc provide a haskell to haskell bytecode(need to modify the ghc little)
  • a KVM now can load klass and execute it
    • KVM translate klass to java class
    • then it is runed on JVM
  • the ghc is compiled to ghc.kjar and can be loaded to compile source to klass and then execute via the KVM, in the case, we provide a interpreter mode.

mail真是个好东西

说实在的,从技术的层面上来看,mail真的是一个很好的技术载体,实际上,在以前的很多技术中,并没有充分的利用到mail的潜能,而从我对google的感知来看,google正越来越充分的发挥mail的潜能。

实际上,mail作为一种交流的载体,除了替代传统的mail(指非电子的邮件、包裹)之外,完全可以做很多的事情:

1、团队的日程、会议管理。(利用email作为通知载体)。实际上这个功能在很多协作软件中已经被使用。
2、BBS。将BBS和Mail相结合,我们可以使用强大的mail工具来收发BBS,而且可以让BBS具有更强的表述能力,包括附件、图片、RTF文档 格式等。要做一个新的BBS前端具有这么复杂的功能,并不是一个容易的事情。groups.google.com已经在这个方面走下去了。
3、内容管理。我觉得完全可以通过邮件的方式将内容发布到服务器上。为此,如果能够让邮件服务器在发送邮件的时候,再附带填写一个表单(定义一些结构化的信息)将是更好的。
4、个人的Blog。事实上,如果跟mail更紧密地结合,blog可以做得更好。在blog中,最关键的问题还是文档的构建,其实关于文档的管理反而并不是一个太复杂的技术。

还能用mail干什么呢?呵呵,理论上,还可以把mail和IM结合起来,在一个IM中可以发送mail给别人,在mail中则可以有更丰富的内容,包括图片、表单、动画,什么都可以阿。

学习函数式语言

最近,开始在学习一下函数式语言,主要是:
1. Lisp
2. Haskell
作为一个OO的程序员已经多年,思维模式基本上就是OO的了,在FunctionProgramming上,无论是概念上、思维模式上都会有很大的不同。 但实际上,在以前的很多工作中,FP的思想实际上在多个方面都有接触,最近在构思一种能够run在JVM上的FP语言,能够从更高的层面上解决问题,包括 在语言层面上对问题领域进行直接支持,而不是通过对象模型、API来进行扩展。这些问题领域包括:
1、对XML的支持和处理。当XML成为一种数据表示的标准之时,并且普遍应用到每一个角落之时(设置成为影响设计的一个关键因素),在语言中提供对 XML的支持是非常必要的。Ecmascript4Xml(E4X,已经在rhino1.6种实现),XJ(alphaworks.ibm.com), Comega等语言都希望XML成为语言的一等公民。
2、SQL支持。当应用是面向Database时,一种模式是ORmapping,包括EJB/Hibernate等等的框架度是在这个框架下进行发展 的。别扭的就是需要引入一个OQL。而EmbedSQL/sqlj/Comega等语言的模式则是试图在语言的层面上对SQL进行直接的支持。
在OO世界中,如果要匹配一个问题领域,标准的做法就是对其进行对象建模,提供一个对象化的API。这种模式的一个最大的问题是这种映射在某个层面上会导 致不一致性,就像XML的天然层次关系,反映到DOM中就复杂许多。SQL中的查询处理能力,无法简单的映射成为OO操作。在某个意义上让语言具有更强的 的扩展能力,从而具有更强的表达能力。

2005-04-22

ideas on LISP

LISP是数学的变成语言,虽然我对LISP还不熟悉,因此,有关的这些想法可能是幼稚的。

  1. 结合JVM的类型系统,在LISP中可以直接使用JVM的对象类型。
  2. 提供更为友好的交互式功能,包括可以查看函数的源代码。(可以格式化,以便更好阅读),与Smalltalk相比,LISP代码就是数据。应该充分的发挥这样的一个优点,提供最好的交互式开发支持。
  3. 传统的LISP是面向过程的,OO应该来说具有更好的描述能力。(message object message-name parameters) 就完全符合要求。
  4. LISP IDE,尤其是提供格式化及括号匹配的功能。可以采用颜色的方式来标记块。可以帮助阅读源代码。
  5. sql支持
  6. xml支持。
  7. regexp支持
  8. 强类型支持。在编译阶段进行类型确定。以下面的SQL为例,r 在编译阶段可以编译成为一个类型信息。apply执行,prepare编译时执行。
  9. js { name:" wangzx", age:30 }
    (object (name "wangzx") (age 30))
  10. js obj.name
    (get obj name) // 如果obj是强类型的,get在编译时就会对错误的类型报错。
  • [object message-name parameters]作为一种方言
  • (define se SQLEngine)
  • (define r ( message se '(select * from tblname where id = ,id) ) )
  • r.name --> (get r name)
  • r.method(args) ->(message r method args)
  • (new 'java.util.ArrayList)
一种另外的变体形式是:
  1. 支持.,其中 a.b 等效于 (field a b), a.(b c) 等效于 (invoke a b c),用于支持面向对象的操作原语
  2. 增加 """ 字符常量 """的词法, """ strings """总是被编译成为一个如下的List:(string-literal, expr1, expr2),其中,string-literal是把原有的 [aaa] 等替换成为 [$n],且相应的表达式作为 expr 存在。
  3. @sql """select * from tblname where id = [id]""" 的形式来支持SQL
  4. @xml """ ....""" 的形式来支持XML。在literal中的内容完全由xml负责解释。
以上的扩展基本上都无需改变LISP的语义,而更多的是一种语法的甜品,通过脱糖后可以转变成为普通的LISP执行。

2005-04-17

JSF1.2阅读

JSF最早出来的时候,我初略的看了看,由于不提供源代码,对其内部的执行机理还是不太理解。正好当时有Tapestry出来,感觉更符合自己的理解。所以一直对JSF缺少关注。

最近JSF1.2规范出来了,应该静下心来,看看这个东东到底有什么特色。
  1. 将原有的EL移植到了JSP规范中。javax.el新包,所有原来的EL处理现在都简化了。(在Tapestry中,则使用ognl作为表达式语言)
  2. JSF的生命周期比较复杂,相比之下,Tapestry的则要简单很多,大部分情况只有render/rewind两步。
  3. JSF的UIViewRoot和Tapestry的对象树很相似,Tapestry的更为简单一些。

2005-04-14

新的编程语言

软件开发人员总是在寻找适合于自己和任务的变成语言,最近的世界显得又开始热闹起来。

1、脚本语言
groovy在ruby, python之后,试图提供一个更为友好的适合于java的脚本语言。

2、编译语言
C-omega 微软研究院的,借鉴了很多的Nice、XJ等语言的优势,试图提供更好的XML/SQL等支持。在数据结构上提供更为灵活的支持。
Nice 一个Java上的改进。

我个人对基于Smalltalk的脚本语言比较有兴趣。SmallTalk的脚本,被编译成为SmallTalk字节码,这些字节码在执行时,可以再次编译成为jvm bytecode执行。
  1. 一 个SmallTalk对象被直接表述为Java对象,可以包含字段。相应的方法被编译成为将参数传递给 SmallTalkMethod 对象。一个SmallTalkMethod是根据Smalltalk字节码编译的一个JVM类。在Smalltalk中需要调用对象的某个方法时,总是首 先取得这个SmallTalkMethod,然后直接执行它。在SmallTalk中的所有Java对象被报纸成为一个SmallTalk对象。
  2. 当SmallTalk类更新时,只要没有增加新的字段,是容许的。可以增加新的方法。
  3. 增加新的字段:原有的对象中的这些字段是动态方式访问的。但新创建的对象则通过静态方式使用这些字段。

2005-04-12

Client side javascript

最近在忙着张罗游行和抵制日货的事情,好久没有写点东西了。

AJAX在不远的将来将成为热点的技术,看来是愈来愈厉害了,但在这方面还是缺少一个杀手级的框架出来。能够出来一个opensource的Ajax框架,才会更好的帮助Ajax成长。

两个想法:
  1. javascript class model
    • javascript是基于prototype的面向对象语言,虽然足够的灵活,但基于class的OO技术已经深入到每一个程序员的头脑,因此有必要在javascript上建立一个模拟class的模式,支持定义class/method的模式。
    • 目前,包括smallclient,bindows等框架都定义了自己的class model。实际上,在prototype的基础上定义class倒也不是一件很复杂的任务。
  2. DOM javascript model
    • 在DHTML中通过DOM来访问页面,但DOM却并不是一个简单、好用的API。比如说table=doc.documentFactory.createElement("table")这样的写法就不如 table = new Table() 这么简洁了。
    • 如果定义一套适合于javascript的DOM类,可以大大的简化dhtml的开发工作。
    • 可以参考JDOM的模式,a = html.Element.create("a", { href: value, target: value })
    • div.append(a) 只对DOM做简单封装。
http://prototype.conio.net/ 一个非常简单的AJax库
http://judelib.sourceforge.net/ 一个DOM操作的库

构想的代码片断:
recordset = {
totalRecords : 100,
totalPages: 10,
recordsPerPage: 10,
currentPage: 3,
records: [
{ /*r1*/ }, {/*r2*/}
],
FieldDefs: [
{ label: "...",
css: ,
functor:
},
]
}

在服务器上返回这个JSON,在浏览器上,根据这个结果,生成一个Table。

组件: database.Table
{ setDataModel: function() } 根据 dataModel来产生一个Table
组件:database.Form 根据model来产生一个Form,即可显示,也可输入

在Table中支持多选:增加一个列(函数定义),当选中时,DataModel的值进行变化,在删除按钮的事件处理中,可以读这个Model中的值。

所以比较关键的是定义出一个好的DataModel。采用数据驱动的概念来进行开发。

2005-04-06

ideas on a new script language

The language should define a very basic lexical grammar.
  1. Lexical Block
    1. """ any string literal """ that is not escaped
    2. " string support escape "
    3. xml block (no prefix spaces)
    4. ( ) block
    5. [ ] block
    6. { } block
    7. other block is seperated by space, tab and cr/lf in token
    8. two seperator: , ; which cant used as part of token
  2. Data type definition
    1. string literal
    2. position(x y)
  3. core dialect
    1. class/field/method
    2. @var $var %var variable reference
  4. SQL dialect
    1. #sql(select * from table1 where field1 = "hello")
    2. #sql select * from table1 where field1 = @var;
  5. dialect
    1. in the core dialect, using #dialect(statement), each dialect is coded as #id object
like LISP but more free.

process flow:
source -> token tree ->(core dialect process) -> objects tree ->(other dialect process) object tree -> (till all precompile complete) -> executable object tree

simple code

class Demo {

function hello() {
prints "hello world";
}

function accessDB(){
%mytable = #sql ( select * from mytable where fid = @fid);
prints "name = $(mytable.fid)"
}

}

How does it works?

How about a new script language?

Programmer would like to choose a tool suit for him. and it looks almost everybody hopes new feature for a given language, there is no language that satify everybody.

for me, I would like a script language with the following feature:
  1. support XML in grammar, like E4X or XJ from IBM. and treat XML as a primary data type.
    1. XML data in literal format
    2. XML operator like E4X, including XPath support
  2. support closures, like groovy, smalltalk etc. although javascript support the idea, but no well as provide closures support in grammar.
  3. Dialect support. most feature can be oganized in dialect, and added to the language standalone.
  4. support embeded SQL via extension. I dont want the language support embeded sql directly, but hope it provide an extension mechanism, so we can declare a embeded SQL dialect.
  5. stronger data type, include primitive data type, xml, array, hash, tuple and etc. also, via the dialect support, we can declare new datatype such as complex, position etc.
  6. define a bytecode, the sourcecode can represeted as bytecode which is data also. like smalltalk or Lisp. support dynamic process on code itself.
In mostly, i think the better match is smalltalk. in smalltalk, everything is object, including the class, the method, even the vm itself.

Ideas on tapestry

Tapestry is a good framework for WEB presentation, It provide a server-side presentation framework in a component based architecture. Tapestry3.0 is currently stable to use in a realy web appication.

For my experience, Tapestry is still something complex for the starter to learn, but if you would just the simple functions which is already stronger than Struts, i think 2-3days is enough.

Also, i think the Tapestry framework should involved in the following:
  1. Simplify the component definition. Although the (POJO + XML Descriptor) model runs, i think a purely POJO component model(without XML, or by using Java5 annotation) will be more easily. also, It should make component develop follows the java style, such as support component inherit. (as a compatable option, a tool can used to generate the XML descriptor. )
  2. ognl is used as internal java-bean-path language, that works well but still not enough for big enterprise application, because ognl is not strong typed, and any error cant find till runtime. so i would like to introduce 2 other method. one is java:a.b.c which should be static checkable, and the error can be find on a precheck mode. or xpath:xml-path-expr format which enable access XML using xpath.
  3. a Tapestry page is shared for multi-client and multi-request, this makes the tapestry page 's DOM structure(or the component-tree) is static. in some cases, it makes dynamic web appication difficult. so i think Tapstry should enable for dynamic Component tree. that require more memory but provide a clear design.
  4. Tapestry is originaly design as Server-side presentation framework, although it provide some javascript support but it is really poor. Rich-client is the trend of WEB, and i would like to see a rich client based subproject to coorpate with server side framework. aka, to integrate the AJAX into tapestry.

2005-04-05

将以前的ETL方面的一些想法记录下来

在前些时间,我曾经就开发ETL工具,进行了一些构思。遗憾的是,最终这个工具未能成行。接下来的一些时间里,我会把这些相关的文档、想法总结一下,记录下来。

2005-04-04

看看普元的概念

普元的构件概念,抛去包装,看看又拿一些本质的东西,是soja可以关注的。

工作流、数据流

软件开发的本质就是控制流和数据流。在传统的过程开发模式中,我们以控制流为驱动,但在设计时仍然强调“数据流”分析,使用数据流带动控制流。在OO的世界中,虽然我们一直在强调对象,但更多的仍然是控制对象,在一定的程度上反而轻视了数据对象的作用。

工 作流引擎试图把流程本身作为一种数据,通过可视化的模式来定义一个流程,并提高流程的可变更能力。普遍的工作流引擎充当着一种更高层次的脚本语言的粘合 作用,通过把一些更为基础的逻辑部件以流程的形式串联在一起,从而将基本逻辑单元和处理流程进行分离。并提供给用户一个更好的开发模式:更为可视化。同 时,将流程独立出来也带来了更好的管理能力。

在更多的应用模式中,数据流实际上是更本质的东西,控制流的最终目的是处理数据。而且数据的概念在各个层面上获得扩充,数据库的数据、XML报文,甚至一些控制数据,本身都可以作为数据流的对象。数据流模式与MDA等最新理验是一脉相承的。

个人认为,后续的开发框架、开发工具都会围绕数据流、控制流的概念来做文章,提高软件的开发效率:
  1. 将控制流与处理组件进行隔离,把控制流作为一个独立的组件
  2. 提供可视化的设计环境,设计或者阅读一个工作流。
  3. 集成数据流的处理,使用XML以及类型化的XML来表示数据以及与控制流的交换。在控制流中结合数据流将提供最大的可维护性。
一些想法是:
  1. 定义一个控制流的语言,具有更为良好的数据表示(便于可视化设计),可以使用XML的形式,但基于传统的语法制导的形式也未尝不可。
  2. 提供较强的数据表达能力。对XML而言,就应当支持schema的使用。在流程中,可以使用XPATH类似的语言来读写数据。在这种模式下,通过全局/局部的数据来作为数据总线。当然数据流也支持一种更为局部的数据:流动数据。这些数据仅在两个组件之间传递,而从不共享。
  3. 与笔者以前构想的ETL工具相似,XML建模,以Model为基础,再结合GUI和开发工具的辅助。

2005-04-03

XJ: enable XML for Java

一个有意思的新技术,容许在Java中直接操作XML。应该是一个跟E4X相似的东西。

通过API来访问XML是一种方式,但当XML越来越重要的时候,可能就会成为更多语言语法的一部分了。集成在语言中,可以充分利用语法及编译器带来的便利,包括利用编译器来发现简单的错误,更好的提高程序的鲁棒性。

值得学习学习。

另外,eclipse-3.1M6又出来了,赶快试用试用。