Scala vs. Groovy vs. Clojure [ปิด]


676

ใครช่วยกรุณาอธิบายความแตกต่างที่สำคัญระหว่าง Scala, Groovy และ Clojure ฉันรู้ว่าคอมไพล์เหล่านี้ทำงานบน JVM แต่ฉันต้องการเปรียบเทียบง่าย ๆ ระหว่างพวกเขา

คำตอบ:


873

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

Clojureเป็นภาษาถิ่นของเสียงกระเพื่อมด้วยคุณสมบัติขั้นสูงน้อยเช่นซอฟรานแซคชันหน่วยความจำ หากคุณชอบ Lisp และต้องการใช้สิ่งที่ชอบภายใต้ JVM Clojure เหมาะสำหรับคุณ มันอาจเป็นภาษาที่ใช้งานได้ดีที่สุดใน JVM และเป็นภาษาที่มีชื่อเสียงที่สุด นอกจากนี้ยังให้ความสำคัญกับการเปลี่ยนแปลงไม่ได้มากกว่าภาษา Lisp อื่น ๆ ซึ่งจะนำมันเข้าใกล้หัวใจของผู้ที่ชื่นชอบการใช้ภาษา

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

Groovy ได้รับการยอมรับเป็นอย่างดีและเป็นกรอบเว็บยอดนิยมใน Grails นอกจากนี้ยังเพิ่มประสิทธิภาพการสร้างระบบ Gradle ซึ่งกำลังกลายเป็นทางเลือกยอดนิยมของ Maven โดยส่วนตัวฉันคิดว่ามันเป็นภาษาที่มียูทิลิตี้ที่ จำกัด โดยเฉพาะอย่างยิ่งเมื่อ Jython และ JRuby เริ่มรุกล้ำเข้าไปใน JVM-land เทียบกับคนอื่น ๆ

Clojure แม้แต่การลดคุณสมบัติบางอย่างที่น่าสนใจมีความสนใจอย่างมากเพียงแค่เป็นภาษา Lisp บน JVM มันอาจจำกัดความนิยมที่ได้รับ แต่ฉันคาดหวังว่ามันจะมีชุมชนที่ภักดีรอบตัวมันเป็นเวลานาน

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

เป็นการเปิดเผยขั้นสุดท้ายฉันคุ้นเคยกับ Scala และคุ้นเคยกับอีกสองคนเท่านั้น


1
ทำได้ดีนี่. แม้ว่าฉันจะต้องบอกว่าสกาล่ามีการสนับสนุนองค์กร Lightbend และถูกใช้โดยชื่อใหญ่เช่น LinkedIn, Twitter, Spark และธนาคารจำนวนมาก ที่ทำงานของฉันเรามีรหัสฐาน 11 ล้านเส้นของสกาล่าซึ่งไม่ใช่ความคิดที่ดี แต่ใช้งานได้
Joan

219

สกาล่า

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

สิ่งนี้มีพื้นฐานมาจากงานก่อนหน้าของมาร์ตินโอชสกี้กับภาษาพิซซ่า การรวมเข้าด้วยกันของ OO / FP เป็นมากกว่าแค่การปิดและนำไปสู่การใช้ภาษาที่ถูกอธิบายว่าเป็นการทำงานภายหลัง

อย่างไรก็ตามเรื่องนี้มันใกล้เคียงกับ Java ในหลาย ๆ สาเหตุหลักมาจากการรวมกันของการสนับสนุน OO และการพิมพ์แบบคงที่ แต่ยังเนื่องจากเป้าหมายที่ชัดเจนในการออกแบบภาษาที่ควรรวมเข้ากับ Java อย่างแน่นหนา

Groovy

Groovy แสดงถึงการวิพากษ์วิจารณ์ที่ใหญ่ที่สุดของ Java อย่างชัดเจน

  • ถูกพิมพ์แบบไดนามิกซึ่งจะลบจำนวนมากสำเร็จรูปและ
  • เพิ่มการปิดไปยังภาษา

บางทีมันอาจจะใกล้เคียงกับsyntactically ของ Java มากกว่าการเสนอฟังก์ชั่นที่สมบูรณ์กว่าที่ Clojure และ Scala ให้ แต่ก็ยังมีการพัฒนาที่ชัดเจนโดยเฉพาะอย่างยิ่งสำหรับการเขียนโปรแกรมสคริปต์ -syle

Groovy มีการสนับสนุนเชิงพาณิชย์ที่แข็งแกร่งที่สุดในสามภาษาส่วนใหญ่ผ่านทางแหล่งสปริง

Clojure

Clojure เป็นภาษาที่ใช้งานได้ในตระกูล LISP นอกจากนี้ยังพิมพ์ด้วยแบบไดนามิก

คุณลักษณะต่างๆเช่นการสนับสนุน STM ให้การสนับสนุนการทำงานพร้อมกันที่ดีที่สุดในขณะที่ Scala ต้องการห้องสมุดบุคคลที่สามเช่นAkkaเพื่อทำซ้ำสิ่งนี้

