API এবং ABI এর মধ্যে পার্থক্য


192

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

এপিআই এর সংজ্ঞা:

একটি এআইপিআই ইন্টারফেসগুলি সংজ্ঞায়িত করে যার মাধ্যমে সফ্টওয়্যারের একটি অংশ অন্য স্তরের সাথে উত্স স্তরে যোগাযোগ করে।

এবিআইয়ের সংজ্ঞা:

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

কোনও প্রোগ্রাম কীভাবে উত্স স্তরে যোগাযোগ করতে পারে? উত্স স্তর কি? এটি যেভাবেই উত্স কোডের সাথে সম্পর্কিত? বা লাইব্রেরির উত্সটি মূল প্রোগ্রামটিতে অন্তর্ভুক্ত হয়?

আমি কেবলমাত্র পার্থক্য জানি এপিআই বেশিরভাগ প্রোগ্রামারদের দ্বারা ব্যবহৃত হয় এবং এবিআই বেশিরভাগ সংকলক দ্বারা ব্যবহৃত হয়।


2
উত্স স্তরের দ্বারা তারা ফাংশন সংজ্ঞা প্রকাশের জন্য ফাইল অন্তর্ভুক্ত করার মতো কিছু বোঝায়
যেকোনর্ক

1
আরো দেখুন stackoverflow.com/q/2171177/632951
Pacerier

উত্তর:


49

এপিআই হ'ল মানুষেরা যা ব্যবহার করে। আমরা উত্স কোড লিখি। যখন আমরা কোনও প্রোগ্রাম লিখি এবং কিছু লাইব্রেরি ফাংশন ব্যবহার করতে চাই আমরা কোড লিখি যেমন:

 long howManyDecibels = 123L;
 int ok = livenMyHills( howManyDecibels);

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


309

এপিআই: অ্যাপ্লিকেশন প্রোগ্রাম ইন্টারফেস

এটি আপনার অ্যাপ্লিকেশন / গ্রন্থাগার থেকে প্রকাশিত সর্বজনীন প্রকার / ভেরিয়েবল / ফাংশনগুলির সেট।

সি / সি ++ এ আপনি অ্যাপ্লিকেশনটি দিয়ে যে শিরোলেখ ফাইলগুলি প্রেরণ করেন তা এটিই প্রকাশ করে।

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

এইভাবে সংকলক একটি অ্যাপ্লিকেশন তৈরি করে।
এটি জিনিসগুলি সংজ্ঞায়িত করে (তবে সীমাবদ্ধ নয়):

  • পরামিতিগুলি কীভাবে ফাংশনে (নিবন্ধক / স্ট্যাক) পাস হয়।
  • কে স্ট্যাক (কলার / কলি) থেকে পরামিতিগুলি পরিষ্কার করে।
  • যেখানে ফেরতের জন্য ফেরতের মান স্থাপন করা হয়।
  • ব্যতিক্রম কীভাবে প্রচার করে।

17
এটিই হ'ল এবিআই কী, এর সবচেয়ে সংক্ষিপ্ত ব্যাখ্যা যা আমি কখনও দেখেছি; GJ!
টেরিপি

3
আপনার ছেলেরা এই উত্তরটি সংক্ষিপ্ত বা বিস্তারিত কিনা তা সিদ্ধান্ত নিতে হবে । :)
jrok

1
@ জ্রোক: বিষয়গুলি সংক্ষিপ্ত এবং বিস্তারিত হতে পারে সেগুলি পারস্পরিক একচেটিয়া নয়।
মার্টিন ইয়র্ক

@ লোকিআস্টারি, তাহলে এবিআই আসলে একটি এপিআইও নয়?
পেসারিয়ার 21

4
@ পেসারিয়র: এগুলি দুটিই ইন্টারফেস। তবে তারা বিমূর্ততার বিভিন্ন স্তরে। অ্যাপ্লিকেশন বিকাশকারী পর্যায়ে এপিআই। এবিআই সংকলক স্তরে (কোথাও কোনও অ্যাপ্লিকেশন বিকাশকারী কখনও যায় না)।
মার্টিন ইয়র্ক

47

আমি প্রায়শই এই শর্তগুলি এপিআই-অসম্পূর্ণ পরিবর্তন, বা একটি এবিআই-অসম্পূর্ণ পরিবর্তন অর্থে এসেছি।

