.NET / Mono หรือ Java เป็นทางเลือกที่ดีกว่าสำหรับการพัฒนาข้ามแพลตฟอร์มหรือไม่? [ปิด]


108

Mono มีไลบรารีน้อยกว่า Java มากแค่ไหน?

ฉันขาดภาพรวมของทั้งสองทางเลือก แต่ฉันมีอิสระในการเลือกมากสำหรับโครงการต่อไปของฉัน ฉันกำลังมองหาข้อมูลทางเทคนิคที่ยากในด้านของ

  • ประสิทธิภาพ (ตัวอย่างเช่นฉันบอกว่า Java ดีสำหรับเธรดและฉันได้ยินว่าการเพิ่มประสิทธิภาพโค้ดรันไทม์กลายเป็นสิ่งที่ดีมากสำหรับ. NET เมื่อเร็ว ๆ นี้)
  • ความสามารถในการพกพาในโลกแห่งความเป็นจริง (ทั้งคู่หมายถึงการพกพา Catch-22 สำหรับแต่ละคนคืออะไร)
  • ความพร้อมใช้งานของเครื่องมือ ( CI , การสร้างระบบอัตโนมัติ, การดีบัก, IDE)

ฉันกำลังมองหาสิ่งที่คุณได้สัมผัสกับงานของตัวเองโดยเฉพาะมากกว่าสิ่งที่ฉันสามารถทำได้ใน Google แอปพลิเคชันของฉันจะเป็นบริการส่วนหลังที่ประมวลผลข้อมูลจำนวนมากจากอนุกรมเวลา

แพลตฟอร์มเป้าหมายหลักของฉันคือ Linux

แก้ไข: เพื่อให้คำถามของฉันมีความเพียงพอมากขึ้นฉันสนใจแพ็คเกจทั้งหมด (ไลบรารีของบุคคลที่สามเป็นต้น) ไม่ใช่แค่ภาษา สำหรับไลบรารีนั่นอาจทำให้เกิดคำถามว่า "Mono มีไลบรารีน้อยกว่า Java มากแค่ไหน"


FYI ฉันได้เลือก Java สำหรับโปรเจ็กต์นี้เนื่องจากดูเหมือนว่าจะมีการต่อสู้มากกว่าในด้านการพกพาและมันก็ใช้งานมาระยะหนึ่งแล้วในระบบเก่าด้วย ฉันรู้สึกเศร้าเล็กน้อยเกี่ยวกับเรื่องนี้เพราะฉันอยากรู้เกี่ยวกับ C # มากและฉันอยากจะทำโปรเจ็กต์ใหญ่ ๆ ในนั้น แต่อาจจะมีครั้งต่อไป ขอบคุณสำหรับคำแนะนำทั้งหมด


3
คำถามที่ดี เรากำลังดูการประเมินผลสำหรับการพัฒนาข้ามแพลตฟอร์มเช่นกัน
Mat Nadrofsky

ฉันจะเพิ่มแท็ก "ภาษาใด" แต่มีอยู่แล้ว 5 รายการดังนั้นโชคไม่ดี
Daniel Daranas

ขึ้นอยู่กับแพลตฟอร์มที่คุณกำหนดเป้าหมาย ...
Thorbjørn Ravn Andersen

1
ตอนนี้อาจเป็นเวลาที่ดีที่คุณจะได้ดู golang ...
StartupGuy

Xojo อาจคุ้มค่าที่จะพิจารณา มันรวบรวมแอพดั้งเดิมโดยใช้ LLVM สำหรับ Windows, Mac Linux มีการสร้าง IDE อัตโนมัติการดีบักและอื่น ๆ ไลบรารีมีคุณสมบัติมากมายและสามารถขยายได้ตามต้องการ www / xojo.com
Paul Lefebvre

คำตอบ:


96

อืม .... Java พกพาสะดวกกว่า Mono ไม่ได้นำไปใช้ทุกที่และล่าช้าหลังการใช้งาน Microsoft อย่างมาก ดูเหมือนว่า Java SDK จะซิงค์กันได้ดีขึ้นในทุกแพลตฟอร์ม (และทำงานบนแพลตฟอร์มอื่น ๆ )

ฉันยังบอกอีกว่า Java มีเครื่องมือที่พร้อมใช้งานมากขึ้นในทุกแพลตฟอร์มเหล่านั้นแม้ว่าจะมีเครื่องมือมากมายสำหรับ. NET บนแพลตฟอร์ม Windows

อัปเดตสำหรับปี 2014

ฉันยังคงมีความคิดเห็นนี้ในปี 2014 อย่างไรก็ตามฉันจะมีคุณสมบัตินี้โดยบอกว่าตอนนี้ฉันเพิ่งเริ่มให้ความสนใจกับ Mono หลังจากไม่ได้ใส่ใจมานานดังนั้นจึงอาจมีการปรับปรุงใน Mono runtime (หรือระบบนิเวศ ) ที่ฉันไม่ได้รับรู้ AFAIK ยังไม่รองรับ WPF, WCF, WF ของ WIF Mono สามารถทำงานบน iOS ได้ แต่จากความรู้ของฉันรันไทม์ Java ยังคงทำงานบนแพลตฟอร์มที่ไกลกว่า Mono นอกจากนี้ Mono ยังเริ่มเห็นเครื่องมือที่ดีขึ้นมาก (Xamarin) และ Microsoft ดูเหมือนว่าจะมีทัศนคติแบบข้ามแพลตฟอร์มมากขึ้นและเต็มใจที่จะทำงานร่วมกับพันธมิตรเพื่อให้พวกเขาเป็นอิสระมากกว่าการแข่งขัน (เช่น Mono จะเป็น เป็นส่วนสำคัญของภูมิทัศน์ OWIN / Helios ASP.NET ที่กำลังจะมาถึง) ฉันสงสัยว่าในอีกไม่กี่ปีข้างหน้าความแตกต่างในการพกพาจะลดน้อยลงอย่างรวดเร็ว

อัปเดตสำหรับปี 2018

