জাভাস্ক্রিপ্ট ডিজাইন দ্বারা ব্যাখ্যা করা হয়?


73

আমি এই প্রশ্নটি জিজ্ঞাসা করার বিষয়ে সতর্ক রয়েছি কারণ এটি অত্যধিক কঠোর মনে হতে পারে। আমি সবেমাত্র জাভাস্ক্রিপ্ট খুললাম: সংজ্ঞা নির্দেশিকা, এবং এটি অধ্যায় 1 এর প্রথম পৃষ্ঠার বর্ণনা দিয়েছে

"জাভাস্ক্রিপ্ট একটি উচ্চ-স্তরের, গতিশীল, টাইপযুক্ত ব্যাখ্যাযুক্ত প্রোগ্রামিং ভাষা"

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

স্পষ্টত জাভাস্ক্রিপ্টের জন্য কোনও স্থির সংকলক নেই - https://stackoverflow.com/questions/1118138/is-there-a-native-machine-code-compiler- for- জাভাস্ক্রিপ্ট যাতে সম্ভবত এটি এর প্রতিচ্ছবি মাত্র।


কিছুক্ষণের জন্য একটি jscript.net ছিল যা AS3 / "হারিয়ে যাওয়া" ES4 এর মতো। এটি বাইকোড-সংকলন করা হয়েছিল সিআইএল-তে।
আরে

13
V8 স্পষ্টভাবে দাবী একজন দোভাষী কিন্তু একটি কম্পাইলার এমনটি হয় নি।
pimvdb

@GGG JScript.Net এখনও জীবিত এবং ... অসুস্থ। তবে এখনও বেঁচে আছে। msdn.microsoft.com/en-us/library/72bd815a.aspx
জেটি

1
এফডাব্লুআইডাব্লু, "টাইপযুক্ত" বিটটিও কঠোরভাবে সত্য নয়
রব আগর

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

উত্তর:


50

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

ECMAScript ভাষা Geeks প্রায়ই শব্দটি "es ব্যাখ্যাকারী" ECMAScript এর একটি বাস্তবায়ন উল্লেখ করতে ব্যবহার করেন, কিন্তু বৈশিষ্ট যে শব্দ ব্যবহার করে না। ভাষা ওভারভিউ বিশেষত অনুবাদক অ্যাগনোস্টিক পরিপ্রেক্ষিতে ভাষা বর্ণনা

ECMAScript অবজেক্ট ভিত্তিক: মৌলিক ভাষা এবং হোস্ট সুবিধাগুলি বস্তুগুলির দ্বারা সরবরাহ করা হয়, এবং একটি ECMAScript প্রোগ্রাম হ'ল যোগাযোগের বিষয়গুলির একটি গোষ্ঠী।

সুতরাং ইকামাস্ক্রিপ্ট একটি "হোস্ট এনভায়রনমেন্ট" ধরে নিয়েছে যা আইটেম সংজ্ঞা সরবরাহকারী হিসাবে সংজ্ঞায়িত হয়েছে এমন সমস্তগুলি সহ যা I / O বা বাইরের বিশ্বের অন্য কোনও লিঙ্ককে মঞ্জুরি দেয় তবে দোভাষীর প্রয়োজন হয় না।

ভাষায় বক্তব্য এবং অভিব্যক্তিগুলির শব্দার্থবিজ্ঞান সম্পূর্ণরূপে নির্দিষ্টকরণের ক্ষেত্রে সংজ্ঞায়িত হয় যা তাত্পর্যপূর্ণভাবে একজন দোভাষীকে প্রয়োগ করা হয়, তবে স্পেসিফিকেশনটির প্রয়োজন হয় না।

8.9 সমাপ্তির নির্দিষ্টকরণের ধরণ

সম্পূর্ণতা টাইপ বিবৃতি আচরণ ব্যাখ্যা ব্যবহার করা হয় ( break, continue, returnএবং throw) যে নিয়ন্ত্রণের nonlocal স্থানান্তর সঞ্চালন। সম্পূর্ণতা ধরনের মানগুলি ফর্ম (এর triples হয় টাইপ , মান , লক্ষ্য ), যেখানে টাইপ এক স্বাভাবিক , বিরতি , অবিরত , রিটার্ন , বা নিক্ষেপ , মান কোন মান বা এর নাম ECMAScript ভাষা খালি , এবং লক্ষ্য কোনো নাম ECMAScript আইডেন্টিফায়ার বা খালি

"আকস্মিকভাবে সমাপ্তি" শব্দটি সাধারণ ব্যতীত অন্য কোনও ধরণের কোনও সমাপ্তিকে বোঝায় ।

স্থানীয়-নিয়ন্ত্রণের স্থানান্তর স্থানান্তর বা বাইট-কোড সংকলনের জন্য মঞ্জুরি দিয়ে নির্দেশাবলীর অ্যারেগুলিতে রূপান্তরিত হতে পারে।

"ইকমাস্ক্রিপ্ট ইঞ্জিন" একই ধারণাটি প্রকাশ করার জন্য আরও ভাল উপায় হতে পারে।


দৃশ্যত জাভাস্ক্রিপ্টের জন্য কোনও স্থির সংকলক নেই

এটি সত্য নয়। ভি 8 "দোভাষী" অভ্যন্তরীণভাবে স্থানীয় কোডে সংকলন করে, রাইনো অভ্যন্তরীণভাবে জাভা বাইটকোডে সংকলন করে এবং বিভিন্ন মজিলা দোভাষী ({ট্রেস, স্পাইডার, জাগার} বানর) একটি জেআইটি সংকলক ব্যবহার করে।

