您是否使用过任何C ++解释器(而非编译器)?[关闭]


67

我很好奇是否有人使用过UnderC,Cint,Cling,Ch或任何其他C ++解释器,并且可以分享他们的经验。


1
@GeorgFritzsche这个问题是关于C ++的,而不是关于C的。–
Anderson Green

Answers:


30

注意:以下内容是特定于CINT的,但是鉴于它可能是使用最广泛的C ++解释器,因此可能对所有这些都有效。

作为广泛使用CINT的粒子物理学研究生,我应该警告您。尽管它确实可以“工作”,但是它正在逐步被淘汰,并且那些在粒子物理学上花费超过一年的人通常会由于以下原因而学会避免使用它:

  1. 由于它起源于C解释器,因此它无法解释C ++的某些最关键的组件。例如,模板并不总是有效,因此不鼓励您使用使C ++如此灵活和可用的东西。

  2. 它比最小优化的C ++慢(至少5倍)。

  3. 调试消息比g ++产生的消息更加隐秘。

  4. 范围与已编译的C ++不一致:看到以下形式的代码很常见

    if (energy > 30) { 
        float correction = 2.4;
    }
    else {
        float correction = 6.3;
    }
    
    somevalue += correction; 
    

    而任何可用的C ++编译器都会抱怨correcton超出范围,而CINT允许这样做。结果是CINT代码不是真正的C ++,只是看起来像它的东西。

简而言之,CINT没有C ++的优点,而是所有缺点加上一些缺点。

由于将CINT完全包含在ROOT框架中,因此实际上仍然使用CINT的事实很可能是历史性的事故。早在它写出来时(20年前),就真正需要一种交互式绘图/拟合的解释语言。现在有许多软件包可以满足这一角色,其中有数百个活跃的开发人员。

这些都不是用C ++编写的。为什么?很简单,C ++并不意味着要被解释。例如,静态类型可以在编译过程中为您带来优化方面的巨大收益,但是如果只允许计算机在运行时查看代码,则静态类型通常会使代码混乱和过度约束。如果您能够使用解释性语言,学习Python或Ruby,那么即使您已经了解C ++,学习所需的时间也比花在CINT上的时间少了很多。

以我的经验,使用ROOT(必须安装该软件包才能运行CINT)的年长研究人员最终将ROOT库编译为普通的C ++可执行文件,以避免CINT。年轻一代的人要么遵循这一指导,要么使用Python编写脚本。

顺便说一句,在相当现代的计算机上编译,ROOT(以及CINT)大约需要半小时,并且偶尔会因较新版本的gcc而失败。这个软件包在很多年前就已经发挥了重要作用,但是现在它清楚地表明了它的年龄。查看源代码,您会发现数百个不推荐使用的c样式强制转换,类型安全性方面的巨大漏洞以及对全局变量的大量使用。

如果您要编写C ++,请按照要编写的方式编写C ++。如果您绝对必须具有C ++解释器,那么CINT可能是一个不错的选择。


2
尽管您对cint的所有投诉都是完全正确的(并且您错过了一些投诉),但您可以相信我的话,PAW的COMIS解释器要糟糕得多。同样,PAW提供了足够的交互式绘图环境-它只是遇到了Fortran 77样式的编码所带来的缩放问题。
dmckee ---前主持人小猫,

1
@dmckee相信我,很高兴我们不与PAW合作。我的意思不是说CINT胜过一切,而是有很多事情会更好。
2012年

怎么会慢呢?
谢尔盖

2
@Sergei我不知道如果我理解你:口译慢编译的代码

@Shep,不仅仅是编译器的包装器吗?您可能会设置所需的优化(我想默认-O0为更好的交互性和增量链接)。root.cern.ch/download/R2002/Cint2002.pdf-提及的优化。
谢尔盖(Sergei)

26

有一个紧紧的Cern基于clang的C ++解释器项目-这是一种基于20年ROOT cint经验的新方法,它非常稳定,并由Cern的专家推荐。

这是一个不错的Google Talk:介绍cling,这是一种基于clang / LLVM的C ++解释器


17
Cling实际上是通过交互式编译来工作的,它更多的是JIT编译器而不是解释器。另外,作为“ CERN专家”,我不得不评论“ CERN专家的推荐”:我们许多人认为,ROOT 20年之后的主要教训是基于单一语言(C ++)的单片软件(ROOT)是一个错误。对于那些继续将C ++视为语言的终极目标的人来说,Cling是一个不错的选择,但是我们并没有在另一个C ++解释器上逃避CINT:对于互穿的代码,您可以做得比C ++好得多,请使用Python或Ruby。
2014年

20

cint是粒子物理分析程序包ROOT的命令处理器。我经常使用它,对我来说效果很好。

它相当完整,并且可以很好地与已编译的代码配合使用(您可以加载已编译的模块以在解释器中使用...)

late edit ::从后来的副本中复制,因为有关该问题的发帖者似乎不想在此处发布:igcc。从来没有亲自尝试过,但是网页看起来很有希望。


2
我认识几个物理专业的研究生,他们大部分的代码都是以cint / root编写的,尽管他们并不总是有很好的说法可以满足他们对性能和灵活性的需求。
马克·凯格尔

嗯,这是c ++,它需要构建interperter <->二进制代码字典,因此增加了一层复杂性。再加上根类树很痛苦。但是cint有用。它比cernlib时代的COMIS更好。
dmckee ---前版主小猫,

3
@littlenag说根“满足[我们的]需求”有点慷慨。该框架在几个基本级别上都存在可怕的缺陷,并且由于它完全是非模块化的,因此几乎无法删除,因此继续得到广泛使用。CINT是当您要读取的所有数据文件中必须安装的主要示例。
2012年

5

我(大约一年前)和Ch一起玩耍,发现它相当不错。


2

很久以前,我使用了一个名为CodeCenter的C ++解释器。这很不错,尽管它不能处理位域或奇特的指针修饰之类的事情。关于它的两个很酷的事情是,您可以观察变量何时更改,并且可以在调试时动态评估C / C ++代码。这些天,我认为像GDB这样的调试器基本上一样好。


解释器遇到模板实例时会做什么?(或其他预处理业务)。是否存在某种程度的预编译/预处理以处理模板或预处理器?
Doug T.

是的,所有CPP内容和模板都是所解释语言的一部分。挺棒的。
jfm3

2

也是很久以前,我使用了一个名为Instant C的产品,但我不知道它是否会进一步发展


0

我看了一会儿使用ch,看看是否可以将它用于我负责的黑盒测试DLL。不幸的是,我不太清楚如何使它从DLL加载和执行功能。再说一次,我不是那么有动力,也许有办法。


-1

有一个名为c-repl的程序,该程序通过使用GCC将代码重复编译到共享库中,然后加载生成的对象来工作。考虑Ubuntu存储库中的版本是用Ruby编写的(当然不包括GCC),而最新的git是在Haskell中的,它似乎正在迅速发展。:)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.