আমি কীভাবে নিজের প্রোগ্রামিং ভাষা এবং এর জন্য একটি সংকলক তৈরি করব [বন্ধ]


427

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


আমি ইতিমধ্যে আহোর কম্পাইলার ডিজাইন এবং তেনেনবাউমের ওএস ধারণাগুলি বইটি পড়েছি এবং তারা সকলেই একটি উচ্চ স্তরে ধারণা এবং কোড নিয়ে আলোচনা করে discuss তারা বিশদ এবং সংক্ষিপ্তসার এবং কোনও সংকলক বা অপারেটিং সিস্টেম কীভাবে তৈরি করবেন সে বিষয়ে যান না। আমি একটি কংক্রিট বোঝাপড়া চাই যাতে আমি নিজেই তৈরি করতে পারি এবং থ্রেড, সেমফোর, প্রক্রিয়া বা পার্সিং কী তা বোঝার জন্য নয়। আমি আমার ভাইকে এই সমস্ত সম্পর্কে জিজ্ঞাসা করেছি। তিনি এমআইটির ইইসিএস-এর এসবি ছাত্র এবং বাস্তবে কীভাবে এই সমস্ত জিনিস তৈরি করা যায় তার কোনও ধারণা পাননি তিনি। তিনি জানেন যে কেবলমাত্র আপনার ছেলেরা যেমন উল্লেখ করেছেন (যেমন থ্রেড, সিঙ্ক্রোনাইজেশন, কনকুরન્સી, মেমরি ম্যানেজমেন্ট, লেক্সিকাল অ্যানালাইসিস, ইন্টারমিডিয়েট কোড জেনারেশন ইত্যাদি) এর মতো কম্পাইলার ডিজাইন এবং ওএস ধারণাগুলি সম্পর্কে তিনি কেবল জানেন knows


আপনি যদি ইউনিক্স / লিনাক্সে থাকেন তবে আপনি উত্সর্গীকৃত সরঞ্জামগুলি: এবং lex, সম্পর্কে তথ্য পেতে পারেন । yaccbison
mouviciel

আমার প্রথম পরামর্শটি হ'ল আহোর লেখা ড্রাগন বুকটি পড়ুন। amazon.com/Compilers- মূলনীতি- কৌশল
জুলিয়ান

1
হয়তো খুব সহায়ক নয়, কিন্তু আমি মধ্য দিয়ে যাচ্ছে সুপারিশ sites.google.com/site/steveyegge2/blog-rants (স্টিভ Yegge এর ব্লগ), এবং steve-yegge.blogspot.com/ (স্টিভ Yegge এর অন্যান্য ব্লগ)।
কে।

3
আপনি যতটা প্রোগ্রামিং ল্যাঙ্গুয়েজ শিখুন। এইভাবে আপনি তাদের ধারণাগুলি পাশাপাশি তাদের ভুলগুলি থেকে শিখবেন। বামনদের সাথে কেন সন্তুষ্ট থাকুন, যখন আপনি দৈত্যদের কাঁধে দাঁড়াতে পারেন?
এসবিআই

1
ইঙ্গিত: একটি অনুবাদক সংকলকের চেয়ে সহজ; এটি কেবলমাত্র এক শ্রেণি যা ইনপুট পাঠ্যের উপর ভিত্তি করে "কিছু করে" যা এটি লাইন পর পর পাঠ করে। আরেকটি ইঙ্গিত: এটিকে প্রতিবিম্বের সাথে বেঁধে রাখুন এবং আপনি আপনার স্ক্রিপ্টের মাধ্যমে স্বেচ্ছাচারিত বস্তুগুলি নিয়ন্ত্রণ করতে পারেন।
ডেভ কাজিনো

উত্তর:


407

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

এটি বলেছিল, আমি এখানে একটি ক্র্যাক নিতে পারি:

আমি বুঝতে পারি না লোকেরা কীভাবে প্রোগ্রামিং ভাষা তৈরি করে এবং এর জন্য সংকলক তৈরি করে।

এটি আমার কাছে অবাক করার মতো বিষয়, তবে প্রচুর লোকেরা প্রোগ্রামিং ভাষাগুলিকে যাদু হিসাবে দেখেন look আমি যখন পার্টিতে বা যাই হোক না কেন লোকের সাথে দেখা করি, যদি তারা আমাকে জিজ্ঞাসা করে আমি কি বলি যে আমি প্রোগ্রামিং ভাষা ডিজাইন করি এবং সংকলকগুলি এবং সরঞ্জামগুলি বাস্তবায়ন করি এবং লোকজন - পেশাদার প্রোগ্রামারগণ, আপনার মনে রাখবেন - এটি কতবার অবাক করে দেয়? "বাহ, আমি কখনই এ নিয়ে ভাবি নি, তবে হ্যাঁ, কাউকে এই জিনিসগুলি ডিজাইন করতে হবে"। এটি তাদের মত যা তারা ভেবেছিল যে ভাষাগুলি ইতিমধ্যে তাদের চারপাশে সরঞ্জামের অবকাঠামোগুলি দিয়ে পুরোপুরি গঠিত হয় spring

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

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

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

আপনি নিজের ভাষাটি কী দেখতে চান তা একবার স্কেচ করে নিলে আইনী এবং অবৈধ প্রোগ্রাম কী তা নির্ধারণের জন্য বিধিগুলি কী তা অবিকল লিখতে চেষ্টা করুন । সাধারণত আপনি তিনটি স্তরে এটি করতে চাইবেন:

  1. লেক্সিকাল : ভাষায় শব্দের নিয়ম কী, কোন অক্ষর বৈধ, সংখ্যাগুলির চেহারা কেমন, ইত্যাদি।
  2. সিনট্যাকটিক : ভাষার শব্দগুলি কীভাবে বৃহত্তর এককে একত্রিত করে? সি # বৃহত্তর ইউনিটগুলিতে এক্সপ্রেশন, স্টেটমেন্ট, পদ্ধতি, ক্লাস, ইত্যাদির মতো জিনিস।
  3. শব্দার্থিক : একটি চিহ্নগুলি সিন্টেক্সের আইনগত প্রোগ্রাম দেওয়া কিভাবে বুঝবেন কেউ কি প্রোগ্রাম কি আছে ?

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

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

আমি সি #, ভিবি, ভিবিএস স্ক্রিপ্ট, জাভাস্ক্রিপ্ট এবং অন্যান্য ভাষা ও সরঞ্জামগুলির ডিজাইন সম্পর্কে একটি ব্লগ লিখি; যদি এই বিষয়টি আপনার আগ্রহী হয় তবে এটি পরীক্ষা করে দেখুন। http://blogs.msdn.com/ericlippert (historical তিহাসিক ) এবং http://ericlippert.com (বর্তমান)

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

http://blogs.msdn.com/b/ericlippert/archive/2010/02/04/how-many-passes.aspx

অবশেষে, আপনি যদি বয়স্ক হওয়ার পরে এই জিনিসটি করার মতো কোনও কাজ সন্ধান করছেন তবে মাইক্রোসফ্টকে কলেজ ইন্টার্ন হিসাবে আসতে এবং বিকাশকারী বিভাগে যাওয়ার চেষ্টা করুন consider আজ আমার চাকরি দিয়ে এভাবেই শেষ!


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

6
@ থরবজর্ন: আসুন পরিভাষা সম্পর্কে পরিষ্কার। একটি "সংকলক" এমন কোনও ডিভাইস যা একটি প্রোগ্রামিং ভাষা থেকে অন্যটিতে অনুবাদ করে। সি # সংকলক যা সি # কে আইএল করে এবং একটি আইএল সংকলক ("জিটার") যা আইএলকে মেশিন কোডে রূপান্তরিত করে, সে সম্পর্কে একটি দুর্দান্ত জিনিস হ'ল আপনি সি # সংকলকটি আইএল (সহজ!) লিখতে পারেন, এবং প্রসেসর-নির্দিষ্ট অপ্টিমাইজেশানগুলি জিটারে রাখুন। কম্পাইলার অপ্টিমাইজেশানগুলি "সম্পন্ন হচ্ছে না" এমন নয়, জিট সংকলক দলটি আমাদের জন্য এটি করে। ব্লগস.এমএসডিএন
এরিক লিপার্ট

