1 poin oleh GN⁺ 2024-12-04 | Belum ada komentar. | Bagikan ke WhatsApp
  • Berdasarkan pengalaman seorang developer menggunakan Haskell selama 8 tahun dan OCaml selama 8 bulan di produksi, artikel ini membandingkan rasa pengembangan nyata dari dua bahasa fungsional tersebut
  • Haskell menawarkan sintaks yang lebih ringkas dan fitur tipe yang kuat, tetapi banyaknya pilihan membuat perhatian mudah tersita oleh desain dan abstraksi
  • OCaml dinilai lebih memudahkan fokus pada implementasi berkat first-class modules, mutabilitas yang praktis, dan gaya kode yang mudah diprediksi, meski jumlah fiturnya lebih sedikit
  • Ekosistem Haskell lebih besar, tetapi memilih library bisa terasa seperti keahlian tersendiri; OCaml lebih kecil, tetapi tool yang dibutuhkan ternyata bekerja lebih baik dari dugaan
  • Keduanya lebih kecil daripada bahasa arus utama dan standard library-nya cenderung minimal, tetapi cukup layak dipakai untuk pengembangan aplikasi industri bila tidak sangat bergantung pada SDK tertentu

Titik awal perbandingan

  • Tolok ukurnya adalah pengalaman menggunakan Haskell selama 8 tahun dan OCaml selama 8 bulan di produksi
  • Sumbu perbandingannya meliputi sintaks, fitur bahasa, ekosistem, tooling, pesan compiler, dan standard library
  • Kedua bahasa sudah berkembang cukup jauh untuk mendukung kebutuhan industri nyata, tetapi preferensi saat ini lebih condong ke OCaml

Sintaks: Haskell lebih ringkas, OCaml juga punya keunggulan keluarga ML

  • Haskell dapat mengekspresikan ide dengan sangat sedikit karakter, sehingga keanggunan sintaksnya sangat terasa
  • OCaml juga bahasa keluarga ML yang sangat baik, tetapi Haskell menawarkan gaya yang lebih implisit (tacit)
  • Dalam contoh menjumlahkan angka di dalam string, Haskell menuliskannya singkat sebagai sum . map read . words, sedangkan OCaml secara eksplisit memakai pipeline untuk memisahkan string, mengonversi, lalu melakukan fold
  • Definisi tipe pohon biner di kedua bahasa sama-sama mengekspresikan algebraic data type secara natural
  • Contoh parsing di kedua bahasa memakai pattern matching dan nilai option, tetapi Haskell memakai notasi do dan guard, sementara OCaml memakai Option.bind dan match eksplisit

Fitur: Haskell kaya, OCaml tidak terlalu mengalihkan perhatian

  • Haskell punya sangat banyak fitur, sampai C++ terasa seperti pembanding yang masuk akal
  • Banyak fitur menjadi alat untuk menyelesaikan masalah secara presisi, tetapi juga bisa membuat kita memikirkan cara merancang solusi itu sendiri sebelum implementasi nyata
  • Di Haskell, mudah terjebak dalam desain ketika harus memilih antara opsi seperti TypeFamilies, DataKinds, dan GADTs
  • Kondisi buruk pada proyek OCaml yang sudah ada biasanya sebatas kurangnya nama variabel, kurang dokumentasi, atau fungsi sepanjang lebih dari 200 baris; ini dinilai masih dapat ditangani
  • Sebaliknya, proyek Haskell yang sudah ada bisa menghadirkan kompleksitas yang sulit diantisipasi bahkan dengan pengalaman 8 tahun
  • Karena perbedaan ini, OCaml terasa lebih produktif
  • Fitur yang sama-sama dimiliki kedua bahasa

    • Keduanya menyediakan sintaks berbasis ekspresi, immutability secara default, higher-order function, anonymous function, algebraic data type, dan pattern matching
    • Parametric polymorphism, type inference, syntactic sugar untuk monad, garbage collector, multithreading, dan GADTs juga sama-sama dapat digunakan
  • Fitur yang lebih menonjol di Haskell

    • Haskell menyediakan purity secara default, lazy evaluation yang dapat dikomposisikan, type class, higher-kinded types, dan ekstensi bahasa opsional
    • Karena punya banyak fitur kuat, cara abstraksi bisa sangat berbeda dari satu proyek ke proyek lain
  • Fitur yang lebih menonjol di OCaml

    • OCaml menyediakan first-class modules, polymorphic variants, object, class dan inheritance, serta mutability yang mudah digunakan
    • Cakupan fiturnya lebih sempit daripada Haskell, tetapi ini berujung pada codebase yang lebih mudah diprediksi

