【问题标题】:how to implement an idl-to-java compiler如何实现 idl-to-java 编译器
【发布时间】:2011-10-25 15:56:43
【问题描述】:

我需要实现一个 idl-to-java 编译器。事实上,它不是 idl-to-java。接口定义语言得到扩展。所以我需要实现一个可以生成java源文件的编译器。我对 corba 一无所知,我觉得很难开始。你认为我有可能在半年内完成这项工作吗?如果是这样,我该怎么办。 ps:请原谅我的英文。

【问题讨论】:

  • 为什么需要实现 idl-to-java 编译器?为什么不使用现有的开源 CORBA 堆栈和 IDL 编译器之一?

标签: java compiler-construction corba idl


【解决方案1】:

真正的 IDL-to-java 不仅会生成将这些内容映射回 IDL 定义的 Java 代码(严格遵守 OMG 标准)。它还生成 Java 代码,允许您的定义与底层 CORBA 堆栈一起工作(与为目标硬件架构生成指令的真正编译器不同。)

即IDL编译器

1) 获取您的 IDL 定义并将它们转换为 CORBA 堆栈、特定于语言的独立定义(在您的情况下,在 Java 中)。

2) 除此之外,它还生成 CORBA 堆栈/供应商特定代码。

如果您只需要执行 #1 的功能,那么它就不是 IDL-to-Java 编译器(不是真正意义上的)。但为了简单起见,我们可以这样称呼它。

所以你在这里有两条可能的路线:

1) 从现有的基于 Java 的 CORBA 堆栈(OpenOrb 或 JacOrb)中查看 IDL 编译器的源代码,或者

2) 查看 OMG 的规范,了解如何从 IDL 映射到您选择的语言:http://www.omg.org/technology/documents/idl2x_spec_catalog.htm

这一切都假设您了解编译器理论和实现。否则,如果这是一个学习实验,那就太好了!但如果这是有截止日期的工作的一部分,这可能是一项不切实际的任务。

不管怎样,祝你好运。

【讨论】:

    【解决方案2】:

    你可以使用idl4emf:

    http://code.google.com/p/idl4emf/

    该项目由 Xtext 中的 IDL 语法实现和 Ecore 中的 IDL 元模型实现组成。

    该项目还包括一个来自 IDL 文件的代码生成器项目。您可以从 IDL 文件中实现自己的生成器,只需在 Eclipse EMF 中编写 Xpand 模板。

    我已经成功地将这个项目用作几个生成器项目的一部分。

    【讨论】:

      【解决方案3】:

      如果您对解析器和解析器生成器一无所知,这将是一项艰巨的工作,但我认为如果您不从头开始,半年应该足够了。

      我建议您使用Antlr,在它提供的示例中恰好有一个IDL parser implementation。这可能适用于旧版本的 Antlr,但这绝对是一个很好的起点。一定要抓住Antlr book,你会需要它!

      对于代码生成部分,您可以使用 StringTemplate,这是 Antlr 的作者 Terence Parr 专门为此目的编写的模板引擎。

      如果你真的必须实现一个完整的 ORB,你不妨看看其他人是如何做到的,例如here.

      【讨论】:

      • IDL 是一种简化的 C++,因此不会造成太大问题。然而,关键是您生成的代码应该做什么。您是否期望实现一个完整的 CORBA 对象代理?那确实很难。
      • 我知道jdk中有一个编译器叫idlj。我用它编译了一个简单的 idl 程序,它会生成很多 java 文件,比如 helper、holder、POA、Stub 之类的东西。这真的让我很困惑。如何生成这些额外文件对我来说是个问题。
      • @Sky Shaw:我更新了我的答案以包含有关代码生成的建议。
      • @Sky Shaw - 如果您不了解 CORBA,所有这些东西都会让您感到困惑。学习 CORBA,更准确地说,学习 OMG 指定的 IDL 到 Java 的映射。您只是不使用 IDL 并将其转换为我们想要的任何 Java。有一个精确的规范规定如何将 IDL 工件映射到 Java。此外,IDL 编译器将生成特定于所讨论的球体的 Java 工件,因此它不仅仅是孤立的 IDL 编译器。 IDL 编译器并不是孤立存在的,而是作为 CORBA 堆栈的一部分(至少是一个 ORB。)
      猜你喜欢
      • 1970-01-01
      • 2021-06-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-26
      • 1970-01-01
      • 2017-06-21
      • 1970-01-01
      • 2012-05-19
      相关资源
      最近更新 更多