পাইথনকে ব্যাখ্যা করা হলে, .pyc ফাইলগুলি কী কী?


1083

আমাকে বোঝার জন্য দেওয়া হয়েছে যে পাইথন একটি ব্যাখ্যাযুক্ত ভাষা ...
তবে আমি যখন পাইথন উত্স কোডটি দেখি তখন .pycফাইলগুলি দেখি যা উইন্ডোজ "সংকলিত পাইথন ফাইলস" হিসাবে চিহ্নিত করে।

এগুলি কোথায় আসে?


3
একটি ন্যায়সঙ্গততার জন্য stackoverflow.com/questions/11433579/… দেখুন । এক কথায়: গতি।
ব্যবহারকারী 7610



এটির অর্থ কি জাথার মতো অজগর এমনকি 'একবার লিখুন, কোথাও চালান' আছে?
ম্রাক ভ্লাদার

2
@ ম্রাকভ্ল্যাডার এমনকি জাভা হ'ল "একবার লিখুন, যে কোনও জায়গায় চালান [আপনার কাছে একটি জেভিএম আছে]"। পাইথন আলাদা নয়; এটি "আপনার পাইথন ভার্চুয়াল মেশিনটি যে কোনও জায়গায় চালান"। বড় পার্থক্য হ'ল বেশিরভাগ পাইথন বাস্তবায়নগুলি সংযোজক এবং দোভাষীকে একটি নির্বাহযোগ্য হিসাবে মিশ্রিত করে না javaএবং তাদের পছন্দ এবং এর চেয়ে আলাদা করে দেয় javac
চিপনার

উত্তর:


660

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

পাইথনের ডকুমেন্টেশনগুলি এর সংজ্ঞাটি ব্যাখ্যা করে:

পাইথন একটি সংকলিতটির বিপরীতে বর্ণিত ভাষা, যদিও বাইটকোড সংকলক উপস্থিতির কারণে পার্থক্যটি ঝাপসা হতে পারে। এর অর্থ হ'ল উত্স ফাইলগুলি সরাসরি চালানো যেতে পারে নির্ধারিতভাবে এক্সিকিউটেবল তৈরি না করে যা তখন চালানো হয়।


10
আকর্ষণীয়, ধন্যবাদ। তাহলে পাইথনকে খাঁটি ব্যাখ্যা করা ভাষা হিসাবে বিবেচনা করা হয়?
froadie

194
@ ফোরডি: কোনও ভাষা "ব্যাখ্যা করা" বা "সংকলিত" নয়। একটি নির্দিষ্ট বাস্তবায়ন কোনও দোভাষী বা সংকলক (বা একটি সংকর বা একটি জেআইটি সংকলক) হতে পারে।
জোছিম সউর

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

20
পেডেন্টিক হতে, 'সংকলিত' এর অর্থ 'অনুবাদিত'। পাইথনটি তখন বাইকোডে সংকলিত হয়। আফাইক, কেবল বাশকেই সত্যই ব্যাখ্যা করা হয়, অন্যান্য জনপ্রিয় "অনুবাদিত" ভাষাগুলি একটি বাইটোকোডে সংকলিত।
bfontaine

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

994

পাইথন হ'ল ব্যাখ্যা করা ভাষা ...

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

"বাইবেল" হ'ল "একটি বই" বইয়ের (প্রকৃত, শারীরিক বস্তু হিসাবে চিহ্নিত) বইগুলির বর্গ হিসাবে অর্থে ; "বাইবেলের অনুলিপি" হিসাবে চিহ্নিত বইগুলির সাধারণ কিছু ধারণা রয়েছে (বিষয়বস্তু, যদিও সেগুলি বিভিন্ন ভাষায় হতে পারে, বিভিন্ন গ্রহণযোগ্য অনুবাদ, পাদটীকা এবং অন্যান্য টীকাগুলির স্তর রয়েছে) - তবে, সেই বইগুলি হ'ল এক্ষেত্রে মৌলিক হিসাবে বিবেচিত হয় না এমন একাধিক দিকের মধ্যে পুরোপুরি ভালভাবে অনুমতি দেওয়া হয়েছে - যেমন ধরণের বাঁধাই, বাঁধার রঙ, প্রিন্টিংয়ে ব্যবহৃত ফন্ট (গুলি), চিত্র যদি থাকে তবে বিস্তৃত লিখিত মার্জিন বা না, সংখ্যা এবং বিল্টিন বুকমার্কের ধরণ , এবং তাই এবং তাই ঘোষণা.