Ekosistem: Haskell lebih besar, OCaml punya solusi yang dibutuhkan

  • Keduanya adalah bahasa pemrograman fungsional niche, jadi sulit berharap mendapat dukungan kelas satu dari framework terbaru
  • Meski begitu, sebagian besar pekerjaan umum punya solusi, walau dalam beberapa kasus perlu menulis lebih banyak binding kustom
  • Di OCaml pun, package yang dibutuhkan untuk pekerjaan nyata dapat ditemukan, misalnya:
  • Ekosistem Haskell memiliki lebih banyak package dan solusi siap pakai
  • Untuk library klien Stripe API, Haskell memiliki 13 library, sedangkan OCaml hanya 1; karena perubahan terakhir di sisi OCaml terjadi 8 tahun lalu, praktis bisa dianggap mendekati 0
  • Di Haskell, bahkan setelah menemukan solusi, kita masih harus menentukan library mana yang dipilih dari terlalu banyak opsi
  • Pemilihan library sampai diperlakukan seperti keahlian tersendiri, bahkan ada tulisan yang merangkum cara mengevaluasi library
  • Library Haskell baru sering muncul bukan karena menyelesaikan masalah lain, melainkan karena ingin menulisnya dengan abstraksi berbeda atau fitur baru
  • Mendesain logger dengan comonads bisa terasa lebih menarik daripada membuat klien GitHub API dan melakukan banyak parsing JSON

Tooling: Haskell kuat tetapi naik-turun, OCaml bekerja dengan baik

  • Tooling Haskell memiliki keunggulan kuat sekaligus masalah usability
  • Hoogle adalah tool kuat yang dapat mencari seluruh ekosistem hanya dengan type signature
  • Di sisi lain, ada masalah seperti pesan error build tool, situasi ketika build plan tidak ditemukan pada proyek yang sedang berjalan, recompilation IDE setelah perubahan package, dan tidak adanya dokumentasi standard library untuk versi tertentu
  • Pengalaman memakai tooling Haskell memunculkan dua momen sekaligus: heran bagaimana bahasa lain bisa dipakai tanpa tool semacam ini, dan heran bagaimana pengguna Haskell bisa bertahan tanpa usability yang esensial
  • Ekosistem OCaml lebih kecil, sehingga ada rasa terkejut setiap kali menemukan sesuatu yang berfungsi
  • Plugin OCaml untuk VSCode berbasis LSP bekerja tanpa pengaturan tambahan dan tidak bermasalah
  • Meski pengalaman awal memakai tooling OCaml bukan yang paling nyaman, ia intuitif, kokoh, dan dalam sebagian besar kasus bekerja sebagaimana mestinya
  • Perbandingan tooling

Pesan compiler: Haskell bertele-tele, OCaml ringkas

  • Dalam bahasa fungsional, compiler adalah alat utama untuk memahami mengapa kode tidak memenuhi asumsi yang dimaksudkan
  • Karena itu, pesan error harus menampilkan informasi yang dibutuhkan dengan cara yang mudah diakses
  • Pesan compiler Haskell memiliki banyak konteks dan panjang, serta cenderung memuat informasi yang berulang atau mengalihkan perhatian
  • Pesan compiler OCaml cukup ringkas, kadang bahkan terlalu ringkas
  • Program contoh yang error adalah kode yang mencoba menjumlahkan integer dengan list, seperti x = 1 + [3, 1, 2] di Haskell dan let x = 1 + [3; 1; 2] di OCaml

Standard library: keduanya minimal, kualitas dokumentasi Haskell menonjol

  • Standard library membentuk pengalaman program pertama dan penggunaan berikutnya dalam sebuah bahasa
  • Standard library yang baik adalah fondasi keberhasilan bahasa pemrograman, sedangkan standard library yang kurang memadai dapat terus memicu perdebatan soal standard library alternatif
  • Standard library yang diinginkan dinilai sebaiknya mendekati pendekatan batteries-included
  • Komponen yang diinginkan mencakup tipe mirip Option, string UTF-8, Map dan HashMap, parser JSON dan XML, serta primitive asynchronous
  • Jika tidak ingin belajar implementasi build tool dan dependency tracking, standard library perlu memiliki lebih banyak fitur
  • Build Systems a la Carte adalah materi yang menganalisis ranah dependency tracker dan build tool
  • Standard library Haskell dan OCaml sama-sama relatif minimal
    • Haskell tidak menyertakan Map dan HashMap
    • OCaml tidak memiliki non-empty lists dan Bitraversable
  • Standard library Haskell adalah base, sedangkan OCaml menggunakan OCaml standard library
  • Kualitas dokumentasi Haskell kadang begitu bagus sampai mengejutkan developer berpengalaman
  • Dokumentasi Haskell juga memiliki keunggulan seperti kemampuan berpindah ke source code, dan penulis mendengar fitur semacam itu sedang disiapkan untuk OCaml
  • Contoh dokumentasi

    • Contoh dokumentasi List Haskell
    • Contoh dokumentasi List OCaml
    • Bahkan untuk fungsi yang hasilnya sudah jelas, dokumentasi berbasis contoh memberi gambaran langsung tentang cara memanfaatkan API

Kesimpulan: keduanya bisa dipakai untuk industri, tetapi preferensi saat ini OCaml

  • Kedua bahasa sudah berkembang jauh untuk mendukung kebutuhan industri nyata
  • Dibandingkan bahasa arus utama, keduanya masih tergolong bahasa kecil
  • Jika tidak bergantung secara kritis pada keberadaan SDK tertentu, memilih salah satu dari kedua bahasa ini tetap bisa membuat pengembangan aplikasi berikutnya menyenangkan
  • Saat ini OCaml dinilai lebih memudahkan fokus pada pekerjaan membangun sesuatu secara nyata

Belum ada komentar.

Belum ada komentar.