อะไรคือความแตกต่างที่สำคัญระหว่าง Scala และ Groovy [ปิด]


128

บนพื้นผิว Groovy และ Scala ดูคล้ายกันมากนอกจาก Scala จะถูกพิมพ์แบบคงที่และ Groovy แบบไดนามิก

  • อะไรคือความแตกต่างที่สำคัญอื่น ๆ และข้อดีแต่ละข้อมีมากกว่ากัน
  • มันคล้ายกันมากแค่ไหน?
  • มีการแข่งขันกันระหว่างสองคนนี้หรือไม่?
    • ถ้าเป็นเช่นนั้นคุณคิดว่าใครจะชนะในระยะยาว?

Groovy 2.0 ยังมีการพิมพ์แบบคงที่: infoq.com/articles/new-groovy-20
HDave

คำตอบ:


230

ทั้งสองเป็นภาษาเชิงวัตถุสำหรับ JVM ที่มี lambdas และ closures และทำงานร่วมกับ Java นอกจากนั้นพวกเขาต่างกันมาก

Groovy เป็นภาษา "ไดนามิก" ในแง่ที่ว่ามันถูกพิมพ์แบบไดนามิก แต่มันรองรับการเขียนโปรแกรมเมตาแบบไดนามิก

Scala เป็นภาษาที่ "คงที่" ซึ่งมันถูกพิมพ์แบบสแตติกและไม่มีการเขียนโปรแกรมเมตาแบบไดนามิกเกินกว่าสิ่งที่น่าอึดอัดใจที่คุณสามารถทำได้ใน Java หมายเหตุระบบชนิดคงที่ของสกาล่านั้นมีความสม่ำเสมอและซับซ้อนกว่าของจาวาอย่างมาก

Groovy ได้รับอิทธิพลจาก syntactically โดย Java แต่ได้รับอิทธิพลทางความหมายมากกว่าโดยภาษาเช่น Ruby

Scala ได้รับอิทธิพลทางไวยากรณ์จากทั้ง Ruby และ Java มันได้รับอิทธิพลทางความหมายมากขึ้นโดย Java, SML, Haskell และภาษา OO ที่คลุมเครือมากที่เรียกว่า gBeta

Groovy มีการส่งแบบ "ไม่ตั้งใจ" หลายครั้งเนื่องจากวิธีการจัดการกับการใช้งาน Java ที่มากเกินไป

สกาล่าเป็นเพียงการจัดส่งเพียงครั้งเดียว แต่มีการจับคู่รูปแบบ SML เพื่อจัดการกับปัญหาประเภทเดียวกันบางอย่างที่การจัดส่งหลายครั้งมีไว้เพื่อจัดการ อย่างไรก็ตามที่หลายการจัดส่งสามารถจัดส่งในประเภทรันไทม์การจับคู่รูปแบบของ Scala สามารถจัดส่งในประเภทรันไทม์ค่าหรือทั้งสองอย่าง การจับคู่รูปแบบยังรวมถึงการผูกตัวแปรที่น่าพอใจ syntactically เป็นการยากที่จะแสดงความมั่นใจว่าฟีเจอร์เดียวนี้น่าพอใจเพียงอย่างเดียวที่ทำให้การเขียนโปรแกรมใน Scala

ทั้ง Scala และ Groovy สนับสนุนรูปแบบของการสืบทอดหลายรายการพร้อมกับ mixins (แม้ว่า Scala เรียกพวกเขาว่าลักษณะ)

Scala รองรับการประยุกต์ใช้ฟังก์ชั่นบางส่วนและการ currying ในระดับภาษา Groovy มีวิธี "curry" ที่น่าอึดอัดใจสำหรับการทำแอปพลิเคชันฟังก์ชันบางส่วน

Scala ทำการเพิ่มประสิทธิภาพการเรียกซ้ำหางโดยตรง ฉันไม่เชื่อว่า Groovy ทำ นั่นเป็นสิ่งสำคัญในการเขียนโปรแกรมการทำงาน แต่มีความสำคัญน้อยกว่าในการเขียนโปรแกรมที่จำเป็น

ทั้ง Scala และ Groovy ได้รับการประเมินตามค่าเริ่มต้นอย่างกระตือรือร้น อย่างไรก็ตาม Scala สนับสนุนพารามิเตอร์ call-by-name Groovy ไม่ได้ - การโทรด้วยชื่อจะต้องเลียนแบบด้วยการปิด

Scala มี "for comprehensions" ซึ่งเป็นลักษณะทั่วไปของรายการ comprehensions ที่พบในภาษาอื่น ๆ (โดยทางเทคนิคแล้วพวกเขาเป็น monad comprehensions บวกเล็กน้อย - บางแห่งระหว่าง Haskell's do และ C #'s LINQ)

