Apa perbedaan utama antara Scala dan Groovy? [Tutup]

128

Di permukaan Groovy dan Scala terlihat sangat mirip, selain dari Scala yang diketik secara statis, dan Groovy dinamis.

  • Apa perbedaan utama lainnya, dan keunggulan masing-masing dari yang lain?
  • Seberapa mirip mereka sebenarnya?
  • Apakah ada persaingan di antara keduanya?
    • Jika demikian, menurut Anda siapa yang akan menang dalam jangka panjang?
Leif
sumber
Groovy 2.0 juga termasuk pengetikan statis: infoq.com/articles/new-groovy-20
HDave

Jawaban:

230

Mereka berdua bahasa berorientasi objek untuk JVM yang memiliki lambdas dan penutupan dan beroperasi dengan Jawa. Selain itu, mereka sangat berbeda.

Groovy adalah bahasa "dinamis" tidak hanya dalam arti bahwa ia diketik secara dinamis tetapi juga mendukung pemrograman meta dinamis.

Scala adalah bahasa "statis" yang diketik secara statis dan hampir tidak memiliki pemrograman meta dinamis di luar hal-hal aneh yang dapat Anda lakukan di Jawa. Catatan, sistem tipe statis Scala secara substansial lebih seragam dan canggih daripada Java.

Groovy secara sintaksis dipengaruhi oleh Java tetapi secara semantik lebih dipengaruhi oleh bahasa-bahasa seperti Ruby.

Scala secara sintaksis dipengaruhi oleh Ruby dan Java. Secara semantik lebih dipengaruhi oleh Java, SML, Haskell, dan bahasa OO yang sangat tidak jelas yang disebut gBeta.

Groovy memiliki beberapa pengiriman "tidak disengaja" karena cara menangani kelebihan beban Java.

Scala hanya merupakan pengiriman tunggal, tetapi memiliki pencocokan pola yang diilhami SML untuk menangani beberapa jenis masalah yang sama yang ingin ditangani oleh banyak pengiriman. Namun, di mana beberapa pengiriman hanya dapat mengirim pada jenis runtime, pencocokan pola Scala dapat mengirimkan pada jenis runtime, nilai, atau keduanya. Pencocokan pola juga termasuk pengikatan variabel yang menyenangkan secara sintaksis. Sulit untuk menekankan betapa menyenangkannya fitur tunggal ini membuat pemrograman di Scala.

Baik Scala maupun Groovy mendukung suatu bentuk pewarisan berganda dengan mixin (meskipun Scala menyebutnya sebagai sifat).

Scala mendukung aplikasi fungsi parsial dan kari di tingkat bahasa, Groovy memiliki metode "curry" yang canggung untuk melakukan aplikasi fungsi parsial.

Scala melakukan optimasi rekursi ekor langsung. Saya tidak percaya Groovy. Itu penting dalam pemrograman fungsional tetapi kurang penting dalam pemrograman imperatif.

Baik Scala dan Groovy dengan penuh semangat dievaluasi secara default. Namun, Scala mendukung parameter panggilan-dengan-nama. Groovy tidak - panggilan-dengan-nama harus ditiru dengan penutupan.

Scala memiliki "untuk pemahaman", sebuah generalisasi dari pemahaman daftar yang ditemukan dalam bahasa lain (secara teknis mereka adalah pemahaman monad ditambah sedikit - di suatu tempat antara yang dilakukan Haskell dan C #'s LINQ).

Scala tidak memiliki konsep bidang "statis", kelas dalam, metode, dll - ia menggunakan objek tunggal. Groovy menggunakan konsep statis.

Scala tidak memiliki built in pemilihan operator aritmatika dengan cara yang Groovy lakukan. Di Scala Anda dapat menyebutkan metode dengan sangat fleksibel.

Groovy memiliki operator elvis untuk menangani null. Pemrogram Scala lebih suka menggunakan jenis Opsi daripada menggunakan nol, tetapi mudah untuk menulis operator elvis di Scala jika Anda mau.

Akhirnya, ada kebohongan, ada kebohongan, dan kemudian ada tolok ukur. Game tolok ukur bahasa komputer memberi peringkat Scala sebagai antara jauh lebih cepat dari Groovy (mulai dari dua kali hingga 93 kali lebih cepat) sambil mempertahankan ukuran sumber yang kira-kira sama. tolok ukur .

Saya yakin ada banyak, banyak perbedaan yang belum saya bahas. Tapi mudah-mudahan ini memberi Anda inti.

Apakah ada persaingan di antara mereka? Ya, tentu saja, tetapi tidak sebanyak yang Anda kira. Persaingan nyata Groovy adalah JRuby dan Jython.

Siapa yang akan menang? Bola kristalku retak seperti milik orang lain.

James Iry
sumber
21
itu akan menjadi kemenangan bagi keduanya jika seseorang bisa mendapatkan universitas untuk mulai mengajar bahasa-bahasa ini, bukan hanya java =)
Chii
13
Bukankah kekekalan merupakan karakteristik utama Scala? Bagaimana dengan konkurensi dan aktor? Ceritakan lebih banyak lagi ...
Leonel
4
Jika ada kompetisi apa pun itu dengan Clojure, tetapi Clojure tidak tertarik pada kompetisi.
Rayne
2
Mengingat bahwa Scala menggunakan metode pengiriman yang diketik statis sama seperti java (yang hotspot dapat dengan mudah inline) dan groovy melakukan metode dinamis mengirimkannya akan sangat sulit bagi Groovy untuk mendekati kinerja Scala. Khususnya dengan @specialised untuk mengoptimalkan autoboxing java, Scala bisa lebih cepat daripada java di kali. Namun use case untuk Groovy mirip dengan menggunakan Ruby / Python - ini untuk bahasa skrip dinamis yang mudah digunakan di mana kinerja biasanya tidak banyak masalah. misalnya banyak kerangka kerja Groovy berisi satu ton kode Java untuk kinerja (seperti Grails)
James Strachan
4
Karena jawaban ini memiliki begitu banyak suara, ada satu bagian yang ingin saya koreksi. Memang benar bahwa multimethod berbasis warisan di Groovy dimulai sebagai kecelakaan, tetapi pada Konferensi Pengembang Groovy, yang menyertakan James dan itu jauh sebelum Groovy 1.0 kami memutuskan untuk mempertahankannya. Tidak akan sulit untuk mengubah ini. Juga untuk menambah apa yang ditulis James ... invokedynamic menurunkan penghalang yang dia bicarakan
blackdrag
12

