পাইথনের সংকলকটির দরকার নেই কেন?


29

শুধু ভাবছি (এখন যে আমি সি ++ দিয়ে শুরু করেছি যার একটি সংকলক প্রয়োজন) পাইথনের কেন একটি সংকলক প্রয়োজন নেই?

আমি কেবল কোডটি প্রবেশ করি, এটি একটি নির্বাহক হিসাবে সংরক্ষণ করি এবং এটি চালাই। সি ++ এ আমাকে বিল্ডস এবং অন্যান্য মজাদার সমস্ত জিনিস তৈরি করতে হবে।


4
পাইথন হ'ল বহু বাস্তবায়ন সহ এক ভাষা। আয়রন পাইথন একইভাবে সি # এবং সি ++ সংকলিত হয়েছে এবং এর মতো অন্যান্য বাস্তবায়নও হতে পারে।
কাজ

1
সি # এবং সি ++ একইভাবে সংকলিত হয় না - যদিও আপনি যুক্তি দিতে পারেন যে এগুলি উভয়ই শেষ পর্যন্ত মেশিনের নির্দেশ হিসাবে শেষ হয়েছে, তবে আপনি যদি তা করতে পারেন তবে বেসিকটিও একইভাবে সংকলিত হয়েছে বলতে পারেন।
gbjbaanb

7
@gbjbaanb তবে তারপরে আবারও ইংরেজী সংকলন করা হয়নি এবং একটি বাক্যটির অর্থগত বিশ্লেষণ দুটি সমানভাবে বৈধ ফলাফল পেতে পারে এবং উপরেরটি "লোহা অজগর ঠিক যেমন সি # এবং সি ++ সংকলিত হয়েছে" হিসাবে পড়তে পারে
রুন এফএস

আপনার পাইথন কোডটি লেখার জন্য আপনি কোন প্ল্যাটফর্ম / সফটওয়্যার ব্যবহার করছেন? আপনি যদি একটি .py ফাইল লিখে থাকেন তবে এটি কার্যকর করা যায় না। এটি এখনও একটি উত্স কোড ফাইল। কমান্ড লাইন থেকে আপনি python.py ফাইলটি ব্যাখ্যা করতে কমান্ডটি ব্যবহার করছেন বা আপনি IDLE ব্যবহার করেন বা আইডিই গ্রহন করলে এটি আপনার জন্য করে।
রিক হেন্ডারসন

উত্তর:


68

পাইথনের একটি সংকলক রয়েছে! আপনি কেবল এটি লক্ষ্য করবেন না কারণ এটি স্বয়ংক্রিয়ভাবে চলে। আপনি এটি সেখানে বলতে পারেন, যদিও: মডিউলগুলির জন্য উত্পন্ন ফাইলগুলি .pyc(বা .pyoযদি আপনি অপ্টিমাইজার চালু করেন) দেখুন import

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

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


সংকলক বা লিঙ্কারের ক্রিয়াকলাপকে প্রভাবিত করতে পারে এমন কিছু জিনিস কিন্তু সি বা সি ++ এর সিনট্যাক্সের মধ্যে নির্দিষ্ট করা হয়নি:

  • নির্ভরতা রেজোলিউশন
  • বাহ্যিক গ্রন্থাগার প্রয়োজনীয়তা (নির্ভরতা আদেশ সহ)
  • অপ্টিমাইজার স্তর
  • সতর্কতা সেটিংস
  • ভাষা স্পেসিফিকেশন সংস্করণ
  • লিঙ্কার ম্যাপিংস (কোন বিভাগটি চূড়ান্ত প্রোগ্রামে যায়)
  • লক্ষ্য আর্কিটেকচার

এর মধ্যে কিছু সনাক্ত করা যায়, তবে সেগুলি নির্দিষ্ট করা যায় না; উদাহরণস্বরূপ, আমি কোন সি ++ এর সাথে ব্যবহার করছে তা সনাক্ত করতে পারি __cplusplus, তবে আমি নির্দিষ্ট করতে পারি না যে কোডটির মধ্যেই আমার কোডের জন্য সি ++ 98 ব্যবহার করা হয়; আমাকে এটিকে মেকফাইলে সংকলকের কাছে পতাকা হিসাবে দিতে হবে বা একটি কথোপকথনে একটি সেটিংস তৈরি করতে হবে।

আপনি যখন মনে করতে পারেন যে একটি "নির্ভরতা রেজোলিউশন" সিস্টেমটি সংকলকটিতে বিদ্যমান রয়েছে, স্বয়ংক্রিয়ভাবে নির্ভরতা রেকর্ড তৈরি করে, এই রেকর্ডগুলি কেবলমাত্র কোনও শিরোনাম কোনও প্রদত্ত উত্স ফাইল ব্যবহার করে বলে। এক্সিকিউটেবল প্রোগ্রামে লিংক করার জন্য কোন অতিরিক্ত সোর্স কোড মডিউলগুলির প্রয়োজন তা তারা নির্দেশ করতে পারে না, কারণ সি বা সি ++ তে কোনও মানক উপায় নেই যা নির্দেশ করে যে কোনও প্রদত্ত শিরোনাম ফাইল অন্য উত্স কোড মডিউলটির ইন্টারফেস সংজ্ঞা হিসাবে কেবল একটি গুচ্ছের বিপরীতে রয়েছে indicate আপনি একাধিক জায়গায় লাইনগুলি দেখাতে চান যাতে আপনি নিজেকে পুনরাবৃত্তি করবেন না। ফাইল নামকরণের কনভেনশনে traditionsতিহ্য রয়েছে তবে সংকলক এবং লিঙ্কার দ্বারা এগুলি জানা বা প্রয়োগ করা হয় না।

