Scala vs Groovy vs Clojure [ditutup]

676

Dapatkah seseorang tolong jelaskan perbedaan utama antara Scala, Groovy dan Clojure. Saya tahu masing-masing kompilasi ini untuk berjalan di JVM tapi saya ingin perbandingan sederhana di antara mereka.

James Fassett
sumber

Jawaban:

873

Groovy adalah bahasa yang diketik secara dinamis, yang sintaksinya sangat dekat dengan Java, dengan sejumlah perbaikan sintaksis yang memungkinkan kode lebih ringan dan lebih sedikit boilerplate. Ia dapat dijalankan melalui juru bahasa dan juga dikompilasi, yang membuatnya baik untuk pembuatan prototipe cepat, skrip, dan belajar bahasa dinamis tanpa harus mempelajari sintaks baru (dengan asumsi Anda tahu Java). Pada Groovy 2.0, ia juga memiliki dukungan yang berkembang untuk kompilasi statis . Groovy mendukung penutupan dan memiliki dukungan untuk pemrograman dalam gaya yang agak fungsional, meskipun masih cukup jauh dari definisi tradisional pemrograman fungsional.

Clojure adalah dialek Lisp dengan beberapa fitur canggih seperti Software Transactional Memory . Jika Anda menyukai Lisp dan ingin menggunakan sesuatu seperti itu di bawah JVM, Clojure adalah untuk Anda. Mungkin bahasa yang paling fungsional berjalan di JVM, dan tentu saja yang paling terkenal. Selain itu, ia memiliki penekanan yang lebih kuat pada ketidakmampuan dibandingkan dengan dialek Lisp lainnya, yang membawanya lebih dekat ke jantung penggemar bahasa fungsional.

Scala adalah bahasa berorientasi objek sepenuhnya, lebih dari Jawa, dengan salah satu sistem tipe paling canggih yang tersedia pada bahasa non-penelitian, dan tentu saja sistem tipe paling canggih di JVM. Ini juga menggabungkan banyak konsep dan fitur bahasa fungsional, tanpa mengorbankan orientasi objek, tetapi kompromi pada karakteristik bahasa fungsional menunda beberapa penggemar yang terakhir.

Groovy memiliki penerimaan yang baik dan kerangka kerja web yang populer di Grails. Ini juga mendukung sistem pembangunan Gradle, yang menjadi alternatif populer bagi Maven. Saya pribadi berpikir itu adalah bahasa dengan utilitas terbatas, terutama ketika Jython dan JRuby mulai membuat terobosan di tanah JVM, dibandingkan dengan yang lain.

Clojure, bahkan mengabaikan beberapa fitur yang sangat menarik, memiliki daya tarik yang kuat hanya dengan menjadi dialek Lisp di JVM. Mungkin membatasi popularitasnya, memang, tapi saya berharap itu akan memiliki komunitas yang setia di sekitarnya untuk waktu yang lama.

Scala dapat bersaing secara langsung dengan Jawa, dan memberikannya uang untuk hampir semua aspek. Ini tidak dapat bersaing dalam popularitas saat ini, tentu saja, dan kurangnya dukungan perusahaan yang kuat dapat menghambat penerimaannya di lingkungan perusahaan. Ini juga bahasa yang jauh lebih dinamis daripada Jawa, dalam arti bagaimana bahasa berkembang. Dari perspektif bahasa, itu hal yang baik. Dari perspektif pengguna yang berencana memiliki ribuan baris kode tertulis di dalamnya, tidak demikian.

Sebagai pengungkapan terakhir, saya sangat akrab dengan Scala, dan hanya berkenalan dengan dua lainnya.

Daniel C. Sobral
sumber
1
Bagus Meskipun saya harus mengatakan Scala memiliki dukungan perusahaan Lightbend dan digunakan oleh nama-nama besar seperti LinkedIn, Twitter, Spark dan banyak bank. Di mana saya bekerja, kami memiliki basis kode 11 juta baris Scala, yang bukan ide yang baik tetapi berfungsi.
Joan
219

Scala

Scala berevolusi dari bahasa fungsional murni yang dikenal sebagai Funnel dan mewakili implementasi ruang-bersih hampir semua sintaksis Jawa, hanya berbeda di mana peningkatan yang jelas dapat dilakukan atau di mana ia akan mengkompromikan sifat fungsional bahasa. Perbedaan tersebut termasuk objek tunggal, bukan metode statis, dan tipe inferensi.

Sebagian besar ini didasarkan pada karya Martin Odersky sebelumnya dengan bahasa Pizza . Integrasi OO / FP jauh melampaui penutupan belaka dan telah menyebabkan bahasa yang digambarkan sebagai pasca-fungsional.

