পাইথন রানটাইম আসলে কীভাবে কাজ করে?


26

এ এর ধারণাটি বুঝতে আমার কিছুটা সমস্যা রয়েছে runtime library, বিশেষত পাইথন একটি one তাই আমি কিছু হ্যালো ওয়ার্ল্ড অজগর প্রোগ্রাম লিখেছি এবং এটি কার্যকর করার মনস্থ করি, তাই আমি লিখি python ./hello_world.py

এন্টার বোতামটি চাপানো এবং আমার সিপিইউতে আমার পাইথন কোড থেকে উত্পাদিত মেশিন কোডের মধ্যে কী পদক্ষেপ ঘটে? এবং এটি কীভাবে পাইথন রানটাইম সিস্টেম এবং / অথবা লাইব্রেরির সাথে সম্পর্কিত?


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

উত্তর:


33

তারা যতটা বৈচিত্র্যময়, মুষ্টিমেয় প্রচলিত ধারণাগুলি রয়েছে যা সমস্ত গুরুতর, আধুনিক প্রোগ্রামিং ভাষাগুলি ভাগ করে। উপরে দুটি আপনার প্রশ্নের উত্তরের মূল দুটি।

এন্টার বোতামটি চাপানো এবং আমার সিপিইউতে আমার পাইথন কোড থেকে উত্পাদিত মেশিন কোডের মধ্যে কী পদক্ষেপ ঘটে?

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

সংকলকটি পার্সার দিয়ে শুরু হয় , একটি রুটিন যা আপনার উত্স কোডটি পড়ে এবং ভাষাটির সিনট্যাক্স বিধিগুলিকে এটিতে বৈধ পাইথন (আপনার ক্ষেত্রে) কোড হিসাবে বিবেচনা করে কিনা তা নির্ধারণ করার জন্য এটিটিতে প্রয়োগ করে। যদি এটি না হয়, পার্সারটি একটি ত্রুটি ছুঁড়ে দেবে এবং সংকলকটি বিল হয়ে যাবে, তবে এটি যদি হয় তবে পার্সার সংক্ষিপ্তসার হিসাবে অ্যাবস্ট্রাক্ট সিনট্যাক্স ট্রি বা এএসটি হিসাবে পরিচিত যা আউটপুট করে। এএসটি হ'ল একটি ট্রি ডেটা স্ট্রাকচার, যার নোডগুলিতে প্রতিটি সিনট্যাক্সের একটি উপাদান থাকে। উদাহরণস্বরূপ, আপনি যদি বলেন x = 5, আপনি BinaryExpressionএকটি operatorমান =, একটি Leftমান ReferenceExpression(x)এবং একটি Rightমান সঙ্গে একটি নোড দিয়ে শেষ হতে পারে IntegerLiteralExpression(5)। আপনার পুরো প্রোগ্রামটি এর মতো একটি বড় গাছ দ্বারা প্রতিনিধিত্ব করা যেতে পারে।

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

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

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

এবং এটি কীভাবে পাইথন রানটাইম সিস্টেম এবং / অথবা লাইব্রেরির সাথে সম্পর্কিত?

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


সুতরাং আমার কোডটি অন্য প্রোগ্রামে (পাইথন রানটাইম সিস্টেম) খাওয়ানো হয়েছে যা সমস্ত কিছু করে এবং আমার কোড শেষ হয়ে গেলে (এবং অবশ্যই ক্লিনআপের পরে) শেষ হয়?
hgiesel

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

5

স্ট্যান্ডার্ড পাইথন বাস্তবায়ন একটি বাইট কোড ভার্চুয়াল মেশিন। এর অর্থ হ'ল মেশিন কোড (আপনার প্রসেসরের অপকোড সেট থেকে অপকডস) আপনার প্রোগ্রাম থেকে তৈরি করা হয়নি । অপকডগুলি কেবলমাত্র অপকডগুলি থেকে নির্বাচিত হয় যা ইতিমধ্যে ভার্চুয়াল মেশিনে সংকলিত হয়েছে যখন ভিএম বাইট কোডটি ব্যাখ্যা করে।

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

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