সি ++: বাইনারি স্তরে মানকতার অভাব


14

কেন আইএসও / এএনএসআই বাইনারি স্তরে সি ++ মানক করে না? সি ++ এর সাথে অনেকগুলি বহনযোগ্য সমস্যা রয়েছে, যা কেবল বাইনারি স্তরে মানককরণের অভাবের কারণে।

ডন বক্স লিখেছেন, (তাঁর এসেনশিয়াল সিওএম বইটি , অধ্যায় সিওএম হিসাবে একটি ভাল সি ++ উদ্ধৃত )

সি ++ এবং বহনযোগ্যতা


একবার সিদ্ধান্ত ডিএলএল হিসেবে সি ++ বর্গ বিতরণ করতে তৈরি করা হয়, এক এক সঙ্গে মুখোমুখি হয় C- এর মৌলিক দুর্বলতা ++, , যে, প্রমিতকরণ এর বাইনারি পর্যায়ে অভাব । যদিও আইএসও / এএনএসআই সি ++ খসড়া ওয়ার্কিং পেপার কোন প্রোগ্রামগুলি সংকলন করবে এবং সেগুলি চালানোর সিনেম্যাটিক প্রভাবগুলি কী হবে তা কোডিং করার চেষ্টা করে, এটি সি ++ এর বাইনারি রানটাইম মডেলকে মানক করার কোনও প্রচেষ্টা করে না। প্রথমবার এই সমস্যা স্পষ্ট হয়ে যাবে যখন একটি সি ++ developement পরিবেশ থেকে FastString ডিএলএল এর আমদানি গ্রন্থাগার বিরুদ্ধে লিঙ্কে একটি ক্লায়েন্ট চেষ্টা ছাড়া অন্য FastString ডিএলএল নির্মাণ করতে ব্যবহৃত একটি।

বাইনারি মানককরণের এই অভাবের কি আরও সুবিধা বা ক্ষতি রয়েছে?


এটি কী আরও বেশি বিষয়ভিত্তিক প্রশ্ন হিসাবে দেখাবে তা দেখে প্রোগ্রামার্স.স্ট্যাকেক্সেঞ্জোয়েন্ট.কম এ আরও ভাল জিজ্ঞাসা করা হচ্ছে ?
স্টিফেন ফুরলানি

1
খনি সংশ্লিষ্ট প্রশ্ন আসলে: stackoverflow.com/questions/2083060/...
Arak

4
ডন বক্স একটি উদ্যোগী। তাকে উপেক্ষা.
জন ডিবলিং

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

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

উত্তর:


16

বাইনারি-সামঞ্জস্যপূর্ণ সংকলিত ফর্মযুক্ত ভাষাগুলি তুলনামূলকভাবে নতুন পর্ব [*], উদাহরণস্বরূপ জেভিএম এবং। নেট রানটাইম। সি এবং সি ++ সংকলক সাধারণত নেটিভ কোড নির্গত করে।

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

অসুবিধাটি হ'ল অবশ্যই দেশীয় কোডটি কেবল এটির জন্য তৈরি করা আর্কিটেকচারে চালিত হয় এবং এক্সিকিউটেবলগুলি কেবল এমন একটি লোডার দ্বারা লোড করা যায় যা তাদের এক্সিকিউটেবল ফর্ম্যাটটি বোঝে এবং একই আর্কিটেকচারের জন্য কেবলমাত্র অন্য এক্সিকিউটেবলের সাথে লিঙ্ক এবং কল করে and ABI- র।

এমনকি যদি আপনি এ পর্যন্ত পৌঁছে যান তবে দুটি এক্সিকিউটেবলকে একত্রে লিঙ্ক করা কেবলমাত্র ততক্ষণ সঠিকভাবে কাজ করবে: (ক) আপনি একটি সংজ্ঞা বিধি লঙ্ঘন করেন না, যদি তারা বিভিন্ন সংকলক / বিকল্পগুলি / যাই হোক না কেন সংকলন করে থাকে তবে তা করা সহজ, যেমন তারা একই শ্রেণীর বিভিন্ন সংজ্ঞা ব্যবহার করছিল (হয় শিরোনামে, অথবা কারণ তারা প্রত্যেকে পৃথক বাস্তবায়নের বিরুদ্ধে স্ট্যাটিকভাবে লিঙ্ক করেছে); এবং (খ) সমস্ত প্রাসঙ্গিক বাস্তবায়ন বিশদ যেমন কাঠামো বিন্যাস যখন প্রতিটি সংকলিত হয়েছিল তখন বল প্রয়োগকারী সংকলক বিকল্পগুলি অনুসারে অভিন্ন।

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

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

