5

Python 和其他人使用import获取外部功能的技术。

C 和其他语言使用include(并且,例如 C++,有随之而来的namespace头痛)。

在设计一门语言时选择一个(或像Objective-C一样使用两者)的原因是什么?

我看到 Apple 正在通过一篇论文向LLVM提出一些更新/更改,并且想知道为什么存在差异。

根据@delnan回答进行澄清

鉴于有多种实现方式import(直到他的回答我才知道),!includevs的总体好处是include什么?该import技术似乎只能根据给定的路径找到单个子组件(至少在 Python 中——我知道它的 [明显] 方法是唯一的)。

该方法的其他用途与import此有何不同?include什么时候在现代语言设计和实现中使用“旧式”方法才有意义(如果有的话)?

4

1 回答 1

11

C++和Objective C简单继承的C方法,定义和实现都非常简单(简而言之,“遇到一个#include,用文件内容替换,然后继续”),但存在严重问题。其中一些问题在您看到的演示文稿(和其他地方)中命名。有一些习语和最佳实践(也在该演示文稿和其他地方讨论过)和次要扩展(#pragma once预编译头文件)可以缓解一些问题,但归根结底,这种方法从根本上来说过于有限,无法处理软件工程师所拥有的来期待一个模块系统。假装它做了最近的替代品所做的事情(见下文)是一个非常有漏洞的抽象。

如今,每个对语言设计有意见的人似乎都同意,如果你能帮助它,你就不应该这样做。由于需要向后兼容,C++ 和 Objective C 没有这种选择(尽管两者都已经并且仍然可以选择添加另一种机制,而 Objective C 做到了)。这是“今天公平的”,因为这是一个相当好的决定(它工作得很好,如果你有纪律,它仍然有点工作),但世界已经前进并解决了更好的方法将代码拆分为模块,然后将其拉回到一起。(请注意,这种方式在早期的 C 时代已经存在,但显然它们并没有流行一段时间。)

您所描述的“该”import技术实际上是一个相当大的设计空间。许多模块系统几乎,但不完全,彼此完全不同 - 其余的仍然有足够的细微差别来毁掉你的一天。它可以是任何东西,从在新范围(Python、PHP)中执行导入的文件到成熟的 ML 风格的仿函数。有一些相似之处,因为所有这些模块系统都为每个“模块”(无论在各自系统中意味着什么)提供了自己的范围/命名空间,(通常)允许单独编译模块,并且通常会不遗余力地修复C 样式文本包含的问题(或创建者看到的任何其他问题)。这大约是一般人可以说的。

于 2012-11-26T18:48:59.927 回答