代码之家  ›  专栏  ›  技术社区  ›  Larry Hipp

编译器即服务的好处是什么

  •  10
  • Larry Hipp  · 技术社区  · 16 年前

    安德斯·赫茨伯格的国家:[来源][1] “我们想打开我们的编译器,让它成为一个API,你可以调用它来编译一段代码,并得到表达式树和/或IL。这就实现了一系列场景,例如应用程序可编程性、交互式提示、用户编写的重构以及嵌入了C语言小岛的特定领域语言。”

    我正在努力寻找一个现实世界的例子,在那里这可能是真正有用的。我错过了这里的主要概念吗?或者这真的对语言有好处吗?

    [1]: http://www.simple-talk.com/opinion/geek-of-the-week/anders-hejlsberg-geek-of-the-week/

    4 回复  |  直到 14 年前
        1
  •  4
  •   Johannes Rudolph    16 年前

    对于某些问题,编写一个能够生成解决实际问题的程序更容易。其中一个特别有用的方面是为编译器构建解析器。

    在其他情况下,您可以动态生成代码,在处理特定数据类型时,可以对其进行定制以提供最佳性能,您刚刚通过对其元数据进行反射在运行时了解了该数据类型的属性。我可以举一个例子来说明这一点 Modelshredder

    Reflection.Emit . 第二种方法更具动态性,依赖于表达式树,可以在运行时有效地构造和编译表达式树,以提供与我手工编码的MSIL注入相同的功能。您可以在MoreLinq主干中看到这一点(只需查看ModelShreder站点,这里有一个链接)。将编译器作为一种服务实际上允许我提高抽象级别并发出C代码,然后将其编译到MSIL。

    领域特定语言的例子已经提出,而且我认为像C#这样的命令式语言不太适合“命令行”场景,而不是更大的脚本。 有一个基于F#DSL的整洁make系统叫做 FAKE ,它借用了编译器即服务的许多概念。VisualStudio内部的F#Interactive窗口(这样叫吗?)也采用了类似的概念。

        2
  •  4
  •   Gerald    16 年前

        3
  •  2
  •   mico    16 年前

    假设我使用你的序列号作为税务计算的参数。一个程序的副本很容易做,而且完全没有用。

        4
  •  0
  •   linkerro    14 年前

    它还使得编写具有与Linqpad类似功能的程序变得非常容易。

    另一个用例是使用存储在数据库中的源代码块,并根据配置调用特定的数据,类似于现在可以调用Workflow Foundation。这将有助于CRMs、ERPs和其他数据仓库应用程序的工作流自动化(尽管如果滥用,这将构成一个史诗般的反攻)。