বাইনারি-বহনযোগ্য সি বা সি ++ এনভায়রনমেন্ট তৈরির জন্য এলএলভিএম উদাহরণস্বরূপ এমন কিছু কাজও করা যেতে পারে। যদিও আমি জানি না যে কোনও বিস্তৃত উদাহরণ উঠে এসেছে।

তবে এই সমস্তগুলি সি -++ বাস্তবায়ন-নির্ভর করে তোলে (যেমন ধরণের আকারের) makes তারপরে যে পরিবেশটি পোর্টেবল বাইনারিগুলি বোঝে, সেই কোডটিতে কোড চালানোর পদ্ধতিতে উপলব্ধ থাকতে হবে। নন-পোর্টেবল বাইনারিগুলি মঞ্জুরি দিয়ে, সি এবং সি ++ এমন জায়গাগুলিতে যেতে পারে যেখানে পোর্টেবল বাইনারিগুলি পারে না, এবং সে কারণেই বাইনারি সম্পর্কে স্ট্যান্ডার্ড কিছুই বলে না doesn't

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

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

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


@ স্টিভ বাট সি-র আই386 এবং এএমডি 64-তে একটি সংজ্ঞায়িত এবিআই রয়েছে, তাই আমি এমসিভিসি সংস্করণ ওয়াই দ্বারা সংকলিত একটি ফাংশনটিতে জিসিসি সংস্করণ এক্স দ্বারা সংকলিত একটি ফাংশনে একটি পয়েন্টারটি পাস করতে পারি। সি ++ ফাংশন দিয়ে এটি করা অসম্ভব।
ব্যবহারকারীর 877329

7

ক্রস প্ল্যাটফর্ম এবং ক্রস-সংকলক সামঞ্জস্যতা সি এবং সি ++ এর পিছনে প্রাথমিক লক্ষ্য ছিল না। এগুলি একটি যুগে জন্মেছিল এবং তাদের উদ্দেশ্যে উদ্দেশ্য ছিল যার জন্য প্ল্যাটফর্ম-নির্দিষ্ট এবং সময় এবং স্থানের সংকলক-নির্দিষ্ট মিনিমাইজেশন অত্যন্ত গুরুত্বপূর্ণ।

স্ট্রাস্ট্রাপের "সি ++ এর ডিজাইন এবং বিবর্তন" থেকে:

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


1
+1 - ঠিক কীভাবে একজন এমন একটি স্ট্যান্ডার্ড এবিআই তৈরি করবে যা এআরএম এবং ইন্টেল উভয় বাক্সে কাজ করেছিল? কোন মানে হবে না!
বিলি ওনিল

1
দুর্ভাগ্যক্রমে, এটি এতে ব্যর্থ হয়েছিল। আপনি সি এর যা কিছু করতে পারেন ... রানটাইম সময়ে গতিশীলভাবে একটি সি ++ মডিউল লোড করা ছাড়া। উন্মুক্ত ইন্টারফেসে আপনাকে সি ফাংশন ব্যবহার করতে 'রিভার্ট' করতে হবে।
gbjbaanb

6

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


6

