JVM के लिए C # लागू करना


91

क्या कोई JVM के लिए C # लागू करने का प्रयास कर रहा है? एक जावा डेवलपर के रूप में, मैं सी # को ईर्ष्या के साथ देख रहा हूं, लेकिन जेवीएम की पोर्टेबिलिटी और परिपक्वता को छोड़ने के लिए तैयार नहीं है, इसके लिए विभिन्न प्रकार के उपकरणों का उल्लेख नहीं है।

मुझे पता है कि जेवीएम और सीएलआर के बीच कुछ महत्वपूर्ण अंतर हैं लेकिन क्या ऐसा कुछ है जो शोस्टॉपर है?


3
मैंने जावा में बहुत से, कई पूरी तरह से मल्टीप्लेट रिकॉर्डर ऐप भी लिखे हैं - यह मेरे और मेरी टीम के लिए एक रोज़ की बात है। हम आम तौर पर प्रत्येक प्लेटफ़ॉर्म पर परीक्षण योजना चलाते हैं जिसे हम आधिकारिक रूप से "योग्य बनाते हैं", लेकिन मुझे लगता है कि यह कई साल हो गए हैं जब टेस्ट बग को एक मंच अंतर के लिए जिम्मेदार ठहराया गया है।
जारेड

1
हमारा मुख्य उत्पाद विंडोज, ओएस एक्स और लिनक्स पर अपरिवर्तित है। यह वास्तव में करना मुश्किल नहीं है।
थोर्बोजर्न रेवन एंडरसन

1
मैं विंडोज में अपना जावा करता हूं, उबाऊ आदमी ओएसएक्स में अपना हिस्सा करता है, सीआई लिनक्स के तहत सभी परीक्षणों को क्रंच करता है और हमने सॉफ्टवेयर को विंडोज और लिनक्स सर्वर और यहां तक ​​कि सोलारिस दोनों की विस्तृत विविधता के लिए तैनात किया है। इसलिए मुझे लगता है कि मैं कह सकता हूं कि मैंने अभी कुछ समय के लिए वास्तव में, पूरी तरह से, मल्टीप्लायर जावा प्रोग्राम लिखे हैं।
एस्को

1
.NET में JavaVM लागू; जावा LIBS का .NET कार्यान्वयन; दोनों दुनिया के अंतर -> IKVM.NET ( ikvm.net )
gsscoder

1
मुझे लगता है कि अगर आप .NET को जावास्क्रिप्ट में बदल सकते हैं (उदाहरण के लिए JSIL ऐसा करता है), तो आपको इसे जावा में बदलने में सक्षम होना चाहिए ...
BrainSlugs83

जवाबों:


93

सीएलआर और जेवीएम के बीच बहुत महत्वपूर्ण अंतर हैं।

कुछ उदाहरण:

  • जावा में उपयोगकर्ता-परिभाषित मूल्य प्रकार नहीं हैं
  • .NET जेनरिक के लिए जावा जेनरिक पूरी तरह से अलग है
  • C # के कई पहलू रूपरेखा के तत्वों पर निर्भर करते हैं - प्रतिनिधि आदि। आपको भाषा के पहलुओं के लिए भी पुस्तकालय को पोर्ट करना होगा ।
  • जावा एक JVM स्तर पर गुणों और घटनाओं जैसी चीजों का समर्थन नहीं करता है। आप इसमें से कुछ नकली कर सकते हैं, लेकिन यह वैसा नहीं होगा।
  • मेरा मानना ​​है कि जावा के पास JVM स्तर पर भी पास-दर-संदर्भ मापदंडों के बराबर है
  • विभिन्न मेमोरी मॉडल के साथ करने के लिए सूक्ष्मता संभवतः काफी काटेगी, हालांकि मुझे यकीन नहीं है कि सी # कल्पना में कितना है।
  • जावा में सामान्य रूप से असुरक्षित कोड संभव नहीं है
  • जेएनआई और पी / इनवोक के बीच मूल कोड के साथ इंटरऑपरेबिलिटी बहुत अलग है। यह शायद आपके लिए ज्यादा समस्या नहीं है।
  • आपको ओवरलोडिंग और उपयोगकर्ता द्वारा परिभाषित रूपांतरणों के लिए नकली ऑपरेटर रखना होगा

आप शायद बहुत सी # पोर्ट कर सकते हैं - लेकिन आप एक बहुत ही असंतोषजनक अनुभव, IMO के साथ रह जाएंगे।

दूसरे तरीके से जा रहे हैं, क्या आप IKVM के बारे में जानते हैं ? यह आपको .NET कोड में जावा कोड चलाने की अनुमति देता है।


7
जावा में अंतिम रूप है, और .NET अंतिम निर्धारण भी नियतात्मक नहीं है। दोनों के बीच कुछ सूक्ष्म अंतर हो सकते हैं, लेकिन मैं किसी भी अपमान के बारे में नहीं सोच सकता। मुझे संदेह है कि जावा की रीचबिलिटी टेस्ट .NET की तुलना में अधिक मजबूत हैं: कोई अंतिमकरण नहीं है जबकि एक और धागा अभी भी एक इंस्टेंस विधि चला रहा है
जॉन स्कीट

3
मुझे लगता है कि आप संदर्भ प्रकारों पर मान टाइप कर सकते हैं। बस हर काम एक उथले क्लोन करते हैं!
डैनियल इयरविकर

3
@Earwicker: ... और सरणी आवंटन, और विभिन्न अन्य स्थानों पर जहां शब्दार्थ में फर्क होता है? मुझे संदेह है कि यह काम करने के लिए बहुत मुश्किल होगा , अगर यह संभव है, और परिणाम कुछ ऐसा नहीं होगा जिसे आप उपयोग करना चाहते हैं।
जॉन स्कीट

4
मुझे लगता है कि जेनेरिक भी सॉल्व होगा। टाइप ऑब्जेक्ट्स के लिए क्लास ऑब्जेक्ट रखने के लिए आपको अतिरिक्त फ़ील्ड्स के साथ एक जावा क्लास उत्पन्न करना होगा, इसलिए यह कुछ ओवरहेड जोड़ देगा, लेकिन फिर नया टी () और टाइपोफ़ (टी) उपलब्ध होगा।
डैनियल ईयरविकर

30
@Jon Skeet: यह आपको दोनों दुनियाओं में सबसे खराब देता है: Microsoft के स्वामित्व प्लेटफ़ॉर्म पर जावा की कुछ पुरानी भाषा।
बार्ट वैन ह्युकेलम

43

Http://code.google.com/p/stab-language पर जाएं

नीचे कोड अगर JVM के लिए एक Stab भाषा कोड

using java.lang;
using stab.query;
public class Test {
   public static void main(String[] args) {
   // Sorts the arguments starting with "-" by length and then using the default   
        // string comparison
        var query = from s in Query.asIterable(args)
                    where s.startsWith("-")
                    orderby s.length(), s
                    select s;
        foreach (var s in query) {
            System.out.println(s);
        }
    }
}

7
छुरा JVM पर C # भाषा के बहुत से मांस वितरित करता है लेकिन एक तरह से ऐसा करता है जो बहुत जावा इंटर-ऑपरेटेबल है। इसलिए यह .NET CLR के लिए लिखे गए C # कोड के लिए कड़ाई से स्रोत कोड के अनुरूप नहीं है, लेकिन यह जावा प्रोग्रामर को समान गुणवत्ता वाले बाइट कोड उत्पन्न करने और जावा पुस्तकालयों और चौखटे के साथ गैर-प्रतिबाधा अंतर्संचालनीयता होने पर भाषा की तरह बहुत सी # का आनंद लेने में सक्षम बनाता है। JVM पर C # लेने के लिए यह सही तरीका है।
रोजर

अच्छी भाषा, अच्छे मंच पर ... काश मैं इस साल पहले ठोकर खा जाता।
जेफरी गुफा

14

बाइटकोड ट्रांसपिलर

ग्रासहॉपर एक सीएलआर बाईटेकोड ले सकता है और जेवीएम के लिए इसे ट्रांसपाइल कर सकता है। मुख्य रूप से वेब ऐप्स के लिए इरादा, यह उदाहरण के लिए विंडोज फॉर्म कक्षाओं के जेवीएम कार्यान्वयन प्रदान नहीं करता है। कुछ हद तक लगता है, यद्यपि। वेब ASP.NET 2.0, विजुअल स्टूडियो 2008 और इतने पर के बारे में बात करता है। सबसे पहले @alex द्वारा उल्लेख किया गया है

XMLVM CLR या JVM बायटेकोड को इनपुट के रूप में ले सकता है और आउटपुट के रूप में उत्पादन कर सकता है। इसके अतिरिक्त यह जावास्क्रिप्ट या ऑब्जेक्टिव-सी आउटपुट कर सकता है। अभी तक कोई रिलीज नहीं, केवल तोड़फोड़। "प्रायोगिक विकास संस्करण जिसे उत्पादन परिवेश में उपयोग नहीं किया जाना है।"

IKVM ओपी चाहता है की तुलना में दूसरी दिशा में जाता है। यह सीएलआर पर चलने वाला एक जेवीएम कार्यान्वयन प्रदान करता है, एक जेवीएम से सीएलआर बाईटेकोड ट्रांसपिलर और जावा के लिए एक सीएलआर लाइब्रेरी विधि स्टब जनरेटर। http://www.ikvm.net/use.html @Jon Skeet द्वारा उल्लेख किया गया

आरपीसी

क्यों नहीं CLR और JVM साथ-साथ चल रहे हैं और संचार को यथासंभव घर्षणहीन बना रहे हैं? यह वह नहीं है जो ओपी चाहता है, लेकिन कुछ अन्य उत्तर पहले से ही अलग-अलग तरीकों से विषय से काफी दूर हैं, इसलिए इसे कवर करते हैं।

RabbitMQ , एक नि: शुल्क विकल्प है, यह एक आरपीसी सर्वर है जो सी #, जावा और अधिक के लिए एपीआई पुस्तकालयों के साथ एर्लांग में लिखा गया है।

jnBridge , कुछ संभावित उपयोगकर्ताओं के लिए लाइसेंस बहुत महंगा हो सकता है।

जीआरपीसी , और इसी तरह के आधुनिक आरपीसी लाइब्रेरी इन भाषाओं में क्लाइंट लाइब्रेरी के लिए वाइड लैंग्वेज सपोर्ट, कोड जेनरेशन, डेटा के लिए लैंग्वेज इंडिपेंडेंट वायर फॉर्मेट, कैस्केडिंग कॉल-कैंसेलेशन जैसी एडवांस फीचर्स आदि प्रदान करते हैं।

प्रोग्रामिंग की भाषाएँ

एक बार लिखें, हर जगह दौड़ें;)

हैक्स , सी # / सीएलआर, जावा / जेवीएम, जावास्क्रिप्ट, फ्लैश, पायथन के लिए संकलित करता है, ... लक्ष्य भाषाओं में से प्रत्येक के लिए इंटरोप तंत्र प्रदान करता है। कुछ हद तक एक ActionScript3 उत्तराधिकारी के रूप में सोचा जा सकता है। वास्तव में इस पर निर्भर करता है, कम से कम एक कंपनी के साथ बहुत ठोस सामान लगता है। स्टैब की तुलना में बहुत अधिक भरोसेमंद, अगले उल्लेख किया गया है।

Stab कुछ C # फीचर्स और जावा इंटरऑपरेबिलिटी लाता है। बहुत उपयोगी नहीं है, आपको कुछ सी # सुविधाएं मिलती हैं, लेकिन आप जो जावा कोड के साथ बातचीत करते हैं, उनका उपयोग नहीं करते हैं। https://softwareengineering.stackexchange.com/a/132080/45826 भाषा अपेक्षाकृत अस्पष्ट है, संभवतः छोड़ दिया गया है, बेहतर बनने के लिए थोड़ा वादा के साथ। सबसे पहले @Vns द्वारा यहाँ उल्लेख किया गया है।

जेवीएम प्लेटफॉर्म के लिए ताजा हवा का झोंका;)

स्काला , कोटलिन , अन्य, जेवीएम के शीर्ष पर चलने वाली काफी अच्छी भाषाएं हैं जो ऐसी विशेषताएं लाती हैं जो सी # प्रोग्रामर को जावा में याद आ सकती हैं। विशेष रूप से कोटलिन जेवीएम दुनिया में सी # के लिए एक उचित विकल्प की तरह लगता है। एक प्रोग्रामर के लिए थोड़े समय में आराम पाने के लिए स्काला थोड़ी बहुत बड़ी भाषा हो सकती है।

