Comparison of Java and C++
جاوا اور سی + + دو نمایاں آبجیکٹ پر مبنی پروگرامنگ زبانیں ہیں۔ زبان کی مقبولیت کے بہت سے میٹرکس کے مطابق، دونوں زبانوں نے 21 ویں صدی کے بیشتر حصے میں آبجیکٹ پر مبنی اور اعلی کارکردگی والے سافٹ ویئر کی ترقی پر غلبہ حاصل کیا ہے، اور اکثر ان کا براہ راست موازنہ اور تضاد کیا جاتا ہے۔ جاوا کا نحو C/C + + پر مبنی تھا۔ ڈیزائن کے مقاصد پروگرامنگ زبانوں C + + اور جاوا کے درمیان فرق کا سراغ ان کے ورثے سے لگایا جا سکتا ہے، کیونکہ ان کے ڈیزائن کے مقاصد مختلف ہیں۔ سی + + کو سسٹمز اور ایپلی کیشنز پروگرامنگ کے لیے ڈیزائن کیا گیا تھا (یعنی۔ انفراسٹرکچر پروگرامنگ)، طریقہ کار کی پروگرامنگ زبان سی کو بڑھانا، جسے موثر کارکردگی کے لیے ڈیزائن کیا گیا تھا۔ سی کے لیے، سی + + نے آبجیکٹ پر مبنی پروگرامنگ، مستثنی ہینڈلنگ، لائف ٹائم پر مبنی ریسورس مینجمنٹ (آر اے آئی آئی)، عام پروگرامنگ، ٹیمپلیٹ میٹا پروگرامنگ، اور سی + + معیاری لائبریری کے لیے سپورٹ شامل کی جس میں عام کنٹینرز اور الگورتھم (معیاری ٹیمپلیٹ لائبریری یا ایس ٹی ایل)، اور بہت سی دیگر عمومی مقاصد کی سہولیات شامل ہیں۔ جاوا ایک عام مقصد، ہم آہنگی، کلاس پر مبنی، آبجیکٹ پر مبنی پروگرامنگ زبان ہے جو نفاذ کے انحصار کو کم کرنے کے لیے ڈیزائن کی گئی ہے۔ یہ محفوظ اور انتہائی پورٹیبل ہونے کے لیے جاوا ورچوئل مشین پر انحصار کرتا ہے۔ یہ ایک وسیع لائبریری کے ساتھ بنڈل ہے جسے بنیادی پلیٹ فارم کی تجریدی فراہم کرنے کے لیے ڈیزائن کیا گیا ہے۔ جاوا ایک مستحکم ٹائپ شدہ آبجیکٹ پر مبنی زبان ہے جو C + + کی طرح (لیکن اس سے مطابقت نہیں رکھتی) نحو کا استعمال کرتی ہے۔ اس میں جاواڈوک نامی ایک دستاویزات کا نظام شامل ہے۔ C + + اور جاوا کی ترقی میں مختلف اہداف کے نتیجے میں زبانوں کے درمیان مختلف اصول اور ڈیزائن ٹریڈ آف ہوئے۔ اختلافات مندرجہ ذیل ہیں: زبان کی خصوصیات نحو جاوا نحو میں ایک سیاق و سباق سے پاک گرائمر ہے جسے ایک سادہ ایل اے ایل آر تجزیہ کار کے ذریعے تجزیہ کیا جا سکتا ہے۔ C + + کو پارس کرنا زیادہ پیچیدہ ہے۔ مثال کے طور پر، فو <1> (3) ؛ موازنہ کا ایک سلسلہ ہے اگر فو متغیر ہے، لیکن اگر فو کلاس ٹیمپلیٹ کا نام ہے تو ایک آبجیکٹ بناتا ہے۔ C + + نیم اسپیس سطح کے مستقل، متغیرات اور افعال کی اجازت دیتا ہے۔ جاوا میں، اس طرح کے اداروں کا تعلق کسی دی گئی قسم سے ہونا چاہیے، اور اس لیے ٹائپ کی تعریف کے اندر اس کی وضاحت کی جانی چاہیے، یا تو کلاس یا انٹرفیس۔ C + + میں، اشیاء اقدار ہیں، جبکہ جاوا میں وہ نہیں ہیں۔ سی + + ڈیفالٹ طور پر ویلیو سیمنٹکس کا استعمال کرتا ہے، جبکہ جاوا ہمیشہ حوالہ سیمنٹکس کا استعمال کرتا ہے۔ C + + میں حوالہ سیمنٹکس کا انتخاب کرنے کے لیے، یا تو پوائنٹر یا حوالہ استعمال کیا جا سکتا ہے۔ C + + میں، کلائنٹ کوڈ کو اس میں ترمیم کرنے سے روکنے کے لیے کسی پوائنٹر یا کانسٹ آبجیکٹ کے حوالے کا اعلان کرنا ممکن ہے۔ افعال اور طریقے اس بات کی ضمانت بھی دے سکتے ہیں کہ وہ "کانسٹ" مطلوبہ الفاظ کا استعمال کرتے ہوئے پوائنٹر کے ذریعے اشارہ کردہ آبجیکٹ میں ترمیم نہیں کریں گے۔ یہ مستقل درستگی کو نافذ کرتا ہے۔ جاوا میں، حتمی مطلوبہ الفاظ C + + میں کانسٹ مطلوبہ الفاظ سے ملتے جلتے ہیں، لیکن اس کا استعمال زیادہ محدود ہے۔ زیادہ تر حصے کے لیے، مستقل درستگی کو کلاس کے انٹرفیس کے الفاظ پر انحصار کرنا چاہیے، یعنی، اسے سختی سے نافذ نہیں کیا جاتا ہے، سوائے عوامی ڈیٹا کے اراکین کے جن پر حتمی لیبل لگایا جاتا ہے۔ سی + + گوٹو بیانات کی حمایت کرتا ہے، جو اسپگیٹی کوڈ پروگرامنگ کا باعث بن سکتا ہے۔ گوٹو بیان کے استثناء کے ساتھ (جو حقیقی کوڈ میں بہت کم ہی دیکھا جاتا ہے اور انتہائی حوصلہ شکنی کی جاتی ہے)، جاوا اور C + + دونوں میں بنیادی طور پر ایک ہی کنٹرول فلو ڈھانچے ہوتے ہیں، جو منظم کنٹرول فلو کو نافذ کرنے کے لیے بنائے گئے ہیں، اور کچھ گوٹو جیسے افعال فراہم کرنے کے لیے بریک اور جاری بیانات پر انحصار کرتے ہیں۔ کچھ تبصرہ نگار اس بات کی نشاندہی کرتے ہیں کہ یہ لیبلڈ فلو کنٹرول بیانات اسٹرکچرڈ پروگرامنگ کے سنگل پوائنٹ آف ایگزٹ پراپرٹی کو توڑ دیتے ہیں۔ سی + + نچلی سطح کی خصوصیات فراہم کرتا ہے جن کا جاوا میں زیادہ تر فقدان ہے (ایک قابل ذکر رعایت براہ راست میموری تک رسائی اور ہیرا پھیری کے لیے sun.misc.Unsafe API ہے)۔ سی + + میں، پوائنٹرز کو مخصوص میموری کے مقامات کو جوڑنے کے لیے استعمال کیا جا سکتا ہے، یہ کام نچلے درجے کے آپریٹنگ سسٹم کے اجزاء کو لکھنے کے لیے ضروری ہے۔ اسی طرح، بہت سے C + + مرتب ایک ان لائن اسمبلر کی حمایت کرتے ہیں۔ اسمبلی زبان کا کوڈ سی پروگرام میں درآمد کیا جا سکتا ہے اور اس کے برعکس۔ اس سے سی زبان اور بھی تیز ہو جاتی ہے۔ جاوا میں، اس طرح کے کوڈ کو بیرونی لائبریریوں میں ہونا چاہیے، اور صرف جاوا مقامی انٹرفیس کے ذریعے رسائی حاصل کی جا سکتی ہے، جس میں ہر کال کے لیے ایک اہم اوور ہیڈ ہوتا ہے۔ سیمنٹکس سی + + فنکشن/طریقہ کار کے دلائل کے لیے ڈیفالٹ اقدار کی اجازت دیتا ہے۔ جاوا نہیں ہے۔ تاہم، طریقہ اوور لوڈنگ کو جاوا میں اسی طرح کے نتائج حاصل کرنے کے لیے استعمال کیا جا سکتا ہے لیکن بے کار اسٹب کوڈ تیار کیا جا سکتا ہے۔ C + + کے لیے مرتب کرنے کے لیے درکار کم از کم کوڈ ایک فنکشن ہے، کیونکہ جاوا ایک کلاس ہے۔ C + + مقامی اقسام کے درمیان مضمر تبادلوں کی ایک رینج کی اجازت دیتا ہے (بشمول کچھ تنگ تر تبادلوں)، اور صارف سے متعین اقسام پر مشتمل مضمر تبادلوں کی وضاحت کرنے کی بھی اجازت دیتا ہے۔ جاوا میں، مقامی اقسام کے درمیان صرف وسیع تر تبادلے مضمر ہیں ؛ دیگر تبادلوں کے لیے واضح کاسٹ نحو کی ضرورت ہوتی ہے۔ اس کا نتیجہ یہ ہے کہ اگرچہ جاوا اور C + + میں لوپ کے حالات (اگر، جبکہ اور باہر نکلنے کی حالت) دونوں ایک بولین اظہار کی توقع کرتے ہیں، کوڈ جیسے کہ اگر (a = 5) جاوا میں مرتب کرنے میں غلطی کا سبب بنے گا کیونکہ انٹ سے بولین میں کوئی مضمر تنگ تبدیلی نہیں ہے، لیکن C + + میں مرتب ہوگا۔ یہ آسان ہے اگر کوڈ ٹائپ تھا اور اگر (a = = 5) کا ارادہ کیا گیا تھا۔ تاہم، موجودہ C + + مرتب عام طور پر ایک انتباہ پیدا کریں گے جب اس طرح کی تفویض ایک مشروط اظہار کے اندر انجام دی جاتی ہے۔ اسی طرح، اسٹینڈ لون موازنہ بیانات، جیسے۔ a = = 5 ؛، بغیر کسی ضمنی اثر کے عام طور پر انتباہ کا باعث بنتا ہے۔ افعال کو پیرامیٹرز منتقل کرنے کے لیے، C + + پاس بائی ریفرنس اور پاس بائی ویلیو دونوں کی حمایت کرتا ہے۔ جاوا میں، ابتدائی پیرامیٹرز کو ہمیشہ ویلیو سے پاس کیا جاتا ہے۔ کلاس کی اقسام، انٹرفیس کی اقسام، اور صف کی اقسام کو اجتماعی طور پر جاوا میں حوالہ جات کی اقسام کہا جاتا ہے اور ہمیشہ قدر کے لحاظ سے بھی منظور کیا جاتا ہے۔ جاوا بلٹ ان اقسام ایک مخصوص سائز اور رینج کی ہوتی ہیں جن کی وضاحت زبان کی تفصیلات سے ہوتی ہے۔ C + + میں، بلٹ ان اقسام کے لیے اقدار کی ایک کم سے کم رینج کی وضاحت کی گئی ہے، لیکن عین مطابق نمائندگی (بٹس کی تعداد) کو کسی دیئے گئے پلیٹ فارم پر جو بھی مقامی اقسام کو ترجیح دی جاتی ہے اس سے نقشہ بنایا جا سکتا ہے۔ مثال کے طور پر، جاوا حروف 16 بٹ یونیکوڈ حروف ہوتے ہیں، اور تار اس طرح کے حروف کی ترتیب پر مشتمل ہوتے ہیں۔ سی + + تنگ اور وسیع دونوں حروف پیش کرتا ہے، لیکن ہر ایک کا اصل سائز پلیٹ فارم پر منحصر ہے، جیسا کہ استعمال شدہ کردار سیٹ ہے۔ تار کسی بھی قسم سے بنائے جا سکتے ہیں۔ اس کا مطلب یہ بھی ہے کہ سی + + مرتب خود بخود ہدف پلیٹ فارم کے لیے سب سے موثر نمائندگی کا انتخاب کر سکتے ہیں (یعنی 64 بٹ پلیٹ فارم کے لیے 64 بٹ انٹیجر)، جبکہ نمائندگی جاوا میں طے شدہ ہے، جس کا مطلب ہے کہ اقدار کو یا تو کم موثر سائز میں محفوظ کیا جا سکتا ہے، یا باقی بٹس کو پیڈ کرنا چاہیے اور کم چوڑائی کے رویے کی تقلید کے لیے کوڈ شامل کرنا چاہیے۔ سی + + میں فلوٹنگ پوائنٹ ویلیوز اور آپریشنز کی گول اور درستگی نفاذ سے متعین ہے (حالانکہ صرف بہت ہی غیر ملکی یا پرانے پلیٹ فارم آئی ای ای ای 754 معیار سے الگ ہوتے ہیں)۔ جاوا ایک اختیاری سخت فلوٹنگ پوائنٹ ماڈل (سخت ایف پی) فراہم کرتا ہے جو پلیٹ فارمز میں زیادہ مستقل نتائج کی ضمانت دیتا ہے، حالانکہ ممکنہ طور پر سست رن ٹائم کارکردگی کی قیمت پر۔ تاہم، جاوا IEEE 754 معیار کی سختی سے تعمیل نہیں کرتا ہے۔ زیادہ تر C + + مرتب، پہلے سے طے شدہ طور پر، جزوی طور پر IEEE 754 کی تعمیل کریں گے (عام طور پر سخت راؤنڈنگ قوانین کو چھوڑ کر اور NaN نتائج پر مستثنیات اٹھائیں)، لیکن کچھ اصلاح کی اجازت دینے کے لیے مختلف سختی کے تعمیل کے اختیارات فراہم کرتے ہیں۔ اگر ہم ان اختیارات کو کم سے کم تعمیل سے لے کر زیادہ تر تعمیل تک تیز، مستقل (جاوا کا سخت ایف پی)، قریب-آئی ای ای ای، اور سخت-آئی ای ای ای کے طور پر لیبل کرتے ہیں، تو ہم یہ کہہ سکتے ہیں کہ زیادہ تر سی + + نفاذ ڈیفالٹ قریب-آئی ای ای ای میں ہوتے ہیں، جن میں تیز یا سخت-آئی ای ای ای میں تبدیل ہونے کے اختیارات ہوتے ہیں، جبکہ جاوا ڈیفالٹ فاسٹ میں مستقل طور پر تبدیل ہونے کے آپشن کے ساتھ ہوتا ہے۔ سی + + میں، پوائنٹرز کو براہ راست میموری ایڈریس ویلیوز کے طور پر ہیرا پھیری کی جا سکتی ہے۔ جاوا حوالہ جات اشیاء کی طرف اشارہ کرتے ہیں۔ جاوا حوالہ جات میموری پتے تک براہ راست رسائی کی اجازت نہیں دیتے ہیں یا میموری پتے کو پوائنٹر ریاضی کے ساتھ جوڑ توڑ کرنے کی اجازت نہیں دیتے ہیں۔ سی + + میں کوئی بھی پوائنٹرز کے لیے پوائنٹرز، انٹس اور ڈبلز کے لیے پوائنٹرز، اور صوابدیدی میموری مقامات کے لیے پوائنٹرز بنا سکتا ہے۔ جاوا حوالہ جات صرف اشیاء تک رسائی حاصل کرتے ہیں، کبھی بھی ابتدائی، دوسرے حوالہ جات، یا صوابدیدی میموری مقامات نہیں۔ جاوا میں، میموری کو sun.misc.Unsafe API کا استعمال کرتے ہوئے من مانی اقدار کے ذریعے پڑھا اور لکھا جا سکتا ہے، تاہم یہ فرسودہ ہے اور اس کی سفارش نہیں کی جاتی ہے۔ سی + + میں، اشارے افعال یا ممبر افعال (فنکشن اشارے) کی طرف اشارہ کر سکتے ہیں۔ جاوا میں مساوی میکانزم آبجیکٹ یا انٹرفیس حوالہ جات کا استعمال کرتا ہے۔ اسٹیک سے مختص اشیاء کے ذریعے، C + + اسکوپڈ ریسورس مینجمنٹ کی حمایت کرتا ہے، ایک ایسی تکنیک جو خود بخود میموری اور نظام کے دیگر وسائل کو منظم کرنے کے لیے استعمال ہوتی ہے جو تعیناتی آبجیکٹ کی تباہی کی حمایت کرتی ہے۔ اگرچہ C + + میں اسکوپڈ ریسورس مینجمنٹ کی ضمانت نہیں دی جا سکتی (یہاں تک کہ مناسب تباہ کن اشیاء کو نئے اور غیر حذف شدہ چیزوں کا استعمال کرتے ہوئے مختص کیا جا سکتا ہے) یہ ریسورس مینجمنٹ کا ایک موثر ذریعہ فراہم کرتا ہے۔ مشترکہ وسائل کو شیئرڈ _ پی ٹی آر کا استعمال کرتے ہوئے منظم کیا جا سکتا ہے، ساتھ ہی چکور حوالہ جات کو توڑنے کے لیے کمزور _ پی ٹی آر کا استعمال کیا جا سکتا ہے۔ جاوا کچرا اکٹھا کرنے کا استعمال کرتے ہوئے خودکار میموری مینجمنٹ کی حمایت کرتا ہے جو چکور حوالہ جات کی موجودگی میں بھی ناقابل رسائی اشیاء کو آزاد کر سکتا ہے، لیکن سسٹم کے دیگر وسائل (فائلیں، اسٹریمز، ونڈوز، مواصلاتی بندرگاہیں، دھاگے وغیرہ)۔ اسے واضح طور پر جاری کیا جانا چاہیے کیونکہ آخری آبجیکٹ ریفرنس کو ترک کرنے کے فورا بعد کچرا اکٹھا کرنے کی ضمانت نہیں ہے۔ سی + + میں صارف سے متعین آپریٹر اوور لوڈنگ کی خصوصیات ہیں۔ آپریٹر اوور لوڈنگ آپریٹرز (ریاضی، موازنہ، وغیرہ) کی حمایت کرنے کے لیے صارف سے متعین اقسام کی اجازت دیتا ہے۔ ان آپریٹرز کے لیے صارف کے طے شدہ نفاذ کے ذریعے ابتدائی اقسام کی طرح۔ عام طور پر آپریٹرز کے الفاظ کو محفوظ رکھنے کی سفارش کی جاتی ہے۔ جاوا آپریٹر اوور لوڈنگ کی کسی بھی شکل کی حمایت نہیں کرتا ہے (حالانکہ اس کی لائبریری سٹرنگ کنکیٹیشن کے لیے ایڈیشن آپریٹر کا استعمال کرتی ہے)۔ جاوا میں صوابدیدی نئے کوڈ کی عکاسی اور متحرک لوڈنگ کے لیے معیاری ایپلیکیشن پروگرامنگ انٹرفیس (اے پی آئی) سپورٹ کی خصوصیات ہیں۔ C + + بائنری کے جامد اور متحرک لنکنگ کی حمایت کرتا ہے۔ جاوا میں جنیرکس ہیں، جن کا بنیادی مقصد ٹائپ سیف کنٹینرز فراہم کرنا ہے۔ سی + + میں کمپائل ٹائم ٹیمپلیٹس ہیں، جو عام پروگرامنگ اور میٹاپروگرامنگ کے لیے زیادہ وسیع تعاون فراہم کرتے ہیں۔ جاوا میں اینوٹیشنز ہیں، جو کلاسوں میں من مانی کسٹم میٹا ڈیٹا کو شامل کرنے اور اینوٹیشن پروسیسنگ ٹول کے ذریعے میٹا پروگرامنگ کی اجازت دیتی ہیں۔ جاوا اور سی + + دونوں مقامی اقسام (جسے بنیادی یا بلٹ ان اقسام بھی کہا جاتا ہے) اور صارف سے متعین اقسام (جسے مرکب اقسام بھی کہا جاتا ہے) کے درمیان فرق کرتے ہیں۔ جاوا میں، مقامی اقسام کی قدر صرف سیمنٹکس ہوتی ہے، اور مرکب اقسام میں صرف حوالہ سیمنٹکس ہوتے ہیں۔ سی + + میں تمام اقسام کی قدر سیمنٹکس ہوتی ہے، لیکن کسی بھی قسم کے لیے ایک حوالہ بنایا جا سکتا ہے، جو حوالہ سیمنٹکس کے ذریعے آبجیکٹ کو جوڑ توڑ کرنے کی اجازت دے گا۔ C + + صوابدیدی کلاسوں کی متعدد وراثت کی حمایت کرتا ہے۔ جاوا میں ایک کلاس صرف ایک کلاس سے اخذ کی جا سکتی ہے، لیکن ایک کلاس متعدد انٹرفیس کو نافذ کر سکتی ہے (دوسرے لفظوں میں، یہ اقسام کی متعدد وراثت کی حمایت کرتی ہے، لیکن عمل درآمد کی صرف ایک وراثت)۔ جاوا واضح طور پر انٹرفیس اور کلاسوں کے درمیان فرق کرتا ہے۔ سی + + میں، متعدد وراثت اور خالص ورچوئل افعال کچھ چھوٹے فرقوں کے ساتھ ایسی کلاسوں کی وضاحت کرنا ممکن بناتے ہیں جو تقریبا جاوا انٹرفیس کی طرح کام کرتی ہیں۔ جاوا میں ملٹی تھریڈنگ کے لیے زبان اور معیاری لائبریری دونوں کی حمایت ہے۔ جاوا میں مطابقت پذیر مطلوبہ الفاظ ملٹی تھریڈ ایپلی کیشنز کو سپورٹ کرنے کے لیے میوٹیکس لاک فراہم کرتا ہے۔ جاوا مزید جدید ملٹی تھریڈنگ سنکرونائزنگ کے لیے لائبریریاں بھی فراہم کرتا ہے۔ سی + + 11 میں سی + + میں ملٹی تھریڈنگ کے لیے ایک متعین میموری ماڈل ہے، اور تھریڈز بنانے اور بہت سے مطابقت پذیر پرائمیٹوز کے لیے لائبریری سپورٹ ہے۔ اس کے لیے بہت سی تھرڈ پارٹی لائبریریاں بھی ہیں۔ سی + + ممبر فنکشنز کو ورچوئل فنکشنز کے طور پر قرار دیا جا سکتا ہے، جس کا مطلب ہے کہ کال کرنے کا طریقہ آبجیکٹ کے رن ٹائم ٹائپ سے طے ہوتا ہے۔ متحرک ترسیل)۔ پہلے سے طے شدہ طور پر، سی + + میں طریقے ورچوئل نہیں ہیں (یعنی آپٹ ان ورچوئل)۔ جاوا میں، طریقے پہلے سے طے شدہ طور پر ورچوئل ہوتے ہیں، لیکن حتمی مطلوبہ الفاظ (یعنی آپٹ آؤٹ ورچوئل) کا استعمال کرکے غیر ورچوئل بنائے جا سکتے ہیں۔ سی + + گنتی ابتدائی اقسام ہیں اور انٹیجر اقسام میں مضمر تبدیلی کی حمایت کرتی ہیں (لیکن انٹیجر اقسام سے نہیں)۔ جاوا گنتی عوامی جامد اینم (enumName1، enumName2) ہو سکتی ہے اور کلاسوں کی طرح استعمال ہوتی ہے۔ ایک اور طریقہ یہ ہے کہ ایک اور کلاس بنائی جائے جو java.lang.Enum <E> تک پھیلی ہو اور اس لیے کسی بھی دوسری کلاس کی طرح کنسٹرکٹرز، فیلڈز اور طریقوں کی وضاحت کر سکتی ہے۔ سی + + 11 کے طور پر، سی + + مضبوطی سے ٹائپ شدہ گنتی کی حمایت کرتا ہے جو اسٹوریج کی قسم کی زیادہ قسم کی حفاظت اور واضح تفصیلات فراہم کرتا ہے۔ یونری آپریٹرز '+ +' اور '--': C + + میں آپریڈ ایک قابل ترمیم قیمت ہوگی۔ [چھوڑا گیا] نتیجہ تازہ ترین آپریڈ ہے ؛ یہ ایک lvalue ہے۔ "، لیکن جاوا میں بائنری عددی پروموشن جس کا اوپر ذکر کیا گیا ہے اس میں ان باکسنگ کنورژن اور ویلیو سیٹ کنورژن شامل ہو سکتا ہے۔ اگر ضروری ہو تو، ویلیو سیٹ کنورژن {اور/یا [.] باکسنگ کنورژن} کو متغیر میں ذخیرہ کرنے سے پہلے رقم پر لاگو کیا جاتا ہے۔ "، یعنی۔ جاوا میں، ابتداء کے بعد "انٹیجر i = 2 ؛"، "+ + i ؛" نیا آبجیکٹ تفویض کرکے حوالہ i کو تبدیل کرتا ہے، جبکہ C + + میں آبجیکٹ اب بھی وہی ہے۔ ریسورس مینجمنٹ جاوا خودکار کچرا اکٹھا کرنے کی پیشکش کرتا ہے، جسے ریئل ٹائم جاوا تفصیلات کے ذریعے مخصوص حالات میں نظرانداز کیا جا سکتا ہے۔ سی + + میں میموری مینجمنٹ عام طور پر کنسٹرکٹرز، ڈسٹروکٹرز اور سمارٹ پوائنٹرز کے ذریعے کیا جاتا ہے۔ سی + + معیار کچرا اکٹھا کرنے کی اجازت دیتا ہے، لیکن اس کی ضرورت نہیں ہے۔ کچرا اکٹھا کرنا عملی طور پر شاذ و نادر ہی استعمال ہوتا ہے۔ C + + میموری کے صوابدیدی بلاکس مختص کر سکتا ہے۔ جاوا صرف آبجیکٹ انسٹنٹایشن کے ذریعے میموری مختص کرتا ہے۔ جاوا میں صوابدیدی میموری بلاکس کو بائٹس کی صف کے طور پر مختص کیا جا سکتا ہے۔ جاوا اور سی + + وسائل کے انتظام کے لیے مختلف فقرے استعمال کرتے ہیں۔ جاوا بنیادی طور پر کچرا اکٹھا کرنے پر انحصار کرتا ہے، جو میموری کو دوبارہ حاصل کر سکتا ہے، جبکہ سی + + بنیادی طور پر ریسورس ایکوزیشن از انیشیئلائزیشن (آر اے آئی آئی) کہاوت پر انحصار کرتا ہے۔ یہ دونوں زبانوں کے درمیان کئی اختلافات میں ظاہر ہوتا ہے: C + + میں مرکب اقسام کی اشیاء کو مقامی اسٹیک باؤنڈ متغیرات کے طور پر مختص کرنا عام ہے جو دائرہ کار سے باہر جانے پر تباہ ہو جاتے ہیں۔ جاوا میں مرکب کی اقسام ہمیشہ ڈھیر پر مختص کی جاتی ہیں اور کچرا جمع کرنے والے کے ذریعہ جمع کی جاتی ہیں (سوائے ورچوئل مشینوں کے جو ڈھیر مختص کو اسٹیک مختص میں تبدیل کرنے کے لیے فرار تجزیہ کا استعمال کرتی ہیں)۔ سی + + میں تباہ کن ہیں، جبکہ جاوا میں فائنلائزر ہیں۔ دونوں کو کسی شے کی ڈی لوکیشن سے پہلے طلب کیا جاتا ہے، لیکن وہ نمایاں طور پر مختلف ہوتے ہیں۔ ایک سی + + آبجیکٹ کے تباہ کن کو مضمر طور پر (اسٹیک باؤنڈ متغیرات کی صورت میں) یا کسی آبجیکٹ کو ڈی لوکیٹ کرنے کے لیے واضح طور پر استعمال کیا جانا چاہیے۔ تباہ کن کسی پروگرام میں اس نقطہ سے بالکل پہلے مطابقت پذیری طور پر انجام دیتا ہے جس پر کسی شے کو ڈی لوکیٹ کیا جاتا ہے۔ مطابقت پذیری، مربوط غیر ابتدائی اور C + + میں ڈی لوکیٹنگ اس طرح آر اے آئی آئی فقرے کو مطمئن کرتی ہے۔ C + + میں تباہ کن کسی شے سے وابستہ وسائل کو واپس حاصل کرنے کا عام طریقہ ہے، اور یہ کنسٹرکٹرز کا ایک مطلوبہ ہم منصب ہے۔ جاوا میں، آبجیکٹ ڈیلاکیشن کو مضمر طور پر کچرا جمع کرنے والا سنبھالتا ہے۔ جاوا آبجیکٹ کے فائنلائزر کو آخری بار رسائی حاصل کرنے کے کچھ وقت بعد اور اسے ڈی ایلکوٹیٹ کرنے سے پہلے غیر متزلزل طور پر طلب کیا جاتا ہے۔ بہت کم اشیاء کو حتمی شکل دینے کی ضرورت ہوتی ہے۔ ایک حتمی شکل دینے والے کی ضرورت صرف ان اشیاء کے لیے ہوتی ہے جو مختص کرنے سے پہلے آبجیکٹ کی حالت کی کچھ صفائی کی ضمانت دیتی ہیں، عام طور پر جے وی ایم کے لیے بیرونی وسائل کو جاری کرتی ہیں۔ فائنلائزر کے براہ راست استعمال کو عام طور پر مشورہ نہیں دیا جاتا ہے، کیونکہ وہ غیر متوقع ہوتے ہیں، عام طور پر خطرناک ہوتے ہیں، اور زیادہ تر وقت غیر ضروری ہوتے ہیں۔ کسی کو محتاط رہنا ہوگا کہ حتمی شکل دینے والوں کو C + + تباہ کن کے طور پر نہ سوچیں۔ بلکہ، ٹرائی-ود-ریسورسز یا ٹرائی-فائنل بلاک تباہ کن سے زیادہ ملتے جلتے مقصد کو حاصل کرتا ہے۔ فائنلائزرز یا کلینرز کے ساتھ ایک مسئلہ یہ ہے کہ اس بات کی ضمانت نہیں ہے کہ وہ فوری طور پر چلیں گے۔ لہذا، حتمی شکل دینے والے کا استعمال کبھی بھی ان کاموں کے لیے نہیں کیا جانا چاہیے جو وقت کے لحاظ سے اہم ہوں۔ مزید برآں، حتمی شکل دینے والے سخت کارکردگی کے جرمانے کے ساتھ آتے ہیں اور اشیاء کو الگ کرنے میں لگنے والے وقت میں نمایاں اضافہ کرتے ہیں، لہذا جاوا 9 میں ان کے استعمال کی حوصلہ شکنی کی جاتی ہے اور اس کی تعریف نہیں کی جاتی ہے۔ سی + + میں آر اے آئی آئی کے ساتھ، ایک قسم کے وسائل کو عام طور پر ایک چھوٹی سی کلاس کے اندر لپیٹا جاتا ہے جو تعمیر کے بعد وسائل کو مختص کرتا ہے اور تباہی کے بعد وسائل کو جاری کرتا ہے، اور ان نکات کے درمیان وسائل تک رسائی فراہم کرتا ہے۔ کوئی بھی کلاس جس میں صرف اس طرح کے آر اے آئی آئی آبجیکٹ ہوتے ہیں انہیں تباہ کن کی وضاحت کرنے کی ضرورت نہیں ہے کیونکہ آر اے آئی آئی آبجیکٹ کے تباہ کنوں کو خود بخود کال کیا جاتا ہے کیونکہ اس کلاس کا آبجیکٹ تباہ ہو جاتا ہے۔ جاوا میں، ٹرائی/کیچ/فائنل کنسٹرکٹ کا استعمال کرتے ہوئے وسائل کی محفوظ سنکرونس ڈیلاکیشن کو تعیناتی طور پر انجام دیا جا سکتا ہے۔ متبادل طور پر، ٹرائی-ود-ریسورسز کنسٹرکٹ، جسے جاوا 7 میں متعارف کرایا گیا تھا، کو ٹرائی-فائنلی کنسٹرکٹ کو ترجیح دینے کے لیے استعمال کیا جانا چاہیے۔ وسائل کے ساتھ کوشش کی تعمیر زیادہ جامع اور پڑھنے کے قابل ہے۔ یہ زیادہ مددگار تشخیصی معلومات بھی فراہم کرتا ہے، کیونکہ دبے ہوئے استثناء کو ضائع نہیں کیا جاتا ہے، اور اسٹیک ٹریس میں یہ معلومات کے ساتھ پرنٹ کیا جائے گا کہ انہیں دبا دیا گیا تھا۔ سی + + میں، ڈنگلنگ پوائنٹر ہونا ممکن ہے، جو کسی ایسی چیز کا باسی حوالہ ہے جسے پہلے ہی ڈی ایلکولیٹ کر دیا گیا ہے۔ ڈنگلنگ پوائنٹر استعمال کرنے کی کوشش عام طور پر پروگرام کی ناکامی کا باعث بنتی ہے۔ جاوا میں، کچرا جمع کرنے والا کسی حوالہ شدہ شے کو تباہ نہیں کرے گا۔ C + + میں، غیر ابتدائی قدیم اشیاء کا ہونا ممکن ہے۔ جاوا ڈیفالٹ شروعات کو نافذ کرتا ہے۔ C + + میں، یہ ممکن ہے کہ ایک مختص شدہ آبجیکٹ ہو جس کا کوئی درست حوالہ نہ ہو۔ اس طرح کی ناقابل رسائی شے کو تباہ نہیں کیا جا سکتا (ڈی ایلکوٹیڈ)، اور اس کے نتیجے میں میموری لیک ہوتی ہے۔ اس کے برعکس، جاوا میں کسی شے کو کچرا جمع کرنے والے کے ذریعے اس وقت تک حذف نہیں کیا جائے گا جب تک کہ وہ ناقابل رسائی نہ ہو جائے (صارف پروگرام کے ذریعے)۔ (کمزور حوالہ جات کی حمایت کی جاتی ہے، جو جاوا کچرا جمع کرنے والے کے ساتھ کام کرتے ہیں تاکہ رسائی کی مختلف طاقتوں کی اجازت دی جا سکے۔) جاوا میں کچرا جمع کرنا بہت سے میموری رساو کو روکتا ہے، لیکن کچھ حالات میں رساو اب بھی ممکن ہے۔ خودکار کچرا جمع کرنے والا یہ غلط تاثر دے سکتا ہے کہ جاوا میں میموری مینجمنٹ کے بارے میں سوچنے کی ضرورت نہیں ہے۔ تاہم یہ بات بالکل درست نہیں ہے۔ نرمی سے بات کرتے ہوئے، اس کی وجہ یہ ہے کہ کسی پروگرام میں "میموری لیک" ہو سکتا ہے، جسے باضابطہ طور پر "غیر ارادی آبجیکٹ ریٹینشن" کے نام سے جانا جاتا ہے۔ میموری لیک کی ایک مثال جو ہو سکتی ہے وہ ایک ایسے پروگرام کے لیے ہے جو بغیر کسی منطقی غلطیوں کے لکھا گیا ہو، سوائے اس کے کہ اس نے متروک حوالہ جات کو ختم نہیں کیا۔ اس کے نتیجے میں کچرا جمع کرنے کی سرگرمی کا زیادہ استعمال، زیادہ میموری فوٹ پرنٹ ہوتا ہے۔ انتہائی حالات میں، یہ مسئلہ آؤٹ آف میموری ایرر کا باعث بن سکتا ہے، لیکن ایسا شاذ و نادر ہی ہوتا ہے۔ اس کا حل آبجیکٹ حوالہ جات کو کالعدم کرنا ہے۔ میموری لیک ہونے کی دوسری عام وجہ کیش کا استعمال ہے جو اب متعلقہ نہیں رہا ہے۔ پرانے کیش کے استعمال کی وجہ سے میموری لیک ہونے کا حل کمزور کیش میپ کا استعمال کرتے ہوئے کیش کی نمائندگی کرنا ہے۔ لائبریریاں C + + پلیٹ فارم مخصوص لائبریریوں میں عام طور پر دستیاب بہت سی خصوصیات تک کراس پلیٹ فارم تک رسائی فراہم کرتی ہیں۔ جاوا سے مقامی آپریٹنگ سسٹم اور ہارڈ ویئر افعال تک براہ راست رسائی کے لیے جاوا مقامی انٹرفیس کے استعمال کی ضرورت ہوتی ہے۔ رن ٹائم اس کی غیر محدود اظہار کی وجہ سے، نچلی سطح کی C + + زبان کی خصوصیات (مثال کے طور پر۔ غیر چیک شدہ صف تک رسائی، خام اشارے، ٹائپ پننگ) کو مرتب کرنے کے وقت یا رن ٹائم پر اوور ہیڈ کے بغیر قابل اعتماد طریقے سے چیک نہیں کیا جا سکتا۔ متعلقہ پروگرامنگ کی غلطیاں نچلی سطح کے بفر اوور فلوز اور سیگمنٹشن فالٹس کا باعث بن سکتی ہیں۔ اسٹینڈرڈ ٹیمپلیٹ لائبریری اس طرح کی غلطیوں سے بچنے میں مدد کے لیے اعلی سطح کے آر اے آئی آئی تجریدی (جیسے ویکٹر، فہرست اور نقشہ) فراہم کرتی ہے۔ جاوا میں، نچلی سطح کی غلطیاں یا تو نہیں ہو سکتیں یا جاوا ورچوئل مشین (جے وی ایم) کے ذریعے ان کا پتہ لگایا جاتا ہے اور ایک رعایت کی شکل میں ایپلی کیشن کو اطلاع دی جاتی ہے۔ جاوا زبان کو حدود سے باہر صف تک رسائی کے معاملے میں مخصوص رویے کی ضرورت ہوتی ہے، جس کے لیے عام طور پر صف تک رسائی کی حدود کی جانچ کی ضرورت ہوتی ہے۔ یہ عدم استحکام کے ممکنہ ذریعہ کو ختم کرتا ہے لیکن عام طور پر عمل درآمد کو سست کرنے کی قیمت پر۔ کچھ معاملات میں، خاص طور پر جاوا 7 کے بعد سے، مرتب کرنے والا تجزیہ باؤنڈ چیک کو غیر ضروری ثابت کر سکتا ہے اور اسے ختم کر سکتا ہے۔ مقامی صفوں کی حدود سے باہر رسائی کے لیے C + + کا کوئی مطلوبہ طرز عمل نہیں ہے، اس طرح مقامی صفوں کی جانچ کے لیے کسی حد کی ضرورت نہیں ہے۔ سی + + معیاری لائبریری کلیکشنز جیسے ایس ٹی ڈی:: ویکٹر، تاہم، اختیاری باؤنڈ چیکنگ پیش کرتے ہیں۔ خلاصہ یہ ہے کہ جاوا صف "عام طور پر محفوظ ؛ قدرے محدود ؛ اکثر اوور ہیڈ ہوتے ہیں" جبکہ C + + مقامی صفوں میں "اختیاری اوور ہیڈ ہوتے ہیں ؛ قدرے غیر محدود ہوتے ہیں ؛ ممکنہ طور پر غیر محفوظ ہوتے ہیں"۔ ٹیمپلیٹس بمقابلہ جنیرکس C + + اور جاوا دونوں بالترتیب عام پروگرامنگ، ٹیمپلیٹس اور جنیرکس کے لیے سہولیات فراہم کرتے ہیں۔ اگرچہ وہ اسی طرح کے مسائل کو حل کرنے کے لیے بنائے گئے تھے، اور ان کی نحو ایک جیسی ہے، لیکن وہ بالکل مختلف ہیں۔ {| کلاس = "ویکیٹیبل"! سی + + ٹیمپلیٹس! جاوا جنیرکس |-| کلاسز، فنکشنز، عرفیت اور متغیرات کو ٹیمپلیٹ کیا جا سکتا ہے۔ کلاسوں اور طریقوں کو عام کیا جا سکتا ہے۔ |-| پیرامیٹرز متغیر، کسی بھی قسم کے، انٹیگرل ویلیو، کریکٹر لیٹرل، یا کلاس ٹیمپلیٹ ہو سکتے ہیں۔ | پیرامیٹرز کسی بھی حوالہ کی قسم کے ہو سکتے ہیں، بشمول باکسڈ ابتدائی اقسام (یعنی۔ عدد، بولین۔)۔ ۔۔۔۔۔۔۔۔۔۔۔۔۔۔۔۔۔۔۔۔۔۔۔۔۔۔۔۔۔۔۔۔۔۔۔۔۔۔۔۔۔۔۔ کلاس ٹیمپلیٹس کے لیے، صرف ممبر فنکشنز جو استعمال کیے جاتے ہیں انہیں فوری کیا جائے گا۔ | کلاس یا فنکشن کا ایک ورژن مرتب کیا گیا ہے، جو تمام قسم کے پیرامیٹرز کے لیے کام کرتا ہے (ٹائپ-ایرشر کے ذریعے)۔ |-| مختلف پیرامیٹرز کے ساتھ فوری طور پر کلاس ٹیمپلیٹ کے آبجیکٹ رن ٹائم پر مختلف قسم کے ہوں گے (یعنی، الگ ٹیمپلیٹ فوری طور پر الگ کلاس ہیں)۔ | ٹائپ پیرامیٹرز کو مرتب کرنے پر مٹا دیا جاتا ہے ؛ مختلف قسم کے پیرامیٹرز والی کلاس کے آبجیکٹ رن ٹائم پر ایک ہی قسم کے ہوتے ہیں۔ یہ ایک مختلف کنسٹرکٹر کا سبب بنتا ہے۔ اس قسم کے مٹانے کی وجہ سے، عام کلاس کے مختلف لمحات کا استعمال کرتے ہوئے طریقوں کو اوور لوڈ کرنا ممکن نہیں ہے۔ |-| کلاس یا فنکشن ٹیمپلیٹ کا نفاذ اسے استعمال کرنے کے لیے ترجمہ یونٹ کے اندر نظر آنا چاہیے۔ اس کا مطلب عام طور پر تعریفوں کو ہیڈر فائلوں میں یا ہیڈر فائل میں شامل کرنا ہے۔ سی + + 11 کے مطابق، کچھ تنصیبات کی تالیف کو الگ کرنے کے لیے بیرونی ٹیمپلیٹس کا استعمال ممکن ہے۔ مرتب کردہ کلاس فائل سے کلاس یا فنکشن کا دستخط اسے استعمال کرنے کے لیے کافی ہے۔ |-| ٹیمپلیٹس خصوصی ہو سکتے ہیں-کسی خاص ٹیمپلیٹ پیرامیٹر کے لیے ایک علیحدہ عمل درآمد فراہم کیا جا سکتا ہے۔ | جنیرکس خصوصی نہیں ہو سکتے۔ |-| ٹیمپلیٹ پیرامیٹرز میں ڈیفالٹ دلائل ہو سکتے ہیں۔ پری-سی + + 11، اس کی اجازت صرف ٹیمپلیٹ کلاسوں کے لیے تھی، فنکشنز کے لیے نہیں۔ | عام قسم کے پیرامیٹرز میں ڈیفالٹ دلائل نہیں ہو سکتے۔ |-| وائلڈ کارڈز غیر تعاون یافتہ۔ اس کے بجائے، واپسی کی اقسام اکثر نیسٹڈ ٹائپ ڈیف کے طور پر دستیاب ہوتی ہیں۔ (اس کے علاوہ، سی + + 11 میں کلیدی لفظ آٹو شامل کیا گیا، جو کسی بھی قسم کے لیے وائلڈ کارڈ کے طور پر کام کرتا ہے جس کا تعین مرتب کرنے کے وقت کیا جا سکتا ہے۔) وائلڈ کارڈز ٹائپ پیرامیٹر کے طور پر سپورٹ کیے گئے ہیں۔ |-| ٹائپ پیرامیٹرز کی باؤنڈنگ کے لیے کوئی براہ راست سپورٹ نہیں ہے، لیکن میٹا پروگرامنگ بالترتیب اوپری اور نچلی حدود کے لیے "ایکسٹینڈز" اور "سپر" کے ساتھ ٹائپ پیرامیٹرز کی باؤنڈنگ کو سپورٹ کرتی ہے۔ ٹائپ پیرامیٹرز کے درمیان تعلقات کے نفاذ کی اجازت دیتی ہے۔ |-| پیرامیٹر کی قسم کے ساتھ کسی شے کے فوری ہونے کی اجازت دیتا ہے۔ | پیرامیٹر کی قسم کے ساتھ کسی شے کے فوری ہونے کو پیش کرتا ہے (سوائے عکاسی کے)۔ |-| کلاس ٹیمپلیٹ کا ٹائپ پیرامیٹر جامد طریقوں اور متغیرات کے لیے استعمال کیا جا سکتا ہے۔ عام کلاس کا ٹائپ پیرامیٹر جامد طریقوں اور متغیرات کے لیے استعمال نہیں کیا جا سکتا۔ |-| مختلف قسم کے پیرامیٹرز کی کلاسوں اور افعال کے درمیان غیر مشترکہ جامد متغیرات۔ | مختلف قسم کے پیرامیٹرز کی کلاسوں کی مثالوں کے درمیان مشترکہ جامد متغیرات۔ |-| کلاس اور فنکشن ٹیمپلیٹس اپنے اعلامیے میں ٹائپ پیرامیٹرز کے لیے ٹائپ ریلیشنز کو نافذ نہیں کرتے۔ غلط قسم کے پیرامیٹر کے استعمال کے نتیجے میں مرتب کرنے میں ناکامی ہوتی ہے، اکثر صارف کے کوڈ کے بجائے ٹیمپلیٹ کوڈ کے اندر ایک ایرر میسج پیدا ہوتا ہے جو اسے طلب کرتا ہے۔ ٹیمپلیٹڈ کلاسز اور افعال کا مناسب استعمال مناسب دستاویزات پر منحصر ہے۔ میٹاپروگرامنگ اضافی کوشش کی قیمت پر یہ خصوصیات فراہم کرتی ہے۔ C + + 11 میں اس مسئلے کو حل کرنے کی تجویز تھی، نام نہاد تصورات، یہ اگلے معیار کے لیے منصوبہ بند ہے۔ عام کلاسیں اور افعال اپنے اعلامیے میں قسم کے پیرامیٹرز کے لیے قسم کے تعلقات کو نافذ کر سکتے ہیں۔ غلط قسم کے پیرامیٹر کے استعمال کے نتیجے میں کوڈ کے اندر ٹائپ کی غلطی ہوتی ہے جو اسے استعمال کرتا ہے۔ عام کوڈ میں پیرامیٹرائزڈ اقسام پر کارروائیوں کی اجازت صرف ان طریقوں سے دی جاتی ہے جن کی اعلامیے کے ذریعے محفوظ ہونے کی ضمانت دی جا سکتی ہے۔ اس کے نتیجے میں لچک کی قیمت پر زیادہ قسم کی حفاظت ہوتی ہے۔ |-| ٹیمپلیٹس ٹورنگ سے مکمل ہیں (ٹیمپلیٹ میٹا پروگرامنگ دیکھیں)۔ | جنیرکس بھی ہیں ٹورنگ-مکمل |} متفرق جاوا اور C + + کوڈ کو متعدد سورس فائلوں میں تقسیم کرنے کے لیے مختلف ذرائع استعمال کرتے ہیں۔ جاوا ایک پیکیج سسٹم کا استعمال کرتا ہے جو پروگرام کی تمام تعریفوں کے لیے فائل کا نام اور راستہ بتاتا ہے۔ اس کا مرتب قابل عمل کلاس فائلوں کو درآمد کرتا ہے۔ سی + + ماخذ فائلوں کے درمیان اعلانات کا اشتراک کرنے کے لیے ہیڈر فائل سورس کوڈ کی شمولیت کا نظام استعمال کرتا ہے۔ مرتب شدہ جاوا کوڈ فائلیں عام طور پر C + + میں کوڈ فائلوں سے چھوٹی ہوتی ہیں کیونکہ جاوا بائٹ کوڈ عام طور پر مقامی مشین کوڈ سے زیادہ کمپیکٹ ہوتا ہے اور جاوا پروگرام کبھی بھی مستحکم طور پر منسلک نہیں ہوتے ہیں۔ سی + + مرتب کرنے میں ایک اضافی متن پری پروسیسنگ مرحلہ شامل ہے، جبکہ جاوا میں ایسا نہیں ہے۔ اس طرح کچھ صارفین مشروط تالیف کی بہتر حمایت کے لیے اپنے تعمیراتی عمل میں پری پروسیسنگ مرحلہ شامل کرتے ہیں۔ جاوا کے ڈویژن اور ماڈیولس آپریٹرز کو صفر تک کاٹنے کے لیے اچھی طرح سے بیان کیا گیا ہے۔ سی + + (پری-سی + + 11) اس بات کی وضاحت نہیں کرتا ہے کہ آیا یہ آپریٹرز صفر تک کاٹتے ہیں یا "-انفینیٹی تک کاٹتے ہیں"۔ جاوا اور C + + 11 میں-3/2 ہمیشہ-1 ہوگا، لیکن ایک C + + 03 مرتب پلیٹ فارم کے لحاظ سے-1 یا-2 واپس کر سکتا ہے۔ C99 تقسیم کی وضاحت جاوا اور C + + 11 کی طرح کرتا ہے۔ دونوں زبانیں اس بات کی ضمانت دیتی ہیں (جہاں a اور b عدد کی اقسام ہیں) کہ (a/b) * b + (a ٪ b) = = a تمام a اور b کے لیے (b! = 0)۔ سی + + 03 ورژن بعض اوقات تیز تر ہوگا، کیونکہ اسے پروسیسر کے لیے جو بھی ٹرنکیشن موڈ مقامی ہے اسے منتخب کرنے کی اجازت ہے۔ انٹیجر کی اقسام کے سائز کی وضاحت جاوا میں کی گئی ہے (انٹیجر 32 بٹ ہے، لمبا 64 بٹ ہے)، جبکہ C + + میں انٹیجرز اور پوائنٹرز کا سائز مرتب کرنے والا اور ایپلیکیشن بائنری انٹرفیس (ABI) دی گئی رکاوٹوں کے اندر منحصر ہے۔ اس طرح جاوا پروگرام کا پلیٹ فارمز میں مستقل طرز عمل ہوگا، جبکہ سی + + پروگرام کو کچھ پلیٹ فارمز کے لیے موافقت کی ضرورت پڑ سکتی ہے، لیکن مقامی پلیٹ فارم کے لیے زیادہ قدرتی انٹیجر سائز کے ساتھ تیزی سے چل سکتا ہے۔ سی + + اور جاوا کا موازنہ کرنے کی ایک مثال ویکی بکس میں موجود ہے۔ کارکردگی ایک مرتب شدہ جاوا پروگرام چلانے کے علاوہ، جاوا ایپلی کیشنز چلانے والے کمپیوٹرز کو عام طور پر جاوا ورچوئل مشین (جے وی ایم) بھی چلانی چاہیے، جبکہ مرتب کردہ سی + + پروگرام بیرونی ایپلی کیشنز کے بغیر چلائے جا سکتے ہیں۔ جاوا کے ابتدائی ورژنوں کو مستحکم طور پر مرتب کردہ زبانوں جیسے C + + نے نمایاں طور پر پیچھے چھوڑ دیا۔ اس کی وجہ یہ ہے کہ ان دو قریب سے متعلق زبانوں کے پروگرام کے بیانات C + + کے ساتھ چند مشین ہدایات پر مرتب ہو سکتے ہیں، جبکہ جے وی ایم کے ذریعے تشریح کیے جانے پر کئی بائٹ کوڈز میں مرتب کیے جاتے ہیں جن میں کئی مشین ہدایات شامل ہوتی ہیں۔ مثال کے طور پر: چونکہ کارکردگی کو بہتر بنانا ایک بہت ہی پیچیدہ مسئلہ ہے، اس لیے عام طور پر C + + اور جاوا کے درمیان کارکردگی کے فرق کی مقدار طے کرنا بہت مشکل ہے، اور زیادہ تر معیارات ناقابل اعتماد اور متعصبانہ ہوتے ہیں۔ زبانوں کی بہت مختلف نوعیتوں کو دیکھتے ہوئے، حتمی معیار کے فرق کو کھینچنا بھی مشکل ہے۔ مختصر طور پر، جاوا میں اصلاح کرنے میں موروثی نااہلی اور سخت حدود ہیں، یہ دیکھتے ہوئے کہ یہ لچکدار اعلی سطحی تجریدوں پر بہت زیادہ انحصار کرتا ہے، تاہم، ایک طاقتور جے آئی ٹی مرتب کا استعمال (جیسا کہ جدید جے وی ایم کے نفاذ میں) کچھ مسائل کو کم کر سکتا ہے۔ کسی بھی صورت میں، اگر جاوا کی نااہلی بہت زیادہ ہے، تو مرتب کردہ سی یا سی + + کوڈ کو جاوا سے جے این آئی کے ذریعے کال کیا جا سکتا ہے۔ جاوا زبان میں موروثی کچھ ناکارہیوں میں شامل ہیں، بنیادی طور پر: تمام اشیاء کو ڈھیر پر مختص کیا جاتا ہے۔ اگرچہ 'بم الاٹمنٹ' کا استعمال کرتے ہوئے جدید جے وی ایم میں الاٹمنٹ انتہائی تیز ہے، جو اسٹیک الاٹمنٹ کی طرح کام کرتی ہے، پھر بھی کچرا جمع کرنے والے کی دعوت کی وجہ سے کارکردگی پر منفی اثر پڑ سکتا ہے۔ اوریکل جے ڈی کے 6 کے بعد سے جدید جے آئی ٹی مرتب اسٹیک پر کچھ اشیاء کو مختص کرنے کے لیے فرار کے تجزیے یا فرار کا پتہ لگانے کے ساتھ اس مسئلے کو کسی حد تک کم کرتے ہیں۔ کارکردگی کے اہم منصوبوں جیسے موثر ڈیٹا بیس سسٹم اور میسجنگ لائبریریوں کو دستی وسائل کے انتظام تک رسائی حاصل کرنے اور اسٹیک الاٹمنٹ کرنے کے قابل ہونے کے لیے sun.misc.Unsafe جیسے اندرونی غیر سرکاری API کا استعمال کرنا پڑا ہے۔ بہت زیادہ رن ٹائم کاسٹنگ کی ضرورت ہوتی ہے یہاں تک کہ معیاری کنٹینرز کا استعمال بھی کارکردگی کی سزا کو جنم دیتا ہے۔ تاہم، ان میں سے زیادہ تر کاسٹ کو جے آئی ٹی مرتب کے ذریعے مستحکم طور پر ختم کر دیا جاتا ہے۔ حفاظتی ضمانتیں رن ٹائم لاگت پر آتی ہیں۔ مثال کے طور پر، مرتب کرنے والے کو کوڈ میں مناسب رینج چیک لگانے کی ضرورت ہوتی ہے۔ رینج چیک کے ساتھ ہر صف تک رسائی کی حفاظت کرنا موثر نہیں ہے، لہذا زیادہ تر جے آئی ٹی مرتب ان کو مستحکم طور پر یا اندرونی لوپس سے باہر نکال کر ختم کرنے کی کوشش کریں گے (حالانکہ سی + + کے لیے زیادہ تر مقامی مرتب اسی طرح کریں گے جب رینج چیک اختیاری طور پر استعمال کیے جائیں گے)۔ نچلی سطح کی تفصیلات تک رسائی کی کمی ڈویلپر کو اس پروگرام کو بہتر بنانے سے روکتی ہے جہاں مرتب کرنے والا ایسا کرنے سے قاصر ہے۔ جاوا میں تمام صارف سے متعین اقسام کے لیے حوالہ الفاظ کا لازمی استعمال بڑی مقدار میں غیر ضروری میموری ڈائریکشنز (یا چھلانگ) متعارف کرا سکتا ہے (جب تک کہ جے آئی ٹی مرتب سے خارج نہ ہو جائے) جس کی وجہ سے بار بار کیش چھوٹ سکتی ہے (یعنی۔ کیش تھراشنگ)۔ مزید برآں، کیش-آپٹیمائزیشن، عام طور پر کیش سے آگاہ یا کیش سے محروم ڈیٹا ڈھانچے اور الگورتھم کے ذریعے، اکثر کارکردگی میں شدت میں بہتری کے احکامات کا باعث بن سکتی ہے اور ساتھ ہی وقت کی پیچیدگی کے انحطاط سے بچ سکتی ہے جو کہ بہت سے کیش کو مایوس کرنے والے الگورتھم کی خصوصیت ہے، اور اس وجہ سے یہ اصلاح کی سب سے اہم شکلوں میں سے ایک ہے۔ حوالہ-الفاظ، جیسا کہ جاوا میں لازمی ہے، اس طرح کی اصلاح کو عملی طور پر محسوس کرنا ناممکن بنا دیتا ہے (نہ تو پروگرامر اور نہ ہی جے آئی ٹی مرتب)۔ کچرا اکٹھا کرنا، جیسا کہ خودکار میموری مینجمنٹ کی یہ شکل میموری اوور ہیڈ کو متعارف کراتی ہے۔ تاہم، جاوا کے ڈیزائن کے بہت سے فوائد ہیں، کچھ کو احساس ہوا، کچھ صرف نظریاتی ہیں: جاوا کے کچرے کے مجموعے میں میموری مختص کرنے کے لیے میلوک/نیو کے معمول کے استعمال سے بہتر کیش ہم آہنگی ہو سکتی ہے۔ اس کے باوجود، دلائل موجود ہیں کہ دونوں الاکیٹر یکساں طور پر ڈھیر کو ٹکڑے ٹکڑے کرتے ہیں اور نہ ہی بہتر کیش لوکیٹی کی نمائش کرتے ہیں۔ تاہم، سی + + میں، ڈھیر پر واحد اشیاء کی تقسیم شاذ و نادر ہی ہوتی ہے، اور عام طور پر ایس ٹی ایل کنٹینر اور/یا چھوٹے آبجیکٹ الاکیٹر کے ذریعے بلاکس میں بڑی مقدار میں واحد اشیاء مختص کی جاتی ہیں۔ رن ٹائم مرتب کرنا ممکنہ طور پر اس پلیٹ فارم کے بارے میں معلومات کا استعمال کر سکتا ہے جس پر کوڈ کو زیادہ مؤثر طریقے سے بہتر بنانے کے لیے کوڈ پر عمل درآمد کیا جا رہا ہے۔ تاہم، زیادہ تر جدید ترین مقامی (سی، سی + +، وغیرہ) مرتب کرنے والے دیئے گئے نظام کی مکمل کمپیوٹیشنل صلاحیتوں کو بروئے کار لانے کے لیے متعدد کوڈ راستے تیار کرتے ہیں۔ نیز، الٹا دلیل دی جا سکتی ہے کہ مقامی مرتب کرنے والے ملٹی پلیٹ فارم جے وی ایم کی تقسیم کے مقابلے میں فن تعمیر سے متعلق مخصوص اصلاح اور انسٹرکشن سیٹوں کا بہتر استحصال کر سکتے ہیں۔ رن ٹائم کمپائلنگ ایک جامد مرتب کے لیے ممکن سے زیادہ جارحانہ ورچوئل فنکشن ان لائننگ کی اجازت دیتی ہے، کیونکہ جے آئی ٹی مرتب کے پاس ورچوئل کالز کے تمام ممکنہ اہداف کے بارے میں زیادہ معلومات ہوتی ہیں، چاہے وہ مختلف متحرک طور پر بھری ہوئی ماڈیولز میں ہی کیوں نہ ہوں۔ فی الحال دستیاب جے وی ایم کے نفاذ میں زیادہ تر مونومورفک، زیادہ تر مونومورفک اور ڈائمورفک کالز کو ان لائن کرنے میں کوئی دشواری نہیں ہے، اور جاوا 7 میں شامل حالیہ انوک ڈائنامک اضافہ کی بدولت میگامورفک کالز کو بھی ان لائن کرنے کے لیے تحقیق جاری ہے۔ ان لائننگ لوپ ویکٹرائزیشن یا لوپ انرولنگ جیسی مزید اصلاح کی اجازت دے سکتی ہے، جس کے نتیجے میں مجموعی کارکردگی میں بہت زیادہ اضافہ ہوتا ہے۔ جاوا میں، تھریڈ سنکرونائزنگ زبان میں بنائی گئی ہے، لہذا جے آئی ٹی مرتب ممکنہ طور پر، فرار کے تجزیے کے ذریعے، تالے نکال سکتا ہے، بے وقوف ملٹی تھریڈ کوڈ کی کارکردگی کو نمایاں طور پر بہتر بنا سکتا ہے۔ نیز، C + + میں کارکردگی کے کچھ مسائل پیدا ہوتے ہیں: پوائنٹرز کو کسی بھی پتے کی طرف اشارہ کرنے کی اجازت دینے سے پوائنٹر الیازنگ کے امکان کی وجہ سے اصلاح کرنا مشکل ہو سکتا ہے۔ چونکہ C + + میں ایک ہی کلاس ٹیمپلیٹ کے مختلف لمحات سے تیار کردہ کوڈ کا اشتراک نہیں کیا جاتا ہے (جیسا کہ جاوا میں ٹائپ مٹائے گئے جنیرکس کے ساتھ ہوتا ہے)، ٹیمپلیٹس کا ضرورت سے زیادہ استعمال قابل عمل کوڈ کے سائز (کوڈ بلوٹ) میں نمایاں اضافے کا باعث بن سکتا ہے۔ تاہم، چونکہ فنکشن ٹیمپلیٹس جارحانہ طور پر ان لائن ہوتے ہیں، وہ بعض اوقات کوڈ کے سائز کو کم کر سکتے ہیں، لیکن اس سے بھی اہم بات یہ ہے کہ مرتب کرنے والے کے ذریعہ زیادہ جارحانہ جامد تجزیہ اور کوڈ کو بہتر بنانے کی اجازت دیتے ہیں، جو اکثر انہیں غیر ٹیمپلیٹڈ کوڈ سے زیادہ موثر بناتے ہیں۔ اس کے برعکس، جاوا جنیرکس لازمی طور پر غیر جنریکائزڈ کوڈ سے کم موثر ہیں۔ کیونکہ روایتی C + + مرتب میں، C + + میں کوڈ تیار کرنے اور بہتر بنانے کے بعد متحرک لنکنگ کی جاتی ہے، مختلف متحرک ماڈیولز پر پھیلی فنکشن کالز کو ان لائن نہیں کیا جا سکتا۔ تاہم جدید سی + + مرتب جیسے ایم ایس وی سی اور کلانگ + ایل ایل وی ایم لنک ٹائم کوڈ جنریشن کے اختیارات پیش کرتے ہیں جو ماڈیولز کو انٹرمیڈیٹ فارمیٹس میں مرتب کرنے کی اجازت دیتے ہیں جو حتمی لنک مرحلے پر ان لائننگ کی اجازت دیتا ہے۔ سرکاری معیار اور زبان کی زبان کی تفصیلات کا حوالہ سی + + زبان کی تعریف آئی ایس او/آئی ای سی 14882 کے ذریعہ کی گئی ہے، جو ایک آئی ایس او معیار ہے، جسے آئی ایس او/آئی ای سی جے ٹی سی 1/ایس سی 22/ڈبلیو جی 21 کمیٹی نے شائع کیا ہے۔ C + + 17 کا تازہ ترین، پوسٹ اسٹینڈرڈائزیشن ڈرافٹ بھی دستیاب ہے۔ سی + + زبان ایک کھلی اسٹیئرنگ کمیٹی کے ذریعے تیار ہوتی ہے جسے سی + + اسٹینڈرڈز کمیٹی کہا جاتا ہے۔ کمیٹی سی + + بجرن اسٹروسٹرپ کے تخلیق کار، کنوینر ہرب سٹر، اور دیگر ممتاز شخصیات پر مشتمل ہے، جن میں صنعتوں اور صارف گروپوں (یعنی اسٹیک ہولڈرز) کے بہت سے نمائندے شامل ہیں۔ ایک کھلی کمیٹی ہونے کے ناطے، کوئی بھی معیاری اور تکنیکی خصوصیات کی آئندہ ریلیز کے لیے تجاویز میں شامل ہونے، حصہ لینے اور تعاون کرنے کے لیے آزاد ہے۔ کمیٹی اب ہر چند سالوں میں ایک نیا معیار جاری کرنے کا ارادہ رکھتی ہے، حالانکہ ماضی میں سخت جائزے کے عمل اور مباحثوں کا مطلب نئے معیارات (1998، 2003، اور 2011) کی اشاعت کے درمیان طویل تاخیر ہے۔ جاوا زبان کی تعریف جاوا زبان کی وضاحت سے ہوتی ہے، ایک کتاب جسے اوریکل نے شائع کیا ہے۔ جاوا زبان جاوا کمیونٹی پروسیس نامی عمل کے ذریعے مسلسل تیار ہوتی ہے، اور دنیا کی پروگرامنگ کمیونٹی کی نمائندگی لوگوں اور تنظیموں کے ایک گروپ کے ذریعے کی جاتی ہے-جاوا کمیونٹی کے ممبران-جو عوامی درخواستیں بھیج کر زبان کو بڑھانے میں فعال طور پر مصروف ہیں-جاوا اسپیسیفیکیشن درخواستیں-جن کو زبان میں ضم ہونے سے پہلے رسمی اور عوامی جائزے پاس کرنے ہوتے ہیں۔ جاوا کے لیے ایک مضبوط معیار کی کمی اور اس کی خصوصیات کی کچھ زیادہ اتار چڑھاؤ والی نوعیت اسٹیک ہولڈرز کی طرف سے تنقید کا ایک مستقل ذریعہ رہی ہے جو نئی زبان اور لائبریری کی خصوصیات کے اضافے میں زیادہ استحکام اور قدامت پسندی چاہتے ہیں۔ اس کے برعکس، سی + + کمیٹی کو بھی مسلسل تنقید کا سامنا کرنا پڑتا ہے، دوسری وجہ سے، یعنی بہت سخت اور قدامت پسند ہونا، اور نئے ورژن جاری کرنے میں بہت زیادہ وقت لگنا۔ ٹریڈ مارک "C + +" کسی کمپنی یا تنظیم کا ٹریڈ مارک نہیں ہے اور کسی فرد کی ملکیت نہیں ہے۔ "جاوا" اوریکل کارپوریشن کا ٹریڈ مارک ہے۔ حوالہ جات حوالہ جات بیرونی روابط C + + اور جاوا آبجیکٹ پر مبنی میموری مینجمنٹ کے درمیان فرق: جاوا بمقابلہ C + + باب 2: جاوا C سے کیسے مختلف ہے، باب جاوا سے مختصر میں ڈیوڈ فلانگن جاوا بمقابلہ C + + ریسورس مینجمنٹ کا موازنہ-جاوا بمقابلہ C کارکردگی کی مثالوں کے ساتھ جامع کاغذ۔ دوبارہ۔-جاوا اور C/C + + ہائپر پولی کے درمیان کارکردگی کے فرق کی گہرائی سے بحث-جاوا اور C + + موازنہ جاوا اور C + + جاوا (پروگرامنگ زبان) C + +