Chrome V8 কীভাবে কাজ করে? এবং কেন জাভাস্ক্রিপ্ট প্রথম স্থানে JIT- সংকলিত হয়নি?


19

আমি দোভাষী / সংকলকগুলি নিয়ে গবেষণা করে চলেছি, তারপরে আমি জেআইটি-সংকলন জুড়ে হোঁচট খেয়েছি - বিশেষত গুগল ক্রোমের ভি 8 জাভাস্ক্রিপ্ট ইঞ্জিন।

আমার প্রশ্নগুলি হ'ল -

  1. এটি স্ট্যান্ডার্ড ব্যাখ্যার চেয়ে দ্রুত কীভাবে হতে পারে ?
  2. প্রথম স্থানে কেন জেআইটি-সংকলন ব্যবহার করা হয়নি?


আমার বর্তমান বোঝাপড়া

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

  2. দেখে মনে হয় যে জেআইটি-সংকলনটি উইকিপিডিয়ায় জেআইটি-সংকলন নিবন্ধের ভিত্তিতে তুলনামূলকভাবে পুরানো উদ্ভাবন

"প্রথম প্রকাশিত জেআইটি সংকলক সাধারণত 1960 সালে ম্যাকার্থি দ্বারা এলআইএসপিতে কাজ করার জন্য দায়ী হন ।"

"স্মার্টটাক (সি। 1983 ) জেআইটি সংকলনের নতুন দিকগুলির সূচনা করেছিল। উদাহরণস্বরূপ, মেশিন কোডে অনুবাদ করা হয়েছিল চাহিদা অনুসারে, এবং ফলাফলটি পরে ব্যবহারের জন্য ক্যাশে করা হয়েছিল memory যখন এটি আবার প্রয়োজন ছিল। "

তাহলে জাভাস্ক্রিপ্টের সাথে কেন ব্যাখ্যা করা গেল ?


আমি খুব বিভ্রান্ত হয়ে পড়েছি এবং এ নিয়ে আমি অনেক গবেষণা করেছি, তবে সন্তোষজনক উত্তর আমি পাইনি।

তাই পরিষ্কার, সংক্ষিপ্ত উত্তর প্রশংসা করা হবে। এবং যদি দোভাষী, জেআইটি-কম্পাইলার ইত্যাদির বিষয়ে অতিরিক্ত ব্যাখ্যা আনার দরকার হয় তবে এটিও প্রশংসিত।


2
# 2 এবং # 3 উত্তরযোগ্য তবে "ক্রোম ভি 8 ইঞ্জিন কীভাবে কাজ করে?" কোনও যোগ্যতা ছাড়াই অনেক বেশি বিস্তৃত; শুধুমাত্র সঠিক উত্তরটি ভি 8 উত্স কোডের একটি লিঙ্ক। আপনি ভি 8 সম্পর্কে আরও নির্দিষ্ট কিছু জিজ্ঞাসা করার অর্থ দিয়েছিলেন? (যদি না হয় তবে প্রশ্নের সেই অংশটি সরিয়ে দেওয়া ভাল)
Ixrec

দ্বিতীয় নজরে, আমার কাছে # 1 জিজ্ঞাসার একমাত্র পয়েন্টটি # 2 বোঝা ছিল, তাই আমি এটি সরিয়ে দেব। ইনপুট জন্য ধন্যবাদ।
আন্তন প্যারাস

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

আপনি যদি ভাবছেন। আমি একটি প্রোগ্রামিং ভাষার জন্য মূল বিকাশকারী / রক্ষণাবেক্ষকের দৃষ্টিকোণ থেকে এটি সম্পর্কে কথা বলছি। কয়েক বছর ধরে আমাকে ফ্যারিট প্রোগ্রামিং ভাষা বজায় রাখতে নিয়োগ করা হয়েছিল। আমাদের যে ইচ্ছার তালিকা ছিল তা ছিল একটি জেআইটি বাস্তবায়ন করা। এটি কখনও ঘটেনি - আমরা পরিবর্তে চলে গেলাম। পিএইচপি সম্প্রতি একটি জেআইটি সংকলক (এইচভিভিএম) পেয়েছে ফেসবুককে এটির জন্য যথেষ্ট পরিমাণ অর্থ pourালাও বলে ধন্যবাদ জানায়।
slebetman

উত্তর:


43

সংক্ষিপ্ত উত্তরটি হ'ল JIT এর আরম্ভের সময় বেশি, তবে দীর্ঘমেয়াদে অনেক দ্রুত এবং জাভাস্ক্রিপ্ট মূলত দীর্ঘকালীন জন্য নয়।

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

প্রয়োজন হিসাবে ব্যাখ্যা করা অনেক সহজ ছিল এবং দিনের ব্যবহারের ক্ষেত্রে পুরোপুরি পর্যাপ্ত পারফরম্যান্স সরবরাহ করেছিল। আপনি যদি দীর্ঘ-সঞ্চালিত পারফরম্যান্স সহ কিছু চান, আপনি ফ্ল্যাশ বা জাভা অ্যাপলেট ব্যবহার করেছেন।

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

