静态类型、可嵌入、可编译的脚本语言

3

我正在寻找一种具有以下特点的语言:

  • 与SWIG兼容或类似。易于与C++兼容:

C、C++、AllegroCL、C#-Mono、C#-MS .NET、CFFI、CHICKEN、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")!)。并且可以编译成任何汇编/中间语言。

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

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

C:gcc,libClang 等;C++;C#;D;Python;Go;OCaml;Lua:LuaJIT;Ruby:Ludicrous

  • 最好带有调试器 :)

简而言之

我想要一个静态类型的可嵌入脚本语言,可以进行编译以提高性能。

有什么想法?评论?任何输入?谢谢!

编辑 目前有效的建议:

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


1
Racket自带一种静态类型语言——Typed Racket,但我不知道它是否与SWIG互操作。 - Begemoth
我很好奇你为什么说"exec("gcc plugin.cpp")不算!"。如果将其与dlopen结合起来,就可以完全实现编译代码并从编译它的进程中运行它的功能。尽管在文件系统使用方面有些繁重,但除此之外应该都能正常工作。 - Brooks Moses
它在我的电脑上可以运行。在Windows上重启:不起作用。没有Cygwin:不起作用。gcc版本不正确:不起作用。文件权限不正确:不起作用。路径不正确:不起作用。 - Calvin1602
在Windows上,你需要像Git运行MSYS一样使用MinGW来发布你的程序。另外有一个问题,你需要使用MinGW而不是Visual C++来构建你的C++程序,因为编译器的ABI不同。 - Begemoth
4个回答

1

Ruby在你们的列表中,而Rubinius编译器将其编译成字节码。这符合你的需求吗?

第二次尝试:你看过Boo吗?它是“用于公共语言基础结构的面向对象静态类型编程语言”。


Ruby不是静态类型语言,所以不行。 - Tom Anderson
Boo似乎不太容易从C++中嵌入。但是你说得很对:.NET对此很好,而且你可以从C#编译C#:http://support.microsoft.com/kb/304655/en-us - Calvin1602
被接受为解决方案。不是针对Boo,而是针对C#,可以通过SWIG嵌入,并使用Mono即时编译:http://docs.go-mono.com/Mono.CSharp.Evaluator.Compile%20%28string%29。 - Calvin1602

1

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

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

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


1

或许可以看看 OpenCL?它是围绕着一种类似 C 语言的编程语言设计的,可以在运行时进行编译,但 AMD 的最新 SDK 还提供了离线预编译的能力。

虽然 OpenCL 主要用于 GPU,但它的设计目标更广泛,同样适用于普通 CPU。


对于意想不到、独特和聪明的回答,我给你加1分。不过,我需要更多时间来形成一个更好的观点 :) - Calvin1602
请纠正我,但我认为从内核调用C++函数是不可能的。这对于脚本语言来说是行不通的。太糟糕了。 - Calvin1602
你说得对,我漏掉了需求的那一部分。我认为你可能可以在某种程度上调用内联的C++函数,但是调用非内联的C++(或C)代码是行不通的。 - Brooks Moses

0

我相信D语言是可编译的,也可以作为脚本运行。


很遗憾,除非我漏掉了什么,否则没有办法从C++编译D。 - Calvin1602
为什么你想要“编译”成C++? - HRÓÐÓLFR
不是“用C ++编写”。我想能够在C ++中编写像这样的东西:prog = CompileDProgram(“blah.d”); prog.executeDFunction(“some_function”)。就像我在Boost :: Python或Luabind中所做的那样。 - Calvin1602

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接