问题标签 [interpreter]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
7 回答
4129 浏览

parsing - 动态 (?) 解析器

是否存在在运行时生成 AST/解析树的解析器?有点像一个库,可以接受一串 EBNF 语法或类似的东西并吐出一个数据结构?

  • 我知道 antlr、jlex 和他们的同类。他们生成可以做到这一点的源代码。(喜欢跳过编译步骤)
  • 我知道 Boost::Spirit,它使用一些带有 C++ 语法的黑魔法在执行时生成这样的东西(肯定更接近我想要的,但在 C++ 方面我是个无赖。而且它仍然有点限制,因为你的语法是硬编码的)
  • 我不知道 python 或 ruby​​ 中的任何内容,尽管编译器编译器在这种语言中可能非常有效......

现在我知道解析器组合器了。(谢谢,乔纳斯)还有一些图书馆(谢谢 eliben)

顺便说一句,我最近还注意到Parsing Expression Grammars,如果有人实现它听起来很酷(他们说 Perl 6 会有它,但 Perl 回避了我的理解)

0 投票
7 回答
2325 浏览

php - 如何在 PHP 中实现 Django 和 RoR 使用的 URL 模式解释器

在 PHP中实现 URL 解释器/调度程序(例如在Django和 RoR 中找到)的最佳方法是什么?

它应该能够按如下方式解释查询字符串:

  • /users/show/4映射到
    • 面积=用户
    • 行动=展示
    • 编号= 4
  • /contents/list/20/10映射到
    • 面积=内容
    • 行动=清单
    • 开始= 20
    • 计数= 10
  • /toggle/projects/10/active映射到
    • 动作=切换
    • 面积 =项目
    • 编号= 10
    • 字段=活跃

其中查询字符串可以是指定的 GET / POST 变量,也可以是传递给解释器的字符串。

编辑:我更喜欢不使用 mod_rewrite 的实现。

编辑:这个问题不是关于干净的 url,而是关于解释一个 URL。Drupal 使用 mod_rewrite 将诸如http://host/node/5之类的请求重定向到http://host/?q=node/5。然后它解释 $_REQUEST['q'] 的值。我对口译部分很感兴趣。

0 投票
9 回答
1811 浏览

python - 有了 Lua 和 Python 的可嵌入性,Basic 有没有一席之地?

我开始在ZX81上使用 Basic 编程,然后是BASICAGW-BASICQBasic。我转向 C(啊,Turbo C 3.1,我几乎不知道你......)

当我开始使用微控制器时,我使用Parallax的BASIC Stamp退步了。然而,BASIC 非常棒,因为它很容易理解,而且很难出错。我最终转向汇编和 C 语言,因为我需要额外的能力(速度、容量、资源等),但我知道,如果门槛更高,许多人将永远不会进入微控制器编程。

我一直渴望制作自己的片上 BASIC 解释器,但我想知道现在是否需要 BASIC,因为 Lua 和 Python 易于嵌入,并且与 BASIC 一样平易近人。

  • BASIC 与其他语言相比有哪些优势(如果有的话)?
  • 为什么它还在?
  • 如果我决定制作带有解释器的通用微控制器板,是否有理由制作 BASIC 版本?

很多其他语言都被认为已经死了,但 BASIC 一直在坚持。

0 投票
9 回答
88066 浏览

python - 如何将制表符补全添加到 Python shell?

使用 启动 django 应用程序时python manage.py shell,我得到一个 InteractiveConsole shell - 我可以使用制表符完成等。

刚使用 启动 python 解释器python时,它不提供制表符补全。

有人可以告诉我 django 正在做什么来给我一个交互式控制台,或者我需要做什么才能在没有 django 应用程序的情况下启动一个交互式控制台?

0 投票
14 回答
1184 浏览

compiler-construction - 新的动态编程语言的后端选择?

我一直在开发一个 Smalltalk 变体,只是为了好玩,我想知道在针对后端时,stackoverflowers 的伙伴会选择什么。这些是我目前的考虑:

.NET、JVM:这两个 VM 主要用于静态类型语言,我认为很难针对像 smalltalk 这样的动态语言。

Python(作为源代码):似乎是最简单的方法。此外,如果我可以发出 Python 字节码会更好,但它没有像其他 VM 的 AFAIK 那样被很好地记录(需要挖掘 Python 的源代码以获取详细信息!)。

自制口译员:不可能,因为这不好玩:-)

LLVM、NekoVM、Parrot 是我正在检查的其他选项。您对此有何看法?

0 投票
4 回答
797 浏览

interpreter - 为什么要使用目标语言编写语言解释器?

可能重复:
引导语言

为以目标语言编写的给定语言(例如PyPy)配备解释器的重要性是什么?

0 投票
5 回答
9086 浏览

c++ - 在 C/C++ 中实现解释器所需的参考资料

我发现自己加入了一个将解释器整合到现有应用程序中的项目。要解释的语言是 Lisp 的衍生语言,具有特定于应用程序的内置函数。单个“程序”将在应用程序中以批处理方式运行。

令我惊讶的是,这些年来我编写了几个编译器和几个数据语言翻译器/解析器,但我以前从未真正编写过解释器。原型很长,在 C++ 中实现为语法树遍历器。我可能会影响原型之外的架构,但不能影响实现语言(C++)。所以,约束:

  • 实现将在 C++ 中
  • 解析可能会使用 yacc/bison 语法处理(现在是)
  • 像 NekoVM 和 LLVM 这样的完整 VM/Interpreter 生态系统的建议对于这个项目可能并不实用。独立的更好,即使这听起来像 NIH。

