【问题标题】:statically typed, embeddable, compilable scripting langage静态类型、可嵌入、可编译的脚本语言
【发布时间】:2011-08-20 08:05:21
【问题描述】:

我正在寻找具有以下功能的语言:

  • SWIG 兼容或类似。与 C++ 的兼容性应该很容易:

C、C++、AllegroCL、C# - Mono、C# - MS .NET、CFFI、鸡、CLISP、D、Go ,Guile,Java,Lua, MzScheme/Racket、Ocaml、Octave、Perl、 PHP、Python、R、Ruby、Tcl/Tk

  • 静态类型:没有像 Lua 中的 myObject.CompletelyNewFieldWithUnknownSideEffects = GuessWhat()。没有像 php 中的 isinstance()。没有像 Python 中的 newVariableOfUnknownType = foo()。最好也是强类型(“Hello”+“0”而不是“Hello”+0):

C、C++、C#、D、Go、Java、Ocaml、PHP、Ruby?其他?

  • 可以在运行时编译(和 exec("gcc plugin.cpp")! 不算数!)成任何 asm/中间语言。

C : libCLang, Ch; C++:中文;任何脚本语言;其他?

  • 可以(离线或运行时)编译成 x86 .dll/.so 或 .cpp

C:gcc、libClang 等; C++; C#; D; Python;走; OCaml; Lua:LuaJIT;红宝石:可笑

  • 最好带调试器:)

TL;DR

我想要一种静态类型的、可嵌入的脚本语言,可以针对性能进行编译。

想法?注释 ?任何形式的输入?谢谢!

编辑到目前为止的有效命题:

所以希望比我最初想象的要多得多:)谢谢大家!我会继续调查,并在我对此主题有更多经验时接受答案。

【问题讨论】:

  • Racket 附带静态类型语言 - Typed Racket,但我不知道它与 SWIG 互操作。
  • 我很好奇你为什么说 "exec("gcc plugin.cpp") 不算数!"将它与 dlopen 结合使用,您就拥有了一种完整的编译代码并在编译它的进程中运行代码的方法。诚然,它对文件系统的使用有点繁重,但除此之外它应该可以正常工作。
  • 它可以在我的机器上运行。在 Windows 上重新启动:不起作用。没有 Cygwin :不起作用。错误的 gcc 版本:不起作用。错误的文件权限:不起作用。路径不正确:不起作用。
  • 在 Windows 上,您需要将程序与 MinGW 一起发布,就像 Git 与 MSYS 一起发布一样。由于编译器的 ABI 不同,因此您需要使用 MinGW 而不是 Visual C++ 构建 C++ 程序还有另一个问题。

标签: scripting-language compiled-language


【解决方案1】:

Ruby 在您的每个列表中,Rubinius 编译器将其编译为字节码。这符合您的需求吗?

第二次尝试:你看过Boo:“一种面向对象的静态类型编程语言,用于公共语言基础架构”

【讨论】:

【解决方案2】:

看看 OpenCL,也许吧?它是围绕一种在运行时编译的类 C 语言而设计的,但 AMD 最新的 SDK 也提供了离线预编译的能力。

这不是一个显而易见的选择,因为它被推广用于 GPU,但它被设计为比这更广泛适用,并且可以在普通 CPU 上运行。

【讨论】:

  • +1 表示意想不到的、原创的和聪明的答案。不过,我需要更多时间来形成更好的意见:)
  • 如果我错了,请纠正我,但我认为不可能从内核调用 C++ 函数。这对于脚本语言来说是不行的。太糟糕了。
  • 你是对的;我错过了那部分要求。我认为您可能能够在某种程度上调用内联 C++ 函数,但调用非内联 C++(或 C,就此而言)代码将不起作用。
【解决方案3】:

这几乎肯定不是一个有用的答案,但 Java 确实符合您的所有要点。

  • 您可以使用 JNI、JNA 或 SWIG 与本机代码对话。
  • 无需博士学位即可获得静态类型
  • 可以通过compiler API在运行时编译
  • 由一些优秀的编译器在运行时编译为本机代码(也有离线编译器)
  • 有许多调试器

问题在于它不完全是一种脚本语言。您需要编写大量样板文件才能完成一项小任务,而且 API 通常相当复杂。

【讨论】:

    【解决方案4】:

    我很确定 D 是可编译的并且可以作为脚本运行。

    【讨论】:

    • 很遗憾,没有,没有办法从 C++ 编译 D,除非我错过了什么。
    • 为什么要“编译”成 C++?
    • 不是“到 C++”。我希望能够用 C++ 编写类似的东西: prog = CompileDProgram("blah.d"); prog.executeDFunction("some_function")。就像我在 Boost::Python 或 Luabind 中所做的那样。
    猜你喜欢
    • 2010-11-18
    • 2011-02-04
    • 1970-01-01
    • 2017-12-29
    • 2012-09-17
    • 1970-01-01
    • 2012-11-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多