【问题标题】:Is D powerful enough for these features?D 对于这些功能是否足够强大?
【发布时间】:2012-06-09 16:14:38
【问题描述】:

长期以来,我一直想设计一种将可扩展性与效率(以及安全性、易用性等)结合起来的编程语言。我最近重新发现了 D,我想知道 D 2.0 是否正是我想要的语言做自己。我最喜欢的是元编程的潜力;理论上,D的traits系统可以在编译时启用以下功能吗?

  1. 运行时反射:编译时反射特性是否足以像 Java/.NET 那样构建运行时反射系统?

  2. 代码转换:使用元程序,创建 C#/C++/等。每次编译 D 程序时的版本(如果可以传播 doc cmets,则加分)。

  3. 特征。我不是说 D 中内置的metaprogramming traits,我是说object-oriented traits for class composition。一个 D 程序将指示一组要组合的特征,而元程序将组合它们。

  4. 单位推理引擎:给定一些可选表示单位的符号,例如unit(value),D 元程序能否检查以下代码,推断出正确的单位,并在最后一行发出错误消息? (我为boo 写了这样一个东西,所以我可以向你保证这在整个程序范围内是可能的):

    auto mass = kg(2.0);
    auto accel = 1.0;                      // units are strictly optional
    auto force = mass*accel;
    accel += metresPerSecondSquared(9.81); // units of 'force' and 'accel' are now known
    force += pounds(3.0);                  // unit mismatch detected
    

【问题讨论】:

    标签: metaprogramming d


    【解决方案1】:

    运行时反射:编译时反射特性是否足以构建像 Java/.NET 那样的运行时反射系统?

    是的。您可以在编译时使用 __traits 获取所需的所有信息,并生成运行时反射所需的运行时数据结构。

    代码转换:使用元程序,创建 C#/C++/等。每次编译 D 程序时的版本(如果可以传播 doc cmets,则可以加分)。

    不,无论D多么强大,这根本不可能。有些功能根本不会转移。例如,D 有一个内联汇编器,它 100% 不可能转换为 C#。没有一种语言可以无损地转换为所有其他语言。

    特征。我不是指 D 中内置的元编程特征,我指的是用于类组合的面向对象的特征。 D 程序将指示一组要组合的特征,而元程序将组合它们。

    您可以为此使用template mixins,尽管它们不提供方法排除。

    单位推理引擎:给定一些可选表示单位的符号,例如unit(value),D 元程序能否检查以下代码,推断出正确的单位,并在最后一行发出错误消息? (我为 boo 写了这样一个东西,所以我可以向你保证这在整个程序范围内是可能的):

    是的,这在 D 中很简单。已经有 at least one implementation

    【讨论】:

    • 我并不是要建议转换器应该支持包括汇编语言在内的所有功能 :),但只是 D 可以深入检查代码以尝试转换的想法.
    • 这种方式可以通过将自己限制在 D 的某个子集同时用 D、C++ 和 C# 编写程序。当然,你必须例如根据目标语言的限制,将 lambda 模板参数转换为运行时参数,或自动复制具有不同参数的模板。这样的转换工具可以使 D 在编写某些库时更具吸引力,尤其是算法和奇异的数据结构,尽管我承认它不一定需要通过元编程来完成。
    • 我相信这是可能的,但这需要在编译时进行语言翻译......这将是一个巨大的项目......
    • @PeterAlexander 我不是指已经在 C++ 中完成的那种单元检查系统,我的意思是单元 inference 更容易使用,因此在日常代码中更实用。链接的实现似乎将维度编码到数据类型中。理想的推理引擎不会使用特殊的数据类型,它会独立于数据类型跟踪单元。此外,它不仅可以支持 SI 单位,还可以支持任意概念,例如“字节”、“页”、“英寸”、“像素”、“局部坐标”、“全局坐标”。
    • 这种单位推断与代码转换示例非常相似;理想情况下,它将使用整个程序分析,并且只需对您要检查其单元的代码进行最少的更改。
    猜你喜欢
    • 2017-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-25
    • 1970-01-01
    • 2012-01-23
    • 2017-06-04
    相关资源
    最近更新 更多