ফাংশনগুলির রানটাইম আমদানির জন্য কীভাবে সি ++ প্রোগ্রাম ডিজাইন করবেন?


10

আজ, আমি আপনাকে একটি নির্দিষ্ট সফ্টওয়্যার আর্কিটেকচার উপলব্ধি করতে C ++ এর সক্ষমতা সম্পর্কে একটি প্রশ্ন জিজ্ঞাসা করতে চাই।

অবশ্যই, আমি অনুসন্ধানটি ব্যবহার করেছি তবে সরাসরি কোনও লিঙ্কিত উত্তর খুঁজে পাইনি।

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

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

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

এখানে আপনাকে আরও ভাল বোঝার জন্য একটি খুব সরল উদাহরণ:

<COMPONENT name="Main">
  <COMPONENT name="A">
    <FUNCTION name="A1" path="lib/functionA1" />
  </COMPONENT>
  <COMPONENT name="B">
    <FUNCTION name="B1" path="lib/functionB1" />
    <FUNCTION name="B2" path="lib/functionB2" />
  </COMPONENT>
  <CONNECTIONS>
    <CONNECTOR source="A1" target="B1" />
    <CONNECTOR source="B1" target="B2" />
  </CONNECTIONS>        
</COMPONENT>

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

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

আগাম ধন্যবাদ!

চিয়ার্স, অলিভার


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

1
প্রশ্নটি এই অর্থে খুব বিস্তৃত যে এটির জন্য সাধারণত বৈদ্যুতিক প্রকৌশল / [ইলেকট্রনিক ডিজাইন অটোমেশন (ইডিএ)] ( এন.ইউইকিপিডিয়া.আর / উইকি / ইলেক্ট্রনিক_ডিজাইন_আউটমোশন ) বা মেকানিকাল ইঞ্জিনিয়ারিং / কম্পিউটার এডেড ডিজাইনের (সিএডি) একটি বিশ্ববিদ্যালয়ের ডিগ্রি প্রয়োজন । তুলনামূলকভাবে বলতে গেলে, সি / সি ++ ডায়নামিক লাইব্রেরি কল করা খুব সহজ, x86 এর জন্য সি কলিং কনভেনশন দেখুন । এটি স্ট্যাকের (সিপিইউ স্ট্যাক পয়েন্টারটির মাধ্যমে) এবং সিপিইউ নিবন্ধকের মানগুলি চালিত করতে পারে।
rwong

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

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

2
আমি এটি সমাধান করার উপায়টি হল সি ++ কোড সংকলন করা যা কোনও ভাষার পক্ষে দোভাষী তৈরি করে যা একটি ইভাল কমান্ড সমর্থন করে। সি ++ ব্যবহার করে ব্যাং সমস্যা সমাধান হয়েছে। : পি দয়া করে কেন এটি যথেষ্ট ভাল নয় তা নিয়ে ভাবুন এবং প্রশ্নটি আপডেট করুন। আসল প্রয়োজনীয়তা পরিষ্কার হয়ে গেলে এটি সহায়তা করে।
candied_orange

উত্তর:


13

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

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

বেশ কিছু অধুনিক অপারেটিং সিস্টেম অনুমতি গতিশীল লোডিং এর প্লাগ-ইন । পসিক্স উল্লেখযোগ্যভাবে dlopen& নির্দিষ্ট করে dlsym। উইন্ডোজের আলাদা কিছু রয়েছে LoadLibrary(এবং একটি নিকৃষ্ট লিঙ্কিং মডেল; আপনার সম্পর্কিত, সরবরাহ করা বা প্লাগইনগুলি দ্বারা ব্যবহৃত ফাংশনগুলি স্পষ্টতই বর্ণনা করতে হবে)। লিনাক্সে বিটিডাব্লু আপনি ব্যবহারিকভাবে dlopenঅনেক বড় প্লাগইন করতে পারেন (আমার manydl.cপ্রোগ্রামটি দেখুন , যথেষ্ট ধৈর্য্যের সাথে এটি উত্পন্ন করতে পারে তবে প্রায় এক মিলিয়ন প্লাগইন লোড করতে পারে)। সুতরাং আপনার এক্সএমএল জিনিসটি প্লাগইনগুলি লোড করতে পারে। আপনার বহু-উপাদান / বহু সংযোজকের বিবরণ আমাকে Qt সংকেত এবং স্লটগুলির স্মরণ করিয়ে দেয় (যার জন্য mocপ্রিপ্রসেসর প্রয়োজন ; আপনারও এর মতো কিছু প্রয়োজন হতে পারে)।

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

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

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

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

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

ডায়নামিক সফ্টওয়্যার আপডেট করার বিষয়েও পড়ুন ।

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


3

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

এর সর্বাধিক প্রাথমিক, আপনি একটি গ্রাফ-ভিত্তিক ডেটা কাঠামো সন্ধান করছেন। আপনার শারীরিক মডেলগুলি নোড (আপনি তাদের উপাদানগুলি কল করেন) এবং প্রান্তগুলি (আপনার নামকরণের সংযোজকগুলি) দিয়ে তৈরি।

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

প্রতিটি উপাদানকে এই জাতীয় জিনিসগুলি করতে ফাংশনগুলির একটি সেট বাস্তবায়ন করতে হবে:

  • উপাদানটির নাম বা এ সম্পর্কিত অন্যান্য বিবরণ পান
  • উপাদানটি কতটি ইনপুট বা আউটপুট প্রকাশ করে তার সংখ্যা পান
  • একটি নির্দিষ্ট ইনপুট আমাদের আউটপুট সম্পর্কে একটি উপাদান জিজ্ঞাসা করুন
  • ইনপুট এবং আউটপুট একসাথে সংযুক্ত করুন
  • এবং অন্যদের

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

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

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

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

ডাইরেক্টশো এমন একটি এপিআই যা আমার বর্ণিত সমস্ত কিছু করে এবং এটি দেখার পক্ষে একটি ভাল উদাহরণ হতে পারে।


-2

আপনি সীডেলফ গ্রন্থাগারটি ব্যবহার করতে পারেন so সুতরাং লাইব্রেরির শিরোনামের বিরুদ্ধে চিহ্নগুলি ক্রস করুন। এখানে একটি শেল পিএইচপি স্ক্রিপ্ট https://github.com/comarius/elf_resolver করছেন

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