Clojure เป็นอิสระจาก Java อย่างไร


13

ฉันค่อนข้างใหม่สำหรับโลก Clojure ฉันขอขอบคุณความจริงที่ว่าเราสามารถเข้าถึงไลบรารี Java ทั้งหมดได้อย่างง่ายดายผ่านคุณสมบัติ Interop ของ Clojure แต่ฉันสงสัยว่า Clojure ยืนอยู่บนขาของตัวเองมากแค่ไหน

แน่นอนว่ามีบางแพลตฟอร์มเช่น Android ที่จำเป็นต้องใช้การทำงานร่วมกันกับ Java ได้ตลอดเวลาเพราะไลบรารีหลักถูกเขียนหรือเปิดเผยใน Java นอกจากนี้เนื่องจากสตริง Clojure เป็นสตริง Java ฉันคาดว่าไลบรารีการจัดการสตริงจะเป็น wrapper ในวิธีการ Java String

แต่สำหรับงานอื่น ๆ ฉันไม่เห็นเหตุผลว่าทำไมห้องสมุด Clojure ดั้งเดิมไม่สามารถพัฒนาได้ คิดถึง Http, การจัดการวันที่, การแยกวิเคราะห์ XML, การสร้างเทมเพลต, การทำให้เป็นอันดับ JSON และการดีซีเรียลไลเซชัน, OAuth, ไลบรารีคณิตศาสตร์และอื่น ๆ

ดังนั้นคำถามของฉันคือ:

Clojure มาไกลแค่ไหนที่จะเป็นอิสระจากระบบนิเวศ Java? มันมีไลบรารี่ของตัวเองสำหรับงานเหล่านี้และงานอื่น ๆ หรือไม่?


ClojureCLRเป็นพอร์ต Clojure ไปยังเฟรมเวิร์ก. Net
SL Barth - Reinstate Monica

1
สำหรับรสนิยมของฉัน Clojure core มากเกินไปนั้นถูกนำไปใช้ใน Java มันไม่ได้ทำการ bootstrapped อย่างถูกต้อง
SK-logic

@Barth: ฉันรู้ว่ามีพอร์ตไปยังแพลตฟอร์มอื่น ๆ อยู่ แต่สิ่งนี้ไม่ได้บอกอะไรมากมายเกี่ยวกับคำถาม มันสามารถทำงานบน CLR และยังไม่มีห้องสมุดของตัวเอง
Andrea

1
@ JeremyHeiler แน่นอนว่าใครก็ตามที่มีจิตใจที่ดีควรลองใช้เพื่อบรรลุเป้าหมายดังกล่าว คำถามคือ - ทำไม Clojure ไม่ได้ใช้วิธีนี้ตั้งแต่เริ่มต้น? มันง่ายกว่าการเขียนโค้ดคอมไพเลอร์ใน Java
SK-logic

1
@ SK-logic จากสิ่งที่ฉันสามารถบอกได้คุณสมบัติที่ Rich Hickey ต้องการในการ bootstrap Clojure นั้นต้องใช้เวลาในการบรรลุผล นั่นคือเขาไม่ต้องการเร่งการตัดสินใจในการออกแบบที่อาจส่งผลเสียต่อภาษาการตัดสินใจที่อาจทำให้ได้ผลลัพธ์ที่ดีขึ้นหากใช้เวลาคิดเกี่ยวกับการทำงานของคุณสมบัติบางอย่าง บางทีฉันอาจจะไม่สมบูรณ์ แต่นั่นก็เป็นเรื่องของฉัน
Jeremy Heiler

คำตอบ:


2

Clojure กำลังเป็นอิสระจากไลบรารี Java มากขึ้นเรื่อย ๆ เมื่อฐานของโค้ดเติบโตขึ้นและมีความหลากหลายตามธรรมชาติ จุดแข็งที่สำคัญของ Clojure ก็คือมันสามารถเรียก Java ได้ดังนั้นเมื่อต้องการดูโค้ด Clojure ในอนาคตที่ไม่ได้ใช้ java จะไม่น่าเป็นไปได้ ที่ถูกกล่าวว่าฉันได้ทำการพัฒนาที่ดีโดยไม่มีการเรียก Java libs (args บรรทัดคำสั่งการลดข้อความพื้นฐาน ฯลฯ ) นี่คือรายการของห้องสมุด clojure บริสุทธิ์: http://www.clojure-toolbox.com/


