جاوا یک زبان رایج اینترنتی است، ++ c عمومی ترین زبان oop است. Object Pascal زبانی است که شرکت Borland در Delphi استفاده می کند. این سه زبان وجوه مشترک بسیاری دارند. هدف این مقاله کاوش در زوایای تکنیکی این سه زبان و مقایسه آنها است.


ساختارهای کلیدی oop:
برنامه نویسی oop، تکنیک نوین برنامه نویسی نیست، بلکه ریشه هایش به Simula-67 باز می گردد. گر چه اولین اجرا و پیاده سازی کاملش به Smalltalk-80 باز میگردد. oop در نیمه دوم قرن 80 با ظهور بسیاری از زبانهای مختلف مانند
C++‎, Objective-C, Object and Turbo Pascal, CLOS (an OOP extension of Lisp), Eiffel, Ada
و اخیراً جاوا رایج شد. در این مقاله روی C++‎ ، object Pascal و جاوا تمرکز شده است. قبل از اینکه سه زبان بالا را مورد بررسی قرار دهیم تعدادی واژه های کلیدی را تعریف و توصیف می کنم.

• اولین مشخصه کلیدی تعریف کلاس هاست. معمولاً کلاسها اساس پیمانه ای بودن (Modularity)، انتزاع داده ها و کپسوله سازی در زبانهای oop هستند.
• دومین واژه کلیدی وراثت است. که یک روشی برای تعریف یک نوع جدید ارث بری عناصر از یک موجودیت و اصلاح آن موجودیت است . این کلمه یک لغت تخصصی و عمومی است.
• سومین کلمه به عنوان چند ریختی مشهور شده است. و به شما اجازه می دهد که به اشیایی از کلاسهای گوناگون در یک شیوه همگن رجوع کنید. این عمل سبب می شود که حتی کلاس مجدداً قابل استفاده باشد و برنامه ها هم آسانتر گسترش می یابند.

کلاس ها، وراثت و چند ریختی مشخصه های اساسی هستند که بوسیله یک زبان به عنوان زبان oop توصیف می شوند. از زبانهایی که وراثت و چند ریختی ندارند بلکه کلاس دارند به طور کلی به عنوان یک زبان based–class (برپایه کلاس ) معرفی شده اند. زبانهایoop مختلف به طور کامل خط مشی های متفاوتی را دنبال می کنند ما میتوانیم مکانیزم های کنترل نوع ، توانایی پشتیبانی از مدلهای مختلف برنامه نویسی و پشتیبانی از مدل شی را در میان زبانهای مختلف oop به صورت برجسته مقایسه کنیم.



Compile-Time vs. Runtime Type checking (کنترل نوع زمان اجرا در مقابل کنترل نوع زمان کامپایل)

زبان های برنامه نویسی می توانند از لحاظ قدرت کنترل نوع ارزیابی شوند.کنترل نوع به وجود روش هایی که پیشتر گفته شد، پارامترهایشان و چک کردن محدوده آرایه و غیره بستگی دارد.
C++‎, Javaو Object Pascal هر سه شان کمتر یا بیشتر از کنترل نوع در زمان کامپایل پشتیبانی می کنند. از این سه زبان شاید C++‎ از دقت کمتری برخوردار باشد. Javaکنترل نوع قوی تری دارد. به این دلیل است که C++‎با زبان c سازگاری دارد از کنترل نوع زمان کامپایل پشتیبانی می کند. برای مثال C++‎ ,c نوع ریاضی را به عنوان شروع سازگاری مورد توجه قرار می دهند. (گر چه وقتی انتساب float به integer صورت می گیرد کامپایلر اخطار می دهد).
در Object Pascalو Javaیک مقدار نوع Boolean وInteger نیست و نوع کارکتر نوع مختلف و ناسازگار دیگری است.Java در زمان اجرا یک بایت کد (byte-code ) را اجرا می کند. این به این معنی نیست که زبان کنترل نوع در زمان کامپایل را از دست می دهد و بالعکس.
کنترل نوع در این زبان کامل تر است. در عوض زبان های oop دیگر مانند small talkو CLOS تمایل دارند تا اغلب کنترل نوع را در زمان اجرا انجام دهند.