สกาล่าไม่มีแนวคิดของฟิลด์ "คงที่", ชั้นใน, วิธีการ ฯลฯ - มันใช้วัตถุเดี่ยวแทน Groovy ใช้แนวคิดแบบคงที่

Scala ไม่ได้สร้างตัวเลือกของตัวดำเนินการทางคณิตศาสตร์ในแบบที่ Groovy ทำ ใน Scala คุณสามารถตั้งชื่อวิธีการได้อย่างยืดหยุ่นมาก

Groovy มีตัวดำเนินการ elvis สำหรับจัดการกับค่าว่าง โปรแกรมเมอร์ Scala ต้องการใช้ประเภทตัวเลือกเพื่อใช้เป็นโมฆะ แต่คุณสามารถเขียนตัวดำเนินการ elvis ใน Scala ได้ง่ายถ้าคุณต้องการ

ในที่สุดก็มีการโกหกมีการสาปแช่งและมีการเปรียบเทียบ เกมเกณฑ์มาตรฐานภาษาคอมพิวเตอร์จัดอันดับ Scala ว่าอยู่ระหว่างเร็วกว่า Groovy อย่างมาก (ตั้งแต่สองเท่าถึง 93 เท่าเร็ว) ในขณะที่รักษาขนาดแหล่งที่มาเดียวกัน มาตรฐาน

ฉันแน่ใจว่ามีความแตกต่างมากมายที่ฉันไม่ได้ครอบคลุม แต่หวังว่านี่จะช่วยให้คุณมีสาระสำคัญ

มีการแข่งขันกันหรือไม่? ใช่แน่นอน แต่ไม่มากเท่าที่คุณคิด การแข่งขันที่แท้จริงของ Groovy คือ JRuby และ Jython

ใครจะชนะ? ลูกบอลคริสตัลของฉันแตกเหมือนคนอื่น


21
มันจะเป็น win ทั้งถ้าหนึ่งจะได้รับมหาวิทยาลัยที่จะเริ่มต้นการเรียนการสอนภาษาเหล่านี้แทนเพียง Java =)
Chii

13
การเปลี่ยนรูปไม่ได้เป็นลักษณะสำคัญของ Scala หรือไม่? สิ่งที่เกี่ยวกับการทำงานพร้อมกันและนักแสดง? บอกอะไรเราอีกสัก
หน่อย

4
หากมีการแข่งขันใด ๆ มันจะเป็นกับ Clojure แต่ Clojure ไม่สนใจในการแข่งขัน
Rayne

2
เนื่องจาก Scala ใช้วิธีการพิมพ์แบบคงที่เช่นเดียวกับจาวา (ซึ่งฮอตสปอตสามารถอินไลน์ได้อย่างง่ายดาย) และ Groovy ทำวิธีการแบบไดนามิกส่งมันจะยากมากสำหรับ Groovy ที่จะเข้าใกล้กับประสิทธิภาพของ Scala โดยเฉพาะอย่างยิ่งด้วย @specialised เพื่อปรับออโตบอทของ java ให้เหมาะสม Scala สามารถเร็วกว่า java ได้ตลอดเวลา อย่างไรก็ตามกรณีการใช้งานของ Groovy นั้นคล้ายกับการใช้ Ruby / Python ซึ่งเป็นภาษาสคริปต์ที่พิมพ์แบบไดนามิกที่ใช้งานง่ายซึ่งโดยทั่วไปแล้วประสิทธิภาพจะไม่เป็นปัญหามากนัก เช่นหลายกรอบ Groovy มีตันของรหัส Java สำหรับผลการดำเนินงาน (เช่น Grails บริการ)
เจมส์ Strachan

4
เนื่องจากคำตอบนี้มีคะแนนโหวตจำนวนมากจึงมีส่วนหนึ่งที่ฉันต้องการแก้ไข มันถูกต้องที่ multimethods ที่สืบทอดตามมาใน Groovy เริ่มต้นจากอุบัติเหตุ แต่ในการประชุมนักพัฒนา Groovy ซึ่งรวมถึง James และนานก่อนที่ Groovy 1.0 เราตัดสินใจที่จะเก็บมันไว้ คงไม่ยากที่จะเปลี่ยนแปลงสิ่งนี้ นอกจากนี้เพื่อเพิ่มสิ่งที่เจมส์เขียน ... invokedynamic เอาสิ่งกีดขวางที่เขากำลังพูดถึง
blackdrag

12

สกาล่าหมายถึงการเป็นภาษาลูกผสม OO / ฟังก์ชั่นและมีการวางแผนและการออกแบบเป็นอย่างดี Groovy เป็นเหมือนชุดของการปรับปรุงที่หลายคนชอบที่จะใช้ในจาวา ฉันลองดูทั้งสองอย่างละเอียดเพื่อที่จะบอกได้ :)

