সি, সি ++, এবং পছন্দগুলির জন্য জেআইটি সংকলক


33

সংকলিত ভাষার যেমন সি এবং সি ++ এর জন্য কি কোনও ইন-টাইম-ইন-টাইম সংকলক আছে? (প্রথম যে নামগুলি মাথায় আসে সেগুলি হ'ল কলং এবং এলএলভিএম! তবে আমার মনে হয় না তারা বর্তমানে এটি সমর্থন করে))

ব্যাখ্যা:

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

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

তবে আমি মনে করি এটি JIT সংকলনের পারফরম্যান্স বেনিফিটের নিজস্ব ওভারহেডের চেয়েও বিতর্কিত।


1
অফ-টপিক- অফ সাইট রিসোর্স।
ডেডএমজি

1
এটি প্রশ্নের সাথে খাপ খায় কিনা তা নিশ্চিত নয়, তবে ব্যবহারের সম্ভাব্যতার জন্য আমি জুলিয়া ভাষায় সিএক্সএক্স প্যাকেজটি দরকারী বলে মনে করি .. এটি আপনাকে @ ফিলিপ্যাক্লেন উত্তরে বর্ণিত অনুরূপ একটি ইন্টারেক্টিভ সি ++ প্রম্পট দেয়।
অ্যানটোনেলো

জিসিসি 9 তে এখন একটি জিট
user3071643

উত্তর:


33

[সম্পাদনা ইতিহাস দেখুন একেবারে ভিন্ন উত্তরের জন্য যা এখন মূলত অপ্রচলিত]]

হ্যাঁ, সি এবং / বা সি ++ এর জন্য বেশ কয়েকটি জেআইটি সংকলক রয়েছে।

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

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

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

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


1
জেআইটি কেন কোনও ক্যাশে-জাতীয় ফাইল সংরক্ষণ করে না যাতে তারা স্ক্র্যাচ থেকে সবকিছু পুনরায় চালিত করতে এড়াতে পারে?
জনমদ্ড

3
@ জনমুদ: আমি সন্দেহ করি যে কারণটি সুরক্ষা is উদাহরণস্বরূপ, ক্যাশেড কোডটি সংশোধন করুন, তার পরের বারের ভিএম শুরু হওয়ার পরে এটি সেখানে যা লিখেছিল তার পরিবর্তে আমি সেখানে রেখে দেওয়া কোডটি কার্যকর করে।
জেরি কফিন

4
ওও, আপনি যদি ক্যাশে পরিবর্তন করতে পারেন তবে আপনি উত্স ফাইলগুলিও সংশোধন করতে পারেন।
ব্যবহারকারী3125367

1
@ ইউজার ৩১২৫৩67:: হ্যাঁ, তবে অনেক ক্ষেত্রে সংকলক বিভিন্ন ধরণের চেকিং করে এবং যেমন আপনি যদি ক্যাশে থেকে সরাসরি সংকলিত কোড লোড করেন তবে বাইপাস করা যেতে পারে। অবশ্যই জেআইটির উপর নির্ভরশীল - জাভা একটি অনেকগুলি প্রয়োগকারী কাজ করে (সংকলিত) .ক্লাস ফাইল লোড করার সময়, তবে আরও অনেকগুলি অনেক কম করে (প্রায় কোনওটিই নয়, অনেক ক্ষেত্রে)।
জেরি কফিন

11

হ্যাঁ, সি ++ এর জন্য জেআইটি সংকলক রয়েছে। খাঁটি পারফরম্যান্সের দৃষ্টিকোণ থেকে আমার মনে হয় প্রোফাইল গাইডেড অপটিমাইজেশন (পিজিও) এখনও আরও উন্নত।

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

জেআইটির আর একটি আকর্ষণীয় অ্যাপ্লিকেশন হ'ল ক্লিং, এলএলভিএম এবং কলংয়ের উপর ভিত্তি করে একটি ইন্টারেক্টিভ সি ++ ইন্টারপ্রেটার: https://root.cern.ch/cling

