সফ্টওয়্যার ওএস নির্দিষ্ট কেন?


77

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

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

অপারেটিং সিস্টেমগুলি - অভ্যন্তরীণ এবং নকশার নীতিগুলি 7 ম এড - ডাব্লু স্টালিংস (পিয়ারসন, 2012)

আপনি দেখতে পাচ্ছেন, এপিআইগুলি অপারেটিং সিস্টেমের অংশ হিসাবে নির্দেশিত নয়।

উদাহরণস্বরূপ যদি আমি নিম্নলিখিত কোডগুলি ব্যবহার করে সি তে একটি সাধারণ প্রোগ্রাম তৈরি করি:

#include<stdio.h>

main()
{
    printf("Hello World");

}

এই সংকলন করার সময় সংকলক ওএস নির্দিষ্ট কিছু করছে?


15
আপনি কি একটি উইন্ডোতে মুদ্রণ করেন? বা কনসোল? নাকি গ্রাফিক্সের স্মৃতি? আপনি কীভাবে সেখানে ডেটা রাখবেন? অ্যাপলটির জন্য প্রিন্টফের দিকে তাকানো] [+ ম্যাক ওএস quiet এর চেয়ে আলাদা এবং ম্যাক ওএস এক্সের চেয়ে আলাদা হবে (কেবল কম্পিউটারের একটি 'লাইন' দিয়ে আঁকিয়ে রাখা)।

3
কারণ আপনি যদি ম্যাক ওএস 7 এর জন্য কোডটি লিখে থাকেন তবে এটি একটি নতুন উইন্ডোটিতে পাঠ্যে প্রদর্শিত হবে। আপনি যদি এটি অ্যাপলটিতে করেন] [+, এটি মেমরির কিছু অংশে সরাসরি লেখা হবে। ম্যাক ওএস এক্স-তে এটি একটি কনসোলে লিখেছে। সুতরাং, লাইব্রেরী স্তর দ্বারা পরিচালিত এক্সিকিউশন হার্ডওয়ারের উপর ভিত্তি করে কোডটি হ্যান্ডলিংয়ের তিনটি ভিন্ন উপায়ে পাঠায়।

2
@StevenBurnap হাঁ - en.wikipedia.org/wiki/Aztec_C

10
আপনার এফএফটি ফাংশন আনন্দের সাথে উইন্ডোজ বা লিনাক্সের অধীনে (একই সিপিইউতে) চালানো হবে, এমনকি পুনরায় সংশোধন না করে। কিন্তু তারপরে আপনি ফলাফলটি কীভাবে প্রদর্শন করবেন? অবশ্যই একটি অপারেটিং সিস্টেম এপিআই ব্যবহার করে। ( printfmsvcr90.dll থেকে libc.so.6 এর মত নয় printf)
ইমিগ্রিস

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

উত্তর:


78

আপনি কোডটি কোনও সিপিইউ-এর জন্য নির্দিষ্ট কিনা তা উল্লেখ করে কেন এটি কোনও ওএসের ক্ষেত্রেও নির্দিষ্ট হওয়া আবশ্যক। এটি আসলে একটি আকর্ষণীয় প্রশ্ন যা এখানে অনেক উত্তর ধরে নিয়েছে।

সিপিইউ সুরক্ষা মডেল

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

যেখানে ওএস আসে

প্রারম্ভিক একক টাস্কিং ওএস

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

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

আধুনিক মাল্টি টাস্কিং ওএস

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

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

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

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

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

প্রোগ্রাম লোডার

সিস্টেম কলগুলির পাশাপাশি, প্রতিটি ওএস একটি মাধ্যমিক স্টোরেজ মিডিয়াম এবং মেমোরিতে কোনও প্রোগ্রাম লোড করার জন্য একটি পৃথক পদ্ধতি সরবরাহ করে , নির্দিষ্ট ওএস দ্বারা লোডযোগ্য হওয়ার জন্য প্রোগ্রামটিতে একটি বিশেষ শিরোনাম থাকতে হবে যা ওএসকে কীভাবে হতে পারে তা বর্ণনা করে contain বোঝা এবং চালানো।

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

লাইব্রেরি

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

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

উপরের ব্যতিক্রম

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

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


6
+1 "সফ্টওয়্যার ওএস নির্দিষ্ট করে কেন?" কারণ ইতিহাস।
পল ড্রাগন

2
সিপিইউ সুরক্ষা মডেলটি x86- উদ্ভূত? কেন এবং কখন মডেলটি আবিষ্কার হয়েছিল?
n611x007

8
@ এনএক্সএ না, এটি x86 এর দীর্ঘকাল পূর্বাভাস দেয়, এটি ১৯69৯ সালে মাল্টিক্সের জন্য আংশিকভাবে প্রয়োগ করা হয়েছিল যা জিই -645 কম্পিউটারে এই মডেলটির প্রয়োজনীয় মাল্টি-ইউজার টাইম-শেয়ারিং বৈশিষ্ট্যযুক্ত প্রথম ওএস , তবে এই বাস্তবায়ন অসম্পূর্ণ ছিল এবং এর উপর নির্ভর ছিল সফ্টওয়্যার সমর্থন, হার্ডওয়্যার মধ্যে প্রথম সম্পূর্ণ এবং সুরক্ষিত বাস্তবায়ন ছিল এর উত্তরসূরী হানিওয়েল 6180 । এটি সম্পূর্ণরূপে হার্ডওয়্যার ভিত্তিক ছিল এবং মাল্টিক্সকে ক্রস-হস্তক্ষেপের সুযোগ ছাড়াই একাধিক ব্যবহারকারীর কোড চালানোর অনুমতি দিয়েছে।
মান

@Vality এছাড়াও, আইবিএম LPAR- র ~ 1972 হয়।
এলিয়ট ফ্রিচ

@ এলিয়টফ্রিশ্চ বাহ, এটি চিত্তাকর্ষক। আমি বুঝতে পারি নি যে এটি বেশ তাড়াতাড়ি ছিল। এই তথ্যের জন্য ধন্যবাদ।
মান 1

48

আপনি দেখতে পাচ্ছেন, এপিআইগুলি অপারেটিং সিস্টেমের অংশ হিসাবে নির্দেশিত নয়।

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

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

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


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

2
ওএস'স বলতে বোঝায় বেশিরভাগ হার্ডওয়্যার নির্দিষ্ট জিনিসগুলি পিছনে / বিমূর্ত স্তরটিতে রাখা হয়। যাইহোক, ওএস নিজেই (বিমূর্ততা) বাস্তবায়ন থেকে বাস্তবায়নের ক্ষেত্রে পৃথক হতে পারে। এখানে কিছু ওএস'স (কম-বেশি) মেনে চলতে পারে এবং সম্ভবত কিছু অন্যান্য রয়েছে তবে সামগ্রিক ওএস'গুলি বিমূর্তির "দৃশ্যমান" অংশে কেবল তার চেয়ে অনেক বেশি পৃথক। পূর্বে যেমন বলা হয়েছে: আপনি উইন্ডোজে / হোম / ব্যবহারকারী খুলতে পারবেন না এবং আপনি একটি * এন * এক্স সিস্টেমে HKEY_LOCAL_MACHINE access ... অ্যাক্সেস করতে পারবেন না। আপনি করতে পারেন এই সাহায্য করার জন্য এই সিস্টেমের কাছাকাছি একসাথে আনা কিন্তু যে সর্বদা "3rd পার্টি" (ওএস অপেশাদার থেকে) হতে হবে ভার্চুয়াল ( "এমুলেশন") সফ্টওয়্যার লিখুন।
রবিআইআইআই

16
@ পল হ্যাঁ বিশেষত, এটি কার্যকরভাবে কার্যকরভাবে প্যাকেজ করা ওএস-নির্দিষ্ট।
অরেঞ্জডগ

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

3
@ পল: এমন একটি প্রোগ্রাম যা কোনও ইনপুট / আউটপুট দেয় না তা হ'ল ফাঁকা প্রোগ্রাম , যা কোনও নো- অপেতে সংকলন করা উচিত।
বার্গি

14

এই সংকলন করার সময় সংকলক ওএস নির্দিষ্ট কিছু করছে?

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

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


12

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

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

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

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


2
এটি লক্ষণীয় উপযুক্ত হতে পারে যে সহজ এক্সিকিউটেবল ফর্ম্যাটগুলি লোড কোডটি ধরে রাখার জন্য প্রয়োজনীয় সামান্য পরিমাণের র্যাম (যদি থাকে তবে) ব্যবহার করে লোড করা যায়, যখন আরও জটিল ফর্ম্যাটগুলির জন্য আরও বড় র‌্যামের পদচিহ্নের প্রয়োজন হতে পারে এবং কিছু ক্ষেত্রে এমনকি লোড হচ্ছে। এমএস-ডস একটি স্বেচ্ছাসেবী বিভাগের অফসেট 0x100 থেকে শুরু করে র‌্যামের সিক্যুয়াল বাইটগুলি পড়ার মাধ্যমে, শেষ ঠিকানা সহ সিএক্স লোড করুন এবং এতে লাফিয়ে 63৩.7575 কে পর্যন্ত COM ফাইলগুলি লোড করবেন। সিঙ্গল-পাস সংকলন ব্যাক-প্যাচিং ছাড়াই (ফ্লপিগুলি সহ দরকারী) সম্পন্ন করা যায় ...
সুপারক্যাট

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

9

আমার আর একটি উত্তর থেকে :

প্রারম্ভিক ডস মেশিনগুলি বিবেচনা করুন এবং মাইক্রোসফ্টের বিশ্বে আসল অবদান কী ছিল:

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

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

এখন 10 টি প্রোগ্রাম এবং 10 প্রিন্টার সহ, কেবলমাত্র 20 টুকরো কোড লিখতে হবে, এবং যেহেতু কোডটির মাইক্রোসফ্ট দিকটি সবার জন্য একই ছিল, তখন এমএস থেকে প্রাপ্ত উদাহরণগুলির অর্থ আপনার খুব কম কাজ করতে হবে।

এখন কোনও প্রোগ্রাম কেবলমাত্র 10 টি প্রিন্টারে সীমাবদ্ধ ছিল না তারা সমর্থন করতে বেছে নিয়েছিল, তবে সমস্ত প্রিন্টার যাদের প্রযোজকরা উইন্ডোতে ড্রাইভার সরবরাহ করেছিলেন।

সুতরাং ওএস অ্যাপ্লিকেশনগুলিতে পরিষেবা সরবরাহ করে যাতে অ্যাপ্লিকেশনগুলিকে অপ্রয়োজনীয় কাজ করতে হয় না।

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

ওএস এই সংস্থানগুলি সরবরাহ করে বলে প্রোগ্রামাররা সামান্য কাজ দিয়ে আরও অনেক কিছু সম্পাদন করতে পারে।

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

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

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


7

আসলে, বাস্তব উত্তর যে যদি একই এক্সিকিউটেবল বাইনারি ফাইল বিন্যাস বুঝতে যে অপারেটিং সিস্টেম করেছিল এবং আপনি শুধুমাত্র যা OS প্রদান (গ মান লাইব্রেরিতে মত) প্রমিত ফাংশন নিজেকে সীমাবদ্ধ (যা অপারেটিং সিস্টেমের প্রদান করবেন), তারপর আপনার সফ্টওয়্যার would আসলে, যে কোনও ওএসে চালান।

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

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

মূলত, এটি নিখুঁতভাবে সম্ভব। আসলে, ডাব্লুআইএন সরাসরি লিনাক্সে উইন্ডোজ এক্সিকিউটেবল চালায় ।
তবে এটি এক টন কাজ এবং (সাধারণত) বাণিজ্যিকভাবে অযৌক্তিক।

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


মজাদার ঘটনা: এখানে একটি স্ট্যান্ডার্ডাইজড পজিজ বাইনারি ফর্ম্যাট রয়েছে যা ওএসস জুড়ে চালানো যেতে পারে। এটি কেবল সাধারণভাবে ব্যবহৃত হয় না।
মার্সিন

@ মার্সিন: দেখে মনে হচ্ছে আপনি উইন্ডোজকে কোনও ওএস হিসাবে বিবেচনা করেন না। (বা আপনি কী বলছেন যে উইন্ডোজ পসিক্স বাইনারি চালাতে পারে ?!) আমার উত্তরের উদ্দেশ্যে পসিক্স আমি যে ধরণের স্ট্যান্ডার্ডের কথা উল্লেখ করছি তা নয়। এক্স ইন পসিএসএক্স ইউনিক্সকে বোঝায়। এটি কখনও উইন্ডোজ দ্বারা ব্যবহারের উদ্দেশ্যে করা হয়নি, যদিও উইন্ডোজটির কোনও পসিক্স সাবসিস্টেম আছে।
মেহরদাদ

1. সমস্ত ওএস জুড়ে না চালিয়ে একাধিক ওএস জুড়ে কিছু চলতে পারে; ২. উইন্ডোজ এনটি পিসিক্স বাইনারি চালাতে সক্ষম হয়েছে।
মার্সিন

1
@Marcin: (1) এর মতো আমি বললাম, POSIX মধ্যে X ঘোরা ইউনিক্স । এটি এমন কোনও স্ট্যান্ডার্ড নয় যা অন্যান্য ওএস দ্বারা অনুসরণ করা হয়েছিল, এটি বিভিন্ন ইউনিক্সের মধ্যে একটি সাধারণ ডিনোমিনেটরের কাছে পৌঁছানোর চেষ্টা ছিল, যা দুর্দান্ত কিন্তু আশ্চর্যজনক নয়। ইউনিক্স ওএসের একাধিক স্বাদ রয়েছে এ বিষয়টি যে ইউনিক্সের তুলনায় অন্যান্য অপারেটিং সিস্টেমগুলিতে সামঞ্জস্যতা তৈরি করার চেষ্টা করেছি তার সাথে সম্পূর্ণ অপ্রাসঙ্গিক । (২) আপনি # 2 এর জন্য একটি রেফারেন্স সরবরাহ করতে পারেন?
মেহরদাদ

1
@ মেহরদাদ: মার্সিন ঠিক বলেছেন; উইন্ডোজ এসইউএ (ইউনিক্স অ্যাপ্লিকেশনগুলির জন্য সাবসিস্টেম)
পসিক্স

5

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

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

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

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

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

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

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

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


3

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


3
জাভা ভার্চুয়াল মেশিনে চলে, যদিও এটি ক্রস-ওএস নয়। আপনাকে প্রতিটি ওএসের জন্য আলাদা জেভিএম বাইনারি ব্যবহার করতে হবে
ইজকাটা

3
@ ইজকাটা সত্য, তবে আপনি সফ্টওয়্যারটি পুনরায় সংকলন করেন না (কেবল জেভিএম)। এছাড়াও, আমার শেষ বাক্যটি দেখুন। তবে আমি সূচিত করব একটি মাইক্রো প্রসেসর যা সরাসরি বাইট-কোড চালায়।
এলিয়ট ফ্রিচ

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

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

1

তুমি বলো

নির্দিষ্ট অপারেটিং সিস্টেমের জন্য প্রোগ্রামিং ভাষা ব্যবহার করে তৈরি সফ্টওয়্যার কেবল তাদের সাথে কাজ করে

তবে উদাহরণ হিসাবে আপনি যে প্রোগ্রামটি দেন তা অনেকগুলি অপারেটিং সিস্টেম এবং এমনকি কিছু খালি-ধাতব পরিবেশে কাজ করবে।

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


6
এটি বেশ পরিষ্কার বলে মনে হয় যে ওপি সোর্স কোড নয়, বাইনারি সম্পর্কে জিজ্ঞাসা করছে।
কালেব

0

অন্যান্য ব্যক্তি প্রযুক্তিগত বিবরণগুলি ভালভাবে কভার করেছেন, আমি একটি কম প্রযুক্তিগত কারণ, UX / UI বিষয়গুলির দিক উল্লেখ করতে চাই:

একবার লিখুন, সর্বত্র বিশ্রী মনে করুন

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

এগুলির মধ্যে অনেকগুলি সামান্য বিশদ, তবে এগুলি ভুল হয়ে যায় এবং আপনি আপনার ব্যবহারকারীদের হতাশ করবেন:

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

এমনকি প্রযুক্তিগতভাবে যেখানেই সর্বত্র চলতে থাকে এমন একটি ইউআই কোডবেস লেখা সম্ভব, প্রতিটি সমর্থিত অপারেটিং সিস্টেমের জন্য সামঞ্জস্য করা ভাল।


-2

এই মুহুর্তে একটি গুরুত্বপূর্ণ পার্থক্য হ'ল সংযোজকটিকে লিঙ্কার থেকে আলাদা করা। সংকলক সম্ভবত কমপক্ষে একই আউটপুট উত্পাদন করে (পার্থক্য বেশিরভাগ বিভিন্ন কারণে হয় #if WINDOWS)। অন্যদিকে লিঙ্কারটিকে সমস্ত প্ল্যাটফর্মের নির্দিষ্ট জিনিসগুলি পরিচালনা করতে হবে - গ্রন্থাগারগুলির সাথে সংযোগ স্থাপন, এক্সিকিউটেবল ফাইল তৈরি করা ইত্যাদি has

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

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

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

ডস-যুগের সফ্টওয়্যারটি প্রায়শই বাইনারি-বহনযোগ্য ছিল, তবে আপনাকে বুঝতে হবে যে এটি ডস বা ইউনিক্সের বিরুদ্ধেও নয়, বরং নির্দিষ্ট আইটেমের বিপরীতে তৈরি হয়েছিল যা বেশিরভাগ আইবিএম-স্টাইলের পিসিগুলির মধ্যে সাধারণ ছিল - আজ যে এপিআই কলগুলি তা অফলোড করে সফ্টওয়্যার বাধা দেয়। এটি স্ট্যাটিক লিঙ্কিংয়ের প্রয়োজন নেই, যেহেতু আপনাকে কেবল প্রয়োজনীয় রেজিস্টারগুলি সেট করতে হয়েছিল, int 13hগ্রাফিক্স ফাংশনগুলির জন্য যেমন কল করুন এবং সিপিইউ কেবল বাধা টেবিলে ঘোষিত একটি মেমরি পয়েন্টারে উঠে গেল। অবশ্যই, আবার অনুশীলনটি ছিল বেশ কৌতূহলযুক্ত, কারণ প্যাডেল-টু-মেটাল পারফরম্যান্স পাওয়ার জন্য আপনাকে সেই সমস্ত পদ্ধতি নিজেই লিখতে হয়েছিল, তবে এটি মূলত ওএসকে পুরোপুরি ঘুরে দেখার পরিমাণ। এবং অবশ্যই, এমন কিছু আছে যা সর্বদা ওএস এপিআই - প্রোগ্রামের সমাপ্তির সাথে ইন্টারঅ্যাকশন প্রয়োজন। তবে তবুও, যদি আপনি সহজতম ফর্ম্যাটগুলি ব্যবহার করেন তবে (যেমনCOMডস-এ, যার কোনও শিরোনাম নেই, কেবল নির্দেশাবলী) এবং প্রস্থান করতে চান না, ভাল - ভাগ্যবান আপনি! এবং অবশ্যই, আপনি রানটাইমেও যথাযথ সমাপ্তি পরিচালনা করতে পারেন, সুতরাং আপনার একই ইউজিক্টে ইউনিক্স টার্মিনেশন এবং ডস টার্মিনেশন উভয়ের কোড থাকতে পারে এবং রানটাইমে কোনটি ব্যবহার করতে হবে তা সনাক্ত করতে পারেন :)


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