scala dimaksudkan sebagai bahasa hibrida fungsional / fungsional dan sangat terencana dan dirancang dengan baik. groovy lebih mirip seperangkat perangkat tambahan yang banyak orang ingin menggunakan di java. saya melihat lebih dekat pada keduanya, jadi saya bisa tahu :)

tak satu pun dari mereka yang lebih baik atau lebih buruk daripada yang lain. groovy sangat pandai dalam meta-pemrograman, scala sangat bagus dalam segala hal yang tidak perlu meta-pemrograman, jadi ... saya cenderung menggunakan keduanya.

hamsterofdeath
sumber
11

Scala memiliki Aktor, yang membuat konkurensi lebih mudah diimplementasikan. Dan Ciri-ciri yang memberikan pewarisan berganda yang benar dan aman.

jasonnerothin
sumber
9
Untuk referensi di masa mendatang, begitu juga Groovy melalui GPars atau Akka.
Xorlev
4
Untuk referensi di masa mendatang, begitu juga Groovy through traits
vicsz
7

Anda telah memukul paku di kepala dengan pengetikan statis dan dinamis. Keduanya adalah bagian dari generasi baru bahasa dinamis, dengan penutup, ekspresi lambda, dan sebagainya. Ada beberapa perbedaan sintaksis antara keduanya juga, tetapi secara fungsional, saya tidak melihat perbedaan besar antara Groovy dan Scala.

Scala mengimplementasikan Daftar sedikit berbeda; di Groovy, hampir semuanya adalah turunan dari java.util.List, sedangkan Scala menggunakan Daftar dan array primitif. Groovy memiliki (saya pikir) interpolasi string yang lebih baik.

Scala memang lebih cepat, tetapi orang-orang Groovy benar-benar mendorong kinerja untuk rilis 2.0. 1.6 memberikan lompatan besar dalam kecepatan selama seri 1.5.

Saya tidak berpikir bahwa kedua bahasa akan benar-benar 'menang', karena mereka menargetkan dua kelas masalah yang berbeda. Scala adalah bahasa berkinerja tinggi yang sangat mirip Java tanpa memiliki level boilerplate yang sama dengan Java. Groovy adalah untuk pembuatan prototipe dan pengembangan yang cepat, di mana kecepatan kurang penting daripada waktu yang dibutuhkan bagi programmer untuk mengimplementasikan kode.

Don Werve
sumber
3
"Groovy adalah untuk pembuatan prototipe dan pengembangan yang cepat" - ini menunjukkan bahwa Groovy tidak cocok untuk penggunaan produksi yang saya tidak setuju. Ada cukup banyak situs Grails dalam penggunaan produksi, misalnya
Dónal
10
Scala bukan bahasa yang dinamis.
John Oxley
2
"Groovy memiliki (saya pikir) interpolasi string yang lebih baik." - dengan Scala-2.10.0 ini tidak lagi benar (Scala mendapat interpolasi string keren).
VasiliNovikov
5

Scala memiliki kurva belajar yang jauh lebih curam daripada Groovy. Scala memiliki lebih banyak dukungan untuk pemrograman fungsional dengan pencocokan pola dan rekursi berbasis ekor, yang berarti lebih banyak alat untuk FP murni.

Lebih dari Lima
sumber
0

Scala juga memiliki kompilasi dynamica dan saya telah melakukannya menggunakan twitter eval lib ( https://github.com/twitter/util ). Saya menyimpan kode scala dalam file datar (tanpa ekstensi apa pun) dan menggunakan eval yang dibuat kelas scala pada saat run time. Saya akan mengatakan scala adalah pemrograman meta dan memiliki fitur komplikasi dinamis

Veerbhan Tahlani
sumber