ฉันเลือกคำตอบนี้ด้วยลิงก์ไปยังที่เก็บของห้องสมุด Clojure ล้วน
Andrea

7

ฉันคิดว่ามันยุติธรรมที่จะบอกว่า Clojure ได้รับการออกแบบเป็นภาษาที่โฮสต์และตอนนี้มีการใช้งานสาม:

  • Clojure บน JVM
  • ClojureCLR บน. NET
  • ClojureScript บน JavaScript

เนื่องจากมันถูกออกแบบมาเป็นภาษาที่ใช้โฮสต์สำนวนคือการใช้ประโยชน์จากไลบรารีของแพลตฟอร์มที่มันสมเหตุสมผล แต่ยังจัดให้มีชุดของ "แกน" ไลบรารีที่พกพาได้ (จากมุมมองการใช้งาน ฉันคาดหวังว่าเมื่อเวลาผ่านไปเราจะเห็นห้องสมุด Clojure จำนวนมากขึ้นทำงานบนทั้งสามแพลตฟอร์มซึ่งเหมาะสมแล้ว

ฉันเก็บ clojure.java.jdbc และ clj-time (wrapper รอบ JodaTime) ดังนั้นจึงไม่เหมาะสมที่จะใช้สิ่งเหล่านี้ในเวอร์ชัน * CLR หรือ * Script แต่ไลบรารีที่เข้ากันได้กับ API ในเนมสเปซที่แตกต่างกันอาจเป็นไปได้

ไลบรารี Clojure "บริสุทธิ์" หลายแห่งควรตรงไปตรงมาเพื่อใช้กับเวอร์ชัน * CLR หรือ * Script

สำหรับคำถามของ OP: "Clojure-the-language" นั้นพกพาได้ง่าย แต่ "Clojure-the-Implement" นั้นถูกผูกไว้กับระบบนิเวศของ Java โดยเจตนาเช่นเดียวกับ ClojureCLR ถึง. NET และ ClojureScript ถึง JavaScript


2

ในขณะที่ Clojure ยังคงมีการพัฒนาอย่างต่อเนื่องแน่นอนว่ามันจะสร้างห้องสมุดของตัวเองมากขึ้นเรื่อย ๆ ซึ่งจะทำให้พอร์ตง่ายขึ้นสำหรับ VMs อื่น ๆ เท่าที่ Clojure ใน JVM เป็นห่วงฉันเชื่อว่าเป้าหมายระยะยาวจะแทนที่ libs ส่วนใหญ่ด้วยทางเลือก Clojure (ดังนั้นการที่ immutability โดยค่าเริ่มต้น STM ฯลฯ ) นำเลเยอร์ interop Java ลงไปในระดับต่ำสุดของพื้นฐานและฐาน วัตถุเช่นสตริง นี่จะเป็นจริงโดยเฉพาะอย่างยิ่งเมื่อแพลตฟอร์ม Java นั้นได้รับการดัดแปลงด้วยจิ๊กซอว์ / OSGi ใน Java 8 (2013)

อย่างไรก็ตามฉันเชื่อว่า Clojure จะยังคงต้องการลองใช้ประโยชน์จาก invokedynamic (แนะนำโดยคำสั่ง bytecode ใน Java 7) และจะใช้วิธีการที่เป็นธรรมเกี่ยวกับไลบรารีที่จะแทนที่เมื่อใด (ถ้า Java มี lib ที่ดีอย่างสมบูรณ์ทำไม เปลี่ยนมันเร็ว)

หมายเหตุ: ฉันไม่ได้มีส่วนร่วมอย่างลึกซึ้งในชุมชน Clojure ดังนั้นนี่เป็นข่าวลือ / การคาดเดาบางส่วน


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