6
@ সাইক্লোটিস04: ইনফর্ম 6 জেড-কোডে সংকলন করে, যা বাইটোকোড-ভিত্তিক ভার্চুয়াল মেশিনের একটি বিখ্যাত অত্যন্ত প্রাথমিক উদাহরণ। ১৯৮০ এর দশকে এই সমস্ত ইনফোকম গেমস স্মৃতি থেকে বড় এবং একাধিক স্থাপত্যের জন্য বহনযোগ্য উভয়ই হতে পারে; গেমগুলি জেড-কোডে সংকলিত হয়েছিল এবং তারপরে কোড মেমরি পেজিং সহ জেড-কোড দোভাষী একাধিক মেশিনের জন্য প্রয়োগ করা হয়েছিল। আজকাল অবশ্যই আপনি যদি প্রয়োজন হয় তবে কব্জি ঘড়িতে একটি জেকোড ইন্টারপ্রেটার চালাতে পারেন, তবে সেই দিনে ফিরে এসেছিলেন যে উচ্চ প্রযুক্তি ছিল । বিশদ জানতে en.wikedia.org/wiki/Z-machine দেখুন ।
এরিক লিপার্ট

@ এরিকলিপার্ট কম্পাইলারটি কোনও ডিভাইস নয়, ডিভাইসটিতে এমন কিছু রয়েছে যা হার্ডওয়ার রয়েছে we আমরা একটি পূর্বনির্ধারিত প্রোগ্রাম বলতে পারি যা মেশিন কোডে ইনপুট ডেটা রূপান্তর করতে নিয়মের একটি সেট রয়েছে
ধরম

2
@ ধামস: একটি ডিভাইস কোনও নির্দিষ্ট উদ্দেশ্যে তৈরি করা কোনও জিনিস। আমি লিখেছি এমন প্রতিটি সংকলক হার্ডওয়্যারে চালিত হয়েছিল যা কম্পাইলারগুলির অস্তিত্বের অনুমতি দেওয়ার জন্য নির্মিত হয়েছিল purpose
এরিক লিপার্ট

127

লেকস কম্পাইলার এবং সমাবেশ ভাষা রচনার একটি আকর্ষণীয় ভূমিকা আপনাকে জ্যাক ক্রেনশোর দ্বারা সংকলন তৈরি করতে দেয়

লেখক এটিকে খুব সাধারণ রেখেছেন এবং প্রকৃত কার্যকারিতা তৈরিতে মনোনিবেশ করেছেন।


2
ক্রেনশোর পরিচিতি সম্পর্কে মজার বিষয় হ'ল এটি যেভাবে শেষ হয়েছে (স্পোলার: এটি অসম্পূর্ণ) আপনি যে বিষয়গুলিকে উপলব্ধি করতে সক্ষম হবেন, ঠিক সে সময়, আমার ভাষাটি বাস্তবায়ন শুরু করার আগে আমার পুরোপুরি ডিজাইন করা উচিত ছিল। এবং তারপরে আপনি বলছেন, আরে, যদি আমাকে একটি সম্পূর্ণ ভাষার স্পেসিফিকেশন লিখতে হয় তবে কেন এটি একটি আনুষ্ঠানিক স্বরলিপিটি না করে আমি পার্সার তৈরির জন্য একটি সরঞ্জামে খাওয়াতে পারি? এবং তারপরে আপনি এটি সবার মতো করছেন।
22-22 এ ক্যান্ডেল করুন

3
@ গাইবানাল, সরঞ্জামগুলি ব্যবহার করার কোনও কারণ আছে তা বুঝতে আপনি এটি হাতে হাতে করা দরকার।

72

"আমি সত্যিই এই জিনিসগুলি শিখতে চাই"। আপনি যদি দীর্ঘমেয়াদী গুরুতর হন:

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

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

  • স্ট্যান্ডার্ড সংকলক পাঠ্য সংগ্রহ করুন / পড়ুন: আহো / ওলম্যান ইত্যাদি etc. এগুলিতে সম্প্রদায় সাধারণত যা সম্মত হয় তা মৌলিক উপাদান। আপনি এই বইগুলি থেকে সমস্ত কিছু ব্যবহার নাও করতে পারেন তবে এটি আপনার কাছে থাকা উচিত এবং আপনি কেন এটি ব্যবহার করছেন না তা আপনার জানা উচিত। আমি ভেবেছিলাম মুচনিক দুর্দান্ত, তবে এটি বেশ উন্নত বিষয়ের জন্য।

  • একটি সংকলক তৈরি করুন একটি পচা তৈরি করে এখনই শুরু করুন। এটি আপনাকে কয়েকটি সমস্যা শিখিয়ে দেবে। একটি দ্বিতীয় তৈরি করুন। পদ্ধতি পুনরাবৃত্তি করুন। এই অভিজ্ঞতা আপনার বই শেখার সাথে বিশাল সমন্বয় তৈরি করে।

  • শুরু করার জন্য একটি দুর্দান্ত জায়গা হ'ল বিএনএফ (ব্যাকাস নওর ফর্ম), পার্সার্স এবং পার্সার-জেনারেটর সম্পর্কে শিখতে। বিএনএফ কার্যকরভাবে সংকলক জমিতে সর্বজনীনভাবে ব্যবহৃত হয়, এবং আপনি যদি না জানেন তবে আপনি আপনার সহকর্মী সংকলক-প্রকারের সাথে বাস্তবে কথা বলতে পারবেন না।

আপনি যদি সংকলনের একটি দুর্দান্ত প্রথম পরিচিতি চান, এবং বিএনএফের প্রত্যক্ষ মান কেবল ডকুমেন্টেশনের জন্য নয়, তবে একটি সরঞ্জাম-প্রসেসযোগ্য রূপান্তরক হিসাবে, এই " টিউটোরিয়ালটি (খনি নয়)" মেটা "সংকলক (সংকলক নির্মাণকারী সংকলক) নির্মাণের উপর ভিত্তি করে দেখুন থেকে কাগজ 1964 (হ্যাঁ, আপনি যে অধিকার পড়া) [ "মেটা দ্বিতীয় একটি বাক্য গঠন ওরিয়েন্টেড কম্পাইলার লেখার ভাষা" Val, Schorre দ্বারা। (http://doi.acm.org/10.1145/800257.808896)] এই আইএমএইচও এখন পর্যন্ত লিখিত একক সেরা কমপ্যাক্ট-সায়েন্স পেপারগুলির মধ্যে একটি: এটি আপনাকে 10 পৃষ্ঠায় সংকলক-সংকলক তৈরি করতে শেখায়। আমি এই কাগজ থেকে প্রাথমিকভাবে শিখেছি।

আমি উপরে যা লিখেছি তা ব্যক্তিগত অভিজ্ঞতা থেকে অনেকগুলি, এবং আমি মনে করি এটি আমাকে বেশ ভালভাবে পরিবেশন করেছে। ওয়াইএমএমভি, তবে আইএমএইচও, খুব বেশি নয়।


54
-1 উপরের কোনটিই প্রয়োজনীয় নয়।
নিল বাটারওয়ার্থ

77
@nbt উপরের কোনটিই প্রয়োজনীয় নয়। তবে উপরের সমস্তটি সহায়তা করে। সত্যিই অনেক।
কনরাড রুডলফ

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

