为什么我们不能在 MATLAB 中同时编码和编译?

Why we can't simultaneously code and compile in MATLAB?

我有 MATLAB R2014b。如您所知,当我们在 visual studio 等其他编程环境中编码时,我们有一个在线编译器,但在 MATLAB 中编辑代码(面向对象代码)后,我们应该在使用新结构运行它之前使用 clear classes。为什么我们在 MATLAB 中有这个结构?为什么我们没有像 visual studio!?

这样的环境

如果您的工作区中有正在编辑的 class 对象,则需要执行 clear classes。一旦创建了 class Foo 的对象,Foo 的实现就会被缓存。否则,如果在工作区中有 Foo 类型的对象时更改 Foo 的代码,该对象可能会变得不一致。

另外,MATLAB 使用的是解释器,而不是编译器。

正在更新类

不得不反复 clear classes; 让 MATLAB 不抱怨定义已更改有点烦人。 幸运的是,在 R2014b 中,MathWorks 通过实施 Automatic Updates for Modified Classes, which has a lot fewer conditions for a full memory flush than earlier versions (R2014a 和之前的版本在解决这种烦恼方面向前迈出了一大步。

之所以从一开始就没有这种能力,是因为MATLAB的current object model [PDF]才部署了七年。 在 MATLAB 的整个生命周期中,这是一个相当新的功能,比可以做的和可能要做的有很多改进(比如自动更新)。


环境像Visual Studio

Visual Studio 是一个有助于代码开发和编译的程序。 每次代码库在编译时都是 compiled, the behavior of the classes is parsed and the former definition is overwritten (note that the behavior of the class need not be fixed)。 当使用编译后的程序或库时,这些对象将被实例化并使用。

在 MATLAB 中,当您实例化一个对象时,classdef 中的定义被解析,一个实例被加载到内存中。 如果更改 classdef 并调用另一个实例化,旧版本的 MATLAB 会报错,因为 MATLAB 运行时 "allows only one definition for a class to exist at any time" (docs)。 然而,最新版本对当前加载到内存中的所有实例执行就地更新,save a few exceptions

我认为这两个用例显示了行为上的差异:编译后的程序只有一个 class 定义需要处理,更改签名的唯一方法是重新编译代码。然而,MATLAB 可以更改 class 签名,同时在内存中已经有一个 class 的实例,而 MATLAB 的立场是,在我看来,只有一个 class定义应同时存在。