জাভা এওটি সংকলকরা কীভাবে কাজ করে?


18

সেখানে কয়েকটি সংখ্যক সরঞ্জাম রয়েছে ( এক্সেলসিয়র জেট , ইত্যাদি) যা জাভা অ্যাপ্লিকেশনকে দেশীয় এক্সিকিউটেবলগুলিতে রূপান্তরিত করার দাবি করে ( *.exe)। তবে এটি আমার বোধগম্য যে এই সরঞ্জামগুলি কেবলমাত্র দেশীয় মোড়ক তৈরি করে যা javaশেল বা কমান্ড-লাইন থেকে ডাকে / চালিত করে ।

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

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

তাই আমি জিজ্ঞাসা: কিভাবে এই সরঞ্জামগুলি না আসলে একটি নেটিভ এক্সিকিউটেবল মধ্যে Java শ্রেণি ফাইল "রুপান্তর" বা, তারা কি?

উত্তর:


26

সমস্ত প্রোগ্রাম একটি রানটাইম পরিবেশ আছে। আমরা এটি ভুলে ঝোঁক, কিন্তু এটি আছে। সি এর জন্য স্ট্যান্ডার্ড লাইব যা অপারেটিং সিস্টেমে সিস্টেম কল করে। অবজেক্টিভ-সি এর রানটাইম রয়েছে যা এর সমস্ত বার্তা কেটে যায়।

জাভা সহ, রানটাইমটি হল জেভিএম। লোকেদের সাথে পরিচিত বেশিরভাগ জাভা বাস্তবায়ন হটস্পট জেভিএম এর অনুরূপ যা বাইট কোড দোভাষী এবং জেআইটি সংকলক।

এটি একমাত্র বাস্তবায়ন হতে হবে না। জাভাটির জন্য আপনি কোনও স্ট্যান্ডার্ড লিব-এস্কি রানটাইম তৈরি করতে পারবেন না এবং দেশীয় মেশিন কোডে কোডটি সংকলন করতে পারবেন এবং রানটাইমটির মধ্যে মেশিনের নতুন কলগুলিতে মলোকগুলিতে এবং ফাইলগুলিতে মেশিনে ফাইল অ্যাক্সেসের জন্য ফাইল অ্যাক্সেসের জন্য কল করতে পারবেন না বলে কিছু নেই nothing এবং ঠিক আগে সময় (জোটের চেয়ে এওটি) সংকলকটি কী করে। যে রানটাইম কি ... আপনি এটি একটি জেভিএম বাস্তবায়ন বলতে পেরেছিলাম অনুমতি (এবং না জেভিএম স্পেসিফিকেশন অনুসরণ) বা একটি রানটাইম এনভায়রনমেন্ট বা জাভা জন্য মান lib। এটি সেখানে এবং এটি মূলত একই জিনিসটি করে।

এটি হয় javacদেশীয় মেশিনকে টার্গেট করার জন্য সংশোধন করেই করা যেতে পারে (এটাই জিসিজে কী করেছে)। অথবা এটি javacঅন্য মেশিনের জন্য মেশিন (বা বাইট) কোড দ্বারা উত্পাদিত বাইট কোডটি অনুবাদ করে করা যেতে পারে - এটাই অ্যান্ড্রয়েড যা করে। উইকিপিডিয়া ভিত্তিক যা এক্সেলসিয়র জেইটিও খুব বেশি করে ("সংকলকটি পোর্টেবল জাভা বাইট কোডকে কাঙ্ক্ষিত হার্ডওয়্যার এবং অপারেটিং সিস্টেমের জন্য অপ্টিমাইজড এক্সিকিউটেবলগুলিতে রূপান্তরিত করে") এবং রোবওভিএমের ক্ষেত্রেও এটি সত্য ।

জাভাতে অতিরিক্ত জটিলতা রয়েছে যার অর্থ একচেটিয়া পদ্ধতির হিসাবে এটি করা খুব কঠিন। ক্লাস ( class.forName()) বা প্রক্সিযুক্ত বস্তুর ডায়নামিক লোডিংয়ের জন্য ডোনামিক্স প্রয়োজন যা এওটি সংকলকগুলি সহজেই সরবরাহ করে না এবং তাই তাদের নিজ নিজ জেভিএমগুলিকে অবশ্যই একটি জেআইটি সংকলক (এক্সেলসিয়র জেইটি) বা কোনও ইন্টারপ্রেটার (জিসিজে) অন্তর্ভুক্ত করতে হবে যাতে ক্লাসগুলি পরিচালনা করা যায় না। স্থানীয়.