26
আপনি যদি সংকলক তত্ত্বের উন্নত প্রযুক্তি সংক্রান্ত কাগজপত্রগুলি পড়তে চান তবে আপনি আরও ভাল গাণিতিকভাবে সক্ষম হয়ে উঠবেন। আপনি সেই সাহিত্য এবং আপনার তত্ত্বটিকে উপেক্ষা করার সিদ্ধান্ত নিতে পারেন এবং তাই সংকলকরা এর জন্য আরও দরিদ্র হবে। এখানকার নায়সায়াররা সকলেই এই বিষয়টি তুলে ধরেছেন যে আপনি প্রচুর আনুষ্ঠানিক শিক্ষা ছাড়াই সংকলক তৈরি করতে পারেন এবং আমি সম্মত। তারা মনে করে যে আপনি এটি ব্যতীত সত্যিই ভাল সংকলক তৈরি করতে পারেন। আমি নিতে যত্ন নিতে এটি বাজি না।
ইরা বাক্সার

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

46

এখানে একটি অনলাইন বই / কোর্স যে আপনি নামক অনুসরণ করতে পারেন এর প্রথম মূলনীতি থেকে একটি আধুনিক কম্পিউটার নির্মাণের: কম্পিউটিং সিস্টেম উপাদানসমূহ

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

অধ্যায়গুলি:

  1. কোর্স ওভারভিউ
  2. বুলিয়ান লজিক
  3. সম্মিলিত চিপস
  4. সিকোয়েন্সিয়াল চিপস
  5. যন্ত্রের ভাষা
  6. কম্পিউটার আর্কিটেকচার
  7. অ্যাসেম্বলার
  8. ভার্চুয়াল মেশিন I: পাটিগণিত
  9. ভার্চুয়াল মেশিন II: নিয়ন্ত্রণ
  10. প্রোগ্রাম ভাষা
  11. সংকলক প্রথম: সিনট্যাক্স বিশ্লেষণ
  12. সংকলক দ্বিতীয়: কোড উত্পন্নকরণ
  13. অপারেটিং সিস্টেম
  14. তালিকাবদ্ধ

যেতে আরও মজা


সম্পাদনা, অচেনা ব্যক্তির জন্য ধন্যবাদ। আমি বেশ কয়েকবার চেষ্টা করেছি কিন্তু বর্ণনার জন্য আমার চিন্তা যথেষ্ট মনোনিবেশ করতে পারিনি ... তবে বইটি উল্লেখ করতে চাইনি। বইটি এখন অনলাইন স্টাডি প্ল্যান লিঙ্কে: www1.idc.ac.il/tecs/plan.html । এটি অনলাইনেও খুব যুক্তিসঙ্গত দাম নির্ধারণ করা হয়। সবাই উপভোগ করুন।
জো ইন্টারনেট

আমি নিজেই এটিকে পরামর্শ দিতে যাচ্ছিলাম ... অলসতার জন্য, 10 মিনিটের পরিচয় পরীক্ষা করে দেখুন: ন্যান্ড থেকে টেট্রিস থেকে 12 ধাপে @ youtube.com/watch?v=JtXvUoPx4Qs
রিচার্ড অ্যান্টনি হেইন

46

এক ধাপ পেছনে যান. সংকলক হ'ল এমন একটি প্রোগ্রাম যা একটি ভাষায় একটি নথি অন্য ভাষায় একটি নথিতে অনুবাদ করে। উভয় ভাষা ভাল সংজ্ঞায়িত এবং নির্দিষ্ট হওয়া উচিত।

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

সংকলকটির আরেকটি উদাহরণ হ'ল এইচটিএমএল রেন্ডারিং ইঞ্জিন। এর ইনপুটটি একটি এইচটিএমএল ফাইল এবং আউটপুটটি স্ক্রিনে পিক্সেল আঁকতে নির্দেশের একটি সিরিজ।

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

আপনি কি এমন একটি প্রোগ্রাম লিখতে পারেন যা প্রতিটি শব্দকে স্ট্রিংয়ে উল্টে দেয়? উদাহরণ স্বরূপ:

When the cat's away, the mice will play.

হয়ে

nehW eht s'tac yawa, eht ecim lliw yalp.

এটি লিখতে কোনও কঠিন প্রোগ্রাম নয়, তবে কিছু বিষয় সম্পর্কে আপনার চিন্তা করা প্রয়োজন:

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

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

এটি সম্পর্কে: আপনি কী এমন কোনও প্রোগ্রাম লিখতে পারেন যা অঙ্কন নির্দেশাবলী নিয়ে চলে এবং একটি পিএনজি (বা জেপিইজি) ফাইল আউটপুট করে? এরকম কিছু হতে পারে:

image 100 100
background black
color red
line 20 55 93 105
color green
box 0 0 99 99

আবার, আপনাকে ভাষাটি সংজ্ঞায়িত করার জন্য কিছু চিন্তাভাবনা করতে হবে:

  • আদিম নির্দেশাবলী কি?
  • "রেখা" শব্দের পরে কী আসে? "রঙ" পরে কি আসে? একইভাবে "ব্যাকগ্রাউন্ড", "বাক্স" ইত্যাদির জন্য
  • একটি সংখ্যা কি?
  • একটি খালি ইনপুট ফাইল অনুমোদিত?
  • কথাটি মূলধন করা কি ঠিক আছে?
  • নেতিবাচক সংখ্যা অনুমোদিত?
  • আপনি যদি "চিত্র" নির্দেশনা না দেন তবে কী হবে?
  • কোনও রঙ নির্দিষ্ট না করা কি ঠিক?

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

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


7
myFirstCompiler = (str) -> ("" + (str || "")) বিভক্ত ('')। বিপরীত ()। join (''); jsfiddle.net/L7qSr
ল্যারি যুদ্ধ

21

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


4
দ্রষ্টব্য, এই বইটি থেকে সর্বাধিক পেতে আপনার আরও কিছুটা বাস্তব অভিজ্ঞতা প্রয়োজন হতে পারে। দুর্দান্ত রেফারেন্স, যদিও।

13
-1 যে কেউ এটি পড়েনি কেবল সে ড্রাগনের বইটি কোনও ভাল বলে ভাবতে পারে। এবং এটি বিশেষত প্রশ্নের সমাধান করে না।
নিল বাটারওয়ার্থ

33
ড্রাগন বুক? একজন উত্সাহী পনেরো বছর বয়সী জন্য? আমি বরং তাকে তার উত্সাহটি আরও দীর্ঘায়িত করতে চাই।
ডেভিড থর্নলে


@ ডেভিডথর্নলি তাকে সম্পূর্ণরূপে গণনা করবেন না (হ্যাঁ, আমি বুঝতে পারি এটি একটি খুব পুরানো পোস্ট)। আমি 15 বছর বয়সে ভাষা কীভাবে কাজ করে এবং বিশেষত ভার্চুয়াল মেশিনগুলিতে ফোকাস করে তা গবেষণা শুরু করি। এখন আমি 16 বছর এবং গবেষণা, লেখার এবং পুনর্লিখনের কয়েক মাস পরে আমার কাছে একটি কার্যনির্বাহী দোভাষী এবং সংকলক পেয়েছি যার সাথে আমি খুশি।
ডেভিড

10

"আসুন একটি সংকলক তৈরি করুন" ইতিমধ্যে পরামর্শ দেওয়া হয়েছিল। টার্বো পাস্কেলের পরিবর্তে হাস্কেল ব্যবহার করে একটি "আধুনিকীকরণ" সংস্করণ রয়েছে: http://alephnullplex.appspot.com/blog/view/2010/01/12/lbach-1- ভূমিকা

হাস্কেলের সাথে তাল মিলিয়ে একটি অত্যন্ত শিক্ষণীয় স্কিম ইন্টারপ্রেটার রয়েছে যা আরও ধারণা দিতে পারে: নিজেকে 48 ঘন্টার মধ্যে একটি স্কিম লিখুন


10

