除了Scala,还有哪些第二语言适合用于LowLevel?

15

我非常喜欢Scala,感到绝对满意 :)

但是有时我真的想更加“低级”,不使用JVM,并使用类似SSE等“酷炫”的CPU特性。

那么除了Scala之外,还有哪些好的第二种语言呢?

它应该具备以下特点:

  • 编译为机器码
  • 易于使用C库
  • 可以非常接近硬件进行编程
  • 在需要时可以以非常高层次的方式进行编程

所以基本上我想要一个Scala,当我需要时可以直接插入内联汇编 :) 我认为这样的语言不存在,但也许有一些接近的语言。

那么什么是一个好的选择? C ++?D?OCaml?

我在C ++(15年前)和OCaml中都稍微编程过。在两种情况下,我只解决了一些问题,并没有深入了解过这门语言本身。


谢谢大家的回答。肯定有很多语言值得我去学习。我的最大问题是,我不确定大部分语言是否还会存在于10年后。我猜D语言可能是一个相对较新的语言,看起来至少有一些大众支持,因此应该是最好的折中选择。C++0x和JNI也是一些看起来实用的选项。 - Plankalkül
我认为Rust有很大的潜力和很多的动力。它是一种现代化的语言,具有现代化的要求和现代化的设计决策。由于Rust得到Mozilla的支持,并且他们正在使用Rust开发新的浏览器,我认为这种语言有很好的机会在未来继续发展和繁荣。 - Richard Gomes
10个回答

18

你所描述的基本上是D语言。

  • 编译为机器码:符合。虽然有一个实验性的.NET VM实现,但所有主要的DMD、LDC和GDC三个实现都直接编译成本机代码,并且该语言设计使本地编译可行。

  • 方便使用C库:D支持C ABI和所有C类型。几乎只需翻译头文件并链接C对象文件即可。 甚至可以部分自动化这个过程

  • 可以非常接近硬件地编程:符合。D是我所说的C的惯用超集。它不支持C语法的每个部分,其模块系统完全不同,在D2中,静态数组是值类型等等。然而,对于C语言中的任何构造(即不包括预处理器)在D或标准库中都具有等价构造。对于任何一段C代码(除了预处理器滥用),都有一个规范的D翻译,看起来大致相同,并且如果您使用相同的编译器后端,则应生成相同的汇编语言指令。换句话说,每个C惯用语(不包括预处理器滥用)都可以以直接的方式翻译成D。

    D的参考实现还支持内联汇编,因此您可以操纵SSE等。

  • 如果我想以非常高层次的方式进行编程:没问题。D语言被设计为主要是垃圾回收语言(虽然如果您坚持并小心不使用假设有GC的库/运行时功能,可以使用手动内存管理)。除此之外,高级编程主要通过模板元编程实现。在您离开之前,请了解D语言中的模板元编程相比C++得到了很大的改进。在D中进行模板元编程与在C++中进行面向对象编程一样,而在C++中,只有足够的功能可以使用巧妙的技巧使其勉强工作。对于在C++中进行面向对象编程和在C中进行面向过程编程也可以这样说。Phobos的std.algorithmstd.range模块是D语言高级子集的很好例子。


2
真正的男人使用文本编辑器用C语言编程;-) - user82238

8

以下是符合您问题中提到的标准的一些选项:


将BitC的链接更改为可用的链接...另外,如果我点击Clay,它会返回一个“未找到”页面。 - nbro
@nbro,这个答案已经发布六年了。如果链接已经失效,我也无能为力。我不拥有那些网站。 - missingfaktor
@nbro,我不是。如果你发现了一个损坏的链接,你可以自由地修复它。不要假设每个人都有时间更新他们五年前发布在StackOverflow上的答案。 - missingfaktor

6

我也在考虑这个问题,因为我正在做一个C项目,感觉非常没有效率,同时也想念Scala。(我也在旧石器时代做了很多C++...)我可能会转向Go。D语言也很有吸引力。

如果问题允许的话,另一个选择是使用C +脚本语言,比如Lua或Ruby。这就是Unix+shell和emacs一直在做的事情。当你需要性能和低级位操作时,它可以提供帮助,当你需要提高生产力时,它也可以提供帮助。


5
C++0X,Erlang,可能还有Haskell和Go。 C++和Erlang拥有强大的用户群体,并且有许多与C++0x和Erlang相关的工作机会。(我不确定Go的C / C ++互操作性如何)
C++0X(“cee plus plus oh ex”)是一个不错的选择。它具有lambda函数和其他好东西
C++0X TechDays 2010:使用C++0x进行现代编程的演示。

C++0X还具有良好的泛型支持,如Type Classes as Objects and Implicits中所记录,Oliviera、Moors、Odersky在2010年的OOPSLA会议上发表了相关论文。请参见他们下面的第12个图:

Figure 12 from Type Classes as Objects and Implicits


3
适合您要求的语言是C/C++,因为您可以在常规代码中嵌入汇编语言。调用C库将很自然 :)
另一个适合的选择是汇编语言的HLA实现(维基文章在这里),它是带有许多高级结构的汇编语言,使初学者更容易学习(并且更快),它编译成“正确”的本机代码。

2

2

根据你的需求,我认为Nimrod也是一个合适的选择。


1
你应该看一下Go

1

虽然它还很新,但你可以看看Vala。它是在GObject蛋糕上的一层甜美的语法糖,并编译成纯C。

它支持闭包和有限类型推断等功能。


1

考虑使用C或C++进行最底层的编程,然后在Scala库中使用JNI或JNA进行封装。在某些情况下,您可以通过这种方式两全其美。


你知道这会产生多少额外开销吗?只有调用“大型”函数才是实际可行的,还是可以调用许多小函数而不必担心额外开销? - Plankalkül
1
@Plankalkül - 我曾经非常了解它,但现在我已经忘记了。它的要点是,在像乘法这样的操作上使用它是一个非常糟糕的想法,但一旦你涉及到由几十个原始整数组成的大整数的乘法等复杂操作时,它就可以忽略不计了。到目前为止,我总是在C/C++需要做很多工作的情况下使用它,这样我就不必考虑调用的开销。 - Rex Kerr
谢谢,这绝对是好消息。 - Plankalkül

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