একটি বিশাল উত্স ফাইলে কিছু সি প্রোগ্রাম কেন লেখা হয়?


88

উদাহরণস্বরূপ, অতীত থেকে সিসইন্টার্নালস সরঞ্জাম "ফাইলমোন" এর মধ্যে একটি কার্নেল-মোড ড্রাইভার রয়েছে যার উত্স কোডটি সম্পূর্ণরূপে একটি 4,000-লাইন ফাইলে রয়েছে। প্রথম লিখিত পিন প্রোগ্রামের জন্য একই লিখিত (~ 2,000 এলওসি)।

উত্তর:


143

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


9
"এবং files 4000 এলওসি হিসাবে ছোট ফাইলগুলির জন্য ..." আমি এখনই জেএস দেব হিসাবে কাজ করছি। আমার কাছে যখন মাত্র 400 লাইনের কোডের একটি ফাইল থাকে, তখন তা বড় হয়ে যায় বলে আমি ঘাবড়ে যাই! (তবে আমাদের প্রকল্পে কয়েক ডজন এবং কয়েক ডজন ফাইল রয়েছে))
কেভিন

36
@ কেভিন: আমার মাথার একটি চুল খুব কম, আমার স্যুপের একটি চুল অনেক বেশি ;-) জেএস একাধিক ফাইলগুলিতে আফ্রিক "মডার্ন আইডিইবিহীন সি হিসাবে" এর মতো প্রশাসনিক ওভারহেডের কারণ করে না।
ডক ব্রাউন

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

5
@ কেভিন এখন যান এবং দেখুন কীভাবে আন্ডারস্কোর.জেএস (1700 লোকাল, একটি ফাইল) এবং বিতরণ করা অন্যান্য লাইব্রেরির একটি অগণিত লেখা রয়েছে are মডেলাইজেশন এবং মোতায়েনের ক্ষেত্রে জাভাস্ক্রিপ্ট আসলে সি হিসাবে প্রায় খারাপ।
ভু

2
@ ফারাপ আমি মনে করি কোডটি স্থাপনের আগে তিনি ওয়েবপ্যাকের মতো কিছু ব্যবহার করেছিলেন। ওয়েবপ্যাকের সাহায্যে আপনি একাধিক ফাইলের উপর কাজ করতে পারেন এবং তারপরে এগুলিকে একটি বান্ডলে সংকলন করতে পারেন।
ব্রায়ান ম্যাকচ্যাচন 5:20

81

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

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


38
আমি মনে করি সি পদ্ধতির 'ভুল' হিসাবে বর্ণনা করা অন্যায়; তারা তৈরি করার সময় এগুলি পুরোপুরি বুদ্ধিমান এবং যুক্তিসঙ্গত সিদ্ধান্ত ছিল।
জ্যাক এইডলি

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

8
@ গ্রাহাম 1000 লাইনের কোডের চেয়ে বড় যে কোনও ফাইলকে কোড গন্ধ হিসাবে গণ্য করা উচিত।
ম্যাসন হুইলার

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

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

37

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

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

একক উত্স কোড মডিউলটির একটি সুপরিচিত উদাহরণ হ'ল এসকিউএলাইট। আপনি এসকিউএলাইট সম্মিলন পৃষ্ঠায় এটি সম্পর্কে আরও পড়তে পারেন ।

1। নির্বাহী সারাংশ

"Sqlite3.c" নামক সি-কোডের একক বৃহত ফাইলগুলিতে 100 টিরও বেশি পৃথক উত্স ফাইলগুলি সংমিশ্রিত হয় এবং "সংহতকরণ" নামে পরিচিত। সংমিশ্রণটিতে এসকিউএলাইট এম্বেড করার জন্য অ্যাপ্লিকেশনটির প্রয়োজনীয় সমস্ত কিছু রয়েছে। সংমিশ্রণ ফাইলটি 180,000 লাইনের বেশি লম্বা এবং 6 মেগাবাইট আকারের।

এসকিউএলাইটের জন্য সমস্ত কোডকে একটি বড় ফাইলে একত্রিত করা এসকিউএলাইটকে মোতায়েন করা আরও সহজ করে তোলে - ট্র্যাক রাখার জন্য কেবল একটি ফাইল রয়েছে। এবং সমস্ত কোড একক অনুবাদ ইউনিটে থাকায়, সংকলকরা 5% থেকে 10% এর মধ্যে দ্রুততর মেশিন কোডের ফলে আন্তঃ-পদ্ধতি অপটিমাইজেশন আরও ভাল করতে পারে।


