আমি একটি ভার্চুয়াল মেশিন বানাতে চাই, কোনও ভাল রেফারেন্স আছে? [বন্ধ]


22

আমি কিছু গেম কোড চালানোর জন্য একটি ভার্চুয়াল মেশিনটিকে প্ল্যাটফর্মের স্বতন্ত্র উপায় হিসাবে তৈরি করতে চাইছি (মূলত স্ক্রিপ্টিং)।

গেমগুলিতে আমি যে ভার্চুয়াল মেশিনগুলি সম্পর্কে সচেতন সেগুলি বরং এটি পুরানো: ইনফোকমের জেড-মেশিন , লুকাশাস্তা'র এসসিইউএমএম , আইডি সফটওয়্যারটির ভূমিকম্প 3 । । নেট বিকাশকারী হিসাবে, আমি সিএলআরের সাথে পরিচিত এবং আপনি ভিএম স্তরে (বনাম ভাষা স্তর) আসলে কী প্রয়োগ করেন সে সম্পর্কে একটি সংক্ষিপ্তসার পেতে সিআইএল নির্দেশাবলীর দিকে নজর রেখেছি । আমি গত বছরে 6502 এসেম্ব্লারকেও কিছুটা ছুঁড়েছি

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

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

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


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


6
নোট করুন যে স্ট্যাক ভিত্তিক মেশিনটির টিউরিং-সম্পূর্ণ হওয়ার জন্য এটি স্ট্যাকের বাইরে মেমরির প্রয়োজন অন্যথায় এটি কেবল একটি পিডিএ
রাচেট ফ্রিক

