2010-08-21 26 views
5

Tôi đã cân nhắc không ngừng về ngôn ngữ/khuôn khổ nào phù hợp nhất với những điều sau đây. Tôi cần phát triển một khuôn khổ HPC. Tất cả quá trình xử lý sẽ hoàn toàn là OO. Nó sẽ truyền đối tượng giữa các thể hiện (bên ngoài) và nội bộ giữa các chủ đề & động cơ. Các đối tượng sẽ là phần mở rộng của Active Messages.Ngôn ngữ/khuôn khổ nào cho HPC: Java/.Net/Delphi/C/C++/Objective-C?

Những trường hợp có thể chạy trên điện thoại di động, Windows, Mac, Linux, vv

Hệ thống này cần có khả năng để thực hiện tính toán cao song song với tốc độ & hiệu quả, tốt nhất là tận dụng lợi thế của SSE, và lý tưởng hỗ trợ CUDA/OpenCL.

Tôi đã xem xét những điều sau đây:

Java - đó là bộ nhớ đói và không chạy trên Mac (không chính thức, dù sao)
Net - bộ nhớ đói; giới hạn trong phạm vi nền tảng; không có SSE gốc
Delphi - không phải 64 bit; phạm vi nền tảng giới hạn
C/C++ - không được Mac hỗ trợ trực tiếp; phức tạp để mã; tuy nhiên nó có mặt ở mọi nơi
Mục tiêu-C - được Mac hỗ trợ; dường như được hỗ trợ ở nơi khác; hoạt động bằng cách truyền tải thông điệp, theo yêu cầu thiết kế của tôi; không biết nhiều về nó

Bất kỳ đề xuất nào?

+1

Java chạy trên Mac kiểm tra http://developer.apple.com/java/faq/ – YoK

+0

C và C++ được hoàn toàn được hỗ trợ bởi Mac. Bạn nghĩ gì về hệ điều hành Mac được viết? – Joe

+0

"Gửi tin nhắn" == "phương thức gọi". Hoàn toàn không khác. – Joe

Trả lời

5

Đây là chạy của tôi xuống của một số tùy chọn (không theo thứ tự đặc biệt):

C/C++

Nếu tất cả các bạn quan tâm là hiệu suất (và khác), chúng sẽ cung cấp. Truy cập trực tiếp vào các cấu trúc mức hệ thống, chẳng hạn như ái lực bộ xử lý và lắp ráp nội tuyến chắc chắn có thể có tác động đến hiệu năng. Tuy nhiên, có 2 nhược điểm chính đối với tùy chọn C/C++. Đầu tiên không có mô hình bộ nhớ được xác định rõ, vì vậy mô hình bộ nhớ mà bạn đang phát triển chống lại là CPU bạn đang chạy hệ thống (nếu bạn không biết mô hình bộ nhớ là cách nó áp dụng cho lập trình đồng thời, thì bạn không nên không làm được). Điều này liên kết bạn rất chặt chẽ với một nền tảng duy nhất. Thứ hai là thiếu bộ thu gom rác, quản lý bộ nhớ thủ công rất khó khăn (nhưng có thể thực hiện được) trong các trường hợp đơn giản, với C++ một số tiện ích hỗ trợ đơn giản hóa vấn đề (ví dụ: con trỏ tự động/con trỏ thông minh). Khi viết mã đồng thời, nó là một trật tự của cường độ khó khăn hơn như các quy tắc cho nên phát hành một phần nhất định của bộ nhớ trở nên rất khó để xác định. Ví dụ. khi một đối tượng được truyền vào một chủ đề khác, ai chịu trách nhiệm phát hành nó? Nếu sử dụng C++, điều quan trọng là phải đảm bảo rằng bạn đang sử dụng các phiên bản an toàn của các lớp được sử dụng để giúp quản lý bộ nhớ. Ví dụ. con trỏ thông minh tăng chỉ hỗ trợ việc sử dụng các phương thức được khai báo là "const" trên các chủ đề khác nhau (ví dụ: dereferencing là OK), tuy nhiên các phương pháp không const (ví dụ: bài tập) không phải là chủ đề an toàn.

Java