Meskipun demikian, ini yang paling dekat ke Jawa dalam banyak hal. Terutama karena kombinasi dukungan OO dan pengetikan statis, tetapi juga karena tujuan eksplisit dalam desain bahasa yang harus diintegrasikan dengan Java.

Asyik

Groovy secara eksplisit menangani dua kritik terbesar Jawa

  • sedang diketik secara dinamis, yang menghilangkan banyak boilerplate dan
  • menambahkan penutupan ke bahasa.

Ini mungkin secara sintaksis paling dekat dengan Jawa, tidak menawarkan beberapa konstruksi fungsional yang lebih kaya yang disediakan oleh Clojure dan Scala, tetapi masih menawarkan peningkatan evolusi yang pasti - terutama untuk menulis program gaya skrip.

Groovy memiliki dukungan komersial terkuat dari tiga bahasa, kebanyakan melalui sumber mata air.

Clojure

Clojure adalah bahasa fungsional dalam keluarga LISP, juga diketik secara dinamis.

Fitur-fitur seperti dukungan STM memberikannya beberapa dukungan konkurensi out-of-the-box terbaik, sedangkan Scala membutuhkan perpustakaan pihak ketiga seperti Akka untuk menduplikasi ini.

Secara sintaksis, itu juga yang terjauh dari tiga bahasa dari kode Java yang khas.

Saya juga harus mengungkapkan bahwa saya paling mengenal Scala :)

Kevin Wright
sumber
11
Saya belum pernah mendengar bahasa Corong ini sebelumnya. Terima kasih telah mengisi sedikit celah dalam catatan sejarah.
Randall Schulz
8
Anda tidak dapat benar-benar menyebut Clojure bahasa fungsional murni . Tentu saja mungkin untuk menulis kode imperatif.
dbyrne
2
Scala telah membangun di perpustakaan Akka untuk konkurensi berbasis aktor. Ini bukan lagi ketergantungan pihak ke-3.
scott m gardner
2
@Orubel Dalam bytecode, kelas scala identik dengan kelas Java yang setara - semua dan semua. Sebagai contoh, seluruh API Java Akka ditulis dalam Scala. Jadi tolong jelaskan apa yang Anda maksud dengan "tidak dapat mengintegrasikan" di sini - karena berbunyi seperti FUD bagi saya.
Kevin Wright
3
Untuk meringkas dokumen itu: "Fitur scala yang tidak ada di Jawa tidak dapat langsung digunakan di Jawa". Namun ... anggota tipe abstrak dan tipe yang lebih tinggi adalah fitur yang cukup canggih yang Anda tentu tidak dipaksa untuk menggunakannya! Java juga tidak dapat menggunakan metode tanpa parameter, pembangun, atau modul ekstensi dari Groovy, sehingga juga membuat Groovy "tidak terintegrasi secara ketat" dengan definisi Anda sendiri.
Kevin Wright
68

Saya tidak pernah punya waktu untuk bermain dengan clojure. Tapi untuk scala vs asyik, ini adalah kata-kata dari James Strachan - pencipta Groovy

"Meskipun tip saya untuk penggantian jangka panjang javac adalah Scala. Saya sangat terkesan dengan itu! Jujur saya bisa mengatakan jika seseorang telah menunjukkan kepada saya buku Programming in Scala oleh Martin Odersky, Lex Spoon & Bill Venners pada tahun 2003 saya mungkin belum pernah menciptakan Groovy. "

Anda dapat membaca keseluruhan cerita di sini

Thai Tran
sumber
72
Harus disebutkan bahwa pernyataan ini tidak mengatakan bahwa Scala lebih baik daripada Groovy. James juga dikenal karena mengatakan bahwa jika dia tahu betapa sulitnya membuat bahasa, dia tidak akan pernah membuatnya. Terlihat dalam konteks ini jelas mengapa dia tidak akan mengembangkan Groovy maka tentu saja. Dan saya berani mengatakan dia memberikan banyak ide bagus, tetapi dia bukan pencipta Groovy saat ini. dia meninggalkan proyek jauh sebelum 1.0 pada 2007 dan tidak berpartisipasi sejak itu. Setidaknya ada sebanyak mungkin tanpa dia dalam proyek seperti ada bersamanya.
blackdrag
31
Dan mengingat James Strachan bekerja aktif pada bahasa Kotlin, Scala tampaknya tidak cukup mengesankan baginya.
bdkosher
6
@bdkosher dia sedang mengerjakannya karena Scala terlalu mengesankan untuk kebanyakan programmer ... dan [lebih penting lagi,] di beberapa tempat terlalu rumit, juga
Nama Tampilan
30

Mereka dapat dibedakan dengan dari mana mereka berasal atau pengembang yang mereka targetkan terutama.

