পাইথনের ব্যাখ্যা করা, বা সংকলিত, বা উভয়ই?


190

আমার বোঝার থেকে:

একটি ব্যাখ্যা ভাষা একটি উচ্চ পর্যায়ের ভাষা রান এবং একজন দোভাষী দ্বারা সঞ্চালিত (ক প্রোগ্রাম মেশিন কোডে উচ্চ পর্যায়ের ভাষা পরিবর্তন করে এবং তারপর নির্বাহ) চলতে চলতে হয়; এটি একবারে প্রোগ্রামটি প্রসেস করে।

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

আমার সংজ্ঞাগুলি ভুল হলে আমাকে সংশোধন করুন।

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



2
পাইথন যখনই কোনও লাইব্রেরি আমদানি করা হয় তখন .pyc ফাইলগুলি (তথাকথিত বাইকোড) তৈরি করে। বাইটকোডকে আফ্রিক করুন কেবলমাত্র প্রয়োগের সময় নয়, লোডের সময়ের গতি বাড়িয়ে তুলতে পারে।
জেসভিন জোস

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

অভদ্র শব্দ শুনতে চান না, তবে আমি যা বোঝাতে চাইছি তা নয় (তবে আপনার মতো অবহিত নয়)?
জেসভিন জোস

1
@ আইচনইয়ু: আপনি কী বলতে চেয়েছিলেন তা আমি জানি না। আমি কেবল জানি যে আপনার মন্তব্যটি ভুল ছিল না তবে এটি কেবলমাত্র লোডের সময়কে কেন গতি দেয়, এমন কিছু পটভূমির তথ্যের জন্য ভাল বিরোধিতা সরবরাহ করেছিল , তাই আমি সেই তথ্য যুক্ত করার সিদ্ধান্ত নিয়েছি। কোনও অপরাধ বোঝানো বা নেওয়া হয়নি :)

উত্তর:


231

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

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

তবে নাইটপিকিং বন্ধ করতে এবং আপনার জিজ্ঞাসা করা প্রশ্নের উত্তরটির জন্য: ব্যবহারিকভাবে (পড়ুন: কিছুটা জনপ্রিয় এবং পরিপক্ক বাস্তবায়ন ব্যবহার করে), পাইথন সংকলিত হয়েছে । সময়ের আগে মেশিন কোডে সংকলন করা হয়নি (যেমন সীমাবদ্ধ এবং ভুল দ্বারা "সংকলিত" তবে হায় সাধারণ প্রচলিত সংজ্ঞা), বাইটকোডে "কেবল" সংকলিত , তবে এটি কমপক্ষে কিছু সুবিধা নিয়ে সংকলন করেছে। উদাহরণস্বরূপ, বিবৃতিটি a = b.c()একটি বাইট স্ট্রিমে সংকলিত হয়েছে যা "বিচ্ছিন্ন" হওয়ার পরে কিছুটা দেখতে লাগে load 0 (b); load_str 'c'; get_attr; call_function 0; store 1 (a)। এটি সরলকরণ, এটি আসলে কম পাঠযোগ্য এবং কিছুটা নিম্ন-স্তরের - আপনি স্ট্যান্ডার্ড লাইব্রেরি disমডিউলটি নিয়ে পরীক্ষা করতে পারেন এবং আসল চুক্তিটি দেখতে কেমন তা দেখতে পারেন।

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


2
ঠিক আছে, এর অর্থ হ'ল পাইথন স্ক্রিপ্টটি প্রথমে বাইটোকোডে সংকলিত হয় এবং তারপরে এটি সিপিথন, জাইথন ​​বা আয়রন পাইথন ইত্যাদির মতো অনুবাদক দ্বারা প্রয়োগ করা হয়
পঙ্কজ উপাধ্যায়

19
না, এটি বাইটকোডে সংকলিত হয় এবং তারপরে বাইটকোডটি সংশ্লিষ্ট ভিএম দ্বারা সম্পাদিত হয়। সিপিথন হ'ল সংকলক এবং ভিএম উভয়ই তবে জাইথন ​​এবং আয়রন পাইথন কেবল সংকলক।
ইগনাসিও ওয়াজকেজ-আব্রামস

1
@ ইগ্যাসিও: আয়রন পাইথন / জাইথনের সাথে আমার খুব বেশি অভিজ্ঞতা নেই, তবে কমপক্ষে জাইথন ​​কোনও দোভাষী-জাতীয় স্তর সরবরাহ করে না? আমি বিশ্বাস করি না যে পাইথনকে স্ট্যাটিক্যালি টাইপযুক্ত জেভিএম বাইটকোডে পরিণত করার চেষ্টা করা সম্ভব as তবুও, একই প্যাকেজের অংশ হয়ে সংকলক এবং দোভাষী সম্পর্কে ভাল বিষয়।

