Compiler construction 为什么模块在文件中显式命名?

Compiler construction 为什么模块在文件中显式命名?,compiler-construction,language-design,d,design-rationale,Compiler Construction,Language Design,D,Design Rationale,从: 模块与源文件有一对一的对应关系。模块名是去掉路径和扩展名的文件名 但是,模块名称仍然在文件中显式指定 module foo; 这有什么意义?如果模块与文件相对应,为什么编译器不能从文件名推断出它们被调用的内容?同一页稍微向下一点(emph-mine) ModuleDeclaration设置模块的名称及其所包含的包 属于。如果不存在,则将模块名称视为相同的名称 (除去路径和扩展名)源文件名 这意味着,如果要将模块放入包中,必须显式地指定它(如Java的包声明),并且考虑到人们使用奇数/外来

从:

模块与源文件有一对一的对应关系。模块名是去掉路径和扩展名的文件名

但是,模块名称仍然在文件中显式指定

module foo;
这有什么意义?如果模块与文件相对应,为什么编译器不能从文件名推断出它们被调用的内容?

同一页稍微向下一点(emph-mine)

ModuleDeclaration设置模块的名称及其所包含的包 属于。如果不存在,则将模块名称视为相同的名称 (除去路径和扩展名)源文件名

这意味着,如果要将模块放入包中,必须显式地指定它(如Java的
声明),并且考虑到人们使用奇数/外来目录名的奇怪倾向,您不能依赖于在路径中检查source/src/import

文件名和模块名不必相同的原因是,您可以使用.di进行导入,并使用多个版本的实际代码,使用-c开关创建.obj文件以链接不同的版本(尽管处理导入路径更方便)

它可以推断出来。您不必给出模块名称。但是,您可以指定模块名称,如果您愿意,可以使用完全不同的名称。一个主要的例子是如果文件名不是有效的模块名(例如my module.d)。在这种情况下,您可以使用
模块
声明为其提供有效的模块名称(例如my_模块)

通常的做法是将模块名放在文件的顶部,通常模块名与文件名相同,但使模块名与文件名不完全匹配可以增加灵活性


P>个人认为,除了文件名以外,我通常认为把模块命名为一个坏主意,并且我认为如果文件不是有效的模块名,那么文件名应该被更改为一个,但是很显然,决定使它们不匹配的额外灵活性是值得的。因此,它是用这种语言编写的。

IIUC,D的官方网站现在是。如果您将模块命名为文件名以外的名称,导入语句将无法找到它。@只要您一次编译所有文件,它就会工作。我不知道它是否应该与导入一起工作(你是对的,它目前没有)。但这也是为什么将模块命名为文件名以外的名称通常不是一个好主意的另一个原因。如果编译器能够找到正确的名称,则不需要找到.d。di@BCS假设您使用的是一个.di文件,这会导致它自己的一系列问题。但是,如果您重命名模块仅仅是因为您想在文件名中添加“-”而不是“u”(这是TDPL给出的示例),那么您将遇到与.di文件完全相同的问题,除非您愿意正确命名该文件,在这种情况下,为什么不正确命名原始文件?文件夹确实与包相对应,路径剥离只是指当前工作目录。指定模块名称的原因是,如果将所有需要的文件传递给编译器,则不需要维护层次结构来编译文件(di文件是在很久以后添加的)。