编译器与解释器在代码分析方面

Compilers vs Interpreters in terms of code analysis

我开始成为一名使用 Java 的开发人员,并习惯了强大的 IDEs,它们在我编写源代码时为我提供支持。更精确,例如当尝试使用 Eclipse 中不存在的函数时,我在输入此函数时立即收到错误消息,没有 运行 我的应用程序。 Eclipse 如何做到这一点?通过预编译我的代码?

现在正在开发 JavaScript 或 Node.js,我仍然不明白为什么使用 解释型编程语言IDE 中不存在这些功能。我知道解释器会在执行期间分析代码。但是为什么这是不可能的,例如为 IDE 构建一个插件作为 Visual Studio 代码,在编写 时预分析我的代码 ?例如,当我试图在 JS 中调用一个不存在的函数时出现错误,我真的很感激。在这种情况下,linter 也无济于事。

有人可以支持我的理解吗?非常感谢:)

IDE 可以分析您的代码,它可以警告您您似乎没有定义您似乎正在调用的函数。但在许多情况下,您可能想告诉 IDE 去远足并停止打扰您,因为该功能确实存在。它只是对 IDE.

不可见

C++ 和 Java 不允许这种情况。如果按名称调用函数,编译器必须能够看到该函数。 (在 C++ 中,编译器并不真正知道该函数最终是否会包含在您的项目中;它可能只知道您是否包含了声明该函数原型的 header。但是您至少必须这样做,因此编译器和 IDE 有充分的理由假设您打算将该函数作为可执行文件的一部分。

Java 更严格。如果编译器看不到您正在使用的其他 class 模块,它就不会编译您的函数。 (使用 C++,您甚至可以在编写正在使用的函数之前编译您的函数(只要您拥有 header 及其正在调用的函数),尽管在拥有所有必要的可用部分之前您无法创建可执行文件.)

但是Java脚本不需要声明。 Javascript 不需要知道您正在调用的函数的参数或结果类型是什么。因此,它永远不需要强迫您提供该信息。当你最终找到 运行 程序时,JS 解释器将不得不找到你正在调用的函数,但它们不必在你编写的程序的文本中。它们可能位于您动态添加到执行环境的不同文件中,或者它们可能位于您的 Javascript 程序已加载到的网页中。或者它们甚至可以动态创建并使用 eval 添加到执行环境中。 (或以其他方式。)