সমস্যা উদ্ধৃতি বর্ণিত প্রতীক-নাম mangling স্কিম প্রমিতকরণ (বেশ ইচ্ছাকৃত পরিহার দ্বারা ঘটিত হয় আমার মনে হয় " বাইনারি পর্যায়ে প্রমিতকরণ " এই সম্মান একটি বিভ্রান্তিকর ফ্রেজ যদিও বিষয়টি একটি কম্পাইলার এর সাথে সম্পর্কিত করা হয় অ্যাপ্লিকেশন বাইনারি ইন্টারফেস ( ABI- র)।

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

বিভিন্ন সংকলক দ্বারা ব্যবহৃত স্কীমের উদাহরণ সহ আমি এখানে যতটা পারি তার চেয়ে সম্ভবত বিষয়টি বর্ণিত এবং ব্যাখ্যা করা হয়েছে

মানিককরণের ইচ্ছাকৃত অভাবের কারণগুলিও এখানে ব্যাখ্যা করা হয়েছে


3

আইএসও / এএনএসআই-এর লক্ষ্য ছিল সি ++ ভাষা মানক করা, যে বিষয়টি বছরের পর বছর প্রয়োজন যথেষ্ট জটিল বলে মনে হয় ভাষার মানদণ্ডের আপডেট এবং সংকলক সহায়তার আপডেট থাকতে জন্য ।

বাইনারিগুলির সামঞ্জস্যতা আরও জটিল, বাইনারিগুলির বিভিন্ন সিপিইউ'র আর্কিটেকচার এবং বিভিন্ন ওএস পরিবেশে চালিত হওয়া দরকার on


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

ক্লিফোর্ড: নাম ম্যাঙ্গলিং স্কিম বাইনারি স্তরের সামঞ্জস্যের কেবলমাত্র একটি উপসেট। পরেরটি আরও অনেকটা ছাতার মতো!
নওয়াজ

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

2

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

সি সামঞ্জস্যতাও গুরুত্বপূর্ণ ছিল এবং এটি উল্লেখযোগ্যভাবে জটিল হত।

পরবর্তীকালে বাস্তবায়নের সাবসেটের জন্য এবিআইকে মানক করার জন্য কিছু প্রচেষ্টা হয়েছে ।


ডার্ন, আমি সি সামঞ্জস্য ভুলে গেছি। ভাল পয়েন্ট, +1!
অ্যান্ডি টমাস

1

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

তাদের সঠিক মনে কেউই বাইনারিটির জন্য বাস্তবায়ন বা প্ল্যাটফর্মটি সংজ্ঞায়িত করতে চায় না। সুতরাং আপনি x86 উইন্ডোজ dll নিতে পারবেন না এবং এটি একটি x86_64 লিনাক্স প্ল্যাটফর্মে ব্যবহার শুরু করতে পারবেন না। এটি কিছুটা বেশি হবে।

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

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

এই সমস্যাটির সমাধান দেওয়ার চেষ্টা করে এমন সিওএমের মতো জিনিসও আমাদের ভোগাতে হবে না।


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

1

সি ++ এর সাথে অনেকগুলি বহনযোগ্য সমস্যা রয়েছে, যা কেবল বাইনারি স্তরে মানককরণের অভাবের কারণে।

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

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

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

এই জাতীয় রফতানি করা একটি সাধারণ জুড়ি কল্পনা করুন:

void f(Foo foo);
void f(Bar bar, int val);

... এবং কল্পনা করুন Fooএবং Barপ্যারামিটারাইজড কন্সট্রাক্টর, কপি কনস্ট্রাক্টর, মুভ কনস্ট্রাক্টর এবং অ-ট্রিভিয়াল ডেস্ট্রাক্টর সহ ক্লাস ছিলেন।

তারপরে একটি পাইথন / লুয়া / সি # / জাভা / হাস্কেল / ইত্যাদির দৃশ্য দেখুন। বিকাশকারী এই মডিউলটি আমদানি করতে এবং তাদের ভাষায় এটি ব্যবহার করার চেষ্টা করছেন।

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

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

এটি বিশ্রীতার একটি ছোট্ট নমুনা। fউপরের ফাংশনগুলির মধ্যে একটি যখন BazExceptionজাভাস্ক্রিপ্টে একটি (একটি কনস্ট্রাক্টর এবং ডেস্ট্রাক্টর সহ একটি সি ++ ক্লাস এবং স্ট্রাইড :: ব্যতিক্রম) নিক্ষেপ করবে তখন কী হবে ?

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

প্রস্তাবিত সমাধান

COM- শৈলীর ইন্টারফেসগুলির সাথে কয়েক বছর ধরে APIs / ABIs এর জন্য সি ++ ইন্টারফেস ব্যবহার করার উপায়গুলি সন্ধান করার জন্য আমার প্রস্তাবিত সমাধানটি কেবলমাত্র "সি / সি ++" (শ্লেষ) বিকাশকারী হয়ে উঠতে হবে।

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

তারপরে যদি আমরা এই ইন্টারফেসটি এত বেশি সরাসরি ব্যবহার করতে পছন্দ না করি (আমাদের সম্ভবত কমপক্ষে RAII কারণে নয়) তবে আমরা এসডিকে দিয়ে যে স্ট্যাটিকালি লিঙ্কযুক্ত সি ++ লাইব্রেরিতে পাঠাতে চাইছি এটি সব গুছিয়ে রাখতে পারি। সি ++ ক্লায়েন্টরা এটি ব্যবহার করতে পারেন।

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

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


1
"বাস্তবায়নের জন্য সি ++ সহ সেই সর্বজনীন এবিআই তৈরি করতে সি ব্যবহার করুন" " ... আমি একই কাজ, অনেক অন্যান্য মত!
নওয়াজ

-1

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


2
কিন্তু আপনি যদি এটা ডিক্লেয়ার extern "C", এটা সি অবী, ব্যবহার করবে যা কার্যত সাধারণ পিসি হার্ডওয়্যার উপর মান যদিও এটি কমিটির কোন ধরণের দ্বারা আরোপিত না।
বিলি ওনিল

-3

unzip foo.zip && make foo.exe && foo.exeআপনি যদি আপনার উত্সটির বহনযোগ্যতা চান তবে ব্যবহার করুন ।

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