একটি API পরিবর্তন মূলত যেখানে পূর্ববর্তী সংস্করণ সহ সংকলিত কোডটি আর কাজ করবে না। এটি ঘটতে পারে কারণ আপনি কোনও ফাংশনে যুক্তি যুক্ত করেছেন বা আপনার স্থানীয় কোডের বাইরে অ্যাক্সেসযোগ্য কোনও কিছুর নাম পরিবর্তন করেছেন। যে কোনও সময় আপনি শিরোনাম পরিবর্তন করেন এবং এটি আপনাকে .c / .cpp ফাইলে কিছু পরিবর্তন করতে বাধ্য করে, আপনি একটি API- পরিবর্তন করেছেন।

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

এবিআইয়ের সামঞ্জস্যতা কী এবং এটি কীভাবে সংরক্ষণ করা যায় তা নির্ধারণ করার জন্য আমি দুটি অত্যন্ত দরকারী সংস্থান খুঁজে পেয়েছি:


4
তাদের পারস্পরিক একচেটিয়াত্ব নির্দেশ করার জন্য +1। উদাহরণস্বরূপ, জাওয়ার আসর্ট কীওয়ার্ডের প্রবর্তন হ'ল একটি এপিআই-বেমানান তবুও এবিআই-সামঞ্জস্যপূর্ণ পরিবর্তন ডকস.অরাকল . com/javase/7/docs/technotes/guides/language/…
পেসারিয়ার

Tldp.org/HOWTO/Program-Library-HOWTO/ Shared - libraries.html- এর "3.6। বেমানান গ্রন্থাগারগুলি" আপনি আপনার সংস্থান বিভাগে যুক্ত করতে পারেন যা এবিআই পরিবর্তনের কারণ হতে পারে তা তালিকাভুক্ত করে।
ডেমি-লুন

20

এটি আমার সাধারণ ব্যাখ্যা:

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

13

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

এই উত্তরটি আমার অন্য উত্তর থেকে বের করা হয়েছে: অ্যাপ্লিকেশন বাইনারি ইন্টারফেস (এবিআই) কী? তবে আমি অনুভব করেছি যে এটি সরাসরি এর উত্তরও দেয় এবং প্রশ্নগুলি সদৃশ হয় না।

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

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

main.c

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

#include "mylib.h"

