compilation - 软件工程与 Ada : stubs; separate and compilation units

标签 compilation ada stub

关闭。这个问题需要更多 focused .它目前不接受答案。












想改进这个问题?更新问题,使其仅关注一个问题 editing this post .

5年前关闭。




Improve this question




我具有机械工程背景,但我有兴趣与 Ada 一起学习良好的软件工程实践。我有几个疑问。

Q1。如果我理解正确,那么有人可以编写一个包规范(广告)文件,编译它,然后编译使用该包的主程序。稍后,当一个人知道要在包体中包含什么时,就可以编写和编译后者。之后,现在可以运行主程序。我已经尝试过了,我想确认这是一个很好的做法。

Q2。我的第二个问题是关于 stub (子单元)和 SEPARATE 的使用。假设我有一个主程序如下:

    WITH Ada.Float_Text_IO;
    WITH Ada.Text_IO;
    WITH Ada.Integer_Text_IO;

    PROCEDURE TEST2 IS
    A,B      : FLOAT;
    N        : INTEGER;

    PROCEDURE INPUT(A,B: OUT FLOAT; N: OUT INTEGER) IS SEPARATE;

    BEGIN -- main program
      INPUT(A,B,N);
      Ada.Float_Text_IO.Put(Item => A);
      Ada.Text_IO.New_line;
      Ada.Integer_Text_IO.Put(Item => N);
    END TEST2;

然后我将过程 INPUT 放在一个单独的文件中:
separate(TEST2)
PROCEDURE INPUT(A,B: OUT FLOAT; N: OUT INTEGER) IS
   BEGIN
      Ada.Float_Text_IO.Get(Item => A);
      Ada.Text_IO.New_line;
      Ada.Float_Text_IO.Get(Item => B);
      Ada.Text_IO.New_line;
      Ada.Integer_Text_IO.Get(Item => N);
   END INPUT;

我的问题:

a) AdaGIDE 建议我将 INPUT 过程文件保存为 input.adb。但是在编译主程序 test2 时,我收到警告:
warning: subunit "TEST2.INPUT" in file "test2-input.adb" not found
cannot generate code for file test2.adb (missing subunits)

对于 AdaGIDE 来说,这更像是一个错误,因为上述警告出现在消息之前:
Compiling...
Done--error detected

所以我将 input.adb 文件重命名为 test2-input.adb,正如 AdaGIDE 在编译时向我建议的那样。现在在编译主文件时,我没有任何警告。我现在的问题是可以写吗
PROCEDURE INPUT(A,B: OUT FLOAT; N: OUT INTEGER) IS

就像我在子单元文件 test2-input.adb 中所做的那样,还是写一个更具描述性的术语更好
PROCEDURE TEST2-INPUT(A,B: OUT FLOAT; N: OUT INTEGER) IS

强调程序输入有一个父程序 test2 ?这个想法来自 AdaGIDE 提示我关于 test2-input.adb ,正如我上面提到的。

b)我的下一个问题:

如果我理解编译顺序,那么我应该先编译主文件 test2.adb ,然后编译 stub test2-input.adb 。在编译 stub 时,我收到错误消息:
cannot generate code for file test2-input.adb (subunit)
Done--error detected

但是,我现在可以为 test2.adb 进行绑定(bind)和链接并运行程序。

我想知道我尝试编译 stub test2-input.adb 是否做错了,还是不应该编译?

Q3。有子单位有什么用?只是将一个大程序分解成更小的部分吗?我知道如果没有在子单元中的 BEGIN 和 END 之间放置任何语句,则会出现错误。所以这意味着人们总是必须在那里发表声明。如果想稍后再写语句,总是可以在子单元的 BEGIN 和 END 之间放置一个 NULL 语句,稍后再回到后者。这就是软件工程在实践中的完成方式吗?

非常感谢...

最佳答案

Q1:这是很好的做法。

通过将包规范视为规范,您可以将其提供给其他开发人员,以便他们知道如何与您的代码交互。

Q2:我相信 AdaGIDE 实际上使用 GNAT 编译器进行所有编译,所以实际上是 GNAT 负责可接受的文件名。 (这可以配置,但除非您有非常令人信服的理由这样做,否则简单地使用 GNAT/AdaGIDE 的文件命名约定要简单得多。)不过,与您的问题更相关的是,没有充分的理由包括父单位作为单独单位名称的一部分。但请参阅 Q3 的答案...

Q3:Ada 的第一个版本——Ada 83——引入了子单元,部分是为了帮助模块化代码,并允许延迟开发和编译。然而,Ada 软件开发实践几乎放弃了子单元的使用,所有的过程/函数/任务/等主体都简单地全部维护在包的主体中。它们仍在某些领域使用,例如可能需要特定于平台的子程序版本,但在大多数情况下它们很少使用。它留下了更少的文件来跟踪,并将包的实现代码放在一起。因此,我强烈建议您忽略子单元功能并将所有实现代码放在包体中。

关于compilation - 软件工程与 Ada : stubs; separate and compilation units,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3223243/

相关文章:

mocking - RhinoMock : How to Stub and Return a method with complex object as parameter

javascript - Sinon - 返回不是函数

c - 可能最终出现在共享库中的所有内容是否总是需要使用 -fPIC 进行编译?

java - 为什么Java和JS在条件下不允许变量声明

iOS 构建在编译时失败,出现问题 "failed to find a suitable device for the type SimDeviceType"

data-structures - SPARK 实例化错误 w.r.t. volatile 类型

c++ - 从 float C++ 中删除与 int32_t 转换相关的警告消息

multithreading - 关于由单个主任务控制的 worker 任务的执行问题

java - 使用抽象方法进行常规模拟