বিশ্বাস করবেন না যে একটি সংকলক বা কোনও ওএস সম্পর্কে যাদু আছে: সেখানে নেই। একটি স্ট্রিংয়ে সমস্ত স্বর গুনতে বা অ্যারেতে সংখ্যাগুলি যুক্ত করার জন্য আপনি লিখেছেন সেই প্রোগ্রামগুলি মনে রাখবেন? সংকলক ধারণার চেয়ে আলাদা নয়; এটি পুরোপুরি অনেক বড়।

প্রতিটি প্রোগ্রামের তিনটি পর্যায় রয়েছে:

  1. কিছু জিনিস পড়ুন
  2. স্টাফ প্রক্রিয়া: আউটপুট ডেটা ইনপুট ডেটা অনুবাদ
  3. কিছু অন্যান্য স্টাফ লিখুন - আউটপুট ডেটা

এটি সম্পর্কে চিন্তা করুন: সংকলক ইনপুট কি? উত্স ফাইল থেকে অক্ষরের একটি স্ট্রিং।

সংকলক থেকে আউটপুট কি? বাইটের একটি স্ট্রিং যা লক্ষ্য কম্পিউটারে মেশিনের নির্দেশাবলী উপস্থাপন করে।

তাই সংকলকের "প্রক্রিয়া" পর্বটি কী? এই পর্বটি কী করে?

আপনি বিবেচনা যে কম্পাইলার - অন্য কোন প্রোগ্রামের মত - হয়েছে এই তিনটি পর্যায়ক্রমে অন্তর্ভুক্ত করতে আপনাকে কিভাবে কম্পাইলার নির্মান করা হয় একটি ভাল ধারণা আছে।


3
যেমনটি নীল বলেছেন, সত্য কিন্তু কার্যকর নয়। পুনরাবৃত্তি ব্যাকরণ এবং প্রতীক টেবিলের মত মৌলিক সংকলক দিকগুলি স্বজ্ঞাতভাবে সুস্পষ্ট নয়।
ম্যাসন হুইলারের

1
@ ম্যাসন হুইলারের: আমি মনে করি যে কেউ বাস্তববাদীভাবে একটি সংকলক লিখতে আগ্রহী (এবং লক্ষ্য ভাষার নকশা তৈরি করতে চান?) সম্ভবত রিরসিভ ব্যাকরণ এবং প্রতীক টেবিলগুলি বেশ বেসিক ধারণা বলে মনে করবেন।
FumbleFingers

8

আমি বিশেষজ্ঞ নই, তবে এখানে আমার ছুরিকা:

আপনি একটি সংকলক লেখার বিষয়ে জিজ্ঞাসা করছেন বলে মনে হচ্ছে না, কেবল একটি এসেম্বেলার এটি আসলে যাদু নয়।

কাউকে এলওর উত্তর চুরি করে এসও ( https://stackoverflow.com/questions/3826692/how-do-i-translate-assembly-to-binary ) থেকে সমাবেশ দেখায়,:

label:  LDA #$00
        JMP label

তারপরে আপনি এটিকে একটি এসেম্বেলারের মাধ্যমে চালনা করুন এবং এরকম কিছুতে পরিণত করুন:

$A9 $00
$4C $10 $00

কেবল এগুলিই এইভাবে স্কোয়াশড হয়ে গেছে:

$A9 $00 $4C $10 $00

এটা আসলে যাদু নয়।

আপনি এটি নোটপ্যাডে লিখতে পারবেন না, কারণ নোটপ্যাড ASCII (হেক্স নয়) ব্যবহার করে। আপনি একটি হেক্স সম্পাদক ব্যবহার করবেন, বা কেবল প্রগতিগতভাবে বাইটগুলি লিখবেন। আপনি সেই ফাইলটি হেক্সটিকে কোনও ফাইলের বাইরে লিখুন, এটিকে "a.exe" বা "a.out" নাম দিন, তারপরে ওএসকে এটি চালিয়ে যেতে বলুন।

অবশ্যই, আধুনিক সিপিইউ এবং অপারেটিং সিস্টেমগুলি সত্যই বেশ জটিল, তবে এটি মূল ধারণা।

আপনি যদি একটি নতুন সংকলক লিখতে চান তবে এটি এখানে কীভাবে হয়:

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

2) একটি অনুবাদক লিখুন। আপনার ভাষাটি জাভাস্ক্রিপ্টে অনুবাদ করুন। এখন আপনার ভাষা একটি ব্রাউজারে চলবে।

৩) এলএলভিএম, সি বা অ্যাসেমব্লির মতো নিম্ন স্তরের কোনও অনুবাদককে লিখুন।

আপনি এখানে থামতে পারেন, এটি একটি সংকলক। এটি কোনও অনুকূলকরণকারী সংকলক নয়, তবে এটি ছিল না প্রশ্ন। আপনার লিঙ্কার এবং এসেম্বলার লেখার বিষয়েও বিবেচনা করা প্রয়োজন, তবে আপনি কি সত্যিই এটি চান?

4) (উন্মাদ) একটি অপ্টিমাইজার লিখুন। বড় দলগুলি এ নিয়ে কয়েক দশক ধরে কাজ করে।

4) (সানে) একটি বিদ্যমান সম্প্রদায়ে জড়িত হন। জিসিসিসি, এলএলভিএম, পাইপাই, যে কোনও মূল দোভাষী নিয়ে কাজ করছে মূল দল।


8

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

অ্যাপেল আপনাকে এমন একটি ভাষা কীভাবে সংকলন করতে পারে যা প্রাক-নকশাকৃত আসে, তবে বিভিন্ন ভাষার বৈশিষ্ট্যগুলি কী বোঝায় বা আপনার নিজস্ব ডিজাইনের ক্ষেত্রে তাদের আপেক্ষিক যোগ্যতার দিক দিয়ে কীভাবে সেগুলি সম্পর্কে চিন্তাভাবনা করতে পারে সে বিষয়ে বেশি সময় ব্যয় করে না। সেই দিকটির জন্য, প্রোগ্রামিং ভাষা: ধারণা এবং গঠনগুলি শালীন। কম্পিউটার ডিজাইনের ধারণা, কৌশল এবং মডেলগুলি ভাষা নকশা সম্পর্কে গভীরভাবে চিন্তা করার জন্য একটি ভাল বই, যদিও এটি একক ভাষার ( ওজ ) প্রেক্ষাপটে এটি করে ।

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


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


সম্পাদিত : সেথির সাথে ভুল আহো রেফারেন্সটি প্রতিস্থাপন করুন, সিটিএমসিপি উল্লেখ করুন।


উঃ, আমার আমার কলেজের দোভাষীদের ক্লাসের জন্য প্রোগ্রামিং ভাষার প্রয়োজনীয়তা ছিল। এটা আজব ব্যাপার ছিল. এমনকি আমি ব্যক্তিগতভাবেও স্কিম পছন্দ করি এবং বাক্য গঠনটি মনে করি না, এটি লেখকরা আমার কাছে ধারণার ধারণাগুলির দুর্বল ব্যাখ্যা ছিল expla
গ্রেগ গুইদা

আমি আপেলের ধারাবাহিকতাগুলির সংকলন পছন্দ করি তবে তার বইগুলি অনেক পূর্ববর্তী জ্ঞান ধরেছিল।
জন হ্যারোপ

6

আমাকে কলেজে ক্লাসের জন্য একটি সংকলক তৈরি করতে হয়েছিল।

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

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

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

শুভকামনা!


8
ধারণাটি সহজ? হ্যাঁ. আসলেই সহজ? নং
নীল বাটারওয়ার্থ

