Tracing just-in-time compilation
جسٹ ان ٹائم تالیف کا سراغ لگانا ایک ایسی تکنیک ہے جو ورچوئل مشینوں کے ذریعہ رن ٹائم پر کسی پروگرام کے نفاذ کو بہتر بنانے کے لیے استعمال کی جاتی ہے۔ یہ اکثر انجام دی جانے والی کارروائیوں کی لکیری ترتیب کو ریکارڈ کرکے، انہیں مقامی مشین کوڈ میں مرتب کرکے اور ان پر عمل درآمد کرکے کیا جاتا ہے۔ یہ روایتی جسٹ ان ٹائم (جے آئی ٹی) مرتب کرنے والوں کے خلاف ہے جو فی طریقہ کی بنیاد پر کام کرتے ہیں۔ جسٹ ان ٹائم تالیف رن ٹائم پر مشین کوڈ میں پروگرام کے حصوں کو مرتب کرکے پروگراموں کی عمل درآمد کی رفتار کو بڑھانے کی ایک تکنیک ہے۔ مختلف جے آئی ٹی مرتب کرنے والوں کی درجہ بندی کرنے کا ایک طریقہ ان کی تالیف کے دائرہ کار سے ہے۔ جبکہ طریقہ کار پر مبنی جے آئی ٹی مرتب ایک وقت میں ایک طریقہ کو مشین کوڈ میں ترجمہ کرتے ہیں، جے آئی ٹی کا سراغ لگانے کے لیے اکثر انجام دیے جانے والے لوپس کو ان کی تالیف کی اکائی کے طور پر استعمال کیا جاتا ہے۔ جے آئی ٹیز کا سراغ لگانا ان مفروضوں پر مبنی ہے کہ پروگرام اپنا زیادہ تر وقت پروگرام کے کچھ لوپس ("ہاٹ لوپس") میں گزارتے ہیں اور اس کے بعد کے لوپ تکرار اکثر اسی طرح کے راستے اختیار کرتے ہیں۔ ورچوئل مشینیں جن میں ٹریسنگ جے آئی ٹی ہوتی ہے وہ اکثر مکسڈ موڈ پر عمل درآمد کرنے والے ماحول ہوتے ہیں، جس کا مطلب ہے کہ ان کے پاس ٹریسنگ جے آئی ٹی کے علاوہ یا تو ایک مترجم یا طریقہ مرتب کرنے والا ہوتا ہے۔ تکنیکی تفصیلات ایک ٹریسنگ جے آئی ٹی مرتب رن ٹائم پر مختلف مراحل سے گزرتا ہے۔ سب سے پہلے، لوپس کے لیے پروفائلنگ کی معلومات جمع کی جاتی ہیں۔ ہاٹ لوپ کی شناخت کے بعد، ایک خصوصی ٹریسنگ مرحلہ درج کیا جاتا ہے، جو اس لوپ کے تمام انجام شدہ آپریشنز کو ریکارڈ کرتا ہے۔ کارروائیوں کے اس سلسلے کو ٹریس کہا جاتا ہے۔ اس کے بعد ٹریس کو بہتر بنایا جاتا ہے اور مشین کوڈ (ٹریس) میں مرتب کیا جاتا ہے۔ جب اس لوپ کو دوبارہ چلایا جاتا ہے، تو مرتب شدہ ٹریس کو پروگرام کے ہم منصب کے بجائے بلایا جاتا ہے۔ ان مراحل کو درج ذیل میں تفصیل سے بیان کیا گیا ہے: پروفائلنگ کا مرحلہ پروفائلنگ کا مقصد گرم لوپس کی شناخت کرنا ہے۔ یہ اکثر ہر لوپ کے لیے تکرار کی تعداد گن کر کیا جاتا ہے۔ لوپ کی گنتی ایک مخصوص حد سے تجاوز کرنے کے بعد، لوپ کو گرم سمجھا جاتا ہے، اور ٹریسنگ فیز داخل کیا جاتا ہے۔ ٹریسنگ فیز ٹریسنگ فیز میں لوپ کا نفاذ عام طور پر ہوتا ہے، لیکن اس کے علاوہ ہر انجام شدہ آپریشن کو ٹریس میں ریکارڈ کیا جاتا ہے۔ ریکارڈ شدہ کارروائیاں عام طور پر ٹریس ٹری میں محفوظ کی جاتی ہیں، اکثر انٹرمیڈیٹ نمائندگی (IR) میں۔ ٹریسنگ فنکشن کالز کے بعد ہوتی ہے، جس کی وجہ سے وہ ٹریس میں داخل ہوتے ہیں۔ ٹریسنگ اس وقت تک جاری رہتی ہے جب تک کہ لوپ اپنے اختتام تک نہ پہنچ جائے اور شروع میں واپس چھلانگ نہ لگا دے۔ چونکہ ٹریس کو لوپ کے ایک ٹھوس عمل درآمد کے راستے پر چلتے ہوئے ریکارڈ کیا جاتا ہے، اس لیے اس ٹریس کی بعد میں انجام دہی اس راستے سے ہٹ سکتی ہے۔ ان جگہوں کی نشاندہی کرنے کے لیے جہاں ایسا ہو سکتا ہے، خصوصی محافظ ہدایات ٹریس میں داخل کی جاتی ہیں۔ ایسی جگہ کی ایک مثال ہے اگر بیانات۔ گارڈ اس بات کا تعین کرنے کے لیے ایک فوری چیک ہے کہ آیا اصل شرط اب بھی درست ہے یا نہیں۔ اگر کوئی محافظ ناکام ہو جاتا ہے تو ٹریس کی پھانسی کو روک دیا جاتا ہے۔ چونکہ ٹریسنگ عمل کے دوران کی جاتی ہے، اس لیے ٹریس کو رن ٹائم کی معلومات پر مشتمل کیا جا سکتا ہے (جیسے۔ ٹائپ کی معلومات)۔ اس معلومات کو بعد میں کوڈ کی کارکردگی کو بڑھانے کے لیے اصلاح کے مرحلے میں استعمال کیا جا سکتا ہے۔ اصلاح اور کوڈ جنریشن مرحلے کے نشانات کو بہتر بنانا آسان ہے، کیونکہ وہ صرف ایک عمل کے راستے کی نمائندگی کرتے ہیں، جس کا مطلب ہے کہ کوئی کنٹرول فلو موجود نہیں ہے اور اسے ہینڈل کرنے کی ضرورت نہیں ہے۔ عام اصلاح میں مستقل ذیلی اظہار کا خاتمہ، ڈیڈ کوڈ کا خاتمہ، رجسٹر الاٹمنٹ، غیر متغیر کوڈ حرکت، مستقل فولڈنگ، اور فرار کا تجزیہ شامل ہیں۔ اصلاح کے بعد، ٹریس کو مشین کوڈ میں تبدیل کر دیا جاتا ہے۔ اسی طرح اصلاح کے لیے، نشانات کی لکیری نوعیت کی وجہ سے یہ آسان ہے۔ ٹریس کو مشین کوڈ میں مرتب کرنے کے بعد، اسے لوپ کے بعد کے تکرار میں انجام دیا جا سکتا ہے۔ ٹریس پر عمل اس وقت تک جاری رہتا ہے جب تک کہ گارڈ ناکام نہ ہو جائے۔ جہاں جے آئی ٹی کا خیال 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 کوڈ جنریشن ڈالویک ہاٹ اسپاٹ انٹرپریٹر پروفائل گائیڈڈ آپٹیمائزیشن آر پائیتھن سیمنٹک ڈکشنری انکوڈنگ حوالہ جات بیرونی لنکس لواجٹ کمپائلر کنسٹرکشن سافٹ ویئر آپٹیمائزیشن کی آفیشل ویب سائٹ مثال کے طور پر پائیتھن (پروگرامنگ زبان) کوڈ کے ساتھ مضامین دیکھیں۔