1
প্রথম প্রশ্নটি: আপনি কতদূর যেতে চান? আমি কখনই এসসিইউএম / এসসিএমএমভিএম এর দিকে তাকাতে পারিনি তবে ধরে নিই যে গ্রাফিকাল জিনিসগুলি ঘুরে বেড়ানো ইত্যাদি সম্পর্কে জেনে বেশ উচ্চ পর্যায়ের স্তর রয়েছে যেখানে সিআইএল রয়েছে ... সুতরাং আপনাকে আপনার মেমরির মডেল (স্ট্যাকবেসড রেজিস্ট্রার ভিত্তিক, মিশ্রণ, জগাখিচুড়ি, ..) এবং অপকডগুলি সংজ্ঞায়িত করতে হবে ( অর্থাত্ এসেম্বলারের নির্দেশাবলী) এবং তারপরে কোনও ভিএম এর প্রথম সংস্করণটি একটি লুপ হয় do { switch(opcode) {case OP1: ... case OP2: ...} while (nextop);তারপরে সম্ভবত একটি সংকলক ... এবং তারপরে মজা শুরু হয় - এটিকে বাস্তবে কাজ করতে
অনুকূলিতকরণ

3
একটি সাধারণ চতুর্থ রানটাইম বাস্তবায়ন দিয়ে শুরু করার চেষ্টা করুন।
এসকে-যুক্তি

1
Quake 3ভার্চুয়াল মেশিন ঠিক কেমন ?
রামহাউন্ড

3
@ রামহাউন্ড আইডি টেক ইঞ্জিনগুলি দীর্ঘদিন ধরে অভ্যন্তরীণ ভার্চুয়ালাইজেশনের কিছু ফর্ম ব্যবহার করেছে, এই নিবন্ধটি , বা উইকিপিডিয়ায় তথ্য আরও ভাল ব্যাখ্যা করতে পারে।
ড্যানিয়েল বি

উত্তর:


18

আমি লুয়া পরীক্ষা করে শুরু করব । নমুনা বাস্তবায়ন হিসাবে এবং বাক্সের বাইরে খুব ব্যবহারযোগ্য ভিএম / ভাষা হিসাবে উভয়ই যদি আপনি শেষ পর্যন্ত নিজের নিজস্ব রোল না করার সিদ্ধান্ত নেন।

উত্স কোডটি খুব পঠনযোগ্য এবং এ্যানোটেটেড উত্স কোডও রয়েছে । এবং প্রধান লেখক রবার্তো ইয়ারুসালিমস্কি রচিত কিছু ডিজাইনের নথি

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

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


2
স্ট্যাক বনাম রেজিস্টার মেশিনগুলি সম্পর্কে: আমি তোতা / পারল 6 ডিভসের একটি উদ্ধৃতি মনে করি: "একটি রেজিস্টার ভিত্তিক মেশিন তৈরি করা শক্ত, তবে আমরা আমাদের সংকলক পক্ষের জন্য প্রচুর প্রচুর গবেষণা থেকে উপকৃত হই" (আক্ষরিক নয়)
জোহানেস

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

এখনও এর মধ্য দিয়ে যাচ্ছি। : VM- র সম্পর্কে বিকাশকারীর কাছ থেকে আরেকটি বড় ডকুমেন্ট inf.puc-rio.br/~roberto/talks/lua-ll3.pdf
মাইকেল Stum

2

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

আপনি যদি কোনও উত্স কোড দেখতে চান বা কোনও প্রয়োগের চেষ্টা করতে চান তবে আমি স্কেক বা ফেরো সংস্করণগুলির প্রস্তাব দিই।

সম্পর্কিত ভাষা / ভিএম সেল্ফ আপনার আগ্রহীও হতে পারে, যেহেতু স্বয়ং মূলত প্রোটোটাইপ-ভিত্তিক অবজেক্ট (জাভাস্ক্রিপ্টের অনুরূপ) সহ স্মার্টটাক k


0

আমি [স্ক্রিপ্ট] উত্স কোডটি কীভাবে আপনার মেশিনে বা রানটাইম পরিবেশে প্রবেশ করবে তা বিশ্লেষণ করেই আমি শুরু করব।

যদি আপনার এইচটিএমএল ডকুমেন্টগুলির মতো কিছু থাকে <a onclick="dosomething();">তবে আপনার খুব দ্রুত সংকলক প্রয়োজন হবে, বাইটকোড এক্সিকিউশন গতির ক্ষেত্রে এই ক্ষেত্রে তেমন কিছু আসে যায় না। যদি আপনার ব্যবহারের ক্ষেত্রে জাভা / .NET এর কাছাকাছি হয় যেখানে আপনি সম্পূর্ণ প্রস্ফুটিত সংকলন বহন করতে পারেন তবে ভিএম আর্কিটেকচার এবং বাইটকোড কাঠামোটি জাভা বাইটকোড বা আইএল এর কাছাকাছি থাকবে।

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

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

অন্য কথায়, প্রথমে আপনার সাধারণ ব্যবহারের ক্ষেত্রে সংজ্ঞা দেওয়ার চেষ্টা করুন এবং আপনার জন্য কী পড়বেন তা বোঝানো আরও সহজ হবে।


1
আধুনিক জাভাস্ক্রিপ্ট কম্পাইলার বেশ জটিল, এবং ভাল প্রশ্ন আছে alwazs কিভাবে কোডটি অনেক অপ্টিমাইজেশান আপনি রাখা।
জোহানেস

জাভাস্ক্রিপ্ট সম্পাদন কার্য সম্পাদনের বিষয়টি গুরুত্বপূর্ণ। ক্ষুদ্র স্ক্রিপ্টগুলির জন্য নয়, বৃহত্তর জেএস-ভারী সাইটের জন্য, যা আরও ভাল সাইটের জন্য আরও খারাপ বা আরও খারাপ সাইটের গুরুত্বপূর্ণ অংশ তৈরি করে। একটা কারণ জাতীয় ইঞ্জিন জে আই টি JIT কম্পাইলার (V8 এমনকি নেই ব্যবহার করেন আছে , একজন দোভাষী এটা সোজা মেশিন কোড যায়)।

@ ডেলান: জেএস ব্যবহারের ঘটনাটি পাইথন থেকে একেবারেই আলাদা। পাইথনে যখন আপনাকে রে-ট্রেসিং অ্যালগরিদম বাস্তবায়নের মতো কিছু দরকার হয় আপনি নেটিভ লাইব্রেরি করবেন এবং স্ক্রিপ্ট থেকে কল করবেন। এটি কোনও জেআইটি সমাধানের তুলনায় সর্বদা দ্রুত (বা কমপক্ষে ধীরে নয়) be জেএস রাজ্যে আপনার নেটিভ কোডের মতো বিলাসিতা নেই তাই আপনার পক্ষে একমাত্র বিকল্প হ'ল আপনার জেএস ভিএমকে যত তাড়াতাড়ি সম্ভব করার চেষ্টা করা। তবে আবারও দাম নিয়ে। মূল্যায়ন "dosomethingnative ()" HTML এ "<বোতাম onclick =" dosomethingnative () "> সহজ অনুবাদক দ্রুত V8 তুলনায় মাত্রার আদেশ হতে পারবেন না।
সি-হাসা

@ সি-হাসি আমার বক্তব্য ঠিক

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