Hybrid vs. Pure OOP Languages (زبان های شی گرای Hybrid در مقابل pure)

تفاوت میان زبان های شی گرای pure ,Hybrid در این است که زبان های شی گرا فقط یک نوع مدل برنامه نویسی را می پذیرند از آنجا زبان های pure به زبان هایی اطلاق می شودکه شما می توا نید در آنها کلاس ها و متدها را تعریف کنید اما نمی توانید از procedure و function های قدیمی و داده محلی استفاده کنید و در مقابل زبان های pure، زبان های Hybridبه برنامه نویس این امکان را می دهند تا از پارامترهای زبان های قدیمی هم استفاده کنند. درمیان این سه زبان فقط جاوا یک زبان pureاست (مانند Eiffel , Smalltalk) که در ابتدا این ایده مثبت به نظر می رسد. به هر حال شما می توانید به استفاده از روش های استاتیک و داده استاتیک که تفاوتی با استفاده از داده ها و تابع ها دارد خاتمه دهید. علاوه بر آن syntaxزبان هم پیچیده تر می شود .به عقیده ی من زبان های pure برای تازه وارد های oop منفعت دارد. زیرا برنامه نویسان مجبور به بهره وری و یادگیری مدل برنامه نویسی oop می شوند. C++‎و object Pascalدو نمونه از زبان های Hybrid هستند که به برنامه نویس ها اجازه می دهد تا از زبان cقدیمی (سنتی)و رویکرد های برنامه نویسی پاسکال بهره مند شوند. توجه کنید small talk همین مفهوم را گسترش داد که در سطح تعریف فقط شی را داشته با شیم. به عنوان مثال اشیایی همچون نوع هایی داده از پیش تعریف شده مانند character ,integer و ساختار های زبان (مثلا حلقه ). این عمل از لحاظ تئوریک جالب است اما تقریباً تا حدود زیادی کارایی کاهش می یابد.

Plain Object Model vs. Object Reference Model (Object Reference Model در مقابل Model Plain Object)

سومین پارامتر متمایز کنندۀ زبان های OOP مدل شیء شان است. برخی زبان های قدیمی OOP به برنامه نویسان این اجازه را می دهند که شیء هایی را در Stack، حافظۀ پویا و استاتیک ایجاد کنند. در این زبان ها یک متغیر نوع داده با یک شیء در حافظه مطابقت دارد. C++‎ با این روش کار می کند. به نظر می رسید که بعداً گرایشی به بهره وری از یک مدل مختلف که مدل مرجع شیء نام گرفت وجود داشته باشد. در این مدل به هر شیء به صورت پویا، Heap اختصاص داده می شود و عملاً متغیری از یک نوع کلاس، مرجعی برای شیء در حافظه است.( از لحاظ تکنیکی شبیه یک اشاره گر است). Java و Object Pascal هر دو این مدل مرجع را می پذیرند. زمانی که با این مورد برخورد می کنیم بدان معنی است که شما باید حافظه ای برای شی اختصاص دهید.

Classes, Objects, References

ویژگی: از آنجایی که ما دربارۀ زبان OOP بحث می کنیم بعد از این مقدمه نکتۀ آغازین بحث در خصوص کلاس ها و اشیاء می باشد. امیدوارم که همگان به روشنی اختلاف بین این دو واژه را درک کنند. به طور مختصر این کلاس یک نوع داده است و یک شیء یک نمونه از یک نوع کلاس است. حالا چگونه می توانیم از این اشیاء در زبان با استفاده از مدل های مختلف شی استفاده کنیم؟