ไม่ดีกว่าหรือแย่กว่าอีก Groovy เก่งในการเขียนโปรแกรมเมตาดาต้าสกาล่าเก่งมากในทุกสิ่งที่ไม่จำเป็นต้องมีการเขียนโปรแกรมเมตาดังนั้น ... ฉันมักจะใช้ทั้งสองอย่าง


11

สกาล่ามีนักแสดงซึ่งทำให้การใช้งานพร้อมกันง่ายขึ้นมาก และลักษณะที่ให้มรดกที่แท้จริงมีหลายประเภท


9
สำหรับการอ้างอิงในอนาคต Groovy ผ่าน GPars หรือ Akka ก็เช่นกัน
Xorlev

4
สำหรับการอ้างอิงในอนาคต Groovy ผ่านคุณสมบัติจะเป็นเช่นนั้น
vicsz

1
ไม่มากอีกต่อไป: docs.scala-lang.org/overviews/core/actors-migration-guide.html
morty

7

คุณตีตะปูบนหัวด้วยการพิมพ์แบบคงที่และแบบไดนามิก ทั้งสองเป็นส่วนหนึ่งของภาษาไดนามิกรุ่นใหม่พร้อมการปิดการแสดงแลมบ์ดาและอื่น ๆ มีความแตกต่างทางไวยากรณ์ระหว่างสองตัวอย่างเล็กน้อย แต่ในทางปฏิบัติฉันไม่เห็นความแตกต่างอย่างมากระหว่าง Groovy กับ Scala

การดำเนินการตามสกาล่าแสดงความแตกต่างเล็กน้อย ใน Groovy แทบทุกอย่างเป็นตัวอย่างของ java.util.List ในขณะที่ Scala ใช้ทั้งรายการและอาร์เรย์ดั้งเดิม Groovy มีการประมาณค่าสตริงที่ดีกว่า

Scala เร็วขึ้นดูเหมือนว่า แต่กลุ่มคน Groovy กำลังผลักดันประสิทธิภาพสำหรับการเปิดตัว 2.0 1.6 ให้ความเร็วที่เพิ่มขึ้นอย่างมากในซีรีย์ 1.5

ฉันไม่คิดว่าภาษาใดภาษาหนึ่งจะ 'ชนะ' อย่างแท้จริงเนื่องจากพวกเขากำหนดเป้าหมายปัญหาสองระดับที่แตกต่างกัน Scala เป็นภาษาที่มีประสิทธิภาพสูงซึ่งมีลักษณะคล้าย Java มากโดยไม่ต้องมีสำเร็จรูปในระดับเดียวกับ Java Groovy มีไว้สำหรับการสร้างต้นแบบอย่างรวดเร็วและการพัฒนาซึ่งความเร็วมีความสำคัญน้อยกว่าเวลาที่โปรแกรมเมอร์ใช้ในการติดตั้งโค้ด


3
"Groovy สำหรับการสร้างต้นแบบและการพัฒนาอย่างรวดเร็ว" - นี่แสดงให้เห็นว่า Groovy ไม่เหมาะสำหรับการใช้งานในการผลิตซึ่งฉันไม่เห็นด้วย มีไซต์ Grails จำนวนมากที่ใช้งานในการผลิตตัวอย่างเช่น
Dónal

10
สกาล่าไม่ใช่ภาษาแบบไดนามิก
John Oxley

2
"Groovy มีการประมาณค่าสตริงที่ดีกว่า (ฉันคิดว่า) - ด้วย Scala-2.10.0 สิ่งนี้ไม่เป็นความจริงอีกต่อไป (Scala ได้รับการแก้ไขสตริงที่ยอดเยี่ยม)
VasiliNovikov

5

สกาล่ามีช่วงการเรียนรู้ที่ชันกว่า Groovy Scala ได้รับการสนับสนุนมากขึ้นสำหรับการเขียนโปรแกรมการทำงานด้วยการจับคู่รูปแบบและการเรียกซ้ำแบบหางซึ่งหมายถึงเครื่องมือเพิ่มเติมสำหรับ FP บริสุทธิ์


0

สกาล่ายังมีการรวบรวมแบบไดนามิกและฉันได้ทำมันโดยใช้ twitter eval lib ( https://github.com/twitter/util ) ฉันเก็บรหัสสกาล่าในไฟล์แฟล็ต (ไม่มีส่วนขยายใด ๆ ) และใช้คลาสสกาล่าที่สร้างขึ้น eval ในเวลาทำงาน ฉันจะบอกว่าสกาล่าเป็นโปรแกรมเมตาและมีคุณสมบัติของภาวะแทรกซ้อนแบบไดนามิก

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.