มุมมองของฉันเกี่ยวกับเรื่องนี้เริ่มไปอีกทาง ฉันคิดว่า. NET ในวงกว้างโดยเฉพาะกับ. NET Core ได้เริ่มบรรลุ "portability parity" กับ Java แล้ว มีความพยายามในการนำ WPF ไปสู่. NET Core สำหรับบางแพลตฟอร์มและ. NET Core เองก็ทำงานบนแพลตฟอร์มจำนวนมากในขณะนี้ Mono (เป็นของ Xamarin ซึ่งปัจจุบันเป็นของ Microsoft) เป็นผลิตภัณฑ์ที่สมบูรณ์แบบและได้รับการขัดเกลามากขึ้นกว่าเดิมและการเขียนแอปพลิเคชันที่ทำงานบนหลายแพลตฟอร์มไม่ได้เป็นโดเมนของการแฮ็กเกอร์. NET อีกต่อไป แต่เป็นความพยายามที่ค่อนข้างตรงไปตรงมา . แน่นอนว่ามีไลบรารีและบริการและแอพพลิเคชั่นที่เป็น Windows เท่านั้นหรือสามารถกำหนดเป้าหมายเฉพาะแพลตฟอร์ม - แต่ก็สามารถพูดได้เช่นเดียวกันกับ Java (ในวงกว้าง)

ถ้าฉันอยู่ในรองเท้าของ OP ณ จุดนี้ฉันคงคิดได้ว่าไม่มีเหตุผลใดที่มีอยู่ในภาษาหรือกองเทคโนโลยีที่ทำให้ฉันไม่สามารถเลือก. NET สำหรับแอปพลิเคชันใด ๆ นับจากจุดนี้


2
ฉันดีใจมากที่ได้อ่านสิ่งนี้และมีความสุขกับการโหวตในโลกของ Microsoft .NET ดีมาก แต่ Java มีความถูกต้องตามกฎหมายเพราะฉันพยายามอธิบายเสมอว่าเป็นผู้พัฒนา. NET และ Java รุ่นเก่า;)
JoeBilly

+1 สำหรับสิ่งนี้ ฉันพบว่าการพกพา Java (สำหรับแอปพลิเคชันที่ไม่สำคัญเช่นเว็บเซิร์ฟเวอร์ GUI ที่ซับซ้อนเครื่องมือวิเคราะห์) ดีกว่าทางเลือกอื่น ๆ มันไม่ได้สมบูรณ์แบบนัก แต่มันเป็นสิ่งที่ดีที่สุดที่คุณจะได้รับในตอนนี้
mikera

1
@ เบนคุณยังคงมีความเห็นนี้ในปี 2013 อยู่หรือไม่? หากคุณเป็นเช่นนั้นคุณจะพูดถึงเรื่องนี้หรือไม่และหากคุณไม่อัปเดตคำตอบนี้ หลายครั้งเมื่ออ่านคำตอบอายุ 4 ขวบมันยากที่จะบอก
Benjamin Gruenbaum

1
@BenjaminGruenbaum ใช่แม้ว่าฉันจะมีคุณสมบัติตามความคิดเห็นของฉันในตอนนี้โดยบอกว่าฉันไม่ได้ให้ความสนใจกับ Mono มานานแล้วดังนั้นจึงอาจมีการปรับปรุงใน Mono runtime (หรือระบบนิเวศ) ที่ฉันไม่เคยไป ทำให้ตระหนักถึง AFAIK ยังไม่รองรับ WPF, WCF หรือ WF Mono สามารถทำงานบน iOS ได้ แต่จากความรู้ของฉันรันไทม์ Java ยังคงทำงานบนแพลตฟอร์มที่ไกลกว่า Mono ใช่. ผ่านการรับรอง แต่ใช่
Ben Collins

@HighCore อาร์กิวเมนต์ไม่ได้ต่อต้านโมโนต่อ se เป็นเพียงคำชี้แจง: ถ้าคุณเขียนโค้ดขึ้นอยู่กับ WPF คุณจะไม่สามารถใช้ Mono ได้ มันไม่สามารถพกพาได้ด้วยวิธีนั้น เฟรมเวิร์ก UI ของ Java อาจดูด แต่เท่าที่ฉันรู้ว่ามันจะทำงานได้ทุกที่ที่ Java ทำงานได้ (และฮาร์ดแวร์รองรับ UI ประเภทนั้น) นั่นไม่ได้ทำให้ Java ดีขึ้นแต่ทำให้พกพาได้มากขึ้นด้วยวิธีเฉพาะนี้
Ben Collins

112

Mono ทำงานได้ดีกว่าในการกำหนดเป้าหมายไปยังแพลตฟอร์มที่ฉันต้องการสนับสนุน นอกเหนือจากนั้นเป็นเรื่องส่วนตัวทั้งหมด

ฉันแชร์รหัส C # ในแพลตฟอร์มต่อไปนี้: - iOS (iPhone / iPad) - Android - เว็บ (HTML5) - Mac (OS X) - Linux - Windows

ฉันสามารถแชร์สถานที่ได้มากขึ้น: - Windows Phone 7 - Wii - XBox - PS3 - ฯลฯ

ตัวใหญ่คือ iOS เนื่องจากMonoTouchทำงานได้อย่างยอดเยี่ยม ฉันไม่รู้วิธีใดที่ดีในการกำหนดเป้าหมาย iOS ด้วย Java คุณไม่สามารถกำหนดเป้าหมาย Windows Phone 7 ด้วย Java ได้ดังนั้นฉันจะบอกว่าวันที่ Java ดีกว่าสำหรับมือถืออยู่เบื้องหลังเรา

ปัจจัยที่ใหญ่ที่สุดสำหรับฉันคือผลผลิต (และความสุข) ส่วนตัว C # เป็นภาษาที่อยู่ข้างหน้า Java IMHO หลายปีและกรอบงาน. NET เป็นความสุขที่จะใช้ สิ่งที่เพิ่มเข้ามาใน Java 7 และ Java 8 ส่วนใหญ่อยู่ใน C # มาหลายปีแล้ว ภาษา JVM เช่น Scala และ Clojure (ทั้งสองอย่างมีอยู่ใน CLR) นั้นค่อนข้างดี

