পাইথন ব্যাখ্যা বা সংকলিত হয়?


76

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

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

এখন পাইথনে আসছেন :

  • আমদানি করা হলে পাইথন কোড ( somefile.py ) একই ডিরেক্টরিতে একটি ফাইল তৈরি করে ( somefile.pyc )। আসুন আমরা আমদানিটি পাইথন শেল বা জ্যাঙ্গো মডিউলে সম্পন্ন করি। আমদানির পরে আমি কোডটি কিছুটা পরিবর্তন করেছি এবং আমদানি করা ক্রিয়াকলাপগুলি আবার কার্যকর করি এটি সন্ধান করে যে এটি এখনও পুরানো কোডটি চলছে। এটি সুপারিশ করে যে * .pyc ফাইলগুলি সি ফাইলের সংকলনের পরে নির্বাহযোগ্য হিসাবে তৈরি অজগর ফাইলগুলির অনুরূপ সংকলিত হয়, যদিও আমি সরাসরি * .pyc ফাইল চালাতে পারি না।
  • যখন পাইথন ফাইল (somefile.py) সরাসরি (./somefile.py বা পাইথন somefile.py) সম্পাদন করা হয় তখন কোনও .pyc ফাইল তৈরি হয় না এবং কোডটি কার্যকর করা হয় যা ব্যাখ্যা করা আচরণ নির্দেশ করে।

এগুলি থেকে বোঝা যায় যে একটি পাইপ তৈরি করতে নতুন প্রক্রিয়ায় প্রতিবার পাইথন কোডটি প্রতিবার সংকলিত হয় যখন এটি সরাসরি সম্পাদন করার সময় ব্যাখ্যা করা হয়।

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

উইকের বর্ণিত ভাষা পৃষ্ঠা অনুসারে, এটি ভার্চুয়াল মেশিন কোডে সংকলিত ভাষা হিসাবে তালিকাভুক্ত হয়েছে, এর অর্থ কী?


1
রুবি কোন ব্যাখ্যাপ্রাপ্ত ভাষা কিনা তা নিয়ে কখন সন্দেহ রয়েছে? এটি সংকলিত যখন। :) macruby.org
mipadi

8
এটি লক্ষণীয় যে কোনও আধুনিক ভাষার কঠোর অর্থে ব্যাখ্যা করা হয় না। কার্যত তাদের সমস্তই বাইকোডে সংকলন করে।
উইনস্টন ইওয়ার্ট

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

6
>> বিপরীতে সি একটি সংকলিত ভাষা << root.cern.ch/drupal/content/cint
igouy

3
@ এস.লোট: অ্যাপলসফট এবং '80 এর দশকের বেসিক দোভাষীরা "বাইটকোড সংকলন" করেছেন এমন টোকেনাইজেশন প্রক্রিয়াটি কল করা কিছুটা বিভেদযুক্ত নয়। হ্যাঁ, ব্যবহারকারীর দ্বারা প্রবেশ করা প্রোগ্রাম কোডটি একটি সংকীর্ণ আকারে মেমরির মধ্যে সংরক্ষিত ছিল, সংরক্ষিত প্রতি শব্দ প্রতি বাইট, তবে আপনি টাইপ না করা পর্যন্ত এর বাইরে কিছুই করা হয়নি RUN। মনে হচ্ছিল আপনার কাছে একটি সংকলক রয়েছে যা লেক্সিং পদক্ষেপটি করেছে এবং তারপরে টোকেনের একটি স্ট্রিম আউটপুট দেয় যা প্রতিবার প্রোগ্রামটি চালিত হওয়ার পরে পুনর্বার করা হয়েছিল। আধুনিক বাইটকোড সংকলনের মতো মোটেও তা নয়, বলুন javac, যা লেক্সিং, পার্সিং এবং অপ্টিমাইজেশনকে অন্তর্ভুক্ত করে।
dodgethesteamroller

উত্তর:


80

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

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

(আমি "বেশ কিছুটা" বলি কারণ পাইথনের কোনও নেটিভ মেশিন সংকলক সম্পর্কে আমি জানি না, তবে আমি দাবি করতে চাই না যে কোথাও কোথাও নেই))


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

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

5
সিথন পাইথন কোড সি তে সংকলন করে যাতে এটি একটি ভাগ করা অবজেক্ট হিসাবে সংকলন করা যায়।
গ্রেফ্যাড

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

@Jules কাকতালীয়ভাবে, Jython কোড আসলে ফাইল যা আমি বিশ্বাস করি পুনঃব্যবহৃত করা হয় .class না হওয়া পর্যন্ত আপনি PY উৎস সংশোধন মধ্যে কম্পাইল করা হয়।
জিমি জেমস

35

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

ভাষার বিভিন্ন প্রয়োগের গতির তুলনা করার জন্য আপনি এখানে চেষ্টা করতে পারেন ।


তথ্যের জন্য থ্যাঙ্কস। বেঞ্চমার্ক অনুসারে অজগরটির পারফরম্যান্স কিছুটা কমছে!
crodjer

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

1
@ জেস 21 - "2006 এর জন্য আমার পরিকল্পনা সাইকো থেকে পাইপাইতে প্রয়োগ করা কৌশলগুলি পোর্ট করা Py পাইথন ভাষা। " psyco.sourceforge.net/intrration.html
igouy

1
@ jase21 - "সি কাউন্টারের অংশের তুলনায় পাইথন কোডগুলি দ্রুত চালিত করে" - আমাদের কি কেবল এটির জন্য আপনার শব্দটি নেওয়া উচিত?
igouy

3
উত্তরের লিঙ্কটি নষ্ট হয়ে গেছে।
বেসিলিভ

11

সংকলিত বনাম ব্যাখ্যা করা কিছু প্রসঙ্গে সহায়ক হতে পারে, তবে প্রযুক্তিগত দিক থেকে প্রয়োগ করা গেলে এটি একটি মিথ্যা দ্বিবিজ্ঞান।

একটি সংকলক (বিস্তৃত অর্থে) একজন অনুবাদক । এটি প্রোগ্রাম বি তে প্রোগ্রাম বি অনুবাদ করে এবং ভবিষ্যতে মৃত্যুর জন্য এটি একটি মেশিন এম ব্যবহার করে

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


উদাহরণস্বরূপ, নিন re.compile। এটি একটি মধ্যবর্তী ফর্মের একটি রেজেক্সকে "সংকলন" করে, এবং সেই মধ্যবর্তী ফর্মটি ব্যাখ্যা / মূল্যায়ন / সম্পাদিত হয়।


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

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


7

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

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

আমি যতদূর জানি রুবি> = 1.9 পাইথনের মতো ভার্চুয়াল মেশিন ব্যবহার করে।


5

পাইথন রানটাইম ভার্চুয়াল মেশিনে কাস্টম অবজেক্ট কোড (বাইট কোড) চালায়।

সংকলন প্রক্রিয়া উত্স কোডকে অবজেক্ট কোডে রূপান্তর করে।

জিনিসগুলিকে গতি বাড়ানোর জন্য, অবজেক্ট কোড (বা বাইট কোড, আপনি যদি পছন্দ করেন) ডিস্কে সঞ্চিত থাকে, সুতরাং পরের বার প্রোগ্রামটি চালানোর সময় এটি পুনরায় ব্যবহার করা যেতে পারে।

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