C# Cross Compiler (CSXC) getter和setter

2012年5月16日 没有评论

C#在语言层面支持Property,其实这是对getter/setter方法的语法糖,因此,CSXC支持把Property直接编译为getter/setter方法。比如以下C#代码:

private string _name;
public string Name
{
    get{ return _name; }
    set{ _name = value; }
}

会被编译成javascript代码:

_name: null,
getName: function () {
    return this._name;
},
setName: function (value) {
    this._name = value;
}

在CSXC中,会直接支持C#自动属性, 编译器会在javascript中自动生成一个成员变量,比如这样的C#代码:

public string Name{ get;set; }

会编译成:

__name: null,
getName: function () {
    return this.__name;
},
setName: function (value) {
    this.__name = value;
}

编译器自动生成了一个带双下划线的变量__name

分类: CSXC 标签:

C# Cross Compiler (CSXC) 使用特性(Attribute)处理一些特殊情况

2012年3月28日 没有评论

C#和javascript毕竟还是有区别的。比如$符号,在C#里面,如果用来定义方法或变量,这是一个非法字符,但在javascript里面,它被大量的使用。我采用Attribute来解决这类问题。比如下面的C#代码:

[ImportMember("$")]
public static JQueryInstance Select(string selector)
{
    ...
}

编译成javascript会生成

$: function(selector) {
   ...
}

另外,在javascript中有不少“全局”函数,比如eval(), 我们只能采取一些妥协的方法了,因为这个C#里面是非法的,我采用的是这样的代码:

[ImportClass(string.Empty, string.Empty)]
public class Global
{
    public static object Eval(string script)
    {
        ...
    }
}

那么在使用中,编写这样的C#代码:

Global.Eval(...);

会被编译成合法的javascript:

eval(...);
分类: CSXC 标签:

C# Cross Compiler (CSXC) (三) 方法

2012年3月2日 没有评论

在C#里面定义方法和在javascript非常类似:基本的要素是返回类型,方法名和参数列表。
如果有这样的C#代码:

public class Foo
{
   public int Add(int x, int y)
   {
        return x + y;
   }
   private int Sub(int x, int y)
   {
        return x - y;
   }
}

那么经过CSXC的编译,会产生如下的javascript代码(还是用webOS enyo做例子)

enyo.kind({
   name: "Foo",
   add: function(x, y) {
       return x + y;
   },
   sub: function(x, y) {
       return x - y;
   }
});

这里有一些问题要注意:
1. C#的方法会有public或其他的可见性,这在javascript里面是没有的,因此这些信息在生成的javascript文件中会丢失。但你在Visual Studio中使用CSXC写C#代码时,这些信息依然是有效的,因此我们有了一个额外的好处:javascript的class有了更好的封装性 – 只能调用类公有的方法。比如上一个例子中,sub是私有的方法,但如果你在直接编写javascript代码,那么没有人可以阻止你直接调用sub方法。但如果你在CSXC中写代码,编译器会阻止你这么干。
2. 强类型:可以看到在生成的javascript里面,参数,包括函数本身的返回类型都丢失了 — 因为javascript是弱类型语言。这个问题就好坏参半了,喜欢使用弱类型语言的人也许会抱怨 — 想上面的add方法,传数字进去就获得两数之和,给两个字符串就合并字符串, 而在CSXC里,传字符串变为不可能了。习惯C#/java之类语言的人会喜欢这个特性。

分类: CSXC 标签:

C# Cross Compiler (CSXC) (二) class

2012年2月17日 没有评论

C#是完全面向对象的语言,class(struct)是整个语言的基础,而javascript却不完全是,javascript的特性使它很灵活,但是在大规模开发的时候,却也带来不少问题。 好在大多流行的javascript框架都会为javascript引入类/命名空间的概念,虽然和C#不完全一样,但已经非常类似了。因此在CSXC中,我们把C# class的定义使用模板转换到特定的javascript框架中。举个例子,在webOS enyo框架中,kind(其实就是一种class,叫kind而已)是这样定义的:

