অ্যাপ্লিকেশন বাইনারি ইন্টারফেস (এবিআই) কী?


492

আমি কখনই পরিষ্কারভাবে বুঝতে পারি নি যে এবিআই কী। দয়া করে আমাকে উইকিপিডিয়া নিবন্ধে নির্দেশ করবেন না। আমি যদি এটি বুঝতে পারি তবে আমি এখানে এত দীর্ঘ পোস্ট দিচ্ছি না।

এটি বিভিন্ন ইন্টারফেস সম্পর্কে আমার মানসিকতা:

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

ইন্টারফেস: এটি functionalityএবং consumerকার্যকারিতাটির মধ্যে এটি একটি "বিদ্যমান সত্তা" স্তর । একটি ইন্টারফেস নিজে থেকে কিছু করে না। এটি কেবল পিছনে পড়ে থাকা কার্যকারিতাটির জন্য প্রার্থনা করে।

ব্যবহারকারী বর্তমানে বিভিন্ন ধরণের ইন্টারফেস রয়েছে তার উপর নির্ভর করে।

কমান্ড লাইন ইন্টারফেস (সিএলআই) কমান্ডগুলি বিদ্যমান সত্তা, ভোক্তা ব্যবহারকারী এবং কার্যকারিতা পিছনে থাকে।

functionality: আমার সফ্টওয়্যার কার্যকারিতা যা কিছু উদ্দেশ্য সমাধান করে যা আমরা এই ইন্টারফেসটি বর্ণনা করছি।

existing entities: কমান্ড

consumer: ব্যবহারকারী

গ্রাফিকাল ইউজার ইন্টারফেস (জিইউআই) উইন্ডো, বোতাম ইত্যাদি বিদ্যমান সত্তা এবং আবার গ্রাহকই ব্যবহারকারী এবং কার্যকারিতা পিছনে রয়েছে।

functionality: আমার সফ্টওয়্যার কার্যকারিতা যা কিছু সমস্যা সমাধান করে যা আমরা এই ইন্টারফেসটি বর্ণনা করছি।

existing entities: উইন্ডো, বোতাম ইত্যাদি

consumer: ব্যবহারকারী

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

functionality: আমার সফ্টওয়্যার কার্যকারিতা যা কিছু সমস্যা সমাধান করে যা আমরা এই ইন্টারফেসটি বর্ণনা করছি।

existing entities: ফাংশন, ইন্টারফেস (ফাংশনের অ্যারে)

consumer: অন্য প্রোগ্রাম / অ্যাপ্লিকেশন।

অ্যাপ্লিকেশন বাইনারি ইন্টারফেস (এবিআই) এখানেই আমার সমস্যা শুরু হয়।

functionality: ???

existing entities: ???

consumer: ???

  • আমি বিভিন্ন ভাষায় সফ্টওয়্যার লিখেছি এবং বিভিন্ন ধরণের ইন্টারফেস (সিএলআই, জিইউআই, এবং এপিআই) সরবরাহ করেছি, তবে আমি নিশ্চিত নই যে আমি কখনও কোনও এবিআই সরবরাহ করেছি কিনা।

উইকিপিডিয়া বলেছেন:

ABIs যেমন বিবরণ আবরণ

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

অন্যান্য এবিআইআই যেমন বিশদ বিবরণীকরণ করে

  • সি ++ নাম ম্যাংলিং,
  • ব্যতিক্রম প্রচার এবং
  • একই প্ল্যাটফর্মের সংকলকগুলির মধ্যে কলিং কনভেনশন, তবে ক্রস-প্ল্যাটফর্মের সামঞ্জস্যের প্রয়োজন হয় না।
  • কার এই বিশদ দরকার? দয়া করে ওএস না বলুন। আমি সমাবেশ প্রোগ্রামিং জানি। লিঙ্কিং ও লোডিং কীভাবে কাজ করে তা আমি জানি। আমি ভিতরে জানি কি ঠিক জানি।

  • সি ++ নাম ম্যাংলিং কেন এল? আমি ভেবেছিলাম আমরা বাইনারি স্তরে কথা বলছি। ভাষা কেন আসে?

যাইহোক, আমি [পিডিএফ] সিস্টেম ভি অ্যাপ্লিকেশন বাইনারি ইন্টারফেস সংস্করণ 4.1 (1997-03-18) ডাউনলোড করেছি এটিতে কী রয়েছে তা দেখতে। ভাল, এর বেশিরভাগই কোনও ধারণা রাখেনি।

  • ইএলএফ ফাইল ফর্ম্যাটটি বর্ণনা করতে কেন এটিতে দুটি অধ্যায় (চতুর্থ এবং 5 ম) রয়েছে ? আসলে, এই স্পেসিফিকেশনের কেবলমাত্র দুটি গুরুত্বপূর্ণ অধ্যায়। বাকি অধ্যায়গুলি "প্রসেসর নির্দিষ্ট"। যাইহোক, আমি যদিও এটি সম্পূর্ণ আলাদা বিষয়। দয়া করে বলুন না যে ELF ফাইল ফরম্যাট নির্দিষ্টকরণের হয় ABI- র। সংজ্ঞা অনুযায়ী এটি ইন্টারফেস হওয়ার যোগ্যতা অর্জন করে না ।

  • আমি জানি, যেহেতু আমরা এত নিচু স্তরে কথা বলছি এটি অবশ্যই খুব নির্দিষ্ট হওয়া উচিত। তবে আমি নিশ্চিত না যে কীভাবে এটি "নির্দেশিকা আর্কিটেকচার (আইএসএ)" সুনির্দিষ্ট?

  • আমি মাইক্রোসফ্ট উইন্ডোজ 'এবিআই কোথায় পেতে পারি?

সুতরাং, এগুলি আমার কাছে প্রধান সমস্যাগুলি g


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