C++‎: اگر در C++‎، ما یک کلاس MyClass با متد MyMethod داشته باشیم پس می توانیم بنویسیم:
MyClass Obj;
Obj.MyMethod();

و به یک شیء از کلاس MyClass که Object نامیده می شود دست می یابیم. معمولاً حافظه مورد نیاز برای این شیء در حافظه تعبیه شده و شما می توانید برای استفاده از این شی از خط دوم بالا آغاز کنید.
Java: در جاوا یک دستورالعمل مشابه تنها فضای حافظه برای دسترسی و ادارۀ شیء را اختصاص می دهد نه خود شیء را.
MyClass Obj;
Obj = new MyClass();
Obj.MyMethod();

پیش از اینکه از شیء استفاده کنیم باید کلاس جدیدی را فراخوانی کنید تا حافظه ای را برای شیء اختصاص دهد. البته در صورت امکان شیء را تعریف کنید و آنرا با یک عبارت تنها مقداردهی اولیه کنید تا از دستکاری اشیایی که مقدار دهی اولیه نشدند اجتناب کنید.


MyClass Obj = new MyClass();
Obj.MyMethod();

Object Pascal: پاسکال شی گرا رویکرد مشابهی دارد امّا به عبارات متفاوتی برای تعریف و مقدار دهی اولیه نیاز دارد.

var
Obj: MyClass;
begin
Obj := MyClass.Create;
Obj.MyMethod;

تذکر: هنگامی که برنامه نویس احساس می کند که مدل مرجع شیء نیاز به کار بیشتری دارد. باید تفکر کند که در C++‎ شما اغلب باید از نشانگرها برای اشیاء و ارجاع به اشیاء استفاده کنید. به طور مثال تنها با استفاده از نشانگرها و مرجع به چند درختی دست می یابیم. در عوض مدل مرجع شی نشانگرها و پیش فرض ها را بنا می سازد. در ماورای آنها عملکرد بهینه دارد. بویژه در جاوا رسماً هیچ نشانگری وجود ندارد. اما نشانگرها همه جا هستند. تنها برنامه نویس ها هیچ کنترل مستقیمی روی آنها ندارند به گونه ای که آنها به دلایل امنیتی نمی توانند به محل های حافظۀ موقت دسترسی یابند.

Recycle Bin

ویژگی ها: هنگامی که شی را ایجاد کردید و از آن استفاده کردید سپس برای جلوگیری از اشغال حافظه نیاز به تخریب آن دارید .

C++‎: در برنامه C++‎ تخریب اشیایی که در پشته تخصیص داده شده اند نسبتاً سهل و آسان است. از سوی دیگر در دست گرفتن تخریب اشیایی که به صورت پویا تخصیص داده شده اند اغلب عملی پیچیده است. اینجا راه حل های بسیاری وجود دارند که 'شمارش مرجع' و 'نشانگرهای هوشمند' را شامل می شوند امّا این عمل فراتر از یک عملیات ساده است اولین اثری که C++‎ بر روی برنامه نویسان دارد آنست که بهره وری از یک مدل شیء مرجع شرایط را حتی بدتر می سازد.

Java: از آنجایی که virtual machine (ماشین مجازی) الگوریتمgarbage collection را در background اجرا می کند قطعاً این موضوع برای Java مسئله ای نیست. این چیزی است که برنامه نویسان آزادانه به آن دست می یابند. امّا چیزهایی ممکن است عملکرد برنامه ها را تحت تأثیر قرار دهد ننوشتن destructor ها (آشغالدان ها) ممکن است منجر به ایجاد errorهای منطقی در کد Clean up شود.

Object Pascal: در عوض پاسکال شی گرا هیچ مکانیزم جمع آوری زباله ندارد. به هر حال Componentهای دلفی از ایدۀ owner object پشتیبانی می کند. مالک مسئول تخریب تمامی اشیاء مخصوص خودش است. این عملکرد ادارۀ تخریب اشیاء را بسیار ساده و آسان می کند.

