rahnema1
چهارشنبه 05 خرداد 1395, 10:34 صبح
قبلا در این تاپیک (http://barnamenevis.org/showthread.php?523811) مصاحبه ای از الکس استپانوف گذاشتم. این هم یک مصاحبه دیگه که مربوط به سال 1997 هست که با یک شخص ایتالیایی به نام Graziano Lo Russo صورت گرفته. بعضی مطالب فکر کنم نیاز به توضیحات داشت که حوصله نکردم توضیحاتی بنویسم حالا اگه کسی سوال یا بحثی داره می تونه توی اینجا یا تاپیک دیگه مطرح کنه. باز هم مطالب خوبی توی این مصاحبه پیدا می شه از تعریف برنامه نویسی عام و حمله به شیء گرایی و جاوا و ... . اصل این مصاحبه (http://www.stepanovpapers.com/LoRusso_Interview.htm) با تمام مصاحبه های دیگه در سایت استپانوف (http://www.stepanovpapers.com) قرار داره به همراه لیست مقالات و جزوه های درسی و سخنرانی ها و ... . امیدوارم بتونم باز مطالبی از این ایشون منتشر کنم ...
-سوال: لطفا خودتان را معرفی کنید.
-جواب: من در ۱۶ نوامبر 1950 در مسکو متولد شدم و در دانشگاه Moscow State رشته ریاضی خواندم. اما هرگز ریاضیدان نشدم. چیزهایی مثل اعداد Tamagawa ، گروههای Coxeter و ... که به نظر می رسد در آنها متخصص باشم مرا شگفت زده نکرده اند. آرزوی هاردی که ریاضیات او هیچ گاه کاربردی نخواهد شددر مورد من صدق نمی کند. من به یک چیز واقعی تری نیاز داشتم. البته خوش شانس بودم که در کارم ریاضیدانان بزرگی را دیدم تا نسبت به سخت گیری شبه ریاضی که متاسفانه در علوم کامپیوتر رایج است ایمن شوم. در نتیجه برنامه نویس شدن برای من چیز خوبی بوده است. در سال 1972 عضو تیمی شدم که یک مینی کامپیوتر جدید را برای کنترل ایستگاههای انتقال نیروی برق آبی طراحی می کرد. من در تمام مراحل طراحی، از تست معماری و سخت افزار تا سیستم عامل (اولین مقاله چاپ شده من در مورد سیستم عاملهای زمان واقعی بود) و ابزارهای برنامه نویسی مشارکت داشتم. من به طور عملی در مورد قابلیت اطمینان (ایستگاههای نیرو به سختی reboot می شوند) و کارایی (آب لحظه به لحظه پایین می ریزد) نرم افزار یاد گرفتم.
در همان زمان کتابهای دو دانشمند کامپیوتر را دیدم که از آنها اساس و پایه علمی کار من شکل گرفت: Donald Knuth و Edsger Dijkstra. که Knuth پاسخها را به من آموخت و Dijkstra هم سوال را به من آموخت. در مواقع مختلف باز به آثار این دو مراجعه می کنم تا به بینشهای جدید دست پیدا کنم. مسیر بعدی زندگی من این بود که 5 سال در بخش علوم کامپیوتر مرکز تحقیقات جنرال الکتریک، سپری کردم. من روی یک زبان بسیار سطح بالا به نام Tecton کار کردم و خیلی مطالعه کردم: از تعداد زیادی مقاله در مورد طراحی زبان برنامه نویسی بگیرید تا کتاب جمع منطق از ویلیام اکام- ارسطو .منطقیان قرون وسطی در مورد انواع مختلف ساختارهای منطقی که در زبانهای طبیعی وجود دارد و خصوصیات رسمی آنها دانش زیادی داشتند. همان موقع من به همراه Dave Musser یک تحقیق مثمر ثمر انجام دادم که هنوز تمرات آن را مشاهده می کنم. در سال 1984 من استادیار دانشگاه پلی تکنیک در بروکلین شدم. تدریس علوم کامپیوتر نتایج خیلی خوب برای من داشت- برنامه ریختم که انواع درسهای دوره تحصیلات تکمیلی را تدریس کنم که باعث می شد مطالب زیاد در مورد مسائل روز یاد بگیرم. همچنین کتابخانه بزرگی از الگوریتم و ساختمان داده به زبان Scheme ایجاد کردم. که (به همراه Dave Musser) منجر به ایجاد کتابخانه عام Ada شد. بعد از مدت کوتاه که در آزمایشگاههای Bell بودم ـ که روی کتابخانه ای از الگوریتمه به زبان ++C کار کردم ـ در 1988 به آزمایشگاه HP رفتم. ۴ سال بعد را صرف کار بر روی سیستمهای ذخیره کردم: مجبور شدم برنامه نویسی کنترلر دیسک را یاد بگیرم. در سال 1993 فرصت کوتاهی پیدا کردم تا به مطالعه ام روی برنامه نویسی عام بازگردم. که نتیجه آن STL شد. در 1995 به Silicon Graphics رفتم که در پی تشکیل گروهی جهت کار بیشتر روی توسعه STL بودم.
-سوال: شما از ویلیام اکام نام بردید. وی می گوید Entia non sunt multiplicanda . می تونم این جمله به این صورت ترجمه کنم که نیازی به اشیاء [انتزاعی] نیست. به نظر می رسد که این تیغ اکام را به برنامه نویسی شیء گرا OOP اعمال کردید. اینکه از به جای اشیاء از الگوریتم ها شروع کنیم به نوعی «مساله کلیات» مربوط به قرون وسطی را به ذهن متبادر می کند. درسته؟
-جواب: شباهت خوبی وجود دارد ولی فکر نمی کنم درست باشد. من فکر نمی کنم که شیء گرایی ربطی به فلسفه رئالیسم داشته باشد من به هیچ وجه «نام گرا» (nomilalist) نیستم. در واقع مکتب فرانسیسکن ـ با متفکرانی مثل Alexander of Hales و Bonaventure و Scotus ـ به سنت آگوستین/افلاطون نزدیکتر است. در هر صورت اکام آدم عجیبی بود. به طوری که Gideon Gal ویرایشگر مجموعه کامل او می گوید: اما آدم دیوانه ای بود!
-سوال: برای بسیاری از مخاطبان ایتالیایی اسم "Stepanov" با STL همراه است. آیا STL به معنای Standard Template Library است یا STepanov and Lee؟ و در تاریخچه STL نقش D.Musser و A.Koenig چه بوده است؟
-جواب: بله معنای درستش همان Standard Template Library است. من در مصاحبه با مجله Dr. Dobb در خصوص STL یک شوخی کردم که STL به معنای STepanov and Lee است اما این یک شوخی بود. من به مدت تقریبا ۲۰ سال با Dave Musser همکار بودم. همکاریمان آنقدر نزدیک بود که سخت است که سهم هر کدام از ما در نوشتن STL مشخص بشود. او در لیست رسمی مولفان STL قرار ندارد چونکه در مدت کوتاهی که پروپوزال کتابخانه برای استاندارد تهیه می شد مشغول کار دیگری بود. نقش Andy Koenig هم این بود که ماشین انتزاعی C را برای من تشریح کرد. STL به نوعی کاربرد تکنیکهای برنامه نویسی عام (generic programming) بود که Dave Musser و من برای یک مدل ماشین C توسعه داده بودیم. اگر Andy نبود من با اشیاء بسته بندی شده (boxed) و در heap قرار گرفته کارم را انجام می دادم و به خاطر جمع آوری زباله (garbage collection) تحلیل می رفتم. و مطمئنا Andy و Bjarne Stroustrup نقششان جا انداختن STL در استاندارد بود. وقتی که در مرحله ای لازم شد از ایده های زیبا به سمت پیاده سازی کامل برویم خانم Meng Lee به عنوان یک همکار کامل نقش ایفا کرد. او به من کمک می کرد تمرکز داشته باشم ـ من معمولا وقتی مساله ای حل شد علاقه ام را از دست می دهم ـ اگ جواب مساله را بدانم چه لزومی دارد که جوابش را به بقیه بگویم. او زمانهای خسته کننده ای را صرف کد و مستندات کرد. به نوعی او تنها فردی بود که از این کار یک چیز عملی بیرون خواهد آمد. فکر کنم در آن زمان، هم Dave Musser و هم من از اینکه کارهای طولانی مدتمان را به بقیه توضیح بدهیم واقعا نا امید شده بودیم.
-سوال: ریشه STL چیست؟ آیا STL از همان اول همان کتابخانه استاندارد ++C بوده یا از پروژه دیگری آمده؟ لطفا تاریخچه STL را شرح دهید. در سال 1976 ـ که در شوروی بودم ـ به خاطر خوردن ماهی خام دچار مسمومیت شدید غذایی شدم. در بیمارستان در حالت هذیان یکدفعه فهمیدم که اینکه می شود اعداد را به صورت موزی جمع کرد به این مربوط است که «جمع» یک عملیات شرکت پذیر (associative) است. ( پس به زبان ساده، STL نتیجه یک عفونت باکتریایی است). به عبارت دیگر فهمیدم که الگوریت تقلیل (reduction) موازی با یک نوع ساختار جبری نیم-گروه (semigroup) مرتبط است. نکته اساسی این است: الگوریتمها بر پایه ساختارهای جبری تعریف می شوند. چندین سال دیگر هم طول کشید تا بفهمم که لازم است مفهوم ساختار را گسترش بدهیم که این گسترش به این صورت انجام می شود که بیاییم به اصول موضوعه معمولی، شرط پیچیدگی زمانی را هم اضافه کنیم. بعد، 15 سال طول کشید که این فکر عملی بشود. (هنوز هم مطمئن نیستم که توانسته باشم این نکات را به جز حلقه دوستان نزدیکم به کس دیگری توضیح بدهم ). من بر این باورم که همان طور که نظریه حلقه ها یا فضای باناخ در کانون ریاضیات قرار دارند به همان میزان هم نظریه تکرارگرها (iterator) در کانون علوم کامپیوتر قرار دارد. هر وقت به یک الگوریتم نگاه می کنم سعی می کنم ساختمانی که الگوریتم برپایه آن تعریف شده را پیدا کنم. بنابراین آنچه که می خواستم انجام دهم عبارت بود از تشریح الگوریتمها به صورت عام. این چیزی است که دوست دارم. من می توانم یک ماه بر روی یک الگوریتم کاملا شناخته شده کار کنم تا بتوانم نمایش عام آن را پیدا کنم. خب من برای اینکه به دیگران توضیح بدهم که این یک کار مهم است ناموفق بودم. در عین حال نتایج این کار یعنی STL کاملا موفق شد.
-سوال: من اینطور فکر می کردم که شما ملزومات و شرایط پیچیدگی زمانی که در STL قرار دادید برای این بوده که محدودیت و شروطی را برای کارایی کتابخانه پیاده سازی شده گذاشته باشید. ام به نظر می رسد شما منظورتان این است که پیچیدگی از ملزومات کارکردی است. این درست است؟
-جواب: ما الگوریتم های مختلف را با توجه به عملیات های اساسی که ساختمان داده ارائه می کند انتخاب می کنیم. دیسک و نوار از نظر کارکردی مثل ادوات ذخیره SCSI هستند اما برای طراح نرم افزاری که بخواهد از نوار به منزله دیسک استفاده کند دردسرساز می شود. از نظر STL همیشه می شود تکرارگر جلو رونده (forward iterators) را با پیچیدگی p + n پیاده سازی کرد اما چرا تکرارگر با دسترسی تصادفی (random access iterator) استفاده نشود؟
-سوال: در مورد برنامه نویسی عام صحبت کنیم. من در مورد برنامه نویسی عام فقط ستونی نوشته A.Koenig در مجله JOOP یافتم. برنامه نویسی عام در بیشتر کتابهای برنامه نویسی ++C مثل کتابهای Coplien و Meyer و Stroustrup و Lippman و ... وجود ندارد. به نظرم STL را به این شکل تعریف کنیم : «برنامه نویسی ++C به روشی که شما هرگز فکر نمی کردید امکان پذیر باشد». آیا با این نظر موافقید؟
حداقل از نظر من STL تنها روش ممکن برای برنامه نویسی است. در نتیجه با برنامه نویسی ++C که تا به حال در کتابها شرح داده می شده و می شود کاملا متفاوت است. من مدت طولانی در جستجوی زبانی بوده ام که با آن بتوانم آن چیزی را که خواسته من است بیان کنم. به عبارت دیگر من می دانم که چه می خواهم بیان کنم. من می توانم بگویم آن چیز در ++C است یا در Ada یا در Scheme. من خودم را بازبان تطبیق می دهم. اما اساس آن چیزی که می خواهم بگویم مستقل از زبان است. تا کنون ++C بهترین زبانی بوده که جهت بیان خواسته هایم یافته ام. این زبان یک رسانه ایده آل نیست اما در آن می توانم نسبت به تمام زبانهایی که امتحان کرده ام کارهای بیشتری انجام دهم. و واقعا امیدوارم روزی برسد که زبانی صرفا جهت برنامه نویسی عام طراحی شود.
-سوال: آیا ممکن است برای یک برنامه نویس ++C مبتدی توضیح دهید که برنامه نویسی عام چیست؟ ارتباط بین برنامه نویسی عام با ++C و STL چیست و چگونه شد که شما برنامه نویسی عام را در چارچوب ++C مورد استفاده قرار دادید.
-جواب: برنامه نویسس عام یک روش برنامه نویسی است که برپایه یافتن انتزاعی ترین شکل الگوریتم های با کارایی بالا می باشد. یعنی شما یک الگوریتم دارید و سپس کلی ترین مجموعه ملزومات را پیدا می کنید تا الگوریتم به وسیله آن اجرا شود و اجرای آن با کارایی بالا باشد. نکته جالب این است که بسیاری از الگوریتمهای متفاوت به ملزومات یکسانی نیاز دارند و برای این ملزومات، چندین پیاده سازی وجود دارد. مشابه همین موضوع در ریاضیات این است که بسیاری از قضایای متفاوت، به اصول موضوعه یکسانی وابسته هستند و برای هر کدام از این اصول، مدلهای مختلف زیادی وجود دارد. انتزاع، کار می کند! برنامه نویسی عام، فرض می گیرد که تعدادی قانون اصلی وجود دارد که بر رفتار کامپوننتهای نرم افزاری حاکم هستند و می توان بر اسا اسن قوانین، ماژولهای مرتبط با هم طراحی کرد. همچنین می توان از این قوانین، برای جهت دهی طراحی نرم افزار استفاده کرد. STL نمونه ای از برنامه نویسی عام است. ++C زبانی است که در آن توانستم یک مثال متقاعدکننده [STL] ارائه کنم.
-سوال: من فکر می کنم که STL و برنامه نویسی عام، نشانه یک گردش از سبک رایج برنامه نویسی ++C ـ که فکر کنم به طور کامل برگرفته از SmallTalk است ـ می باشد. آیا موافقید؟
-جواب: درسته. STL شیء گرا نیست. من فکر می کنم شیء گرایی مثل هوش مصنوعی (AI) یک خالی بندی است. من هنوز یک تکه کد به درد بخور از افراد شیء گرا ندیدم. من چیزهای زیادی از اعضای MIT AI Lab دیدم، آنها تعدادی کار واقعااساسی انجام داده اند. Hakmem که کار Bill Gosper است یکی از بهترین چیزهاست که برنامه نویسان می توانند مطالعه کنند. AI ممکنه که اساس جدی نداشته باشد اما چیزهایی مثل اینها را ایجاد کرده است: Emacs اثر Gosper و Stallman یا Macsyma اثر Moses یا Scheme اثر Sussman و Guy Steele. به نظر من برنامه نویسی شیء گرا (OOP) از لحاظ تکنیکی بی اساس است. این روش سعی می کند جهان را تجزیه کند به رابط های مختلف برای یک نوع. برای مسائل واقعی نیاز به جبر با چندین نوع (multisorted algebras) ـ خانواده ای از رابط ها چندین نوع را بسط می دهند ـ می باشد. من OOP را از نظر فلسفی بی اساس می دانم. در آن ادعا می شود هر چیزی یک Object است. حتی اگر این حرف درست باشد خیلی جالب نیست. اینکه بگوییم هرچیزی یک Object است مثل این است که اصلا چیزی نگوییم . به نظر من OOP از لحاظ روش شناسی اشتباه است. در این روش از کلاسها آغاز می کنیم. مثل این است که ریاضیدانان با اصول موضوعه شروع کنند. ما با اصول موضوعه شروع نمی کنیم بلکه با اثبات شروع می کنیم. تنها زمانی که ما تعدادی اثبات مرتبط را یافتیم می توانیم اصول موضوعه را بیاوریم. ما با اصول موضوعه، تمام می کنیم. همین موضوع در مورد برنامه نویسی هم صدق می کند: ما باید با الگوریتم مورد نظر آغاز کنیم. وفقط زمانی که الگوریتم را خوب فهمیدیم، می توانیم رابطهایی را بیاوریم که با آن الگوریتم به کار بیفتد.
-سوال: این برداشت من از افکار شما درست است؟ «یافتن ساختمان داده [عام] در یک الگوریتم» به جای «یافتن الگوریتم ها [ی مجازی] داخل یک Object».
-جواب: درسته. همیشه با الگوریتم شروع می کنیم.
-سوال: این به تغییر جدی تفکر از دو نوع فکر دستوری (imperative) و شیء گرا می باشد. مزایای و معایب این روش نسبت به روش «استاندارد» برنامه نویسی شیء گرا که در SmallTalk یا Java انجام می شود چیست؟
-جواب: روش من کار می کند ولی این روشها کار نمی کند. مثلا یک چیز ساده مثل max را می خواهیم با روش شیء گرا پیاده سازی کنیم که من این کار را بلد نیستم اما با روش برنامه نویسی عام می توانم بنویسم:
template <class StrictWeakOrdered>
inline StrictWeakOrdered& max(StrictWeakOrdered& x,
StrictWeakOrdered& y) {
return x < y ? y : x;
}
و
template <class StrictWeakOrdered>
inline const StrictWeakOrdered& max(const StrictWeakOrdered& x,
const StrictWeakOrdered& y) {
return x < y ? y : x;
}
(که البته نیازی به & یا &const نیست). و مثلا بعدا StrictWeakOrdered را تعریف می کنیم. حالا این را بخواهیم در Java انجام بدهیم. در Java نمی شود یک max عام نوشت که دو آرگومان از یک نوع دریافت کند و مقدار بازگشتی آن هم از همان نوع باشد. وراثت و interface ها کمکی نمی کنند. حالا اگر نشود max یا swap یا جستجوی خطی را پیاده سازی کرد چه شانسی وجود دارد که بشود مسائل واقعا پیچیده را پیاده سازی کرد؟ من آزمایش لیتموس را به این صورت انجام می دهم: اگر زبانی امکان پیاده سازی max و swap و جستجوی خطی را به من بدهد پس قابلیت هایی دارد.
-سوال: Java یک زبان خیلی نو است که هنوز template را ندارد که مانع از برنامه نویسی عام می شود. هر چیزی باید کلاس باشد. نظر شما درباره Java چیست؟
-جواب: من چندین ماه را صرف برنامه نویسی Java کرده ام. بر خلاف پیش بینی مولفان آن، من را رشد نداد. من بینش جدیدی نیافتم ـ در تمام دوران برنامه نویسی خودم برای اولین بار بود که یک زبان جدید (Java) بینش جدیدی برایم حاصل نکرد. این زبان تمام چیزهایی که در ++C استفاده نمی کنم نگه داشته ـ مثل وراثت، چیزهای مجازی (یعنی چیزهای مربوط به شیء گرایی)ـ و چیزهایی که برای من مفید بود را حذف کرده. ممکن است موفق بوده باشد ـ همان طور که MS DOS موفق بود ـ و ممکن است برای تمام مخاطبان شما یاد گرفتن Java منفعت داشته باشد اما ارزش فکری ندارد. به پیاده سازی hash table آن نگاهی بیندازید. به روالهای مرتب سازی آن که با اپلت cool" sorting" آن آمده نگاهی بیندازید. سعی کنید از AWT استفاده کنید. بهترین روش برای قضاوت درمورد یک زبان این است که به کدهایی که توسط طرفداران آن نوشته شده نگاه بیندازید. "Radix enim omnium malorum est cupiditas" (طمع [پول] سرمنشا تمام شرها است) و Java نمونه ای از برنامه نویسی پول گرا است (money oriented programming MOP). به طوری که طرفدار اصلی Java در شرکت SGI به من گفت: الکس شما باید هر جا پول باشد همان جا بروی. ولی من نمی خواهم هر جا پول باشد آنجا بروم ـ معمولا آنجا بوی خوشی نمی آید.
-سوال: لطفا خودتان را معرفی کنید.
-جواب: من در ۱۶ نوامبر 1950 در مسکو متولد شدم و در دانشگاه Moscow State رشته ریاضی خواندم. اما هرگز ریاضیدان نشدم. چیزهایی مثل اعداد Tamagawa ، گروههای Coxeter و ... که به نظر می رسد در آنها متخصص باشم مرا شگفت زده نکرده اند. آرزوی هاردی که ریاضیات او هیچ گاه کاربردی نخواهد شددر مورد من صدق نمی کند. من به یک چیز واقعی تری نیاز داشتم. البته خوش شانس بودم که در کارم ریاضیدانان بزرگی را دیدم تا نسبت به سخت گیری شبه ریاضی که متاسفانه در علوم کامپیوتر رایج است ایمن شوم. در نتیجه برنامه نویس شدن برای من چیز خوبی بوده است. در سال 1972 عضو تیمی شدم که یک مینی کامپیوتر جدید را برای کنترل ایستگاههای انتقال نیروی برق آبی طراحی می کرد. من در تمام مراحل طراحی، از تست معماری و سخت افزار تا سیستم عامل (اولین مقاله چاپ شده من در مورد سیستم عاملهای زمان واقعی بود) و ابزارهای برنامه نویسی مشارکت داشتم. من به طور عملی در مورد قابلیت اطمینان (ایستگاههای نیرو به سختی reboot می شوند) و کارایی (آب لحظه به لحظه پایین می ریزد) نرم افزار یاد گرفتم.
در همان زمان کتابهای دو دانشمند کامپیوتر را دیدم که از آنها اساس و پایه علمی کار من شکل گرفت: Donald Knuth و Edsger Dijkstra. که Knuth پاسخها را به من آموخت و Dijkstra هم سوال را به من آموخت. در مواقع مختلف باز به آثار این دو مراجعه می کنم تا به بینشهای جدید دست پیدا کنم. مسیر بعدی زندگی من این بود که 5 سال در بخش علوم کامپیوتر مرکز تحقیقات جنرال الکتریک، سپری کردم. من روی یک زبان بسیار سطح بالا به نام Tecton کار کردم و خیلی مطالعه کردم: از تعداد زیادی مقاله در مورد طراحی زبان برنامه نویسی بگیرید تا کتاب جمع منطق از ویلیام اکام- ارسطو .منطقیان قرون وسطی در مورد انواع مختلف ساختارهای منطقی که در زبانهای طبیعی وجود دارد و خصوصیات رسمی آنها دانش زیادی داشتند. همان موقع من به همراه Dave Musser یک تحقیق مثمر ثمر انجام دادم که هنوز تمرات آن را مشاهده می کنم. در سال 1984 من استادیار دانشگاه پلی تکنیک در بروکلین شدم. تدریس علوم کامپیوتر نتایج خیلی خوب برای من داشت- برنامه ریختم که انواع درسهای دوره تحصیلات تکمیلی را تدریس کنم که باعث می شد مطالب زیاد در مورد مسائل روز یاد بگیرم. همچنین کتابخانه بزرگی از الگوریتم و ساختمان داده به زبان Scheme ایجاد کردم. که (به همراه Dave Musser) منجر به ایجاد کتابخانه عام Ada شد. بعد از مدت کوتاه که در آزمایشگاههای Bell بودم ـ که روی کتابخانه ای از الگوریتمه به زبان ++C کار کردم ـ در 1988 به آزمایشگاه HP رفتم. ۴ سال بعد را صرف کار بر روی سیستمهای ذخیره کردم: مجبور شدم برنامه نویسی کنترلر دیسک را یاد بگیرم. در سال 1993 فرصت کوتاهی پیدا کردم تا به مطالعه ام روی برنامه نویسی عام بازگردم. که نتیجه آن STL شد. در 1995 به Silicon Graphics رفتم که در پی تشکیل گروهی جهت کار بیشتر روی توسعه STL بودم.
-سوال: شما از ویلیام اکام نام بردید. وی می گوید Entia non sunt multiplicanda . می تونم این جمله به این صورت ترجمه کنم که نیازی به اشیاء [انتزاعی] نیست. به نظر می رسد که این تیغ اکام را به برنامه نویسی شیء گرا OOP اعمال کردید. اینکه از به جای اشیاء از الگوریتم ها شروع کنیم به نوعی «مساله کلیات» مربوط به قرون وسطی را به ذهن متبادر می کند. درسته؟
-جواب: شباهت خوبی وجود دارد ولی فکر نمی کنم درست باشد. من فکر نمی کنم که شیء گرایی ربطی به فلسفه رئالیسم داشته باشد من به هیچ وجه «نام گرا» (nomilalist) نیستم. در واقع مکتب فرانسیسکن ـ با متفکرانی مثل Alexander of Hales و Bonaventure و Scotus ـ به سنت آگوستین/افلاطون نزدیکتر است. در هر صورت اکام آدم عجیبی بود. به طوری که Gideon Gal ویرایشگر مجموعه کامل او می گوید: اما آدم دیوانه ای بود!
-سوال: برای بسیاری از مخاطبان ایتالیایی اسم "Stepanov" با STL همراه است. آیا STL به معنای Standard Template Library است یا STepanov and Lee؟ و در تاریخچه STL نقش D.Musser و A.Koenig چه بوده است؟
-جواب: بله معنای درستش همان Standard Template Library است. من در مصاحبه با مجله Dr. Dobb در خصوص STL یک شوخی کردم که STL به معنای STepanov and Lee است اما این یک شوخی بود. من به مدت تقریبا ۲۰ سال با Dave Musser همکار بودم. همکاریمان آنقدر نزدیک بود که سخت است که سهم هر کدام از ما در نوشتن STL مشخص بشود. او در لیست رسمی مولفان STL قرار ندارد چونکه در مدت کوتاهی که پروپوزال کتابخانه برای استاندارد تهیه می شد مشغول کار دیگری بود. نقش Andy Koenig هم این بود که ماشین انتزاعی C را برای من تشریح کرد. STL به نوعی کاربرد تکنیکهای برنامه نویسی عام (generic programming) بود که Dave Musser و من برای یک مدل ماشین C توسعه داده بودیم. اگر Andy نبود من با اشیاء بسته بندی شده (boxed) و در heap قرار گرفته کارم را انجام می دادم و به خاطر جمع آوری زباله (garbage collection) تحلیل می رفتم. و مطمئنا Andy و Bjarne Stroustrup نقششان جا انداختن STL در استاندارد بود. وقتی که در مرحله ای لازم شد از ایده های زیبا به سمت پیاده سازی کامل برویم خانم Meng Lee به عنوان یک همکار کامل نقش ایفا کرد. او به من کمک می کرد تمرکز داشته باشم ـ من معمولا وقتی مساله ای حل شد علاقه ام را از دست می دهم ـ اگ جواب مساله را بدانم چه لزومی دارد که جوابش را به بقیه بگویم. او زمانهای خسته کننده ای را صرف کد و مستندات کرد. به نوعی او تنها فردی بود که از این کار یک چیز عملی بیرون خواهد آمد. فکر کنم در آن زمان، هم Dave Musser و هم من از اینکه کارهای طولانی مدتمان را به بقیه توضیح بدهیم واقعا نا امید شده بودیم.
-سوال: ریشه STL چیست؟ آیا STL از همان اول همان کتابخانه استاندارد ++C بوده یا از پروژه دیگری آمده؟ لطفا تاریخچه STL را شرح دهید. در سال 1976 ـ که در شوروی بودم ـ به خاطر خوردن ماهی خام دچار مسمومیت شدید غذایی شدم. در بیمارستان در حالت هذیان یکدفعه فهمیدم که اینکه می شود اعداد را به صورت موزی جمع کرد به این مربوط است که «جمع» یک عملیات شرکت پذیر (associative) است. ( پس به زبان ساده، STL نتیجه یک عفونت باکتریایی است). به عبارت دیگر فهمیدم که الگوریت تقلیل (reduction) موازی با یک نوع ساختار جبری نیم-گروه (semigroup) مرتبط است. نکته اساسی این است: الگوریتمها بر پایه ساختارهای جبری تعریف می شوند. چندین سال دیگر هم طول کشید تا بفهمم که لازم است مفهوم ساختار را گسترش بدهیم که این گسترش به این صورت انجام می شود که بیاییم به اصول موضوعه معمولی، شرط پیچیدگی زمانی را هم اضافه کنیم. بعد، 15 سال طول کشید که این فکر عملی بشود. (هنوز هم مطمئن نیستم که توانسته باشم این نکات را به جز حلقه دوستان نزدیکم به کس دیگری توضیح بدهم ). من بر این باورم که همان طور که نظریه حلقه ها یا فضای باناخ در کانون ریاضیات قرار دارند به همان میزان هم نظریه تکرارگرها (iterator) در کانون علوم کامپیوتر قرار دارد. هر وقت به یک الگوریتم نگاه می کنم سعی می کنم ساختمانی که الگوریتم برپایه آن تعریف شده را پیدا کنم. بنابراین آنچه که می خواستم انجام دهم عبارت بود از تشریح الگوریتمها به صورت عام. این چیزی است که دوست دارم. من می توانم یک ماه بر روی یک الگوریتم کاملا شناخته شده کار کنم تا بتوانم نمایش عام آن را پیدا کنم. خب من برای اینکه به دیگران توضیح بدهم که این یک کار مهم است ناموفق بودم. در عین حال نتایج این کار یعنی STL کاملا موفق شد.
-سوال: من اینطور فکر می کردم که شما ملزومات و شرایط پیچیدگی زمانی که در STL قرار دادید برای این بوده که محدودیت و شروطی را برای کارایی کتابخانه پیاده سازی شده گذاشته باشید. ام به نظر می رسد شما منظورتان این است که پیچیدگی از ملزومات کارکردی است. این درست است؟
-جواب: ما الگوریتم های مختلف را با توجه به عملیات های اساسی که ساختمان داده ارائه می کند انتخاب می کنیم. دیسک و نوار از نظر کارکردی مثل ادوات ذخیره SCSI هستند اما برای طراح نرم افزاری که بخواهد از نوار به منزله دیسک استفاده کند دردسرساز می شود. از نظر STL همیشه می شود تکرارگر جلو رونده (forward iterators) را با پیچیدگی p + n پیاده سازی کرد اما چرا تکرارگر با دسترسی تصادفی (random access iterator) استفاده نشود؟
-سوال: در مورد برنامه نویسی عام صحبت کنیم. من در مورد برنامه نویسی عام فقط ستونی نوشته A.Koenig در مجله JOOP یافتم. برنامه نویسی عام در بیشتر کتابهای برنامه نویسی ++C مثل کتابهای Coplien و Meyer و Stroustrup و Lippman و ... وجود ندارد. به نظرم STL را به این شکل تعریف کنیم : «برنامه نویسی ++C به روشی که شما هرگز فکر نمی کردید امکان پذیر باشد». آیا با این نظر موافقید؟
حداقل از نظر من STL تنها روش ممکن برای برنامه نویسی است. در نتیجه با برنامه نویسی ++C که تا به حال در کتابها شرح داده می شده و می شود کاملا متفاوت است. من مدت طولانی در جستجوی زبانی بوده ام که با آن بتوانم آن چیزی را که خواسته من است بیان کنم. به عبارت دیگر من می دانم که چه می خواهم بیان کنم. من می توانم بگویم آن چیز در ++C است یا در Ada یا در Scheme. من خودم را بازبان تطبیق می دهم. اما اساس آن چیزی که می خواهم بگویم مستقل از زبان است. تا کنون ++C بهترین زبانی بوده که جهت بیان خواسته هایم یافته ام. این زبان یک رسانه ایده آل نیست اما در آن می توانم نسبت به تمام زبانهایی که امتحان کرده ام کارهای بیشتری انجام دهم. و واقعا امیدوارم روزی برسد که زبانی صرفا جهت برنامه نویسی عام طراحی شود.
-سوال: آیا ممکن است برای یک برنامه نویس ++C مبتدی توضیح دهید که برنامه نویسی عام چیست؟ ارتباط بین برنامه نویسی عام با ++C و STL چیست و چگونه شد که شما برنامه نویسی عام را در چارچوب ++C مورد استفاده قرار دادید.
-جواب: برنامه نویسس عام یک روش برنامه نویسی است که برپایه یافتن انتزاعی ترین شکل الگوریتم های با کارایی بالا می باشد. یعنی شما یک الگوریتم دارید و سپس کلی ترین مجموعه ملزومات را پیدا می کنید تا الگوریتم به وسیله آن اجرا شود و اجرای آن با کارایی بالا باشد. نکته جالب این است که بسیاری از الگوریتمهای متفاوت به ملزومات یکسانی نیاز دارند و برای این ملزومات، چندین پیاده سازی وجود دارد. مشابه همین موضوع در ریاضیات این است که بسیاری از قضایای متفاوت، به اصول موضوعه یکسانی وابسته هستند و برای هر کدام از این اصول، مدلهای مختلف زیادی وجود دارد. انتزاع، کار می کند! برنامه نویسی عام، فرض می گیرد که تعدادی قانون اصلی وجود دارد که بر رفتار کامپوننتهای نرم افزاری حاکم هستند و می توان بر اسا اسن قوانین، ماژولهای مرتبط با هم طراحی کرد. همچنین می توان از این قوانین، برای جهت دهی طراحی نرم افزار استفاده کرد. STL نمونه ای از برنامه نویسی عام است. ++C زبانی است که در آن توانستم یک مثال متقاعدکننده [STL] ارائه کنم.
-سوال: من فکر می کنم که STL و برنامه نویسی عام، نشانه یک گردش از سبک رایج برنامه نویسی ++C ـ که فکر کنم به طور کامل برگرفته از SmallTalk است ـ می باشد. آیا موافقید؟
-جواب: درسته. STL شیء گرا نیست. من فکر می کنم شیء گرایی مثل هوش مصنوعی (AI) یک خالی بندی است. من هنوز یک تکه کد به درد بخور از افراد شیء گرا ندیدم. من چیزهای زیادی از اعضای MIT AI Lab دیدم، آنها تعدادی کار واقعااساسی انجام داده اند. Hakmem که کار Bill Gosper است یکی از بهترین چیزهاست که برنامه نویسان می توانند مطالعه کنند. AI ممکنه که اساس جدی نداشته باشد اما چیزهایی مثل اینها را ایجاد کرده است: Emacs اثر Gosper و Stallman یا Macsyma اثر Moses یا Scheme اثر Sussman و Guy Steele. به نظر من برنامه نویسی شیء گرا (OOP) از لحاظ تکنیکی بی اساس است. این روش سعی می کند جهان را تجزیه کند به رابط های مختلف برای یک نوع. برای مسائل واقعی نیاز به جبر با چندین نوع (multisorted algebras) ـ خانواده ای از رابط ها چندین نوع را بسط می دهند ـ می باشد. من OOP را از نظر فلسفی بی اساس می دانم. در آن ادعا می شود هر چیزی یک Object است. حتی اگر این حرف درست باشد خیلی جالب نیست. اینکه بگوییم هرچیزی یک Object است مثل این است که اصلا چیزی نگوییم . به نظر من OOP از لحاظ روش شناسی اشتباه است. در این روش از کلاسها آغاز می کنیم. مثل این است که ریاضیدانان با اصول موضوعه شروع کنند. ما با اصول موضوعه شروع نمی کنیم بلکه با اثبات شروع می کنیم. تنها زمانی که ما تعدادی اثبات مرتبط را یافتیم می توانیم اصول موضوعه را بیاوریم. ما با اصول موضوعه، تمام می کنیم. همین موضوع در مورد برنامه نویسی هم صدق می کند: ما باید با الگوریتم مورد نظر آغاز کنیم. وفقط زمانی که الگوریتم را خوب فهمیدیم، می توانیم رابطهایی را بیاوریم که با آن الگوریتم به کار بیفتد.
-سوال: این برداشت من از افکار شما درست است؟ «یافتن ساختمان داده [عام] در یک الگوریتم» به جای «یافتن الگوریتم ها [ی مجازی] داخل یک Object».
-جواب: درسته. همیشه با الگوریتم شروع می کنیم.
-سوال: این به تغییر جدی تفکر از دو نوع فکر دستوری (imperative) و شیء گرا می باشد. مزایای و معایب این روش نسبت به روش «استاندارد» برنامه نویسی شیء گرا که در SmallTalk یا Java انجام می شود چیست؟
-جواب: روش من کار می کند ولی این روشها کار نمی کند. مثلا یک چیز ساده مثل max را می خواهیم با روش شیء گرا پیاده سازی کنیم که من این کار را بلد نیستم اما با روش برنامه نویسی عام می توانم بنویسم:
template <class StrictWeakOrdered>
inline StrictWeakOrdered& max(StrictWeakOrdered& x,
StrictWeakOrdered& y) {
return x < y ? y : x;
}
و
template <class StrictWeakOrdered>
inline const StrictWeakOrdered& max(const StrictWeakOrdered& x,
const StrictWeakOrdered& y) {
return x < y ? y : x;
}
(که البته نیازی به & یا &const نیست). و مثلا بعدا StrictWeakOrdered را تعریف می کنیم. حالا این را بخواهیم در Java انجام بدهیم. در Java نمی شود یک max عام نوشت که دو آرگومان از یک نوع دریافت کند و مقدار بازگشتی آن هم از همان نوع باشد. وراثت و interface ها کمکی نمی کنند. حالا اگر نشود max یا swap یا جستجوی خطی را پیاده سازی کرد چه شانسی وجود دارد که بشود مسائل واقعا پیچیده را پیاده سازی کرد؟ من آزمایش لیتموس را به این صورت انجام می دهم: اگر زبانی امکان پیاده سازی max و swap و جستجوی خطی را به من بدهد پس قابلیت هایی دارد.
-سوال: Java یک زبان خیلی نو است که هنوز template را ندارد که مانع از برنامه نویسی عام می شود. هر چیزی باید کلاس باشد. نظر شما درباره Java چیست؟
-جواب: من چندین ماه را صرف برنامه نویسی Java کرده ام. بر خلاف پیش بینی مولفان آن، من را رشد نداد. من بینش جدیدی نیافتم ـ در تمام دوران برنامه نویسی خودم برای اولین بار بود که یک زبان جدید (Java) بینش جدیدی برایم حاصل نکرد. این زبان تمام چیزهایی که در ++C استفاده نمی کنم نگه داشته ـ مثل وراثت، چیزهای مجازی (یعنی چیزهای مربوط به شیء گرایی)ـ و چیزهایی که برای من مفید بود را حذف کرده. ممکن است موفق بوده باشد ـ همان طور که MS DOS موفق بود ـ و ممکن است برای تمام مخاطبان شما یاد گرفتن Java منفعت داشته باشد اما ارزش فکری ندارد. به پیاده سازی hash table آن نگاهی بیندازید. به روالهای مرتب سازی آن که با اپلت cool" sorting" آن آمده نگاهی بیندازید. سعی کنید از AWT استفاده کنید. بهترین روش برای قضاوت درمورد یک زبان این است که به کدهایی که توسط طرفداران آن نوشته شده نگاه بیندازید. "Radix enim omnium malorum est cupiditas" (طمع [پول] سرمنشا تمام شرها است) و Java نمونه ای از برنامه نویسی پول گرا است (money oriented programming MOP). به طوری که طرفدار اصلی Java در شرکت SGI به من گفت: الکس شما باید هر جا پول باشد همان جا بروی. ولی من نمی خواهم هر جا پول باشد آنجا بروم ـ معمولا آنجا بوی خوشی نمی آید.