মনে রাখবেন, জেভিএম একটি সুনির্দিষ্ট বিবরণ , অনেক বাস্তবায়নের সঙ্গে । সি স্ট্যান্ডার্ড লাইব্রেরি এছাড়াও বিভিন্ন বিভিন্ন বাস্তবায়ন সঙ্গে একটি স্পেসিফিকেশন

জাভা 8 এর সাথে, এওটি সংকলনে মোটামুটি কাজ করা হয়েছে। সর্বোপরি, কেবল পাঠ্যবক্সের সীমানার মধ্যেই কেবল সাধারণভাবে AOT এর সংক্ষিপ্তসার করা যায়। তবে, 2015 সালের জেভিএম ভাষা সম্মেলনে (আগস্টের 2015) একটি উপস্থাপনা ছিল: জাভা গো এওটি (ইউটিউব ভিডিও)। এই ভিডিওটি 40 মিনিটের দীর্ঘ এবং অনেকগুলি গভীর প্রযুক্তিগত দিক এবং পারফরম্যান্সের মানদণ্ডের মধ্যে যায়।


দুঃখিত, আমি এ সম্পর্কে খুব বেশি কিছু জানি না, তবে এর অর্থ কি জাভা এখন স্থানীয়? বা এর অর্থ কি এটির একটি নতুন সংকলক পতাকা রয়েছে যা আমাদের চাইলে জাভা প্রোগ্রামগুলি দেশীয় কোডগুলিতে সংকলন করতে দেয় এবং আমাদের কাছে এখনও বাইট কোডটি সংকলনের বিকল্প রয়েছে?
পাভেল

@ পলপল ১০767676 আমি যুক্ত ভিডিওটি দেখার পরামর্শ দিচ্ছি। আমি যুক্তিসঙ্গত কোনও মন্তব্যে ফিট করতে পারি তার চেয়ে এতে আরও কিছুটা রয়েছে।

4

gcj ন্যূনতম চলমান উদাহরণ

আপনি ওপেন সোর্স বাস্তবায়ন যেমন gcj(এখন অপ্রচলিত) পর্যবেক্ষণ করতে পারেন । যেমন জাভা ফাইল:

public class Main {
    public static void main(String args[]) {
        System.out.println("hello world");
    }
}

তারপরে সংকলন এবং চালনা করুন:

gcj -c Main.java
gcj --main=Main -o Main Main.o
./Main

এখন আপনি এটি নিষ্প্রভ করতে এবং এটি কীভাবে কাজ করে তা নির্দ্বিধায়।

file Main.o এটি একটি এলফ ফাইল বলে।

readelf -d Main | grep NEEDED এটি গতিশীল লাইব্রেরিগুলির উপর নির্ভর করে বলে:

0x0000000000000001 (NEEDED)             Shared library: [libgcj.so.14]
0x0000000000000001 (NEEDED)             Shared library: [libc.so.6]

সুতরাং জাভা কার্যকারিতা বাস্তবায়িত হয় যেখানে libgcj.so অবশ্যই হওয়া উচিত।

তারপরে আপনি এটিটি দিয়ে এটির সংশ্লেষ করতে পারেন:

objdump -Cdr Main.o

এবং ঠিক কীভাবে এটি প্রয়োগ করা হয় তা দেখুন।

দেখতে অনেকটা সি ++, প্রচুর নাম ম্যাংলিং এবং পরোক্ষ পলিমারফিক ফাংশন কলগুলির মতো।

আমি ভাবছি কিভাবে গার্বেজ কালেকশন কিক এটা মধ্যে খুঁজছেন মূল্য হবে। Https://stackoverflow.com/questions/7100776/garbage-collection-implementation-in-compiled-languages এবং যান মত জিসি সঙ্গে অন্যান্য ভাষায়।

উবুন্টু 14.04, জিসিসি 4.8.4 এ পরীক্ষিত।

এছাড়াও https://en.wikedia.org/wiki/Android_Runtime এ দেখুন , অ্যান্ড্রয়েড 5 এর পিছনের অংশ, যা অ্যান্ড্রয়েড অ্যাপ্লিকেশনগুলি অনুকূল করতে পুরো AOT করে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.