এটি বেশ সম্ভব যে বাইবেলের একটি সাধারণ মুদ্রণটি অবশ্যই হার্ডকভার বাঁধাইয়ের মধ্যে থাকবে - সর্বোপরি, এটি এমন একটি বই যা সাধারণত বার বার পড়ার অর্থ, বিভিন্ন স্থানে বুকমার্ক করা, প্রদত্ত অধ্যায় এবং শ্লোকের পয়েন্টার সন্ধানের মাধ্যমে থাম্বড করা , ইত্যাদি, ইত্যাদি, এবং একটি ভাল হার্ডকভার বাঁধাই এই জাতীয় ব্যবহারের অধীনে একটি প্রদত্ত অনুলিপি দীর্ঘস্থায়ী করতে পারে। যাইহোক, এগুলি জাগতিক (ব্যবহারিক) সমস্যাগুলি যা প্রদত্ত প্রকৃত বইয়ের বস্তু বাইবেলের অনুলিপি কিনা তা নির্ধারণ করতে ব্যবহার করা যায় না: পেপারব্যাক মুদ্রণগুলি পুরোপুরি সম্ভব!

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

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

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

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

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

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


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

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

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

181

দোভাষী ভাষার মতো জিনিস নেই। কোনও দোভাষী বা সংকলক ব্যবহৃত হয়েছে তা নিখুঁতভাবে প্রয়োগের বৈশিষ্ট্য এবং ভাষার সাথে যা করার তা একেবারেই কিছুই নেই।

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

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

বিশেষত, আপনি যদি বর্তমানে বিদ্যমান পাইথন বাস্তবায়নগুলি দেখে থাকেন তবে এগুলি তারা ব্যবহার করছে এমন বাস্তবায়ন কৌশল:

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

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

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

বিশেষত, আপনি যে .pycফাইলগুলি দেখছেন তা হ'ল সিপিথন, স্ট্যাকলেস পাইথন বা আনলাডেন গলাধারা দ্বারা উত্পাদিত বাইটকোড ফাইলগুলি ached


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

4
@ গ্রেগগো: এবং আপনি যদি আরও পুরানো-বিদ্যালয়ে যেতে চান তবে বেসিকের মূল সংস্করণটি একটি স্থানীয় কোড সংকলক ছিল। এটি "সংকলিত" বা "ব্যাখ্যা" ভাষার ধারণাটি কতটা হাস্যকর তা প্রমাণ করা উচিত।
Jörg ডব্লু মিটাগ

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

সাইথন ২০০৯ সালে সায়পাইয়ের উল্লেখ করা হয়েছিল, তবে ২০১০ সালে ফিরে এ সম্পর্কে না জানার জন্য আমি আপনাকে ক্ষমা করতে পারি (এখানে আমি কেবলমাত্র এখনই এটি সম্পর্কে শিখছি 2017 সালে আছি)। তবুও আমাদের একটি জাভাস্ক্রিপ্ট উদাহরণ খুঁজে পাওয়া উচিত ... জাইথন ​​আমার কাছে কোনও ধারণা রাখেনি (২০০৯ সালের মধ্যে জাভা ইতিমধ্যে মারা গিয়েছিল? ভাল হুঁ, সম্ভবত না ... সি ++ বাস্ট তখন খুব ভাল ছিল না)
ব্যক্তিগত_ক্লাউড

1
@ ব্যক্তিগত_ক্লাউড: আমি আপনার মন্তব্যটি পুরোপুরি অনুসরণ করি না। হ্যাঁ, অবশ্যই, আমি সিথন সম্পর্কে জানি, তবে এর কোনও কিছুর সাথে কী আছে? এটি পাইথনের বাস্তবায়ন নয়, এটি সম্পূর্ণ আলাদা ভাষা। এছাড়াও, একটি জাভাস্ক্রিপ্ট উদাহরণ খুঁজে পাওয়া সত্যিই কঠিন নয়, বাস্তবে, বর্তমানে বিদ্যমান সমস্ত মূলধারার জাভাস্ক্রিপ্ট বাস্তবায়নগুলির সংকলক রয়েছে। শেষ অবধি, জাইথন ​​পাইথনের অন্য বাস্তবায়নের মতো পাইথনের বাস্তবায়ন। এবং এটি জাভা প্ল্যাটফর্মের অন্যান্য ভাষার প্রয়োগের মতো জাভা প্ল্যাটফর্মের কোনও ভাষার প্রয়োগ platform
Jörg ডব্লু মিটাগ

61

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


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

44

লোডিং মডিউলগুলি গতি বাড়ানোর জন্য, পাইথন .pyc এ মডিউলগুলির সংকলিত সামগ্রীকে ক্যাশে করে।