ฉันเห็นว่า Mono เป็นแพลตฟอร์มที่ถูกต้อง (เป็นแพลตฟอร์มที่ยอดเยี่ยม) และถือว่า. NET เป็นการใช้งาน Mono บน Windows ของ Microsoft นั่นหมายความว่าฉันพัฒนาและทดสอบกับ Mono ก่อน นี่ทำงานได้อย่างยอดเยี่ยม

ถ้าทั้ง Java และ. NET (Mono สมมติว่า) เป็นโปรเจ็กต์ Open Source โดยไม่มีการสนับสนุนจากองค์กรใด ๆ ฉันจะเลือก Mono มากกว่า Java ทุกครั้ง ฉันเชื่อว่ามันเป็นเพียงแพลตฟอร์มที่ดีกว่า

ทั้ง. NET / Mono และ JVM เป็นตัวเลือกที่ดีแม้ว่าฉันจะใช้ภาษาอื่นที่ไม่ใช่ Java บน JVM เป็นการส่วนตัว

ฉันใช้ความคิดเห็นอื่น ๆ :

ปัญหา: ประสิทธิภาพ

** คำตอบ: ทั้ง JVM และ CLR ทำงานได้ดีกว่าที่ผู้ว่าทำ ฉันจะบอกว่า JVM ทำงานได้ดีกว่า โดยทั่วไปโมโนจะช้ากว่า. NET (แม้ว่าจะไม่เสมอไป)

โดยส่วนตัวแล้วฉันจะใช้ ASP.NET MVC มากกว่า J2EE ทุกวันทั้งในฐานะผู้พัฒนาและผู้ใช้ปลายทาง การสนับสนุนGoogle Native Clientก็ค่อนข้างดีเช่นกัน นอกจากนี้ฉันรู้ว่าประสิทธิภาพ GUI ที่ไม่ดีสำหรับแอป Java บนเดสก์ท็อปนั้นควรจะเป็นอดีตไปแล้ว แต่ฉันก็ยังคงพบสิ่งที่ช้า จากนั้นอีกครั้งฉันสามารถพูดเหมือนกันสำหรับ WPF GTK # เร็วมาก แต่ก็ไม่มีเหตุผลที่จะต้องช้า

ปัญหา: Java มีระบบนิเวศของไลบรารีที่ใหญ่กว่า

คำตอบ: อาจจะจริง แต่ไม่ใช่ประเด็นในทางปฏิบัติ

จริงทุก Java ห้องสมุด (รวมทั้ง JDK) วิ่งเพียงสำรวยเมื่อ .NET / โมโนขอบคุณที่IKVM.NET เทคโนโลยีชิ้นนี้เป็นสิ่งมหัศจรรย์อย่างแท้จริง การผสมผสานนั้นยอดเยี่ยมมาก คุณสามารถใช้ไลบรารี Java ได้เหมือนเดิม ฉันต้องใช้ไลบรารี Java ในแอป. NET เพียงแอปเดียว ระบบนิเวศ. NET / Mono โดยทั่วไปมีมากกว่าที่ฉันต้องการ

ปัญหา: Java มีการสนับสนุนเครื่องมือที่ดีกว่า (กว้างกว่า)

คำตอบ: ไม่ใช่บน Windows อย่างอื่นฉันเห็นด้วย MonoDevelop เป็นสิ่งที่ดี

ฉันต้องการที่จะให้ตะโกนออกไปMonoDevelop ; มันคืออัญมณี MonoDevelop รวมเครื่องมือส่วนใหญ่ที่ฉันต้องการใช้รวมถึงการเติมโค้ด (intellisense) การรวม Git / Subversion การสนับสนุนการทดสอบหน่วยการรวม SQL การดีบักการปรับโครงสร้างใหม่ที่ง่ายและการเรียกดูแอสเซมบลีด้วยการถอดรหัสแบบ on-the-fly เป็นเรื่องที่ยอดเยี่ยมที่จะใช้สภาพแวดล้อมเดียวกันสำหรับทุกอย่างตั้งแต่เว็บฝั่งเซิร์ฟเวอร์ไปจนถึงแอปบนอุปกรณ์เคลื่อนที่

ปัญหา: ความเข้ากันได้ข้ามแพลตฟอร์ม

คำตอบ: Mono เป็นฐานรหัสเดียวในทุกแพลตฟอร์มรวมถึง Windows

พัฒนาสำหรับ Mono ก่อนและปรับใช้กับ. NET บน Windows หากคุณต้องการ หากคุณเปรียบเทียบ. NET จาก MS เป็น Java แม้ว่า Java จะมีความได้เปรียบในแง่ของความสอดคล้องกันระหว่างแพลตฟอร์ม ดูคำตอบต่อไป ...

ปัญหา: โมโนล่าช้า. NET

คำตอบ: ไม่ได้ IMHO นี่เป็นคำแถลงที่ระบุ แต่ไม่ถูกต้อง

การกระจาย Mono จาก Xamarin มาพร้อมกับ C #, VB.NET, F #, IronPython, IronRuby และฉันคิดว่าอาจจะ Boo นอกกรอบ คอมไพเลอร์ Mono C # เป็นเวอร์ชันล่าสุดของ MS คอมไพเลอร์ Mono VB.NET ทำให้เวอร์ชัน MS ล่าช้า คอมไพเลอร์อื่น ๆ จะเหมือนกันบนทั้งสองแพลตฟอร์ม (เช่นเดียวกับภาษา. NET อื่น ๆ เช่น Nemerle, Boo และ Phalanger (PHP))

Mono มาพร้อมกับโค้ดที่เขียนโดย Microsoft จริงจำนวนมากรวมถึง Dynamic Language Runtime (DLR), Managed Extensibility Framework (MEF), F # และ ASP.NET MVC เนื่องจาก Razor ไม่ใช่ Open Source ปัจจุบัน Mono มาพร้อมกับ MVC2 แต่ MVC3 ทำงานบน Mono ได้ดี

