深入 Script# System(1)
深入 Script#,我们分两部分第一就是现在的这个翻译ScriptSharp.pdf里面的A Deeper Look at the Script# System部分(它一共有58页现在已经翻译到38页拉),而第二部分是我自己写的一些测试Script#特性的代码,和一些自己的理解,资料和大家分享(还在准备中).
Script#在这篇中主要就是介绍Script#工作原理,如何使用Script#,Scriptlet和一些功能上限制.我将我阅读时认为重要的部分都用蓝色部分提示出来,希望能帮助阅读.
Script# 入门
黑...谢谢关注..
有什么不好的地方请指正;
How Script# Works
Scritp#工作原理是将C#源代码转换成JavaScript.为了做到这一点,它会编译你的C#代码像一个真实的C#编译器一样.除你的.CS源文件外,它还能消化掉一个assemblies的集合,在这个集合里面包括关于你导入的namespaces和类型的metadata,假定这些assemblies已经转换相应的JavaScript文件放入在你的配置好的应用程序中,你除使用Script#编译器外,你还能运行规则的C#编译器验证C#代码和产生一个assembly为在未来的工程中使用.实际上,Script#编译器采取方式是你在编译你的代码时,将通过C#编译器来验证C#代码.
当作者写代码后被编译成JavaScript时,很重要的的就是引用sscorlib.dll代替通常C# project中的mscorlib.dll,sscorlib.dll提供定义.net关键字类型如System.Object,简单类型和其他的核心(core) BCL类型,使一个C# project能避免依赖于mscorlib.dll中所使用的 /nostdlib选项调用CSC.exe命令行,并在.csproj工程文件(.csproj project file)设置NoStdlib属性为True.Script#安装提供一个工程模版,已经将工程设置完好.
Components and Layers
逻辑上说有三个components或者Script# Systems中的layers(层次)来说:the compiler, the core runtime, and the framework.
Script# compiler 和 Script# core runtime是结合比其他的更紧密些,在编译器编译C#代码为对象类型系统(target type system)和基本类库(base class library)是通过 Script# core runtime来定义.
这个core runtime被提供于sscorlib.dll中, sscorlib.dll必须被引入C# projects.这时它相当于Script,sscorlib.js必须被引用到Web application中.C# projects中需要被翻译成Script,将不用引用mscorlib.dll.而是引用sscorlib.dll,它会提供相当于在System namespace中的关键类型如Object,Int32,String,Array,Type等,协调达到Script的运行环境要求.还结合Script文件扩展JavaScirpt核心类型集如String,Number,Function等,所以他们提供C#的APIs的模型或.NET programmer的期盼.
除此sscorlib.dll外,Script#提供还包括其他的assemblies如sswpfe.dll.之后者提供metadata,需要程序安装WPF/E浏览器插件才能授权与Meida和矢量图相互兼容.
Script# Framework 提供高级概念和抽象,为制造应用程序者提供更好的生产力,并且提供结构UI代码和为HTML DOM追加更好的功能使其有更的充足的管理能力,Script# framework他自己遵循一个有层次结构的设计模型.它由一个Core(ssfx.Core.dll)组成来提供与一些关键功能性的兼容,如一个应用程序类,Script loading,networking stack,JSON serialization和其他的用于通常应用程序的关键特性,这些关键特性包括共同的UI概念如Controls,Behaviors,animations和drag/drop是需要与UI Components相结合或其它.在上面的核心framework是很多独立的组件如Form controls包括AutoComplete功能(ssfx.UI.Forms.dll),一个实现corss-domain AJAX使用JSON,JSONP和script元素(ssfxSDAJAX.dll)和Reflection(ssfx.Reflection.dll).
每一个assmebly被结合一个JavaScript文件.assemblies常在编辑时被使用.JavaScript文件被发送到浏览器上,在运行环境中使用.
编译器和core runtime是不管怎样都会完全被Script# framework减弱.结果,它完全可能在使用Script#时不用(buying into)买入framework的空闲(it is entirely possible to use Script# without buying into the rest of the framework ),这个尤其使用在如果你已经有一个可选的framework设计,你想要的实现或已经是唯一的需求.
Script Runtime Choice
Script#编译器能被使用在两个运行环境中的一个.
sscorlib:这个assembly是选择的本地script运行环境,是为Script#详细的设计.它提供一个类型系统,BCL-like extensions到本地Script对象,更好的运行环境APIs支持各种编译特性.这受权最好的C#开发体验.和结合framework APIs.
aacorlib:这个assembly是一个被整理的下一个sscorlib版本能使用Microsoft ASP.NET AJAX runtime.它是sscorlib的子集.当使用aacorlib一些编译器特性被关闭,使用Microsoft ASP.NET AJAX的子部分来提供达到sscorlib的功能.
Using Script#
Script#编译器能使用Command-line运行ssc.exe或者间接使用msbuild绑定到.csproj.在前者,.csproj包括一个引用Scrip#的 msbuild.targets文件(nStuff.ScriptSharp.targets),还包括引用Script# msbuild的响应调用Scirpt#编译器程序的任务.
推荐你使用msbuild方法,它比使用ssc.exe直接,这样提供了在Visual Studio IDE中C# project的全部好处.
Script Components and Libraries
你能选择创建一个Script# Class Library 工程在最终这些script将被使用在各种应用程序中(eg: a Grid component, or a Clock control ).在这个模式中,最终的script文件(relesae和debug)被在的Script# 编译器编译放进应用程序中,并且将最终的assembly用C#编译器编译被包括在其他的Script#工程中.
Component developers 是被鼓励分布产生script文件,还要.NET assembly和结合doc-comment文件. .NET assembly提供包括一个引用的metadata,所以用户在Script#能写和编译他们的应用程序和Components.XML doc-comments被代码编辑器引擎在Visual Studio中使用去增强intellisense 的体验.
产生Script代码能被JavaScript hand-coded所引用,来于其他的Components被编译使用Script#,或者包括进入ASP.NET服务控件为实现他们client-side功能,Script#能在上面这些场景中使用.这个使用Script#的模型提供最大灵活性以后产生script能被任何管理者使用.更详细的能使用它来创建framework,还有重新发布能插入这些framework 的Components.
一个assembly预定使用Script#需要有一个ScriptAssembly metadata 属性.Script Components和libraries将包括以下metadata
[assembly: ScriptAssembly]
而Script#的安装提供Script# Class Library project template,能被使用快速开始开发Components and Libraries,这个工程包括引用一个sscorlib.dll和配置NoStdLib属性(property )为true,自动避免包含mscorlib.dll.你能添加引用到其他的Script# assemblies(有两中一种是运载Script#,或定制Script#或定制你在开发中的或已经开发完成的.)(both the ones the ship with Script#, or custom ones you’ve developed or acquired),标准的就是在Visual Studio 中Add Reference对话框.这个模版还包括assembly metadata属性.
Script# Framework 是将写好的C#并编译成一个assemblies集( ssfx.*.dll)再使用C#编译和结合Script 文件的集(ssfx.*.js and ssfx.*.debug.js ) 使用Script#编译器.
Scriptlets
Scriptlets是相当于是一个执行程序.他们使用来为一个Web页面实现code-behind.不像Components和Script libraries,scriptlets通常使用
来详细描述一个细致页面,并常工作于直接面对页面上的HTML element并且他们是结合在一起的.
在具体的程序术语中,一个Scriptlet是一个有public static Main方法的类.这样结构和Scriptlet的结构又一点不同的,Scriptlet更胜于获取到一个字符串的数组参数,一个Scriptlet允许在更高级的场景中接受任何一个参数的字典(a Dictionary of parameters ),或一个ScriptletArguments的实例,它实质就是一个字典,但提供强类型.
当一个Scriptlet能容易的在任何HTML页面上使用,它尤其更为吻合于ASP.NET场景,一个Scriptlet server control允许你使用C#实现你的client-side code-behind,当然是动态转换成JavaScript,还有提供很多其他的便利.
如事例,这儿是一个Scriptlet control的事例:
<Arguments> <ssfx:StringLiteral Name="requestURLFormat" Value="Hello.ashx?name={0}" /> </Arguments>
<References>
<ssfx:AssemblyReference Name="sscorlib" /> <ssfx:AssemblyReference Name="ssfx.Core" /> </References> <Code> </Code> </ssfx:Scriptlet>
Scriptlet Server Control提供一个设计时体验,允许编辑C#代码时intellisense 和其他规则的C#编辑器的表现一样的形式,还在运行页面前能编译和检测代码错误.
Scriptlet还产生一些样板代码去解套(bootstrap)你的代码按照在Reference collection中相应的引用清单来加载的Script.
Scriptlet能手动的包括在任意HTML页面上的.他们能被预编译进入一个script assembly并且相应产生Script被包含在页面里面.这个产生boilerplate bootstrapping script能被手动的包括进入页面.
Limitations
C# Limitations
Script#没想要占领现有的C#应用程序,并且转换它成为script之后运行在浏览器内.它没企图去为.NET framework提供一个script实现(如像Windows Forms或实体 BCL).没有去做一个详细的scripting运行环境.Script#目标是实现在.NET Framework 2.0 C#语言的子集,但这个主要看法就是Script#是非常好的Script环境,但对于一个管理者的好处是来于覆盖最好的工具和authoring的支持.
如下是不支持C#结构的集合:
(1)所有类型都属于一个namespace.嵌套类型不允许.
(2) 嵌套namespace声明不被允许.取代的是你必须声明namespace的某一个位置.
(3)"System" namespace只能使用于重要的本地类型的scripttable对象或现有script类型.
(4)保留关键字集不能被使用在Script#中,不只包括C#的保留关键字,还有JavaScript的关键字.
(5)结构体可能只有一个constructor和一些fields,方法和属性他们不被允许.
(6)指针类型不允许
(7)除重要类型外支持Method和constructor的overloads,其他的都不能支持.
(8)Destructors, operators 和object的转换不支持
(9)Enumeration fields必须是一个清楚的(赋值)value.
(10)Set-only属性不支持.
(11)在成员中"new"修饰符不支持
(12)Throw 状态必须被结合一个明确的对象.
(13)不支持的statements: goto, using scope statement, lock/unlock, and yield.
(15)不支持 expressions: sizeof, fixed, stackalloc, and default value.
这些限制清单没有提到应用于创建 System assemblies. System assemblies 的问题被理论上的overview所掩盖,并且在后面会有更深的讨论.
除这些限制外,还有将渴望在未来支持的特性:
(1)你不能指定namespaced-qualified的类型名.如在工作区你能使用混合表现形式(using Foo = SomeNamespace.SomeType; )
(2)泛性
(3)支持ref,out和params修饰符
(4)还有其他各种的好特性(to be documented)
JavaScript Limitations
(1)支持Closures的限制
Closures被使用在一些场景中.他们能被用来定义类,和实现封装成员变量和实现prvate类.当能访问在当前外部范围的data/variables时.他们还能被用来执行callback方法, 当Script#支持第二个场景使用匿名的delegates时,第一个场景不支持.产生类型不使用closures实现他们.取代的是Script#类型使用更多自然的JavaScript prototype-based 模型来实现.
(2)Functional Programming
Scrpt#提供一个OOP-style使用C#,并且不提供更多的 Functional编程style,但在另一面当工作在JavaScript时Functional编程可以被使用的.Script#支持functional programming如array理解使用delegates机制,就是函数能通过像参数样的指向各种APIs.
(3)Global Methods
script 引擎提供Global Methods集.C#根本就没有这个概念.有趣的Global Methods集并结合功能已经表现成静态的各种类如System.Script.Script#允许产生Global Methods.
(4)Identifier Characters
JavaScript允许使用"$"标识符.这个不支持C#,实际决定制造产生一个"$",是为在产生标识符名时确保他们没和你自己的标识符产生冲突.
你看到的限制会有最小的影响,这些限制将不会影响你实现Ajax 场景的程序,或和DOM最完整的兼容.
-----------------worksguo--