এলএলভিএম এর মাধ্যমে জাভাতে সি ++ অ্যাপ্লিকেশন থেকে কোনও বন্দর তৈরি করা কি কার্যকর?


9

এলএলভিএম (আমার ধারণা, এলএলজেভিএম) ব্যবহার করে জাভা বাইটকোডে সি ++ অ্যাপ্লিকেশনটি পোর্ট করা কতটা কার্যকর?

বিষয়টি হ'ল আমাদের বর্তমানে সি ++ তে লিখিত একটি প্রক্রিয়া রয়েছে তবে একটি নতুন ক্লায়েন্টটি জাভা ভার্চুয়াল মেশিনটি স্পষ্টত কোনও নেটিভ কোড (কোন জেএনআই) ব্যবহার করে একটি বহুমুখী পদ্ধতিতে প্রোগ্রামটি পরিচালনা করতে বাধ্যতামূলক করেছে । ধারণাটি উত্পন্ন জারটি নিতে এবং তারপরে বিভিন্ন সিস্টেমে (লিনাক্স, উইন, 32 বিট - 64 বিট) অনুলিপি করতে সক্ষম হবে এবং এটি ঠিক কাজ করা উচিত।

চারপাশে দেখে মনে হচ্ছে সিএল ++ থেকে এলএলভিএম আইআর কোড এবং তারপরে সেই কোডটি জাভা বাইটকোডে সংকলন করা সম্ভব। জেনারেটেড কোডটি পঠনযোগ্য হওয়ার দরকার নেই।

আমি এমস্ক্রিপ্টেন ব্যবহার করে অনুরূপ জিনিসগুলির সাথে কিছুটা পরীক্ষা করেছি, এটি সি ++ কোড নেয় এবং এটি জাভাস্ক্রিপ্টে সংকলন করে। ফলাফলটি বৈধ জেএস তবে সম্পূর্ণ অপঠনযোগ্য (অ্যাসেমব্লারের মতো দেখায়)।

  • কেউ কি এই টেকনিকটি ব্যবহার করে সি ++ থেকে জাভা বাইটকোড পর্যন্ত কোনও অ্যাপ্লিকেশনটির একটি বন্দর করেছেন?
  • আমরা কোন সমস্যার মুখোমুখি হতে পারি?
  • উত্পাদন কোডের জন্য একটি বৈধ পদ্ধতির?

কিছু মন্তব্য করার পরে আমার বক্তব্যটি আরও স্পষ্ট করার জন্য, বন্দরটি সম্ভবত ভালভাবে ব্যবহার করা হয়নি, ফলস্বরূপ আমি পঠনযোগ্য উত্স কোডের আশা করি না, কেবল জাভা বাইটকোড, সুতরাং এটি কোনও 'বন্দর' নয় যা এখন আর বিকাশ হবে, কেবলমাত্র টার্গেট প্লাটফর্মটি অবশ্যই জাভা জেভিএম হতে হবে নেটিভ আসামলিয়ার নয়।

দ্রষ্টব্য: আমি সচেতন যে বর্তমানে আমাদের কাছে কিছু মানহীন সি ++ এবং ঘনিষ্ঠ উত্স লাইব্রেরি রয়েছে, আমরা এই নন-স্ট্যান্ডার্ড কোড এবং সমস্ত ঘনিষ্ঠ উত্স লাইব্রেরিগুলি সরিয়ে ফ্রি ফ্রি লিবার ওপেন সোর্স সফ্টওয়্যার ব্যবহার করতে চাইছি, সুতরাং ধরুন যে সমস্ত কোড সহ স্ট্যান্ডার্ড সি ++ কোড রয়েছে সমস্ত কোড সংকলন সময়ে উপলব্ধ।

নোট 2: এটি পোর্টেবল সি ++ কোড লেখার এবং পরে এটি পছন্দসই লক্ষ্য প্ল্যাটফর্মের মধ্যে সংকলন করার বিকল্প নয়, সংকলিত প্রোগ্রামটি অবশ্যই মাল্টিপ্লাটফর্ম হতে হবে, এইভাবে জেভিএম এর ব্যবহার।