แพลตฟอร์ม Mono หลักก้าวทัน. NET หรือหลายปีและความเข้ากันได้นั้นน่าประทับใจ คุณสามารถใช้ภาษา C # 4.0 เต็มรูปแบบและแม้แต่คุณสมบัติ C # 5.0 บางอย่างได้แล้ววันนี้ ในความเป็นจริง Mono มักจะนำ. NET ในหลาย ๆ ด้าน

Mono ใช้บางส่วนของข้อมูลจำเพาะ CLR ที่แม้แต่ Microsoft ก็ไม่รองรับ (เช่นอาร์เรย์ 64 บิต) หนึ่งชิ้นใหม่มากที่สุดที่น่าตื่นเต้นของเทคโนโลยีในโลก .NET คือRosylyn โมโนได้ให้บริการคอมไพเลอร์ C # เป็นเวลาหลายปี ข้อเสนอบางอย่างของ Rosylyn มีให้ผ่านทางNRefractoryเช่นกัน ตัวอย่างของ Mono ยังคงอยู่ข้างหน้าคือคำแนะนำ SIMD เพื่อเร่งประสิทธิภาพการเล่นเกม

Microsoft เสนอผลิตภัณฑ์จำนวนหนึ่งที่อยู่เหนือ. NET ที่ไม่มีใน Mono ซึ่งเป็นความเข้าใจผิดเกี่ยวกับ Mono lagging มาจาก Windows Presentation Foundation (WPF), Entity Framework (EF), WCF (Windows Communication Foundation) เป็นตัวอย่างของผลิตภัณฑ์ที่ใช้งานไม่ได้หรือได้รับการสนับสนุนไม่ดีบน Mono ทางออกที่ชัดเจนคือใช้ทางเลือกข้ามแพลตฟอร์มเช่น GTK #, NHibernate และ ServiceStack แทน

ปัญหา: Microsoft ชั่วร้าย

คำตอบ: จริง แล้วไง.

หลายคนเสนอเหตุผลต่อไปนี้เพื่อหลีกเลี่ยงการใช้ Mono:

1) คุณไม่ควรใช้ Mono เนื่องจากควรหลีกเลี่ยงเทคโนโลยีของ Microsoft

2) Mono ห่วยเพราะไม่อนุญาตให้คุณใช้ทุกเทคโนโลยีที่ Microsoft นำเสนอ

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

JVM เป็นแพลตฟอร์มที่ยอดเยี่ยมและการขยายตัวของภาษา JVM นั้นยอดเยี่ยมมาก ใช้สิ่งที่ทำให้คุณมีความสุข สำหรับตอนนี้นั่นมักจะเป็น. NET / Mono สำหรับฉัน


3
ขอบคุณสำหรับคำตอบที่ครอบคลุมในช่วงท้ายเกม ฉันไม่ได้ใช้ Mono / .Net / C # เลย แต่โพสต์ของคุณดูเหมือนจะสะท้อนถึงพัฒนาการล่าสุดในจักรวาลนั้น ตัวอย่างเช่นฉันจำไม่ได้ว่า MonoTouch มีความสำคัญเช่นนั้นเมื่อ 3.5 ปีก่อน
Hanno Fietz

3
ฉันสับสนกับคำตอบ "โมโนไม่ล้าหลัง. NET" ของคุณ คุณอ้างว่าจากนั้นระบุวิธีการครึ่งโหลในความเป็นจริงล่าช้า. NET (Entity Framework ฯลฯ ) ปลอดภัยที่จะบอกว่ามันไม่ทำให้คอมไพเลอร์ C # ของ Microsoft ล่าช้า แต่ระบบนิเวศ. NET นั้นไม่เป็นชิ้นเป็นอันที่ดีที่สุดใน Mono ดูเหมือนว่าจะใช้ได้สำหรับวัตถุประสงค์ของคุณ แต่ไม่ใช่สำหรับทุกคนและมีข้อกังวลที่ถูกต้องที่นั่น
samkass

1
@samkass: ฉันคิดว่าประเด็นนี้คือความแตกต่างระหว่าง 'ล่าช้า' และ 'ไม่ใช้ไลบรารีนี้' ในโลก Java คุณจะพบว่าสิ่งนี้คล้ายคลึงกับ Android ที่ไม่ได้ใช้ไลบรารี Swing โปรดทราบว่ามีการให้ความเทียบเท่าข้ามแพลตฟอร์ม (และโอเพ่นซอร์ส btw) ฉันใช้ Mono ทุกวันและ 'ไม่เป็นชิ้นเป็นอันอย่างดีที่สุด' ไม่ใช่ประสบการณ์ของฉันแน่นอน
konrad.kruczynski

9
การขาดการสนับสนุน WCF และ EF ที่สมบูรณ์และมีประสิทธิภาพและไม่มี WPF ที่เป็นตัวฆ่าสำหรับ Mono สำหรับทุกสิ่งที่ฉันได้ทำมาตั้งแต่. NET 3.0 ใช่มีทางเลือกอื่น แต่ส่วนใหญ่ของพลังของ. NET คือกรอบงานเพิ่มเติมเหล่านี้ หากไม่มีสิ่งเหล่านี้ฉันไม่คิดว่าคุณจะสามารถเรียก Mono ที่เข้ากันได้กับ. NET เลย เป็นการดำเนินการบางส่วนที่ดีที่สุด ฉันยังใช้ NHibernate และ EF ตรงไปตรงมาเป็นเทคโนโลยีที่ดีกว่า ไม่เคยใช้ ServiceStack IMO Mono มีความเสี่ยงมาก
MrLane

1
ทุกคนที่พลาด WCF ควรดูที่ servicestack อย่างจริงจังการไม่ใช้ WCF เป็นสิ่งที่ดี!
ไม่จริง

54