Java sẽ là đề nghị của tôi, nó đã hỗ trợ trên tất cả các nền tảng mà bạn đề cập (bao gồm cả điện thoại di động, ví dụ JavaME và Android) cũng như CUDA support. Java có một mô hình bộ nhớ được xác định rõ ràng, nhất quán trên các nền tảng, một JIT mạnh mẽ và trưởng thành và trình tối ưu hóa, và số lượng các bộ thu gom rác tốt và cải thiện. Hầu hết các ứng dụng có mục đích chung được viết bằng Java sẽ chạy nhanh như các đối tác C/C++ của chúng. Trong khi nó là một chút hog bộ nhớ, nếu bạn đang làm HPC làm việc bạn có nhiều khả năng sẽ ném một số phần cứng khá tại vấn đề này. Cho rằng bạn có thể giải quyết 100s của GB trên phần cứng hàng hóa, vấn đề bộ nhớ là ít hơn một vấn đề hơn nó được sử dụng để được.Điện thoại di động là khu vực thực sự duy nhất mà việc sử dụng bộ nhớ bị hạn chế và môi trường thời gian chạy chuyên gia thực hiện tốt hơn về mặt này (xem ở trên). Nhược điểm chính duy nhất của Java (từ phối cảnh HPC) là thiếu các loại phức tạp sao chép (tức là các cấu trúc trong C#) vì vậy tất cả các đối tượng phức tạp phải được cấp phát đống gây áp lực lên GC. Phân tích thoát được cho là giúp đỡ với điều này một chút, tuy nhiên rất khó để làm cho nó hoạt động tốt trong các trường hợp rất chung chung (lưu ý rằng nó đã nhảy vào và ra khỏi các bản sửa đổi khác nhau của JDK gần đây).

Đáng nói đến việc hỗ trợ ngôn ngữ rộng (Scala và Groovy ++ có hồ sơ hiệu suất khá tốt) và có một số thông báo đồng thời đồng bộ khung (actors, akka, kilim).

C# /. Net

Có lẽ hoàn thiện nhất từ ​​góc độ ngôn ngữ, đặc biệt là nếu bạn bao gồm những thứ như F # cho tiếp cận mọi thứ một cách chức năng. Tuy nhiên, bạn thường được đẩy về phía một nền tảng MS nếu bạn muốn có hiệu suất tốt nhất (và câu chuyện di động ở đây cũng không tuyệt vời). Mono tạo ra một tính năng nền tảng khá tốt khôn ngoan (caveat: Tôi là một cộng tác viên) tuy nhiên họ vẫn đang chơi bắt kịp với hiệu suất, ví dụ: một bộ thu gọn, chính xác vừa được thêm vào và vẫn còn là một thử nghiệm nhỏ.

Google Go

Rất mới, nhưng thú vị từ quan điểm rằng nó được natively biên soạn (không JIT overhead), nhưng vẫn có một thời gian chạy mạnh, mô hình bộ nhớ, thu gom rác và hỗ trợ trực tiếp cho CSP (đồng thời liên tục chế biến) các tính năng bằng ngôn ngữ (kênh). Có lẽ có một số cách để đi, sự phát triển của một GC mới đã nhận được theo cách nhưng chưa nổi lên và có lẽ nhiều hơn nữa họ có thể nhận được ra khỏi trình biên dịch.

Haskell và ngôn ngữ chức năng khác

Không nhiều kinh nghiệm ở đây, nhưng một số các cấu trúc chức năng như tính bất biến và bộ sưu tập dai dẳng có thể khá hữu ích cho việc xây dựng các ứng dụng đồng thời mạnh mẽ.

+0

quản lý bộ nhớ thủ công là * không * khéo léo trong C++. nó có các thùng chứa, con trỏ thông minh và RAII nghĩa là bạn không bao giờ xóa hoặc giải phóng thủ công. – Inverse

+0

Tôi đã cập nhật phần C++, tuy nhiên vấn đề là việc quản lý bộ nhớ C/C++ (thậm chí sử dụng thư viện hỗ trợ) trở nên rất khó khăn trong một kịch bản đồng thời. –

0

Hệ thống này cần có khả năng để thực hiện tính toán cao song song với tốc độ & hiệu quả, lý tưởng tận dụng lợi thế của SSE, và lý tưởng hỗ trợ CUDA/OpenCL.

Điều này thu hẹp xuống C hoặc C++. Và kể từ khi bạn muốn OO, nó thu hẹp xuống chỉ C++.

Mặc dù nghiêm túc, chọn những gì bạn hay phát triển của bạn là tốt nhất trong.