Bahasa fungsional: Apa itu, ke mana sahaja mereka pergi

Walaupun ada yang berpendapat apa sebenarnya, pengaturcaraan fungsional tetap menarik perhatian pembangun. Dan tiga bahasa fungsional yang paling popular - Clojure, F #, dan Scala - siap digunakan untuk penambahbaikan.

Pengaturcaraan fungsional mempunyai daya tarik utama bagi sebilangan pemaju, kata pengasas Scala, Martin Odersky: "Pengaturcara di segmen itu menyukai pengaturcaraan fungsional kerana membuat kod lebih jelas, tersusun lebih baik, dan mencegah banyak kesalahan." Tetapi ada yang berpendapat bahawa pengaturcaraan berfungsi membawa kepada perisian yang kurang cekap.

Pengaturcaraan fungsional juga memerlukan pemikiran tentang pengaturcaraan dengan cara baru, kata David Stephens, pengurus program Microsoft untuk .Net dan jurucakap F #. Abstraksi boleh menjadi masalah: "Apabila anda membuat kod lebih abstrak, ketika anda menjauhkan diri dari manipulasi bit dan secara eksplisit melalui gelung, perlu lebih banyak masa untuk memahami abstraksi ini."

Apa itu bahasa berfungsi?

Dalam istilah yang paling asas, pengaturcaraan fungsional adalah mengenai menganggap pengiraan sebagai fungsi matematik. Selain bahasa yang ditagih sebagai berfungsi sejak awal, bahasa Java dan C # menjadi lebih berfungsi dengan menambahkan sokongan untuk ungkapan lambda.

Tetapi definisi tepat pengaturcaraan fungsional sukar dijelaskan. Blog Clojurefun memetik beberapa definisi yang diyakini tidak betul, termasuk mendefinisikan pengaturcaraan fungsional sebagai membolehkan gaya fungsional dengan fungsi pesanan lebih tinggi atau bahasa yang menyokong lambdas. Ia mengatakan bahawa definisi yang betul adalah bahasa yang menekankan fungsi dan data yang tidak berubah.

Tetapi definisi pilihan blog Clojure tidak semestinya betul, kata orang lain. "Penulis memilih satu, yang secara kebetulan paling sesuai dengan Clojure - tidak hairanlah, ini adalah blog Clojure," kata Scala's Odersky. "Saya mempunyai tafsiran yang hampir dengannya, tetapi tidak sama."

Fungsi, kata Odersky, adalah sekeping kod yang memetakan input ke output dan tidak mempunyai kesan lain di luar itu. "Ini definisi matematik fungsi yang kita gunakan di sini. Kadang-kadang fungsi ini disebut 'suci,' untuk membezakannya dengan, katakanlah, fungsi dalam C." Bahasa berfungsi menumpukan pada pengaturcaraan dengan fungsi murni, menjadikannya mudah dan hebat untuk melakukannya, kata Odersky, yang mengasaskan Typesafe, penyedia platform pengembangan aplikasi Typesafe JVM.

Pengaturcaraan fungsional dapat digabungkan dengan paradigma lain, katanya. "Sebagai contoh, fungsional berjalan sangat baik dengan berorientasi objek. Scala adalah bahasa fungsional dalam arti itu. Saya setuju bahawa hanya dengan lambda tidak menjadikan bahasa berfungsi; itu perlu tetapi tidak mencukupi."

Pembangun Clojure Rich Hickey, yang juga CTO di pembangun sistem Cognitect, bersetuju dengan pertikaian utama blog Clojure. "Artikel itu dengan tepat menunjukkan bahawa fungsi kelas pertama atau yang lebih tinggi bukanlah pengaturcaraan fungsional. Pengaturcaraan fungsional adalah untuk menjadikan pengaturcaraan lebih seperti matematik," katanya. Yang mengatakan, masih ada spektrum definisi untuk pengaturcaraan berfungsi, kata Hickey.

Microsoft Stephens melihat kemampuan berfungsi melampaui bahasa sahaja. "Bahasa pengaturcaraan fungsional yang paling popular di dunia adalah Excel," katanya. Lembaran kerja Excel yang sederhana mungkin mempunyai lajur dengan sejumlah nilai di dalamnya, seperti A1 X 2. "Itu fungsi murni pada A1, dan A1 tidak berubah, jadi anda mengira nilai dari data yang ada."

Teknologi Microsoft-Integrated Query (Linq) juga menyediakan pengaturcaraan berfungsi, katanya. "Hampir setiap bahasa pengaturcaraan sekarang menggunakan fitur dari bahasa fungsional."

Stephens mengutip data yang tidak berubah sebagai penting untuk pengaturcaraan berfungsi. Concurrency - program dengan banyak utas beroperasi pada data secara serentak - juga mendapat keuntungan dari data yang tidak berubah, katanya. "Kami memanggil [F #] bahasa pertama yang berfungsi kerana berasal dari warisan bahasa lain." Ia juga menyokong pengaturcaraan berorientasikan objek dan beroperasi dengan C # dan Visual Basic, katanya.

Clojure's Hickey melihat penggunaan bahasa fungsional sebagai tindak balas terhadap tekanan yang semakin meningkat yang dihadapi oleh pemaju, yang harus menghadapi masalah yang lebih besar hari ini. "Untuk melakukannya, mereka mesti mengurangkan kerumitan program mereka. Kini diakui secara meluas bahawa keadaan dan kesan sampingan yang meluas adalah sumber utama kerumitan dan bug dalam program," kata Hickey. "Walaupun mungkin untuk mengurangi jumlah keadaan dalam program yang ditulis dalam bahasa yang tidak berfungsi, secara dramatis lebih mudah dan cepat untuk melakukannya dalam bahasa yang menjadikan pengaturcaraan fungsional menjadi idiomatik dan lalai."

Apa yang seterusnya untuk tiga bahasa fungsional teratas

Scala yang berusia 13 tahun adalah bahasa utama dalam sains data, kata pengasas Scala, Odersky. Disokong pada JVM, ia dianggarkan 400,000 hingga 500,000 pengguna. Rencana dalam jangka pendek memanggilnya agar dioptimumkan untuk Java 8, di mana arahan bytecode dari peningkatan Java standard terkini akan membolehkan Scala menghasilkan kod yang lebih cekap.

Untuk jangka masa panjang, Scala akan mendapat sistem jenis pembersihan, makro yang lebih selamat, dan lebih banyak sokongan platform, dengan sokongan penyusun LLVM yang dipertimbangkan. Penambahbaikan selanjutnya dirancang untuk meningkatkan kebolehgunaan Scala.js, untuk menyusun Scala ke JavaScript.

Clojure yang berusia sembilan tahun, juga berdasarkan JVM, telah digunakan dalam bidang kewangan, peruncitan, perisian, dan hiburan, kata Hickey. "Ini telah diterapkan di berbagai bidang aplikasi seperti pemrosesan dan analisis transaksi, data besar, operasi jaringan, analisis ramalan, pencarian, keamanan, dan penawaran pengguna."

F # yang berusia 11 tahun diasaskan oleh Microsoft Research oleh Don Syme dan diawasi oleh F # Foundation. Ini digunakan dalam berbagai aplikasi dan berjalan di Linux, OS X, Android, iOS, Windows, dan penyemak imbas. "Apa yang sedang kita kerjakan sekarang adalah membuatnya berfungsi dengan .Net Core," sumber terbuka, platform modular lintas platform .Net Framework, kata Stephens. Interpolasi tali, menjadikannya lebih mudah untuk menulis rentetan, terdapat di papan lukisan.