বলুন আপনার একটি ফাংশন আছে animateDraggedMap। এটি ব্যাখ্যা করতে 500 এমএস লাগতে পারে এবং জেআইটি এটি সংকলন করতে 700 এমএস লাগতে পারে। তবে, জেআইটি সংকলনের পরে, এটি চালাতে কেবল 100 এমএস লাগতে পারে। যদি এটি 90 এর দশক হয় এবং আপনি একবার কেবল কোনও ফাংশন কল করছেন তবে পৃষ্ঠাটি পুনরায় লোড করা হচ্ছে, জেআইটি মোটেই উপযুক্ত নয়। যদি এটি আজ হয় এবং আপনি animateDraggedMapকয়েকশো বা কয়েক হাজার বার কল করছেন , আরম্ভের সময়ে অতিরিক্ত 200 এমএস কিছুই নয় এবং ব্যবহারকারী এমনকি মানচিত্র টেনে আনার চেষ্টা করার আগেই এটি পর্দার আড়ালে করা যেতে পারে।


2

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

এই বিষয়ে বেশ কিছুটা বলা যায় - এটি উল্লেখযোগ্য পরিমাণে গবেষণার বিষয়। এখানে আমার নিজস্ব ব্যাখ্যা যে আমি পার্থক্যগুলি বোঝার ক্ষেত্রে দেওয়া উত্তরের তুলনায় পলস লিখতে শুরু করেছি : traditionalতিহ্যবাহী দোভাষী, জেআইটি সংকলক, জেআইটি ইন্টারপ্রেটার এবং এওটি সংকলক


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

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

জাভাস্ক্রিপ্টের মূল উদ্দেশ্যটি ছিল অ্যাপলেট এবং এইচটিএমএল পৃষ্ঠাগুলিতে লিঙ্ক দেওয়া। এই জাতীয় একটি ছোট কাজের জন্য, কারওর জন্য দুর্দান্ত পারফরম্যান্সের প্রয়োজন নেই (যদি আপনি পারফরম্যান্স চান, তবে অ্যাপলেট পদ্ধতিটি যা জেআইটি'র অনুরোধ করুন)।

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


1
না, জাভাস্ক্রিপ্ট জাভা সম্পর্কিত নয়। এবং জাভা অ্যাপলেটগুলি হল জেভিএম বাইটকোড।
বেসাইল স্টারিঙ্কেভিচ

@ বাসাইলস্টারিঙ্কেভিচ জাভাস্ক্রিপ্টটি হ্যামলেট পৃষ্ঠাগুলিতে জাভা অ্যাপলেটগুলির সাথে কাজ করার জন্য ডিজাইন করা হয়েছিল - এইচটিএমএল ডোম এবং জাভা অবজেক্টগুলিতে থাকা পদ্ধতির মধ্যে আঠালো হিসাবে অভিনয় করে। এটি জাভা হওয়ার ইচ্ছা ছিল না এবং এটি কখনও ছিল না।

জাভাস্ক্রিপ্টকে মূলত ECMAScript (বা এর মতো কিছু) বলা হত এবং জাভার সাথে তার কোনও সম্পর্ক ছিল না। এটি কীভাবে জাভাস্ক্রিপ্ট বলা যায় তা আগ্রহীদের পৃথক গবেষণার বিষয়। এটি প্রথম থেকেই বিভ্রান্তির সৃষ্টি করে।
দ্রুত_বলি

1
@ কুইক্লি_নও এবং এখনও tc39.github.io/ecma262
59

হ্যাঁ. এবং কিছু অদ্ভুত কারণে যখন আমি উপরে নির্দেশ করেছিলাম যে আমি এটির জন্য ডাউনভোটেড হয়েছি!
দ্রুত_আগস্ট

1

জাভাস্ক্রিপ্টের জন্য জেআইটিগুলি দ্রুত, কারণ যখন আপনি নিজের ভেরিয়েবলের ধরণ জানেন না তখন দ্রুত মেশিন কোড তৈরি করা অসম্ভব।

যখন আপনার কাছে টাইপ তথ্য না থাকে, তখন গণনা ব্যয়বহুল। উদাহরণ স্বরূপ,

x + y

আপনি x এবং y সম্পর্কে কিছু না জানলে বেশ জটিল। তারা পূর্ণসংখ্যা, ডাবল, স্ট্রিং বা এমন কোনও বস্তু হতে পারে যেখানে এই গণনার পার্শ্ব প্রতিক্রিয়া রয়েছে। যেহেতু আমাদের কাছে স্ট্যাটিক টাইপিং নেই, এটি একটি ব্যয়বহুল গণনা।

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

উদাহরণস্বরূপ, সি ++ সংকলক সময়ের আগে x এবং y প্রকারগুলি জানে, যেহেতু আমাদের ভেরিয়েবলগুলি ঘোষণা করতে হয়েছিল। সুতরাং এটি কোড চালানোর আগে স্ট্র্যাঙ্কেটেটিং স্ট্রিংয়ের জন্য অনুকূলিত মেশিন কোড তৈরি করতে পারে।


0

1) স্ট্যান্ডার্ড ব্যাখ্যার চেয়ে এটি কীভাবে দ্রুত হতে পারে? ঠিক আছে, একটি চিন্তার উদাহরণ নিম্নরূপ হবে; ধরুন আমাদের কাছে দুটি অ্যাপ্লিকেশন রয়েছে অ্যাপ্লিকেশন কম্পাইল এবং অ্যাপ্লিকেশন বর্ণিত। এই উভয় প্রোগ্রামই ঠিক একই কাজ করে এবং একই উত্স কোডটি ভাগ করে। অ্যাপ্লিকেশন সংকলিত সংকলন করতে 6 সেকেন্ড সময় নেয়।

ধরা যাক যে সিনারিও এ এর ​​সময়কাল:

  • অ্যাপ্লিকেশন কম্পাইলের জন্য: 4 সেকেন্ড
  • অ্যাপ্লিকেশনটির জন্য ব্যাখ্যা: 12 সেকেন্ড

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

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

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

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