Defining New Classes (تعریف کلاس جدید)

ویژگی: حالا که ما دریافتیم چگونه اشیاء کلاس های موجود را ایجاد کنیم می توانیم برای تعریف کلاس های جدید تمرکز کنیم در یک تعریف ساده یک کلاس مجموعۀ روش هایی جهت انجام عملیات در برخی داده های محلی است.

C++‎:
یک مثال ساده از تعریف کلاس ها در C++‎:

class Date {
private:
int dd;
int mm;
int yy;
public:
void Init (int d, int m, int y);
int Day ();
int Month ();
int Year ();};


و تعریف یک متد به شکل زیر است:
void Date::Init (int d, int m, int y)
{
dd = d;
mm = m;
yy = y;
}

Java:
جاوا یک Syntax ساده تر نسبت به C++‎ دارد:

class Date {
int dd = 1;
int mm = 1;
int yy = 1;
public void Init (int d, int m, int y) {
dd = d; mm = m; yy = y; }
public int Day () { return dd; }
public int Month () { return mm; }
public int Year () { return yy; }
}

مهمترین اختلاف میان C++‎ و Java آنست که کد هر متد مستقیماً هنگامی که آن دستورالعمل اعلان می شود نوشته می شود. ( بدون ساختن تابع inline function به عنوان تابع happens در C++‎). و آنکه می توانیم به اجزای اولیه یک کلاس مقدار دهی اولیه کنیم .اگر شما موفق به انجام عملیات نشدید بنابراین جاوا با استفاده از یک مقدار پیش فرض به همه اجزا داده شما، مقدار اولیه می دهد.

Object Pascal:
در Object Pascal املای اعلان کلاس متفاوت است و بیشتر شبیه به C++‎ می باشد تا java .

type
Date = class
private
dd, mm, yy: Integer;
public
procedure Init (d, m, y: Integer);
function Month: Integer;
function Day: Integer;
function Year: Integer;
end;

procedure Date.Init (d, m, y: Integer);
begin
dd := d;
mm := m;
yy := y;
end;

function Date.Day: Integer;
begin
Result := dd;
end;

همانطور که می بینید تفاوتهای املایی در اینجا وجود دارد متدها با keyword های تابع و procedure تعریف شده اند. متدهای بدون پارامتر پرانتزی ندارند متدها به شکلی ساده در تعریف کلاس بیان شده اند. سپس تعریف بعدی معمولاً در C++‎ رخ می دهد. به هر حال پاسکال از علامت نقطه استفاده می کند هنگامی که C++‎ به حوزه عملگر تکیه می کند.(یک عملگر در C++‎ و جاوا در دسترس نیستند.)
نکته :در دستیابی به شی جاری در زبانهای oop، متدها با توابع سراسری متفاوت هستند. زیرا آنها یک پارامتر پنهان، یک ارجاع یا نشانگر به شی که ما در حال انجام عملیات روی آن هستیم دارند. یک اشاره به شی جاری نام دیگری می گیرد و آن this در C++‎ و java است وself در Object Pascal است.

Constructors (سازنده ها)

ویژگی: کلاس بالا بسیار ساده است. اولین چیزی که ما می توانیم بیافزاییم یک سازنده است که تکنیک خوبی برای حل مشکل مقدار دهی اولیه اشیاء است.

C++‎: در C++‎مانند جاوا ، سازنده ها یک نام مشابه با کلاس دارند .اگر شما یک سازنده تعریف نکنید، کامپایلر یک سازنده پیش فرض را ترکیب می کند (تطبیق می دهد) و به کلاس می افزاید. در هر دوی این زبانها شما می توانید چندین سازنده داشته باشید. در هر دوی زبانها امکان overload روی سازنده ها وجود دارد.

