Pemrograman Multi-Core/Bersamaan dan .NET/Java

Saya sering mendengar tentang bahasa lain yang dipromosikan sebagai bahasa yang lebih cocok untuk pemrograman multi-core/bersamaan, misalnya. Clojure, Scala, Erlang dll. tapi saya sedikit bingung mengapa saya perlu khawatir tentang banyak inti, bukankah seharusnya Java/.NET VM menanganinya secara otomatis dan jika tidak, apa alasan di baliknya?

Apakah karena bahasa-bahasa yang disebutkan tersebut bersifat fungsional dan memiliki keunggulan intrinsik dibandingkan bahasa non-fungsional?


person Eugene    schedule 16.08.2011    source sumber


Jawaban (4)


Alasan Anda perlu berhati-hati adalah karena prosesor secara umum tidak menjadi lebih cepat. Sebaliknya lebih banyak dari mereka yang ditambahkan ke komputer dalam bentuk inti tambahan. Agar suatu program dapat memanfaatkan prosesor tambahan, secara umum program tersebut harus menggunakan banyak thread untuk melakukannya. Java, dan sebagian besar bahasa lainnya, tidak akan secara otomatis menggunakan lebih banyak thread dalam program Anda. Ini adalah sesuatu yang perlu Anda lakukan secara manual.

Beberapa orang lebih memilih bahasa gaya fungsional seperti Scala, Erlang dan F# daripada non-fungsional untuk pemrograman multi-thread. Bahasa fungsional cenderung tidak dapat diubah secara default dan karenanya secara teori lebih mudah digunakan dalam situasi multi-utas.

Ini adalah artikel yang sangat bagus tentang hal ini

person JaredPar    schedule 16.08.2011

Bahasa fungsional memiliki keunggulan intrinsik karena sebagian besar fungsi/metode yang dipanggil bersifat idempoten dan biasanya sering menggunakan "kekekalan".

Melakukan konkurensi saat menggunakan "barang" yang tidak dapat diubah jauh lebih mudah daripada saat menggunakan "barang" yang dapat diubah.

Namun: Anda perlu mengkhawatirkan konkurensi karena kita akan menggunakan CPU dengan inti yang lebih banyak dan tidak jam yang lebih cepat dan lebih cepat. Java / C# tidak secara otomatis membuat program Anda bersamaan: Anda masih harus melakukan kerja keras sendiri.

person SyntaxT3rr0r    schedule 16.08.2011

Dalam kasus bahasa imperatif normal, secara default tidak, Anda tidak mendapatkan banyak bantuan dari platform. Tidak ada kompiler yang cukup pintar untuk memparalelkan kode imperatif normal.

Namun ada berbagai perpustakaan bantuan yang dapat membantu Anda di berbagai platform. Misalnya perpustakaan Task Parallel di .NET memungkinkan Anda melakukan ini misalnya:

Parallel.ForEach(files, file => 
{
   Process(file);
});

Bahasa fungsional murni selalu memiliki keunggulan status bersama minimal yang berarti kode tersebut lebih mudah diparalelkan.

person Anders Forsgren    schedule 16.08.2011

Saya tidak pernah memprogram bahasa fungsional, tetapi bahasa tersebut seharusnya lebih mudah untuk pengkodean secara bersamaan karena statusnya tidak berubah (atau tidak banyak berubah), sehingga Anda dapat memiliki objek yang sama di dua utas sekaligus. Jika Anda memiliki objek yang sama pada dua thread sekaligus di Java, Anda harus sangat berhati-hati dan menggunakan beberapa konstruksi sinkronisasi khusus sehingga kedua thread dapat "melihat" objek dalam keadaan yang sama bila diperlukan.

Masalah saat ini dalam pemrograman adalah semua orang terbiasa melakukan sesuatu secara berurutan, namun perangkat kerasnya bergerak multi-core. Harus ada pergeseran paradigma yang menyeluruh dalam cara kita membuat kode dan berpikir tentang kode. Saat ini, pengkodean untuk multi-core di Java atau C# pada dasarnya hanyalah pengkodean berurutan dengan peretasan agar dapat diparalelkan. Akankah pemrograman fungsional menjadi perubahan paradigma yang diperlukan? Aku tidak tahu.

person toto2    schedule 16.08.2011