จริงๆแล้วฉันพัฒนาใน. NET เรียกใช้การทดสอบทั้งหมดของฉันก่อนใน Mono จากนั้นบน Windows ด้วยวิธีนี้ฉันรู้ว่าแอปพลิเคชันของฉันข้ามแพลตฟอร์ม ฉันทำสิ่งนี้สำเร็จแล้วทั้งในแอปพลิเคชัน ASP.NET และ Winforms

ฉันไม่แน่ใจจริงๆว่าบางคนได้รับความประทับใจ Mono นั้นน่ากลัวมากจากที่ไหน แต่แน่นอนว่ามันได้ผลในกรณีและความคิดเห็นของฉันมันเป็นความจริงที่คุณจะมีความล่าช้าเล็กน้อยสำหรับสิ่งประดิษฐ์ล่าสุดและยิ่งใหญ่ที่สุดใน. NET แต่จนถึงขณะนี้. NET 2.0 บน Windows และ Linux นั้นแข็งแกร่งมากสำหรับฉัน

โปรดทราบว่ามีนิสัยแปลก ๆ มากมายสำหรับเรื่องนี้ แต่ส่วนใหญ่มาจากการตรวจสอบว่าคุณกำลังเขียนโค้ดแบบพกพา ในขณะที่เฟรมเวิร์กทำงานได้อย่างยอดเยี่ยมในการแยกระบบปฏิบัติการที่คุณใช้งานอยู่ออกไปสิ่งเล็ก ๆ น้อย ๆ เช่นความไวของกรณีของ Linux ในเส้นทางและชื่อไฟล์ก็ต้องใช้เวลาทำความคุ้นเคยเช่นเดียวกับการอนุญาต

.NET เป็นข้ามแพลตฟอร์มอย่างแน่นอนเนื่องจาก Mono จากประสบการณ์ของฉันจนถึงตอนนี้


เรียกฉันว่าไม่รู้ แต่คุณจำเป็นต้องทดสอบ ASP.NET ด้วยโมโนหรือไม่? ทุกอย่างที่จะเป็น. NET เป็นฝั่งเซิร์ฟเวอร์ดังนั้นจึงไม่สำคัญว่าระบบปฏิบัติการใดจะแสดงอยู่หรือไม่?
Ethan Gunderson

9
Ethan โดยใช้ Mono คุณสามารถโฮสต์แอป ASP.net บน Linux
Eric Haskins

2
ไม่ใช่ทุกคนที่ต้องการใช้งานแอปบน Windows ไม่ว่าจะด้วยเหตุผลใดก็ตาม
เบอร์นาร์ด

2
@ Rich B: หากลูกค้าไม่ต้องการผลิตภัณฑ์ MS .NET เป็นตัวเลือกที่ผิดอย่างชัดเจน
Kjetil Ødegaard

21
@Kjetil: Mono ไม่ใช่ผลิตภัณฑ์ MS
GEOCHET

26

จริง ๆ แล้ว Java เป็นข้ามแพลตฟอร์มอย่างที่ใคร ๆ ก็พูดกัน มีการติดตั้ง JVM สำหรับระบบปฏิบัติการหลัก ๆ (แม้แต่ Mac OS X ในที่สุด) และพวกเขาทั้งหมดทำงานได้ดีจริงๆ และมีเครื่องมือโอเพนซอร์สมากมายที่มีให้เลือกใช้เช่นเดียวกับข้ามแพลตฟอร์ม

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


1
นอกจากนี้ในทุกกรณีที่ Java ไม่สามารถดำเนินการแบบเนทีฟในลักษณะข้ามแพลตฟอร์มได้เช่นเดียวกันสำหรับ. NET
Eli Courtwright

สุดท้าย? Mac OS X มีการนำ JVM มาใช้ตั้งแต่ 10.0 :)
mipadi

3
@ เอลี่ - น่าจะจริง แน่นอนว่าง่ายกว่ามากในการรวมเข้ากับฟังก์ชันเนทีฟใน. NET / Mono มากกว่าใน Java ดังนั้นหากคุณแค่พยายามรวมเข้ากับแพลตฟอร์มเนทีฟอย่างดี. NET / Mono จะให้ประโยชน์อย่างแท้จริง
จัสติ

"วางไข่กระบวนการดั้งเดิมและคัดลอกผลลัพธ์" ตัวสั่น
พื้นฐาน

ฉันจะเล่นลิ้นกับ 'ระบบปฏิบัติการหลัก ๆ ' เพราะไม่มี JVM นอกกรอบสำหรับ Android หรือ iOS ด้วยไลบรารีคลาสพกพาใหม่ใน. NET ในขณะเดียวกันคุณสามารถแชร์โค้ดที่คอมไพล์แล้ว (แม้ว่าจะไม่ใช่โค้ด UI ในทางปฏิบัติ) ข้ามแพลตฟอร์มรวมถึงอุปกรณ์เคลื่อนที่
Mathieson

18

ฉันคิดว่าคำถามเป็นวลีที่ไม่ถูกต้อง C # เทียบกับ Java นั้นมีความน่าสนใจน้อยกว่าในแง่ของการใช้งานข้ามแพลตฟอร์มมากกว่าที่เป็น (a) แพลตฟอร์มใดที่คุณต้องรองรับและ (b) พิจารณาไลบรารีหลักและไลบรารีของบุคคลที่สามที่มีอยู่ ภาษาแทบจะเป็นส่วนสำคัญน้อยที่สุดในกระบวนการตัดสินใจ


เห็นด้วย เป็นเรื่องของการรองรับเครื่องเสมือนบนสถาปัตยกรรมต่างๆ
Allain Lalonde

เห็นด้วย ไม่สนุกในการพัฒนาเต็มรูปแบบหากลูกค้าไม่สามารถเรียกใช้งานได้
Thorbjørn Ravn Andersen

15

