কীভাবে একটি জেআইটি সংকলক সাধারণ সংকলক থেকে আলাদা?


22

জাভা, রুবি এবং পাইথনের মতো ভাষার জন্য জেআইটি সংকলক সম্পর্কে প্রচুর হাইপ রয়েছে। সিআইটি / সি ++ সংকলকগুলির থেকে জেআইটি সংকলকগুলি কীভাবে আলাদা হয় এবং জাভা, রুবি বা পাইথনের জন্য লেখা সংকলকগুলিকে কেন জেআইটি সংকলক বলা হয়, যখন সি / সি ++ সংকলককে কেবল সংকলক বলা হয়?

উত্তর:


17

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

অন্যদিকে, সি এবং সি ++ সংকলকগুলি traditionতিহ্যগতভাবে জেআইটি নয়। এগুলি কেবল একবার বিকাশকারীর মেশিনে একক শটে সংকলন করে এবং তারপরে একটি নির্বাহযোগ্য উত্পাদন হয় is


এমন কি জেআইটি সংকলক রয়েছে যা ক্যাশে মিসের উপর নজর রাখে এবং সেই অনুসারে তাদের সংকলন কৌশলটি মানিয়ে নেয়? @ ভিক্টর
মার্টিন বার্গার

@ মার্টিনবার্গার আমি জানি না যে কোনও উপলব্ধ জেআইটি সংকলক তা করেন কিনা তবে কেন করবেন না? কম্পিউটারগুলি আরও শক্তিশালী এবং কম্পিউটার বিজ্ঞানের বিকাশ ঘটায়, লোকেরা প্রোগ্রামটিতে আরও অনুকূলিতকরণ প্রয়োগ করতে পারে। উদাহরণস্বরূপ জাভা যখন জন্মগ্রহণ করেছিলেন তখন এটি খুব ধীরগতি সম্পন্ন,
সংকলিতগুলির

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

@ LưuVĩnhPhúc Choo! আমি এটি বিশ্বাস করে খুশি, তবে পার্থক্যটি হ'ল সিপিইউ টাইপ বা ক্যাশের আকার হ'ল কিছু স্ট্যাটিক যা পুরো গণনা জুড়ে পরিবর্তন হয় না, তাই খুব সহজেই একটি স্ট্যাটিক সংকলক দ্বারাও এটি করা যায়। ক্যাশে মিস করা OTOH খুব গতিশীল।
মার্টিন বার্গার

12

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

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

উদাহরণস্বরূপ, কোডটি বিবেচনা করুন:

m(a : String, b : String, k : Int) {
  val c : Int;
  switch (k) {
    case 0 : { c = 7; break; }
    ...
    case 17 : { c = complicatedMethod(k, a+b); break; }
  }

  return a.length + b.length - c + 2*k;
}

একটি সাধারণ সংকলক এ সম্পর্কে খুব বেশি কিছু করতে পারে না। একটি জেআইটি সংকলক অবশ্য সনাক্ত করতে পারে যে mএটি কেবল কখনও k==0কোনও কারণে ডাকা হয়েছিল (সময়ের সাথে সাথে কোড পরিবর্তন হিসাবে এর মতো জিনিসগুলি ঘটতে পারে); এরপরে এটি কোডের একটি ছোট সংস্করণ তৈরি করতে পারে (এবং এটি স্থানীয় কোডে সংকলন করুন, যদিও আমি এটিকে একটি ছোট বিষয় হিসাবে ধারণা হিসাবে বিবেচনা করি):

m(a : String, b : String) {
  return a.length + b.length - 7;
}

এই মুহুর্তে, এটি এখন তুচ্ছ হিসাবে সম্ভবত পদ্ধতি কলটি ইনলাইন করবে।

স্পষ্টতই, সান javacজাভা 6 তে ব্যবহৃত বেশিরভাগ অপটিমাইজেশনকে বাতিল করে দিয়েছিল ; আমাকে বলা হয়েছে যে এই অপটিমাইজেশনগুলি জেআইটির পক্ষে অনেক কিছু করা শক্ত করেছে, এবং নির্লিপ্তভাবে সংকলিত কোডটি শেষ পর্যন্ত দ্রুত চলেছিল। চিত্রে যান.


যাইহোক, মুছে ফেলা প্রকারের উপস্থিতিতে (যেমন জাভাতে জেনেরিকস) জেআইটি আসলে একটি অসুবিধে কাটা টাইপের দিকে।
রাফেল

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

2
অনেক ক্ষেত্রে, একটি জেআইটি এমন mকোনও সংস্করণ প্রতিস্থাপন করতে সক্ষম হবে না যা পরীক্ষা করে kনি কারণ এটি প্রমাণ করতে সক্ষম mহবে না যে এটি কখনও শূন্য নয় k, তবে এটি প্রমাণ করতে সক্ষম হয় না যে এটি প্রতিস্থাপন করতে পারে এটা static miss_count; if (k==0) return a.length+b.length-7; else if (miss_count++ < 16) { ... unoptimized code for মি ...} else { ... consider other optimizations...}
সুপারক্যাট

1
আমি @ সুপারকার্টের সাথে একমত এবং আপনার উদাহরণটি আসলে বেশ বিভ্রান্তিকর বলে মনে করি। কেবলমাত্র যদি k=0 সর্বদা , যার অর্থ এটি ইনপুট বা পরিবেশের কোনও কাজ নয় তবে এটি পরীক্ষা বাদ দেওয়া কি নিরাপদ - তবে এটি নির্ধারণের জন্য স্থিতিশীল বিশ্লেষণ প্রয়োজন, যা খুব ব্যয়বহুল এবং এইভাবে সংকলনের সময় সাশ্রয়ী মূল্যের। কোনও জেআইটি জিততে পারে যখন কোডের ব্লকের মাধ্যমে একটি পাথ অন্যের তুলনায় অনেক বেশি সময় নেওয়া হয় এবং এই পথটির জন্য বিশেষ কোডটির একটি সংস্করণ আরও দ্রুত হবে। তবে দ্রুত পথটি প্রযোজ্য কিনা তা যাচাই করার জন্য এবং এখনও না হলে "ধীর পথ" গ্রহণের জন্য জেআইটি একটি পরীক্ষা ছাড়বে
j_random_hacker

একটি উদাহরণ: একটি ফাংশন একটি Base* pপ্যারামিটার নেয় এবং এর মাধ্যমে ভার্চুয়াল ফাংশনগুলি কল করে; রানটাইম বিশ্লেষণ দেখায় যে প্রকৃত অবজেক্ট সর্বদা (বা প্রায় সর্বদা) নির্দেশিত বলে মনে হয় Derived1type জেআইটি Derived1পদ্ধতিতে স্ট্যাটিকালি সলভড (বা এমনকি ইনলাইনড) কল দিয়ে ফাংশনের একটি নতুন সংস্করণ তৈরি করতে পারে । এই কোডটি শর্তসাপেক্ষে পূর্বে থাকবে যা কিনা পরীক্ষা করে pদেখবে যে এর vtable পয়েন্টারটি প্রত্যাশিত Derived1টেবিলের দিকে নির্দেশ করে; যদি তা না হয় তবে তার পরিবর্তে ধীর গতি সম্পন্ন পদ্ধতি কলগুলির সাথে এটি ফাংশনের আসল সংস্করণে যায়।
j_random_hacker
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.