2
+1 "... বাস্তবায়নের একটি সম্পত্তি"। আমি নিজেই বলতাম "এটি একটি ইন্টারেক্টিভ শেলটির জন্য অনুমতি দেয়"
জেসভিন জোস

2
@ ডেলান: আচ্ছা, জাইথন ​​পাইথন ভাষা এবং জাভা ভিএম এর মধ্যে এক ধরণের মধ্যস্থতাকারী হিসাবে কাজ করে তবে এটি জাভা বাইটকোড সংকলন করে।
ইগনাসিও ওয়াজকেজ-আব্রামস

34

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

পাইথন ইন্টারপ্রেটার প্রথমে মানব কোডটি পড়ে এবং মেশিন কোডে ব্যাখ্যা করার আগে কিছু মধ্যবর্তী কোডে এটি অনুকূল করে তোলে। এজন্য সি ++ এর বিপরীতে পাইথন স্ক্রিপ্ট চালানোর জন্য আপনার সর্বদা অন্য প্রোগ্রামের প্রয়োজন হয় যেখানে আপনি সরাসরি আপনার কোডের সংকলন সম্পাদনযোগ্য চালাতে পারেন। উদাহরণস্বরূপ, c:\Python27\python.exeবা /usr/bin/python


11
"[এটি] চালানোর জন্য অন্য প্রোগ্রামের প্রয়োজন" সম্পর্কে আমি এই বিষয়টি পছন্দ করি। এটি আমার কিছু চিন্তাভাবনা পরিষ্কার করতে সহায়তা করেছে।
ম্যাট

সুতরাং পাইথন.এক্সই প্রথমে কোডটি অনুকূলিত করে তার অর্থ ব্যাখ্যা করে?
Koray Tugay

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

31

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

তবে আসুন আমরা পিপাই ব্যবহার করছি যা অন্য একটি স্ট্যান্ডার্ড সিপাইথন বাস্তবায়ন। এটি একটি জাস্ট-ইন-টাইম সংকলক ব্যবহার করবে ।


বাইটকোডে অনুবাদ করার সময় এটির একটি সংকলক প্রয়োজন যা কোনটি?
ধনী

পাইপাই পাইথন বাস্তবায়ন, কোনও "সিপিথন" বাস্তবায়ন নয়। আসলে, পাইপি সিপিথনের একটি বিকল্প ( পাইপ.অর্গ / ফিচারস.চ.টি.এম.এল )।
জর্জিও

13

পাইথনের অফিসিয়াল ওয়েবসাইট অনুসারে এটি একটি ব্যাখ্যা করা ভাষা।

https://www.python.org/doc/essays/blurb/

পাইথন হ'ল ব্যাখ্যামূলক, অবজেক্ট-ভিত্তিক, উচ্চ-স্তরের প্রোগ্রামিং ভাষা ...

...

যেহেতু কোনও সংকলন পদক্ষেপ নেই ...

...

পাইথন দোভাষী এবং বিস্তৃত স্ট্যান্ডার্ড লাইব্রেরি উপলব্ধ ...

...

পরিবর্তে, দোভাষী যখন একটি ত্রুটি আবিষ্কার করেন, তখন এটি একটি ব্যতিক্রম উত্থাপন করে। প্রোগ্রামটি ব্যতিক্রমটি ধরতে না পারলে, দোভাষী একটি স্ট্যাক ট্রেস মুদ্রণ করেন।


7

হ্যাঁ, এটি উভয়ই সংকলিত এবং বর্ণিত ভাষা। তাহলে আমরা কেন এটিকে সাধারণত বর্ণিত ভাষা বলি?

এটি উভয় সংকলিত এবং ব্যাখ্যা করা হয় কিভাবে দেখুন?

সবার আগে আমি বলতে চাই যে আপনি জাভা বিশ্ব থেকে এসেছেন তবে আমার উত্তরটি আপনার পছন্দ হবে।

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

জাভাক হ্যালো.জভা -------> হ্যালো.ক্লাস ফাইল তৈরি করে

জাভা হ্যালো --------> এ বাইটকোড নির্দেশনা জেভিএম সঞ্চালনের উদ্দেশ্যে

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