15
তবে নোট করুন যে আধুনিক সি সংকলকগুলি একাধিক উত্স ফাইলগুলির পুরো প্রোগ্রাম অপ্টিমাইজেশন করতে পারে (যদিও আপনি প্রথমে সেগুলি পৃথক বস্তু ফাইলগুলিতে সংকলন করেন না)।
ডেভিস্লোর

10
@ ডেভিস্লোর সাধারণ বিল্ড স্ক্রিপ্টটি দেখুন: সংকলকগণ বাস্তবে এটি করতে যাচ্ছেন না।

4
একটি বিল্ড স্ক্রিপ্ট পরিবর্তন করা উল্লেখযোগ্যভাবে সহজ $(CC) $(CFLAGS) $(LDFLAGS) -o $(TARGET) $(CFILES)যা একটি একক সোডেস ফাইলে সমস্ত কিছু স্থানান্তরিত করার চেয়ে। এমনকি আপনি পুরো টার্গেটটি সংকলনটি traditionalতিহ্যবাহী বিল্ড স্ক্রিপ্টের বিকল্প টার্গেট হিসাবে করতে পারেন যা উত্সের পরিবর্তনের পরিবর্তিত সোর্স ফাইলগুলি পুনরায় সংশোধন করতে এড়িয়ে যায়, লোকেরা কীভাবে উত্পাদন লক্ষ্যমাত্রার জন্য প্রোফাইলিং এবং ডিবাগিং বন্ধ করে দিতে পারে তার অনুরূপ। সবকিছু যদি একটি বড় হিপ ও উত্সে থাকে তবে আপনার কাছে সেই বিকল্প নেই। লোকেরা যা অভ্যস্ত তা নয়, তবে এটি সম্পর্কে জটিল কিছু নেই।
ডেভিস্লোর

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

8
জসনসিপি আজকাল এটিও করে। মূলটি হ'ল ফাইলগুলি বিকাশের সময় এইভাবে হয় না।
অরবিট

15

অন্যান্য উত্তরদাতা যে সরলতার ফ্যাক্টরটি উল্লেখ করেছেন সেগুলি ছাড়াও অনেকগুলি সি প্রোগ্রাম একটি ব্যক্তি দ্বারা রচিত হয়।

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

যখন একজন ব্যক্তি নিজে কাজ করছেন, এটি কোনও সমস্যা নয়।

ব্যক্তিগতভাবে, আমি অভ্যাসগত জিনিস হিসাবে ফাংশনের ভিত্তিতে একাধিক ফাইল ব্যবহার করি। তবে তা কেবল আমিই।


4
@ অস্কারস্কোগ তবে আপনি নিজের ভবিষ্যতের স্ব হিসাবে একইসাথে কোনও ফাইল কখনই পরিবর্তন করতে পারবেন না।
লরেন পেচটেল

2

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

আজকাল, এমনকি সিতে, একটিকে মডুলারাইজ করার জন্য পারফরম্যান্স ত্যাগ করতে হবে না কারণ এমনকি সি ফাংশনেও অন্তর্ভুক্ত করা যেতে পারে।


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

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

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

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

@ ভু: একজন প্রোগ্রামার এবং একটি সংকলক সাধারণত প্রতিটি কিছু অন্য জিনিসগুলি জানবে না। inlineশব্দ linker সংক্রান্ত শব্দার্থবিদ্যা যা হোক বা না হোক ইন-লাইন অপ্টিমাইজেশন সম্পাদন করতে প্রশ্নে চেয়ে আরও বেশি গুরুত্বপূর্ণ হয়ে গেছে, কিন্তু কিছু বাস্তবায়নের ইন-আস্তরণের নিয়ন্ত্রণ করতে এবং এই ধরনের জিনিস কখনও কখনও খুবই গুরুত্বপূর্ণ হতে পারে অন্যান্য নির্দেশনা আছে। কিছু ক্ষেত্রে, কোনও ক্রিয়াকলাপটি দেখতে অনেকটা বড় আকারের হওয়ার মতো হতে পারে তবে ধ্রুবক ভাঁজগুলি আকার এবং সম্পাদনের সময়টিকে প্রায় কোনও কিছুই হ্রাস করতে পারে। একটি সংকলক যা ইন-
আস্তরণকে

1

এটি বিবর্তনের উদাহরণ হিসাবে গণ্য, যা আমি অবাক হয়ে এখনও উল্লেখ করা হয়নি।

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

এই পরিবেশগত কারণগুলি যে অভ্যাসগুলি চলমান উন্নয়ন অনুশীলনগুলিতে পরিচালিত করেছিল এবং সময়ের সাথে ধীরে ধীরে মানিয়েছে।

একক ফাইল ব্যবহার করা থেকে প্রাপ্ত উপায়ে এইচডিডি এর পরিবর্তে এসএসডি ব্যবহার করে আমরা পেয়ে যাব।

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