Java: در جاوا همه چیز همانند c عمل می کند گر چه سازنده ها ، مقدار اولیه نامیده می شوند.حقیقت آنست که جاوا برای ایجاد اشیاء هنگامی که شما کدی را در یک سازنده می نویسید شی جدید الایجاد را به سادگی مقدار دهی اولیه می کند. ( همچنین چندین رویدادهایی نیز در object Pascal حادث می شود.)
Object Pascal: در Object Pascal از کلمه کلیدی Constructor استفاده می کنیم. در این زبان هیچ روش Over loading یافت نمی شود. اما از آنجایی که سازنده ها نام های رایجی دارند شما می توانید سازنده های بسیاری با نام های مختلف تهیه کنید. در این زبان هر کلاس سازنده create پیش فرض دارد. گرچه شما آن را با یک سازنده ایی که نام یکسان دارد و حتی پارامتر ها ی آن متفاوت هستند، سرانجام باطل می کنید.

Destructor and finalize (مخرب ها و پایان دهنده ها)

ویژگی: یک مخرب نقش متفاوتی نسبت به سازنده دارد و کلاً هنگامی فرا خوانده می شود که یک شی تخریب شود . گر چه اکثر کلاسها نیاز به یک سازنده دارند . تنها مقدار اندکی از آنها نیاز به یک مخرب دارند . مخرب باید منابع اختصاص داده شده به وسیله سازنده را آزاد کند ( یا با روش های دیگری در طول عمر اشیاء ) این منابع شامل حافظه فایل ها، جداول، پایگاه داده و غیره می شود.

C++‎: مخرب های C++‎ به صورت خودکار هنگامی فرا خوانده می شوند که یک شی از حوزه خارج می شود یا بخواهید به صورت پویا شی خاص (تخصیص داده شده) را پاک کنید. هر کلاس تنها می تواند یک مخرب داشته باشد.

Object Pascal: مخرب های Object Pascal شبیه مخرب های C++‎ است، Object Pascal از یک مخرب مجازی استاندارد بهره می برند که destroy نامیده می شود. استاندارد این مخرب را متد free نامیدند. همه اشیاء پویا هستند بنابراین شما برای خطاب قرار دادن free برای هر شی که ایجاد می کنید پشتیبانی می شوید. گر چه هر مالکی مسئول تخریب خودش است. در این تئوری شما می توانید چندین مخرب را بیان کنید که این حس را ایجاد می کند زیرا شما با کد خودتان مخرب ها را فراخوانی می کنید هیچ چیز خودکاری وجود ندارد .

Java: جاوا مخرب ندارد. اشیاء بدون مراجع توسط الگوریتم garbage collection تخریب می شوند، که مانند یک فرمان Background (پیش زمینه) عمل می کنند. اولین مخربی که garbage collection را فراخوانی می کند متد finalize()نامیده میشود.
به هر حال هیچ تضمینی وجود ندارد که این متد واقعاً آنگونه که نامیده شد عمل کند.( حداقل در Java 1.0). به همین علت اگر به منابع آزاد نیاز دارید باید روش رایجی را بر آن بیافزایید. و اطمینان حاصل کنید که آن برنامه فراخوانی شده است.

Class Encapsulation (Private and Public)

ویژگی: المنت رایج از این زبان وجود سه تصریح کننده جهت دسترسی به سطوح مختلف کپسوله سازی کلاس هستند که عبارتند از: public, protected و private. Public برای هر کلاسی قابل دسترسی است. protected برای کلاس های مشتق شده قابل دسترسی است. و private یعنی غیر قابل دسترسی .بهر حال جزییات متفاوت هستند.

C++‎: در C++‎ شما می توانید از friend keyword در کوتاه ترین مدت به encapsulation دسترسی پیدا کنید. ( دسترسی پیش فرض برای کلاس ازprivate و برای یک strut، Public است .)

Object Pascal: در Object Pascal ، publicوprotected تنها برای کلاسهایی در واحد های مختلف موثر ند. یک کلاس دوستی از دیگر کلاسهایی است که در همان unit تعریف شده. ( یا فایل کد منبع)
Delphi دو تصریح گر بیشتری برای دسترسی دارد. Published و automated.
Published اطلاعات RTT را برای هر عنصر automated تولید می کند. یک رابط اتوماتیک OLE است.

Java: در جاوا، تفاوت نحوی آن است که برای هر جزء کلاس، تصریح گرها تکرار شده اند اختلاف عمده تر آن است که پیش فرض در جاوا ، friendly است ، که به عنصری اشاره می کند که توسط دیگر کلاس های همان بسته قابل دسترس است. (یا فایل کد منبع همانند آن چیزی که درObject Pascal رخ می دهد.) کلمه ی کلیدی protected به دسترسی به زیرگروه ها اشاره می کند. اما به دیگر کلاس های همان بسته نیز اشاره می کند. هنگامی که ترکیب های private با protected منطبق می شوند.



Conclusion: Languages and Programming Environments
نتیجه گیری: زبان ها و محیط های برنامه نویسی

هما نگونه که در بالا ذکر شد، گر چه سعی ام بر این بوده که تنها این زبان ها را به واسطه مقایسه ساختارهای املایی و معنایی آزمایش کنیم مهم آنست که آنها را در جایگاه خودش درست و صحیح درک کنید. این زبان ها جهت حل مشکلات مختلف با روش های گوناگون بکار گرفته شده اند. و در سطحی وسیع با محیط های برنامه نویسی گوناگون مورد استفاده قرار گرفتند گر چه هر دو این زبان ها و محیط شان ساختار های یکدیگر را کپی می کنند ولی با نیازهای مختلف در ذهن تشکیل شده اند. و این چیزی است که می توانید به هنگام کمپینگ ساختارهایشان به عینه ببینید.هدفC++‎ توانمندی و کنترل در راستای پیچیدگی است. هدف دلفی برنامه نویسی ویژوال آسان است بدون از دست دادن توانمندی وافر و ارتباط قوی با ویندوزها . هدف جاوا قابل حمل بودن است حتی با از دست دادن مقداری از سرعت و برنامه های توزیع شده یا محتویات قابل اجرای وب. چیزی که می تواند موفقیت این سه زبان را تعیین کنند ساختارهایی نیستند که من در این مقاله پوشش دادم. وضع مالی کنترل سیستم عملیات مایکروسافت ، ترویج sun در شبکه جهانی اینترنت (حقیقتی که بوضوح به عنوان ضد مایکروسافت توسط عده ای رواج یافت). فاکتورهایی هستند که انتخابات شما را بیشتر ازعناصرتکنیکی تحت تا ثیر قرار می دهند به فرض مثال یک زبان خوب مانند Eiffel. از آنجایی هر دو زبان جاوا و object Pascal الهامات بیشتری گرفتم هرگز به هیچ اشتراک فروش واقعی نرسیدند گرچه این عمل در تمامی جهان ترویج یافتند . تنها به فکر بسپارید که "trendy" لغتی رایج در دنیای کامپیوتر شده که پیشتر نبوده . هنگامی که کاربرها دوست دارند تا این مدل سال را داشته باشند برنامه نویسان به کار با آخرین زبان برنامه نویسی عشق می ورزند و می خواهند اولین کسی باشند که آن را ایجاد می کند می توانیم بگوییم که "جاوا آخرین زبان oop نیست" و افرادی در سالهای آتی با زبانی جدید خواهند آمد.همه افراد با این زبان جدید همراه می شوند با این تصور که از این جریان عقب نمانند. و فراموش کنند که اکثر برنامه نویسان در جهان هنوز بر روی کیبوردهایشان عبارت"کوبول خوب را"می نویسند.

تهیه و تنظیم: مهدی نقدی

Refrence: http://www.marcocantu.com/papers/ooplang.htm