fastCSharp代码生成器发布

showjim 2012-12-04 02:34:21
由于两个ACM题花了差不多两个星期的时间,拖延了代码生成器的发布(下载)。
不过通过这段时间的折腾,对于C#细节优化有了更多的了解。知道了结构体数组元素赋值写个Set函数比=new要好,知道了静态字段的访问和引用成员字段访问一样低效(相对于堆栈访问),知道了临时变量的数量必须要自己控制(C#编译器的寄存器优化并不智能),知道了小函数内联是靠不住的,更加的重视非安全数组元素的访问次数了...

还是回到正题,上个月准备讨论一下代码生成器重新实现的问题,没有什么反馈,所以还是按照我以前的方案重写代码。我简单的说一下方案实现的原理与过程。
1、在需要代码生成功能的项目属性的后期生成事件中执行命令调用带参的fastCSharp.exe,代码生成器是基于.net元数据的,所以需要程序集相关信息:
if exist D:\fastCSharp\bin\Release\fastCSharp.exe D:\fastCSharp\bin\Release\fastCSharp.exe $(ProjectName) $(ProjectDir) $(TargetPath) $(TargetName)

ProjectName 是项目名称,预留字段
ProjectDir 是项目路径,用于查找或读写.cs程序文件
TargetPath 是程序集完整文件名,用于读取.NET元数据信息
TargetName 默认命名空间,用于生成目标文件命名,比如TargetName=fastCSharp,那么生成的代码文件名为fastCSharp.cSharper.cs
2、fastCSharp.exe找到所有继承自fastCSharp.setup.IAuto的类,读取其自定义属性配置fastCSharp.setup.auto,按照依赖关系fastCSharp.setup.auto.DependType拓扑排序,然后依次使用反射调用fastCSharp.setup.IAuto.Run。
                    list<keyValue<Type, setup.auto>> autos = setup.ui.CurrentAssembly.GetTypes()
.getFind(type => !type.IsInterface && !type.IsAbstract && type.isInterface(typeof(setup.IAuto)))
.getArray(type => new keyValue<Type, setup.auto>(type, type.customAttribute<setup.auto>(false)))
.getFind(value => value.Value != null && value.Value.IsSetup && value.Value.IsAuto);
setup.ui.Setup(autos, parameter, false);

当前版本的fastCSharp.exe有4个继承自fastCSharp.setup.IAuto的类:
fastCSharp.setup.cSharp.coder.cSharp是C#代码生成器的核心,它读取并解析所有程序模板并生成中间代码fastCSharp.cSharper.cs,fastCSharp.cSharper.cs就是一个字符串拼接程序。
                        string[] codes = parameter.Types.getArray(type => new definition { Type = type, Auto = type.customAttribute<auto>(false) })
.getFind(type => type.Auto != null && type.Auto.IsSetup && type.Auto.DependType == typeof(cSharper))
.getArray(type => type.ToString());

fastCSharp.setup.cSharp.ajax.cSharp是一个JSON处理代码生成实例的数据视图,其配套的程序模板是fastCSharp.setup.cSharp.template.ajax,自定义属性配置是fastCSharp.setup.cSharp.ajax。
fastCSharp.setup.cSharp.simpleTemplate是一个简单的自定义模板解析程序(与.NET元数据无关),比如template目录下的程序模板。
fastCSharp.setup.test用于简单的编译时单元测试。
3、代码生成实例的运行,比如fastCSharp.setup.cSharp.ajax.cSharp,它继承自fastCSharp.setup.IAuto,所以会被fastCSharp.exe默认调用。它会读取程序集TargetPath的元数据信息,获取所有标记自定义属性[fastCSharp.setup.cSharp.ajax]的类,读取其字段与属性信息生成最终的目标程序。
                    keyValue<Type, ajax>[] ajaxs = parameter.Types
.getArray(type => new keyValue<Type, ajax>(type, type.customAttribute<ajax>(false)))
.getFindArray(ajax => ajax.Value != null && ajax.Value.IsSetup);
foreach (keyValue<Type, ajax> ajax in ajaxs)
{
type = ajax.Key;
Attribute = ajax.Value;
UnknownToJsonType = ajax.Value.UnknownToJson != null && ajax.Value.UnknownToJson.isInterface(typeof(IUnknownToJson)) ? (memberType)ajax.Value.UnknownToJson : null;
UnknownParseJsonType = ajax.Value.UnknownParseJson != null && ajax.Value.UnknownParseJson.isInterface(typeof(IUnknownParseJson)) ? (memberType)ajax.Value.UnknownParseJson : null;
Members = setup.memberInfo.GetMembers<ajax>(ajax.Key, setup.memberInfo.filter.PublicInstance, false, true);
if (Attribute.IsToJson) memberMap.create(ajax.Key);
if (Attribute.IsParseJson && !ajax.Key.isNull()) copy.create(ajax.Key);
create(true);
}


