"PLO tidak akan lagi bisa menyelamatkan kita dari Cloud Monsters."
Catatan Penerjemah: Ada dua konsep - paralelisme (eksekusi pada saat yang sama, secara independen) dan daya saing (eksekusi dalam langkah-langkah, pada gilirannya, tetapi pada saat yang sama beberapa tugas), dan seperti biasa, saya harus menghancurkan kepala saya dengan memilih istilah yang tepat.
Saya akan menduplikasi beberapa kata atau istilah dalam tanda kurung dalam aslinya, untuk mencari informasi tambahan dalam istilah bahasa Inggris, yang akan berkali-kali lebih banyak.Mungkin Anda sudah pernah mendengar ungkapan seperti itu, seperti: "Clojure", "Scala", "Erlang" atau bahkan "Jawa sekarang memiliki lambdas". Dan Anda memiliki, meskipun gagasan yang jauh tentang "Pemrograman Fungsional." Jika Anda adalah anggota komunitas pemrograman apa pun, maka topik ini sudah dapat Anda diskusikan.Jika Anda mencari Google untuk frasa "Pemrograman Fungsional," Anda tidak akan melihat sesuatu yang baru. Bahasa kedua dari yang dibuat sebelumnya sudah mencakup topik ini, dibuat pada 50-an dan disebut Lisp. Lalu, apa-apaan, topik ini telah menjadi populer sekarang? Hanya 60 tahun kemudian?Pada awalnya, komputer sangat lambat
Percaya atau tidak, komputer adalah yang paling lambat dari DOM. Tidak benar-benar. Dan pada saat yang sama, ada 2 ide utama dalam perjanjian tentang desain dan implementasi bahasa pemrograman:- Mulailah dengan arsitektur von Neumann dan tambahkan abstraksi.
- Mulailah dengan matematika dan hapus abstraksi.
Komputer tidak memiliki daya komputasi yang cukup untuk menangani semua abstraksi dan mengatasi program yang ditulis dalam gaya fungsional. Jadi Lisp kelelahan sebelumnya, menjadi sangat lambat dan karenanya tidak cocok untuk bekerja. Saat itulah dominasi gaya pemrograman imperatif dimulai, terutama dengan masa kejayaan C.Tetapi komputer telah meningkat pesat.
Sekarang sudah menjadi hampir normal untuk menggunakan sebagian besar aplikasi, sama sekali tidak peduli bahasa apa yang mereka tulis. Bahasa fungsional akhirnya mendapat kesempatan kedua.Pemrograman fungsional 50.5
Artikel ini sama sekali bukan pengantar untuk FI. Di akhir bagian ini, Anda perlu mengetahui apa itu AF dan bagaimana memulai perjalanan studi Anda.Anda dapat memahami istilah "Pemrograman Fungsional" terlalu harfiah sebagai pemrograman menggunakan fungsi dan ini tidak jauh dari kebenaran. Anda akan membuat fungsi dalam hal fungsi lain dan fungsi menulis (Apakah Anda ingat f youg dari kurikulum sekolah? Sekarang akan berguna). Itu semua.Daftar (tidak lengkap) fitur FP:- Fungsi Kelas Satu
- Fungsi Orde Tinggi
- Fungsi murni
- Penutupan
- Keadaan Abadi
Sekarang Anda tidak perlu khawatir tentang istilah-istilah aneh ini, cukup pahami artinya.Fungsi dari kelas pertama berarti bahwa Anda dapat menyimpan fungsi dalam variabel. Saya yakin Anda melakukan hal serupa, seperti pada contoh JavaScript:var add = function(a, b){
return a + b
}
Anda baru saja membuat fungsi anonim yang mendapat a dan b dan mengembalikan + b , dan menetapkan fungsi ini ke variabel add .Fungsi tingkat tinggi berarti bahwa fungsi dapat mengembalikan fungsi atau menerima fungsi sebagai parameter.Dan lagi di JavaScript:document.querySelector('#button')
.addEventListener('click', function(){
alert('yay, i got clicked')
})
atauvar add = function(a){
return function(b){
return a + b
}
}
var add2 = add(2)
add2(3)
Kedua opsi adalah contoh fungsi tingkat tinggi, bahkan jika Anda tidak menulis sesuatu seperti ini, Anda mungkin telah melihat sesuatu yang serupa di tempat lain.Fungsi murni berarti bahwa fungsi tersebut tidak mengubah variabel, ia hanya menerima data dan mengembalikan data, seperti fungsi favorit kami dari matematika. Ini juga berarti bahwa jika Anda memanggil fungsi f dengan argumen 2 dan mengembalikan 10 , maka ia akan selalu mengembalikan 10 . Tidak masalah apa lingkungan, jumlah utas atau urutan eksekusi. Mereka tidak menyebabkan efek samping di bagian lain dari program dan ini adalah konsep yang sangat kuat.Sirkuit pendek berarti Anda dapat menyimpan beberapa data di dalam fungsi yang akan tersedia dalam fungsi pengembalian spesifik, dengan kata lain, fungsi pengembalian menyimpan runtime-nya.var add = function(a){
return function(b){
return a + b
}
}
var add2 = add(2)
add2(3)
Lihat lagi pada contoh kedua dari paragraf. Fungsi dari orde yang lebih tinggi , variabel a ditutup dan hanya tersedia dalam fungsi yang dikembalikan. Sebenarnya, penutupan bukan fitur dari paradigma FP, melainkan optimisasi.Keadaan abadi berarti bahwa Anda tidak dapat mengubah keadaan sama sekali (meskipun Anda dapat membuat yang baru). Dalam kode berikut (pada OCaml), Anda mengatur variabel x ke 5 dan x akan selalu menjadi 5 .let x = 5;;
x = 6;;
print_int x;;
Fitur-fitur ini terlihat cukup aneh, tetapi Anda akan segera melihat bagaimana mereka membuat hidup Anda lebih mudah.Pemrograman Berorientasi Objek Tidak Dapat Melindungi Anda Lagi
Ini adalah waktu yang menjanjikan ketika kami dapat mendistribusikan dan aplikasi multi-threaded, akhirnya tiba. Sayangnya, model kami saat ini (atau yang paling banyak digunakan) tidak siap untuk konkurensi dan paralelisme, meskipun ini memecahkan masalah saat ini, itu juga menambah masalah besar.Untuk meningkatkan aplikasi, kita membutuhkan cara yang sederhana dan dapat diandalkan untuk mencapai apa yang kita inginkan. Apakah Anda ingat fitur AF yang disebutkan di atas? Fungsi murni dan kondisi tidak berubah? Itu benar, Anda dapat melakukan fungsi ribuan kali pada core atau mesin yang berbeda dan hasilnya akan selalu sama. Jadi, kita dapat menjalankan kode yang sama pada inti yang sama dan pada ribuan. Hidup kembali menjadi tak berawan."Tapi kenapa aku tidak bisa terus menggunakan OOP?"
Setidaknya untuk multithreading dan paralelisme, OOP tidak dapat lagi membantu Anda. Karena OOP mengacu pada keadaan dengan keadaan bisa berubah-ubah (dalam bahasa imperatif yang ditulis dalam gaya OOP, dalam banyak kasus). Metode yang disebut objek seharusnya mengubah diri saat ini atau ini . Anda harus melakukan upaya yang cukup untuk memperbarui dan menyinkronkan semua utas dengan benar.Saya menulis ini bukan untuk membuat Anda gelisah untuk beralih ke FP dari paradigma yang saat ini Anda gunakan (walaupun beberapa orang akan mengatakan saya harus), tetapi Anda harus mengerti: Java dan C ++ 11 sudah memiliki kalkulus lambda. Saya dapat mengatakan bahwa hampir semua bahasa modern dan yang didukung akan menerapkan fitur FP atau sudah melakukannya.Perlu dicatat bahwa kita tidak boleh berhenti menggunakan keadaan yang bisa berubah. Kita harus menggunakan input / output (IO), dll, agar program kita bermanfaat. Gagasan utama FP adalah: gunakan negara yang bisa berubah hanya jika benar-benar diperlukan."Saya tidak bekerja dengan awan, apakah saya benar-benar perlu mempelajari AF?"
Iya.Pemrograman Fungsional akan membantu Anda menulis program lebih baik dan berbicara tentang masalah yang harus Anda selesaikan."Saya telah mencoba. Itu terlalu rumit dan sulit dibaca kode. ”
Memulai selalu sulit di bidang apa pun. Saya yakin Anda mulai belajar pemrograman juga memiliki banyak masalah, bahkan dalam bahasa OOP. Mungkin mulai menulis dengan gaya OOP lebih mudah daripada menulis program pertama Anda karena Anda sudah terbiasa dengan beberapa idiom umum, seperti mendeklarasikan variabel dan untuk / sementara loop.Untuk mulai belajar FP hampir sama dengan mulai menulis program dari awal lagi (tidak peduli bahasa apa yang Anda mulai pelajari, akan jelas bagaimana memulainya dari awal).Banyak yang mungkin memperhatikan bahwa AF sulit dibaca. Jika Anda memiliki pengalaman dalam bahasa imperatif, program fungsional akan terlihat seperti kriptografi. Dan bukan karena memang benar, tetapi karena Anda tidak tahu idiom utamanya. Setelah memahami prinsip-prinsip dasar, program akan menjadi lebih mudah dibaca.Lihatlah program yang ditulis dalam Haskell dan JavaScript (gaya imperatif):guess :: Int -> [Char]
guess 7 = "Much 7 very wow."
guess x = "Ooops, try again."
function guess(x){
if(x == 7){
return "Much 7 very wow."
}
else {
return "Oops, try again."
}
}
Ini adalah program yang sangat sederhana. Ini menampilkan pesan ucapan selamat ketika pengguna menebak dan memasukkan nomor 7 atau menampilkan pesan kesalahan dalam semua kasus lainnya. Mungkin ini terlihat seperti enkripsi, karena Haskell dapat melakukan semua pekerjaan hanya dalam dua baris kode (Anda dapat mengabaikan baris pertama, itu hanya "deklarasi tipe"). Tapi itu akan menjadi sangat sederhana, sekali, setelah memahami kemungkinan pencocokan pola (yang diimplementasikan tidak hanya dalam bahasa FP, tetapi juga fitur mereka).Apa yang dilakukan Haskell:Jika argumen yang diterima untuk menebak adalah 7, maka itu akan mengembalikan "Banyak 7 sangat wow." atau akan kembali "Oooops, coba lagi." dalam kasus lain.Dan ini adalah hal yang sama yang dilakukan kode JavaScript, tetapi Haskell memetakan ke "pola" yang dinyatakan oleh programmer dalam kode tersebut.Pendekatan ini mungkin tampaknya tidak terlalu berguna dalam kasus ini, jika Anda dapat menggunakan if / else. Tetapi itu akan menjadi sangat berguna ketika Anda sendiri mulai menulis struktur data yang lebih kompleks.plus1 :: [Int] -> [Int]
plus1 [] = []
plus1 (x:xs) = x + 1 : plus1 xs
Dalam program di atas, * plus1 * adalah fungsi yang mengambil daftar bilangan bulat dan menambahkan 1 ke setiap elemen daftar. Fungsi membandingkan ketika daftar kosong [] (mengembalikan daftar kosong lainnya, karena tidak ada elemen di dalamnya) memintas daftar yang tidak kosong dan mendefinisikan pola yang cocok: x sebagai elemen pertama dari daftar, xs sebagai daftar yang tersisa. Maka itu hanya menghitung jumlah dan menggabungkannya melalui panggilan rekursif.Saya yakin Anda akan menghabiskan banyak waktu (bukan yang paling menyenangkan), menulis ulang contoh ini dalam gaya imperatif, menyesuaikan kode dalam dua baris, sambil mempertahankan keterbacaan.Jadi mari kita mulai
Banyak materi tentang Pemrograman Fungsional telah diterbitkan, tetapi Anda tidak boleh melewatkan tautan ini dengan jelas:- Prinsip-prinsip Pemrograman Fungsional di Scala : kursus ini akan berguna bagi mereka yang tahu Java dan ingin mencoba Pemrograman Fungsional tanpa melompat dari JVM. Kursus ini mencakup konsep dasar.
- Paradigma Pemrograman Komputer - Dasar-dasar : kursus ini akan berguna bagi mereka yang ingin belajar bagaimana menulis program dalam bahasa fungsional. Kursus ini menggunakan bahasa pembelajaran Qz. Ada banyak latihan dalam kursus ini, Anda dapat menggunakan bahasa fungsional dan mencoba membuat struktur data Anda sendiri. Saya percaya kursus ini menyediakan blok bangunan untuk "bangunan" yang disebut "Pemrograman Fungsional", ini akan membantu Anda dengan bahasa lain di masa depan.
Sayangnya, kursus hanya akan tersedia pada akhir tahun. Tetapi Anda dapat mengikuti konten dan video, mereka tersedia di Youtube.Di sisi lain, jika Anda lebih suka bahan teks, saya pasti merekomendasikan beberapa di antaranya:- Struktur dan Interpretasi Program Komputer
- Cara Mendesain Program
- Konsep, Teknik, dan Model Pemrograman Komputer
Dua yang pertama memiliki kurikulum serupa, memperkenalkan Anda pada dasar Pemrograman Fungsional dan sangat cocok untuk pemula. Link ketiga, kursus ini dalam Paradigma Pemrograman Komputer, mencakup lebih dari Pemrograman Fungsional. Penting untuk dicatat bahwa bahan-bahan ini untuk level awal.Selain itu, Chris Allen menulis artikel yang bagus tentang studi tentang Pemrograman Fungsional. Ini disebut Pendidikan Fungsional.dan memiliki daftar lengkap bahan untuk mempelajari pemrograman Fungsional menggunakan Haskell, serta berbicara tentang kekuatan dan kelemahan dari pendekatan ini. Mengikuti tautan yang direkomendasikan oleh Chris, Anda dapat mempelajari prinsip-prinsip dasar dan topik yang lebih kompleks (Saya yakin Anda pernah mendengar tentang monad) Pemrograman Fungsional dan mungkin Anda akan mengerti cara menulis aplikasi dengan menggunakannya. (Terima kasih Chris atas tautannya ke materi.)Semoga Sukses dengan Tahun Baru Fungsional Anda! ☺