Java เป็นทางเลือกที่ดีกว่าสำหรับการพัฒนาข้ามแพลตฟอร์ม

  • ประสิทธิภาพ. Java และ. Net มีระดับประสิทธิภาพที่ใกล้เคียงกันเนื่องจากเครื่องเสมือน แต่โดยปกติ JVM จะมีประสิทธิภาพที่ดีกว่าเนื่องจากการเพิ่มประสิทธิภาพเป็นปีและปี

  • ห้องสมุด. แม้ว่าสิ่งนี้จะขึ้นอยู่กับงานของคุณ แต่ Java ก็มีโอเพ่นซอร์สหรือไลบรารีของบุคคลที่สามอยู่ที่นั่น สำหรับเซิร์ฟเวอร์ App, J2EE, Spring, Struts เป็นต้นสำหรับ GUI แม้ว่า. Net จะให้ Win32 layer API แต่ก็ทำให้เกิดปัญหาความเข้ากันได้ Java มี Swing, SWT, AWT เป็นต้นซึ่งใช้งานได้ในกรณีส่วนใหญ่

  • ความเข้ากันได้ นี่คือประเด็นสำคัญที่ต้องพิจารณาเมื่อพัฒนาโปรแกรมข้ามแพลตฟอร์ม สองประเด็น: ประการแรกความเข้ากันได้ของแพลตฟอร์ม Java ยังคงชนะเนื่องจาก JDK ได้รับการดูแลอย่างดีโดย บริษัท Sun MS ไม่ได้รับการดูแลโมโนดังนั้นคุณจึงยังไม่มีการรับประกันสำหรับความเข้ากันได้ของการอัปเดต 2. ความเข้ากันได้ย้อนหลัง ซันรักษาชื่อเสียงที่ดีในเรื่องความเข้ากันได้แบบย้อนหลังแม้ว่าบางครั้งสิ่งนี้จะดูเข้มงวดเกินไปและทำให้ก้าวช้าลง

  • เครื่องมือ Java มี IDE ข้ามแพลตฟอร์มที่ดี Netbeans, Eclipse ฯลฯ ส่วนใหญ่ให้บริการฟรี VS Studio เป็นสิ่งที่ดี แต่เฉพาะบน Windows และไม่มีค่าใช้จ่ายเลย ทั้งสองอย่างมีการทดสอบหน่วยที่ดีการแก้ไขข้อบกพร่องโปรไฟล์ ฯลฯ

ดังนั้นฉันขอแนะนำว่า Java เป็นตัวเลือกที่ดีกว่า ในกรณีที่แสดงมีแอพข้ามแพลตฟอร์มเดสก์ท็อปที่มีชื่อเสียงบางตัวที่พัฒนาโดย Java: Vuze, Limewire, BlogBridge, CrossFTP ซึ่งไม่ต้องพูดถึง IDE เหล่านั้น สำหรับ. Net ฉันมีความรู้ จำกัด เกี่ยวกับแอพที่ประสบความสำเร็จดังกล่าว


การทำงานกับโมโนบน Linux "อื่น ๆ " เป็นเรื่องยุ่งยาก สิ่งนี้สะท้อนให้เห็นถึงปัญหาสำคัญของโมโน: อนาคตของโมโนขึ้นอยู่กับเผด็จการของมิเกลเดออิกาซามากเกินไป Case-in-point: การสนับสนุนที่ลดน้อยลงสำหรับ "อื่น ๆ ... (ไม่รองรับ)" [ mono-project.com/Other_Downloads]ดูเหมือนว่า Linux จะสัมพันธ์ ( IMHO ) กับความท้อแท้ของ Miguel de Icaza กับ Linux ( tirania.org/blog/archive/ 2556 / มี.ค. -05.html ). Java ไม่ประสบปัญหาเผด็จการนี้ C # อาจทำงานบนแพลตฟอร์มที่มากขึ้น แต่ก็มาพร้อมกับต้นทุนความเสี่ยงการประนีประนอมและการพึ่งพา Mr. de Icaza มากขึ้น ไม่เป็นไรขอบคุณ.
StartupGuy

@ Michael.M ดังนั้นคุณอยากเป็นที่ต้องการของ Oracle หรือไม่?
Thorbjørn Ravn Andersen