enyo.kind({
    name: "kind名",
    kind: "基类名",

    ....
});

那么在C#中如果有这样的代码:

public class X : B
{
    ....//成员
}

我们可以将其交叉编译成:

enyo.kind({
    name: "X",
    kind: "B",

    ....//成员

});

CSXC在设计之初就希望能兼容各种不同的javascript框架, 因此在C#项目的Properties目录下会有一个template.xml, 在编译器遇到类声明的时候,会使用模板的定义来产生相应的javascript 代码。

分类: CSXC 标签:

C# Cross Compiler (CSXC) (一) 简介

2012年2月2日 没有评论

这次先介绍 CSXC 的工作原理, 下面是一个示意图。

首先,每个CSXC的项目本身是一个合法的C#项目(一般是一个Class Lib项目), 它应该能完全通过C#本身的编译(并生成一个Dll,这个Dll本身并不是用来运行的,它的作用后面再讲)。然后CSXC的编译器会启动,并重新扫描C#源文件,并根据一定的规则将C#代码翻译成javascript代码,并输出到相应的目录(一般为bin\Debug)。这个过程已经和VStudio做了整合,如果编译出错,将会在错误里面显示。

C#和javascript的语法有相似的地方,也有很大的不同,这些翻译的规则我会在以后的文章慢慢讲。在最终部署的时候,你只需将js文件部署到web服务器就可以了。

解释几个问题:

1. 输出的dll有什么用?

如果你写的是一个lib, 会被别人引用,那么你可以将js和dll同时交付,别人在开发的时候可以在CSXC项目(其实本质还是C#项目)的时候引用你的dll,这是他就可以获得很多只有在VStudio里面才能有的好处(智能感应等等)。而他在发布的时候只要将你的js和他的js一起部署,就可以了。

2. 如果想开发JQuery程序,应该怎么做?

你需要在你的项目引用JQuery的dll(这个dll是CSXC的一部分,目前还在开发中),然后编译你的代码。部署的时候将你的js和jquery的js一起部署到你的web服务器。就这么简单。

3. 可以在VStudio里面调试吗?

不行,编译器会把你的代码翻译成可读,清晰,与C#代码高度一致的js, 但无法跟踪调试。

 

 

分类: CSXC 标签:

C# Cross Compiler (CSXC)开篇

2012年1月30日 2 条评论

强类型语言(C#/Java)交叉编译成javascript已经不是一个新事物了,典型的代表有GWT(Java->js, Google), Script#(C#->js微软员工的开源项目)。前段时间一直在开发javascript项目,但是苦于没有好的IDE,始终觉得开发效率很低。考察了一些解决方案,都觉得不理想。我自己是一个.NET开发人员,对eclipse不熟悉,GWT就忽略了。Script#和微软自己的Ajax绑定的比较紧,虽说是开源的,但是其核心部分—C#源文件生成AST树/输出代码这部分却没有公开(在GitHub上只是一个dll),于是我有了自己打造一个交叉编译器的念头。碰巧的是,Microsoft在2011十月的时候公布了project Roslyn, 将C#/VB的编译器部分API公开了,使我省了很多力气(当然,由于是预览版,还有很多缺陷,使我的编译器目前也不是特别稳定,希望随着roslyn的版本更新,能让我的方案更加成熟)。

我会在接下来的系列中介绍这个编译器的原理以及使用。敬请期待。

如果你是webOS的开发人员,你可以到这里(http://code.google.com/p/rexstudio/downloads/list)获得Mojo和enyo的开发环境,来尝试一下CSXC(C# Cross Compiler)的能力。

使用方法:目前CSXC只能在VS2010上使用, 可以将C#4.0的代码编译成javascript. 将下载的VStudio项目模板放到C:\Users\<User Name>\Documents\Visual Studio 2010\Templates\ProjectTemplates\下,当你打开VStudio, 选择New project时,将会看到Mojo/Enyo的选项。项目建成后和平时使用一样,编译后将在bin下面生成目标js文件。

 

分类: CSXC 标签: