কোন সামাজিক বা প্রযুক্তিগত কারণগুলি সিআইওয়াই মানসিকতার উত্থানের দিকে পরিচালিত করেছিল ?
মূল কারণটি স্পষ্টত প্রযুক্তিগত কারণ: বাইনারি-বহনযোগ্যতা উত্স-বহনযোগ্যতার চেয়ে শক্ত । ডিস্ট্রো প্যাকেজগুলির বাইরে, বেশিরভাগ ফ্রি সফটওয়্যারটি কেবলমাত্র উত্স আকারে উপলব্ধ কারণ এটি লেখক (গুলি) / রক্ষণাবেক্ষণকারীদের পক্ষে যথেষ্ট বেশি সুবিধাজনক।
যতক্ষণ না লিনাক্স ডিস্ট্রস বেশিরভাগ জিনিসগুলিকে প্যাকেজিং শুরু করে, যা গড় লোকেরা ব্যবহার করতে চায়, আপনার একমাত্র বিকল্পটি উত্সটি পাওয়া এবং এটি আপনার নিজের সিস্টেমের জন্য সংকলন করা ছিল। বাণিজ্যিক ইউনিক্স বিক্রেতারা সাধারণত এমন স্টাফ অন্তর্ভুক্ত করেনি যা প্রায় প্রত্যেকেই চায় (যেমন জিএনইউ bash
বা অনুরূপ একটি দুর্দান্ত শেল ), কেবল তাদের নিজস্ব প্রয়োগকরণ sh
এবং / অথবা csh
, যাতে আপনি (সিস-অ্যাডমিন হিসাবে) চান ইন্টারেক্টিভ ব্যবহারের জন্য আপনার ব্যবহারকারীদের একটি দুর্দান্ত ইউনিক্স পরিবেশ সরবরাহ করতে।
এখনকার পরিস্থিতি, বেশিরভাগ লোকেরা কেবলমাত্র ডেস্কটপে বসে থাকা কেবলমাত্র প্রশাসক এবং মেশিনের একমাত্র ব্যবহারকারী, Unতিহ্যবাহী ইউনিক্স মডেল থেকে একেবারে পৃথক। একটি সিসাদমিন কেন্দ্রীয় সিস্টেমে এবং প্রত্যেকের ডেস্কটপে সফ্টওয়্যারটি বজায় রেখেছিল। (প্রায়শই লোকাল ওয়ার্কস্টেশনগুলি কেবল এনএফএস-মাউন্ট /opt
এবং /usr/local/
কেন্দ্রীয় সার্ভার থেকে এবং সেখানে স্টাফ ইনস্টল করে))
.NET এবং জাভা এর মতো জিনিসের আগে, বিভিন্ন সিপিইউ আর্কিটেকচার জুড়ে সত্য বাইনারি-বহনযোগ্যতা অসম্ভব ছিল। ইউনিক্স সংস্কৃতি এই কারণে উত্স-বহনযোগ্যতার সাথে ডিফল্ট হিসাবে বিকশিত হয়েছিল, এমনকি এলএসবির মতো সাম্প্রতিক লিনাক্স প্রচেষ্টা অবধি বাইনারি-বহনযোগ্যতা সক্ষম করার চেষ্টা করার সামান্য প্রচেষ্টাও নেই। উদাহরণস্বরূপ, POSIX ( প্রধান ইউনিক্স মান) একমাত্র উৎস-বহনযোগ্যতা প্রমিত করার জন্য সাম্প্রতিক সংস্করণটি এমনকি চেষ্টা করে।
সম্পর্কিত সাংস্কৃতিক উপাদান: প্রাথমিক বাণিজ্যিক এটিএন্ডটি ইউনিক্স সোর্স কোড নিয়ে আসে (টেপগুলিতে)। তুমি না আছে এটা ঠিক ছিল যদি আপনি দেখতে কিভাবে কিছু চেয়েছিলেন, উৎস থেকে ব্যবস্থা গড়ে তুলতে সত্যিই কাজ যখন ডক্স যথেষ্ট ছিল না।
উইকিপিডিয়া বলেছেন :
"ইউনিক্স নীতি বিস্তৃত অন লাইন ডকুমেন্টেশন এবং (বহু বছর ধরে) সমস্ত সিস্টেম উত্স কোডে প্রস্তুত অ্যাক্সেস প্রোগ্রামার প্রত্যাশাকে উত্থাপন করেছিল এবং 1983 এর নিখরচায় সফ্টওয়্যার আন্দোলনের প্রবর্তনে ভূমিকা রেখেছিল।"
আমি নিশ্চিত নই যে এই সিদ্ধান্তটি কী অনুপ্রাণিত করেছিল, যেহেতু বাণিজ্যিক সফ্টওয়্যারগুলির উত্স কোডটিতে গ্রাহকদের অ্যাক্সেস দেওয়া আজকাল শোনা যায় না। এই দিকটিতে স্পষ্টত কিছু প্রাথমিক সাংস্কৃতিক পক্ষপাত রয়েছে, তবে সম্ভবত ইউনিক্সের মূল থেকে বহনযোগ্য ওএস হিসাবে বেশিরভাগ সি-তে লেখা হয় (সমাবেশ ভাষা নয়) যা বিভিন্ন হার্ডওয়্যারের জন্য সংকলিত হতে পারে। আমি মনে করি পূর্বের অনেকগুলি ওএসের একটি নির্দিষ্ট সিপিইউয়ের জন্য এসএম-তে আরও কোড লেখা ছিল, তাই ইউনিক্সের প্রাথমিক শক্তিগুলির মধ্যে উত্স-স্তরের বহনযোগ্যতা ছিল। (আমি এই সম্পর্কে ভুল হতে পারি; আমি প্রথমদিকে ইউনিক্সের বিশেষজ্ঞ নই, তবে ইউনিক্স এবং সি সম্পর্কিত।)
উত্স আকারে সফ্টওয়্যার বিতরণ হ'ল লোকেরা যে কোনও সিস্টেমে এটি চালাতে চায় তা এটিকে খাপ খাইয়ের সহজতম উপায়। (হয় শেষ ব্যবহারকারী বা লিনাক্স ডিস্ট্রোর জন্য এটি প্যাকেজিং লোক)। যদি সফ্টওয়্যারটি ইতিমধ্যে কোনও বিতরণের জন্য / দ্বারা প্যাকেজ করা থাকে তবে শেষ ব্যবহারকারীরা কেবল এটি ব্যবহার করতে পারেন।
তবে বেশিরভাগ প্যাকেজগুলির লেখকরা প্রতিটি সম্ভাব্য সিস্টেমের জন্য বাইনারি তৈরি করার আশা করা খুব বেশি much কিছু বড় প্রকল্প কয়েকটি সাধারণ ক্ষেত্রে বাইনারি সরবরাহ করে (বিশেষত x86 / উইন্ডোজ যেখানে ওএস কোনও বিল্ড পরিবেশের সাথে আসে না এবং ওএস বিক্রেতারাই বাইনারি-কেবল ইনস্টলারগুলির বিতরণে একটি গুরুত্ব দেয়)।
লেখক যেটি ব্যবহার করেছেন তার থেকে আলাদা সিস্টেমে চালনার জন্য এক টুকরো সফ্টওয়্যার পেতে এমনকি কিছু ছোট পরিবর্তন হতে পারে যা উত্সের সাহায্যে সহজ । একটি ছোট একটি অফ-প্রোগ্রাম যা তাদের নিজের চুলকানি স্ক্র্যাচ করার জন্য লিখেছিল সম্ভবত বেশিরভাগ অস্পষ্ট সিস্টেমে কখনও পরীক্ষা করা হয়নি। উত্স থাকা এ জাতীয় পরিবর্তনগুলি সম্ভব করে তোলে। মূল লেখক কিছু উপেক্ষা করতে পারে, বা ইচ্ছাকৃতভাবে কম পোর্টেবল কোড লিখেছিল কারণ এটি অনেক সময় সাশ্রয় করে। এমনকি তথ্য-জিপ-এর মতো বড় প্যাকেজগুলির এখনই প্রতিটি প্ল্যাটফর্মে পরীক্ষক নেই, এবং সমস্যাগুলি আবিষ্কার হওয়ার সাথে সাথে লোককে তাদের বহনযোগ্য প্যাচগুলি প্রেরণের প্রয়োজন ছিল।
(উৎস-স্তরের বহনযোগ্যতা সমস্যা অন্য ধরনের যে শুধুমাত্র কারণ বিল্ড env মধ্যে পার্থক্য ঘটবে, এবং সত্যিই ইস্যু এখানে। সাথে জাভা-শৈলী বাইনারি বহনযোগ্যতা, স্বয়ংক্রিয় সরঞ্জাম (প্রাসঙ্গিক নয় আছে autoconf
/ auto-make
) এবং মত অনুরূপ কিছু cmake
wouldn 'টি প্রয়োজন হতে। এবং আমরা জিনিস হতো না মত কিছু সিস্টেমে অন্তর্ভুক্তি প্রয়োজন <netinet/in.h>
পরিবর্তে<arpa/inet.h>
জন্যntohl(3)
। (এবং হয়তো আমরা হতো না ntohl()
বা প্রথম স্থানে অন্য কোন বাইট-অর্ডার কাপড়!)
আমি নিয়মিত। নেট ভাষায় বিকাশ করি, তাই আমি কম্পিউটার নিরক্ষর নই।
একবার সংকলন করুন, রান-কোথাও হ'ল। নেট এবং জাভার অন্যতম প্রধান লক্ষ্য, সুতরাং এই সমস্যাটি সমাধানের প্রয়াসে পুরো ভাষাগুলি উদ্ভাবিত হয়েছে এবং এটির সাথে আপনার দেব অভিজ্ঞতাও রয়েছে বলে একথা ঠিক। .NET সহ, আপনার বাইনারি কোনও পোর্টেবল রানটাইম এনভায়রনমেন্ট (সিএলআর) এ চলে । জাভা তার রানটাইম পরিবেশকে জাভা ভার্চুয়াল মেশিন বলে । আপনাকে কেবলমাত্র একটি বাইনারি বিতরণ করতে হবে যা কোনও সিস্টেমে কাজ করবে (কমপক্ষে, এমন কোনও সিস্টেম যেখানে কেউ ইতিমধ্যে একটি জেভিএম বা সিএলআর প্রয়োগ করেছেন)। আপনার কাছে এখনও পোর্টেবিলিটি সমস্যা যেমন /
বনাম \
পাথ বিভাজক, বা কীভাবে মুদ্রণ করা যায়, বা অবশ্যই জিইউআই লেআউট বিশদ থাকতে পারে।
অনেকগুলি সফ্টওয়্যার এমন ভাষায় রচিত যা সম্পূর্ণ কোডটি স্থানীয় কোডে সংকলিত হয় । এখানে কোনও .net
জাভা বাইটকোড নেই, কেবল সিপিইউর জন্য নেটিভ মেশিন-কোডটি চলবে, এটি কোনও বহনযোগ্য এক্সিকিউটেবল ফাইল ফর্ম্যাটে সংরক্ষণ করা হবে। সি এবং সি ++ এর প্রধান উদাহরণ, বিশেষত ইউনিক্স বিশ্বে। স্পষ্টতই এর অর্থ একটি নির্দিষ্ট সিপিইউ আর্কিটেকচারের জন্য বাইনারিটি সংকলন করতে হবে।
গ্রন্থাগার সংস্করণ অন্য সমস্যা । বাইনারি-স্তরের এবিআই পরিবর্তন করার সময় গ্রন্থাগারগুলি প্রায়শই উত্স-স্তরের এপিআই স্থিতিশীল রাখতে পারে। ( এপিআই এবং এবিআইয়ের মধ্যে পার্থক্য দেখুন ।) উদাহরণস্বরূপ, একটি অস্বচ্ছটিতে অন্য সদস্যকে যুক্ত করা struct
এখনও তার আকার পরিবর্তন করে, এবং কোনও কোডের জন্য নতুন লাইব্রেরি সংস্করণের জন্য শিরোনামগুলির সাথে একটি পুনর্নির্মাণের প্রয়োজন হয় যে কোনও কাঠামোর জন্য স্থান বরাদ্দ করে, এটি গতিশীল (ম্যালোক) ), স্ট্যাটিক (গ্লোবাল), বা স্বয়ংক্রিয় (স্ট্যাকের স্থানীয়)।
অপারেটিং সিস্টেমগুলিও গুরুত্বপূর্ণ । একই CPU- র আর্কিটেকচারের জন্য ইউনিক্স এর একটি ভিন্ন গন্ধ বিভিন্ন বাইনারি ফাইল ফরম্যাট থাকতে পারে, মত ধ্রুবক জন্য সিস্টেম কল, এবং বিভিন্ন সাংখ্যিক মান তৈরীর জন্য একটি বিভিন্ন ABI- র fopen(3)
'এর O_RDONLY
, O_APPEND
,O_TRUNC
।
নোট এমনকি একটি পরিবর্তনশীল সংযুক্ত বাইনারি এখনও কিছু অপারেটিং সিস্টেম-নির্দিষ্ট প্রারম্ভে কোডটি রান সামনে আছে main()
। উইন্ডোজ এ, এটি crt0
। ইউনিক্স এবং লিনাক্সের একই জিনিস রয়েছে, যেখানে কিছু সি-রানটাইম স্টার্টআপ কোড স্ট্যাটিকভাবে প্রতিটি বাইনারিতে সংযুক্ত থাকে। আমার তত্ত্ব অনুসারে আপনি এমন একটি সিস্টেম ডিজাইন করতে পারেন যেখানে সেই কোডটি গতিশীলভাবে খুব সংযুক্ত ছিল এবং libc বা গতিশীল লিঙ্কারের একটি অংশ নিজেই তৈরি হয়েছিল, তবে আমি যে কোনও ওএস সম্পর্কে জিনিসগুলি অনুশীলনে কাজ করি তা এই নয় I'm এটি কেবল সিস্টেম-কল এবিআই সমস্যার সমাধান করবে, স্ট্যান্ডার্ড-লাইব্রেরি ফাংশনগুলির জন্য ধ্রুবকগুলির জন্য সংখ্যাগত মানগুলির সমস্যা নয়। (সাধারণত সিস্টেম-কলগুলি libc মোড়ক ফাংশনগুলির মাধ্যমে করা হয়: উত্সের জন্য একটি সাধারণ x86-64 লিনাক্স বাইনারি mmap()
যা syscall
নির্দেশাবলী অন্তর্ভুক্ত করে না , কেবল একটিcall
একই নামের লিবিসি র্যাপার ফাংশনের নির্দেশনা।
আপনি কেন কেবল আই 386-লিনাক্সে i386-FreeBSD বাইনারি চালাতে পারবেন না এটি এই অংশ। (কিছুক্ষণের জন্য, লিনাক্স কার্নেলের একটি সিস্টেম-কলের সামঞ্জস্যতা স্তর ছিল I আমি মনে করি বিএসডি-র মধ্যে কমপক্ষে একটি লিনাক্স বাইনারি পরিচালনা করতে পারে, একই রকমের কম্প্যাট স্তর সহ, তবে আপনার অবশ্যই লিনাক্স লাইব্রেরিগুলির প্রয়োজন))
আপনি যদি বাইনারি বিতরণ করতে চান তবে আপনাকে সিপিইউ / ওএস-ফ্লেভার + সংস্করণ / ইনস্টলড-লাইব্রেরি-সংস্করণগুলির প্রতিটি সংমিশ্রণের জন্য আলাদা আলাদা তৈরি করতে হবে ।
'80s /' 90 এর দশকে, ইউনিক্স সিস্টেমগুলির জন্য সাধারণ ব্যবহারে অনেকগুলি বিভিন্ন ধরণের সিপিইউ ছিল (এমআইপিএস, স্পার্ক, বিদ্যুৎ, পিএ-আরআইএসসি, এম 68 কে, ইত্যাদি) এবং ইউনিক্সের বিভিন্ন স্বাদ (আইআরআইএক্স, সানোএস, সোলারিস, এআইএক্স, এইচপি-ইউএক্স, বিএসডি ইত্যাদি)।
এবং এটি কেবল ইউনিক্স সিস্টেম। অনেক উত্স প্যাকেজগুলি অন্যান্য সিস্টেমগুলি যেমন VAX / VMS, MacOS (m68k এবং পিপিসি), অ্যামিগা, পিসি / এমএস-ডস, আতারি এসটি ইত্যাদির উপরও সংকলন এবং কাজ করবে
এখনও অনেকগুলি সিপিইউ আর্কিটেকচার এবং ওএস রয়েছে, যদিও এখন ডেস্কটপগুলির একটি বিশাল সংখ্যা তিনটি বড় ওএসের মধ্যে একটি x86 চলছে।
সুতরাং ইতিমধ্যে আপনি আরও শক্তিশালী সিপিইউ / ওএস সংমিশ্রণের চেয়ে আরও বেশি লাঠি কাঁপতে পারেন, এমনকি আপনি তৃতীয় পক্ষের লাইব্রেরিতে নির্ভরতা সম্পর্কে চিন্তাভাবনা শুরু করার আগেই যা বিভিন্ন সিস্টেমে বিভিন্ন সংস্করণে থাকতে পারে। (ওএস বিক্রেতা কর্তৃক প্যাকেজভুক্ত কিছু নেই যা নিজে হাতে ইনস্টল করতে হবে))
বাইনারিতে সংকলিত যে কোনও পাথগুলিও সিস্টেম-নির্দিষ্ট। (এটি শুরুতে কোনও কনফিগার ফাইল থেকে পড়ার তুলনায় র্যাম এবং সময় সাশ্রয় করে)। ওল্ড-স্কুল ইউনিক্স সিস্টেমে সাধারণত হাতে প্রচুর পরিমাণে কাস্টমাইজড স্টাফ ছিল, তাই কোনটি আছে সে সম্পর্কে কোনও বৈধ অনুমান করার উপায় নেই।
সমস্ত বড় সংমিশ্রণগুলিতে নির্মাণ এবং পরীক্ষার সামর্থ্যযোগ্য বড় বড় বাণিজ্যিক প্রকল্পগুলি ব্যতীত পুরানো-স্কুল ইউনিক্সের বাইনারি বিতরণ করা সম্পূর্ণরূপে অপারগ ছিল ।
এমনকি ঠিক বাইনেরিতে উপার্জন i386-linux-gnu
এবং amd64-linux-gnu
কঠিন। পোর্টেবল বাইনারিগুলি সম্ভব করার জন্য লিনাক্স স্ট্যান্ডার্ড বেসের মতো জিনিসগুলিতে অনেক সময় এবং প্রচেষ্টা ব্যয় করা হয়েছে । এমনকি স্থিতিশীলভাবে বাইনারিগুলি যুক্ত করাও সমস্ত কিছু সমাধান করে না। (যেমন একটি রেডহ্যাট সিস্টেম বনাম একটি ডেবিয়ান সিস্টেমে ওয়ার্ড-প্রসেসিং প্রোগ্রাম কীভাবে প্রিন্ট করা উচিত? ইনস্টলটি কীভাবে কোনও ব্যবহারকারী বা গ্রুপকে ডেমনের জন্য যুক্ত করা উচিত এবং প্রতিটি স্টার্টআপ স্ক্রিপ্টটি প্রতিটি রিবুটের পরে চালানোর ব্যবস্থা করা উচিত?) সেগুলি দুর্দান্ত নয় উদাহরণস্বরূপ, কারণ উত্স থেকে পুনরায় সংস্থানগুলি তাদের সমাধান করে না।
সব কিছু ছাড়াও, দিনের স্মৃতি এখনকার চেয়ে মূল্যবান ছিল। সংকলন সময়ে featuresচ্ছিক বৈশিষ্ট্যগুলি রেখে ছোট ছোট বাইনারি (কম কোড আকার) তৈরি করতে পারে যা তাদের ডেটা স্ট্রাকচারের জন্য কম মেমরি ব্যবহার করে। নির্দিষ্ট বৈশিষ্ট্যের প্রতিটি ক্ষেত্রে class
বা কোনও কিছু struct
ট্র্যাক করার জন্য যদি কোনও বৈশিষ্ট্যের অতিরিক্ত সদস্যের প্রয়োজন হয় , তবে সেই বৈশিষ্ট্যটি অক্ষম করা 4 টি বাইট দ্বারা উদাহরণটিকে সঙ্কুচিত করবে (উদাহরণস্বরূপ), এটি যদি প্রোগ্রামের 100k বরাদ্দকৃত কোনও বস্তু হয় তবে এটি দুর্দান্ত।
এই দিনগুলিতে ptionচ্ছিক সংকলন-সময় বৈশিষ্ট্যগুলি প্রায়শই অতিরিক্ত লাইব্রেরিগুলি alচ্ছিক করতে ব্যবহৃত হয়। যেমন আপনি কম্পাইল করতে পারেন ffmpeg
সহ বা ছাড়া libx264
, libx265
, libvorbis
নির্দিষ্ট ভিডিও / অডিও এনকোডার, উপশিরোনাম হ্যান্ডলিং, ইত্যাদি ইত্যাদি জন্য, এবং অন্যান্য অনেক লাইব্রেরি আরো সাধারণভাবে, জিনিস অনেক সহ বা ছাড়া কম্পাইল করা যায় libreadline
: যদি এটি উপলব্ধ যখন আপনি চালাতে ./configure
, ফলস্বরূপ বাইনারি লাইব্রেরির উপর নির্ভর করে এবং টার্মিনাল থেকে পড়ার সময় অভিনব লাইন-সম্পাদনা সরবরাহ করে। যদি এটি না হয় তবে প্রোগ্রামটি স্টলিনের সাথে fgets()
কিছু বা কিছু দিয়ে লাইনগুলি পড়তে কিছু পতন-ব্যাক সমর্থন ব্যবহার করবে ))
কিছু প্রকল্প এখনও কর্মক্ষমতা কারণে অপ্রয়োজনীয় কোডটি ছাড়তে alচ্ছিক বৈশিষ্ট্যগুলি ব্যবহার করে। যেমন লিনাক্স কার্নেলটি নিজেই এসএমপি সমর্থন ছাড়াই নির্মিত হতে পারে (যেমন একটি এমবেডেড সিস্টেম বা একটি প্রাচীন ডেস্কটপের জন্য), সেক্ষেত্রে প্রচুর লকিং সহজ। বা অন্যান্য অনেকগুলি alচ্ছিক বৈশিষ্ট্য যা কেবলমাত্র ড্রাইভার বা অন্যান্য হার্ডওয়্যার বৈশিষ্ট্যগুলি না রেখে, কিছু মূল কোডকে প্রভাবিত করে। (যদিও আর্চ-নির্দিষ্ট এবং হার্ডওয়্যার-নির্দিষ্ট কনফিগারেশন বিকল্পগুলি মোট উত্স কোডের অনেকের জন্য অ্যাকাউন্ট করে See লিনাক্স কার্নেলটি কেন 15+ মিলিয়ন কোডের কোড? )