Tag: 解释器

在嵌入式Python解释器中打印变量

我编写了一个嵌入Python的小程序。 我正在使用Py_Initialize()和Py_Finalize()正确设置它,并且能够使用PyRun_SimpleString或PyRun_SimpleFile运行脚本。 但是,我不知道在打印变量时如何模仿Python自己的解释器的行为。 特别: a = (1, 2, 3) print a 适合我的工作:打印出来(1,2,3) 然而: a = (1, 2, 3) a 什么都没打印出来。 在Python自己的解释器中,这也会打印出(1,2,3)。 如何让我的代码执行用户期望的操作并打印出值? 提前致谢!

为什么我的小lisp QUOTE不会?

我一直在编写基于minilisp编码的微型迷你lisp, McCarthy论文 (由Lisp的根源修订),并使用基于J Incunabulum的(可能令人反感的)风格。 并从这里使用PP_NARG宏。 我还受到了我以前的项目的激励,这是一个codegolf’ed lambda演算解释器 ,我后来发现它与1999年的ioccc Lisp解释器非常相似,特别是在使用游标而不是指针来指代内存地址时。 它似乎工作,包括读者代码。 但是,虽然eval(ATOM(QUOTE X))正确地产生T ,并且eval(ATOM(QUOTE(XYZ)))正确地产生NIL ,并且eval(QUOTE X)产生X ,并且eval(QUOTE(XYZ))产生(XYZ) ; 奇怪的结果是eval(QUOTE(ATOM(QUOTE X)))产生ATOM ,而不是完整的子表达式ATOM(QUOTE X) 。 我认为这是一个长镜头,我并没有让它变得简单,但任何人都可以帮助我找出引用出错的地方吗? 顺便说一下,与上面的描述不同,解释器仅限于单字符标记,因此QUOTE是Q而ATOM是A ( github ) /*cf. http://www.ioccc.org/1989/jar.2.c http://leon.bottou.org/projects/minilisp http://www.jsoftware.com/jwiki/Essays/Incunabulum http://www-formal.stanford.edu/jmc/recursive/recursive.html http://www.paulgraham.com/rootsoflisp.html https://codegolf.stackexchange.com/questions/284/write-an-interpreter-for-the-untyped-lambda-calculus/3290#3290 */ #include #include #include #include #include #include #include”ppnarg.h” #define R return int*m,*n,msz; tag(x){R x&3;} val(x){R x>>2;} #define ALPHA ‘T’ #define NIL […]

任何C / C ++到非本地字节码编译器/解释器?

正如标题所示,是否有任何C / C ++字节码编译器/解释器? 我正在用一种解释语言编写应用程序,该语言依赖于某些完全可交叉编译的库(在编译某个平台时没有特殊的标志来指示代码更改)但是用C和C ++编写。 不是在每个平台上运送n-platform-specific-libs,而是运送一组由一个平台特定的解释器解释的lib。 可能和/或可用? EDIT1:有问题的解释语言是Python,虽然我也可以使用Ruby。

VM /解释器的性能改进策略?

我用C语言编写了一个简单的VM,使用简单的指令切换,无需任何指令解码,但性能非常糟糕。 对于简单的aritmetic操作,对于相同的操作,VM比本机C代码慢大约4000倍。 我测试了一组长度为1000万的数组,第一组由程序指令组成,随机+ – * /操作,2个数组保存随机整数,第三个数组是操作目标存储。 我期待看到算术性能下降3-4倍,所以`4000x真的让我感到震惊。 即使是最慢的解释语言似乎也能提供更高的性能。 所以,我的方法出错了,如何在不使用JIT编译到机器代码的情况下提高性能? 实施是……基本上我能想到的最简单: begin: { switch (*(op+(c++))) { case 0: add(in1+c, in2+c, out+c); goto begin; case 1: sub(in1+c, in2+c, out+c); goto begin; case 2: mul(in1+c, in2+c, out+c); goto begin; case 3: div(in1+c, in2+c, out+c); goto begin; case 4: cout << "end of program" << endl; goto end; default: […]

数学表达式的自定义解释器

我必须评估包含变量的大量表达式,我正在考虑编写一个小的自定义解释器来保持编译的快速和小。 但是我对这个主题没有经验并且有一些问题。 假设我们有一个包含数学表达式和一组有限对象的文件。 该文件可能如下所示: expr[x,y,z] = 2*x*y + x^2 + 28/14*z*(x*y^2 + 15*z) + … 我想以某种方式解析它,所以我可以通过简单地调用函数expr(float x, float y, float z)在我的应用程序中以数字方式计算表达式。 不应修复参数的数量(编辑:每个表达式都有自己的定义,带有适当数量的参数或接受数组)并且应该允许嵌套括号以使输入文件保持相当小。 由于表达式都是多项式类型,我可以想一想数据结构应该是什么样子,但解析看起来很困难。 我已经在SO上找到了一些类似问题的答案,例如使用Lua。 然而,最大的问题是,与直接从自动生成的C代码编译这些表达式相比,创建和调用这些对象时的性能损失是什么。 提前致谢! 编辑:请仅考虑上面的expr()示例。 我想最好的方法是让模板类的对象保存稀疏数组中变量的系数和幂。

如何为C中实现的解释语言提供垃圾收集?

如果我要在C中实现垃圾收集的解释语言,如何在不编写自己的垃圾收集器的情况下提供精确(即不保守)的垃圾收集? 有可用的库吗? 如果是这样,哪些? 我知道我必须在垃圾收集器跟踪的任何对象上维护某些不变量。