# CQuark **Repository Path**: flow119/CQuark ## Basic Information - **Project Name**: CQuark - **Description**: 2020.9.3迁移至TGit,备份一个月后删除本仓库 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2018-08-02 - **Last Updated**: 2020-12-18 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ## 西瓜 CQuark(西瓜) 是一个简单的C#语法的脚本解析器。可以用于Unity热更新。支持Windows,iOS,Android平台。 * 范例的开发环境是Unity3D(4.7.2) * 如果在非Unity3D环境下运行,直接删除Assets/_Unity文件夹和Demo文件夹即可。(从0.9.0版本开始协程机制修改,所有协程依赖MonoBehaviour,因此不再支持非Unity3D环境) * 西瓜的前身是疯光无线前辈写的C#LightEvil和自己曾经写的一个脚本语言。 西瓜的定位(如果你想使用西瓜,请务必理解): * 西瓜的设计初衷是为了提高开发效率(而非执行效率)、便于使用,西瓜的效率近似Lua,请不要拿西瓜的效率和AOT比较 * 西瓜的开发永远围绕着JIT的思想,因此,不会支持(也不需要)热更dll * C#的JIT编译器有很多成熟方案(比如CSharpCodeProvider)但西瓜是对Unity无缝连接的,出于效率和脚本书写规范化考虑,从0.9.0版本开始西瓜将依赖UnityEngine.MonoBehaviour。即:西瓜无法再在非Unity环境下运行。 项目最新地址: https://github.com/flow119/CQuark ## 免责声明 * 项目还在开发中(基本上1到2天更新1次),等稳定后请使用release版本。否则可能造成多种问题。 * 我不反对把西瓜用于商业产品,但是造成的问题我不承担任何责任。 ## 西瓜的优势 * 可以热更新。 * 纯C#语法,你不用去学lua了。 * 不像ILRuntime需要生成dll。如果你乐意,你直接拿.cs文件后缀改成.txt就能用。 * 因为新版本使用了Wrap机制,效率与Lua一样。(目前效率比Xlua高20%,GC与Xlua相同) ## TODO 下个版本 * 数组自动注册、支持List、Dictionary内嵌套数组 * Action和Func的泛型自动注册,支持delegate * 位运算符(<<,>>,&,|,^) * Attribute存下来(我个人的项目需要) * struct * 补充逻辑运算符的Wrap,补充T,T[],ref,out,List,IEnumurator等 下下个版本 * 参考ILRuntime和L#,看看西瓜还有哪些不足,补足缺陷 * 重写MonoBehaviour//参考ILRuntime * 1 如果父类继承MonoBehaviour,子类不写Update\Start等不会走父类的方法。 * 2 劫持GetComponent和AddComponent,重写。 ## 版本更新记录 2018-05-31 v1.1.0 增加一个Action的测试用例 发布release版本 2018-05-28 v1.0.4 修改了命名空间。现在和C#一样using System.Collections.Generic会同时using System和System.Collections 注册工具不再注册Queue和Stack,改为自动注册 一个括号优先级的问题(Vector3.up + Vector3.up).ToString()能正确解析了 2018-05-27 v1.0.3 支持命名空间 增加一个一键自动注册所有类型的工具(因为注册几乎没有开销,所以建议注册全部) 支持partial关键字 重构了编译部分的代码,看起来更优雅,使用起来更方便 2018-05-19 v1.0.2 修正一个优化效率造成的Action+=的错误 2018-05-05 v1.0.1 支持/*注释 Wrap对只有一个参数的函数处理简化了(不影响效率,只是美观一点) 2018-05-03 v1.0.0 完美的WrapMakerGUI工具 第一个Release版本 2018-04-22 v0.9.8 无装箱的西瓜!!! 所有数值类型和布尔类型都不会再装箱了,GC消耗和Xlua完全一样。 修复了一个类型转换的错误: float t = (int)3; t/2 返回了1(应该为1.5) 3/2+3/2返回了3(应该为2) 待我把注册功能和WrapMaker整理一下,近期将发布第一个release版本。 2018-04-21 v0.9.7 由于CQ_Value改为struct出现一些引用问题,修复以下情况: v += xxx, v[i] = xxx, v[i] += xxx 值没有赋回去 增加新的MakeIType(string keyword)。建议注册类型全部使用此方法(对于结构体,默认值不再是null) 以往的MakeIType(Type t, string keyword)依然保留,建议只有注册静态类才调用(静态类无法使用模板T) 2018-04-18 v0.9.6 感谢FixedList陪伴了我们那么久,这个版本把FixedList全部替换成了Array,节省了20/294k GC。效率也有提升 更进一步,new CQ_Value[]全部走对象池,节省150/270k GC 2018-04-16 v0.9.5 Expression_Value重构,现在会在编译时就把值创建出,节省30/324kGC Content里的stack>改成了stack和stack,由西瓜维护深度,节省70/394k GC 2018-04-13 v0.9.4 大部分List改为FixedList,节省10%GC CQ_Value改为struct,节省35%GC 2018-04-11 v0.9.3 新增数学运算(+-*/%)的Wrap 2018-04-10 v0.9.2 新增Index的Wrap 2018-04-09 v0.9.1 l RegistMethod被废除,方法不再需要注册,只需要注册所在的类即可。 Example用4.7.2重新开发。 2018-04-08 v0.9.0 调用协程的方式更加"C#"(yield return...)而不再是通过ICoroutine。 这意味着不再需要自己先注册一个协程函数来调用。 同时,这个版本开始西瓜的协程将完全依赖Unity的MonoBehaviour。这意味着无法在非Unity3D环境下运行。 (目前还不支持yield break来跳出协程) 2018-04-3 v0.8.5 WrapMaker可以完成大部分的工作(构造函数,get,set,静态方法,成员方法),效率大幅度提升 WrapMaker还不能做的事:ref,out,T,List,IEnumurator,Index[],op(加减乘除余比较) 2018-03-30 v0.8.4 增加了Wrap注册工具和模板,后期需要逐渐完善工具 和之前的西瓜相比,有了重大的提升 比较|旧版本|新版本 ----|------|------ 注册类|使用反射|使用Wrap,效率提高 注册方法|注册后使用委托|注册类时自动生成Wrap 未注册类|无法使用|自动反射 未注册方法|如果没注册过方法但注册了类则使用反射,否则不可用|自动反射 总结就是,注册的话效率比以前高,不注册的话以前不能用现在可以用了 2018-03-23 v0.8.3 增加了Wrap(目前只有几个模版,之后逐渐补充),调用Unity常用类将完全不需要反射 UnityWrap可以做以下事情:构造函数,调用成员函数,调用静态函数,获取静态变量 2018-03-22 v0.8.2 BugFix协程块里多个循环嵌套时中间break会导致作用域出错 CQ_Content里的调用堆栈信息全部进宏定义 数学运算不再使用Decimal,而是double,运算后转成需要的返回类型。速度会提升很多。(目前没想到有什么问题) 2018-03-21 v0.8.1 Update和FixedUpdate这样频繁调用的函数有特殊的调用方法,加快速度 CQ_Content里的string function只在宏定义(#CQURK_DEFINE)的时候用,减少GC 2018-03-20 v0.8.0 做了大量优化,运行速度提升40%,GC开销减少50%。(目前效率约是原生C#的1/4) 1:大部分List改成了Array,减少GC。 2:Time和Vector3里的静态变量或常量直接从一个字典里获取(比如Time.deltaTime,Vector3.up)等,加快速度 3:CQ_Content里的Stack和Dictionary默认值为null,只在赋值时创建。 由于几乎所有的函数都会new CQ_Content,这样可以节省极大的内存开销,减少GC并提高执行效率。 2018-03-18 v0.7.9 大量函数与类改了名字。 基于CQuarkBehaviour的类不再需要声明gameObject、transform等Unity的只读变量。 2018-03-14 v0.7.8 environment改名叫AppDomain,不再作为content的成员,只包含静态方法。 2018-03-13 v0.7.7 CQ_TokenParser改成了静态类,删除了ICQ_TokenParser。 environment里不再需要成员icq_tokenParser。 CQ_TokenParser将缓存所有编译的文本到一个字典。(可以手动清空以重新编译)。 env里不再存loger,改成用静态类DebugUtil。 Script改名为CQuarkClass,ScriptMono改名为CQuarkBehaviour 2017-10-10 v0.7.6 重新制作了范例。 类里的协程也能直接被调用。 完善了ScriptMono类,允许只编译单个脚本(string或者TextAsset都可以),详细见Demo07。 2017-10-09 v0.7.5 处理windows下用记事本写脚本会在开头出现一个不可解析的字符。 修正了带协程的循环中break逻辑错乱的问题。 完善注册类型(增加Queue和Stack支持)。 2017-09-22 v0.7.4 简化RegFunction函数。 2017-09-17 v0.7.3 新增switch case语法,支持switch case嵌套,但还不支持goto。 2017-09-15 v0.7.2 if后接else if无法解析的问题修复。 2017-09-14 v0.7.1 支持协程(Coroutine)。 增加ScriptMono(类似于MonoBehaviour)以及对应的Demo3。 ScriptMono增加Inspector(选择加载类型,重载文本按钮等)。 文件从StreamingAssets或Persistent目录加载(更接近热更方案)。 2017-09-13 v0.7.0 把cslightcore迁移过来,这个版本和cslight的0.64.1Beta完全一样。 Unity的Demo1(执行函数块)。 Unity的Demo2(从外部加载类并执行类里的函数)。 ## 特别鸣谢 疯光无线(李剑英) 没有他的CSLE的架构就没有西瓜 疯光无线的git: https://github.com/lightszero/ Jare(郭佳伟) 在我开发过程中提供了非常多的优化建议 Jare的git: https://github.com/jareguo/ ## 联系我 我的QQ:181664367 请注明是西瓜用户或者技术交流