我真正想要的是阅读有关实现解释器的基础知识的材料。我浏览了 SO 和另一个名为Lambda the Ultimate 的网站,尽管它们更倾向于编程语言理论。

到目前为止我收集的一些花絮:

  • Lisp in Small Pieces,克里斯蒂安·奎内克(Christian Queinnec)。推荐它的人说它“从琐碎的解释器转向更高级的技术,并完成了字节码和‘Scheme to C’编译器的呈现。”

  • 内科虚拟机。正如我上面提到的,我怀疑我们是否被允许合并一个完整的 VM 框架来支持这个项目。

  • 计算机程序的结构和解释。最初我建议这可能是矫枉过正,但经过一个健康的块,我同意@JBF。信息量大,思路开阔。

  • 保罗格雷厄姆在 Lisp上。我读过这篇文章,虽然它是对 Lisp 原则的信息性介绍,但不足以快速开始构建解释器。

  • 鹦鹉实施。这似乎是一个有趣的阅读。不确定它是否会为我提供基础知识。

  • 从零开始的计划。Peter Michaux 正在攻击 Scheme 的各种实现,从用 C 编写的快速而肮脏的 Scheme 解释器(在以后的项目中用作引导程序)到编译的 Scheme 代码。到目前为止非常有趣。

  • Language Implementation Patterns: Create Your Own Domain-Specific and General Programming Languages ,在Books On Creating Interpreted Languages的评论线程中推荐。这本书包含两章专门介绍构建解释器的实践,所以我将它添加到我的阅读队列中。

  • New (and yet Old , ie 1979): Writing Interactive Compilers and Interpreters by PJ Brown。这本书早已绝版,但有趣的是提供了与基本解释器的实现相关的各种任务的大纲。我看到这个的评论褒贬不一,但因为它很便宜(我订购它时使用了大约 3.50 美元),我会试一试。

那么怎么样呢?有没有一本好书可以帮助新手并展示如何在 C/C++ 中为类似 Lisp 的语言构建解释器?你喜欢语法树遍历器还是字节码解释器?

回答@JBF:

  • 当前的原型是一个解释器,这对我来说很有意义,因为我们接受了任意代码文件的路径并在我们的应用程序环境中执行它。内置函数用于影响我们的内存数据表示。

  • 它不应该慢得可怕。当前的树行者似乎可以接受。

  • 该语言基于Lisp,但不是 Lisp,因此不需要符合标准。

  • 如上所述,我们不太可能被允许添加一个完整的外部 VM/解释器项目来解决这个问题。

对于其他海报,我也会查看您的引文。谢谢大家!

0 投票
4 回答
396 浏览

scripting - 创建 DSL 与嵌入现有语言

这经常出现:您的应用程序已经变得足够广泛,是时候在其中添加一些可编程性以使其灵活了。一个示例可能是财务应用程序 - 您想添加一个公式编辑器,以便您可以创建自己的自定义公式,而无需重新编译代码。

您必须做出选择:您是否创建自己的标记器、解析器和解释器/编译器链,这可能需要很长时间并且可能会不正确?还是您只是嵌入了另一种脚本语言,它的问题是它可能会使您的代码膨胀并使您的应用程序暴露于安全漏洞。

您将如何权衡取舍并做出此决定?

0 投票
6 回答
5467 浏览

shell - 哈斯克尔互动

我对我的 Haskell 有点生疏了,我希望重新开始。我喜欢 F# 的一件事是与 Visual Studio 集成的 F# Interactive shell:我几乎可以评估任何东西(包括函数和类定义)并将 F# 用作 shell。Haskell 中是否有等价物?当我使用 时ghci,我无法评估函数定义。你如何解决这个问题?

我目前的首选设置是使用带有 haskell 模式的 Emacs 并打开交互式 ghi 解释器。但是,有没有办法只评估文件的区域?

0 投票
9 回答
6395 浏览

algorithm - 在brainfuck程序中检测无限循环

我用MATLAB 脚本语言编写了一个简单的脑筋急转弯解释器。它被提供随机 bf 程序来执行(作为遗传算法项目的一部分)。我面临的问题是,程序在相当多的情况下都会出现无限循环,因此 GA 会卡在这一点上。
因此,我需要一种机制来检测无限循环并避免在 bf 中执行该代码。
一个明显的(微不足道的)案例是当我有

我可以检测到这一点并拒绝运行该程序。
对于非平凡的情况,我发现基本思想是:确定循环的一次迭代如何改变当前单元格。如果变化是负的,我们最终会达到 0,所以这是一个有限循环。否则,如果更改为非负数,则为无限循环。
在单个循环的情况下实现这一点很容易,但是对于嵌套循环,它变得非常复杂。例如,(以下(1)指的是单元格1的内容等)

因此代码不断运行。然而,在单元格 1 上对 + 和 - 的数量进行简单检查会说 - 的数量更多,因此不会检测到无限循环。
给定 bf 中任意数量的循环的任意嵌套,谁能想到一个检测无限循环的好算法?

编辑:我确实知道停止问题通常是无法解决的,但我不确定是否不存在特殊情况例外。就像,也许 Matlab 可以充当超级图灵机,能够确定 bf 程序的停止。我可能大错特错,但如果是这样,我想确切地知道如何以及为什么。

第二次编辑:我写了我声称的无限循环检测器。它可能会遗漏一些边缘情况(或者不太可能,以某种方式逃脱图灵先生的魔掌),但到目前为止似乎对我有用。以伪代码形式,这里是: