क्या LLVM के माध्यम से जावा में C ++ एप्लिकेशन से पोर्ट बनाना व्यवहार्य है


9

कितनी अच्छी तरह से एलएलवीएम (मुझे लगता है कि एलएलजेवीएम) का उपयोग करके जावा बाइटकोड में सी ++ एप्लिकेशन को पोर्ट करना कितना व्यवहार्य है?

बात यह है कि वर्तमान में हमारे पास C ++ में लिखी एक प्रक्रिया है, लेकिन एक नए क्लाइंट ने प्रोग्राम को एक मल्टीप्लेयर तरीके से चलाने में सक्षम बनाया है, जावा वर्चुअल मशीन का उपयोग करते हुए स्पष्ट रूप से कोई मूल कोड (कोई जेएनआई) नहीं है। विचार उत्पन्न जार को लेने और फिर अलग-अलग सिस्टम (लिनक्स, विन, 32 बिट्स - 64 बिट्स) में कॉपी करने में सक्षम होने के लिए है और यह सिर्फ काम करना चाहिए।

चारों ओर देखने से ऐसा लगता है कि C ++ से LLVM IR कोड और फिर उस कोड को java bytecode पर संकलन करना संभव है। पठनीय होने के लिए उत्पन्न कोड की कोई आवश्यकता नहीं है।

मैंने emscripten का उपयोग करके समान चीजों के साथ थोड़ा परीक्षण किया है, यह C ++ कोड लेता है और इसे जावास्क्रिप्ट में संकलित करता है। परिणाम मान्य जेएस लेकिन पूरी तरह से अपठनीय है (हमलावर की तरह दिखता है)।

  • क्या किसी ने इस tecnique का उपयोग करके C ++ से Java bytecode तक के एप्लिकेशन का पोर्ट किया है?
  • हम किन समस्याओं का सामना कर सकते हैं?
  • उत्पादन कोड के लिए एक वैध दृष्टिकोण है?

कुछ टिप्पणियों के बाद अपनी बात को और अधिक स्पष्ट करने के लिए, शायद पोर्ट का अच्छी तरह से उपयोग नहीं किया गया है, मुझे परिणामस्वरूप पठनीय स्रोत कोड की उम्मीद नहीं है, बस जावा बाइटकोड, इसलिए यह एक 'पोर्ट' नहीं है जिसे अब और विकसित किया जाएगा, बस लक्ष्य प्लैटफॉर्म में जेएवी जेएमएम होना चाहिए न कि देशी अस्सम्बल।

नोट: मुझे पता है कि वर्तमान में हमारे पास कुछ गैर मानक C ++ और करीबी स्रोत पुस्तकालय हैं, हम इस गैर मानक कोड और सभी करीबी स्रोत पुस्तकालयों को हटा रहे हैं और Free Libre Open Source Software का उपयोग कर रहे हैं, इसलिए मान लें कि सभी कोड मानक C ++ कोड के साथ हैं। सभी कोड संकलन समय पर उपलब्ध हैं।

नोट 2: यह पोर्टेबल सी ++ कोड लिखने का विकल्प नहीं है और फिर इसे वांछित लक्ष्य प्लेटफ़ॉर्म पर संकलित करें, संकलित कार्यक्रम को मल्टीप्लेयर होना चाहिए, इस प्रकार जेवीएम का उपयोग।

नोट 3: अभी हम पायथन या अन्य भाषा के आधार पर लागू समान समाधानों में नहीं दिख रहे हैं, लेकिन मैं इसके बारे में भी सुनना चाहूंगा। इसके साथ मेरा मतलब है कि हमारा लक्ष्य निष्पादन योग्य जावा बाइटकोड होना चाहिए लेकिन अगर सी ++ को वैध अजगर संकलित कोड को संकलित करने के विकल्प हैं तो मैं उनके बारे में भी सुनना चाहूंगा।


निश्चित नहीं है कि आप पायथन के बारे में अंतिम वाक्य पर क्या कहते हैं, लेकिन ज्योनट बिल्कुल वैसा ही है: पायथन वीएम के बजाय जेवीएम का उपयोग करें, और बिल्कुल उसी परिदृश्य में उपयोग किया जाता है: प्रोग्रामर पायथन का उपयोग करना चाहते हैं, तैनाती जेवीएम के साथ होनी चाहिए।
जेवियर

हम कोड की कितनी लाइनों के बारे में बात कर रहे हैं? इसे फिर से लिखने के लिए आपका समय हो सकता है, लेकिन यह कोई सरल निर्णय नहीं है। इसके अलावा, यदि आपका कोड कोई सूचक अंकगणित करता है तो मुझे यह जानने की उत्सुकता होगी कि जेवीएम पर काम करते समय यह कैसे संभाला जाता है।
लेवी मॉरिसन