写一个代码生成器实例有3个部分:
1、自定义属性,必须继承自fastCSharp.setup.ignore,比如fastCSharp.setup.cSharp.ajax,用于配置描述。不需要描述的也必须要定义一个空壳,用于识别代码生成类型。
2、数据视图,必须继承自fastCSharp.setup.cSharp.cSharper用于表示该实例,可选继承自fastCSharp.setup.IAuto用于编译时自动调用。比如fastCSharp.setup.cSharp.ajax.cSharp的主要数据成员是Members。
3、程序模板,比如fastCSharp.setup.cSharp.template.ajax,现在支持11种标识fastCSharp.setup.template.command,与旧版本的标识稍有不同。
...全文
500 1 打赏 收藏 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
事理 2012-12-05
  • 打赏
  • 举报
回复
lz辛苦,谢谢分享。
内容概要:本文围绕基于物理场的动态模式分解(piDMD)展开研究,重点探讨其在流体力学、热传导及多物理耦合系统中的建模与应用。通过Matlab代码实现,将传统的动态模式分解(DMD)方法与物理场控制方程相结合,引入物理约束以增强数据驱动模型的物理一致性,从而提升对复杂非线性系统的模态提取精度与长期预测能力。文章系统阐述了piDMD的理论基础、数学推导过程与算法实现步骤,并结合典型物理场仿真案例(如Navier-Stokes方程驱动的流场演化)进行验证,展示了其在降阶建模、主导模态识别和时空动态可视化方面的优越性能,适用于高维、强耦合、非平稳系统的分析与优化。; 适合人群:具备一定数值计算、流体力学、控制理论或数据驱动建模背景,熟悉Matlab编程与线性代数运算,从事科学研究、工程仿真或系统辨识工作的研究生、科研人员及工程师。; 使用场景及目标:①实现对流场、温度场等物理场的高效降阶建模与动态行为预测;②提取符合物理规律的关键模态,用于系统稳定性分析与控制设计;③支撑复杂系统的状态估计、异常检测与优化调控等下游任务。; 阅读建议:建议读者结合提供的Matlab代码逐行调试与运行,深入理解piDMD算法中物理约束的嵌入方式及其对模态质量的影响,同时可尝试将其迁移至其他偏微分方程描述的物理系统中进行拓展验证与应用。
内容概要:本文研究了在峰谷分时电价引导下,基于多目标优化遗传算法NSGA-II的电动汽车充电负荷优化问题。通过构建以电网负荷波动最小化和用户充电成本最低为核心的多目标优化模型,利用NSGA-II算法求解获得帕累托最优解集,实现对大规模电动汽车充电行为的有序引导。文中系统阐述了峰谷电价激励机制的设计原理、电动汽车充电负荷的数学建模方法、多目标优化问题的形式化表达以及NSGA-II算法的具体实现流程,并借助Matlab平台进行仿真验证,结果表明该策略能有效平抑电网负荷峰谷差、降低用户充电支出并提升电力系统的运行效率与稳定性。; 适合人群:具备一定电力系统基础知识和Matlab编程能力,从事智能电网、电动汽车调度、需求侧管理等相关领域的研究生或科研人员。; 使用场景及目标:①研究峰谷电价政策对电动汽车充电行为的影响机制;②掌握NSGA-II算法在电力系统多目标优化中的具体应用;③实现电动汽车集群的有序充电调度以改善电网负荷曲线; 阅读建议:此资源结合了电力经济学与智能优化算法,建议读者在学习过程中重点关注模型构建与算法实现的衔接部分,动手复现仿真代码以深入理解参数设置与结果分析过程。
详情可查看下方数据集可视化效果。 【数据集概况】 · 检测类别(中文):[电梯(elevator)] · 训练集:1468 张 · 验证集:157 张 · 测试集:158 张 · 总计:1783 张 该数据集聚焦于各类建筑内部及外部环境中的电梯目标检测任务,涵盖住宅楼、办公楼、商场、酒店等多种典型场景下的电梯结构。图像采集覆盖不同光照条件、材质类型与安装位置,充分体现了实际应用中电梯的多样性与复杂性,为智能楼宇管理、安防监控及无障碍设施识别等方向提供了高质量的视觉基础支持。... 【训练曲线与评估图】 【模型训练配置】 参数 | 值 模型 | yolo26n 训练轮数 | 100 epochs 输入尺寸 | 640x640 批次大小 | 24 优化器 | auto 初始学习率 | 0.01 训练设备 【关键指标汇总】 训练了 72 个 epoch,最终轮指标: 指标 | 数值 mAP50 | **0.9446** mAP50-95 | 0.6531 Precision | 0.9305 Recall | 0.8777 train/box_loss | 0.5807 train/cls_loss | 0.3505 val/box_loss | 1.0020 val/cls_loss | 0.6208 【训练过程分析】 72 轮训练后 mAP50 达到 0.9446,模型收敛良好。Loss 曲线前段快速下降,后段趋于平稳,val_loss 无反弹,没有明显过拟合。但 mAP50-95 为 0.6531,和 mAP50 差距 0.29,定位精度仍有优化空间。 【模型性能评估】 Precision 0.9305、Recall 0.8777,精度高于召回,存在一定漏检。 【预测效果展示】 验证集预测效果较好,检测框基本准确覆盖电梯,置信度整体偏高。 【改进建议】 1. 丰富场景...

13,343

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 .NET技术前瞻
社区管理员
  • .NET技术前瞻社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