সি ++ কেন এখনও "সংকর"


16

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

হাইব্রিড দ্বারা আমি বলতে চাইছি প্রোগ্রামার তার সিদ্ধান্ত নেবে যে সে / সে ব্যবহার করবে: স্ট্যান্ডার্ড স্ট্রিংস এবং স্ট্রিম, ক্লাস, ডিফল্ট ব্যতীত নেমস্পেস ইত্যাদি to


এমন কোনও সংকলক / আইডিই সেটিংস রয়েছে যা এটি প্রয়োগ করতে পারে?
হতাশ

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

2
সি ++ এর কোনও জিনিসের অস্তিত্বের হয় পিছন সামঞ্জস্য এবং সম্ভাবনা সব মলিন ঠাট যে সি সম্ভব ছিল দূরে নিন ব্যবহার করার জন্য, এবং এটি শুধু আরেকটি সি #, ডি বা জাভা ক্লোন আছে। আপনি যদি এটি চেয়েছিলেন তবে কেন কেবল সি #, ডি বা জাভা ব্যবহার করবেন না?
নিকি

5
@ নিকি: হাহাহাহাহা। কারণ টেমপ্লেট, মান ধরণের, শক্তিশালী রেফারেন্স, নির্ধারক ধ্বংস, একাধিক উত্তরাধিকার, মৃত্যুদন্ড কার্যকর করার গতি, কম স্মৃতি ব্যবহার, এই জিনিসগুলি মোটেই বিদ্যমান নয়।
ডেডএমজি

2
@ নিকি: ডি Objectএর নিজস্ব এবং অন্যান্য প্রশ্নবিদ্ধ নকশা সিদ্ধান্তের পাশাপাশি বাইনারি অনুলিপি মূল্যায়ন এবং ভাষা-বিভাগিত মিশুক অ্যারেগুলি (কেন ...) এর মতো ঘৃণ্যতা রয়েছে। এছাড়াও, এটির কার্যকরভাবে অন্যদের মতো একই জিসি দৃষ্টান্ত রয়েছে, তাই আমি কম মেমরির ব্যবহার নিয়ে প্রশ্ন করব।
ডেডএমজি

উত্তর:


26

হ্যাঁ, একটি শক্তিশালী যুক্তি রয়েছে: সি ++ কোড প্রায় সর্বদা বিদ্যমান সি কোড কল করতে হয়। আমরা সবচেয়ে ভাল যা করতে পারি তা হ'ল ভাল কোড লেখা সহজ করে তোলে। কোনও ভাষা ডিজাইনার খারাপ কোড লিখতে অসম্ভব করে তুলতে পারে এমন কিছুই নেই।


1
অবশ্যই, তবে যেহেতু এটি কেবলমাত্র উত্তরাধিকারের কোডের জন্য তাই কেন সি ++ এর নতুন সংস্করণগুলিকে সামঞ্জস্যপূর্ণ থাকতে হবে? লিগ্যাসি কোডটি এখনও সি ++ এর পুরানো সংস্করণ ব্যবহার করতে পারে।
সাকিস্ক

15
@ ফিফ, আমার চাকরিতে আমি নতুন সি ++ কোড লিখি যা নতুন সি কোডের সাথে ইন্টারফেসের প্রয়োজন। এটি কেবল কোনও উত্তরাধিকার বিষয় নয়।
কার্ল বিলেফেল্ট

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

4
The best we can do is make it easy to write good code.- আমরা কি একই সি ++ নিয়ে কথা বলছি?
ব্লুরাজা - ড্যানি পিফ্লুঘুফুট

4
@ ব্লুরাজা-ড্যানিপ্লুঘুফুট: জাভা বা সি # এর চেয়ে সি ++ তে ভাল কোড লেখা আমার পক্ষে অনেক সহজ মনে হয়েছে। সি ++ দিয়ে আমি একটি ক্লাস পড়তে পারি এবং অন্য সমস্ত শ্রেণি যদি আচরণ করে তবে আমি জানি যে স্মৃতি এবং সংস্থানগুলি ফাঁস হবে না। জাভা এবং সি # দিয়ে আমি এটি করতে পারি না; তাদের অন্য কারও চূড়ান্তকরণের প্রয়োজন আছে কিনা তা দেখতে আমাকে অন্যান্য ক্লাসে পরিদর্শন করতে হবে। সি ++ টেম্পলেটগুলি আমাকে জাওয়ার কোডটি পুনরায় বার করতে হবে DR
কেভিন ক্লিন

20

আইএমএইচও, ভাষা / সংকলক কিছুটা প্রোগ্রামারদের আরও মার্জিত কোড লিখতে বাধ্য করলে এটি আরও ভাল।

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

ভাষা প্রয়োগকারী কোডিং শৈলীগুলি সত্যই, সত্যই খারাপ। ভেঙে যাবে এমন সমস্ত লিগ্যাসি কোড উল্লেখ না করে।

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

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


