HPC的哪种语言/框架:Java/.Net/Delphi/C/C++/Objective-C?

Iam*_*mIC 5 .net c c++ java objective-c

我已经无休止地考虑了哪种语言/框架最适合以下内容.我需要开发一个HPC框架.所有处理都将完全是OO.它将在线程和引擎之间的实例(外部)和内部之间传递对象.对象将是活动消息的扩展.

这些实例可以在移动,Windows,Mac,Linux等上运行.

系统需要能够以高速和高效率执行高度并行计算,理想情况下利用SSE,并且理想地支持CUDA/OpenCL.

我考虑过以下几点:

Java - 它是内存饥渴的,不能在Mac上运行(无论如何都不正式)
.Net - 内存饥渴; 平台范围有限; 没有本地SSE
德尔福 - 不是64位; 有限的平台范围
C/C++ - Mac不直接支持; 代码复杂; 然而它无处不在的
Objective-C - 由Mac支持; 似乎在其他地方得到支持; 通过传递消息来工作,这符合我的设计要求; 不太了解它

有什么建议?

Mic*_*ker 5

这是我的一些选项(没有特别的顺序):

C/C++

如果您关心的只是表现(而且没有否则),这些将提供.直接访问系统级构造(例如处理器关联和内联汇编)肯定会对性能产生影响.但是,C/C++选项有两个主要缺点.首先,两者都没有明确定义的内存模型,因此您开发的内存模型是您运行系统的CPU的内存模型(如果您不知道内存模型是如何应用于并发编程的,那么您应该不这样做.这使您与单个平台紧密相连.第二个是缺少垃圾收集器,在简单的情况下,手动内存管理很棘手(但可行),C++有许多支持实用程序可以简化问题(例如自动指针/智能指针).在编写并发代码时,由于应该释放某段内存的规则变得非常难以定义,因此它的难度要高一个数量级.例如,当一个对象被传递到另一个线程时,谁负责释放它?如果使用C++,确保使用用于帮助管理内存的类的线程安全版本非常重要.例如,boost智能指针仅支持使用跨不同线程声明为"const"的方法(例如,解除引用是正常的),但是非const方法(例如赋值)不是线程安全的.

Java的

Java是我的推荐,它支持你提到的所有平台(包括移动,例如JavaME和Android)以及CUDA支持.Java有一个定义良好的内存模型,它在各个平台上都是一致的,一个强大而成熟的JIT和优化器,以及一些优秀和改进的垃圾收集器.用Java编写的大多数通用应用程序的运行速度与它们的C/C++对应程序一样快.虽然它有点内存占用,但如果你正在进行HPC工作,你很可能会在这个问题上投入一些不错的硬件.鉴于您可以在商用硬件上处理100个GB,因此内存问题不再是以前的问题.移动是内存使用受限的唯一真实区域,专家运行时环境在这方面表现更好(见上文).Java的唯一主要缺点(从HPC的角度来看)是缺少复制复杂类型(即 在C#中的结构,所以所有复杂的对象都必须被堆分配给GC带来压力.逃避分析应该对此有所帮助,但是在很一般的情况下很难让它运行良好(注意它最近已经跳出了JDK的各种版本).

值得一提的广泛语言支持(Scala和Groovy中++有相当不错的表现型材),并有一些路过的并发框架(消息的演员,阿卡,基里姆).

C#/.NET

从语言的角度来看,可能是最完整的,特别是如果你以功能性的方式包含F#这样的东西.但是,如果您想获得最佳性能(这里的移​​动故事也不是很好),您通常会被推向MS平台.Mono明智地产生了一个非常好的平台功能(警告:我是一个贡献者)但是他们仍然在追赶性能,例如最近添加了一个精确的,紧凑的收集器并且仍然有点实验性.

Google Go

非常新,但有趣的是它本身编译(没有jit开销),但仍然具有强大的运行时,内存模型,垃圾收集器以及对语言(通道)中的CSP(并发顺序处理)功能的直接支持.可能有一些方法可去,新GC的开发已经开始但尚未浮出水面,并且可能还有很多可以从编译器中解脱出来.

Haskell和其他函数式语言

这里没有太多经验,但是一些功能构造(如不可变性和持久性集合)对于构建健壮的并发应用程序非常有用.