Tracing just-in-time compilation
জাস্ট-ইন-টাইম কম্পাইলেশন ট্রেসিং হল একটি কৌশল যা ভার্চ্যুয়াল মেশিন দ্বারা রানটাইমে একটি প্রোগ্রামের এক্সিকিউশন অপ্টিমাইজ করতে ব্যবহৃত হয়। এটি ঘন ঘন সম্পাদিত ক্রিয়াকলাপগুলির একটি রৈখিক ক্রম রেকর্ড করে, সেগুলিকে নেটিভ মেশিন কোডে সংকলন করে এবং সেগুলি কার্যকর করে করা হয়। এটি ঐতিহ্যবাহী জাস্ট-ইন-টাইম (জে. আই. টি) সংকলকগুলির বিরোধিতা করে যা প্রতি-পদ্ধতির ভিত্তিতে কাজ করে। জাস্ট-ইন-টাইম সংকলন হল রানটাইমে মেশিন কোডে একটি প্রোগ্রামের অংশগুলি সংকলন করে প্রোগ্রামগুলির কার্যকর করার গতি বাড়ানোর একটি কৌশল। বিভিন্ন জে. আই. টি সংকলককে শ্রেণীবদ্ধ করার একটি উপায় হল তাদের সংকলনের সুযোগ। যেখানে পদ্ধতি-ভিত্তিক জে. আই. টি কম্পাইলারগুলি একবারে একটি পদ্ধতি মেশিন কোডে অনুবাদ করে, জে. আই. টি ট্রেসিংগুলি তাদের সংকলনের একক হিসাবে ঘন ঘন এক্সিকিউট করা লুপ ব্যবহার করে। জে. আই. টি-গুলির সন্ধান এই অনুমানের উপর ভিত্তি করে করা হয় যে প্রোগ্রামগুলি তাদের বেশিরভাগ সময় প্রোগ্রামের কিছু লুপে ("হট লুপ") ব্যয় করে এবং পরবর্তী লুপের পুনরাবৃত্তিগুলি প্রায়শই একই পথ নেয়। যে ভার্চ্যুয়াল মেশিনগুলিতে ট্রেসিং জেআইটি থাকে সেগুলি প্রায়শই মিশ্র-মোড এক্সিকিউশন পরিবেশ হয়, যার অর্থ তাদের ট্রেসিং জেআইটি ছাড়াও একটি দোভাষী বা একটি পদ্ধতি সংকলক রয়েছে। প্রযুক্তিগত বিবরণ একটি ট্রেসিং জে. আই. টি কম্পাইলার রানটাইমে বিভিন্ন পর্যায়ের মধ্য দিয়ে যায়। প্রথমে, লুপগুলির জন্য প্রোফাইলিং তথ্য সংগ্রহ করা হয়। একটি হট লুপ চিহ্নিত হওয়ার পরে, একটি বিশেষ ট্রেসিং পর্যায় প্রবেশ করা হয়, যা সেই লুপের সমস্ত সম্পাদিত ক্রিয়াকলাপ রেকর্ড করে। ক্রিয়াকলাপের এই ক্রমকে ট্রেস বলা হয়। ট্রেস তারপর অপ্টিমাইজ করা হয় এবং মেশিন কোড (ট্রেস) কম্পাইল করা হয়। যখন এই লুপটি আবার কার্যকর করা হয়, তখন সংকলিত ট্রেসকে প্রোগ্রাম প্রতিরূপের পরিবর্তে বলা হয়। এই পদক্ষেপগুলি নিম্নে বিস্তারিতভাবে ব্যাখ্যা করা হয়েছেঃ প্রোফাইলিং পর্যায় প্রোফাইলিংয়ের লক্ষ্য হল হট লুপগুলি চিহ্নিত করা। এটি প্রায়শই প্রতিটি লুপের জন্য পুনরাবৃত্তির সংখ্যা গণনা করে করা হয়। একটি লুপের গণনা একটি নির্দিষ্ট সীমা অতিক্রম করার পরে, লুপটি গরম বলে মনে করা হয় এবং ট্রেসিং পর্যায় প্রবেশ করা হয়। ট্রেসিং পর্যায়ে লুপের এক্সিকিউশন স্বাভাবিকভাবে এগিয়ে যায়, তবে উপরন্তু প্রতিটি এক্সিকিউটেড অপারেশন একটি ট্রেসে রেকর্ড করা হয়। রেকর্ড করা ক্রিয়াকলাপগুলি সাধারণত ট্রেস ট্রি-তে সংরক্ষণ করা হয়, প্রায়শই একটি মধ্যবর্তী উপস্থাপনায় (আইআর)। ট্রেসিং ফাংশন কলগুলি অনুসরণ করে, যা তাদের ট্রেসে ইনলাইন করার দিকে পরিচালিত করে। লুপটি শেষ না হওয়া পর্যন্ত ট্রেসিং চলতে থাকে এবং শুরুতে ফিরে আসে। যেহেতু লুপের একটি কংক্রিট এক্সিকিউশন পথ অনুসরণ করে ট্রেস রেকর্ড করা হয়, তাই সেই ট্রেসের পরবর্তী এক্সিকিউশনগুলি সেই পথ থেকে বিচ্ছিন্ন হতে পারে। যে জায়গাগুলিতে এটি ঘটতে পারে তা সনাক্ত করতে, বিশেষ গার্ড নির্দেশাবলী ট্রেসে ঢোকানো হয়। এই ধরনের জায়গার একটি উদাহরণ হল যদি বিবৃতি। মূল শর্তটি এখনও সত্য কিনা তা নির্ধারণের জন্য গার্ড একটি দ্রুত পরীক্ষা। যদি কোনও গার্ড ব্যর্থ হয়, তবে ট্রেসের কার্যকরকরণ বাতিল করা হয়। যেহেতু কার্যকর করার সময় ট্রেসিং করা হয়, তাই ট্রেসটি রানটাইম তথ্য ধারণ করতে পারে (যেমন। তথ্য টাইপ করুন)। এই তথ্যটি পরে কোড দক্ষতা বাড়ানোর জন্য অপ্টিমাইজেশান পর্যায়ে ব্যবহার করা যেতে পারে। অপ্টিমাইজেশন এবং কোড-জেনারেশন ফেজ ট্রেসগুলি অপ্টিমাইজ করা সহজ, কারণ তারা শুধুমাত্র একটি কার্যকর পথের প্রতিনিধিত্ব করে, যার অর্থ কোনও নিয়ন্ত্রণ প্রবাহ বিদ্যমান নেই এবং কোনও পরিচালনার প্রয়োজন নেই। সাধারণ অপ্টিমাইজেশনের মধ্যে রয়েছে কনস্ট্যান্ট-সাব-এক্সপ্রেশন নির্মূল, ডেড কোড নির্মূল, রেজিস্টার বরাদ্দ, অপরিবর্তনীয়-কোড গতি, কনস্ট্যান্ট ভাঁজ এবং এস্কেপ বিশ্লেষণ। অপ্টিমাইজেশনের পরে, ট্রেসটি মেশিন কোডে পরিণত হয়। একইভাবে অপ্টিমাইজেশনের ক্ষেত্রে, ট্রেসের রৈখিক প্রকৃতির কারণে এটি সহজ। এক্সিকিউশন ট্রেস মেশিন কোডে সংকলিত হওয়ার পরে, এটি লুপের পরবর্তী পুনরাবৃত্তিতে কার্যকর করা যেতে পারে। একজন রক্ষী ব্যর্থ না হওয়া পর্যন্ত ট্রেস এক্সিকিউশন চলতে থাকে। ইতিহাস যেখানে জে. আই. টি-র ধারণাটি 1960-এর দশকে ফিরে আসে, জে. আই. টি-র সন্ধান সম্প্রতি আরও বেশি ব্যবহৃত হয়েছে। 1970 সালে জে. আই. টি-গুলির সন্ধানের আজকের ধারণার অনুরূপ একটি ধারণার প্রথম উল্লেখ করা হয়েছিল। এটি লক্ষ্য করা গেছে যে সংকলিত কোডটি কেবল ব্যাখ্যার সময় সম্পাদিত ক্রিয়াগুলি সংরক্ষণ করে রান-টাইমে একজন দোভাষী থেকে উদ্ভূত করা যেতে পারে। ট্রেসিং-এর প্রথম বাস্তবায়ন হল ডায়নামো, "একটি সফ্টওয়্যার ডাইনামিক অপ্টিমাইজেশন সিস্টেম যা প্রসেসরে কার্যকর হওয়ার সাথে সাথে একটি নেটিভ ইন্সট্রাকশন স্ট্রিমের কার্যকারিতা স্বচ্ছভাবে উন্নত করতে সক্ষম"। এটি করার জন্য, স্থানীয় নির্দেশ প্রবাহকে ব্যাখ্যা করা হয় যতক্ষণ না একটি "হট" নির্দেশের ক্রম পাওয়া যায়। এই ক্রমের জন্য একটি অনুকূলিত সংস্করণ তৈরি করা হয়, ক্যাশে করা হয় এবং কার্যকর করা হয়। ডায়নামো পরে ডায়নামোআরআইওতে প্রসারিত হয়েছিল। একটি ডায়নামোরিও-ভিত্তিক প্রকল্প ছিল দোভাষী নির্মাণের জন্য একটি কাঠামো যা ট্রেসিং এবং আংশিক মূল্যায়নের সংমিশ্রণ ঘটায়। এটি "ভাষা বাস্তবায়ন থেকে গতিশীলভাবে দোভাষী ওভারহেড অপসারণ করতে" ব্যবহৃত হত। 2006 সালে, হটপাথভিএম, একটি উচ্চ-স্তরের ভাষার জন্য প্রথম ট্রেসিং জেআইটি সংকলক তৈরি করা হয়েছিল। এই ভিএম গতিশীলভাবে প্রায়শই সম্পাদিত বাইটকোড নির্দেশাবলী সনাক্ত করতে সক্ষম ছিল, যা সনাক্ত করা হয় এবং তারপর স্ট্যাটিক সিঙ্গেল অ্যাসাইনমেন্ট (এসএসএ) নির্মাণ ব্যবহার করে মেশিন কোডে সংকলিত হয়। হটপাথ ভিএম-এর অনুপ্রেরণা ছিল সম্পদ সীমাবদ্ধ মোবাইল ডিভাইসের জন্য একটি দক্ষ জেভিএম থাকা। ট্রেসিং জেআইটির আরেকটি উদাহরণ হল ট্রেসমঙ্কি, যা ফায়ারফক্সের (2009) জন্য মোজিলার জাভাস্ক্রিপ্ট বাস্তবায়নের মধ্যে একটি। ট্রেসমঙ্কি রান-টাইমে গতিশীল ভাষা জাভাস্ক্রিপ্টে ঘন ঘন এক্সিকিউট করা লুপ ট্রেস সংকলন করে এবং প্রতিটি পথে ঘটে যাওয়া প্রকৃত গতিশীল প্রকারের জন্য উত্পন্ন কোডকে বিশেষজ্ঞ করে। আরেকটি প্রকল্প যা জেআইটি ট্রেসিং ব্যবহার করে তা হল পাইপাই। এটি পাইপির অনুবাদ টুলচেইনের সাহায্যে লিখিত ভাষা বাস্তবায়নের জন্য ট্রেসিং জেআইটি ব্যবহার করতে সক্ষম করে, এইভাবে সেই দোভাষী ব্যবহার করে কার্যকর করা যে কোনও প্রোগ্রামের কার্যকারিতা উন্নত করে। দোভাষী দ্বারা সম্পাদিত প্রোগ্রামের পরিবর্তে দোভাষীকেই খুঁজে বের করে এটি সম্ভব। মাইক্রোসফ্ট তাদের কমন ইন্টারমিডিয়েট ল্যাঙ্গুয়েজ (সিআইএল)-এর জন্য এস. পি. ইউ. আর প্রকল্পে ট্রেসিং জে. আই. টিগুলিও অন্বেষণ করেছে। এস. পি. ইউ. আর হল সি. আই. এল-এর জন্য একটি সাধারণ ট্রেসার, যা জাভাস্ক্রিপ্ট বাস্তবায়নের মাধ্যমেও ট্রেস করতে ব্যবহার করা যেতে পারে। একটি ট্রেসের উদাহরণ নিম্নলিখিত পাইথন প্রোগ্রামটি বিবেচনা করুন যা ধারাবাহিক পূর্ণ সংখ্যার বর্গের সমষ্টি গণনা করে যতক্ষণ না সেই যোগফল 100000 অতিক্রম করেঃ ডিফ বর্গ (x): রিটার্ন x * x i = 0 y = 0 যখন সত্যঃ y + = বর্গ (i) যদি y> 100000: ব্রেক i = i + 1 এই প্রোগ্রামের জন্য একটি ট্রেস দেখতে এরকম কিছু হতে পারেঃ লুপস্টার্ট (i1, y1) i2 = int _ mul (i1, i1) #x * x y2 = int _ add (y1, i2) #y + = i * i b1 = int _ gt (y2,100000) গার্ড _ ফলস (b1) i3 = int _ add (i1 আরও দেখুন কোড প্রজন্মের ডালভিক হটস্পট ইন্টারপ্রেটার প্রোফাইল-গাইডেড অপ্টিমাইজেশন আরপিইথন শব্দার্থ অভিধান এনকোডিং রেফারেন্স বাহ্যিক লিঙ্ক লুয়াজিট কম্পাইলার নির্মাণের অফিসিয়াল ওয়েবসাইট সফ্টওয়্যার অপ্টিমাইজেশন পাইথন (প্রোগ্রামিং ভাষা) কোড সহ নিবন্ধ