8
আমি মনে করি প্রশ্নটি এতটাই স্পষ্ট; উত্তর ফর্ম্যাটটি কী প্রত্যাশা করা হয়েছে তা সঠিকভাবে বর্ণনা করছে এবং এখনও কোনও সন্তোষজনক উত্তর নয় যা গ্রহণযোগ্য can
কিংবদন্তি

3
@ কিংবদন্তি 2 কে এই বিষয়ে আমার বক্তব্যটি হ'ল ওপি সত্যই জানে যে কোনও এবিআই কী, তবে তা উপলব্ধি করে না। প্রোগ্রামারদের সিংহভাগ কখনও কখনও এবিআই ডিজাইন বা সরবরাহ করে না, কারণ এটি ওএস / প্ল্যাটফর্ম ডিজাইনারদের কাজ।
জেস্পের

4
@ জেস্পার: আমি আপনার বক্তব্যের সাথে একমত নই। তবে সম্ভবত ওপি এটিকে স্পষ্টভাবে জানতে চায়, সে / সে উপযুক্ত দেখায়, যদিও তার কোনও এবিআই সরবরাহ করার প্রয়োজন নেই।
কিংবদন্তি 2 কে

2
আমি অজ্ঞ ছিলাম। সম্প্রতি এই সমস্ত জিনিস নিয়ে কাজ করার সময়। আমি বুঝতে পেরেছি এবিআই আসলে কী। হ্যাঁ, আমি সম্মতি দিচ্ছি যে আমার টেম্পলেটটি ত্রুটিযুক্ত। আমার টেম্পলেটের সাথে এটিআই-তে ফিট করা উপযুক্ত নয়। ধন্যবাদ @ জ্যাস্পারই। আপনার উত্তরটি উপলব্ধি করতে এটি কেবল কাজের অভিজ্ঞতা নিয়েছে।
নখ

উত্তর:


533

"এবিআই" বোঝার একটি সহজ উপায় এটি "এপিআই" এর সাথে তুলনা করা।

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

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

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

কখনও কখনও, এবিআই পরিবর্তনগুলি অনিবার্য। এটি যখন ঘটে তখন যে লাইব্রেরিটি ব্যবহার করে এমন কোনও প্রোগ্রাম লাইব্রেরির নতুন সংস্করণ ব্যবহার করার জন্য পুনরায় সংকলন না করা পর্যন্ত কাজ করবে না। যদি এবিআই পরিবর্তন হয় তবে এপিআই পরিবর্তন না করে, তবে পুরাতন এবং নতুন গ্রন্থাগারের সংস্করণগুলিকে কখনও কখনও "উত্স সামঞ্জস্যপূর্ণ" বলা হয়। এর থেকে বোঝা যায় যে একটি লাইব্রেরি সংস্করণের জন্য সংকলিত একটি প্রোগ্রাম অন্যটির সাথে কাজ করবে না, তবে একটির জন্য লিখিত উত্স কোড অন্যটির জন্য কাজ করবে যদি পুনরায় সংকলিত হয়।

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

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

সম্পাদনা:সিএসভি এবিআই ডক্সে ইএলএফ ফাইল ফর্ম্যাট সম্পর্কিত অধ্যায়গুলি সম্পর্কে আপনার প্রশ্ন সম্পর্কে: এই তথ্য অন্তর্ভুক্ত করার কারণ হ'ল ইএলএফ ফর্ম্যাট অপারেটিং সিস্টেম এবং প্রয়োগের মধ্যে ইন্টারফেসকে সংজ্ঞায়িত করে। আপনি যখন ওএসকে কোনও প্রোগ্রাম চালনা করতে বলবেন, তখন এটি একটি নির্দিষ্ট উপায়ে প্রোগ্রামটি ফর্ম্যাট হওয়ার প্রত্যাশা করে এবং (উদাহরণস্বরূপ) বাইনারিটির প্রথম বিভাগটি একটি নির্দিষ্ট মেমরি অফসেটগুলিতে নির্দিষ্ট তথ্য সম্বলিত একটি এলএফ হেডার হিসাবে প্রত্যাশা করে। এইভাবে অ্যাপ্লিকেশন অপারেটিং সিস্টেমটিতে নিজের সম্পর্কে গুরুত্বপূর্ণ তথ্য জানায়। আপনি যদি একটি নন-ইএলএফ বাইনারি ফর্ম্যাটে (যেমন a.out বা PE) কোনও প্রোগ্রাম তৈরি করেন, তবে এমন একটি ওএস যা ELF- ফর্ম্যাটযুক্ত অ্যাপ্লিকেশনগুলির প্রত্যাশা করে বাইনারি ফাইলটি ব্যাখ্যা করতে বা অ্যাপ্লিকেশনটি চালাতে সক্ষম হবে না।

আইআইআরসি, উইন্ডোজ বর্তমানে পোর্টেবল এক্সিকিউটেবল (বা, পিই) ফর্ম্যাট ব্যবহার করে। পিই ফর্ম্যাট সম্পর্কে আরও তথ্যের সাথে সেই উইকিপিডিয়া পৃষ্ঠার "বাহ্যিক লিঙ্কগুলি" বিভাগে লিঙ্ক রয়েছে।

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


2
@ বিটিএ, দুর্দান্ত উত্তরের জন্য ধন্যবাদ কলিং কনভেনশন কি এক ধরণের এবিআই? ধন্যবাদ
ক্যামিনো

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


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

আমি কি বলতে পারি সি সংকলক দ্বারা উত্পন্ন ফাইলগুলির মধ্যে এবিআই রয়েছে?
মিতু রাজ

144

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

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

এছাড়াও, যদি আপনার কাছে একটি -৪-বিট ওএস থাকে যা 32-বিট বাইনারিগুলি কার্যকর করতে পারে তবে আপনার 32-2 এবং 64-বিট কোডের জন্য আলাদা এবিআই থাকবে।

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

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

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

