【问题标题】:Compiled interpreted language编译的解释语言
【发布时间】:2010-07-06 23:28:41
【问题描述】:

是否有一种编程语言,具有可用的交互式解释器,即使它可以编译为机器代码?

【问题讨论】:

  • “可用的交互式解释器”是什么意思?大多数解释语言实际上是翻译的
  • @staticsan 通过交互式解释器,我的意思是类似于 shell 的环境,您可以在运行时交互地工作。通过机器代码,我不是指字节码。 (如果我的术语不是最准确的,请原谅)
  • 您要查找的术语是“REPL”(Read-Eval-Print-Loop)。
  • 通过 Futamura,解释器和编译器紧密相连,可以通过部分求值相互生成。见en.wikipedia.org/wiki/Partial_evaluation#Futamura_projections
  • @Don:出于某种原因,我将其读作“未来世界”。

标签: programming-languages compilation interpreter read-eval-print-loop


【解决方案1】:

编译与“解释”本质上是实现问题,而不是语言本身。例如,MRI Ruby 1.8 被解释,而 MacRuby 被编译为本机代码。两者都包括一个交互式REPL。我所知道的所有至少有一个机器代码编译器和至少一个 REPL 的语言:

  • 红宝石
  • Python
  • 几乎所有的 Lisps(Lisp 是开创这种技术的语言,AFAIK)
  • OCaml
  • 哈斯克尔
  • 第四次

如果我们将编译计算为字节码和机器码,那么绝大多数流行的字节码编译语言都是如此:

  • Java
  • 斯卡拉
  • 时髦的
  • 二郎
  • C#
  • F#
  • 闲聊

【讨论】:

  • 这就是为什么 Smalltalk 在带有 REPL 的字节码编译语言列表中。
【解决方案2】:

Haskell,使用 Glasgow Haskell Compiler,它有一个名为 GHCi 的交互式“shell”。

【讨论】:

  • 实际上与 QuickBasic 相同,但会产生 16 位机器代码,因此此注释是出于历史兴趣。
  • 我不记得 qbasic 的交互式 shell :)
  • @mykhal:它被称为即时窗口。但请注意,QBasic 无法编译(只有 QuickBasic 可以)。
  • 好吧好吧,哈斯凯尔不是今晚四人组中最受欢迎的孩子吗? :-)
【解决方案3】:

许多 Lisp 风格都提供这两种选择,包括 Clojure。

【讨论】:

  • Clojure 被编译为字节码,而不是机器码(除非您在某些 Java 实现中计算抖动)。但在其他语言上也是如此。
  • @Chuck 是的,当我写原始答案时,他没有添加排除字节码的注释......
【解决方案4】:

我想到了两个:ocaml 和 scala (~= java),但我相信肯定还有更多。

【讨论】:

  • BTW :将 ocaml 编译为本机代码的命令是“ocamlopt”(ocamlc 将编译为字节码)。至于scala,我不确定gcj是否可以编译它的java兼容字节码,所以如果有人有更多信息..?
【解决方案5】:

还有一个可以烧掉你的房子:

x86 汇编

是的,也有翻译。

此时您确实处于模拟器领域,但它确实满足您陈述的要求。

我想知道是否更容易命名有人没有为其拼凑出工作解释器的编译语言。 :-)

【讨论】:

    【解决方案6】:

    Lua 具有用于单行和实验的交互模式。它通常编译为其 VM 的字节码以供执行。 LuaJIT 是 Lua VM 的独立实现,它还可以对 32 位 x86 进行即时编译。对 64 位的支持正在进行中,并且经常请求对 ARM 的支持。

    编译成字节码通常是纯解释器和纯编译器之间的合理折衷。 VM 可以根据语言的需要进行调整,JIT 技术可以在 VM 代码执行时对其进行分析,并专注于频繁执行的代码路径和内部循环。

    【讨论】:

      【解决方案7】:

      正如其他人提到的那样,OCaml。

      如果托管代码 (.NET CLI) 与机器代码足够接近,那么 F# 也将是候选代码。可能还有其他符合要求的 .NET/Mono 语言。

      【讨论】:

        【解决方案8】:

        你可能会后悔问:

        C 和 C++。

        为什么?

        可能还有其他人在那里。

        【讨论】:

          【解决方案9】:

          许多语言都提供了一种既可以交互又可以编译为机器代码的实现,但很少同时进行这两种操作。 Standard ML of New Jersey 是一个具有交互式循环但没有字节码的循环:它只是在内存中编译为机器码,然后分支到它。

          【讨论】:

            【解决方案10】:

            不完全是机器码,但可以通过BeanShell 编译和使用Java。

            【讨论】:

            • Symantec Java IDE(忘记了它的名字)曾经有一个 Java 编译器。
            【解决方案11】:

            我使用 Ruby 和解释器,似乎有一个编译器 here

            【讨论】:

            • 我很确定这实际上只是一个将您的 ruby​​ 代码与解释器捆绑在一起的工具,它实际上并没有编译成机器代码。称它为编译器是误导和不正确的。
            • 我只是按照宣传的方式阅读该网站。不过,这很好,因为大多数人除非深入研究实现细节,否则不会知道其中的区别。
            【解决方案12】:

            Icon 曾经有一个编译器,但它进出维护。它可能仍然有效。

            【讨论】:

              【解决方案13】:

              Python 可以编译成 windows 可执行文件。

              【讨论】:

              • 与“RubyScript2Exe”的情况一样,您所指的工具实际上只是将 python 代码与 python 解释器捆绑在一起。这不是编译;将其称为编译器是对该术语的误用。但是,它非常有用,所以从实际的角度来看,这可能并不重要。 :-)
              【解决方案14】:

              C# 可以使用SnippetCompiler 进行编译,也许它可以充当您的交互式解释器?

              【讨论】:

                【解决方案15】:

                你的问题有点含糊。甚至 Java 也适合它:

                我的意思是交互式解释器 类似shell的环境,你可以在哪里 以交互方式在运行时工作。

                Java 有这个,例如在 Eclipse“剪贴簿页面”中,您可以在其中输入 Java 表达式并立即对它们进行评估。 Java 当然也是一种编译语言(虽然它通常被编译为字节码,但也有各种编译器可以输出机器码)。

                那么你在寻找什么?也许你可以解释你的问题或兴趣。

                【讨论】:

                • 我期待各种各样的答案,提到语言既能被编译成可执行文件,又能拥有成熟的交互式解释器
                【解决方案16】:

                我尝试使用 mono/.net 一段时间,发现随机的 GC 暂停令人不快(至少在我的旧笔记本电脑上是这样)。我研究了使用 gambit-c 一种可以编译为 C 的方案的实现,但它似乎很难使用,因为文档有些有限,而且软件包不太容易安装和使用。

                我通常只是坚持将解释性语言(例如 python)绑定到 C/C++,这会更痛苦,但至少我知道我在做什么。

                【讨论】:

                  猜你喜欢
                  • 2011-03-16
                  • 2021-01-15
                  • 2010-09-06
                  • 2016-11-24
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2011-02-09
                  • 1970-01-01
                  相关资源
                  最近更新 更多