সি ++ সংক্ষিপ্ত হয় যেখানে কেন ভাষা 'বাইন্ডিংস' সরবরাহ করে?


60

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

তবে সেই পোস্টের একটি আইটেম বারবার সম্বোধন করা হয়, কোনও ধরণের উদাহরণ, যাচাই বা ব্যাখ্যা ছাড়াই:

"আপনি যখন আপনার লাইব্রেরির জন্য একাধিক ভাষার বাইন্ডিং রাখতে চান সেক্ষেত্রে সি কোডটি ভাল"

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

কেউ দয়া করে সিটিতে লাইব্রেরি লেখার জন্য কেন অন্য ভাষায় সহজতর বাঁধাই এবং / অথবা বহনযোগ্যতার জন্য মঞ্জুরি দেয় তা সুনির্দিষ্ট কারণ সরবরাহ করতে পারেন?


6
বেশিরভাগ historicalতিহাসিক এবং সামাজিক কারণে। সর্বাধিক ভাষা বাস্তবায়নের এবং রানটাইম সিস্টেম উদাহরণস্বরূপ সি উপরে নির্মিত হয়, Ocaml, SBCL, Haskell, রানটাইম সি কোডেড হয় (এবং সি ++ এ recoded হচ্ছে দ্বারা অনেক লাভ হবে না)
বাসিল Starynkevitch

8
অনুশীলনে, এই রানটাইমগুলিতে জেনুইন সি ++ লাইব্রেরিগুলি (কিউটি ভাবেন) গ্লুয়িং করা বেদনাদায়ক।
বেসিল স্টারিনকিভিচ

3
@ বেসিল: কিউটিটি একটি আসল সি ++ গ্রন্থাগার নয়। এছাড়াও, এমনকি আরও বেদনাদায়ক গ্রন্থাগারগুলির জন্য, এটি কেবল বেদনাদায়ক কারণ তারা প্রকৃতপক্ষে কার্যকর শব্দার্থবিজ্ঞান প্রকাশ করে।
ডেড এমজি


2
ডন বক্স দ্বারা প্রয়োজনীয় COM পড়ুন। এটি সি ++ এ এবিআই তৈরির প্রক্রিয়াটি ব্যাখ্যা করে। সিএমএম ছিল মাইক্রোসফ্টের একটি এবিআই তৈরির উপায়। অর্থাত COM সি ++ গ্রন্থাগারগুলি সি বা ভিবি বা অন্যান্য ভাষা থেকে ব্যবহার করা যেতে পারে।
user93353

উত্তর:


69

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

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

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

- ত্রুটিযুক্ত সি ++