কিছুটা বাস্তবসম্মত পদ্ধতির জন্য +1 (কখন "মার্জিত কোড" টক বন্ধ হবে: /
রুক

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

3
আমি এর সাথে একমত কিনা তা নিশ্চিত নই। জাভাস্ক্রিপ্টের উপরে কফি স্ক্রিপ্ট ব্যবহারের প্রধান কারণ হ'ল কফিস্ক্রিপ্ট আরও মার্জিত কোড রচনা প্রয়োগের জন্য তৈরি করা হয়েছে।
ব্যবহারকারী16764

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

1
@ পাব্বি: "একটি কুরুচিপূর্ণ প্রোগ্রাম যা কাজ করে সেগুলি লিখলে কিছুই না করে এমন একটি সুন্দর প্রোগ্রাম লেখার চেয়ে ভাল" " অবশ্যই, আমি এটির সাথে একমত হতে পারি তবে এই নিবন্ধটি এর বাইরে চলে গেছে এবং মনে হয় যে কদর্যতা আসলে একটি গুণ। এবং এটি কেবল হাস্যকর।
ম্যাসন হুইলার

8

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

আইএমএইচও, ভাষা / সংকলক কিছুটা প্রোগ্রামারদের আরও মার্জিত কোড লিখতে বাধ্য করলে এটি আরও ভাল।

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

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

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


1
আরও একমত হতে পারে না। আমি ভাবব যে কেউ যখন "সি ++ নমনীয় হয়" বলে আমি তা ভাবব কারণ এটি সি এর চেয়ে অনেক বেশি দৃষ্টান্ত সমর্থন করে।
প্রিলিক

5

আইএমএইচও, ভাষা / সংকলক কিছুটা প্রোগ্রামারদের আরও মার্জিত কোড লিখতে বাধ্য করলে এটি আরও ভাল।

কেউ নেই অত্যাচার প্রথম স্থানে সি ++ ব্যবহার করতে যে কেউ। যদি ভাষাটি আপনার উপযুক্ত না হয় তবে আলাদা আলাদা ভাষা ব্যবহার করুন - "C ++ ছাড়া C ++" হিসাবে অনেকগুলি বিল দেওয়া আছে।

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

সি ++ এর সি এর সাথে সামঞ্জস্যতা অবশ্যই এটি দুর্বলতম পয়েন্টগুলির মধ্যে একটি, তবে এটি মনে রাখবেন যে এটি এর অন্যতম বৃহত একটি।


আমি জোন পুরীর একটি দুর্দান্ত উক্তি যোগ করতে যাচ্ছি যা আমি অত্যন্ত প্রাসঙ্গিক বলে মনে করি:

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

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


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

1
@ ফিফ: না, তবে পিছনের সামঞ্জস্যতা এবং কমনীয়তা পরস্পরবিরোধী। এটি পাইথনের ক্ষেত্রেও প্রযোজ্য (2.x বনাম 3.x)।
dan04

4

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

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

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


2

আপনার ধারণা জাভা পিছনে নকশা যুক্তিযুক্ত অনেক গঠন করে। জাভা আপনাকে ক্লাস ব্যবহার করতে, প্যাকেজ হায়ারার্কি অনুসারে ফাইলের স্তরক্রম সংগঠিত করতে, ব্যতিক্রমগুলি ধরতে বাধ্য করে etc.

প্রোগ্রামার হিসাবে, আমরা মাঝেমাঝে ভুলে যাই সেরা সমাধানটি কোনও প্রযুক্তিগত নাও হতে পারে। পিয়ার রিভিউগুলি এই ক্ষেত্রে সর্বাধিক পরিচিত সমাধান।


0

সি ++ এর কোনও "এক সত্য উপায়" নেই; প্রতিটি পদ্ধতির শক্তি এবং দুর্বলতা রয়েছে। সমাধান একশ বিভিন্ন উপায়ে লেখা যেতে পারে।

সফ্টওয়্যার বিকাশকারী হিসাবে আপনাকে সিদ্ধান্ত নিতে হবে যে কার্যটি হস্তের জন্য সর্বোত্তম।


0

আমি মনে করি যে আপনি তালিকাভুক্ত সমস্ত জিনিস alচ্ছিক হ'ল আরও কমনীয়তার সম্ভাবনা তৈরি করে , কম নয়। অযৌক্তিকভাবে ব্যবহৃত বৈশিষ্ট্যটি আমার চোখে অমনোযোগী।

প্রোগ্রামিং ব্যবহার করে আমাদের যে সমস্যাগুলি সমাধান করতে হবে তা খুব আলাদা very
কিছু ওও নীতিগুলি (যেমন জিইউআই) ব্যবহার করে ভাল সমাধান করা হয়, কেউ কেউ নিজেকে নিখুঁত কার্যকরী চিকিত্সার (যেমন সংখ্যাসূচক স্টাফ) উন্নত করে তোলে, আবার কেউ কেউ নিম্ন স্তরের "সিলিকনের কাছাকাছি" ভাষায় প্রকাশিত হয়।

প্রচুর সফ্টওয়্যারের সাব-প্রবলেমগুলি সমাধান করা দরকার যা সেগুলির মধ্যে যে কোনও একটিতে সবচেয়ে ভাল সমাধান করা হয়। সমাধানটিকে একটি নির্দিষ্ট ফর্মের জন্য বাধ্য করা কেবল এমন কোডের দিকে নিয়ে যাবে যা এর উদ্দেশ্যগুলির সাথে কম ফিট (আপনি এমনকি "কম মার্জিত "ও বলতে পারেন)।

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

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