পাইথন হ্যালো.পি -------> কোডটি সরাসরি উত্সাহিত করে এবং আমরা আউটপুটটি দেখতে পাই যে কোডটি সিনথেটিকভাবে সঠিক

@ পাইথন হ্যালো.পি এটি দেখে মনে হচ্ছে এটি সরাসরি কার্যকর হয় তবে সত্যিকার অর্থে এটি প্রথমটি বাইটকোড উত্পন্ন করে যা কার্যকারীর উদ্দেশ্যে স্থানীয় কোড তৈরি করতে দোভাষী দ্বারা ব্যাখ্যা করা হয়।

সিপিথন - সংকলন এবং ব্যাখ্যা উভয়েরই দায়িত্ব নেয়।

আপনার আরও বিশদ প্রয়োজন হলে নীচের লাইনে দেখুন :

আমি উল্লেখ হিসাবে যে CPython সোর্স কোড প্রনয়ন পারে তবে প্রকৃত সংকলন সাহায্যে ঘটে cython তারপর ব্যাখ্যা সাহায্যে ঘটে CPython

এখন জাভা এবং পাইথনের জাস্ট-ইন-টাইম সংকলকের ভূমিকা সম্পর্কে কিছুটা কথা বলি

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

পাইথন মধ্যে অর্জন করা দ্রুত সঞ্চালনের অন্য পাইথন বাস্তবায়ন (ব্যবহার অনুবাদক কাছাকাছি পেতে PyPy পরিবর্তে) CPythonপাইপাই সহ পাইথন সহ অন্যান্য বাস্তবায়নের জন্য এখানে ক্লিক করুন


6

যদি (আপনি জাভা জানেন) {

পাইথন কোডটি জাভা যেমন বাইটকোডে রূপান্তরিত হয়।
আপনি যখনই এটি অ্যাক্সেস করার চেষ্টা করবেন তখন বাইটকোডটি আবার কার্যকর করা হয়।

} অন্য {

পাইথন কোড প্রাথমিকভাবে মধ্যে traslated হয় কিছু বাইটকোড নামক
মেশিন ভাষা থেকে যে বেশ কাছে কিন্তু প্রকৃত মেশিন কোড
, যাতে প্রতিটি সময় আমরা অ্যাক্সেস বা এটি চালানোর যে বাইটকোড আবার মৃত্যুদন্ড কার্যকর করা হয়

}


2

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


1

নবাবিদের জন্য

পাইথন আপনার স্ক্রিপ্টটি স্বয়ংক্রিয়ভাবে সংকলিত কোডে সংকলিত করে, এটি চালানোর আগে বাইট কোড বলে।

স্ক্রিপ্ট চালানো কোনও আমদানি হিসাবে বিবেচিত হবে না এবং কোনও .pyc তৈরি হবে না।

উদাহরণস্বরূপ, যদি আপনার কাছে একটি স্ক্রিপ্ট ফাইল থাকে যা aby.py অন্য মডিউল xyz.py আমদানি করে, আপনি যখন abc.py চালান, xyz.pyc তৈরি হবে xyz আমদানি করার পরে, তবে abc.pyc ফাইল তৈরি হবে না ab পাই আমদানি হচ্ছে না


0

আপনি যে পাইথন কোডটি লিখেছেন তা পাইথন বাইটকোডে সংকলিত হয়েছে, যা পিপাই এক্সটেনশন সহ ফাইল তৈরি করে। সংকলন করা হলে, আবার প্রশ্ন হল কেন ভাষা সংকলন করা হবে না।

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

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


0

পাইথন (দোভাষী) সংকলিত

প্রুফ: এটি আপনার কোডটি সংকলন করবে না যদি এতে সিনট্যাক্স ত্রুটি থাকে

উদাহরণ 1:

print("This should print") 
a = 9/0 

আউটপুট:

This should print
Traceback (most recent call last):
  File "p.py", line 2, in <module>
    a = 9/0
ZeroDivisionError: integer division or modulo by zero

কোড সফলভাবে সংকলিত হয়। প্রথম লাইনটি কার্যকর করা হয় ( print) দ্বিতীয় লাইন নিক্ষেপ করে ZeroDivisionError(রান টাইম ত্রুটি)।

উদাহরণ 2:

print("This should not print")
/0         

আউটপুট:

  File "p.py", line 2
    /0
    ^
SyntaxError: invalid syntax

উপসংহার : আপনার কোড ফাইলটিতে SyntaxErrorকিছু না থাকলে সংকলন ব্যর্থ হওয়ায় কার্যকর হবে না।

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