7
UHM। সংকলক, স্ক্যান / পার্সিংয়ের পরে টাইপ-চেকিং / ইনফারেন্স, অপ্টিমাইজেশন, রেজিস্টার বরাদ্দ ইত্যাদি করা দরকার to এই পদক্ষেপগুলি সহজ কিছু না হলেও। (দোহিত কোডটি ব্যবহার করার সময়, আপনি কেবল এই অংশগুলি রানটাইম পর্যায়ে
মুলতুবি করুন

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

6

পেটজোল্ডের বইয়ের কোডটি নন-টেকনিক্যালস এবং প্রযুক্তিবিদদের প্রথম সূত্র ধরে শুরু করার জন্য দুর্দান্ত ভূমিকা। এটি খুব পঠনযোগ্য এবং অত্যধিক ঝাঁকুনি না হয়ে তার স্কোপটিতে বিশাল।

এখন যে আমি এটি লিখেছি, আমি এটি আবার পড়তে হবে।



5

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

প্রথম প্রশ্নটি একটি কম্পিউটার কীভাবে কাজ করে? এইভাবে: ইনপুট -> গণনা -> আউটপুট।

প্রথমে "গণনা" অংশটি বিবেচনা করুন। আমরা কীভাবে ইনপুট এবং আউটপুট পরে কাজ করে তা দেখব।

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

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

এখন কম্পিউটার কীভাবে ইনপুট / আউটপুট সম্পাদন করে? আমি খুব সরলীকৃত উত্তর সরবরাহ করব। Http://en.wikedia.org/wiki/Input/ আউটপুট এবং http://en.wikedia.org/wiki/ আন্তঃবিধ দেখুন। আরো বেশী. এটি দুটি জিনিস ব্যবহার করে, এটি মেমরির তৃতীয় অংশ এবং এমন কিছু যা ইন্টারব্য্যাপস বলে। একটি কম্পিউটারের সাথে সংযুক্ত প্রতিটি ডিভাইস অবশ্যই প্রসেসরের সাথে ডেটা বিনিময় করতে সক্ষম হবে। এটি উল্লিখিত মেমরির তৃতীয় অংশটি ব্যবহার করে এটি করে। প্রসেসর প্রতিটি ডিভাইসে মেমরির এক স্লাইস বরাদ্দ করে এবং মেমরির এই স্লাইসের মাধ্যমে ডিভাইস এবং প্রসেসর যোগাযোগ করে। তবে প্রসেসর কীভাবে জানতে পারে যে কোন অবস্থানটি কোন ডিভাইসকে বোঝায় এবং কখন কোনও ডিভাইস ডেটা বিনিময় করতে হবে? এখানেই বাধা আসে। প্রসেসরের কাছে একটি বাধা হ'ল এটি বর্তমানে যা আছে তা বিরতি দেওয়ার জন্য এবং এর সমস্ত নিবন্ধগুলি একটি পরিচিত স্থানে সংরক্ষণ করে তারপরে অন্য কিছু করা শুরু করে to অনেকগুলি বাধা রয়েছে, প্রতিটি স্বতন্ত্র সংখ্যা দ্বারা চিহ্নিত হয়। প্রতিটি বাধার জন্য, এটির সাথে যুক্ত একটি বিশেষ প্রোগ্রাম রয়েছে। বাধা যখন আসে, প্রসেসর বিঘ্নিত অনুরূপ প্রোগ্রাম চালায়। এখন বায়োসের উপর নির্ভর করে এবং কীভাবে হার্ডওয়্যার ডিভাইসগুলি কম্পিউটার মাদারবোর্ডের সাথে সংযুক্ত থাকে, প্রতিটি ডিভাইস একটি অনন্য বাধা এবং মেমরির এক টুকরো পায়। বায়োসের সাহায্যে অপারেটিং সিস্টেম বুট করার সময় প্রতিটি ডিভাইসের বিঘ্ন এবং মেমরির অবস্থান নির্ধারণ করে এবং ডিভাইসগুলি সঠিকভাবে পরিচালনা করতে বাধা দেওয়ার জন্য একটি বিশেষ প্রোগ্রাম সেট আপ করে। সুতরাং যখন কোনও ডিভাইসের কিছু ডেটা প্রয়োজন হয় বা কিছু ডেটা প্রেরণ করতে চায় তখন এটি একটি বাধার সঙ্কেত দেয়। প্রসেসর যা করছে তা বিরতি দেয়, বাধা হ্যান্ডেল করে এবং তারপরে যা করছে তা ফিরে পায়। এইচডিডি, কীবোর্ড ইত্যাদির মতো বিভিন্ন ধরণের বাধা রয়েছে একটি গুরুত্বপূর্ণ হ'ল সিস্টেম টাইমার, যা নিয়মিত বিরতিতে একটি বাধা দেয়। এছাড়াও এমন ওপকোড রয়েছে যা বাধা বিঘ্নিত করতে পারে, যার নাম সফ্টওয়্যার বিঘ্ন।

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

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

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

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

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

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

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


4

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

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

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

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

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

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

এখন "2 * (3 + 4)" এর মতো কিছু গাণিতিক এক্সপ্রেশন গণনা করে এমন একটি ক্লাস (জাভাতে) সংকলনের চেষ্টা করুন। এই শ্রেণীটিকে আলাদা করে রাখুন, এমন একটি "খেলনা সংকলক" লিখুন যা এটি আবার একসাথে রাখতে পারে।


3

1) ওয়াশিংটন বিশ্ববিদ্যালয় থেকে দুর্দান্ত ভিডিও বক্তৃতা:

সিএসই পি 501 সংকলক নির্মাণ - শরৎ 2009 www.cs.washington.edu/education/courses/csep501/09au/lectures/video.html *

2) এসআইসিপি http://groups.csail.mit.edu/mac/classes/6.001/abelson-sussman-lectures/ এবং একই নামে বই। এটি আসলে যে কোনও সফ্টওয়্যার ইঞ্জিনিয়ারের জন্য বাধ্যতামূলক।

3) এছাড়াও, কার্যকরী প্রোগ্রামিং সম্পর্কে, হাস্কেল, ল্যাম্বদা ক্যালকুলাস, শব্দার্থবিজ্ঞান (ডিনোটেশনাল সহ) এবং কার্যকরী ভাষার জন্য সংকলক বাস্তবায়ন। আপনি 2005-এসএস-এফপি.ভি 10.2005-05-24.HDV থেকে শুরু করতে পারেন যদি আপনি ইতিমধ্যে হাস্কেলকে জানেন। ইউএক্সএক্স ভিডিওগুলি উত্তর। প্রথমে ভিএক্সএক্স ভিডিও অনুসরণ করুন ।

http://video.s-inf.de/#FP.2005-SS-Giesl.(COt).HD_Videoaufzeichnung

(ভিডিওগুলি ইংরাজীতে, অন্যান্য কোর্স যদিও জার্মান ভাষাতে রয়েছে))

  • নতুন ব্যবহারকারীরা কেবলমাত্র সর্বোচ্চ দুটি হাইপারলিঙ্ক পোস্ট করতে পারেন।

3

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

.NET বিশ্বে ডায়নামিক ল্যাঙ্গুয়েজ রানটাইম রয়েছে যা .NET বিশ্বে কোড উত্পন্ন করতে ব্যবহৃত হতে পারে। আমি জেন্ট্রাম নামে একটি অভিব্যক্তি ভাষা লিখেছি যা DLR ব্যবহার করে কোড উত্পন্ন করে। এটি আপনাকে স্থিতিশীল এবং গতিশীল টাইপযুক্ত এক্সপ্রেশনগুলি কীভাবে পার্স এবং কার্যকর করতে হবে তা দেখায়।


2

সংকলকরা কীভাবে কাজ করে এবং কীভাবে আপনার নিজস্ব প্রোগ্রামিং ভাষা তৈরি করতে হয় তার একটি সহজ পরিচয়ের জন্য আমি নতুন বই http://createyourproglang.com সুপারিশ করব যা ওএস / সিপিইউ ইন্টার্নাল, অর্থাৎ লেক্সার, পার্সার সম্পর্কে না জেনে ভাষা নকশা তত্ত্বকে আরও বেশি কেন্দ্রীভূত করে , দোভাষী, ইত্যাদি।

