【问题标题】:What programming languages allow dynamic generation of code within the same language able to be passed around as parameters [closed]哪些编程语言允许在同一语言中动态生成代码,可以作为参数传递[关闭]
【发布时间】:2013-10-22 18:05:48
【问题描述】:

基本上,我很好奇(肯定是一件危险的事情)什么语言允许您动态构建代码块以供以后执行。

我看过http://en.wikipedia.org/wiki/Self-modifying_code 我在那里没有找到我要找的东西。

这不是辩论,我不是在问哪一个比其他任何一个更好。 我只想知道哪些语言包含这个编程特性或类似的东西。如果可以的话,我也希望看到一些示例代码来说明此功能。

我以前在 ASP.NET 中做过类似的事情,并动态构建了 javascript 代码以发送到要执行的页面,或者 C# 生成 SQL 查询,但以前从未使用同一种语言。即 C# 生成 C#。

这是它的外观示例(我正在用虚构的 C#/Javaish 语言编写)

/ 表示代码块转义序列

CodeBlock codeblock = new CodeBlock();

codeblock+= / print("interesting "); int x = 0;  /

for(int i=0; i++; i<10)
{
  codeblock+= / for(int i=0; i++; i<10) {  x++; Canvas.Draw(new line(x,x+50); } /

}

executionMethod(codeblock);

public void executionMethod(ExecutableCode block)
{
  block.exectute();
}

【问题讨论】:

  • 一个简单的网络搜索应该提供的语言列表比任何人有时间研究的都要多。而且几乎任何语言都可以自己构建和加载。您可能要问的典型示例是 Lisp、Ruby、Python、等等等等。
  • 这取决于你的意思。有“评估”机制,但即使这样也不是必需的; Java 可以自己编译。 Lisp 宏会自动扩展。传递函数也是一种描述方式,但不同。
  • 您的示例甚至不需要 eval。这可以在标准的 Haskell 中完成。基本上,您有一个列表 [0..9],并且想要构建一个列表 [drawLine 0 50, drawLine 1 51, ...],您可以使用像序列这样的标准函数“运行”它。

标签: programming-languages metaprogramming


【解决方案1】:

“执行动态构造的代码块”与“元编程”不同。

执行动态代码块的能力很容易检测:该语言具有“eval”之类的功能(如您的示例中所示)。

“元编程”是一个程序操纵其他程序(有时应用于自身)的能力。它不一定是 programming 语言的属性;它可以只是一组大量的设施,碰巧以某种语言实现,旨在支持这些活动,例如程序转换工具。由语言特性直接实现的元编程通常缺乏完全的通用性;你可以做语言设计师决定让你做的事情,仅此而已。 (尝试在大多数存在的“反射”语言中重命名变量)。这就是更通用的工具更有效的地方。它不一定有语言设计者施加的限制。

【讨论】:

  • eval 是一种动态构造代码的简单方法,但不是必需的。例如,C 可以使用 libclang 编译并使用 MCJIT 或(在变成动态库之后)使用普通动态加载。我同意元编程不仅仅包括运行时代码生成。
  • @delnan:按照您的标准,所有支持图灵的语言都能够进行评估和元编程。问题的关键不在于抽象中是否可能,而在于语言/工具是否已经嵌入了能力。我认为人们会同意使用 MCJIT 意味着“C”没有内置的评估或元编程工具。
  • 不是内置的,而是在几乎不重要的哲学辩论和语言火焰战争之外。 使用它 重要的是它的易用性 - 这主要是有人将它打包在一个更易于使用的库中(在 C 中可以很容易地进行字符串操作)。是的,原则上任何图灵完备的语言都可以做类似的事情——但是“理论上可能通过图灵完整性”(参见图灵 tarpits)和“实际上在成熟的现实世界软件中完成”之间存在巨大的实际差异。
  • OP:“……我只想知道哪些语言包含这个编程特性……”
  • 我在这里浏览了一个待办事项列表,我发现了很久以前的一些东西。你让我在网站之外联系你,你还想让我这样做吗?
猜你喜欢
  • 2017-09-18
  • 2011-02-07
  • 2010-10-07
  • 1970-01-01
  • 2012-07-26
  • 2015-02-09
  • 2011-02-04
  • 1970-01-01
  • 2012-09-17
相关资源
最近更新 更多