这是一个主观问题.
最近我一直在努力学习NHibernate.它的问题至少是2倍:
虽然NHibernate是一个很棒的框架,但是需要编写映射文件并创建模仿数据库表的实体类是很难写的.有一些工具可以缓解这个问题,例如Castle ActiveRecord或NHibernate Fluent.
但是,尽管这些工具可以减少代码重复问题,但仍然需要编写一些重复代码,或者必须添加一些装饰属性.我现在正在尝试一些代码生成工具,它允许我直接从数据库生成映射文件和实体类.对我来说,这是一项更省力的任务.
你怎么看?
在普通Java中,可以在运行时以编程方式覆盖类的方法(甚至创建新方法)?
即使我在编译时不知道类,我也希望能够这样做.
我在运行时重写的意思是:
abstract class MyClass{
public void myMethod();
}
class Overrider extends MyClass{
@Override
public void myMethod(){}
}
class Injector{
public static void myMethod(){ // STATIC !!!
// do actual stuff
}
}
// some magic code goes here
Overrider altered = doMagic(
MyClass.class, Overrider.class, Injector.class);
Run Code Online (Sandbox Code Playgroud)
现在,这个调用......
altered.myMethod();
Run Code Online (Sandbox Code Playgroud)
...将调用Injector.myMethod()而不是Overrider.myMethod().
Injector.myMethod()是静态的,因为在执行"magic"之后,它会从不同的类实例(它是Overrider)调用,(因此我们阻止它访问本地字段).
我正在寻找一个复杂的图形FSM编辑器,它可以以一个记录良好的输出格式导出模型,如SCXML或类似的.
任何人都可以推荐我一个工具吗?
有人知道,在.tt文件中,code.VsNamespaceSuggestion()从哪里获取其命名空间?
我遇到了一个问题,我必须更改解决方案的命名空间,我发誓我已经改变了它(文件夹名称,文件名,项目名称,项目属性,程序集信息等).但是当.tt文件运行时,它总是将旧命名空间放回其生成的类中.我被告知它来自EF模型,但我没有看到任何显示命名空间(在设计器/属性中或通过在NotePad中打开.edmx文件).
有什么想法吗?对于hack,我只是在下一行中使用我想要的命名空间覆盖它:
string namespaceName = code.VsNamespaceSuggestion();
namespaceName = "Desired.Namespace"; //HACK:
Run Code Online (Sandbox Code Playgroud) 我希望能够在给定AST描述的情况下执行python的代码生成.
我已经对C进行了静态分析,并在python中构建了AST访问者,所以我觉得操作语法树相对比较舒服,但我之前从未尝试过代码生成,并且正在尝试确定生成python代码的最佳实践.
具体来说,我喜欢关于如何自动完成代码生成的指针,或者指向可以使这个任务变得更简单的指向python的库的任何指针.
这是一个我知道的难题和开放式问题,但我想我会把它扔到地板上,看看是否有人有任何有趣的建议.
我已经开发出一种码生成器,其将我们Python接口我们的C++代码(通过SWIG生成),并产生以暴露此作为Web服务所需的代码.当我开发这个代码时,我使用TDD做到了,但我发现我的测试很脆弱.因为每个测试基本上是想验证的输入给定码位(这恰好是一个C++头)我得到的输出给定码位我写了一个小引擎,从XML输入文件读取测试定义和生成测试来自这些期望的案例.
问题是我害怕进入修改代码.那个单元测试自己的事实是:复杂的,b:脆弱的.
因此,我正在尝试考虑解决这个问题的替代方法,并且让我感到震惊,我可能会以错误的方式解决它.也许我需要更多地关注结果,IE:我生成的代码实际运行并执行我想要的代码,而不是代码看起来像我想要的那样.
有没有人有任何类似于他们想要分享的东西的经历?
我用C编写了一个虚拟机,它对非JIT VM有很好的性能,但我想学习一些新东西,并提高性能.我当前的实现只是使用一个开关从VM字节码转换为指令,并将其编译为跳转表.就像我说的那样,它的性能不错,但是我遇到了一个只能用JIT编译器克服的障碍.
不久前我已经问了一个关于自我修改代码的类似问题,但我开始意识到我并没有问正确的问题.
所以我的目标是为这个C虚拟机编写一个JIT编译器,我想在x86汇编中完成它.(我使用NASM作为我的汇编程序)我不太确定如何去做这个.我对汇编感到满意,并且我已经查看了一些自我修改的代码示例,但我还没有弄清楚如何进行代码生成.
到目前为止,我的主要部分是使用我的参数将指令复制到可执行的内存块.我知道我可以在NASM中标记某一行,并使用静态参数从该地址复制整行,但这不是非常动态的,并且不适用于JIT编译器.我需要能够解释字节码中的指令,将其复制到可执行内存,解释第一个参数,将其复制到内存,然后解释第二个参数,并将其复制到内存中.
我已经了解了几个可以简化这项任务的库,比如GNU闪电,甚至是LLVM.但是,在使用外部资源之前,我想首先手动编写,以了解它是如何工作的.
这个社区可以提供任何资源或示例来帮助我开始这项任务吗?一个简单的例子显示了两个或三个指令,例如"add"和"mov"用于生成可执行代码,带有参数,动态地,在内存中,会产生奇迹.
我设法使用cmake和visual studio 10成功编译了用于Windows的窗口.我想获得一个XML文件作为源代码的AST表示.有一个选项可以在linux(ubuntu)下使用gcc提供结果,但是在windows框中不起作用:
clang -cc1 -ast-print-xml source.c
Run Code Online (Sandbox Code Playgroud)
但是,这是调用编译阶段(我想避免).挖掘源代码并没有帮助我,因为我很吵.我可以通过使用以下方法设法生成AST的二进制版本:
clang -emit-ast source.c
Run Code Online (Sandbox Code Playgroud)
不幸的是,这种格式不能直接用于解析.是否有一些现有方法直接生成XML树而不是clang中的二进制树?
目标是在.NET环境中的其他工具中使用XML表示,因此我需要围绕本机clang lib进行一些包装以访问二进制AST.如果有人已经为.NET编写了一些二进制clang AST解析器,可能还有第三种选择吗?
如果clang前端生成的AST与编译阶段生成的AST不相等,我是否可能会遗漏这些内容.
我想在Haskell中为另一种语言生成代码,但我对如何解决这个问题感到困惑.我正在寻找Haskell中语言的抽象和优雅表示,这对代码生成也很有用.有问题的语言是InstallScript(语言参考指南的链接).有人可以提供关于如何捕获Haskell类型中的InstallScript中使用的语言结构的提示(可能有示例吗?),还是指向类似项目的灵感?
有谁知道我怎么能看到v8从Javascript生成的实际机器代码?我已经到了这里Script::Compile(),src/api.cc但我无法弄清楚从哪里去.
code-generation ×10
python ×2
assembly ×1
c ×1
c# ×1
c++ ×1
clang ×1
fsm ×1
haskell ×1
java ×1
javascript ×1
jit ×1
nhibernate ×1
reflection ×1
runtime ×1
swig ×1
t4 ×1
unit-testing ×1
v8 ×1
xml ×1