int main(void) {
    mylib_mystrict *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_mystrictনামক 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তবুও ভেঙে যেত!

এটি কারণ আমরা প্রোগ্রামগতভাবে লক্ষণীয় দিকের চেয়ে ফাংশনটি করার কথা বলে তার "মানবিক বিবরণ" পরিবর্তন করেছি।

আমার সবেমাত্র দার্শনিক অন্তর্দৃষ্টি ছিল যে সফ্টওয়্যারটির আনুষ্ঠানিক যাচাইকরণ একটি অর্থে "শব্দার্থক এপিআই" এর আরও অনেককে "প্রোগ্রামালিফিকেশন যাচাইযোগ্য এপিআই" তে স্থানান্তরিত করে।

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

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

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

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

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

myobject->old_field = old_field;

প্রতি:

myobject->old_field = old_field + 1;

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

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

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

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


2
আপনার ছিল এমন উত্তর যা আমাকে এপিআই এবং এবিআইয়ের মধ্যে পার্থক্য বুঝতে সাহায্য করার জন্য যথেষ্ট বিশদ ছিল। ধন্যবাদ!
রক্ষীথ রবি

9

( একটি pplication বি inary আমি nterface) একটি একটি নির্দিষ্ট হার্ডওয়্যার অপারেটিং সিস্টেমের সাথে মিলিত প্ল্যাটফর্মের জন্য নির্দিষ্টকরণ। এটি API ( A pplication P rogram I nterface) এর বাইরে এক ধাপ , যা অ্যাপ্লিকেশন থেকে অপারেটিং সিস্টেমে কলগুলি সংজ্ঞায়িত করে। এবিআই নির্দিষ্ট সিপিইউ পরিবারের জন্য এপিআই প্লাস মেশিনের ভাষা সংজ্ঞায়িত করে। একটি এপিআই রানটাইম সামঞ্জস্যতা নিশ্চিত করে না, তবে একটি এবিআই তা করে, কারণ এটি মেশিনের ভাষা, বা রানটাইম, ফর্ম্যাটকে সংজ্ঞায়িত করে।

এখানে চিত্র বর্ণনা লিখুন

শ্লীলতা


9

আমাকে জাভাতে কীভাবে এবিআই এবং এপিআইয়ের পার্থক্য রয়েছে তার একটি নির্দিষ্ট উদাহরণ দেই।

আমি যদি কোনও পদ্ধতি A # মি () Stringআর্গুমেন্টের আর্গুমেন্ট হিসাবে নেওয়া থেকে পরিবর্তন করি তবে একটি এবিআইয়ের বেমানান পরিবর্তন String...। এটি এবিআই সামঞ্জস্যপূর্ণ নয় কারণ আপনাকে যে কোডটি কল করছে সেটি পুনরায় কম্পাইল করতে হবে, তবে এটি এপিআই সুসংগত কারণ আপনি কলারের কোনও কোড পরিবর্তন ছাড়াই পুনরায় সংশোধন করে সমাধান করতে পারবেন।

এখানে বানানটির উদাহরণ দেওয়া হল। আমার জাভা পাঠাগারটি ক্লাস এ সহ রয়েছে

// Version 1.0.0
public class A {
    public void m(String string) {
        System.out.println(string);
    }
}

এবং আমার একটি ক্লাস রয়েছে যা এই লাইব্রেরিটি ব্যবহার করে

public class Main {
    public static void main(String[] args) {
        (new A()).m("string");
    }
}

এখন, গ্রন্থাগারের লেখক তাদের ক্লাস এ সংকলন করেছেন, আমি আমার ক্লাস মেইনটি সংকলন করেছি এবং এটি সব সুন্দরভাবে কাজ করছে। এ এর নতুন সংস্করণটি কল্পনা করুন

// Version 2.0.0
public class A {
    public void m(String... string) {
        System.out.println(string[0]);
    }
}

আমি যদি নতুন সংকলিত ক্লাস এ নিয়েছি এবং এটি পূর্ববর্তী সংকলিত ক্লাস মেইনের সাথে একসাথে ফেলে দিই, তবে পদ্ধতিটি চালুর চেষ্টা করার ক্ষেত্রে আমি ব্যতিক্রম পাচ্ছি

Exception in thread "main" java.lang.NoSuchMethodError: A.m(Ljava/lang/String;)V
        at Main.main(Main.java:5)

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


6

আপনার প্রোগ্রাম (উত্স কোড) এমন মডিউলগুলি সংকলিত করা যেতে পারে যারা যথাযথ এপিআই সরবরাহ করে

আপনার প্রোগ্রাম (বাইনারি) প্ল্যাটফর্মগুলিতে চলতে পারে যারা যথাযথ এবিআই সরবরাহ করে

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

একটি "প্ল্যাটফর্ম" আপনার প্রোগ্রাম চালানোর জন্য কী সরবরাহ করতে পারে তা এবিআই সীমিত করে। আমি এটি 3 স্তরে বিবেচনা করতে চাই:

  • প্রসেসর স্তর - নির্দেশিকা সেট, কলিং কনভেনশন

  • কার্নেল স্তর - সিস্টেম কল কনভেনশন, বিশেষ ফাইল পাথ কনভেনশন (যেমন লিনাক্সের ফাইল /procএবং /sysফাইলগুলি) ইত্যাদি

  • ওএস স্তর - অবজেক্ট ফর্ম্যাট, রানটাইম লাইব্রেরি ইত্যাদি

নামের ক্রস সংকলক বিবেচনা করুন arm-linux-gnueabi-gcc। "আর্ম" প্রসেসরের আর্কিটেকচারকে ইঙ্গিত করে, "লিনাক্স" কার্নেলকে নির্দেশ করে, "gnu" ইঙ্গিত করে তার টার্গেট প্রোগ্রামগুলি GNU এর libc কে রানটাইম লাইব্রেরি হিসাবে arm-linux-androideabi-gccব্যবহার করে , যা অ্যান্ড্রয়েডের libc বাস্তবায়ন ব্যবহার করে তার থেকে আলাদা ।


1
এটি তাদের মধ্যে পার্থক্যের একটি খুব সংক্ষিপ্ত ব্যাখ্যা এবং একটি খুব অনন্য দৃষ্টিকোণে।
সাজুউক

1

API- Application Programming Interfaceএটি একটি সংকলন টাইম ইন্টারফেস যা বিকাশকারীরা গ্রাহকতা, ওএস, সোর্স কোডের মূল কলগুলির মতো নন-প্রকল্পের কার্যকারিতা ব্যবহার করতে ব্যবহার করতে পারেন

ABI[সম্পর্কে] -Application Binary Interfaceএকটি রানটাইম ইন্টারফেস যা মেশিন কোডের উপাদানগুলির মধ্যে যোগাযোগের জন্য নির্বাহের সময় একটি প্রোগ্রাম দ্বারা ব্যবহৃত হয়

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