【问题标题】:Could C++ also be interpreted instead of compiled?C++ 也可以被解释而不是编译吗?
【发布时间】:2013-09-06 11:06:19
【问题描述】:

我知道解释 C++ 代码可能没有实际价值,这个问题只是为了娱乐和学习目的。

是否可以逐语句解释 C++ 代码而不是编译它?还请说明答案的原因。

如果不可能,是否有可以解释的语言子集?

【问题讨论】:

  • root.cern.ch/drupal/content/cint: "CINT 是 C 和 C++ 代码的解释器"
  • ...它将在某个时候取代 CINT。
  • 如果可以编译,则没有技术原因无法解释。
  • 换个角度看,code.google.com/p/c-semantics 本质上是在术语重写引擎之上实现的 C 解释器。它故意不将源语言降低为某种更简单的形式(即,没有任何“编译”),并且应该以一种干净、可读且正式的方式定义 C 操作语义。

标签: c++ compiler-construction theory interpreter interpreted-language


【解决方案1】:

这取决于您所说的“逐句陈述”是什么意思。大多数时候,C++ 是一种严格自上而下的语言:如果你想使用任何东西,你必须事先声明或定义它。所以这里没问题。

不过,自上而下的方法也有例外。例如,类成员函数的主体可以看到在源代码中词法跟随它的类数据成员的声明。可以调用已声明但尚未在翻译单元中定义的inline 函数(但定义必须出现在 TU 结束之前)。

这些可能会或可能不会违反您的“逐个声明”的概念,具体取决于该概念的确切含义。

编辑根据您的评论:

如果解释器对当前语句没有前景,那么它就不可能解释 C++ 代码。使用上面给出的问题点的反例:

#include <iostream>

struct C
{
  void foo() { std::cout << i << '\n'; }
  int i;
};

int main()
{
  C c;
  c.i = 0;
  c.foo();
}

或者

#include <iostream>

inline void foo();

int main()
{
  foo();
}

inline void foo()
{
  std::cout << "x\n";
}

它甚至不必涉及内联函数:

extern int i;

int main()
{
  return i;
}

int i = 0;

【讨论】:

  • 换句话说,我的意思是解释器不能留意接下来的行。它可以存储前几行所需的任何内容。成员函数可以访问类成员是没有问题的,只要之前包含类头文件,其中包含成员定义。
  • 非常感谢包含代码示例的更新。现在很清楚,只有 C++ 的一个子集可以用这个底层定义来解释。类不能,因为不能保证它们的成员顺序。但是如果我们使用头文件来定义成员和方法签名呢?
  • @danijar 您必须确保 main 的定义是翻译单元中的最后一个声明,并且所有函数定义都在任何命名空间范围变量之前(因为可以从他们的构造函数)。
  • goto 也违反了从上到下的执行规则。它的标签可能出现在当前函数体的任何地方。
  • @larsmans 非常好。这可能是最直接的反例了。
【解决方案2】:

编译和解释之间没有明确的界限。大多数通常被认为是解释型的语言实际上是为某种 VM 编译的。 C++ 也可以这样做。

【讨论】:

  • 好的,C++ 可以逐句解释吗?我知道,即使是大多数被认为是解释性的语言,也会做更多的事情。例如,JavaScript 扫描输入的范围以查找函数定义。但是如果扫描超过当前行,则可以解释每种编译语言。因此,这是我想设置边界的地方。
  • @danijar:取决于你的意思。你可以编写一个非常愚蠢的 C++ 解释器,它不会真正编译任何东西,只是每次检查每个语句以找出它应该做什么。
  • @danijar:相比之下,如果您的意思是像 Python 那样的交互式顶层,我想这也是可能的,但它不会真的是 C++(它执行整个函数,从main,不是松散的陈述),所以你会扩展语言。
  • 我的意思是main() 中的解释器统计信息,然后读取一条语句,执行它并继续下面的语句。而当一个语句是函数调用时,解释器当然会跳转到函数体中的第一条语句。这是您学习编程的一种方式。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-09-10
  • 2011-08-24
  • 1970-01-01
  • 1970-01-01
  • 2019-04-08
  • 2019-10-28
  • 1970-01-01
相关资源
最近更新 更多