সংকলক লেখার জন্য একটি সংজ্ঞায়িত এবিআই খুব গুরুত্বপূর্ণ very কোনও সংজ্ঞায়িত এবিআই না থাকলে আন্তঃযোগযোগ্য কোড উত্পন্ন করা অসম্ভব।

সম্পাদনা: স্পষ্ট করার জন্য কিছু নোট:

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

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

2
@ জেস্পের, "এবিআই কীভাবে প্যারামিটারগুলি পাস হয়, যেখানে ফেরতের মান স্থাপন করা হয় সেগুলি পরিচালনা করে"
ক্যামিনো

3
হ্যাঁ. যথাযথ নাম "কলিং কনভেনশন", যা এবিআইয়ের একটি অংশ। en.wikipedia.org/wiki/X86_calling_conventions
JesperE

4
এই হল সঠিক এবং সুনির্দিষ্ট ভারবোসিটি ছাড়া উত্তর (বরং গোলমাল )!
নওয়াজ

আমি একটু সমাবেশ করার পরামর্শ দিই recommend এটি মানুষকে আরও স্পষ্টভাবে বুঝতে সহায়তা করবে will
কুনইউ সোসাই

40

আপনি আসলে না সব if-- একটি ABI- র প্রয়োজন

  • আপনার প্রোগ্রামের কার্যকারিতা নেই এবং -
  • আপনার প্রোগ্রামটি এমন একক এক্সিকিউটেবল যা একা চলমান (যেমন একটি এমবেডেড সিস্টেম) যেখানে এটি আক্ষরিক অর্থেই কেবল একমাত্র চলমান বিষয় এবং এটি অন্য কোনও কিছুর সাথে কথা বলার দরকার পড়ে না।

একটি অতি সংক্ষিপ্তসার সংক্ষিপ্তসার:

এপিআই: "আপনি কল করতে পারেন এমন সমস্ত ফাংশন এখানে।"

এবিআই: "এভাবেই কোনও ফাংশন কল করা যায়" "

এবিআই এমন একটি নিয়ম সেট করেছে যা আপনার প্রোগ্রামটি সংকলন করতে সংকলক এবং লিকারগুলি মেনে চলেন যাতে এটি সঠিকভাবে কাজ করবে। ABIs একাধিক বিষয় কভার করে:

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

কলিং কনভেনশন সম্পর্কে আরও গভীর নজর দেওয়া, যা আমি এবিআইয়ের মূল হিসাবে বিবেচনা করি:

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

জাম্পের প্রস্তুতির জন্য, সংকলকটিকে অবশ্যই গুরুত্বপূর্ণ জিনিসগুলির একগুচ্ছ করতে হবে। কলিং কনভেনশন একটি চেকলিস্টের মতো যা সংকলক এই সমস্ত জিনিসগুলি অনুসরণ করে:

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

অনেকগুলি বিভিন্ন এবিআই / কলিং কনভেনশন রয়েছে। প্রধান কয়েকটি হ'ল:

  • X86 বা x86-64 সিপিইউ (32-বিট পরিবেশ) এর জন্য:
    • CDECL
    • STDCALL
    • FASTCALL
    • VECTORCALL
    • THISCALL
  • X86-64 সিপিইউ (64-বিট পরিবেশ) এর জন্য:
    • SYSTEMV
    • MSNATIVE
    • VECTORCALL
  • এআরএম সিপিইউর জন্য (32-বিট)
    • AAPCS
  • এআরএম সিপিইউর জন্য (-৪-বিট)
    • AAPCS64

এখানে একটি দুর্দান্ত পৃষ্ঠা যা বিভিন্ন এবিআইয়ের জন্য সংকলন করার সময় উত্পন্ন সমাবেশের মধ্যে পার্থক্যগুলি দেখায়।

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

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


19

একটি অ্যাপ্লিকেশন বাইনারি ইন্টারফেস (এবিআই) একটি এপিআই এর অনুরূপ, তবে ফাংশনটি সোর্স কোড স্তরে কলারের কাছে অ্যাক্সেসযোগ্য নয়। কেবলমাত্র একটি বাইনারি প্রতিনিধিত্ব অ্যাক্সেসযোগ্য / উপলব্ধ।

এবিআইগুলি প্রসেসর-আর্কিটেকচার স্তরে বা ওএস স্তরে সংজ্ঞায়িত করা যেতে পারে। সংস্থাপকটির কোড জেনারেটর ধাপ অনুসরণ করে এবিআই হ'ল মান। ওএস বা প্রসেসরের মাধ্যমে মানটি স্থির করা হয়।

কার্যকারিতা: বাস্তবায়ন ভাষা বা একটি নির্দিষ্ট সংকলক / লিংক / সরঞ্জামচইনের বিপরীতে ফাংশন কলগুলি করার জন্য প্রক্রিয়া / মানকে সংজ্ঞায়িত করুন। জেএনআই, বা পাইথন-সি ইন্টারফেস ইত্যাদির অনুমতি দেয় এমন ব্যবস্থা সরবরাহ করুন etc.

বিদ্যমান সত্তা: মেশিন কোড আকারে ফাংশন।

গ্রাহক: অন্য একটি ফাংশন (অন্য ভাষায় একটি সহ, অন্য সংকলক দ্বারা সংকলিত, বা অন্য লিঙ্কার দ্বারা সংযুক্ত)।


এবিআইকে স্থপতি দ্বারা সংজ্ঞায়িত করা হবে কেন? একই আর্কিটেকচারের বিভিন্ন ওএস কেন বিভিন্ন এবিআই সংজ্ঞায়িত করতে সক্ষম হবে না?
আন্দ্রেয়াস হাফবার্গ

10

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

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

গ্রাহক: সংকলক, সমাবেশ লেখক, অপারেটিং সিস্টেম, সিপিইউ নির্দিষ্ট আর্কিটেকচার।

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

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

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