@ ThorbjørnRavnAndersenผิด ให้ฉันทำลายมันลงอย่างง่ายๆที่สุดเท่าที่จะทำได้: .Net -> แพลตฟอร์ม MSFT (บริษัท ที่ประสบความสำเร็จอย่างมั่นคง; ระบบนิเวศที่ จำกัด แต่เรียบร้อย); Mono -> De Icaza framework (el dictador; not hot for Linux and it shows: [ cultofmac.com/218632/… - - ลองติดตั้ง mono บน Centos 6.4 มันเป็นฝันร้ายที่ "ไม่รองรับ"); Javaเป็นข้อกำหนดที่เป็นของชุมชนและมีการใช้งานของผู้จำหน่ายที่แตกต่างกันจำนวนมาก (Oracle เป็นเพียงหนึ่งเดียว) [ coderanch.com/t/327542/java/java/…
StartupGuy

@ ThorbjørnRavnAndersen: .. ยิ่งไปกว่านั้นผู้สนับสนุนชุมชน Java รายใหญ่ยังสามารถยกเว้น Oracle ได้และยังคงประสบความสำเร็จและได้รับการสนับสนุนเป็นอย่างดี - Java ไม่ได้เป็นไปตามความต้องการของ Oracle --- โปรดดู: news.techworld.com/applications/3252787/ … Oracle สามารถถ่ายโอนข้อมูลที่เกี่ยวข้องกับ Java ทั้งหมดและจะยังคงมีอยู่ ผู้ขายรายอื่นมีแพลตฟอร์ม. Net อะไรบ้าง? ใครเป็นผู้จัดหารันไทม์โมโนนอกเหนือจาก Xamarin Java เป็นหนึ่งในสิ่งเหล่านี้เท่านั้นที่ไม่อยู่ภายใต้การปกครองแบบเผด็จการและมีการควบคุมชุมชนที่แท้จริงการสนับสนุนจากชุมชนและการดูแลชุมชน
StartupGuy

1
@ Michael.M สเปก? เป็นของชุมชน? ฉันคิดว่าคุณคิดผิด - ฉันยังเชื่อว่าเหตุผลเดียวที่โครงการ OpenJDK ไม่ได้ปิดตัวลงหลังจากการเข้าซื้อกิจการของ Sun คือ GPL Java อยู่ในกำปั้นเหล็กของ Oracle เพียงเพราะ TCK ไม่สามารถใช้งานได้อย่างอิสระและนั่นคือสิ่งที่จำเป็นในการสร้าง JVM ที่ทำงานเหมือน Oracle JVM ฉันไม่มีปัญหากับ Mono หรือ De Icaza แต่ฉันไม่คิดว่าสถานการณ์ Java จะดีกว่านี้มาก โครงการ JVM ทางเลือกเดียวที่มีโมเมนตัมเสียชีวิตเมื่อ IBM หยุดสนับสนุน
Thorbjørn Ravn Andersen

9

ฉันเคยถามคำถามเดียวกันนี้และ IMHO, .NET / Mono ดูเหมือนจะเป็นตัวเลือกที่ดีกว่าเพียงเพราะMono มีประวัติอันยอดเยี่ยมสำหรับแอปพลิเคชันเดสก์ท็อปข้ามแพลตฟอร์ม (เมื่อเทียบกับ Java) และแน่นอนว่าMono คือ ดีขึ้นอย่างก้าวกระโดดในทุกวันนี้


8

ฉันจะพูดว่า Java เช่นกัน หากคุณมองในแง่ของวุฒิภาวะ Sun (และคนอื่น ๆ ) ใช้เวลาและความพยายามมากขึ้นในการทำให้ JVM ทำงานบนแพลตฟอร์มที่ไม่ใช่ Windows

ในทางตรงกันข้ามโมโนเป็นพลเมืองชั้นสองในระบบนิเวศ. NET

ทั้งนี้ขึ้นอยู่กับว่าลูกค้าเป้าหมายของคุณคือใครคุณอาจพบว่ามีการผลักกลับจริงจากการใช้ Mono - Novell เสนอการสนับสนุนผู้ขายแบบเดียวกับ Mono ที่คุณจะได้รับสำหรับ Java หรือ. NET บน Windows หรือไม่?

หากคุณกำหนดเป้าหมายการโฮสต์บริการของคุณบน Windows เป็นหลักคุณควรพิจารณาตัวเลือกนี้ แต่เนื่องจากคุณกำหนดเป้าหมายไปที่ Linux เป็นหลักดูเหมือนว่าจะไม่ใช่เรื่องง่ายสำหรับฉัน


ฉันมักจะเห็นด้วยกับการที่โมโนเป็นพลเมืองชั้น 2 แต่ไม่ใช่กับข้อสรุป Java มีมานานแล้วและเต็มไปด้วยนิสัยแปลก ๆ และปัญหาการจัดการหน่วยความจำที่ไม่ต้องพูดถึงว่าเกือบจะเลือกวิธีที่ละเอียดที่สุดในการทำบางสิ่ง มันค่อนข้างนิ่ง (ภาษา) มาหลายปีแล้วและเพิ่งเริ่มรวมฟีเจอร์ที่อยู่ใน. Net มาหลายปีแล้ว IMHO เป็นทางเลือกระหว่างสองความชั่วร้าย ... แพลตฟอร์ม Flakey รองรับ w / .Net หรือ behemoth ไม้ที่พัฒนาช้ามากและเป็นงานที่น่าเบื่อในการเขียนโค้ด
พื้นฐาน

7

Java ได้รับการออกแบบให้เป็นแบบข้ามแพลตฟอร์ม C # /. net ไม่ได้. หากมีข้อสงสัยให้ใช้เครื่องมือที่ออกแบบมาเพื่อวัตถุประสงค์ของคุณ

แก้ไข: ตามความเป็นธรรม. NET ได้รับการออกแบบมาเพื่อทำงานบนสภาพแวดล้อมแบบฝัง / PC / Server ดังนั้นจึงเป็น SORT ของข้ามแพลตฟอร์ม แต่ไม่ได้ออกแบบมาสำหรับ Linux


3
C # เป็นมาตรฐาน ISO ดังนั้นแนวคิดคือการมีบางอย่างข้ามแพลตฟอร์ม ไมโครซอฟท์ไม่ต้องการพัฒนาการใช้งานสำหรับแพลตฟอร์มอื่น แต่ปล่อยให้ฝ่ายอื่น ๆ เป็นภาษามาตรฐาน . Net framework เป็นเรื่องที่ซับซ้อนกว่า
zappan

Mono เป็นการใช้งานที่ดีแม้ว่า DotGNU (สำหรับ Mac ด้วย)
Andrei Rînea

1
zappan: จุดที่ถูกต้องบน C # (ไม่รู้) แต่. NET นั้นใหญ่มาก เป็นที่ยอมรับว่าฉันไม่มีประสบการณ์ส่วนตัวที่นี่
AlexeyMK

@zappan - จากมุมมองในทางปฏิบัติไม่เกี่ยวข้องที่ C # เป็นมาตรฐาน (หรือ Mono สร้างโคลน C # ที่ค่อนข้างดี) ความสามารถในการพกพาแพลตฟอร์มเป็นเรื่องเกี่ยวกับแพลตฟอร์มทั้งหมด (รวมถึงไลบรารีและระบบนิเวศของเครื่องมือ) ไม่ใช่แค่ภาษาเท่านั้น ในแง่นั้น Net ไม่ใช่ข้ามแพลตฟอร์มอย่างสมบูรณ์
mikera

7

ฉันคิดว่าคำตอบคือ "มันขึ้นอยู่กับ" Java ทำงานได้ทุกอย่าง แต่. NET / Mono เป็น (IMHO) เป็นเฟรมเวิร์กที่ดีกว่าสำหรับเดสก์ท็อป ดังนั้นฉันเดาว่าคำตอบนั้นขึ้นอยู่กับแพลตฟอร์มที่คุณวางแผนจะกำหนดเป้าหมาย


เดสก์ท็อปไม่ตรงกันกับ windows แม้ว่าจะมีพื้นที่ส่วนใหญ่ที่สุดของเดสก์ท็อปก็ตาม
ZOXIS

6

เพื่อเพิ่มการสนทนาอีกเล็กน้อย Java เป็นแบบพกพาได้มากขึ้นหากคุณยังคงอยู่เบื้องหลังเวอร์ชันหนึ่ง - Java 5 ยังคงมีคุณสมบัติที่ยอดเยี่ยมมากมายดังนั้นคุณสามารถรอ Java 6 และยังมีช่วงมากมายในแง่ของภาษาและไลบรารีที่ต้องพัฒนา ด้วย. Mac เป็นแพลตฟอร์มหลักที่อาจใช้เวลาพอสมควรในการติดตาม Java เวอร์ชันล่าสุด

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


OS X 10.6 ได้รับการตอบสนองอย่างสมบูรณ์กับรุ่น Sun Java 6 แล้ว
Thorbjørn Ravn Andersen

5

ฉันจะโหวตให้ Java พกพาได้มากกว่า C # Java ยังมีไลบรารีมาตรฐานมากมาย นอกจากนี้ยังมีห้องสมุดของบุคคลที่สามแบบโอเพนซอร์สมากมายเช่นห้องสมุดที่จัดทำโดยโครงการจาการ์ตา ( http://jakarta.apache.org/ )

ผู้ต้องสงสัยตามปกติทั้งหมดมีอยู่สำหรับ CI การทดสอบหน่วยและอื่น ๆ ด้วย การรองรับ IDE ข้ามแพลตฟอร์มนั้นดีมากเช่นกันเช่น Eclipse, Netbeans, IntelliJ IDEA เป็นต้น


4

มีตัวเลือกภาษาอื่นด้วย ฉันชอบ Python มากซึ่งทำงานได้ดีบน Windows, Linux และ Mac และมีไลบรารีมากมาย


ใช่ฉันชอบ Python และมี Django ที่ฉันชอบสำหรับเว็บแอป แต่มีบางอย่างที่ทำให้ไม่สามารถยอมรับได้สิ่งที่สำคัญที่สุดคือ GIL ในการใช้งานล่ามมาตรฐาน C ฉันมีการดำเนินการหลายอย่างที่ได้รับประโยชน์อย่างมากจากการประมวลผลแบบขนานบนเครื่องมัลติคอร์และฉันต้องวางกระบวนการเพื่อทำสิ่งนั้นใน cPython
Hanno Fietz

3

ในขณะที่ Mono มีส่วนแบ่งของปัญหาแต่ฉันคิดว่ามันมีเรื่องราวความเข้ากันได้ข้ามแพลตฟอร์มที่ดีกว่าโดยเฉพาะอย่างยิ่งหากคุณพึ่งพาการร้องขอแพลตฟอร์มดั้งเดิม

มีคำไม่เพียงพอใน Stack Overflow ที่จะเน้นว่าการรับสิ่งที่เรียกและดำเนินการใน. NET / Mono บน. NET / Mono (อย่างน้อยก็ในประสบการณ์ของฉัน 3 ... ) หลายแพลตฟอร์มเทียบกับความพยายามของ Java ที่เทียบเท่ากัน


ฉันเห็นด้วยการเรียกรหัสเฉพาะแพลตฟอร์มจาก. NET / Mono นั้นง่ายมากตราบใดที่สามารถเรียกจาก C. ด้วย CXXI ​​(ออกเสียงว่าเซ็กซี่) มันก็กลายเป็นทางเดินเพื่อเรียกรหัส C ++ เช่นกัน tirania.org/blog/archive/2011/Dec-19.html
Justin

2

คุณGatorhallมีข้อมูลสำรองหรือไม่

ประสิทธิภาพ. Java และ. Net มีระดับประสิทธิภาพที่ใกล้เคียงกันเนื่องจากเครื่องเสมือน แต่โดยปกติ JVM จะมีประสิทธิภาพที่ดีกว่าเนื่องจากการเพิ่มประสิทธิภาพเป็นปีและปี

ความเป็นมา: ฉันเป็นคนใช้ Windows ตั้งแต่ Windows 3.1 และปัจจุบันเป็นผู้ใช้ Linux (ยังคงใช้ Windows 7, ระบบปฏิบัติการที่ยอดเยี่ยม, บน VM สำหรับ Visual Studio 2010 และเครื่องมืออื่น ๆ )

ประเด็น: ฉันและผู้ใช้จำนวนมาก (windows, linux ฯลฯ ) ฉันรู้ว่าอาจไม่เห็นด้วยจากคุณ Java มีแนวโน้มที่จะทำงานช้าลงแม้ในแอปพลิเคชัน Linux บนเดสก์ท็อป ASP.NET จะทำงานได้เร็วกว่าที่เซิร์ฟเวอร์จาวาหน้าเว็บหลายครั้ง บางคนอาจยอมรับว่าแม้แต่ PHP ที่ไม่ได้คอมไพล์ก็ทำงานได้ดีกว่าในหลาย ๆ สถานการณ์

Java เป็นข้ามแพลตฟอร์มมากกว่า? ฉันไม่สงสัยเกี่ยวกับเรื่องนี้ (ประวัติย้อนหลังนี้) แต่เร็วกว่า (ไม่ได้บอกว่า. NET) ไม่แน่ใจนักและฉันต้องการดูเกณฑ์มาตรฐานที่แท้จริง


มีคำถามอื่นที่อาจช่วยให้และแน่นอนมีภาษายิงออกมา JVM อาจได้รับการปรับให้เหมาะสมมากขึ้น แต่ก็ใกล้เคียง (โดยเฉพาะใน Windows) เกณฑ์มาตรฐานสำหรับ ASP.NET เทียบกับ J2EE หรือ JSP เป็นสิ่งที่น่าสงสัยมากขึ้น แต่ฉันไม่มีปัญหาในการเชื่อว่า ASP.NET นั้นเร็วกว่ามากแม้ว่าเวลาทำงานจะเท่ากันก็ตาม
Justin
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.