วากยสัมพันธ์มันเป็นที่สุดของสามภาษาจากรหัสจาวาทั่วไป

ฉันต้องเปิดเผยด้วยว่าฉันรู้จักสกาล่ามากที่สุด :)


11
ฉันไม่เคยได้ยินภาษาช่องทางนี้มาก่อน ขอบคุณที่เติมช่องว่างเล็กน้อยในบันทึกประวัติศาสตร์
Randall Schulz

8
คุณไม่สามารถจริงๆเรียก Clojure บริสุทธิ์ภาษาทำงาน เป็นไปได้อย่างแน่นอนที่จะเขียนโค้ดที่จำเป็น
dbyrne

2
Scala ได้สร้างขึ้นในห้องสมุด Akka สำหรับนักแสดงพร้อมกัน มันไม่ใช่การพึ่งพาของบุคคลที่สามอีกต่อไป
กอตต์ m การ์ดเนอร์

2
@Orubel ใน bytecode คลาส scala จะเหมือนกับคลาส Java ที่เทียบเท่าและทั้งหมด ในกรณีที่จุด Akka Java API ทั้งหมดจะถูกเขียนใน Scala ดังนั้นโปรดอธิบายสิ่งที่คุณหมายถึงโดย "ไม่สามารถรวม" ที่นี่ - เพราะมันอ่านเหมือน FUD กับฉัน
Kevin Wright

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

68

ฉันไม่เคยมีเวลาเล่นกับ clojure แต่สำหรับ scala vs groovy คำนี้มาจาก James Strachan - ผู้สร้าง Groovy

"แม้ว่าเคล็ดลับของฉันสำหรับการทดแทนระยะยาวของ javac คือ Scala ฉันประทับใจมากกับเรื่องนี้ฉันพูดได้เลยว่าถ้ามีคนแสดงให้ฉันเห็นการเขียนโปรแกรมในหนังสือสกาล่าโดย Martin Odersky, Lex Spoon และ Bill Venners ย้อนกลับไปในปี 2003 ฉัน อาจไม่เคยสร้าง Groovy มาก่อน "

คุณสามารถอ่านเรื่องราวทั้งหมดได้ที่นี่


72
มันควรจะกล่าวว่าคำสั่งนี้ไม่ได้บอกว่า Scala ดีกว่า Groovy เจมส์ยังเป็นที่รู้จักด้วยการพูดว่าถ้าเขารู้ว่าปัญหาในการสร้างภาษามากแค่ไหนเขาก็ไม่เคยสร้างมันขึ้นมา เห็นได้ชัดในบริบทนี้ว่าทำไมเขาถึงไม่พัฒนา Groovy แน่นอน และฉันกล้าที่จะบอกว่าเขาให้ความคิดที่ดีมากมาย แต่เขาไม่ใช่ผู้สร้าง Groovy ปัจจุบัน เขาออกจากโครงการไปนานก่อนที่ 1.0 ในปี 2007 และไม่ได้เข้าร่วมตั้งแต่นั้นมา อย่างน้อยก็ไม่มีเขาอยู่ในโครงการเหมือนที่เคยอยู่กับเขา
blackdrag

31
และเนื่องจาก James Strachan ทำงานอย่างแข็งขันกับภาษา Kotlin ดูเหมือนว่า Scala จะไม่น่าประทับใจสำหรับเขา
bdkosher

6
@bdkosher เขากำลังทำงานอยู่เนื่องจาก Scala น่าประทับใจเกินไปสำหรับโปรแกรมเมอร์ส่วนใหญ่…และ [สำคัญกว่านั้น] ในบางสถานที่ที่ซับซ้อนเกินไปเช่นกัน
ชื่อที่แสดง

30

พวกเขาสามารถแยกความแตกต่างกับที่พวกเขามาจากหรือนักพัฒนาที่พวกเขากำลังกำหนดเป้าหมายหลัก

Groovyเป็นจาวาสคริปต์เวอร์ชั่นเล็กน้อย โปรแกรมเมอร์ Java เป็นเวลานานรู้สึกเหมือนอยู่บ้านเมื่อสร้างแอพพลิเคชั่นที่ได้รับการสนับสนุนจากสถาปัตยกรรมขนาดใหญ่ Groovy on Grails เป็นชื่อที่แนะนำคล้ายกับ Rails framework สำหรับผู้ที่ไม่ต้องการรบกวนการใช้คำฟุ่มเฟือยของ Java ตลอดเวลา

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

Clojureเป็นภาษาของ Lisp ภาษาโปรแกรมดังนั้นนักพัฒนา Lisp, Scheme หรือ Haskell อาจรู้สึกเหมือนอยู่บ้านในขณะที่พัฒนาด้วยภาษานี้


24
Scala ไม่ใช่ภาษาโปรแกรมที่ใช้งานได้จริง ๆ มันเป็นภาษาการเขียนโปรแกรมเชิงวัตถุก่อนด้วยคุณสมบัติการทำงาน
Daniel C. Sobral