সমস্ত এবিআই নির্দেশাবলী নির্দিষ্ট নির্দিষ্ট set একটি এআরএম এবিআই কোনও এমএসপি ৪৩০ বা x86_64 প্রসেসরের মাধ্যমে কোনও অর্থ দেবে না।

উইন্ডোজের বেশ কয়েকটি এবিআই রয়েছে - উদাহরণস্বরূপ, ফাস্টক্যাল এবং স্টাডকাল দুটি সাধারণ ব্যবহার এবিআই s সিস্কেল এবিআই আবার আলাদা।


9

আমাকে আপনার প্রশ্নের একটি অংশের উত্তর দিন। লিনাক্স এবিআই সিস্টেমকলগুলিকে কীভাবে প্রভাবিত করে এবং কেন এটি দরকারী।

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

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


4

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


4

এবিআই এবং এপিআইয়ের মধ্যে পার্থক্য করার সর্বোত্তম উপায় হ'ল এটি কেন এবং কী জন্য ব্যবহৃত হয় তা জেনে রাখা:

X86-64 এর জন্য সাধারণত একটি এবিআই থাকে (এবং x86 32-বিটের জন্য অন্য সেট রয়েছে):

http://www.x86-64.org/documentation/abi.pdf

https://developer.apple.com/library/mac/documentation/DeveloperTools/Conceptual/LowLevelABI/140-x86-64_Function_Calling_Conventions/x86_64.html

http://people.freebsd.org/~obrien/amd64-elf-abi.pdf

লিনাক্স + ফ্রিবিএসডি + ম্যাকোএসএক্স কিছুটা ভিন্ন প্রকারের সাথে এটি অনুসরণ করে। এবং উইন্ডোজ এক্স 64 এর নিজস্ব এবিআই রয়েছে:

http://eli.thegreenplace.net/2011/09/06/stack-frame-layout-on-x86-64/

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

তবে এপিআই পৃথক:

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

উদাহরণস্বরূপ, উইন্ডোজ POSIX এপিআই এর সাথে অনুগত ছিল:

https://en.wikipedia.org/wiki/Windows_Services_for_UNIX

https://en.wikipedia.org/wiki/POSIX

এবং লিনাক্স এছাড়াও পসিক্স অনুগত। তবে বাইনারিগুলি কেবল সরিয়ে নেওয়া যায় না এবং ততক্ষণে চালানো যায়। তবে তারা পসিক্স অনুগত API এ একই নামস ব্যবহার করেছে, আপনি একই সফটওয়্যারটি সি তে নিতে পারেন, এটি বিভিন্ন ওএসে পুনরায় সংকলন করতে এবং তাৎক্ষণিকভাবে এটি চালিয়ে যেতে পারেন।

এপিআই হ'ল সফটওয়্যারটির সংহতকরণ সহজ করার জন্য - প্রাক-সংকলন পর্যায়ে। তাই সংকলনের পরে সফটওয়্যারটি সম্পূর্ণ আলাদা দেখতে পারে - যদি এবিআই আলাদা হয়।

এআইবিআই বাইনারি / অ্যাসেমব্লিয়া স্তরে সফ্টওয়্যারটির সঠিক সংহতকরণ সংজ্ঞায়িত করে।


উইন্ডোজ x86-64 কলিং কনভেনশন অন্য সমস্ত x86-64 ওএস ব্যবহার করে যে এসআইএসভি কলিং কনভেনশন ব্যবহার করে না। লিনাক্স / ওএস এক্স / ফ্রিবিএসডি সকলেই একই কলিং কনভেনশন ভাগ করে নেয় তবে তারা পুরো এবিআই ভাগ করে না । কোনও ওএসের এবিআইতে সিস্টেম-কল নম্বর অন্তর্ভুক্ত থাকে। যেমন freebsd.org/doc/en_US.ISO8859-1/books/developers-andbook/… বলছে যে SYS_execve32 বিট লিনাক্সের 11, তবে ফ্রিবিএসডি তে 59 59
পিটার কর্ডেস

আপনার মন্তব্যের জন্য ধন্যবাদ, আমি আমার মন্তব্য সংশোধন করেছি এবিআই এবং এপিআই এর মধ্যে পার্থক্য ভাল উত্তর।
পিটার তেওহ

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

"ফ্রিবিএসডি সামঞ্জস্য স্তর", এর আগে কখনও শুনেনি। আপনি কি প্রাসঙ্গিক লিনাক্স কার্নেল উত্স কোডটি নির্দেশ করতে পারেন? তবে বিপরীতটি বিদ্যমান: freebsd.org/doc/en_US.ISO8859-1/books/handbook/linuxemu.html
পিটার তেওঁ

এটি আমি ব্যবহার করি এমন কিছু নয়। আমি ভেবেছিলাম এরকম কিছু রয়েছে, তবে সম্ভবত এটি আর নেই। tldp.org/HOWTO/Linux+FreeBSD-6.html বলে যে এটি অনিচ্ছাকৃত , এবং এটি কীভাবে 2000 এর। xD। unix.stackexchange.com/questions/172038/… নিশ্চিত করে যে এটি পরিত্যক্ত এবং কখনও পুনরায় করা হয়নি (যেহেতু কেউ এটির জন্য এটি যথেষ্ট খারাপভাবে চায়নি)। personality(2)সেট করতে পারেন PER_BSD। আমি এইজন্য মনে মনে personality(PER_LINUX)মধ্যে straceআউটপুট সব সময়, কিন্তু আধুনিক 64bit লিনাক্স বাইনেরিতে আর তা করতে হবে না।
পিটার কর্ডেস

4

লিনাক্স শেয়ার করা লাইব্রেরি ন্যূনতম চলমান এবিআই উদাহরণ

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