ভি 8 :

ভি 8, জাভাস্ক্রিপ্ট কার্যকর করার আগে দেশীয় মেশিন কোডে সংকলন করে বায়োটোড এক্সিকিউট করে বা এর ব্যাখ্যা দিয়ে কাজ সম্পাদন করে।

গণ্ডার :

public final void setOptimizationLevel(int optimizationLevel)

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

ট্রেসমোনকি :

ট্রেসমনকি মজিলার জাভাস্ক্রিপ্ট ® ইঞ্জিনে ("স্পাইডারমনকি" নামে পরিচিত) নেটিভ কোড সংকলন যুক্ত করেছে। এটি ইউসি ইরভিনে "ট্রেস ট্রি" নামে পরিচিত একটি প্রযুক্তি এবং তামারিন ট্রেসিং প্রকল্পের সাথে ভাগ করা কোড এবং ধারণাগুলির উপর ভিত্তি করে তৈরি। নেট ফলাফলটি ব্রাউজার ক্রোম এবং ওয়েব ‐ পৃষ্ঠাগুলির উভয় ক্ষেত্রেই প্রচুর গতি বৃদ্ধি করে।


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

@ me232, বক্তব্যটি ২০০৮ এর পূর্বে যথেষ্ট সত্য ছিল R আমি বইটি পড়িনি, সুতরাং সেই বাক্যটি তার সামগ্রিক মানের কতটা প্রতিনিধি তা নিয়ে আমি মন্তব্য করতে পারি না।
মাইক স্যামুয়েল

"স্ট্যাটিক সংকলক" এর সংজ্ঞা কী। আমি ভেবেছিলাম সংজ্ঞাটির অর্থ সংকলনটি কেবল একবারই ঘটে এবং আপনি একটি স্থিতিশীল (অর্থাত্ অপরিবর্তনীয়) বালতি পাবেন যা আপনি পরে চালাবেন। আফাইক এটি কোনও জাভাস্ক্রিপ্ট ইঞ্জিন কীভাবে কাজ করে তা নয়। এজন্য তাদের de-optimizationপদক্ষেপ রয়েছে। অন্য কথায় জাভাস্ক্রিপ্ট এই ইঞ্জিনগুলি দ্বারা সংকলিত কিন্তু এটি স্থিতিশীলভাবে সংকলিত হয়নি।
gman

@gman, রিনোর বাইটকোড জেনারেটর সেভাবে কাজ করে।
মাইক স্যামুয়েল

আফাইক এমনটি নয়। রাইনো অন্যান্য জাভাস্ক্রিপ্ট ফাইলগুলি অন্তর্ভুক্ত করতে পারে যা রানটাইম সময়ে সংকলন করতে হয়। এটি স্থির জটিলতা নয়।
gman

20

Chrome এ ব্যবহৃত V8 জাভাস্ক্রিপ্ট ভিএম কোনও দোভাষী অন্তর্ভুক্ত করে না। পরিবর্তে এটি দুটি সংকলক সমন্বিত এবং ফ্লাইতে কোড সংকলন করে। সংকলকগুলির মধ্যে একটি দ্রুত চালায় তবে অদক্ষ কোড জেনারেট করে, অন্যটি অপটিমাইজিং সংকলক।

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


19

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

সংকলন এবং ব্যাখ্যার মধ্যে অনেকগুলি ছায়া রয়েছে।

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

তবে জাভাস্ক্রিপ্ট কি ব্যাখ্যার জন্য ডিজাইন করা হয়েছে? একটি উপায়ে, হ্যাঁ: এটির একটি evalফাংশন রয়েছে পাশাপাশি Functionকনস্ট্রাক্টরও রয়েছে যে আপনি প্রোগ্রামিং কোডটিকে স্ট্রিং হিসাবে দিতে পারবেন যা কার্যকর হবে। চলাকালীন সময়ে প্রোগ্রাম কোডটি গতিশীলরূপে নির্মাণের দক্ষতার জন্য ইঞ্জিনটি উত্স কোডটি ব্যাখ্যা করতে সক্ষম হতে হবে। তবে এর অর্থ এই নয় যে আপনি সময়ের সমস্ত কিছু আগেই তৈরি করতে পারবেন না। এমনকি সি ++ এবং সি # এর মতো সংকলিত ভাষায়ও আপনি সোর্স কোড নিতে পারেন, এটিকে মেশিনে নতুন মেশিন কোডে সংকলন করতে পারেন এবং তারপরে এটি কার্যকর করতে পারেন। এমনকি এর জন্য গ্রন্থাগারগুলি রয়েছে: সি ++ এ এলএলভিএম + কলং এবং সি # তে রোজলিন প্রকল্প।

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


4

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

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


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

বর্ণিত বা সংকলিত কোনও ভাষাতে কল করা ঠিক নয়। উদাহরণস্বরূপ, এই নিয়মের অধীনে, আপনি সম্মত হবেন যে সি ++ ভাষা সঠিকভাবে সংকলিত হয়েছে? তারপরে ক্লিংয়ের কী, এটি সি ++ কোডটি সংকলন না করে কার্যকর করে। "এবং এর মতগুলি ব্যাখ্যা করা হয় (এমনকি তারা বাইকোড বা এমনকি নেটিভ কোডের মতো মধ্যবর্তী পদক্ষেপগুলি ব্যবহার করেও)" এর সাথে জাভাও ব্যাখ্যা করা হয়, এর ভিএম দ্বারা ব্যাখ্যা করা হয়।
অভিনব গৌনিয়াল
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.