নোট 3: এখনই আমরা পাইথন বা অন্যান্য ভাষার ভিত্তিতে প্রয়োগ করা অনুরূপ সমাধানগুলি খুঁজছি না, তবে আমি এটি সম্পর্কে শুনতেও চাই। এর সাথে আমার অর্থ এই যে আমাদের টার্গেট এক্সিকিউটেবলটি অবশ্যই জাভা বাইটকোড হতে হবে তবে যদি সি ++ বৈধ পাইথন সংকলিত কোডে সংকলনের বিকল্প থাকে তবে আমি তাদের সম্পর্কেও শুনতে চাই।


পাইথন সম্পর্কে আপনার সর্বশেষ বাক্যটির অর্থ কী তা নিশ্চিত নন, তবে জাইথন ​​হুবহু এক: পাইথন ভিএম এর পরিবর্তে জেভিএম ব্যবহার করুন এবং ঠিক সেই দৃশ্যে ব্যবহার করেছেন: প্রোগ্রামাররা পাইথন ব্যবহার করতে চান, জেভিএম-তে অবশ্যই স্থাপনা থাকতে হবে।
জাভিয়ের

আমরা কোডের কতগুলি লাইনের কথা বলছি? এটি পুনরায় লেখার জন্য আপনার সময় উপযুক্ত হতে পারে, তবে এটি কোনও সহজ সিদ্ধান্ত নয়। এছাড়াও, যদি আপনার কোডটি কোনও পয়েন্টার পাটিগণিত করে তবে আমি জেনে আগ্রহী যে জেভিএম-এ কাজ করার সময় কীভাবে এটি পরিচালনা করা হয়।
লেভি মরিসন

1
ডিবাগিং যা মজাদার হওয়া উচিত O_o
ড্যানিয়েল গ্র্যাটাজার

@LeviMorrison। ওয়েল কোডটি বেশ বিস্তৃত (যোগাযোগের জন্য বিভিন্ন লাইব্রেরি নির্ভরতা, সার্বিক কার্যাদি) তবে ধারণা করা হয় যে সংকলনের সময় আমাদের কাছে সমস্ত কোড রয়েছে available এবং যদি অন্য ক্লায়েন্টের এটির প্রয়োজন না হয় তবে আমরা এখনও দেশীয় বাইনারি তৈরি করব।
জাভিয়ের মিস্টার

@jozefg। পয়েন্টার আর্টমেটিক্স এবং ডিবাগিং উদ্দেশ্য সম্পর্কে আমি ডিবাজিযোগ্য হওয়ার আশা করি না। উদাহরণস্বরূপ ইমস্প্রিপ্টন একই জিনিসটি করে তবে লক্ষ্য ভাষাটি জাভাস্ক্রিপ্ট, আপনি কেবলমাত্র একটি বড় বাইট অ্যারের সাথে শেষ করেন প্রোগ্রামের কাউন্টারের জন্য হিপ এবং বিট ওয়াইজ অপারেশন হিসাবে এবং কেবল অপারেশনগুলি কোনও বাইটস, স্ট্রিং বা এর মতো জিনিস নয়। আমি আশা করি জাভা বাইটকোডের অসম্বেলেয়ের অনুরূপ ফলাফলটি এটি ডিবাগযোগ্য নয় বলে ধরে নেওয়া যেতে পারে।
জাভিয়ের মিস্টার

উত্তর:


11

আমি সত্যিই সন্দেহ এই কাজ করবে। আপনি আপনার কোডটি জাভা বাইট কোডে অনুবাদ করতে সক্ষম হতে পারেন তবে এটি জাভা রানটাইম এবং লাইব্রেরিগুলিতে লাইব্রেরি কলগুলি সমান কলগুলিতে অনুবাদ করবে না। সমতুল্য জাভা রানটাইম কলগুলিও নাও থাকতে পারে! এমনকি যদি আপনি সমস্ত মালিকানাধীন লাইব্রেরিগুলি মুছে ফেলেন তবে আপনি এখনও সি ++ স্ট্যান্ডার্ড লাইব্রেরির সাথে রয়েছেন।