উদাহরণস্বরূপ:

  • যদি আপনি একটি ভাগ করা লাইব্রেরি বিক্রি করে থাকেন তবে আপনি প্রতিটি নতুন মুক্তির জন্য আপনার লাইব্রেরিতে নির্ভর করে এমন সমস্ত কিছু পুনরায় সংশোধনের বিরক্তি আপনার ব্যবহারকারীদের সংরক্ষণ করুন

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

    এটি সি স্ট্যান্ডার্ড লাইব্রেরির ক্ষেত্রে বিশেষভাবে গুরুত্বপূর্ণ, যা আপনার সিস্টেমে অনেকগুলি প্রোগ্রামের সাথে লিঙ্ক করে।

এখন আমি এটির একটি ন্যূনতম কংক্রিট চালিত উদাহরণ দিতে চাই।

main.c

#include <assert.h>
#include <stdlib.h>

#include "mylib.h"

int main(void) {
    mylib_mystruct *myobject = mylib_init(1);
    assert(myobject->old_field == 1);
    free(myobject);
    return EXIT_SUCCESS;
}

mylib.c

#include <stdlib.h>

#include "mylib.h"

mylib_mystruct* mylib_init(int old_field) {
    mylib_mystruct *myobject;
    myobject = malloc(sizeof(mylib_mystruct));
    myobject->old_field = old_field;
    return myobject;
}

mylib.h

#ifndef MYLIB_H
#define MYLIB_H

typedef struct {
    int old_field;
} mylib_mystruct;

mylib_mystruct* mylib_init(int old_field);

#endif

সংকলন এবং এর সাথে সূক্ষ্ম রান:

cc='gcc -pedantic-errors -std=c89 -Wall -Wextra'
$cc -fPIC -c -o mylib.o mylib.c
$cc -L . -shared -o libmylib.so mylib.o
$cc -L . -o main.out main.c -lmylib
LD_LIBRARY_PATH=. ./main.out

এখন, যে অনুমান গ্রন্থাগার এর v2 জন্য, আমরা একটি নতুন ক্ষেত্র যোগ করতে চান mylib_mystructনামক new_field

যদি আমরা ক্ষেত্রটি এর আগে old_fieldহিসাবে যুক্ত করেছি:

typedef struct {
    int new_field;
    int old_field;
} mylib_mystruct;

এবং লাইব্রেরি পুনর্নির্মাণ কিন্তু না main.out, তারপর জোর ব্যর্থ!

লাইনটি কারণ:

myobject->old_field == 1

intকাঠামোর প্রথমটি অ্যাক্সেস করার চেষ্টা করছে এমন সমাবেশ তৈরি করেছে যা এখন new_fieldপ্রত্যাশার পরিবর্তে old_field

অতএব এই পরিবর্তনটি এবিআইকে ভেঙে দিয়েছে।

তবে, যদি আমরা new_fieldপরে যুক্ত করি old_field:

typedef struct {
    int old_field;
    int new_field;
} mylib_mystruct;

তারপরে পুরানো উত্পন্ন সমাবেশটি এখনও কাঠামোর প্রথমটিতে অ্যাক্সেস করে intএবং প্রোগ্রামটি এখনও কাজ করে, কারণ আমরা এবিআইকে স্থিতিশীল রেখেছিলাম।

এখানে গিটহাবের উপর এই উদাহরণটির একটি সম্পূর্ণ স্বয়ংক্রিয় সংস্করণ

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

এপিআই বনাম এবিআই

পূর্ববর্তী উদাহরণে, এটা খেয়াল করা জরুরী যে যোগ আকর্ষণীয় new_fieldসামনে old_field, শুধুমাত্র ABI- র কপর্দকশূন্য, কিন্তু না API- টি।

এর অর্থ কী, আমরা যদি main.cগ্রন্থাগারের বিরুদ্ধে আমাদের প্রোগ্রামটি পুনরায় সংকলন করি তবে তা নির্বিশেষে কাজ করতে পারত।

আমরা উদাহরণস্বরূপ ফাংশনের স্বাক্ষর বদলে থাকলে আমরা এপিআইও ভেঙে দিতাম:

mylib_mystruct* mylib_init(int old_field, int new_field);

যেহেতু, main.cসম্পূর্ণ সংকলন বন্ধ হবে।

সিমেটিক এপিআই বনাম প্রোগ্রামিং এপিআই

আমরা তৃতীয় ধরণের এপিআই পরিবর্তনগুলিকে শ্রেণিবদ্ধ করতে পারি: অর্থগত পরিবর্তন।

শব্দার্থক এপিআই, সাধারণত এপিআই ডকুমেন্টেশনের মধ্যে অন্তর্ভুক্ত করা হয়, সাধারণত এপিআইয়ের কী করা উচিত তার একটি প্রাকৃতিক ভাষার বিবরণ।

সুতরাং প্রোগ্রামটি নিজেই বিল্ড না করেই সিমেটিক এপিআই ভাঙ্গা সম্ভব।

উদাহরণস্বরূপ, যদি আমরা সংশোধন করেছিলাম

myobject->old_field = old_field;

প্রতি:

myobject->old_field = old_field + 1;

তারপরে এটি প্রোগ্রামিং এপিআই বা এবিআই না ভেঙ্গে যেত, তবে main.cসিমেটিক এপিআই ভেঙে যাবে।

প্রোগ্রামটিমেটিকভাবে চুক্তি এপিআই চেক করার দুটি উপায় রয়েছে:

  • একগুচ্ছ কোণার কেস পরীক্ষা করুন। করা সহজ, তবে আপনি সর্বদা একটি মিস করতে পারেন।
  • আনুষ্ঠানিক যাচাই । আরও কঠিন, তবে সঠিকভাবে গাণিতিক প্রমাণ তৈরি করে, মূলত ডকুমেন্টেশন এবং পরীক্ষাগুলি "মানব" / মেশিন যাচাইযোগ্য পদ্ধতিতে একীকরণ করে! অবশ্যই আপনার আনুষ্ঠানিক বিবরণে কোনও বাগ নেই ;-)

    এই ধারণাটি গণিতের নিজেই আনুষ্ঠানিককরণের সাথে নিবিড়ভাবে সম্পর্কিত: /math/53969/ কি-does-formal-mean/3297537#3297537