এখানে একটি নমুনা অধিবেশন:

[cling]$ #include <iostream>
[cling]$ std::cout << "Hallo, world!" << std::endl;
Hallo, world!
[cling]$ 3 + 5
(int const) 8
[cling]$ int x = 3; x++
(int) 3
(int const) 3
[cling]$ x
(int) 4

এটি কোনও খেলনা প্রকল্প নয় তবে এটি আসলে সিইআরএন-তে ব্যবহৃত হয়, উদাহরণস্বরূপ, লার্জ হ্যাড্রন কলাইডারের কোড বিকাশ করার জন্য।


7

সি ++ / সিএলআই জিট করা হয়। এটা ঠিক যে, সি ++ / CLI হয় না সি ++ কিন্তু এটা প্রশংসনীয় কাছাকাছি। এটি বলেছে যে মাইক্রোসফ্টের জেআইটি কমপক্ষে আমার জ্ঞানের ভিত্তিতে নয়, আপনি যে সুপার টাইম / আচরণের উপর নির্ভর করে রানটাইম আচরণের উপর ভিত্তি করে তৈরি করেছেন do সুতরাং এটি সত্যিই সাহায্য করে না।

http://nestedvm.ibex.org/ এমআইপিএসকে জাভা বাইটকোডে রূপান্তরিত করে যা পরে জিট হবে। আপনার প্রশ্ন থেকে এই পদ্ধতির সমস্যাটি হ'ল আপনি জেআইটি-এর কাছে যাওয়ার সময় অনেক দরকারী তথ্য ফেলে দিচ্ছেন throw


2

প্রথমত, আমি ধরে নিই যে আপনি কোনও পদ্ধতিতে জিটের পরিবর্তে ট্রেসিং জিট চাইবেন।

নেওয়ার সর্বোত্তম পদ্ধতির নামটি হবে এলএলভিএম আইআর কোডটি সংকলন করে, তারপরে কোনও দেশীয় এক্সিকিউটেবল উত্পাদন করার আগে ট্রেসিং কোড যুক্ত করা। একবার কোনও কোড ব্লক পর্যাপ্তভাবে ব্যবহৃত হয়ে যায় এবং একবার ভেরিয়েবলের মানগুলি (গতিশীল ভাষাগুলির মতো ধরণের নয়) সম্পর্কে পর্যাপ্ত তথ্য সংগ্রহ করা হয়ে গেলে ভেরিয়েবলের মানগুলির উপর ভিত্তি করে প্রহরীগুলির সাথে কোডটি পুনরায় সংযুক্ত করা যায় (আইআর থেকে)।

আমার মনে হচ্ছে লাইব্লাক্ল্যাং নামে ঝনঝনিতে এসি / সি ++ জিট তৈরির বিষয়ে কিছু অগ্রগতি হয়েছিল।


1
আফাইক, লাইব্ল্যাং ক্ল্যাংয়ের কার্যকারিতা বেশিরভাগ লাইব্রেরী হিসাবে প্রকাশিত। সুতরাং, আপনি পরিশীলিত বাক্য গঠন, লিঙ্কগুলি, কোড ব্রাউজিং ইত্যাদি তৈরি করতে উত্স কোড বিশ্লেষণ করতে এটি ব্যবহার করতে পারেন
জাভিয়ের

@ জাভিয়ার, এটি সঠিক সম্পর্কে শোনাচ্ছে। আমি মনে করি লাইব্রেরিতে এমন একটি ফাংশন ছিল যা সোর্স কোডের কনস্ট চর * নিয়ে এলএলভিএম আইআর তৈরি করেছিল, তবে এখন ভাবছি, উত্সের চেয়ে আইআর ভিত্তিতে জিট করা ভাল।
ড্যান_ওয়াটারওয়ার্থ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.