এই কংক্রিটটি তৈরি করতে: আপনার সি ++ প্রোগ্রামে fprintf () এ কল থাকতে পারে। এই ফাংশনটি সি স্ট্যান্ডার্ড লাইব্রেরিতে প্রয়োগ করা হয়েছে এবং এটি সি ++ প্রোগ্রামের কল করার জন্য এটি পুরোপুরি বৈধ। এলএলভিএম থেকে এলএলজেভিএম অনুবাদক সম্ভবত জাভা রান টাইম কলগুলির ক্রমটি জাগ্রত করতে যাচ্ছেন না যা এফপ্রিন্টফ () এর সমপরিমাণ ফলাফল তৈরি করে এবং তাদের বিকল্পগুলিকে প্রতিস্থাপন করে that এই সুবিধাটি সরবরাহ করার জন্য জাভাতে সি এবং সি ++ রানটাইমগুলি পুনরায় সংশোধন করা প্রয়োজন বাইট কোড

আছে কিছু টুলস যে সি ++ জাভা অনুবাদটি সঞ্চালন কিন্তু তারা শুধুমাত্র সহজ রানটাইম লাইব্রেরি কল একটি থাবা রূপান্তর করুন। বাকিগুলি আপনি খুঁজে বের করতে বাকি আছে।


আমি আপনার বক্তব্যটি দেখতে পাচ্ছি, তবে যতদূর আমি বুঝতে পারি ইমস্প্রিপ্টান লক্ষ্যটি জাভাস্ক্রিপ্টের সাথে একই রকম কাজ করে, যদি আমি ভুল বুঝে না থাকি তবে আপনি কী নির্দেশ করেছেন তা এড়াতে এমস স্ক্রিপ্টন একটি কাস্টম স্ট্যান্ডার্ড লাইব্রেরি সরবরাহ করে (এবং এসডিএল লাইব্রেরির মাধ্যমে ওয়েবজিএল-এর জন্য ম্যাপিংও করে) )। তবে আমি জাভার সমতুল্য খুঁজে পাচ্ছি না (এলএলজেভিএম পরিত্যক্ত বলে মনে হচ্ছে)। আমি এলএলভিএম বাইটকোডকে প্ল্যাটফর্মের স্বতন্ত্র বিল্ড হিসাবে প্রস্তাব করার কথা ভাবছি (অবশ্যই প্ল্যাটফর্মের উপর নির্ভর করে কোনও সংকলন শাখা নেই, এপিআই বা ডেটা দ্বারা; ব্যবহার aprবা অনুরূপ)
জাভিয়ের মিঃ

3
lljvm একটি সি রানটাইম লাইব্রেরি সরবরাহ করে, আংশিক সি হিসাবে জেভিএম বাইটকোডে সংকলিত, এবং আংশিকভাবে জাভা ক্লাস হিসাবে। এটি একটি সুন্দর সম্পূর্ণ libc। আপনাকে libstdc ++ এর সমতুল্য তৈরি করতে হবে। এছাড়াও lljvm ব্যাকএন্ডটি যাইহোক এই মুহূর্তে আসলে সি ++ সমর্থন করে না। আমি lljvm আরও সাম্প্রতিক llvm বিল্ডের সাথে কাজ করার চেষ্টা করেছি। Llvm APIs এবং সরঞ্জামগুলি রিলিজের মধ্যে এতটুকু পরিবর্তন করে চলেছে তাই এটি ধীরে ধীরে চলছে। আপনি এখানে পাশাপাশি অনুসরণ করতে পারেন, এটি এখন প্রায় ব্যবহারযোগ্য আকারে। github.com/hyc/lljvm/tree/llvm3.3
hyc
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.