1
डिबगिंग जो कि मजेदार होनी चाहिए O_o
डैनियल ग्रैज़र

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

@jozefg। सूचक अंकगणित और डीबगिंग के बारे में बताया कि मुझे डीबग करने की उम्मीद नहीं है। उदाहरण के लिए Emscripten एक ही काम करता है लेकिन लक्ष्य भाषा जावास्क्रिप्ट है, आप प्रोग्राम काउंटर के लिए ढेर और बिट वार ऑपरेशन के रूप में सिर्फ एक बड़ी बाइट सरणी के साथ समाप्त करते हैं और बस बाइट्स के साथ संचालन होता है कोई वस्तु, तार या चीज नहीं है। मुझे उम्मीद है कि परिणाम जैवा बायटेकोड में असेंबलर के समान होगा, यह माना जा सकता है कि यह डीबग करने योग्य नहीं है।
जेवियर श्री

जवाबों:


11

मुझे वास्तव में संदेह है कि यह काम करेगा। आप अपने कोड को जावा बाइट कोड में अनुवाद करने में सक्षम हो सकते हैं, लेकिन यह जावा कॉलटाइम और लाइब्रेरी के समकक्ष कॉल में लाइब्रेरी कॉल का जादुई अनुवाद नहीं करेगा। जावा रनटाइम कॉल के बराबर भी नहीं हो सकता है! यहां तक ​​कि अगर आप सभी मालिकाना पुस्तकालयों को खत्म करते हैं, तो भी आप C ++ मानक पुस्तकालय के साथ छोड़ दिए जाते हैं।

इसे ठोस बनाने के लिए: आपके C ++ प्रोग्राम में fprintf () हो सकता है। यह फ़ंक्शन C मानक लाइब्रेरी में लागू किया गया है और इसे कॉल करने के लिए C ++ प्रोग्राम के लिए पूरी तरह से वैध है। LLVM से LLJVM अनुवादक संभवतः जावा रन टाइम कॉल के अनुक्रम का जादुई रूप से पता लगाने नहीं जा रहा है जो कि fprintf () के बराबर परिणाम देगा और उन लोगों को स्थानापन्न करेगा। यह सुविधा प्रदान करने के लिए अनिवार्य रूप से जावा में C और C ++ रनटाइम को फिर से लागू करना होगा। बाइट कोड।

हैं कुछ उपकरण है कि सी ++ जावा अनुवाद करने के लिए प्रदर्शन लेकिन वे केवल सरल क्रम पुस्तकालय कॉल के एक मुट्ठी भर कन्वर्ट। बाकी आपको पता लगाने के लिए छोड़ दिया जाता है।


मैं आपकी बात देखता हूं, लेकिन जहां तक ​​मैं समझता हूं कि ईस्मैप्टेन जावास्क्रिप्ट के लक्ष्य के साथ कुछ ऐसा ही करता है, अगर मैंने गलत तरीके से ईस्मिप्टेन को गलत मानक लाइब्रेरी के साथ प्रदान नहीं किया है, तो इससे बचने के लिए आपने एसडीएल लाइब्रेरी के माध्यम से वेबलॉग के लिए और यहां तक ​​कि मैपिंग के बारे में भी बताया है। )। लेकिन मुझे जावा (LLJVM परित्यक्त लगता है) के बराबर नहीं मिल रहा है। मैं llvm बाईटेकोड को एक प्लेटफ़ॉर्म स्वतंत्र निर्माण के रूप में प्रस्तावित करने के बारे में सोच रहा हूं (बेशक, प्लेटफॉर्म के आधार पर एपीआई या डेटा के आधार पर, उपयोग aprया समान)
जेवियर श्री

3
lljvm एक C रनटाइम लाइब्रेरी प्रदान करता है, आंशिक रूप से JVM बायटेकोड को C संकलित करता है, और आंशिक रूप से जावा कक्षाओं के रूप में। यह एक बहुत ही पूर्ण परिवाद है। आपको libstdc ++ के लिए समकक्ष बनाने की आवश्यकता होगी। इसके अलावा lljvm बैकएंड वास्तव में वैसे भी C ++ का समर्थन नहीं करता है। मैं lljvm को ठीक करने की कोशिश कर रहा हूं ताकि अधिक हालिया llvm बिल्ड के साथ काम कर सकूं। यह धीमी गति से चल रहा है क्योंकि llvm एपीआई और टूल रिलीज के बीच बहुत कुछ बदलते रहते हैं। आप यहाँ का अनुसरण कर सकते हैं, यह अब प्रयोग करने योग्य आकार में है। github.com/hyc/lljvm/tree/llvm3.3
hyc
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.