সি / সি ++ ভাগ করা লাইব্রেরি এবিআইগুলিকে ভেঙে দেয় এমন সমস্ত কিছুর তালিকা

টোডো: চূড়ান্ত তালিকাটি সন্ধান / তৈরি করুন:

জাভা ন্যূনতম চলমান উদাহরণ

জাভা বাইনারি সামঞ্জস্যতা কি?

উবুন্টু 18.10, জিসিসি 8.2.0 এ পরীক্ষিত।


3

কলটি সফল হয় তা নিশ্চিত হওয়ার জন্য ABI কে কলার এবং কলির মধ্যে সামঞ্জস্যপূর্ণ হওয়া দরকার। স্ট্যাক ব্যবহার, রেজিস্টার ব্যবহার, রুটিন স্ট্যাক পপ। এগুলি সবগুলিই এবিআইয়ের সবচেয়ে গুরুত্বপূর্ণ অংশ।


3

সারসংক্ষেপ

সঠিক স্তরটির বিভিন্ন ব্যাখ্যা এবং দৃ opinions় মতামত রয়েছে যা একটি এবিআই (অ্যাপ্লিকেশন বাইনারি ইন্টারফেস) সংজ্ঞায়িত করে।

আমার দৃষ্টিতে একটি এবিআই হ'ল একটি নির্দিষ্ট এপিআইয়ের জন্য প্রদত্ত / প্ল্যাটফর্ম হিসাবে বিবেচিত বিষয়গুলির একটি বিষয়গত কনভেনশন । এবিআই হ'ল কনভেনশনগুলির "বিশ্রাম" যা কোনও নির্দিষ্ট এপিআইয়ের জন্য "পরিবর্তিত হবে না" বা যা রানটাইম পরিবেশ দ্বারা সম্বোধন করা হবে: এক্সিকিউটর, সরঞ্জাম, লিকারস, সংকলক, জেভিএম এবং ওএস।

একটি ইন্টারফেস সংজ্ঞায়িত : এবিআই, এপিআই

আপনি যদি জোডা টাইমের মতো লাইব্রেরি ব্যবহার করতে চান তবে আপনাকে অবশ্যই নির্ভরতা ঘোষণা করতে হবে joda-time-<major>.<minor>.<patch>.jar। লাইব্রেরি সেরা অনুশীলনগুলি অনুসরণ করে এবং সিমেটিক সংস্করণ ব্যবহার করে । এটি তিনটি স্তরে এপিআই সামঞ্জস্যতা সংজ্ঞা দেয়:

  1. প্যাচ - আপনার সমস্ত কোডে আপনাকে পরিবর্তন করার দরকার নেই। গ্রন্থাগারটি কিছু বাগগুলি ঠিক করে।
  2. অপ্রাপ্তবয়স্ক - সংযোজন থেকে আপনার কোড পরিবর্তন করার দরকার নেই
  3. মেজর - ইন্টারফেস (এপিআই) পরিবর্তিত হয়েছে এবং আপনার কোড পরিবর্তন করার প্রয়োজন হতে পারে।

একই লাইব্রেরির নতুন একটি প্রধান প্রকাশের জন্য আপনাকে প্রচুর অন্যান্য কনভেনশন সম্মান করতে হবে:

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

উদাহরণ

জাভা কেস স্টাডি

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

জাভা এবিআইয়ের জন্য আরও দুটি আকর্ষণীয় কেস স্টাডি সরবরাহ করে: স্কালাল সংস্করণ এবং ডালভিক ভার্চুয়াল মেশিন।

ডালভিক ভার্চুয়াল মেশিনটি এবিআইকে ভেঙে দিয়েছে

ডালভিক ভিএম জাভা বাইটকোডের চেয়ে আলাদা ধরণের বাইটকোডের প্রয়োজন। ডালভিক লাইব্রেরিগুলি ডালভিকের জন্য জাভা বাইটকোড (একই এপিআই সহ) রূপান্তর করে প্রাপ্ত হয়। এইভাবে আপনি একই API এর দুটি সংস্করণ পেতে পারেন: মূল দ্বারা সংজ্ঞায়িত joda-time-1.7.2.jar। আমরা আমাকে ফোন করতে পারি joda-time-1.7.2.jarএবং joda-time-1.7.2-dalvik.jar। তারা স্ট্যাক-ওরিয়েন্টেড স্ট্যান্ডার্ড জাভা ভিএমএসের জন্য একটি ভিন্ন এবিআই ব্যবহার করে: ওরাকল এর একটি, আইবিএম এর একটি, খোলা জাভা বা অন্য কোনও; এবং দ্বিতীয় এবিআই হল ডালভিকের আশেপাশের একটি one

স্কেলার ক্রমাগত রিলিজগুলি বেমানান

ছোট স্কাল সংস্করণ: ২ এক্স এর মধ্যে স্কালার বাইনারি সামঞ্জস্য নেই। এই কারণে একই API "io.reactivex" %% "rxscala"% "0.26.5" এর তিনটি সংস্করণ রয়েছে (ভবিষ্যতে আরও): স্কেলার 2.10, 2.11 এবং 2.12 এর জন্য। কী বদলে গেল? আমি আপাতত জানি না , তবে বাইনারিগুলি সামঞ্জস্যপূর্ণ নয়। সম্ভবত সর্বশেষতম সংস্করণগুলি এমন জিনিসগুলি যুক্ত করেছে যা পুরাতন ভার্চুয়াল মেশিনগুলিতে লাইব্রেরিগুলিকে অযোগ্য করে তোলে, সম্ভবত লিঙ্কিং / নামকরণ / পরামিতি কনভেনশন সম্পর্কিত জিনিস।