Asyik agak mirip dengan versi scripting Java. Lama programmer Java merasa di rumah ketika membangun aplikasi tangkas yang didukung oleh arsitektur besar. Groovy on Grails adalah, seperti namanya mirip dengan kerangka Rails. Untuk orang-orang yang tidak ingin repot dengan verbositas Java sepanjang waktu

Scala adalah bahasa pemrograman berorientasi objek dan fungsional dan programmer Ruby atau Python mungkin merasa lebih dekat dengan yang satu ini. Ini mempekerjakan cukup banyak ide bagus yang umum ditemukan dalam bahasa pemrograman ini.

Clojure adalah dialek bahasa pemrograman Lisp sehingga pengembang Lisp, Skema, atau Haskell mungkin merasa betah saat mengembangkan bahasa ini.

Mehmet Duran
sumber
24
Scala sebenarnya bukan bahasa pemrograman fungsional. Ini adalah bahasa pemrograman berorientasi objek pertama, dengan fitur fungsional.
Daniel C. Sobral
16
Saya harus mengatakan, jawaban ini terasa seperti tembakan di kegelapan. Saya pikir kasus yang baik dapat dibuat bahwa Python lebih dekat ke Groovy daripada Scala, dan Ruby (menurut saya) tidak terlalu dekat dengan yang di atas, mungkin paling dekat lagi dengan Groovy. Haskell tidak terlalu banyak seperti Lisp atau Skema (Umum) (dan karenanya tidak banyak seperti Clojure). Bagi saya, jawaban ini terasa (paling-paling!) Seperti "Saya juga tidak tahu, izinkan saya Wikipedia untuk Anda".
John Y
21
Scala adalah bahasa yang sangat penting dengan beberapa fitur fungsional. Jika orang terus menyebut bahasa fungsional segera setelah mengadopsi idiom dari dunia fungsional maka istilah tersebut akan menjadi istilah pemasaran lainnya. Mungkin juga mulai memanggil C ++ fungsional dan Haskell imperatif.
jon-hanson
9
@alanlcode Odersky dapat mengatakan apa yang dia inginkan. Scala tidak memiliki sistem untuk mengisolasi efek samping, secara default tidak malas, dan tidak memperlakukan kode sebagai data - ia memperlakukan panggilan fungsi sebagai data, yang berbeda. Ini adalah masalah besar jika Anda ingin berfungsi penuh. Di sisi lain, Scala berupaya keras untuk memastikan Model Objeknya tidak cacat. Saya suka Scala, tapi jelas fungsional kedua.
Daniel C. Sobral
7
Di sisi lain, keluarga bahasa ML diakui sebagai fungsional tetapi ketat dan memungkinkan efek samping / kode penting.
GClaramunt
8

Saya membaca buku Programmer Pragmatis "Resep Groovy: Meminyaki roda Jawa" oleh Scott Davis, Hak Cipta 2008 dan dicetak pada bulan April tahun yang sama.

Agak ketinggalan zaman tetapi buku ini menjelaskan bahwa Groovy secara harfiah adalah perpanjangan dari Jawa. Saya dapat menulis kode Java yang berfungsi persis seperti Java dan mengganti nama file * .groovy dan berfungsi dengan baik. Menurut buku itu, kebalikannya benar jika saya menyertakan perpustakaan yang diperlukan. Sejauh ini, eksperimen tampaknya membuktikan hal ini.

Jim Collings
sumber
Itu buku terbaik untuk belajar Groovy.
topr
Mungkin penting untuk dicatat bahwa tidak semua kode akan berperilaku sama persis. Beberapa perbedaan ini termasuk cara Groovy memahami tanda kutip tunggal dan ganda dan preferensi untuk tinju daripada pelebaran. Sebagian besar kode akan bekerja sama.
Ontonator
4

Jelas, sintaksnya sangat berbeda (Groovy paling dekat dengan Java), tapi saya kira itu bukan yang Anda minta.

Jika Anda tertarik menggunakannya untuk membuat skrip aplikasi Java, Scala mungkin bukan pilihan yang baik, karena tidak ada cara mudah untuk mengevaluasinya dari Jawa, sedangkan Groovy sangat cocok untuk tujuan itu.

Thilo
sumber
Saya tidak mengerti maksud Anda tentang menggunakan Scala ke skrip Java. Anda tentu dapat menulis skrip Scala yang menggerakkan kode Java; tidak evalwajib
Daniel Yankowsky
2
@Aniel, silakan lihat pertanyaan tentang menggunakan Scala untuk skrip yang saya tautkan. Jawaban yang diterima di sana adalah bahwa kurangnya fasilitas "eval" dan dukungan javax. Script membuatnya lebih sulit untuk menggunakan Scala untuk skrip aplikasi Java maka dengan, katakanlah, Groovy.
Thilo