অন্যান্য উত্তরে ইতিমধ্যে কিছু ভাল পয়েন্ট রয়েছে তবে আমি আপনার প্রশ্ন এবং বিবৃতি পৃথকভাবে সম্বোধন করে আরও একটি সম্পূর্ণ উত্তর সরবরাহ করতে চাই।
জাভা যদি সি ++ এর বৈশিষ্ট্য সরবরাহ না করে তবে এর অর্থ বৈশিষ্ট্যটি ভাল নয়, তাই আমাদের এটি ব্যবহার করা বন্ধ করা উচিত।
এটি বেশ উত্তমরূপে জবাব দেওয়া হয়েছে: জাভা সি ++ এর "ভাল অংশগুলি" নয় বা এটি ভাবার কোনও কারণ নেই।
বিশেষত, যদিও প্রতিটি পৃথক সি ++ বৈশিষ্ট্যের গুণাগুণ বিতর্কযোগ্য তবে জাভা অংশ নয় এমন সি ++ 11 / সি ++ 14 এর অনেকগুলি বৈশিষ্ট্য অগত্যা বাদ দেওয়া হয় না কারণ জাভা ডিজাইনাররা ভাবেন যে তারা একটি খারাপ ধারণা। উদাহরণস্বরূপ, সংস্করণ 8 পর্যন্ত জাভাতে ল্যাম্বডাস ছিল না, তবে তারা সি ++ 11 স্ট্যান্ডার্ডে সি ++ এর সাথে পরিচিত হয়েছিল। জাভা 8 এর পূর্বে আপনার অনুমান যে জাভা থেকে সি ++ বৈশিষ্ট্যগুলি নিখোঁজ হয়েছে কারণ সেগুলি "ভাল নয়" বলতে বোঝায় যে ল্যাম্বডাস একটি ভাষা বৈশিষ্ট্য হিসাবে "ভাল নয়" (সর্বত্র এলআইএসপিয়ারদের বিভীষিকার জন্য) আপনি সম্ভবত জাভাকে পছন্দ করেছেন এমনটি শুনে সম্ভবত যথেষ্ট ভয়াবহ ঘটনা ঘটেছে )। তবে এখন জাভা ডিজাইনাররা ল্যাম্বডাসে তাদের স্ট্যাম্প অফ এপ্রোভাল (টিএম) রেখেছেন, তাই তারা এখন একটি ভাল জিনিস।
কিছুটা গভীর খনন করতে, এমনকি জাভা 8-তে, ল্যাম্বডাস-এ-ক্লোজারগুলি সি ++ 14 এর ল্যাম্বডাসের মতো নমনীয় নয়, তবে এটি জেভিএম আর্কিটেকচারের সীমাবদ্ধতার কারণে হতে পারে একটি সচেতন সিদ্ধান্তের চেয়ে যে আরও নমনীয় পদ্ধতিটি খারাপ থেকে খারাপ হয় ভাষা নকশা দৃষ্টিভঙ্গি।
সি ++ কোডটি সি ++ নির্দিষ্ট বৈশিষ্ট্যগুলির সাথে (যেমন: বন্ধু ফাংশন, একাধিক উত্তরাধিকার) কেবল সি ++ প্রোগ্রামারদের দ্বারা বজায় রাখা বা পর্যালোচনা করা যেতে পারে, তবে আমরা কেবল জাভা (সি ++ ভাষার নির্দিষ্ট বৈশিষ্ট্য ছাড়াই) এর মতো সি ++ লিখি, কোড উভয়ই বজায় রাখতে বা পর্যালোচনা করতে পারে সি ++ এবং জাভা প্রোগ্রামারগণ।
আমি যে প্রতিক্রিয়া জানাতে চেয়েছিলাম এটিই মূল বিষয়।
বিস্তৃতভাবে বলতে গেলে, প্রোগ্রামারদের কাছ থেকে কোড পর্যালোচনা পাওয়ার কিছু মূল্য থাকতে পারে যারা আপনার ব্যবহার করা ভাষার সাথে ঘনিষ্ঠভাবে পরিচিত নয়। তারা আপনাকে আপনার ফাংশন / পদ্ধতির নাম এবং মন্তব্যের স্পষ্টতা সম্পর্কে মূল্যবান মতামত দিতে পারে এবং (যেমন আপনার প্রশ্নটি সঠিকভাবে বোঝায়) যদি ভাষাটি তারা ইতিমধ্যে জানে এমন এক বা একাধিক ভাষার অনুরূপ হয় তবে তারা বেসিক প্রোগ্রামের প্রবাহটি অনুসরণ করতে সক্ষম হতে পারে এবং সম্ভাব্যভাবে যুক্তি ত্রুটিগুলি ধরা।
তবে, এটি এমন নয় যে এই ধরণের পর্যালোচনাটি আপনি যে ভাষা ব্যবহার করছেন তা বাস্তবে জানেন এমন বিকাশকারীদের কাছ থেকে "সমান হিসাবে ভাল" বা "সমতুল্য" হতে হবে। মূলত, এর কারণ এটি একটি ভাষা অন্যর মতো দেখতে তৈরি করা সাধারণত সূক্ষ্ম পার্থক্যগুলি আড়াল করে রাখে, যখন একটি ভাষার সাথে অন্যর মতো আচরণ করা হয় (বিশেষত সি ++ এবং জাভা ক্ষেত্রে) ভাষার জন্য অ-পরিচয়মূলক হতে পারে এবং / অথবা এখনও খুব বিভ্রান্তিকর হতে পারে পর্যালোচকদের জন্য।
প্রথমে, সি ++ "জাভা" এর মতো দেখতে তৈরি করার অর্থ কী তা নিয়ে ভাবুন। একটি সাধারণ কেস হিসাবে, আপনি new
জাভায় যেমন অবজেক্টগুলি ইনস্ট্যান্ট করতে ব্যবহার করতে পারেন :
Foo foo = new Foo();
তবে অবজেক্টগুলি এই পদ্ধতিতে কল করার ->
পরিবর্তে ব্যবহার করুন .
, সুতরাং আপনি যদি জাথার মতো দেখতে কল কল করতে চান তবে আপনাকে অবশ্যই এটি লিখতে হবে:
Foo& foo = *new Foo();
তবে এটি অ-মূ ;়; বিশেষত, মেমরিটি পরে ব্যবহার করে পরিষ্কার করতে হবে delete &foo
, যা কিছু অভিজ্ঞ সি ++ ডিভাস আইনী কোড হিসাবে বুঝতে পারেন না । উভয় ক্ষেত্রেই, মজার অ জাভা মত সর্বত্র সিঁচিত প্রতীক, তাই আমরা পারব না বেশ ভাষা জাভা "মত চেহারা," না। (আপনি আরও খারাপ, বা *new
ব্যবহার করে বাদ দিয়ে দিতে পারেন , তবে তারপরে আপনি কেবল আপনার সহকর্মী বিকাশকারীদের আপনাকে ঘৃণা করার জন্য অনুরোধ করছেন)) এবং উপরে বর্ণিত হিসাবে জাভাতে উপস্থিত নেই, সুতরাং কোনও ক্ষেত্রে (অন্য উত্তরে উল্লিখিত হিসাবে) ) আপনি কখনই স্মৃতি ফাঁস ছাড়াই জাভাতে যেভাবে অবজেক্ট-ব্যবহার "চেহারা" করতে পারেন তা করতে পারেন না।#define New *new
#define new *new
delete
তবে আধুনিক সি ++ এর মধ্যে স্মার্ট শেয়ার্ড পয়েন্টার রয়েছে, যা জাভা-র মেমরি-পরিচালিত ভেরিয়েবল-রেফারেন্সের মতো আচরণ করে। জাভাতে যে কোনও জায়গায় আপনি লিখতে পারেন Foo foo = new Foo();
, আপনি তার পরিবর্তে লিখতে পারেন:
std::shared_ptr<Foo> foo = std::make_shared<Foo>();
এখন আপনি এমন একটি ভাষা বৈশিষ্ট্য ব্যবহার করছেন যা জাভা হুডের নীচে আসলে অনেকটা। তবে হঠাৎ আপনার অ-সি ++ পর্যালোচকদের কাছে অনেক কিছুই ব্যাখ্যা করার আছে: এই জিনিসটি কী shared_ptr
? সূক্ষ্ম কৌতুক "গটচস" make_shared
কী? (এটি নিখুঁত-ফরোয়ার্ডিং ব্যবহার করে, যার কিছু ব্যর্থতার কেস রয়েছে এবং এটি "ভুল" কনস্ট্রাক্টরকে ডেকে আনতে পারে)) কেন পদ্ধতিগুলি কল করা প্রয়োজন ->
, তবে .
সংকলক দ্বারা কিছু পদ্ধতি ব্যবহারের অনুমতি দেওয়া হয়েছে কেন? ( shared_ptr
এর নিজস্ব পদ্ধতি Foo::reset(void)
রয়েছে )) যদি পদ্ধতিটি বিদ্যমান থাকে তবে অজ্ঞান বিকাশকারী এটির সাথে কল করার চেষ্টা করতে পারে foo.reset()
, যা (যদি Foo
কলটি আসে তখন কেবলমাত্র একটি অংশীদারি পয়েন্টার উপস্থিত থাকে) অন্তর্নিহিত মেমরিটি মুছে ফেলবে এবং বাতিল করবে foo
, এবং জাভা বিকাশকারীরা এই সমস্যাটি ধরার সম্ভাবনা নেই।
অধিকন্তু, সি ++ করেছেন অনেক এর ফাঁদ যে নির্দিষ্ট করার ভাষা। সর্বোপরি আমি বলতে পারি, বেশিরভাগ সি ++ বিকাশকারীরা "নিরাপদ" সি ++ অনুশীলনের জন্য ধীরে ধীরে তাদের নিজস্ব প্রতিভা বিকাশ করে এই সমস্যাগুলি মোকাবেলা করতে শেখে, যা তাদের বা তাদের উন্নয়ন দলের কাছে প্রায়শই কিছুটা স্বতন্ত্র থাকে (উদাহরণস্বরূপ বিদ্যমান উত্তরগুলিতে উল্লেখ রয়েছে যা দেখুন) গুগল কোডিংয়ের অনুশীলন এবং এতে মন্তব্য করে যে "সিজনেড সি ++ প্রবীণরা সাধারণত গুগল কোডিং গাইডলাইনগুলি প্রত্যাখ্যান করে")। সমস্ত দাবি যে ভাষাটি খুব জটিল হতে পারে, মনে হয় (আমার অভিজ্ঞতায়, কমপক্ষে) সাধারণত কিছুটা পরিবর্তনের সাথে দেখা হয় "ভাল, এটি ভুল ব্যবহার বন্ধ করুন" " আমি বুঝতে পারছি এই সি ++ সম্প্রদায়ের একজন অত্যন্ত নেতিবাচক দৃশ্য, এবং সেখানে অবশ্যই অভিজ্ঞ ডেভেলপার আরো ভাষা-শিক্ষার্থীদের আউট সাহায্য করতে ইচ্ছুক, কিন্তু আছে উদাহরণস্বরূপ অপরিজ্ঞাত আচরণ সম্পর্কে একটি নির্দিষ্ট প্রতিরক্ষা বলে মনে হচ্ছে (উদাহরণস্বরূপ আমার 'ক্ষতি' লিঙ্কে আলোচনার বেশিরভাগ অংশ দেখুন)।
জাভা বিকাশকারীরা কেবল কোড পর্যালোচনার মাধ্যমে এই সমস্যাগুলি খুঁজে পেতে এবং সংশোধন করতে সহায়ক হবে না।
আপনাকে কোনও দিন জাভাতে কোড রূপান্তর করতে বলা হতে পারে।
আপনি ডিজাইনের পর্যায়ে থাকাকালীন ভবিষ্যতে আপনার কোডটির কী ঘটতে পারে তা আমলে নেওয়ার চেষ্টা করার জন্য এটি সম্পূর্ণ বৈধ - প্রশংসনীয়, এমনকি -।
তবে, প্রথমে, এই বিশেষ বিবেচনাটি দূরবর্তী সম্ভাবনার মতো বলে মনে হয়: কোডটি সাধারণত হয় হয় যেমনটি পুনরায় ব্যবহার করা হয় (উদাহরণস্বরূপ আপনি কিছু বা সমস্ত কর্মরত সি ++ কোড কোনও ভবিষ্যতের জাভা সফ্টওয়্যারটিতে একটি জেএনআই ইন্টারফেস ব্যবহার করে প্লাগ করতে পারেন) বা পুরোপুরি পুনরায় লিখেছিলেন rather সরাসরি ম্যানুয়ালি "প্রতিলিপি" থেকে
এবং দ্বিতীয়, আপনি পরে বলবেন,
প্রতিটি সি ++ ভাষা নির্দিষ্ট বৈশিষ্ট্য (যেমন: একাধিক উত্তরাধিকার) এর জাভাতে প্রয়োগ করার বিকল্প থাকতে হবে ....
এটি মূলত আপনার "জাভাতে রূপান্তর" পয়েন্ট বাতিল করে। যদি সফ্টওয়্যারটি আইডেম্যাটিক সি ++ এ লিখিত হয় এবং তার পরে আইডেম্যাটিক জাভাতে রূপান্তরিত হয় তবে জাভা বৈশিষ্ট্যগুলিতে সি ++ বৈশিষ্ট্যগুলির সুনির্দিষ্ট এক থেকে এক ম্যাপিং প্রয়োগ করে এই রূপান্তরটি (বা পারে!) হওয়ার কোনও কারণ নেই।
সি ++ নির্দিষ্ট বৈশিষ্ট্য ছাড়াই কোড সাধারণত আরও রক্ষণাবেক্ষণযোগ্য।
আপনি এখানে কী বোঝাতে চেয়েছেন তা পরিষ্কার নয়, তবে আপনি এর থেকে কিছুটা অংশেই সম্মত হন: আপনি যদি খুব যত্নবান না হন এবং আপনি সতর্ক হন না কেন, সি ++ বৈশিষ্ট্যগুলি রক্ষণাবেক্ষণের সমস্যা হতে পারে। সি ++ FQA লাইট (ক ওয়েবসাইট ভাষা ও কেউ অন্তত আসলে মোটামুটি ভাল বুঝতে প্রদর্শিত হয় সেখান থেকে এর adherents সমালোচনা) বলে যে,
... 80% বিকাশকারী ভাষার প্রায় 20% ভাষা বুঝতে পারে। এটি বিভিন্ন লোকের জন্য একই 20% নয়, সুতরাং একে অপরের কোড বোঝার জন্য তাদের উপর নির্ভর করবেন না।
অনুগ্রহ করে নোট করুন: আপনি যদি সি ++ অনুরাগী হন এবং আপনি আমার উত্তরটিতে এই মুহুর্তে পৌঁছে যান এবং এই মন্তব্যটি করতে ঝোঁক বোধ করেন যে এফকিউএর লেখক আসলে সি ++ বুঝতে পারে না বা তার বেশিরভাগ যুক্তি থেকে স্বতন্ত্র , দ্রষ্টব্য যে (1) আমি তাকে উদ্ধৃত করার ঠিক দুটি বাক্য পরে আমি স্বীকার করেছি যে এফকিউএ খুব পক্ষপাতদুষ্ট উত্স, এবং (২) আমি কী বলতে চাইছি তাতে এফকিউএ লেখক সি ++ বুঝতে পেরেছেন কিনা তাতে আসলেই কিছু যায় আসে না , এবং আমি সি ++ কে ঘৃণা করার চেষ্টা করছি না, এবং আমি এফকিউএর উদ্ধৃতি দিয়েছি বলে ধরে নিই যে আপনি আমি বিরোধী-সি +++ ধরে না রেখে বাকী পোস্টটি পড়া উচিত। নোটের সমাপ্তি।
একইভাবে লিনাস টরভাল্ডস মূলত এই কারণে সি ++ ঘৃণা করে (সতর্কতা: লিঙ্কটিতে সত্যিকারের কুখ্যাত লিনাস শৈলীতে প্রচুর শপথ গ্রহণ করা হয়)।
স্পষ্টতই, এগুলি বিষয়টি খুব পক্ষপাতদুষ্ট, তবে সি ++ প্রবক্তারাও প্রায়শই বলে থাকেন যে আপনার ভাষা বৈশিষ্ট্য-সেটটির সম্পূর্ণতা ব্যবহার করা উচিত নয় (আরও একবার, গুগলের কোডিং গাইডলাইনসটি দেখুন; এছাড়াও, সি ++ এর স্রষ্টা বর্জন স্ট্রস্ট্রপ) , প্রকাশ্যে বলেছে, "সি ++ এর মধ্যেই অনেক ছোট এবং পরিষ্কার ভাষা বেরিয়ে আসার জন্য সংগ্রাম করা হচ্ছে")।
সুতরাং আমি মনে করি যে সি ++ বৈশিষ্ট্যগুলি অপব্যবহার করা খুব সহজ হতে পারে এমন ধারণার কিছু যোগ্যতা রয়েছে, বিশেষত আপনি যদি জাভা ব্যাকগ্রাউন্ড থেকে এসেছেন। তদুপরি, নিজেকে ভাষার কিছু উপসরে সীমাবদ্ধ করে এই সমস্যাগুলি দূর করার ধারণার যোগ্যতা রয়েছে।
তবে, ভিন্ন ভাষার ভিত্তিতে কোন সাবসেটটি ব্যবহার করবেন তা সিদ্ধান্ত নেওয়া সঠিক পদ্ধতির মতো বলে মনে হচ্ছে না , যদি না "ভিন্ন ভাষা" সি না হয়, যেহেতু সত্যই সি ++ ভাষার একটি সি-জাতীয় উপসেট রয়েছে। (লিনাস তার উপরের কৌতুকগুলিতে এটি উল্লেখ করে এবং স্কট মায়ার্স এমনকি এই উপসেটটিকে "উপ-ভাষা" হিসাবে উল্লেখ করেছেন) জাভার রান-টাইম দৃষ্টান্ত (আবর্জনা-সংগ্রহ, ভিএম-তে চালানো) সি ++ এর থেকে মৌলিকভাবে আলাদা is এটি থেকে সি ++ ব্যবহার সম্পর্কে আঁকতে কোনও দরকারী পাঠ রয়েছে তা পরিষ্কার নয় এবং উপরে উল্লিখিত হিসাবে, সরাসরি জাভা থেকে সি ++ সম্পর্কে পাঠগুলি আঁকার চেষ্টা করা খুব অ-পরিচয়মূলক কোডের দিকে নিয়ে যেতে পারে।
পরিবর্তে, ভাষাটি কীভাবে আইডেমিক্যালি ব্যবহার করা যায় তা বোঝার জন্য ভাষার আপনার "গ্রহণযোগ্য উপসেট" সংজ্ঞায়িত করার চেষ্টা করুন। আপনি যদি মোটামুটি বিধিনিষেধযুক্ত সাবসেট চান যা এখনও সি +++ এর অনেকগুলি বৈশিষ্ট্যের সুবিধা গ্রহণ করে তবে সি উপস্থাপিত, উল্লিখিত গুগল কোডিং গাইডলাইনটি শুরু করার জন্য ভাল জায়গা হতে পারে। অবশ্যই, আপনি এমন বিকাশকারী পাবেন যারা বলে যে গুগলের কিছু বিধিনিষেধের জন্য "কোনও যৌক্তিক যুক্তি" নেই , তবে আপনি যদি না আলেকজান্ড্রেসকুকে ডি ভাষার উপর তাঁর কাজ থেকে দূরে সরিয়ে রাখেন (যা আপনাকে নিজেই কিছু বলবে), তবে এটি সম্ভবত ঠিক আছে। এটি সি ++ কে জাভাতে পরিণত করার চেষ্টা করার চেয়ে অবশ্যই ভাল।
কোড নির্দেশিকাগুলির সেটগুলির জন্য আরেকটি ভাল সূচনা-পয়েন্ট হ'ল নতুন সি ++ কোর গাইডলাইনস , এটি বজরেন স্ট্রস্ট্রপ এবং হার্ব সটারের একটি কার্য-অগ্রগতি।
সি ++ এর ত্রুটিগুলি মোকাবেলার একমাত্র অন্য উপায় হ'ল ভিন্ন ভাষা বাছাই। দেখে মনে হচ্ছে আপনি জাভা পছন্দ করেন এবং আপনি মনে করেন যে এই প্রকল্পটি জাভাতে রূপান্তরিত হতে পারে chance অন্য উত্তরে উল্লিখিত হিসাবে, আপনি কেবল ... জাভা দিয়ে শুরু করতে পারেন।
জাভা ব্যতীত অন্য কিছু ব্যবহার করার জন্য আপনার সত্যিকারের প্রয়োজনের দুটি কারণ রয়েছে :
- আপনার সত্যিই রান-টাইম পারফরম্যান্স দরকার need এই ক্ষেত্রে, জাভা এর মতো সি ++ এর চিকিত্সা করা সম্ভবত আপনাকে আসলে সহায়তা করবে না, কারণ জাভা-জাতীয় কৌশলগুলি যেমন ভাগ করা-পয়েন্টারগুলি আপনার রান-টাইম পারফরম্যান্সকে হ্রাস করে।
- একটি অস্পষ্ট প্ল্যাটফর্মে কাজ করার জন্য আপনার সফ্টওয়্যারটি দরকার যা এখনও জেভিএম সমর্থন করে না। এই ক্ষেত্রে, আপনি সম্ভবত এমন ভাষাগুলিতে আটকে আছেন যেগুলিতে জিসিসি বা কলংয়ের সম্মুখভাগ রয়েছে। সি এবং সি ++ হ'ল সুস্পষ্ট প্রার্থী তবে আপনি মরিচা জাতীয় কিছুও দেখতে পারেন। (দ্রুত প্লাগ: আমি মরিচটি ব্যাপকভাবে ব্যবহার করি নি, তবে এটি দুর্দান্ত লাগছে এবং আমি যত তাড়াতাড়ি সম্ভব একটি বড় মরিচা প্রকল্পে কাজ করতে আগ্রহী এবং আমি মনে করি যে সি ++ প্রকল্প শুরু করার বিষয়ে বিবেচনা করা প্রত্যেকেরই মরচে বিকল্প হিসাবে বিবেচনা করা উচিত।)
প্রতিটি সি ++ ভাষার নির্দিষ্ট বৈশিষ্ট্য (যেমন: একাধিক উত্তরাধিকার) এর জাভাতে প্রয়োগ করার বিকল্প থাকতে হবে। যদি এটি না হয়, তার অর্থ ডিজাইন প্যাটার্ন বা কোড আর্কিটেকচার সমস্যাযুক্ত।
আমি ইতিমধ্যে এটি কিছুটা সম্বোধন করেছি, তবে আমি আপনার দ্বিতীয় বাক্যটি ইচ্ছাকৃতভাবে রেখে দিয়েছি।
আমি নিশ্চিত নই যে constexpr
জাভার মতো আংশিক-জেআইটি ভাষায় কোনও ধারণা বোধ করবে না এমন কিছু , যা অবৈধ আর্কিটেকচারের ইঙ্গিত। আমি এই ধারণায় আরও উন্মুক্ত যে টেমপ্লেট মেটা-প্রোগ্রামিংয়ের অত্যধিক ব্যবহারের পক্ষে এটি তার মূল্য অপেক্ষা আরও বেশি সমস্যা হতে পারে, বিশেষত এখন যেটি constexpr
কম্পাইল-টাইম ফাংশন মূল্যায়ন করার জন্য উপস্থিত রয়েছে, তবে এটি স্পষ্টভাবে প্রমাণ করে constexpr
যে আপনি যদি ডিজাইনের ত্রুটি না করেন তবে এটি ব্যবহার করছেন: আপনি কেবল নিশ্চিত করছেন যে কোড চালানোর আগে কিছু গণনা ঘটে যা একটি দুর্দান্ত পারফরম্যান্স উত্সাহ (উদাহরণস্বরূপ, বেনমার্ক গেমের এন-বডি সমস্যাটির জন্য এই এন্ট্রিটি দেখুন , যা অন্য একটি প্রবেশ ব্যতীত অন্য প্রতিটি প্রবেশকে ছাপিয়ে যায়) সি ++ এ লিখিত,