সিপথন তার উত্স কোডটি "বাইট কোড" তে সংকলন করে এবং কার্য সম্পাদনের কারণে, যখনই উত্স ফাইলটিতে পরিবর্তন আসে তখন এটি ফাইল সিস্টেমে এই বাইট কোডটি ক্যাশে করে। এটি পাইথন মডিউলগুলি লোড করা আরও দ্রুত করে তোলে কারণ সংকলন পর্বটি বাইপাস করা যেতে পারে। যখন আপনার উত্স ফাইলটি foo.py হয়, সিপিথন উত্সের ঠিক পাশেই একটি foo.pyc ফাইলে বাইট কোডটি ক্যাশে করে।

পাইথন 3-তে পাইথনের আমদানি যন্ত্রপাতি প্রতিটি পাইথন প্যাকেজ ডিরেক্টরিতে একটি একক ডিরেক্টরিতে বাইট কোড ক্যাশে ফাইলগুলি লিখতে এবং অনুসন্ধান করতে প্রসারিত হয়। এই ডিরেক্টরিটিকে __pycache__ বলা হবে।

মডিউলগুলি কীভাবে লোড হয় তা বর্ণনা করার জন্য এখানে একটি ফ্লো চার্ট দেওয়া হয়েছে:

এখানে চিত্র বর্ণনা লিখুন

আরও তথ্যের জন্য:

রেফ: পিইপি 3147
রেফ: পাইথন ফাইলগুলি "সংকলিত"


38

এটি নতুনদের জন্য,

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

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

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

আমদানিকৃত নয় এমন মডিউলের জন্য যদি আপনার একটি .pyc ফাইল তৈরি করতে হয় তবে আপনি py_compileএবং compileallমডিউলগুলি ব্যবহার করতে পারেন ।

py_compileমডিউল যে কোনো মডিউল কম্পাইল করতে পারেন। একটি উপায় হ'ল py_compile.compileসেই মডিউলটিতে ক্রিয়াটি ইন্টারেক্টিভভাবে ব্যবহার করা:

>>> import py_compile
>>> py_compile.compile('abc.py')

এটি abc.py হিসাবে একই স্থানে .pyc লিখবে (আপনি এটি alচ্ছিক পরামিতি দিয়ে ওভাররাইড করতে পারেন cfile)।

আপনি কম্পাইলল মডিউলটি ব্যবহার করে ডিরেক্টরি বা ডিরেক্টরিতে সমস্ত ফাইল স্বয়ংক্রিয়ভাবে সংকলন করতে পারেন।

python -m compileall

যদি ডিরেক্টরিটির নাম (এই উদাহরণের বর্তমান ডিরেক্টরি) বাদ দেওয়া হয় তবে মডিউলটি পাওয়া সমস্ত কিছু সংকলন করে sys.path


6
এবং abc.py পেতে সংকলনের সুবিধা কী?
সাহের আহওয়াল

@ সাহের অহওয়াল একটি উপকারটি আমি ভাবতে পারি সিনট্যাক্স পরীক্ষা করা।
ই বাও

20

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

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

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


12

পাইথনের * .py ফাইলটি কেবলমাত্র একটি পাঠ্য ফাইল যাতে আপনি কোডের কয়েকটি লাইন লিখেন। আপনি যখন "পাইথন ফাইলনাম.পি" ব্যবহার করে এই ফাইলটি কার্যকর করার চেষ্টা করবেন

এই কমান্ডটি পাইথন ভার্চুয়াল মেশিনকে আহ্বান জানায়। পাইথন ভার্চুয়াল মেশিনের 2 টি উপাদান রয়েছে: "সংকলক" এবং "দোভাষী"। ইন্টারপ্রেটার সরাসরি * .py ফাইলে পাঠ্যটি পড়তে পারেন না, সুতরাং এই পাঠ্যটি প্রথমে একটি বাইট কোডে রূপান্তরিত হয় যা পিভিএমকে লক্ষ্যযুক্ত (হার্ডওয়্যার নয় পিভিএম) । পিভিএম এই বাইট কোডটি কার্যকর করে। * .pyc ফাইলটি তৈরির অংশ হিসাবে শেল বা অন্য কোনও ফাইলে আপনার আমদানি অপারেশন সম্পাদন করে running

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

একবার * .pyc ফাইলটি তৈরি হয়ে গেলে, আপনি এটি সম্পাদনা না করে * * .PY ফাইলের প্রয়োজন হয় না।


7

পাইথন কোডটি 2 পর্যায়ে যায়। প্রথম পদক্ষেপটি কোডটিকে .pyc ফাইলগুলিতে সংকলন করে যা আসলে একটি বাইকোড। তারপরে এই .pyc ফাইলটি (বাইটোকোড) সিপিথন ইন্টারপ্রেটার ব্যবহার করে ব্যাখ্যা করা হবে। এই লিঙ্কটি দেখুন দয়া করে । এখানে কোড সংকলন এবং সম্পাদন প্রক্রিয়া সহজ শর্তে ব্যাখ্যা করা হয়।

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