16
ฉันต้องบอกว่าคำตอบนี้ให้ความรู้สึกเหมือนถ่ายภาพในที่มืด ฉันคิดว่าเป็นกรณีที่ดีที่ทำให้ Python ใกล้ชิดกับ Groovy มากกว่า Scala และ Ruby ก็เป็น (ในความเห็นของฉัน) ไม่ใกล้เคียงกับข้อใดข้อหนึ่งข้างต้นอาจใกล้เคียงกับ Groovy อีกครั้ง Haskell ไม่เหมือน Lisp หรือ Scheme มากเกินไป (และไม่เหมือน Clojure) สำหรับฉันคำตอบนี้ให้ความรู้สึก (ที่ดีที่สุด!) เช่น "ฉันไม่รู้เหมือนกันให้ฉันเถอะ Wikipedia สำหรับคุณ"
John Y

21
Scala เป็นภาษาที่จำเป็นพร้อมคุณสมบัติการทำงานบางอย่าง หากผู้คนยังคงเรียกใช้ฟังก์ชั่นภาษาต่อไปทันทีที่มันใช้สำนวนจากโลกแห่งการทำงานคำนั้นจะกลายเป็นอีกคำศัพท์ทางการตลาด อาจเริ่มเรียก C ++ functional และ Haskell
jon-hanson

9
@alanlcode Odersky อาจพูดในสิ่งที่เขาต้องการ Scala ไม่มีระบบใด ๆ ที่จะแยกผลข้างเคียงมันไม่ได้ขี้เกียจโดยค่าเริ่มต้นและไม่ถือว่ารหัสเป็นข้อมูล - มันถือว่าการเรียกใช้ฟังก์ชั่นเป็นข้อมูลซึ่งแตกต่างกัน ปัญหาเหล่านี้เป็นปัญหาใหญ่หากคุณต้องการใช้งานได้อย่างสมบูรณ์ ในอีกทางหนึ่งสกาล่าไปตลอดทางเพื่อให้แน่ใจว่าแบบจำลองวัตถุนั้นไม่สมบูรณ์ ฉันรักสกาล่า แต่มันก็ใช้งานได้ดีอย่างที่สอง
Daniel C. Sobral

7
ในทางตรงกันข้ามตระกูลภาษา ML ได้รับการยอมรับว่าใช้งานได้ แต่มีความเข้มงวดและอนุญาตให้มีผลข้างเคียง / โค้ดที่จำเป็น
GClaramunt

8

ฉันกำลังอ่านหนังสือนักเขียนโปรแกรมอย่างจริงจัง "สูตร Groovy: จาระบีล้อของ Java" โดย Scott Davis, ลิขสิทธิ์ 2008 และพิมพ์ในเดือนเมษายนของปีเดียวกัน

มันค่อนข้างล้าสมัย แต่หนังสือทำให้ชัดเจนว่า Groovy เป็นส่วนเสริมของ Java อย่างแท้จริง ฉันสามารถเขียนโค้ด Java ที่ทำงานเหมือนกับ Java และเปลี่ยนชื่อไฟล์ * .groovy และใช้งานได้ดี อ้างอิงจากหนังสือการย้อนกลับเป็นจริงถ้าฉันรวมไลบรารีที่จำเป็น จนถึงขณะนี้การทดลองดูเหมือนจะทนได้


นั่นเป็นหนังสือที่ดีที่สุดในการเรียนรู้ Groovy
topr

อาจเป็นเรื่องสำคัญที่จะต้องทราบว่ารหัสทั้งหมดจะไม่ทำงานเหมือนกันทุกประการ ความแตกต่างบางประการเหล่านี้รวมถึงวิธีการที่ Groovy เข้าใจเครื่องหมายอัญประกาศเดี่ยวและคู่ รหัสส่วนใหญ่จะใช้งานได้เหมือนกัน
Ontonator

4

เห็นได้ชัดว่าไวยากรณ์นั้นแตกต่างอย่างสิ้นเชิง (Groovy ใกล้เคียงกับ Java มากที่สุด) แต่ฉันคิดว่านั่นไม่ใช่สิ่งที่คุณต้องการ

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


ฉันไม่เข้าใจประเด็นที่คุณใช้ Scala กับสคริปต์ Java แน่นอนคุณสามารถเขียนสคริปต์ Scala ที่ไดรฟ์รหัส Java; ไม่evalจำเป็น
Daniel Yankowsky

2
@Daniel โปรดดูคำถามเกี่ยวกับการใช้ Scala สำหรับสคริปต์ที่ฉันเชื่อมโยง คำตอบที่ได้รับการยอมรับคือการขาดสิ่งอำนวยความสะดวก "eval" และการสนับสนุน javax.scripting ทำให้มันยากกว่าที่จะใช้ Scala เพื่อเขียนสคริปต์แอ็พพลิเคชัน Java จากนั้นจึงใช้ Groovy
Thilo
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.