4
আপনার অবশ্যই লক্ষ্য করা উচিত, যদিও সি ++ এ প্রয়োগ করা সি-এর মতো এপিআই সংজ্ঞা দেওয়া সম্ভব ( extern "C"এটি করা এখনও আরও অতিরিক্ত কাজ, এটি সি ++ এর সরবরাহিত বৈশিষ্ট্যের
তুলনায়

5
সি ++ এবিআই প্রশ্নের প্রসঙ্গে অপ্রাসঙ্গিক, যেখানে সি ++ গ্রন্থাগারগুলি সহজেই রফতানি করা যায় extern "C"
ডেড এমজি

12
@ ঝোমিনাল: এটি সিতে লেখার চেয়ে অনেক বেশি ভালো, যেখানে আপনাকে একটি সি ইন্টারফেসের সংজ্ঞা দিতে হবে এবং তারপরে আপনাকে এটি সিতেও প্রয়োগ করতে হবে, যেখানে সি ++ এ আপনি একটি সি ইন্টারফেসটি সংজ্ঞায়িত করতে পারেন এবং তারপরে আপনাকে প্রয়োগ করতে হবে না এটি সিতে নির্বিশেষে আপনি কোন ভাষায় প্রয়োগ করছেন, আপনাকে এখনও একটি সি ইন্টারফেসটি সংজ্ঞায়িত করতে হবে- এটি অবশ্যই সি ++ তে সত্য কারণ এটি সি বা অন্য কোনও ভাষায় যা সি বাইন্ডিংগুলি প্রকাশ করতে পারে।
ডেড এমজি

9
সেই এফকিউএ ড্রাইভের লিঙ্কটিতে কি অস্বীকৃতি যুক্ত করা সম্ভব হবে?
মার্টিন বা

2
@ ডকব্রাউন: অবশ্যই সি ভাষা বাঁধাই বনাম সি ++ ভাষার বাইন্ডিং সম্পর্কিত প্রশ্নটি আমার মতো দেখতে লাগবে।
ম্যাসন হুইলারের

32

আপনি যদি অন্য কোনও ভাষার স্পিকারের সাথে যোগাযোগের চেষ্টা করছেন তবে শেক্সপীয়ার ইংলিশের চেয়ে পিডগিন সহজ।

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

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

এই সমস্ত কথার সাথে, একটি সি ++ গ্রন্থাগার থেকে অন্য ভাষায় বাইন্ডিং সরবরাহ করতে অসুবিধা বাড়ানো সম্ভব:

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

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

6
@ র্যান্ডম 832: সি ++ সাইডটি কেবল সি ইন্টারফেসটি সরবরাহ করতে পারলে এটি সম্পূর্ণ অপ্রাসঙ্গিক। আপনাকে একটি সি বাঁধাইয়ের অফার করতে C এ বাইন্ডিং বাস্তবায়ন করতে হবে না।
ডেড এমজি

21

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

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

এটি সি ভাষা প্রোগ্রামিং ভাষার লাতিন করে তোলে। (এই রূপকটির আগে ইন্টারনেটের কত বছর "" ক্রমবর্ধমান ভাষার ইংরেজি "হওয়া উচিত?)


আপনি যখন আপনার লাইব্রেরিটি সি-তে লিখছেন, তখন আপনি বিনামূল্যে সি (সামঞ্জস্যপূর্ণ) ইন্টারফেস পাবেন। আপনি যদি আপনার লাইব্রেরিটি সি ++ এ লিখছেন তবে আপনি উল্লিখিত ঘোষণার মাধ্যমে সি বাইন্ডিংগুলি পেতে পারেনextern "C"

যাইহোক , আপনি কেবল সেই কার্যকারিতার জন্য এই বাইন্ডিংগুলি পেতে পারেন যা সিতে প্রকাশ করা যেতে পারে

সুতরাং আপনার লাইব্রেরি এপিআই ব্যবহার করতে পারবেন না ...

  • টেমপ্লেট
  • ক্লাস,
  • ব্যতিক্রম
  • অবজেক্ট গ্রহণ বা ফিরিয়ে দেওয়া কোনও ফাংশন ।

একটি সহজ উদাহরণ, আপনার রফতানি কার্যগুলি (বা সেই বিষয়ে) এর পরিবর্তে অ্যারে ( ) নেওয়া এবং ফিরিয়ে আনা দরকার[]std::vectorstd::string

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

সে কারণেই এই পয়েন্টটি তৈরি করা যেতে পারে যে লাইব্রেরি বাস্তবায়নের জন্য সিই সেরা পছন্দ। ব্যক্তিগতভাবে, আমি মনে করি যে সি ++ এর সুবিধাগুলি এখনও একটি extern "C"এপিআইয়ের প্রয়োজনীয় প্রচেষ্টা ছাড়িয়ে যায় , তবে এটি কেবল আমারই।


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

1
প্রোগ্রামিং বিশ্বে ইতিমধ্যে ইংরেজি প্রাধান্য পেয়েছে। অন্যান্য পেশার চেয়ে বেশি প্রভাবশালী।
সিয়ুয়ান রেন

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

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

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

6

অন্যান্য উত্তর ইতিমধ্যে সরবরাহ করা বিশদটি বাইরে রেখে:

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


5

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

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


4
আমি মনে করি আপনি সঠিক বলেছেন এবং নিম্নগামীরা প্রশ্নটি ভুল বুঝেছেন, কিন্তু আসলে আপনার উত্তরটি সেই সম্ভাব্য ভুল বোঝাবুঝির কথা তুলে ধরেছে: প্রশ্নটি "সি ইন্টারফেস সহ একটি লাইব্রেরি" বনাম "একটি সি ++ ইন্টারফেস সহ একটি লাইব্রেরি" সম্পর্কে নয়, এটি প্রায় "সম্পূর্ণরূপে সি" বনাম লিখিত একটি গ্রন্থাগার "সি ++ তে লিখিত একটি সি ইন্টারফেস সহ একটি লাইব্রেরি"।
ডক ব্রাউন 13

@ সোনমান: সি বাইন্ডিংগুলি এক্সপোজ করার ক্ষেত্রে সমস্যাযুক্ত সি ++ বাইন্ডিংয়ের কোনও সমস্যা নেই।
ডেড এমজি

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

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

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

2

অন্য ভাষার সাথে ইন্টারফেস করার সময় দুটি বড় অক্ষ রয়েছে:

  • ইন্টারফেসটি ধারণ করতে পারে এমন ধারণাগুলি: কেবল মূল্য? রেফারেন্স? জেনেরিক্স?
  • ইন্টারফেসটি কীভাবে "বাইনারি" (এবিআই নামে পরিচিত) প্রয়োগ করা হয়

এই দুটি ফ্রন্টে সি এর আরও বেশি সুবিধা রয়েছে:

  • সি কেবলমাত্র বেশিরভাগ সহজ ধারণা রয়েছে, যা বেশিরভাগ প্রতি ভাষা 1 এ প্রদর্শিত হয়
  • সি বাইনারিগুলির এবিআই ওএস 2 দ্বারা স্থির হয়

এখন, বেশিরভাগ ভাষার সি-র তুলনায় একই ধরণের ধারণাগুলি কেন এটি "সরল" বা "প্রাক বিদ্যমান" থাকার কারণে হতে পারে; এটি যদিও বিবেচ্য নয়, মূল বিষয়টি তারা করে।

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

1 variadics ছাড়া ( ...), সেই সহজ নয়

2 সি এর কি স্ট্যান্ডার্ড এবিআই আছে?

লিগ্যাসি সি ++ কোডে 3 ইন্টারফেসিং ডি


0

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

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

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

মানক সংস্থা এই পরিস্থিতি স্থির না করে এবং সমাধান না করা পর্যন্ত অনেকেই করতে পারে না। মাইক্রোসফ্ট স্পষ্টতই এর মান দেখে এবং তাদের প্ল্যাটফর্মের জন্য এটি সমাধানের পদক্ষেপ নিয়েছে।

সুতরাং উত্তরটি সত্যিই সি ভাষার বাঁধাই সরবরাহ করে না । এটি ঘটে যে কেউ তাদের কথা শোনেনি এবং সেগুলি গ্রহণ করে না।


-2

সমস্ত উত্তরগুলি আসল সমস্যার তুলনায় কম যায়: সি ++ সংকলন "নাম ম্যাঙ্গলিং" উপস্থাপন করে, তাই বাইনারিগুলি "সাধারণ" ফাংশন কলগুলির সাথে বেমানান।

সমস্ত এবিআই স্টাফ এটিকে মানসম্মত করার চেষ্টা করার চেয়ে একটু বেশি।

সাধারণভাবে এটি গ্যারান্টিযুক্ত নয় যে আপনি সরল সি ++ এ আটকে থাকলেও আপনি বিভিন্ন সংকলকগুলির সাথে সংকলিত ক্রস লিঙ্ক ফাংশনগুলি করতে পারেন। পূর্বে এটি নিশ্চিত ছিল যে তারা বেমানান ছিল তবে আজকাল মানককরণটি ক্রমশ কমছে;)

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

পার্শ্ব নোট: মূল সি ++ সংকলক (সিফ্রন্ট) প্রকৃতপক্ষে সি উত্স তৈরি করেছিল যা সংকলন করতে হয়েছিল ঠিক ঠিক জিসিসি এর মতো যা "হুডের নীচে" অ্যাসেম্বলি তৈরি করে।

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