এটি সম্প্রতি ব্যবহৃত জনপ্রিয় কফি স্ক্রিপ্ট এবং অভিনব প্রোগ্রামিং ভাষা তৈরি করতে একই সরঞ্জামগুলি ব্যবহার করে ।


2

আপনি যা বলছেন তা যদি সত্য হয় তবে আপনার কাছে একজন প্রতিশ্রুতিশীল গবেষকের প্রোফাইল রয়েছে, এবং একটি দৃ concrete় বোঝাপড়া কেবল একটি উপায় পাওয়া যেতে পারে: অধ্যয়ন studying এবং আমি বলছি না " এই প্রতিভা দ্বারা রচিত এই সমস্ত উচ্চ স্তরের কম্পিউটার বিজ্ঞানের বইগুলি (বিশেষত এগুলি ) পড়ুন !"; আমার অর্থ: চার্লস ব্যাবেজ, অ্যালান টুরিং, ক্লাড শ্যানন বা ডেনিস রিচি এর মতো কম্পিউটার বিজ্ঞানী হওয়ার জন্য আপনাকে অবশ্যই উচ্চ স্তরের লোকের সাথে থাকতে হবে। আমি স্ব-শিক্ষিত লোককে ঘৃণা করছি না (আমি তাদের মধ্যে একজন) তবে সেখানে আপনার মতো খুব বেশি লোক নেই। আমি গম্ভীরভাবে সুপারিশ প্রতীকী সিস্টেম প্রোগ্রাম (এসএসপি)স্ট্যানফোর্ড বিশ্ববিদ্যালয় । তাদের ওয়েবসাইট যেমন বলে:

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

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

2

আমি বাম মাঠের বাইরে কিছু একটা পরামর্শ দিতে যাচ্ছি: পাইথন শিখুন (বা সম্ভবত রুবি, তবে পাইথনে আমার আরও অনেক অভিজ্ঞতা আছে তাই আমি এটাই নিয়ে আলোচনা করব)। এবং এটি কেবল ছিন্নমূল নয়, তবে সত্যই এটি গভীর স্তরে জানুন।

আমি এটি প্রস্তাব করার বিভিন্ন কারণ রয়েছে:

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

  2. পাইথনের স্ট্যান্ডার্ড বাস্তবায়ন (সিপিথন) ওপেন সোর্স এবং ভাল ডকুমেন্টেড, এটি হুডের নীচে ভাষা কীভাবে কাজ করে তা বুঝতে সহজ করে তোলে।

  3. পাইথন একটি সাধারণ বাইট কোডে সংকলিত হয় যা সমাবেশের চেয়ে বোঝা সহজ এবং যা পাইথন যে সমস্ত প্ল্যাটফর্মে একই কাজ করে। সুতরাং আপনি সংকলন সম্পর্কে শিখবেন (যেহেতু পাইথন আপনার উত্স কোডটি বাইট কোড সংকলন করে) এবং ব্যাখ্যা (যেমন এই বাইট কোডটি পাইথন ভার্চুয়াল মেশিনে ব্যাখ্যা করা হয়)।

  4. পাইথনের প্রচুর প্রস্তাবিত নতুন বৈশিষ্ট্য রয়েছে, নাম্বারযুক্ত পিইপিগুলিতে (পাইথন বর্ধন প্রস্তাবসমূহ) নথিভুক্ত। ভাষা ডিজাইনাররা কীভাবে কোনও বৈশিষ্ট্য বাস্তবায়নের উপায়টি বেছে নেওয়ার আগে এটি প্রয়োগ করার বিষয়টি বিবেচনা করেছিল তা জানতে আগ্রহী পিইপিগুলি interesting (এখনও বিবেচনাধীন PEPs এই ক্ষেত্রে বিশেষ আকর্ষণীয়।)

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

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

  7. পাইথনে, আপনি আসলে সংকলক দ্বারা উত্পাদিত বাইটকোডকে বিচ্ছিন্ন করতে পারেন, বা এমনকি আপনার নিজের স্ক্র্যাচ থেকে লিখতে পারেন এবং দোভাষী তাকে সম্পাদন করতে পারেন (আমি এটি নিজেই করেছি, এবং এটি মনের মত বাঁকানো তবে মজাদার ছিল)।

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

এই তদন্তকারী পদ্ধতিটি আরও আনুষ্ঠানিক পদ্ধতির সাথে ভালভাবে যেতে পারে, কারণ আপনি যে ভাষায় কাজ করছেন তার মধ্যে আপনি যে ধারণাগুলি অধ্যয়ন করেছেন সেগুলি এবং এর বিপরীতে আপনি চিনতে শুরু করবেন।

আনন্দ কর!


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

1

ঠিক আছে, আমি মনে করি আপনার প্রশ্নটি "কম্পিউটার বিজ্ঞানের ডিগ্রির মূল ব্যবহারিক ধারণাগুলি কী" এবং এটির উত্তরটি অবশ্যই কম্পিউটার বিজ্ঞানে আপনার নিজস্ব স্নাতক প্রাপ্ত হতে পারে w

মৌলিকভাবে, আপনি কোনও পাঠ্য ফাইল পড়ে এটি থেকে তথ্য বের করে, এবং আপনি যে তথ্যটি পড়েছেন তার উপর ভিত্তি করে পাঠ্যের উপর রূপান্তর সম্পাদন করে আপনার নিজের প্রোগ্রামিং ভাষার সংকলক তৈরি করেন, যতক্ষণ না আপনি এটিকে পড়তে পারেন লোডার (সিএফ, লভেনের লিঙ্কারস এবং লোডার) একটি তুচ্ছ সংকলকটি প্রথমবারের জন্য করা হলে মোটামুটি কঠোর প্রকল্প।

একটি অপারেটিং সিস্টেমের হৃদয় হ'ল কর্নেল, যা সংস্থানগুলি পরিচালনা করে (যেমন, মেমরি বরাদ্দ / বাতিলকরণ), এবং কার্য / প্রক্রিয়া / প্রোগ্রামগুলির মধ্যে স্যুইচ করে।

একটি এসেমব্লার একটি পাঠ্য-> বাইট রূপান্তর trans

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

আমি এটি সিতে লেখার সুপারিশ করব; সি সেই স্তরের কাজের জন্য লিঙ্গুয়া ফ্র্যাঙ্কা।


1
অন্যদিকে, এটি খুব উচ্চ-স্তরের ভাষার জন্য একটি দুর্দান্ত জায়গা। যতক্ষণ না আপনি কোনও ফাইলের স্বতন্ত্র বাইট নির্ধারণ করতে পারেন, আপনি যে কোনও ভাষায় একটি সংকলক / এসেম্বলার (যা সহজ) তৈরি করতে পারেন। বল, পার্ল। বা ভিবিএ। স্বর্গ, সম্ভাবনা!
আয়ান

1

কেনেথ লাউডেনের বই "সংকলক নির্মাণ" দেখুন

http://www.cs.sjsu.edu/~louden/cmptext/

এটি সংকলন বিকাশের জন্য আরও ভাল একটি পদ্ধতির সরবরাহ করে।

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


1

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

একই উদ্ঘাটনটির আর একটি প্রবেশদ্বার হ'ল মিক্স "সমাবেশের ভাষা নথ তার উদাহরণগুলিতে ব্যবহার করে। "মিক্স" আজ প্রত্নতাত্ত্বিক বলে মনে হচ্ছে, তবে এটি এখনও ডি-মায়াবী প্রভাব রয়েছে।


0

সংকলক এবং প্রোগ্রামিং ল্যাঙ্গুয়েজ (এবং একটি গঠনের অন্তর্ভুক্ত সবকিছু - যেমন একটি সীমাবদ্ধ ব্যাকরণ এবং সমাবেশে রূপান্তর হিসাবে সংজ্ঞা দেওয়া) একটি অত্যন্ত জটিল কাজ যা সামগ্রিকভাবে সিস্টেমগুলি সম্পর্কে প্রচুর বোঝাপড়ার প্রয়োজন। এই ধরণের কোর্সটি সাধারণত বিশ্ববিদ্যালয়ের তৃতীয় / চতুর্থ বর্ষের কমপ সায়েন্স ক্লাস হিসাবে দেওয়া হয়।

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

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


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