জাভা ধারাবাহিক রিলিজগুলি বেমানান

জেভিএম-এর বড় রিলিজগুলির সাথে জাভাতেও সমস্যা রয়েছে: 4,5,6,7,8,9। তারা কেবল পিছিয়ে সামঞ্জস্যের অফার করে। -targetজেভিএম 9 অন্যান্য অন্যান্য সংস্করণগুলির জন্য কোড সংকলিত / টার্গেটেড (জাভাকের বিকল্প) কীভাবে চালাতে হয় তা জানে, এবং জেভিএম 4 জেভিএম 5-র জন্য লক্ষ্যযুক্ত কোড কীভাবে চালাতে হয় তা জানে না these এই সমস্ত আপনার কাছে একটি জোডা লাইব্রেরি থাকা অবস্থায় রয়েছে। এই অসঙ্গতিটি বিভিন্ন সমাধানের জন্য রাডারকে ধন্যবাদ জানায়:

  1. শব্দার্থক সংস্করণ: যখন গ্রন্থাগারগুলি উচ্চতর জেভিএমকে লক্ষ্য করে তখন তারা সাধারণত প্রধান সংস্করণ পরিবর্তন করে।
  2. এভিআই হিসাবে জেভিএম 4 ব্যবহার করুন এবং আপনি নিরাপদ।
  3. জাভা 9 আপনি একই লাইব্রেরিতে নির্দিষ্ট টার্গেটযুক্ত জেভিএমের জন্য বাইটকোড কীভাবে অন্তর্ভুক্ত করতে পারেন সে সম্পর্কে একটি স্পেসিফিকেশন যুক্ত করে।

আমি কেন এপিআই সংজ্ঞা দিয়ে শুরু করেছি?

আপনি কীভাবে সামঞ্জস্যতা সংজ্ঞায়িত করেন সে সম্পর্কে এপিআই এবং এবিআই কেবল কনভেনশন। নিম্ন স্তরগুলি উচ্চ স্তরের শব্দার্থবিজ্ঞানের আধিক্যের ক্ষেত্রে জেনেরিক। এজন্য কয়েকটি সম্মেলন করা সহজ। প্রথম ধরণের সম্মেলনগুলি হ'ল মেমরি সারিবদ্ধকরণ, বাইট এনকোডিং, কলিং কনভেনশনগুলি, বড় এবং সামান্য এরিয়ান এনকোডিং ইত্যাদি them তাদের উপরে আপনি বর্ণিত, সংযোগকারী সংযোগগুলি, জাভা বা ব্যবহৃত ব্যবহারের মতো মধ্যবর্তী বাইট কোডের মতো সম্পাদনযোগ্য কনভেনশন পান জিসিসি দ্বারা ব্যবহৃত এলএলভিএম আইআর। তৃতীয় আপনি কীভাবে গ্রন্থাগারগুলি সন্ধান করবেন, সেগুলি কীভাবে লোড করবেন (জাভা শ্রেণিবদ্ধ দেখুন) সম্পর্কে কনভেনশন পান get আপনি ধারণাগুলিতে উচ্চতর ও উচ্চতর যেতে আপনার নতুন কনভেনশন রয়েছে যা আপনি প্রদত্ত হিসাবে বিবেচনা করছেন। সে কারণেই তারা এটি শব্দার্থক সংস্করণে স্থান দেয়নি ।সংস্করণ। আমরা এর সাথে শব্দার্থক সংস্করণ সংশোধন করতে পারে <major>-<minor>-<patch>-<platform/ABI>। এই আসলে ইতিমধ্যে ঘটছে হল: প্ল্যাটফর্ম ইতিমধ্যে একটি rpm, dll, jar(জেভিএম বাইটকোড), war(JVM + + ওয়েব সার্ভার), apk, 2.11(নির্দিষ্ট Scala সংস্করণ) ইত্যাদি। আপনি যখন APK বলছেন আপনি ইতিমধ্যে আপনার API এর নির্দিষ্ট ABI অংশ সম্পর্কে কথা বলবেন।

এপিআই বিভিন্ন এবিআইতে পোর্ট করা যায়

