আমি ভাবছিলাম যে কেন সেখানে (সমস্ত প্রোগ্রামিং ভাষায় আমি শিখেছি, যেমন সি ++, জাভা, পাইথন) স্ট্যান্ডলিবের মতো স্ট্যান্ডার্ড লাইব্রেরিগুলি একই ভাষার "ফাংশন" থাকার পরিবর্তে ভাষাটি নিজেই একটি আদিম।
আমি ভাবছিলাম যে কেন সেখানে (সমস্ত প্রোগ্রামিং ভাষায় আমি শিখেছি, যেমন সি ++, জাভা, পাইথন) স্ট্যান্ডলিবের মতো স্ট্যান্ডার্ড লাইব্রেরিগুলি একই ভাষার "ফাংশন" থাকার পরিবর্তে ভাষাটি নিজেই একটি আদিম।
উত্তর:
আমাকে @ ভিনসেন্টের (+1) ভাল উত্তরটিতে কিছুটা প্রসারিত করার অনুমতি দিন :
সংকলক কেন নির্দেশাবলী একটি সেট মধ্যে সহজভাবে একটি ফাংশন কল অনুবাদ করতে পারেন?
এটি কমপক্ষে দুটি পদ্ধতির মাধ্যমে এটি করতে এবং করতে পারে:
একটি ফাংশন কল ইনলাইন করে - অনুবাদ চলাকালীন, সংকলক ফাংশনে একটি আসল কল করার পরিবর্তে সরাসরি ইনলাইনের সাথে উত্স কোড কলটি প্রতিস্থাপন করতে পারে। এখনও ফাংশনটির একটি বাস্তবায়ন কোথাও সংজ্ঞায়িত হওয়া দরকার এবং এটি স্ট্যান্ডার্ড লাইব্রেরিতে থাকতে পারে।
অন্তর্নিহিত ফাংশন - অন্তর্নিজ্ঞানগুলি হ'ল ফাংশন যা সংকলকটি অগত্যা কোনও গ্রন্থাগারে ফাংশনটি সন্ধান না করে জানিয়ে দেওয়া হয়েছিল। এগুলি সাধারণত হার্ডওয়্যার বৈশিষ্ট্যগুলির জন্য সংরক্ষিত থাকে যা ব্যবহারিকভাবে অন্য কোনও উপায়ে অ্যাক্সেসযোগ্য নয়, এটি এত সহজ যে এমনকি এসেম্বলি ভাষার লাইব্রেরি ফাংশনে একটি কলের ওভারহেডও উচ্চ হিসাবে বিবেচিত হয়। (সংকলকটি সাধারণত নিজের ভাষায় সোর্স কোডটি স্বয়ংক্রিয়ভাবে ইনলাইন করতে পারে তবে সমাবেশ কার্যাদি নয়, যা অভ্যন্তরীণ প্রক্রিয়াটি আসে))
তবুও এগুলি বলা হচ্ছে, কখনও কখনও সর্বোত্তম বিকল্পটি সংকলকটির জন্য উত্স ভাষায় কোনও ফাংশন কলটিকে মেশিন কোডের একটি ফাংশন কলে অনুবাদ করে। পুনরাবৃত্তি, ভার্চুয়াল পদ্ধতি এবং নিখুঁত আকার হ'ল ইনলাইনিং সর্বদা সম্ভব / ব্যবহারিক নয় reasons (আরেকটি কারণ হ'ল বিল্ডের উদ্দেশ্য, যেমন পৃথক সংকলন (অবজেক্ট মডিউল), পৃথক লোড ইউনিট (যেমন ডিএলএল))।
বেশিরভাগ স্ট্যান্ডার্ড লাইব্রেরির ফাংশনগুলি অন্তর্মুখী করে তোলার সত্যিকারের সুবিধা নেই (যেটি সত্যিকারের কোনও সুবিধার জন্য কম্পাইলারের মধ্যে আরও অনেক বেশি জ্ঞানের কোড হবে), তাই আবার একটি মেশিন কোড কলটি প্রায়শই সবচেয়ে উপযুক্ত।
সি একটি উল্লেখযোগ্য ভাষা যা স্ট্যান্ডার্ড লাইব্রেরি ফাংশনগুলির পক্ষে অন্যান্য স্পষ্ট ভাষা বিবৃতি বাদ দেয় argu যদিও গ্রন্থাগারগুলি পূর্ব থেকেই বিদ্যমান ছিল, এই ভাষাটি স্ট্যান্ডার্ড লাইব্রেরি ফাংশনগুলি থেকে আরও কাজ করার দিকে পরিবর্তিত হয়েছিল এবং ভাষার ব্যাকরণে স্পষ্ট বক্তব্য হিসাবে কম। আইও অন্যান্য ভাষায় উদাহরণস্বরূপ, বিভিন্ন বিবৃতি আকারে প্রায়শই তার নিজস্ব বাক্য গঠন দেওয়া হত, যদিও সি ব্যাকরণটি কোনও আইও বিবৃতি সংজ্ঞায়িত করে না, কেবলমাত্র এটি সরবরাহের জন্য তার স্ট্যান্ডার্ড লাইব্রেরিতে স্থগিত করে, ফাংশন কলগুলির মাধ্যমে সমস্ত অ্যাক্সেসযোগ্য, যা সংকলক ইতিমধ্যে কিভাবে করতে জানি।
print
: 2.x সালে এটি একটি বিবৃতি ছিল যার নিজস্ব বিশেষ ব্যাকরণ ছিল, তবে 3.x এ এটি অন্য একটি ফাংশন কল হয়ে দাঁড়িয়েছিল। অফিসিয়াল ব্যাখ্যার জন্য পিইপি 3105 দেখুন ।
এটি কেবল ভাষাটিকে যথাসম্ভব সহজ রাখা সহজ। আপনাকে ভাষার কোনও বৈশিষ্ট্য, যেমন এক ধরণের লুপ বা ফাংশনগুলিতে প্যারামিটারগুলি পাস করার পদ্ধতি এবং এর মধ্যে এবং সাধারণ কার্যকারিতা যা বেশিরভাগ অ্যাপ্লিকেশনগুলির জন্য প্রয়োজন তার মধ্যে পার্থক্য করতে হবে।
গ্রন্থাগারগুলি এমন ফাংশন যা অনেক প্রোগ্রামারদের পক্ষে কার্যকর হতে পারে তাই এগুলি পুনরায় ব্যবহারযোগ্য কোড হিসাবে তৈরি করা যায় যা ভাগ করা যায়। স্ট্যান্ডার্ড লাইব্রেরিগুলি খুব সাধারণ ফাংশন হিসাবে ডিজাইন করা হয় যা সাধারণত প্রোগ্রামারদের প্রয়োজন হয়। এইভাবে প্রোগ্রামিং ভাষা তাত্ক্ষণিক প্রোগ্রামারদের একটি বিস্তৃত পরিসীমা জন্য দরকারী। লাইব্রেরিগুলি ভাষাটির মূল বৈশিষ্ট্যগুলি পরিবর্তন না করেই আপডেট এবং প্রসারিত হতে পারে।
PHP
উদাহরণস্বরূপ এর বিশাল ভাষার কার্যাবলী এবং ভাষার মধ্যেই কোনও পার্থক্য নেই।
include
, require
এবং require_once
, যদি / জন্য / যখন (কাঠামোবদ্ধ প্রোগ্রামিং), ব্যতিক্রম, 'ত্রুটি মান' একটি পৃথক সিস্টেম, দুর্বল টাইপিং নিয়ম জটিল, জটিল অপারেটর প্রাধান্য নিয়ম, এবং এবং উপর । এর সরলতার সাথে এর তুলনা করুন, বলুন, স্মলটালক, স্কিম,
অন্যান্য উত্তরগুলি ইতিমধ্যে যা বলেছে তা ছাড়াও একটি লাইব্রেরিতে স্ট্যান্ডার্ড ফাংশন স্থাপন করা উদ্বেগকে আলাদা করা :
ভাষার পার্স করা এবং এর জন্য কোড তৈরি করা সংকলকের কাজ। ইতিমধ্যে সেই ভাষায় লেখা যেতে পারে এবং একটি লাইব্রেরি হিসাবে সরবরাহ করা যায় এমন কোনও বিষয় ধারণ করা সংকলকের কাজ নয়।
কার্যত সমস্ত প্রোগ্রাম দ্বারা প্রয়োজনীয় মূল কার্যকারিতা সরবরাহ করার জন্য এটি স্ট্যান্ডার্ড লাইব্রেরির (সর্বদা স্পষ্টভাবে উপলব্ধ একটি) কাজ । এটি কার্যকর হতে পারে এমন সমস্ত ফাংশন ধারণ করা স্ট্যান্ডার্ড লাইব্রেরির কাজ নয়।
এটি অনেকগুলি প্রোগ্রাম ছাড়াই করতে পারে এমন সহায়ক কার্যকারিতা সরবরাহ করা alচ্ছিক স্ট্যান্ডার্ড লাইব্রেরির কাজ, তবে এটি এখনও বেশ মৌলিক এবং অনেক অ্যাপ্লিকেশনগুলির জন্য স্ট্যান্ডার্ড পরিবেশের সাথে শিপিংয়ের ওয়ারেন্ট দেওয়ার জন্য প্রয়োজনীয়। যে সমস্ত usচ্ছিক লাইব্রেরিগুলির সমস্ত কাজ পুনরায় ব্যবহারযোগ্য কোড যা কখনও লিখিত ছিল তা অন্তর্ভুক্ত করা কাজ নয়।
দরকারী পুনরায় ব্যবহারযোগ্য ফাংশনগুলির সংগ্রহ সরবরাহ করা ব্যবহারকারীর গ্রন্থাগারগুলির কাজ। কখনও লেখা হয়েছে এমন সমস্ত কোড ধারণ করা ব্যবহারকারী লাইব্রেরির কাজ নয়।
এই কোডটির বাকী বিটগুলি সরবরাহ করা কোনও অ্যাপ্লিকেশনটির সোর্স কোডের কাজ যা কেবলমাত্র সেই এক আবেদনের সাথে প্রাসঙ্গিক।
আপনি যদি এক-আকারের ফিট-সমস্ত সফ্টওয়্যার চান তবে আপনি খুব জটিল কিছু পাবেন। জটিলতাটি পরিচালনাযোগ্য স্তরে নামতে আপনাকে মডিউলাইজ করতে হবে। এবং আপনাকে আংশিক বাস্তবায়নের অনুমতি দেওয়ার জন্য মডুলারাইজ করতে হবে :
থ্রেডিং লাইব্রেরি একক-কোর এম্বেডড নিয়ামককে মূল্যহীন। এই এমবেডড কন্ট্রোলারের জন্য কেবলমাত্র pthread
লাইব্রেরি অন্তর্ভুক্ত না করার জন্য ভাষা প্রয়োগের অনুমতি দেওয়া হ'ল সঠিক কাজ।
গণিতের পাঠাগারটি এমন কোনও মাইক্রো-কন্ট্রোলারের পক্ষে মূল্যহীন যা এর কাছে এফপিইউও নেই। আবার, যেমন sin()
অণু-নিয়ন্ত্রকের জন্য আপনার ভাষার প্রয়োগকারীদের জন্য জীবনকে অনেক সহজ করে তোলে এর মতো ক্রিয়াকলাপ সরবরাহ করতে বাধ্য করা না হওয়া ।
এমনকি আপনি যখন কোনও কার্নেল প্রোগ্রামিং করছেন তখন মূল স্ট্যান্ডার্ড লাইব্রেরিও মূল্যহীন। আপনি write()
কার্নেলের মধ্যে সিস্কল ব্যতীত প্রয়োগ করতে পারবেন না এবং আপনি printf()
এটি ছাড়াও প্রয়োগ করতে পারবেন না write()
। কার্নেল প্রোগ্রামার হিসাবে, write()
সিস্কাল সরবরাহ করা আপনার কাজ , আপনি কেবল এটি উপস্থিত থাকার আশা করতে পারবেন না।
এমন একটি ভাষা যা স্ট্যান্ডার্ড লাইব্রেরি থেকে এই ধরনের বাদ দিতে দেয় না কেবল অনেকগুলি কাজের জন্য উপযুক্ত নয় । আপনি যদি চান যে আপনার ভাষাটি অস্বাভাবিক পরিবেশে নমনীয়ভাবে ব্যবহারযোগ্য হয়, তবে স্ট্যান্ডার্ড লাইব্রেরিগুলি কী অন্তর্ভুক্ত রয়েছে সে ক্ষেত্রে এটি নমনীয় হতে হবে। আপনার ভাষা যতটা স্ট্যান্ডার্ড লাইব্রেরিগুলির উপর নির্ভর করবে, তার কার্যকর পরিবেশের উপর এটি তত বেশি অনুমান করবে এবং এইভাবে এই পূর্বশর্তগুলি সরবরাহ করে এমন পরিবেশে এর ব্যবহারকে সীমাবদ্ধ করে।
অবশ্যই, পাইথন এবং জাভা এর মতো উচ্চ স্তরের ভাষাগুলি তাদের পরিবেশ সম্পর্কে প্রচুর অনুমান করতে পারে। এবং তাদের স্ট্যান্ডার্ড লাইব্রেরিতে অনেকগুলি, অনেক কিছু অন্তর্ভুক্ত করার প্রবণতা রয়েছে। সি এর মতো নিম্ন স্তরের ভাষাগুলি তাদের স্ট্যান্ডার্ড লাইব্রেরিতে অনেক কম সরবরাহ করে এবং মূল স্ট্যান্ডার্ড লাইব্রেরিটিকে অনেক ছোট রাখে। এজন্য আপনি কার্যত কোনও আর্কিটেকচারের জন্য একটি ওয়ার্কিং সি সংকলকটি খুঁজে পান তবে এটিতে কোনও পাইথন স্ক্রিপ্ট চালাতে সক্ষম নাও হতে পারেন।
একটি বড় কারণ সংকলক এবং স্ট্যান্ডার্ড লাইব্রেরি পৃথক কারণ তারা দুটি ভিন্ন উদ্দেশ্যে পরিবেশন করে (যদিও তারা উভয়ই একই ভাষার বর্ণ দ্বারা সংজ্ঞায়িত হয়): সংকলক উচ্চ-স্তরের কোডটিকে মেশিনের নির্দেশিকায় অনুবাদ করে এবং মানক পাঠাগারটি প্রাক-পরীক্ষিত সরবরাহ করে সাধারণভাবে প্রয়োজনীয় কার্যকারিতা বাস্তবায়ন। সংকলক লেখকরা অন্যান্য সফ্টওয়্যার বিকাশকারীদের মতোই মডুলারিটির মূল্য দেয়। প্রকৃতপক্ষে, প্রারম্ভিক কিছু সি সংকলক প্রাক-প্রক্রিয়াজাতকরণ, সংকলন এবং সংযোগের জন্য পৃথক প্রোগ্রামগুলিতে সংকলকটিকে আরও বিভক্ত করে।
এই পরিমিতিটি আপনাকে একগুচ্ছ সুবিধা দেয়:
Icallyতিহাসিকভাবে বলতে গেলে (কমপক্ষে সি এর দৃষ্টিকোণ থেকে), ভাষার মূল, প্রাক-মানক সংস্করণগুলির কোনও মানক গ্রন্থাগার ছিল না। ওএস বিক্রেতারা এবং তৃতীয় পক্ষগুলি প্রায়শই ব্যবহৃত ব্যবহৃত কার্যকারিতা পূর্ণ লাইব্রেরি সরবরাহ করত, তবে বিভিন্ন বাস্তবায়নে বিভিন্ন জিনিস অন্তর্ভুক্ত ছিল এবং তারা একে অপরের সাথে বেশিরভাগ ক্ষেত্রেই বেমানান। সিটিকে যখন মানসম্মত করা হয়েছিল, তখন তারা এই বৈষম্যমূলক বাস্তবায়নের সাথে মিল রেখে এবং বহনযোগ্যতার উন্নতি করার জন্য একটি "স্ট্যান্ডার্ড লাইব্রেরি" সংজ্ঞায়িত করেছিলেন। সি স্ট্যান্ডার্ড লাইব্রেরিটি ভাষা থেকে পৃথকভাবে বিকশিত হয়েছিল, যেমন বুস্ট লাইব্রেরিগুলি সি ++ এর জন্য রয়েছে তবে পরবর্তীকালে ভাষা অনুচ্ছেদে একীভূত হয়েছিল।
অতিরিক্ত কোণার ক্ষেত্রে উত্তর: বৌদ্ধিক সম্পত্তি পরিচালনা
উল্লেখযোগ্য উদাহরণ হ'ল । নেট ফ্রেমে ওয়ার্কে ম্যাথ.পাউ (ডাবল, ডাবল) প্রয়োগ করা যা মাইক্রোসফ্ট ইন্টেল থেকে কিনেছিল এবং ফ্রেমওয়ার্কটি ওপেন-সোর্স হয়ে গেলেও এটি অনির্ধারিত রয়েছে। (সুনির্দিষ্টভাবে বলতে গেলে, উপরের ক্ষেত্রে এটি একটি লাইব্রেরির চেয়ে অভ্যন্তরীণ কল তবে ধারণাটি ধারণ করে)) ভাষা থেকে পৃথক একটি লাইব্রেরি (তাত্ত্বিকভাবে স্ট্যান্ডার্ড লাইব্রেরির একটি উপসেট) ভাষা সমর্থনকারীদের আঁকার ক্ষেত্রে আরও নমনীয়তা দিতে পারে কী স্বচ্ছ রাখতে হবে এবং কী অপ্রকাশিত থাকতে হবে (তৃতীয় পক্ষের সাথে চুক্তি বা অন্যান্য আইপি সম্পর্কিত কারণে) এর মধ্যে লাইন।
Math.Pow
কোনও ক্রয়, বা ইন্টেল সম্পর্কিত কিছু উল্লেখ করা হয়নি এবং ফাংশনটি বাস্তবায়নের উত্স কোডটি পড়া লোকদের সম্পর্কে কথা বলা আছে।
বাগ এবং ডিবাগিং।
বাগগুলি: সমস্ত সফ্টওয়্যারটিতে বাগ রয়েছে, আপনার স্ট্যান্ডার্ড লাইব্রেরিতে বাগ রয়েছে এবং আপনার সংকলকটিতে বাগ রয়েছে। ভাষার ব্যবহারকারী হিসাবে যখন এই সংকলকটির বিপরীতে স্ট্যান্ডার্ড লাইব্রেরিতে থাকে তখন এ জাতীয় বাগগুলি খুঁজে পাওয়া ও তার সাথে কাজ করা আরও সহজ।
ডিবাগিং: একটি স্ট্যান্ডার্ড লাইব্রেরির স্ট্যাক ট্রেস দেখতে এবং কী ভুল হচ্ছে তা সম্পর্কে কিছুটা বোঝাতে আমার পক্ষে অনেক সহজ। কারণ যে স্ট্যাক ট্রেস কোড আছে আমি বুঝতে। অবশ্যই আপনি আরও গভীর খনন করতে পারেন এবং আপনি আপনার অভ্যন্তরীণ ফাংশনগুলিও সন্ধান করতে পারেন, তবে এটি আপনি যদি দিনের পর দিন সমস্ত সময় ব্যবহার করে এমন ভাষায় হন তবে এটি অনেক সহজ।
এটি একটি চমৎকার প্রশ্ন!
উদাহরণস্বরূপ, সি ++ স্ট্যান্ডার্ড কখনই সংকলক বা স্ট্যান্ডার্ড লাইব্রেরিতে প্রয়োগ করা উচিত তা নির্দিষ্ট করে না: এটি কেবল বাস্তবায়নকে বোঝায় । উদাহরণস্বরূপ, সংরক্ষিত প্রতীকগুলি সংকলক (আন্তঃসংশ্লিষ্ট হিসাবে) এবং স্ট্যান্ডার্ড লাইব্রেরি দ্বারা বিনিময়যোগ্য উভয় দ্বারা সংজ্ঞায়িত করা হয়।
তবুও, আমি জানি যে সমস্ত সি ++ বাস্তবায়নগুলি সংকলক দ্বারা প্রদত্ত ন্যূনতম সম্ভাব্য সংখ্যার অন্তর্ভুক্ত থাকবে এবং যতটা সম্ভব মানক পাঠাগার সরবরাহ করবে provided
এইভাবে, সংকলকটিতে স্ট্যান্ডার্ড লাইব্রেরিটি অভ্যন্তরীণ কার্যকারিতা হিসাবে সংজ্ঞায়িত করার জন্য প্রযুক্তিগতভাবে সম্ভব হলেও এটি অনুশীলনে খুব কমই ব্যবহৃত হয়েছে বলে মনে হয়।
আসুন স্ট্যান্ডার্ড লাইব্রেরি থেকে সংকলকটিতে কার্যকারিতার কিছু অংশ সরানোর ধারণাটি বিবেচনা করি।
সুবিধাদি:
অসুবিধা:
std
পরীক্ষার জন্য কেবল একটি ছোট লাইব্রেরি (এর বাইরে ) তৈরি করা আরও শক্ত করে তোলে makingএর অর্থ হ'ল সংকলকটিতে কোনও কিছু সরিয়ে নেওয়া এখন এবং ভবিষ্যতে ব্যয়বহুল এবং তাই এর জন্য একটি কঠিন কেস প্রয়োজন। কার্যকারিতার কয়েকটি অংশের জন্য এটি প্রয়োজনীয় (এগুলি নিয়মিত কোড হিসাবে লেখা যায় না) তবে তারপরেও এটি সংক্ষেপে স্থানান্তরিত করতে এবং স্ট্যান্ডার্ড লাইব্রেরিতে শীর্ষে তৈরি করার জন্য ন্যূনতম এবং জেনেরিক টুকরাগুলি বের করার জন্য অর্থ প্রদান করে ।
একজন ভাষা ডিজাইনার হিসাবে আমি এখানে অন্যান্য উত্তরগুলির কয়েকটি প্রতিধ্বনিত করতে চাই তবে ভাষাটি তৈরির কারও চোখের মাধ্যমে এটি সরবরাহ করব।
আপনি এটিতে যা কিছু করতে পারেন তা শেষ করার পরে একটি এপিআই শেষ হয় না। আপনি যখন যা করতে পারেন তার সমস্ত কিছু শেষ করার পরে একটি এআইপিআই শেষ হয়।
একটি প্রোগ্রামিং ভাষা কিছু ভাষা ব্যবহার করে নির্দিষ্ট করতে হবে। আপনার ভাষায় লিখিত যে কোনও প্রোগ্রামের পিছনে আপনাকে অর্থটি প্রকাশ করতে সক্ষম হতে হবে। এই ভাষাটি লিখতে খুব কঠিন, এবং ভাল লিখতেও আরও কঠিন। সাধারণভাবে, এটি কম্পিউটারের কাছে নয়, অন্য বিকাশকারীদের, বিশেষত যারা বিকাশকারীগণ আপনার ভাষার জন্য সংকলক বা দোভাষী লেখেন তাদের বোঝানোর জন্য ব্যবহৃত ইংরাজির একটি খুব সুনির্দিষ্ট এবং সুগঠিত রূপ বলে মনে হয়। এখানে সি ++ 11 টি স্পেসের একটি উদাহরণ রয়েছে, [ইন্ট্রো.মলিট্রিথ্রেড / 14]:
পারমাণবিক বস্তু এম এর পার্শ্ব প্রতিক্রিয়াগুলির দৃশ্যমান ক্রম, এম এর মান গণনা বি এর সাথে সম্মতিযুক্ত, এম এর পরিবর্তনের ক্রমে পার্শ্ব প্রতিক্রিয়াগুলির সর্বাধিক সংলগ্ন উপ-অনুক্রম যেখানে প্রথম পার্শ্ব প্রতিক্রিয়া বি এর সাথে সম্মতভাবে দৃশ্যমান , এবং প্রতিটি পার্শ্ব প্রতিক্রিয়ার জন্য, বি এর আগে এমনটি হয় না। বি মূল্যায়ন বি দ্বারা নির্ধারিত পারমাণবিক বস্তুর M এর মান হ'ল বি সম্পর্কিত সম্মানের সাথে এম এর দৃশ্যমান অনুক্রমের কিছু ক্রিয়াকলাপ দ্বারা সঞ্চিত মান হবে [দ্রষ্টব্য: এটি দেখানো যেতে পারে যে কোনও মানের পার্শ্ব প্রতিক্রিয়াগুলির দৃশ্যমান ক্রম নীচে সংহত প্রয়োজনে গণনাটি অনন্য। অন্তর্ভুক্ত নোট]
Blek! সি ++ 11 হ'ল মাল্টিথ্রেডিং কে কীভাবে পরিচালনা করে তা বোঝার জন্য যে কেউ এই ডুবিয়েছেন তা এই শব্দটির এত স্পষ্টরূপে কেন অস্বচ্ছ হতে হবে তা প্রশংসা করতে পারে, তবে এটি ... ভাল ... তাই অস্বচ্ছ!
std::shared_ptr<T>::reset
স্ট্যান্ডার্ডের লাইব্রেরি বিভাগে সংজ্ঞাটির সাথে এটির বিপরীতে :
template <class Y> void reset(Y* p);
প্রভাব: সমান
shared_ptr(p).swap(*this)
তাহলে পার্থক্য কী? ভাষার সংজ্ঞা অংশে, লেখকরা ধরে নিতে পারেন না যে পাঠক ভাষা আদিমগুলি বোঝেন। ইংরাজী গদ্যে সমস্ত কিছু সাবধানে নির্দিষ্ট করতে হবে। লাইব্রেরির সংজ্ঞা অংশে পৌঁছে আমরা আচরণটি নির্দিষ্ট করার জন্য ভাষাটি ব্যবহার করতে পারি। এটি প্রায়শই সহজ!
নীতিগতভাবে, স্পেস ডকুমেন্টের শুরুতে আদিমগণের কাছ থেকে আমরা "স্ট্যান্ডার্ড লাইব্রেরি ফিচারস" হিসাবে কী ভাবব তা নির্ধারণের মাধ্যমে "ভাষা আদিম" এবং "ভাষার আদিম" এর মধ্যে একটি রেখা আঁকানো ছাড়াই একটি সহজ মসৃণ গঠন হতে পারে principle "স্ট্যান্ডার্ড লাইব্রেরি" বৈশিষ্ট্যগুলি। অনুশীলনে, এই লাইনটি অঙ্কন করার জন্য অত্যন্ত মূল্যবান প্রমাণ করেছে কারণ এটি আপনাকে ভাষার সবচেয়ে জটিল অংশগুলির মধ্যে কিছু লিখতে দেয় (যেমন তাদের অ্যালগরিদমগুলি প্রয়োগ করতে হবে) তাদের প্রকাশের জন্য ডিজাইন করা একটি ভাষা ব্যবহার করে।
এবং আমরা অবশ্যই কিছু অস্পষ্ট রেখা দেখতে পাচ্ছি:
java.lang.ref.Reference<T>
যেতে পারে এবং এর আচরণগুলি জাভা ভাষার স্পেসিফিকেশনের সাথে এত গভীরভাবে জড়িয়ে পড়েছিল যে তাদের "স্ট্যান্ডার্ড লাইব্রেরি" শ্রেণি হিসাবে প্রয়োগ করা প্রক্রিয়াটির অংশে কিছুটা বিধিনিষেধ তৈরি করা দরকার।java.lang.ref.WeakReference<T>
java.lang.ref.SoftReference<T>
java.lang.ref.PhantomReference<T>
Reference
এটি বিদ্যমান উত্তরগুলির সংযোজন হিসাবে বোঝানো হয়েছে (এবং কোনও মন্তব্যের জন্য এটি খুব দীর্ঘ)।
স্ট্যান্ডার্ড লাইব্রেরির জন্য কমপক্ষে আরও দুটি কারণ রয়েছে:
যদি কোনও নির্দিষ্ট ভাষার বৈশিষ্ট্য কোনও লাইব্রেরির ফাংশনে থাকে এবং আমি এটি কীভাবে কাজ করে তা জানতে চাই, আমি কেবলমাত্র সেই ফাংশনের উত্সটি পড়তে পারি। আমি যদি কোনও বাগ রিপোর্ট / প্যাচ / পুলের অনুরোধ জমা দিতে চাই তবে সাধারণত কোনও ফিক্স এবং টেস্ট কেস কোড করা খুব বেশি কঠিন নয়। যদি এটি সংকলকটিতে থাকে তবে আমাকে ইন্টার্নালগুলি খনন করতে সক্ষম হতে হবে। এমনকি যদি এটি একই ভাষায় হয় (এবং এটি হওয়া উচিত, যে কোনও স্ব-সম্মানের সংকলকটি স্ব-হোস্ট করা উচিত) সংকলক কোডটি অ্যাপ্লিকেশন কোডের মতো কিছুই নয়। এমনকি সঠিক ফাইলগুলি খুঁজে পেতে চিরতরে সময় নিতে পারে।
আপনি যদি এই পথে যান তবে আপনি অনেক সম্ভাব্য অবদানকারীদের থেকে নিজেকে কেটে ফেলছেন।
অনেক ভাষা এই বৈশিষ্ট্যটি এক ডিগ্রি বা অন্য কোনওটিতে সরবরাহ করে তবে গরম কোডটি যে পুনরায় লোড করছে তা গরম করে পুনরায় লোড করা অত্যন্ত জটিল। এসএল রানটাইম থেকে আলাদা থাকলে এটি পুনরায় লোড করা যায়।
এটি একটি আকর্ষণীয় প্রশ্ন তবে ইতিমধ্যে অনেকগুলি ভাল উত্তর দেওয়া আছে, সুতরাং আমি একটি সম্পূর্ণরূপে চেষ্টা করব না।
তবে, দুটি বিষয় যা আমি মনে করি না যে যথেষ্ট মনোযোগ পেয়েছে:
প্রথমটি হ'ল পুরো জিনিসটি সুপার ক্লিয়ার কাট নয়। এটি কিছুটা স্পেকট্রাম হুবহু কারণ আলাদাভাবে কাজ করার কারণ রয়েছে। উদাহরণস্বরূপ, সংকলকগণ প্রায়শই স্ট্যান্ডার্ড লাইব্রেরি এবং তাদের কার্যাদি সম্পর্কে জানেন। উদাহরণটির উদাহরণ: সি এর "হ্যালো ওয়ার্ল্ড" ফাংশন - প্রিন্টফ - আমি ভাবতে পারি এটি সেরা। এটি একটি লাইব্রেরি ফাংশন, এটির আকার অনুসারে হওয়া উচিত, কারণ এটি অত্যন্ত প্ল্যাটফর্ম নির্ভর। প্রোগ্রামারকে খারাপ দাওয়াত সম্পর্কে সতর্ক করার জন্য এটির আচরণটি (বাস্তবায়িত সংজ্ঞায়িত) সংকলক দ্বারা জানা দরকার। এটি বিশেষ ঝরঝরে নয়, তবে এটি একটি ভাল আপস হিসাবে দেখা হয়েছিল। ঘটনাচক্রে, এটি "কেন এই ডিজাইন" প্রশ্নের বেশিরভাগের আসল উত্তর: অনেকগুলি আপস এবং "এই সময়ে একটি ভাল ধারণা বলে মনে হয়েছিল"। "এটি করার সুস্পষ্ট উপায় ছিল" বা "সবসময় নয়
দ্বিতীয়টি হ'ল এটি স্ট্যান্ডার্ড লাইব্রেরিটিকে সমস্ত স্ট্যান্ডার্ড না করে দেয়। অনেকগুলি পরিস্থিতি রয়েছে যে কোনও ভাষা আকাঙ্ক্ষিত তবে স্ট্যান্ডার্ড লাইব্রেরিগুলি যা সাধারণত তাদের সাথে থাকে সেগুলি ব্যবহারিক এবং পছন্দসই উভয়ই নয়। সি-এর মতো সিস্টেম প্রোগ্রামিং ভাষার ক্ষেত্রে এটি বেশিরভাগ ক্ষেত্রেই হয়, অ-মানক প্ল্যাটফর্মগুলিতে। উদাহরণস্বরূপ, যদি আপনার ওএস বা শিডিয়ুলারবিহীন কোনও সিস্টেম থাকে: আপনার থ্রেডিং নেই।
একটি স্ট্যান্ডার্ড লাইব্রেরি মডেল (এবং এতে থ্রেডিং সমর্থনযোগ্য) দিয়ে এটি পরিষ্কারভাবে পরিচালনা করা যেতে পারে: সংকলকটি প্রায় একই রকম, আপনি প্রয়োগ করা লাইব্রেরির বিটগুলি এবং যেটি আপনি মুছে ফেলতে পারবেন না সেগুলি পুনরায় ব্যবহার করতে পারেন। এটি যদি সংকলকটিতে বেক করা হয় তবে জিনিসগুলি অগোছালো হতে শুরু করে।
উদাহরণ স্বরূপ:
আপনি কোনও কমপ্লায়ার সংকলক হতে পারবেন না।
আপনি কীভাবে মান থেকে আপনার বিচ্যুতি নির্দেশ করবেন। নোট করুন সাধারণত আমদানির কিছু ফর্ম থাকে / সিনট্যাক্স অন্তর্ভুক্ত করে আপনি ব্যর্থ হতে পারেন অর্থ্যাৎ পাইথনস এর আমদানি বা সি এর অন্তর্ভুক্ত যা স্ট্যান্ডার্ড লাইব্রেরি মডেলটিতে কিছু অনুপস্থিত থাকলে সমস্যাটিকে সহজেই নির্দেশ করে points
এছাড়াও আপনি যদি 'লাইব্রেরি'র কার্যকারিতা টুইঙ্ক বা প্রসারিত করতে চান তবে অনুরূপ সমস্যাগুলি প্রযোজ্য। এটি আপনার ভাবার চেয়ে অনেক বেশি সাধারণ। কেবল থ্রেডিংয়ের সাথে লেগে থাকার জন্য: উইন্ডোজ, লিনাক্স এবং কিছু বহিরাগত-নেটওয়ার্ক-প্রসেসিং-ইউনিটগুলি একে অপরকে থ্রেডিং করে। যদিও লিনাক্স / উইন্ডোজ বিটগুলি মোটামুটি স্থিতিশীল এবং একটি অভিন্ন API ব্যবহার করতে সক্ষম হতে পারে তবে এনপিইউ স্টাফটি সপ্তাহের দিন এবং এটির সাথে এপিআই পরিবর্তিত হবে। এই ধরণের জিনিসটিকে বিভক্ত করার কোনও উপায় না থাকলে লোকেরা কোন বিটকে দ্রুত / সমর্থন-সহ-আউট-আউট সমর্থন করতে হবে তা সিদ্ধান্ত নেওয়ার সাথে সাথে সংকলকগুলি দ্রুত বিচ্যুত হবে।