সংকলকগণ কীভাবে অন্যান্য ক্লাস এবং তাদের সম্পত্তি সম্পর্কে জানেন?


14

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

কীভাবে হবে কম্পাইলার কখন সংকলন ClassAযে ClassBএমনকি বিদ্যমান, এবং, যদি এটা আছে, কিভাবে এটা এটা বৈশিষ্ট্য জানেন?

আমার চিন্তাভাবনা এতদূর ছিল: প্রতিটি ক্লাসে একবারে সংকলনের পরিবর্তে (অর্থাত্ স্ক্যান, পার্স এবং কোড উত্পন্ন) প্রতিটি "ফাইল (আসলে ফাইল নয় সেঞ্চি, তবে একটি" শ্রেণি ") দরকার আছে আমাকে প্রথমে স্ক্যান + পার্স করতে হবে , তাহলে সবার জন্য কোড তৈরি করবেন?

উত্তর:


13

বিভিন্ন ভাষা (এবং এইভাবে সংকলক) এটিকে আলাদাভাবে পৌঁছায়।

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

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

উভয় বিকল্পগুলি বেশ বৈধ এবং তাদের নিজস্ব সুবিধা এবং অসুবিধাগুলির সেট রয়েছে। শিরোনাম ফাইল সরবরাহ করা কিছু অসুবিধাজনক এবং DRY লঙ্ঘন হিসাবে দেখেন । অন্যদিকে, যদি আপনার কাছে শিরোনাম ফাইলের লাইব্রেরিগুলির সংকলক এবং লিঙ্কার দ্বারা পরিদর্শন করা দরকার - একটি। সুতরাং বা .dll সম্ভবত সঠিকভাবে বস্তুগুলি ইনস্ট্যান্ট করতে বা পদ্ধতি কলগুলি বৈধ করার জন্য এতে পর্যাপ্ত তথ্য থাকতে পারে না ( এবং মেশিন নির্ভর হবে)।


0

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

সি # এর সমতুল্য, এবং আমি মনে করি না যে সি এবং সি ++ সত্যিই আলাদা, জাভা এবং সি # আইডিই যা করছে তা কেবল পর্দার পিছনে আপনার জন্য সি / সি ++ - স্টাইল শিরোনাম তৈরি করছে।


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

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

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

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

0

পুরানো ভাষা কখনও কখনও আরও কঠোর হয়; জাভাতে কী সম্ভব তা বিবেচনা করুন:

public interface Ifc {
    public static final Ifc MY_CONSTANT = new Implem();
}

public class Implem implements Ifc {
}

আমি উপরের অ্যান্টি-প্যাটার্নটি দেখেছি, এবং এটি সত্যিই কুৎসিত (আমি এটি নিষিদ্ধ করতাম)। উভয় সংকলন ইউনিট একে অপরকে ব্যবহার করে। তবে আইফসি একটি সংকলিত ইমপ্লেম ছাড়াই কোডে সংকলন করা যায়। সংকলিত কোড, .class, একটি সি .obj এর সাথে তুলনামূলক, "লিঙ্কেজ তথ্য:" প্যামিটারলেস কনস্ট্রাক্টরকে কল করে ইমপ্লিমের একটি আমদানি রয়েছে Implem()। ইমপ্লেম ক্লাসটি সমস্যা ছাড়াই সংকলন করতে পারে। আংশিকভাবে ClassLoader - শুরু করে / জেভিএম ক্লাসের ডেটা তৈরি করা এবং আংশিকভাবে জাভা ভার্চুয়াল মেশিন, লিঙ্কার হিসাবে কিছুটা খেলুন , সমস্ত সংহত করে।

উদাহরণস্বরূপ একটি নির্দিষ্ট লাইব্রেরির একটি সংস্করণ দিয়ে সংকলন করা এবং সেই লাইব্রেরির অন্য সংস্করণের সাথে চালানো রানটাইম ত্রুটিগুলি স্বীকৃতি দেবে।

সুতরাং উত্তর: সংকলন সংকলিত অবজেক্ট কোডের ইউনিটগুলি সরবরাহ করে, যা একসাথে সংযোগের জন্য কোড + ডেটা + এপিআই হিসাবে দেখতে হবে।

সংকলকটির পরে একত্রে একটি প্যাকিংও করা উচিত এবং লিঙ্কেজ এপিআই যাচাই করা উচিত ; একটি দ্বিতীয় পর্ব।

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

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