বিমূর্তনের শীর্ষ স্তরের (সর্বাধিক এপিআই এর বিপরীতে লিখিত উত্সগুলি অন্য কোনও নিম্ন স্তরের বিমূর্তিতে পুনরায় সংযোগ / পোর্ট করা যেতে পারে।

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

ভাষাগুলিতে এপিআইগুলি পোর্ট করা হয়েছে

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


1

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


1

আমি এবিআইও বোঝার চেষ্টা করছিলাম এবং জেস্পেরই এর উত্তরটি খুব সহায়ক ছিল।

খুব সাধারণ দৃষ্টিকোণ থেকে, আমরা বাইনারি সামঞ্জস্য বিবেচনা করে এবিআই বোঝার চেষ্টা করতে পারি।

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

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

  1. একই / পশ্চাদপটে সামঞ্জস্যপূর্ণ নির্দেশ সেট আর্কিটেকচার (প্রসেসরের নির্দেশাবলী, ফাইলের কাঠামো, স্ট্যাক সংগঠন, মেমরি অ্যাক্সেসের প্রকারের পাশাপাশি মাপ, লেআউট এবং প্রসেসর সরাসরি অ্যাক্সেস করতে পারে এমন বেসিক ডেটা প্রকারের প্রান্তিককরণ)
  2. একই আহ্বান সম্মেলন
  3. একই নাম ম্যাঙ্গলিং কনভেনশন (যদি বলা যেতে পারে যে কোনও ফোর্টরান প্রোগ্রামকে কিছু সি ++ গ্রন্থাগার ফাংশন কল করতে হবে)।

অবশ্যই, অন্যান্য অনেকগুলি বিবরণ রয়েছে তবে এটি বেশিরভাগই এটিআইআই কভার করে।

আপনার প্রশ্নের আরও উত্তর দেওয়ার জন্য উপরের দিক থেকে আমরা অনুমান করতে পারি:

এবিআই কার্যকারিতা: বাইনারি সামঞ্জস্য

বিদ্যমান সত্তা: বিদ্যমান প্রোগ্রাম / লাইব্রেরি / ওএস

গ্রাহক: গ্রন্থাগার, ওএস

আশাকরি এটা সাহায্য করবে!


1

অ্যাপ্লিকেশন বাইনারি ইন্টারফেস (এবিআই)

কার্যকারিতার:

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

বিদ্যমান সত্ত্বা:

  • লজিক্যাল ব্লকগুলি যা প্রোগ্রামের সম্পাদনায় সরাসরি অংশ নেয়: ALU, সাধারণ উদ্দেশ্যে নিবন্ধন করে, মেমরি / I / O ম্যাপিংয়ের জন্য I / O ইত্যাদি রেজিস্টার করে ...

ভোক্তা:

  • ভাষা প্রসেসর লিঙ্কার, এসেম্বেলার ...

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

সি ++ নাম ম্যাংলিং কারণ বিভিন্ন উচ্চ স্তরের ভাষাগুলি থেকে অবজেক্ট ফাইলগুলি আপনার অ্যাপ্লিকেশনে লিঙ্ক করার প্রয়োজন হতে পারে। জিসিসি স্ট্যান্ডার্ড লাইব্রেরি তৈরির জন্য ভিজুয়াল সি ++ দিয়ে বিল্ট উইন্ডোজে সিস্টেম কলগুলি বিবেচনা করুন।

ELF হ'ল ব্যাখ্যা করার জন্য কোনও অবজেক্ট ফাইল থেকে লিঙ্কারের সম্ভাব্য প্রত্যাশা, যদিও জেভিএমের অন্য কোনও ধারণা থাকতে পারে।

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


1

এবিআই শব্দটি দুটি স্বতন্ত্র তবে সম্পর্কিত ধারণাটি ব্যবহার করতে ব্যবহৃত হয়।

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

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

কোনও লাইব্রেরিতে পরিবর্তনগুলি এপিআই না ভেঙে এবিআইকে ভেঙে ফেলতে পারে। উদাহরণস্বরূপ একটি ইন্টারফেসের মতো লাইব্রেরি বিবেচনা করুন।

void initfoo(FOO * foo)
int usefoo(FOO * foo, int bar)
void cleanupfoo(FOO * foo)

এবং অ্যাপ্লিকেশন প্রোগ্রামার কোড পছন্দ করে

int dostuffwithfoo(int bar) {
  FOO foo;
  initfoo(&foo);
  int result = usefoo(&foo,bar)
  cleanupfoo(&foo);
  return result;
}

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

ওটিওএইচ যদি গ্রন্থাগারের লেখক তাদের এপিআই এর মতো ডিজাইন করে থাকেন।

FOO * newfoo(void)
int usefoo(FOO * foo, int bar)
void deletefoo((FOO * foo, int bar))

এবং অ্যাপ্লিকেশন প্রোগ্রামার কোড পছন্দ করে

int dostuffwithfoo(int bar) {
  FOO * foo;
  foo = newfoo();
  int result = usefoo(foo,bar)
  deletefoo(foo);
  return result;
}

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


0

ABI- দুটি বাইনারি প্রোগ্রামের অংশগুলিরApplication Binary Interface মধ্যে রানটাইমের সময় একটি মেশিন কোড যোগাযোগ সম্পর্কিত - অ্যাপ্লিকেশন, গ্রন্থাগার, ওএস ... বর্ণনা করে যে কীভাবে বস্তুগুলিকে মেমরিতে সংরক্ষণ করা হয় এবং কীভাবে ফাংশন বলা হয় ( )ABIcalling convention

এপিআই এবং এবিআইয়ের একটি ভাল উদাহরণ হ'ল আইওএস ইকোসিস্টেম যা সুইফট ল্যাঙ্গুয়েজ

  • Application- আপনি যখন বিভিন্ন ভাষা ব্যবহার করে একটি অ্যাপ্লিকেশন তৈরি করেন। উদাহরণস্বরূপ আপনি Swiftএবং [মিক্সিং সুইফট এবং উদ্দেশ্য-সি] ব্যবহার করে অ্যাপ্লিকেশন তৈরি করতে পারেনObjective-C

  • Application - OS- রানটাইম - Swift runtimeএবং standard librariesএটি ওএসের অংশ এবং এগুলি প্রতিটি বান্ডেলে অন্তর্ভুক্ত করা উচিত নয় (যেমন অ্যাপ্লিকেশন, ফ্রেমওয়ার্ক)। এটি ওজেক্টিভ-সি ব্যবহারের মতো

  • Library- Module Stabilityকেস - সংকলনের সময় - আপনি একটি ফ্রেমওয়ার্ক আমদানি করতে সক্ষম হবেন যা সুইফটের সংকলকটির অন্য সংস্করণ দিয়ে নির্মিত হয়েছিল। এর অর্থ এটি একটি বদ্ধ-উত্স (প্রাক-বিল্ড) বাইনারি তৈরি করা সুরক্ষা যা কোনও সংকলকের বিভিন্ন সংস্করণ দ্বারা .swiftinterfaceব্যবহৃত হবে (এর সাথে ব্যবহৃত হয় .swiftmodule) এবং আপনি পাবেন না

    Module compiled with _ cannot be imported by the _ compiler
    
  • Library- Library Evolutionকেস

    1. সংকলন সময় - যদি নির্ভরতা পরিবর্তন করা হয় তবে ক্লায়েন্টকে পুনরায় সংযোগ করতে হবে না।
    2. রানটাইম - একটি সিস্টেম লাইব্রেরি বা একটি গতিশীল কাঠামো একটি নতুন দ্বারা গরম করা যেতে পারে।

[এপিআই বনাম এবিআই]

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