এর মধ্যে বেশ কয়েকটি ব্যবহার করে সেট করা যেতে পারে #pragmaতবে এটি অ-মানক এবং আমি স্ট্যান্ডার্ডের কথা বলছিলাম। এই সমস্ত জিনিস একটি মান দ্বারা নির্দিষ্ট করা যেতে পারে, কিন্তু পিছিয়ে সামঞ্জস্যের স্বার্থে হয় নি। প্রচলিত জ্ঞান হ'ল মেকফিল এবং আইডিই ভেঙে যায় না, তাই এগুলি ঠিক করবেন না।

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


3
পাইথনের সি প্রয়োগকরণ সিপিথন , সিথন আলাদা কিছু।
গ্রেগ হিউগিল

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

2
@ বিলিওনেল এই এক বিশাল ব্যতিক্রম সহ যে আপনি সি / সি ++ তে আপনাকে একটি প্রোগ্রামার হিসাবে স্টাফটি একটি নির্দিষ্ট উপায়ে করতে হবে (হয় মেকফাইলস বা প্রতিটি জিনিস একই ব্লাবে ফেলে দিন) আপনি কেবল নিজের কাজ এবং সংকলক ভিএম এর সাথে একসাথে করেন বিশ্রামের যত্ন নেয়
রুন এফএস

3
"সি ++ এর সংকলন প্রক্রিয়াটি প্রকাশ করতে হবে কারণ ভাষাটি নিজেই অসম্পূর্ণ" এর, কী ??
মনিকার সাথে লাইটনেস রেস

3
আপনি ঠিক পরে অংশটি পড়েছেন , তাই না? "এটি আপনার প্রোগ্রামটি তৈরি করার জন্য লিঙ্কারের যে সমস্ত জিনিস জানতে হবে তা সুনির্দিষ্ট করে না বা এটি পোর্টাইলে সংকলনের বিকল্পগুলি নির্দিষ্ট করতে পারে না।" আপনি কেবল কোনও সংকলককে খাওয়ানোর মাধ্যমে কোনও সি ++ ফাইল তৈরি করতে পারবেন না ; প্রায়শই আপনাকে মেটাডেটা সংকলনের পতাকাগুলির মতো, পাথের অন্তর্ভুক্ত ইত্যাদি সরবরাহ করতে হবে met কাজ শেষ তাই মানকটিকে সংকলনের ইউনিটের মতো কিছু জিনিস কল করতে হবে এবং অন্যরা প্রোগ্রামভিত্তিক।
মাইক ডিসিমোন

7

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

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


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

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

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

2
@ স্ট্যামারস, হ্যাঁ "সাধারণত সংকলিত ভাষা" বলতে আমরা যুক্তিযুক্তভাবে "সংকলিত ভাষা" ব্যবহার করতে পারি। তবে এটি এই পয়েন্টটি মিস করে যে পিএইচপি, জাভা, পাইথন, লুয়া এবং সি # সমস্তই বাইটকোডের সংকলক হিসাবে প্রয়োগ করা হয়েছে। এই সমস্ত ভাষাতেই তাদের জন্য জেআইটি কার্যকর করেছে। সুতরাং সত্যই, আপনি প্রকৃতপক্ষে এই কয়েকটি সংকলিত ভাষা এবং কিছু ব্যাখ্যা করতে পারবেন না কারণ এগুলি একই বাস্তবায়ন কৌশল পেয়েছে।
উইনস্টন ইওয়ার্ট

2
@ বিলিওনজিয়েল, পাইথনের পক্ষে অন্তত সত্য নয়। আপনি পাইথন বাইটকোড বিতরণ করতে পারেন এবং এটি উত্স ছাড়াই চালাতে পারেন। তবে সত্য যে আপনি সংকলক ছাড়া পাইথন বিতরণ করতে পারবেন না।
উইনস্টন ইওয়ার্ট

5

সমস্ত সংকলিত ভাষায় আপনার মুখের সম্পাদনা-সংকলন-লিঙ্ক-রান চক্র থাকে না।

আপনি যা চালাচ্ছেন তা হ'ল সি ++ (বা কমপক্ষে সি ++ বাস্তবায়ন) এর বৈশিষ্ট্য / সীমাবদ্ধতা।

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

বিশেষত, এটি এই মনোলিথিক লিঙ্কিং প্রক্রিয়া যা সংকলন এবং ব্যাখ্যার মধ্যে পার্থক্যের জন্য ভুল হয়েছে।

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

আপনি "এই মডিউলটি পুনরায় লোড করুন" বলুন এবং এটি উত্সটি লোড করে এবং এটি ব্যাখ্যা করে বা সংকলন করে, কিছু মোডের সুইচের উপর নির্ভর করে।

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

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


2

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

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

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


1

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

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

এই অনুবাদটি প্রায়শই প্রাক-সংকলন এবং "জাস্ট ইন টাইম" (জেআইটি) বা রান-টাইম-সংকলন হিসাবে উল্লেখ করা হয়।

সি, সি ++, সিওবিএল, ফোর্টরান, প্যাসকাল (সমস্ত নয়) এবং এসেম্বলির মতো ভাষাগুলি প্রাক-কম্পাইল করা ভাষা যা কোনও অনুবাদকের প্রয়োজন ছাড়াই অপারেটিং সিস্টেমের মাধ্যমে সরাসরি সম্পাদন করা যেতে পারে।

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

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

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