তিনি ভাষা নকশা এবং সংকলক শিখতে চেয়েছিলেন এর সাথে সাথেই তিনি বলেছিলেন যে ওএস সম্পর্কে তিনি শিখতে চান।
ডেভিড থর্নলে

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

দুঃখিত ... (বিল্ডিং?) ওএসএস সম্পর্কে শিখতে চাইছেন না missed আমার বক্তব্য দাঁড়িয়ে আছে: সংকলকগুলির জন্য তাঁর প্রচুর ওএস জ্ঞানের প্রয়োজন নেই। প্রকৃতপক্ষে, এটি প্রায় সম্পূর্ণরূপে আলাদা একটি বিষয় বাদে যেখানে সংকলক এবং ওএস কিছু সম্মিলিত উদ্দেশ্য অর্জনের জন্য ইন্টারঅ্যাক্ট করে। (উদাহরণস্বরূপ, গ্লোবাল ভিএম সক্ষম করার জন্য কয়েকটি উপায়ে ফাংশন কলগুলি তৈরি করতে মাল্টিকগুলি তার পিএল / 1 সংকলকগুলির প্রয়োজন)।
ইরা বাক্সটার

0

এটি একটি বড় বিষয় নয় বরং আপনাকে মুগ্ধ করে "ছোকরা পড়ুন একটি বই, বাচ্চা" দিয়ে মুছে ফেলার পরিবর্তে আমি আনন্দের সাথে আপনাকে আপনার মাথাটি মুড়ে দেওয়ার জন্য আপনাকে পয়েন্টার দেব।

বেশিরভাগ সংকলক এবং / অথবা দোভাষী এই জাতীয় কাজ করে:

টোকেনাইজ করুন : কোড পাঠ্যটি স্ক্যান করুন এবং এটিকে টোকেনের তালিকায় বিভক্ত করুন।

এই পদক্ষেপটি জটিল হতে পারে কারণ আপনি কেবল ফাঁকা জায়গাগুলিতে স্ট্রিংটি বিভক্ত করতে পারবেন না, আপনাকে if (bar) foo += "a string";এটি 8 টি টোকেনের তালিকা: স্বীকৃতি দিতে হবে: WORD, OPEN_PAREN, WORD, CLOSE_PAREN, WORD, ASIGNMENT_ADD, STRING_LITERAL, TERMINATOR আপনি দেখতে পাচ্ছেন, খালি জায়গাগুলিতে সোর্স কোডটি বিভক্ত করা কার্যকর হবে না, আপনাকে প্রতিটি অক্ষরকে ক্রম হিসাবে পড়তে হবে, সুতরাং যদি আপনি কোনও বর্ণানুক্রমিক চরিত্রের মুখোমুখি হন তবে আপনি অক্ষরগুলি পড়া অবধি চালিয়ে যান যতক্ষণ না আপনি একটি অ্যালফানাম চরিত্র এবং সেই স্ট্রিংটিতে আঘাত না করেন শুধু পড়ার একটি ওয়ার্ড যা পরে আরও শ্রেণিবদ্ধ করা হয়। আপনার টোকেনাইজারটি কতটা দানাদার তা আপনি নিজেই স্থির করে নিতে পারেন: এটি "a string"STRING_LITERAL নামক একটি টোকেন হিসাবে গিলে পরে আরও পার্স করার জন্য, বা এটি দেখে কিনা"a string" ওপেন_কোটি, ইউএনপ্রেসডটেক্সট, ক্লোলোকোয়েট বা যাই হোক না কেন, কোডিং করার সাথে সাথে আপনার নিজের সিদ্ধান্ত নিতে পারা এটি কেবলমাত্র একটি পছন্দ।

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

বিশ্লেষণ করুন : সুতরাং এখন আপনি if (bar) foo += "a string";এমন লেক্সড টোকেনগুলির একটি তালিকা ঘুরিয়েছেন যা দেখতে এইরকম: যদি ওপেন_প্যারেন আইডেন্টিফার ক্লুলারপেন আইডেন্টিফায়ার এএসআইএন_এডিডি STRING_LITERAL টার্মিনেটর। পদক্ষেপটি টোকেনের ক্রমকে বিবৃতি হিসাবে স্বীকৃতি দিচ্ছে। এটি পার্সিং হয়। আপনি ব্যাকরণ ব্যবহার করে এটি করুন যেমন:

স্ট্যাটেন্ট: = এএসআইজিএন_এক্সপ্রেসন | IF_STATEMENT

আইএফপ্যাটেমেন্ট: = আইএফ, প্যারেন_এক্সপ্রেসন, স্ট্যাটামেন্ট

এএসআইজিএন_এক্সপ্রেসন: = আইডেন্টিফায়ার, এএসআইজিএন_ওপি, ভ্যালু

PAREN_EXPPressSION: = OPEN_PAREN, VALUE, CLOSE_PAREN

মান: = আইডেন্টিফায়ার | STRING_LITERAL | PAREN_EXPRESSION

ASIGN_OP: = EQUAL | এএসআইজিএন_এডিডি | ASIGN_SUBTRACT | ASIGN_MULT

যে প্রযোজনাগুলি "|" ব্যবহার করে শর্তগুলির মধ্যে অর্থ "এর সাথে কোনওটির সাথে মিলে যাওয়া", যদি এটির শর্তাবলীর মধ্যে কমা থাকে তবে এর অর্থ "শর্তগুলির এই ক্রমটি মেলান"

আপনি কিভাবে এটি ব্যবহার করব? প্রথম টোকেন দিয়ে শুরু করে, এই প্রযোজনাগুলির সাথে আপনার টোকেনগুলির ক্রমটি মিলানোর চেষ্টা করুন। সুতরাং প্রথমে আপনি আপনার টোকেন তালিকাকে স্ট্যাটামেন্টের সাথে মেলে দেখার চেষ্টা করুন, সুতরাং আপনি স্ট্যাটামেন্টের বিধিটি পড়েন এবং এটিতে বলা হয় "একটি স্ট্যাটামেন্ট হয় এএসআইজিএন_এক্সপ্রেসন বা একটি আইপিপ্যাটেমেন্ট" তাই আপনি প্রথমে এএসআইজিএন_এক্সপ্রেসনের সাথে মেলে যাবার চেষ্টা করুন, তাই আপনি এএসআইজিএন_এক্সপ্রেশনের ব্যাকরণের নিয়মটি সন্ধান করুন এবং এটিতে বলা হয়েছে "ASIGN_EXPPressION একটি IDENTIFIER এবং তারপরে একটি ASIGN_OP এর পরে একটি ভ্যালু হয়, সুতরাং আপনি আইডেন্টিফায়ারের জন্য ব্যাকরণের নিয়মটি দেখেছেন এবং দেখেন যে পরিচয়কারীর জন্য কোনও ব্যাকরণ রুক নেই তাই এর অর্থ পরিচয়দাতা একটি" টার্মিনাল "যার অর্থ এটি আর প্রয়োজন হয় না এটি মিলানোর জন্য পার্সিং করা যাতে আপনি এটি সরাসরি আপনার টোকেনের সাথে মেলে দেখার চেষ্টা করতে পারেন But তবে আপনার প্রথম উত্স টোকেনটি যদি একটি আইএফ হয়, এবং আইএফ আইডেন্টিফায়ার হিসাবে একই নয় তবে ম্যাচটি ব্যর্থ হয়েছিল। এখন কি? আপনি STATEMENT নিয়মে ফিরে যান এবং পরবর্তী শব্দটির সাথে মেলে দেখার চেষ্টা করুন: আইএফপ্যাটেমেন্ট। আপনি যদি আইএফপিএটিএমএনটি অনুসন্ধান করেন, এটি আইএফ দিয়ে শুরু হয়, যদি আইএফ-এর অনুসন্ধান শুরু হয়, আইএফ যদি একটি টার্মিনাল হয়, আপনার প্রথম টোকেনের সাথে টার্মিনালের তুলনা করুন, যদি টোকেন ম্যাচ করে, দুর্দান্ত চলছে, পরের শব্দটি PAREN_EXPressionION, অনুসন্ধানে পারেন_এক্সপ্রেসন, এটি টার্মিনাল নয়, এটি প্রথম পদটি কী, PAREN_EXPPressION OPEN_PAREN দিয়ে শুরু হয়, অনুসন্ধান OPEN_PAREN, এটি একটি টার্মিনাল, আপনার পরবর্তী টোকেনের সাথে OPEN_PAREN এর সাথে মেলে, এটি মিলছে, .... ইত্যাদি on

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