मोनो

यह निश्चित रूप से एक विकल्प भी है। JVM को ट्रांसपाइल क्यों करें अगर मोनो इसे जैसा चाहे वैसे चला सकता है। सबसे पहले @ferhrosa द्वारा उल्लेख किया गया

न्यूयार्क - 12 नवंबर, 2014 - बुधवार को, माइक्रोसॉफ्ट कॉर्प ने फुल सर्वर-साइड .NET स्टैक को ओपन करके और लिनक्स और मैक ओएस प्लेटफार्मों पर चलाने के लिए .NET का विस्तार करके क्रॉस-प्लेटफॉर्म डेवलपर अनुभवों के लिए अपनी प्रतिबद्धता को मजबूत किया।

इस प्रेस विज्ञप्ति के अनुसार जिसमें से उद्धरण आता है, विज़ुअल स्टूडियो 2015 लिनक्स / मोनो को एक समर्थित प्लेटफॉर्म के रूप में जोड़ देगा।

यह एक ब्लॉग है जो मोनो परियोजना के लोगों द्वारा इसके बारे में लिखा गया है, दूसरी तरफ से: .NET स्रोत कोड एकीकरण (नवंबर 2014)।

.NET कोर

Microsoft द्वारा शासित (कुछ) .Net का एक विंडोज / लिनक्स मल्टीप्लाय वर्जन। 'nuff ने कहा https://github.com/dotnet/core

निष्कर्ष

अब इन उपकरणों / रूपरेखाओं को आजमाकर देखना आवश्यक होगा कि इनमें कितना घर्षण है। ओपी जेवीएम के लिए सी # में लिखना चाहता है, जो वास्तव में ग्रासहॉपर का उपयोग करके काफी अच्छा काम कर सकता है।

C # और Java वर्ल्ड लाइब्रेरी को एक ही कोडबेस में मिलाने के लक्ष्य के साथ ऐसा करने से काम नहीं हो सकता है।

सूत्रों का कहना है

http://blog.pluralsight.com/new-course-making-java-and-c-work-together-jvm-and-net-clr-interop


बहुत बढ़िया जवाब! एक C # डेवलपर के रूप में जो जावा में संक्रमण होने से दुखी है (आप गुणों के बिना कैसे रह सकते हैं?), और स्काला के बारे में संदिग्ध है, यह वास्तव में विकल्पों को अच्छी तरह से देता है।
गिल्टहंस

9

यह IL से बाइटकोड तक कनवर्टर लिखने के लिए सरल हो सकता है। इस तरह आपको JVM पर किसी भी .NET भाषा के लिए स्वतः समर्थन मिल जाएगा।

हालाँकि, यह एक ऐसा स्पष्ट विचार है कि यदि यह पहले से नहीं किया गया है, तो यह शायद बहुत कठिन है, या अच्छी तरह से / उपयोगी तरीके से करना मुश्किल है।


6
आपने जिन समस्याओं को सूचीबद्ध किया है उनमें से अधिकांश में आप भाग लेंगे - विभिन्न जेनरिक आदि
जॉन स्कीट

8
यह बिल्कुल वैसा ही है जैसा कि ग्रासहॉपर करता है (ऊपर @ एलेक्स का जवाब देखें) यह वास्तव में अच्छा करने के लिए बहुत कठिन है (मैं ग्रासहॉपर पर काम करता था)।
मट्टी

7

ग्रासहॉपर को देखो । यह एक विजुअल स्टूडियो-आधारित SDK और पेटेंट .NET है जो जावा कन्वर्टर के लिए है। यह आपको .NET® और अन्य जावा-सक्षम प्लेटफॉर्म पर .NET वेब और सर्वर एप्लिकेशन चलाने में सक्षम बनाता है।


2
क्या आपके पास इसके साथ व्यावहारिक अनुभव है? यह भी ध्यान दें कि लाइसेंस मुफ्त संस्करण के लिए ड्रैकोनिक है।
थोर्बोजर्न रेवन एंडरसन