প্রতিবার পার্স () এএসআইজিএন_এক্সপ্রেসনের মতো একটি প্রোডাকশনের সাথে মেলে আপনি সেই কাঠামোর টুকরো উপস্থাপন করে একটি কাঠামো তৈরি করেন। এই কাঠামোটিতে মূল উত্স টোকেনগুলির উল্লেখ রয়েছে। আপনি এই কাঠামোর একটি তালিকা তৈরি শুরু করেন। আমরা এই পুরো কাঠামোটিকে বিমূর্ত সিনট্যাক্স ট্রি (এএসটি) বলব

সংকলন এবং / বা সম্পাদন করুন : আপনার ব্যাকরণে কিছু নির্দিষ্ট প্রোডাকশনের জন্য আপনি হ্যান্ডলার ফাংশন তৈরি করেছেন যে কোনও এএসটি কাঠামো দেওয়া হলে এটি এএসটির সেই অংশটিকে সংকলন বা সম্পাদন করে।

সুতরাং আসুন আপনার এএসটি-র অংশটি দেখুন যা এএসআইজিএন_এডিডি টাইপ করে। সুতরাং একজন দোভাষী হিসাবে আপনার কাছে একটি ASIGN_ADD_execute () ফাংশন রয়েছে। এই ফাংশনটি পার্স গাছের সাথে মিলে যায় এমন এএসটি অংশ হিসাবে পাস করা হয়েছে foo += "a string", সুতরাং এই ফাংশনটি সেই কাঠামোটির দিকে নজর দেয় এবং এটি জানে যে কাঠামোর প্রথম পদটি অবশ্যই একটি পরিচয়কারী হতে হবে, এবং দ্বিতীয় পদটি অবশ্যই ভ্যালু, সুতরাং ASIGN_ADD_execute () VALU পদটি একটি VALUE_eval () ফাংশনে পাস করে যা মেমরিতে মূল্যায়নকৃত মানকে উপস্থাপন করে এমন কোনও বস্তু ফেরত দেয়, তারপরে ASIGN_ADD_execute () আপনার ভেরিয়েবল সারণীতে "foo" এর অনুসন্ধান করে এবং eval_value () দ্বারা ফিরে আসা যা কিছু আছে তার একটি রেফারেন্স সঞ্চয় করে) ফাংশন।

এটি একটি দোভাষী। একটি সংকলক এর পরিবর্তে হ্যান্ডলার ফাংশনগুলি এএসটি কার্যকর করার পরিবর্তে বাইট কোড বা মেশিন কোডে অনুবাদ করে।

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

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

এগুলি পড়ুন, এবং শুভকামনা!

http://www.iro.umontreal.ca/~felipe/IFT2030-Automne2002/Complements/tinyc.c

http://en.wikipedia.org/wiki/Recursive_descent_parser


2
লোকেরা সংকলনের বিষয়ে ভাবলে আমি যা ক্লাসিক ভুল হিসাবে বিবেচনা করি তা আপনি করেন: সমস্যাটি বিশ্বাস করে যে পার্সিং করা। পার্সিং প্রযুক্তিগতভাবে সহজ; এটি করার জন্য দুর্দান্ত প্রযুক্তি রয়েছে। সংকলন সম্পর্কে কঠোর অংশটি সিনেটিক বিশ্লেষণ, উচ্চতর এবং নিম্ন স্তরের প্রোগ্রামের উপস্থাপনা এবং কোডের উত্পন্নকরণকে আজকাল পার্লল কোডটিতে ক্রমবর্ধমান জোর দিয়ে is আপনি আপনার উত্তরে এটি সম্পূর্ণরূপে তুচ্ছ করুন: "এএসটি বাইট কোডে অনুবাদ করার জন্য একটি সংকলকের হ্যান্ডলার ফাংশন থাকবে"। সংকলক তত্ত্ব এবং ইঞ্জিনিয়ারিংয়ের সেখানে লুকিয়ে রয়েছে 50 টি বিচ্ছিন্ন বছর।
ইরা বাক্সার

0

কম্পিউটার ক্ষেত্রটি কেবল জটিল কারণ এতে অনেক দিক থেকেই বিকশিত হওয়ার সময় ছিল। এর হৃদয়ে এটি কেবল মেশিনগুলি সম্পর্কে গণনা করা হয়।

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

বিষয়টি হ'ল এটির প্রয়োজনীয়তা না বুঝে কোনও কিছু বোঝা শক্ত । শুভকামনা, এবং কেবল স্টাফ না পড়ুনকি জিনিস।


-1

Http://mikeos.berlios.de/ এ দেখুন

X86 অ্যাসেমব্লিতে একটি খুব সহজ অপারেটিং সিস্টেম রয়েছে।

স্ক্র্যাচ থেকে কীভাবে একটি সাধারণ ওএস লিখতে হয় তার একটি সুন্দর টিউটোরিয়াল রয়েছে।


-1

আর একটি ভাল প্রবর্তনাকারী বই হ'ল 1983 সাল থেকে এন ওয়ার্থের "কমপাইলারবাউ" (সংকলক নির্মাণ) যা প্রায় 100 পৃষ্ঠা দীর্ঘ এবং খেলোয়াড় ভাষা পিএল / 0 এর জন্য সংক্ষিপ্ত, ভাল ডিজাইন করা কোড, পার্সার, কোড জেনারেটর এবং ভার্চুয়াল মেশিন সহ ব্যাখ্যা করে। এটি কীভাবে EBNF স্বরলিখনের ব্যাকরণ করতে ব্যাকরণে পড়ে এমন একটি পার্সার লিখতে পারে তাও দেখায়। বইটি জার্মান ভাষায় রয়েছে তবে আমি একটি সংক্ষিপ্ত বিবরণ লিখে কোডটি পাইথনকে অনুশীলন হিসাবে অনুবাদ করেছি, দেখুন http://www.d12k.org/cmplr/w86/intro.html


-1

আপনি যদি প্রোগ্রামিং ভাষার সারমর্ম বুঝতে আগ্রহী হন তবে আমি প্রস্তাব দেব যে আপনি পিএলএআই (http://www.cs.brown.edu/~sk/Publications/Books/ProgLangs/) বইয়ের মাধ্যমে ধারণাটি বুঝতে এবং তাদের বাস্তবায়ন এটি আপনার নিজের ভাষার নকশা তৈরিতে আপনাকে সহায়তা করবে।


-1

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

  • অনুমোদিত সংখ্যা
  • অনুমোদিত অপারেটর
  • অপারেটর অগ্রাধিকার
  • সিনট্যাক্স বৈধতা
  • পরিবর্তনশীল চেহারা আপ প্রক্রিয়া
  • চক্র সনাক্তকরণ
  • অপ্টিমাইজেশান

উদাহরণস্বরূপ, আপনার নীচের সূত্রগুলি রয়েছে, আপনার ক্যালকুলেটরটি x এর মান গণনা করতে সক্ষম হবে:

a = 1
b = 2
c = a + b
d = (3 + b) * c
x = a - d / b

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

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