13
जिस पल आपने "पेटेंट" शब्द कहा, आपने मेरी रुचि खो दी। आह।
स्टीफन सी

2
बस कुछ खबरें: ग्रासहॉपर अब समर्थन और वारंटी के बिना (ज्यादातर ओपन-सोर्स उत्पादों की तरह) मुफ्त है
fernacolo

1
मेन्सॉफ्ट पूरी तरह से मृत प्रतीत होता है, और ग्रासहॉपर लिंक अब काम नहीं करते हैं।
डेविड

1
जाहिर है, तो सिर्फ एक शुद्ध wibble। दोनों लिंक अब काम करते हैं। दुर्भाग्य से अब मुझे याद नहीं है कि मैं ऐसा क्यों चाहता था ...
डेविड ने


1

आप JVM पर रन की तुलना में C # को भाषा में अनुवाद करने के लिए स्रोत से स्रोत संकलक का उपयोग कर सकते हैं । उदाहरण के लिए, जावा कन्वर्टर्स में कई C # हैं जो जावा में अनुवादित होने के बाद JVM पर C # एप्लिकेशन को चलाने की अनुमति देंगे।


0

यह उत्तर आपके लिए देर हो सकता है, लेकिन यह एक नया है। आप कोटलिन प्रोग्रामिंग भाषा की जांच कर सकते हैं । यह सिंटैक्टिक शक्कर प्रदान करता है जो C # के पास है और C # सिंटैक्स के सबसे करीब है, जो कि किसी भी गैर-जावा JVM भाषा के अलावा है। JetBrains से इसकी ।


0

मैं दो कारण देख सकता हूं कि यह बहुत उत्साह क्यों नहीं है।

महसूस करने वाली पहली बात यह है कि, जब भाषा की वास्तविक विशेषताओं की बात आती है, तो C # और Java बहुत करीब होते हैं। न केवल C # amd Java करीब हैं, वे समान दिशाओं में भी आगे बढ़ रहे हैं। कुछ विशेषताएं हैं जो जेवीएम वर्तमान में बॉक्स से बाहर का समर्थन नहीं करेगी, लेकिन यह वास्तविक समस्या नहीं है। आप हमेशा याद रख सकते हैं कि क्या गायब है। मुझे लगता है कि लोग स्क्रैच से लगभग जावा बनाने की तुलना में कुछ अधिक चीनी प्राप्त करने के लिए जावा की प्रतीक्षा करना पसंद करते हैं। जब तक पोर्ट तैयार हो जाता है, तब तक जावा ने पकड़ने का फैसला किया होगा।

दूसरी बात यह है कि डेवलपर्स C # को क्यों पसंद करते हैं, इसकी वजह खुद भाषा नहीं है, बल्कि इसके आस-पास के उपकरण, C # के साथ उनका दो-तरफ़ा संबंध और Microsoft किस तरह से पूरी बात का समर्थन करता है। उदाहरण के लिए, C # -XAML कॉम्बो JavaFX की तुलना में मित्रवत है, क्योंकि C # और XAML को प्रत्येक अभिभावक के लिए हैक किया गया था (जैसे C # में आंशिक कक्षाएं, XAML में बाइंडिंग और बहुत कुछ)। JavaFX पर C # का उपयोग करने से बहुत सुधार नहीं होता है। JVM पर C # अनुभव प्राप्त करने के लिए, आपको उपकरण भी पोर्ट करना होगा, और यह एक बहुत बड़ी परियोजना है। मोनो भी नहीं परेशान करेगा।

तो, एक जावा डेवलपर के लिए मेरी सलाह, जो परिचित टूल के एक कट्टर भाषा का उपयोग करना चाहता है, मौजूदा वीवीएम भाषाओं की जांच करना है

मोनो भी एक विकल्प है, लेकिन मुझे हमेशा से संदेह रहा है। भले ही यह C # - नेट और क्रॉस-प्लेटफ़ॉर्म है, Microsoft के टूल के साथ निर्मित चीजें आम तौर पर मोनो पर काम नहीं करेंगी। यह अनिवार्य रूप से अपनी चीज है। हम देखेंगे कि अब क्या होता है कि Microsoft ने कहा कि वे सहयोग करेंगे।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.