انجمن انفورماتیک ایران انجمن انفورماتیک ایران انجمن انفورماتیک ایران
گزارش کامپیوتر شماره 234, ویژه مرداد و شهریور ماه 96 منتشر شد. شنبه  ٢٧/٠٨/١٣٩٦ ساعت ١٥:٢٣
 

پیدایش مهندسی نرم‌افزار
از تورینگ تا دایکسترا
(بخش نخست)

نوشتۀ ادگار دِی لایت
ترجمۀ: ابراهیم نقیب‌زادۀ مشایخ

پست الکترونیکی: mashayekh@isi.org.ir

 

پیش‌گفتار مترجم
در مجلۀ CACM مربوط به ژانویۀ 2015، مقاله‌ای توجهم را جلب کرد با عنوان «اشک‌های دونالد کنوث». این مقاله که توسط توماس هِی نوشته شده بود، درواقع انتقادی بود به مطالبی که کنوث در سخنرانی خود در دانشگاه استنفورد بیان کرده بود. در آن سخنرانی، کنوث به شدّت به مقالۀ مارتین کمپبل- کلی با عنوان «تاریخِ تاریخ نرم‌افزار» تاخته بود و از این که او در مقاله‌اش سطح تاریخ رایانش و علوم کامپیوتر را این قدر پایین آورده به شدّت انتقاد کرده بود. کنوث در پایان سخنرانیش گفته بود که آنقدر از خواندن آن مقاله ناراحت و غمگین شده بود که شیشه‌های عینکش از اشک‌های چشمش لک شده بود و او به سختی توانسته خواندن مقاله را به پایان برد.
توماس هِی در مقاله‌اش ضمن تمجید از کنوث و دستاوردهای بی‌مانندش در حوزۀ رایانش، از این که کتاب‌های کمی دربارۀ تاریخ علوم کامپیوتر نوشته شده با او همداستانی کرده امّا این کوتاهی را بیشتر متوجه خود دانشمندان این رشته دانسته است. او گفته: «امروز شما می‌توانید در دانشکده‌های ریاضی و پزشکی، حقوق و چند رشتۀ دیگر مدرک دکتری بگیرید و موضوع رساله‌تان، تاریخچۀ آن رشته باشد. امّا چنین امکانی در دانشکده‌های علوم کامپیوتر وجود ندارد. من دانشکدۀ علوم کامپیوتری را در آمریکا نمی‌شناسم که کسی را که موضوع رسالۀ دکتریش، جنبه‌های تاریخی علوم کامپیوتر بوده، استخدام کرده باشد. همچنین کسی را در آمریکا نمی‌شناسم که به خاطر کارهایش در زمینۀ تاریخ علوم کامپیوتر در یک دانشکدۀ علوم کامپیوتر تشویق شده یا ارتقاء یافته باشد.»
مقالۀ 5 صفحه‌ای توماس هِی بسیار خواندنی است و علاقه‌مندان به این موضوع را به خواندن متن کامل آن توصیه می‌کنم. او دارای درجۀ کارشناسی علوم کامپیوتر از دانشگاه منچستر (1995) و دکتری تاریخ و جامعه‌شناسی علم از دانشگاه پنسیلوانیا (2003) است. امّا غرض از آوردن این مقدمه این بود که در مقالۀ مزبور به چند کار ارزشمند نیز که در این زمینه انجام شده اشاره گشته که از آن جمله، کتاب «پیدایش مهندسی نرم‌افزار: از تورینگ تا دایکسترا» نوشتۀ ادگار دِی لایت است. عنوان این کتاب برای من که نزدیک 30 سال است درس مهندسی نرم‌افزار را در دانشگاه تدریس می‌کنم، جالب بود. جستجویی در اینترنت کردم و دیدم که افراد سرشناسی چون گریدی بوچ و جان رینولدز نقدهای بسیار خوبی دربارۀ این کتاب نوشته‌اند. نویسندۀ کتاب، ادگار دِی‌لایت نیز خود دارای درجۀ کارشناسی ارشد منطق از دانشگاه آمستردام (2009) و دکتری مهندسی نرم‌افزار از دانشگاه لوون بلژیک (2006) و در حال حاضر پژوهشگر تاریخ رایانش در دورۀ پسادکتری در دانشگاه فناوری آیندهوون هلند است. کتاب را توسط دوستی در کانادا از کتاب‌فروشی آمازون خریداری کردم و ظرف یکی دو هفته توسط مسافری به دستم رسید. خودم از خواندن آن لذت بردم و آن را به دو تن از همکارانم در دانشکدۀ علوم کامپیوتر دانشگاه تهران نیز نشان دادم و آن‌ها هم مطالب مطرح شده در کتاب را برای پژوهشگران و متخصصان علوم کامپیوتر و به ویژه دانشجویان این رشته بسیار مفید دانستند. از این رو به ترجمۀ کتاب اقدام کردم که به صورت یک سلسله مقالۀ دنباله‌دار در این نشریه به نظرتان خواهد رسید. امیدوارم مطالب کتاب برایتان جالب باشد و بتوانم پس از پایان ترجمه، آن را در قالب یک کتاب در اختیار جامعۀ علمی کشور قرار دهم.
*                      *                      *

مقدمه

مقالات و مطالب فراوانی را می‌توان یافت که تاریخچۀ رایانش را به صورت مسیر زیبایی از «منطق» به «عمل» تصویر کرده‌اند. در واقع، مطالبی از این دست بسیار است. یک مثال عمدۀ آن دربارۀ مسیری است که ادّعا می‌شود از مقالۀ معروف آلن تورینگ در سال 1936 با عنوان «دربارۀ اعداد محاسبه‌پذیر» آغاز و به نخستین رایانه‌های عمومی ، ختم شده است.
امروز بسیاری از افراد بر این باورند که تورینگ، پدر رایانه و پدر جامعۀ دیجیتالی ما بوده است. در پشت جلد کتاب پرفروش و معروف مارتین دیویس به نام «رایانۀ عمومی: مسیری از لایب نیتس تا تورینگ»، در تعریف از کتاب چنین آمده است:
«سرانجام، کتابی دربارۀ منشأ رایانه که تا قلب داستان پیش می‌رود: تلاش انسان در راه منطق و درستی. مارتین دیویس، نویسندۀ فاضل و پژوهشگر، در این کتاب انسان‌های خارق‌العاده‌ای را که رایانه‌های اولیه از طریق کارهای آن‌ها شکل گرفت و در رأس همۀ آن‌ها، آلن تورینگ که ماشین عمومی‌اش اکنون اقتصاد جهان را تحت کنترل دارد، به ما معرفی می‌کند.»
این عبارت‌ها از کسی نیست جز اندرو هاجز، زندگی‌نامه‌نویس تورینگ.
فرضیۀ بنیادی کتاب دیویس این است که منطق و به‌ویژه کارهای تورینگ نقش اصلی را در اختراع نخستین رایانه‌های عمومی بازی کرده  و بر کار فون‌نویمن در رایانۀ EDVAC تأثیر جدّی داشته است. او تلاش کرده است که این ادّعای خود را با پرداختن بیش از حدّ به منطق‌دانان و ریاضی‌دانانی چون فرگه، کانتور، هیلبرت، گودل، تورینگ و فون‌نویمن و کنار گذاشتن و نادیده‌انگاری عامدانۀ کارهای بسیاری از مهندسان به کرسی بنشاند.
دیویس به کارهای اولیۀ بسیاری از مهندسان و متخصصان آنالیز عددی همچون کنراد سوزه و هاوارد اِیکن اشاره‌ای نکرده است. در نتیجه، ادّعای او مبنی بر اولویت تورینگ در ارتباط با نخستین رایانه‌های عمومی، ناموجّه و نارواست. سوزه و اِیکن رایانه‌های «عمومی» خود را به ترتیب در سال‌های 1941 و 1944 ساخته بودند. آن‌ها از صفت «عمومی» برای توصیف ماشین‌های خود استفاده نکرده بودند زیرا آن‌ها برای پیشبرد پژوهش‌های اولیۀ خود، نه به کارهایی که در زمینۀ منطق شده بود و به ویژه، نه به آنچه که تورینگ در سال 1936 ماشین عمومی نام نهاده بود، وابسته نبودند. در واقع، سوزه ساخت ماشین‌های رایانشی را حتی پیش از آن که تورینگ نوشتن مقالۀ سال 1936اش را آغاز کند، شروع کرده بود. بنابراین، می‌توان گفت که دیویس دربارۀ نقش تورینگ در تاریخچۀ رایانه‌ها مبالغه کرده است.
مثال بعدی که مسیر منطق به عمل را نشان می‌دهد، آنی است که از حساب لاندای چرچ آغاز می‌شود و به زبان‌های برنامه‌نویسی موجود ختم می‌گردد. به طور مثال، بوریس‌تراختن‌بروت، زبان برنامه‌نویسی لیسپ مک‌کارتی را تحقّق حساب لاندای چرچ می‌پندارد. او ادّعا می‌کند که مک‌کارتی ابتدا با لیسپ محض آغاز کرده و سپس به خاطر کارایی محاسباتی، ویژگی‌های امری مانند جملات تخصیصی و پرش را به آن افزوده و بدین ترتیب از فلسفۀ اصلی آن دور شده است. مک کارتی بارها این ادّعا را رد کرده و اظهار داشته است که ابتدا با برنامه‌نویسی امری آغاز کرده و سپس به تدریج به سوی برنامه‌نویسی به سبک تابعی رفته است. هربرت استویان که تاریخچۀ لیسپ را مورد بررسی قرار داده نیز همین نظر را دارد. او می‌نویسد:
«کسانی هستند که عقیده دارند روزی یک طراحی شُسته رُفته و خالص برای یک زبان تابعی وجود داشته و برنامه‌نویسان در حوزۀ هوش مصنوعی به دلیل کارایی بالایش رو به سوی آن آورده‌اند. آن‌ها در نظر نمی‌گیرند که در اواخر دهۀ پنجاه، هیچکس از جمله خود مک‌کارتی، به طور جدّی برنامه‌نویسی‌اش را بر پایۀ مفهوم توابع ریاضی قرار نداده بود. با اطمینان می‌توان گفت که مک‌کارتی برای مدتی طولانی براساس طراحی الگوریتم‌های مرحله‌ای برنامه‌نویسی می‌کرد.»
علاوه بر تراختن بروت، دیویس نیز در کتاب پرفروشش، تاریخچۀ زبان‌های برنامه‌نویسی را در قالب دو جملۀ زیر بیان کرده است:
«کتاب مفهوم نگاری فِرِگه، پدر تمام زبان‌های برنامه نویسی متداول امروزی بود. کسی که با زبان‌های برنامه‌نویسی مدرن آشنایی داشته باشد، اگر امروز به مقاله گودل که در سال 1930 دربارۀ تصمیم‌ناپذیری نوشته نگاهی بیندازد، دنباله‌ای از 45 فرمول شماره‌گذاری شده را خواهد دید که بسیار شبیه یک برنامۀ رایانه است. چنین شباهتی نمی‌تواند تصادفی باشد.»
دیویس با توصیف فِرِگه و گودل به‌عنوان نقش‌آفرینان محوری در تاریخ رایانش، و نه فقط منطق، دیدگاه کاملاً جانبدارانه‌ای را از چگونگی اتفاقاتی که افتاده است ارائه می‌کند. جملۀ نخست چنین می‌گوید که کارهای فرگه پیش‌نیاز زبان‌های مدرن برنامه‌نویسی امروز بوده است. این جمله بسیار شبیه این اعتقاد رایج است که ریاضی‌دانان بابلی به‌طور واقعی الگوریتم می‌نوشتند. همان‌گونه که مایک‌ماهونی، تاریخدان برجسته، توضیح داده است، این دقیقاً کاری است که بابلی‌ها نمی‌کردند. درست همان‌طور که چهارچوب ریاضیات بابلی‌ها جایی در یک مقولۀ ریاضی مانند الگوریتم ندارد، کارهای فرگه نیز جایی در حوزۀ یک زبان برنامه‌نویسی رایانه ندارد. فرگه بر روی مسائل مربوط به بنیادهای ریاضی کار می‌کرد، نه برنامه‌نویسی.
جملۀ دوم دربارۀ گودل، در بهترین حالت، در مورد منطق‌دانان ریاضی که تجربۀ برنامه‌نویسی داشتند،  مانند خود مارتین دیویس، صدق می‌کند. و مطمئناً در مورد اکثریت قریب به اتفاق برنامه‌نویسان رایانه، هم در محیط‌های علمی و هم در صنعت، صادق نیست. نگاه کردن، خواندن و حتی سعی در درک مقالۀ سال 1931 گودل، برنامه‌نویس رایانه را به فکر یک برنامۀ رایانه‌ای نمی‌اندازد.
بنابراین جای شگفتی نیست که مقالۀ سال 1936 تورینگ نیز به گونه‌ای ناسازگار با زمان و برخلاف روند واقعی در نوشتجات تاریخی ارائه شده است. دیویس ماشین‌های خودکار تورینگ را با توسّل به اصطلاحات امروزی نظیر سخت‌افزار، نرم‌افزار و برنامه، توضیح می‌دهد. او همچنین گفته است:
«ماشین عمومی تورینگ، نخستین نمونه از یک برنامۀ تفسیری است.»
در یک نگاه کلّی، چنین جمله‌ای می‌تواند از نظر فنی صحیح و بی‌ضرر باشد. امّا باز هم تأکید می‌کنم که به کار بردن چنین حکمی هنگامی که از نقش تورینگ در تاریخچۀ علم و فناوری سخن می‌گوئیم، گمراه‌کننده است. در سال 1936، تورینگ به ماشین عمومی‌اش به صورت یک برنامۀ تفسیری نگاه نمی‌کرد. او نیز در صدد حل یک مسئلۀ مرتبط با بنیادهای ریاضی بود، نه برنامه‌نویسی.
این که دیویس فکر می‌کند که تورینگ به هنگام نوشتن مقاله‌اش در سال 1936 چنین کاربردهای مدرنی را در ذهن داشته یا نه، اهمیت ندارد. (من مطمئن هستم که خود دیویس چنین اشتباهی نمی‌کند.) امّا دیویس با ارائۀ یک تحریف تاریخی، بسیاری از خوانندگانش را به سوی این باور سوق می‌دهد که تورینگ همۀ این چیزها را پیش‌بینی کرده بود. برای آگاهی از جایگاه دقیق تاریخی مقالۀ 1936 تورینگ، خوانندگان را به کتاب چارلز پتزولد و فصل 4 کتاب مارک پریستلی ارجاع می‌دهم.
حتی در دهه های بعد، هنگامی که مفسّرها به‌طور واقعی ساخته شده بودند، برنامه‌نویسان پیشتاز رایانه نظیر مک‌کارتی، در ابتدا به هیچوجه به ماشین عمومی تورینگ به‌عنوان یک برنامۀ تفسیری نگاه نمی‌کردند. بنابراین، حکم دیویس حتی برای 20 تا 25 سال بعد هم صادق نیست! با وجودی که مک‌کارتی پیش از 1960 مقاله‌ای نوشته بود که در آن، ماشین عمومی تورینگ را به سامانۀ برنامه‌نویسی لیسپ خود ارتباط داده بود، امّا هنوز به تأثیرات عملی تابع عمومی eval در لیسپ توجهی نکرده بود. این دانشجویش استیو راسل بود که بر پیاده‌سازی آن اصرار ورزید. و پس از انجام آن بود که ناگهان «به‌طرز شگفت‌آوری» یک مفسّر برای لیسپ پدید آمد.
و آخرین نمونه از تصوّرات نادقیق عامیانه، دربارۀ نقش تاریخی چرچ و تورینگ است که در جولای 2011 در مجلۀ CACM انجمن ماشین‌های رایانشی توسط سردبیر مجله، موشه وَردی تحت عنوان «حل کردنِ حل‌ناپذیر» نوشته شده است:
«در سال‌های 1936-1937، منطق‌دان آمریکایی آلونزوچرچ و منطق‌دان انگلیسی آلن‌تورینگ، مستقلاً ثابت کردند که مسئلۀ تصمیم برای منطق مرتبۀ اول ، حل ناپذیر است. یعنی الگوریتمی برای بررسی اعتبار فرمول‌های منطقی وجود ندارد. قضیۀ چرچ- تورینگ را می‌توان به‌عنوان تولّد علوم کامپیوتر نظری قلمداد کرد. چرچ و تورینگ برای اثبات این قضیه، به ترتیب مدل‌های محاسباتی، توابع بازگشتی و ماشین تورینگ را معرفی کردند و ثابت کردند که مسئلۀ توقف (بررسی این که یک تابع بازگشتی مفروض یا ماشین تورینگ با یک ورودی مفروض، خروجی تولید می‌کند یا نه)، حل‌ناپذیر است.»
اظهارات فوق از چند جنبه نادقیق است. نخست آن که شاید بهتر باشد که بگوئیم آلن‌تورینگ ریاضی‌دان بود نه منطق‌دان. دوم این که توصیف وَردی این برداشت را به وجود می‌آورد که چرچ و تورینگ هر دو نقش یکسان و هم‌وزنی در اثبات حل‌ناپذیری مسئلۀ تصمیم داشته‌اند. در صورتی که نباید چشممان را بر این واقعیت ببندیم که پیش از آن که تورینگ مقاله‌اش را برای انتشار ارسال کند، اثبات چرچ منتشر شده بود و در اختیار تورینگ قرار داشت. این دو اثبات را با هیچیک از معیارهای علمی نمی‌توان همزمان دانست. سوم این که ارائۀ تعریف تابع بازگشتی (یعنی محاسبه پذیر) صرفاً کار چرچ نبود بلکه به خاطر کارهای گودل و دیگرانی نظیر هربراند نیز بود. به علاوه، این تورینگ نبود که آنچه را امروز «ماشین تورینگ» خوانده می‌شود معرفی کرد. تورینگ، ماشین خودکار خود را معرفی کرد که بر خلاف «ماشین تورینگی» که بعداً ساخته شد، نه دربردارندۀ ورودی بود و نه خروجی. ماشین خودکار تورینگ، یک عدد حقیقی را با دقت بسیار زیاد محاسبه می‌کرد وهرگز اجرایش پایان نمی‌یافت. در واقع، اگر بخواهیم دقیق بیان کنیم، باید بگوئیم که تورینگ حل‌ناپذیری مسئله توقف را اثبات نکرد. بلکه این چرچ بود که حل ناپذیری آنچه را که بعداً مسئلۀ توقف نامیده شد، حل کرد. او این کار را با استفاده از آنچه «محاسبه‌پذیری مؤثر» می‌خواند و بر پایۀ بهنجارسازی بنا شده بود، انجام داد. در سال‌های بعد، پُست، چرچ، کلینی و دیویس، مفهوم ماشین خودکار تورینگ را به «ماشین‌تورینگ» تغییرشکل دادند. در خلال دهۀ 1950، این دیویس بود و نه تورینگ که عبارت «مسئلۀ توقف» را بر پایۀ مفهوم تغییر شکل یافتۀ «ماشین تورینگ»، به میان انداخت.
در فصل 2، برخی از ادّعاهای صورت گرفته در پاراگراف پیشین را توضیح خواهم داد و روشن خواهم ساخت. اما اینک همین قدر کافی است که نشان دهیم چگونه به سادگی می‌توان تحولات واقعی را که در گذشته روی داده است نادیده گرفت یا فراموش کرد. در اینجا نشان دادیم که چگونه سردبیر یک نشریۀ علمی معتبر، تنها در یک پاراگراف، چندین سخن نادقیق بیان کرده است!
ممکن است بپرسید «منظورت چیست؟ آیا توضیحات وَردی برای خوانندگانش به قدر کافی دقیق نیست؟» به علاوه، تورینگ قضیه‌ای را اثبات کرد که به آنچه ما امروز «حل ناپذیری مسئلۀ توقف» می‌نامیم، بسیار نزدیک بود. پس چرا باید دربارۀ اظهارات وَردی این قدر متّه به خشخاش بگذاریم؟
پاسخ سریع و کلیشه‌ای این است که وَردی دارد کار یک نفر را به قیمت نادیده گرفتن کارهای دیگران، برجسته می‌کند و بزرگ جلوه می‌دهد. مفهومی‌سازی «ماشین تورینگ» چند سال به طول انجامید و ناشی از کارهای پُست، چرچ، کلینی و منطق‌دانی که برنامه‌نویس رایانه هم شد، یعنی مارتین‌دیویس نیز بود و فقط کار تورینگ نبود. اظهارات وَردی تنها یک نمونه است و یافتن اظهارات مشابهی که توسط پژوهشگران پیشتاز رایانش گفته یا نوشته شده باشد، کار دشواری نیست. این اظهارات، شک مرا دربارۀ گرامی‌داشت صدمین سالگرد آلن تورینگ در سال 2012 تقویت می‌کند.
پاسخ تاریخی این است که نقش‌آفرینانی مانند تورینگ، در خلال میانه‌های دهۀ 1930، تلاش می‌کردند مسئله‌ای را در منطق ریاضی حل کنند. آن‌ها، آن‌گونه که ما اکنون باور کرده‌ایم، دربارۀ توقف برنامه‌های رایانه‌ای فکر نمی‌کردند. آن‌ها در سال 1936 پیش‌بینی نمی‌کردند که کارشان در آیندۀ حوزۀ رایانش، ارزش بسیار زیادی پیدا خواهد کرد. در جستجوی قهرمانانی چون تورینگ، ما غالباً، هر چند ناخواسته، به دستاوردهای واقعیشان بی‌حرمتی می‌کنیم! مسئلۀ جالب و فوق‌العادۀ آن روز، مسئلۀ تصمیم بود که با بنیادهای ریاضی سروکار داشت نه بنیادهای برنامه‌نویسی رایانه.
به علاوه، اظهارات وَردی که در بالا آورده شد، به خاطر بی‌دقتی‌هایش، از جنبۀ خود تاریخ علم با ارزش است. این اظهارات نشان می‌دهد که وَردی با وجودی که چرچ و تورینگ را پدران آنچه که امروز علوم کامپیوتر نظری خوانده می‌شود می‌داند، امّا مقالات چرچ و تورینگ را به دقّت و به‌طور کامل مطالعه نکرده است. همان‌گونه که گفته شد، وَردی در این مورد استثناء نیست: اگر نگوئیم اغلب، بسیاری از پژوهشگران حوزۀ رایانش نیز مقاله‌های چرچ و تورینگ را نخوانده‌اند. در واقع، نباید تعجّب کنیم زیرا مقاله‌های آن‌ها به یک مسئلۀ بنیادی منطق ریاضی در سال 1936 پرداخته است و درک این مقاله‌ها برای متخصصان امروزی رایانش بسیار دشوار است.
مشاهدات فوق این پرسش را مطرح می‌سازد که آیا سایر بازیگران اصلی حوزۀ رایانش هیچگاه کارهای چرچ و تورینگ را خوانده‌اند یا از آن‌ها آگاهی کامل دارند؟ به‌ویژه، آیا برندگان جایزۀ تورینگ مانند ادزگر دایکسترا و تونی‌هور هنگامی که سرگرم کارهای برجستۀ خود در زمینۀ برنامه‌نویسی بودند، کار تورینگ را درک کرده بودند؟ این پرسشی است که من به آن خواهم پرداخت.

از تورینگ تا دایکسترا

تمرکز این کتاب بر تأثیری است که تورینگ بر برنامه‌نویسی و به ویژه بر تفکر ادزگر دایکسترا داشته است. برای این منظور ناچارم به کارهای دیگران نظیر پُست و چرچ نیز بپردازم.
سخن از مشارکت تورینگ در ساخت رایانه، در دهۀ 1970 و پس از آن عمومیت یافت. از همه برجسته‌تر، مقالاتی هستند که توسط برایان رندل، اندرو هاجز و مارتین دیویس نوشته شده‌اند. پرسش اصلی این است که آیا جان فون نویمن هنگامی که به ساخت ماشین EDVAC کمک می‌کرد، تحت تأثیر مقالۀ 1936 تورینگ بوده است یا نه؟ خود فون نویمن هیچگاه به کار تورینگ ارجاع نداده است. این پرسش تا امروز بدون پاسخ قطعی باقی مانده است. به گفتۀ چارلز پتزولد، برخی تاریخچه‌هایی که توسط منطق‌دانان نوشته شده، تورینگ را بازیگر اصلی قلمداد کرده امّا در تاریخچه‌های استاندارد، به ندرت نامی از تورینگ برده شده است.
از سوی دیگر، تأثیر مقالۀ 1936 تورینگ بر برنامه‌نویسی رایانه نیز به ندرت مستند شده است. این امر تا حدودی عجیب است به ویژه اگر دقت کنیم که نخستین جایزۀ تورینگ در سال 1966 به یک «برنامه‌نویس» یعنی آلن پرلیس داده شد. در سال 1966، ارتباط بالقوه‌ای بین تورینگ و فون‌نویمن در ساخت EDVAC هنوز کشف نشده بود: مقالات رندل(1973)، هاجز (1983)، دیویس (1988 و 2000) هنوز چاپ نشده بودند!
در نتیجه، به جای آن که تنها به «به اصطلاح» نقش تورینگ در پیدایش نخستین رایانه‌های عمومی اشاره شود، بررسی تأثیر فراوان مقالۀ 1936 تورینگ بر حوزۀ برنامه‌نویسی رایانه نیز به همان اندازه حائز اهمیت است. در این راستا، فصل دوم کتاب نشان می‌دهد که (1) بسیاری از برنامه‌نویسان نسل اول مقالۀ 1936 تورینگ را نخوانده بودند، چه برسد به این که آن را درک کرده باشند و (2) آن دسته از دست‌اندرکاران رایانه که در خلال دهه‌های 1950 و 1960 با مقالۀ 1936 تورینگ آشنا شده بودند، حداقل به یکی از سه روش زیر به آن رسیدند:

  1. به ماشین تورینگ به‌عنوان مدلی برای یک رایانه رقمی با برنامۀ ذخیره‌شده نگریسته می‌شد. به‌علاوه، برخی پژوهشگران در دهۀ 1950 تلاش کردند به‌طور واقعی ماشین تورینگ را بسازند و این یعنی پس از آن که نخستین ماشین‌های همه منظوره ساخته شده بودند.
  2. ماشین عمومی تورینگ به پایه‌گذاری برنامه‌نویسی خودکار ، یعنی فعالیت‌های مربوط به جستجوی روش‌های خودکار و سبک‌های برنامه‌نویسی برای مقابله با دشواریِ دستوردادن به رایانه‌ها، کمک کرد.
  3. حل ناپذیری مسئلۀ توقف، مثلاً آن‌گونه که در کتاب «محاسبه‌پذیری و حل‌ناپذیری» دیویس (1958) آمده است، به پژوهشگران کمک کرد تا محدودیت‌های خاصی را در برنامه‌نویسی خودکار قرار دهند. ادزگر دایکسترا، برندۀ جایزۀ تورینگ در سال 1972، مطمئناً یکی از نخستین کسانی بود که این کار را کرد.

نخستین مورد به طور ضمنی به دهۀ 1950 و زمانی اشاره می‌کند که مهندسان سخت‌افزار و برخی از منطق‌دانان ریاضی تلاش کردند از شکاف بین مقالۀ نظری تورینگ در 1936  و ماشین‌های رایانشی با برنامۀ ذخیره شده که در آن زمان موجود بودند، بکاهند. از چهره‌های کلیدی و فعّالان شاخص می‌توان به ادوارد مور و هائو ونگ اشاره کرد. مورد دوم عمدتاً با بحث در مورد کارهای دو طرفدار جدّی و اولیۀ زبان‌های برنامه‌نویسی مستقل از ماشین، یعنی ساول گورن و جان‌کار نشان داده خواهد شد. این دو نفر، مفهوم ماشین عمومی تورینگ در سال 1936 را در بافت زبان‌های برنامه‌نویسی درک کردند و همچنین به طور صریح به کارهای گودل و کلینی اشاره کردند. سومین مورد با بحث دربارۀ پذیرش غیرمستقیم کار تورینگ توسط دایکسترا نشان داده خواهد شد. روشن خواهیم ساخت که دایکسترا یکی از نخستین برنامه‌نویسانی بود که حل‌ناپذیری مسئلۀ توقف را در بافت برنامه‌نویسی به کار بست. او از آن به عنوان خمیرمایه‌ای برای مقالۀ معروفش در سال 1968 به نام «جملات Go To زیان‌آور شناخته شدند» استفاده کرد. همچنین آن را در نامه‌ای که در سال 1978 به وزارت دفاع آمریکا دربارۀ مثالی از برنامه‌نویسی فنی نوشت به کار گرفت تا نیاز به جداسازی طراحی زبان از پیاده‌سازی آن را نشان دهد. به‌طور خلاصه، کار دایکسترا نشان می‌دهد که تصمیم‌ناپذیری دارای تأثیرات عملی در مهندسی نرم‌افزار است.
در فصل 3، بررسی کرده‌ام که چگونه زیبایی‌شناختیِ ریاضی دو آمستردامی، یعنی دایکسترا و وَن‌واین‌گاردن، به پیدایش رویّه‌های بازگشتی در برنامه‌نویسی امری در سال 1960 انجامید و با وجودی که خود دایکسترا و وَن‌واین‌گاردن به رویّه‌های بازگشتی در برنامه‌نویسی‌های خودشان نیاز چندانی نداشتند، پیتر نور را ترغیب کردند که آن را در تعریف زبان برنامه‌نویسی الگول 60 بگنجاند. کوته زمانی پس از آن، رویّه بازگشتی الگول 60 به شیوه‌های ابتکاری و پیش‌بینی نشده‌ای، به طور مثال در مرتب کردن سریع ، به کار گرفته شد. به علاوه، در مقابل کارهای چند پژوهشگر انگلیسی و آلمانی در زمینۀ مهندسی سخت‌افزار، این تلاش دایکسترا در زمینۀ عمومیت بخشی ریاضی بود که به پیشرفت‌های عملی در نوشتن برنامه‌های مترجم انجامید، پیشرفت‌هایی که با تحولات و توسعه‌های جدید مانند ماشین مجازی که این روزها به نحو گسترده‌ای مورد استفاده قرار می‌گیرد، در ارتباط بودند. بدین ترتیب، تاریخ به ما نشان می‌دهد که دقت و ظرافت ریاضی می‌تواند به نتایج عملی و مفیدی در مهندسی نرم‌افزار بینجامد.
تمرکز بر روی دایکسترا در فصل 3، بر پایۀ کارهای دیگران و به‌ویژه رایانه‌ساز آلمانی کنراد سوزه، ریاضی‌دان سوئیسی هاینس‌روتیس‌هاوزر و معمار رایانۀ آمریکایی رابرت‌بارتون، صورت گرفته است. سوزه در نیمۀ دوم دهۀ 1930 با موفقیت ماشین‌های رایانشی را ساخته بود. پس از جنگ جهانی دوم، سوزه نمادگذاری برنامه‌نویسی خود را به نام پلان کلکول بر روی کاغذ طراحی کرده بود. کارهای روتیس‌هاوزر در دهۀ 1950 تحت تأثیر این نمادگذاری بود که بعداً کمک کرد تا زبان الگول 58 به الگول 60، یعنی یک زبان برنامه‌نویسی عمومی و مستقل از ماشین که در اصل برای محاسبات عددی طراحی شده بود، تحوّل یابد. الگول 60 نیز به نوبۀ خود بر طراحی رایانۀ بی5000 باروز در آمریکا که بارتون معمار ارشدش بود، تأثیر گذاشت.
سوزه بین اواسط دهۀ 1930 تا اواسط دهۀ 1940 به ساخت ماشین‌های رایانشی در آلمان پرداخته بود. یکی از آن‌ها به نام زِد4 از بمباران‌های متفقین جان سالم به‌دربرد. با پایان گرفتن جنگ، سوزه رایانۀ زِد4اش را برداشت و به سمت غرب و دور از سرزمین‌هایی که به اشغال اتحاد شوروی درآمد، حرکت کرد. سرانجام زِد4 از زوریخ سردرآورد و در آنجا مورد استفادۀ روتیس‌هاوزر، ریاضی‌دان سوئیسی، قرار گرفت. روتیس‌هاوزر پس از نخستین کارهایی که بر روی مسائل عددی انجام داد، به جستجوی روش‌های خاصی برای غلبه بر کارهای خسته‌کنندۀ مربوط به برنامه‌نویسی زِد4 برآمد. در خلال این کارها، او روشی برای ترجمۀ عبارت‌های جبری به کد ماشین ارائه کرد.
زبان برنامه‌نویسی الگول 60 که به طور رسمی در ماه مِی سال 1960 عرضه شد، دارای حداقل دو ویژگی بود که آن را از عرف برنامه‌نویسی متمایز می‌ساخت. یکی از این ویژگی‌ها، ساختار بلوکی آن بود. یک برنامۀ الگول 60 اساساً دنباله‌ای از بلوک‌های تو در توست. مانند عروسک‌های روسی که داخل شکم هم جای می‌گیرند، هر بلوک درون بلوک دیگر قرار دارد. این ساختار بلوکی با ویژگی بعدی الگول 60 تکمیل می‌گردد: رویّه‌های بازگشتی . اجرای یک رویّۀ الگول 60 می‌تواند با فراخوانی مستقیم یا غیرمستقیم خود آن رویّه همراه باشد و بدین ترتیب، نمایشگر شکل پویایی از بازگشت می‌گردد.
هر دو شکل بازگشت در الگول 60، به تغییر اساسی در بُن‌انگارۀ مرسوم برنامه‌نویسی انجامید. به گفتۀ والدز:
«در فرترن، همخوانی واضحی با زبان ماشین و زبان همگذاری (اسمبلی) وجود دارد. در حالی که الگول که بیشتر تحت تأثیر ایده‌های سوزه و روتیس‌هاوزر قرار داشته، به تجدید نظر اساسی دربارۀ برنامه‌نویسی نیاز دارد.»
فرترن آی‌بی‌ام، درست همانند الگول 60، برای محاسبات عددی ساخته شده بود. امّا از نظر ویژگی‌های برنامه‌نویسی، این دو زبان بسیار با هم تفاوت داشتند.
یک برنامۀ فرترن (در خلال نیمۀ دوم دهۀ 1950) شامل دنباله‌ای از زیرروال‌ها بود که هر یک از آن‌ها، پیش از آن که برنامه اجرا شود، به بخش ثابت و خاصی در حافظه تخصیص یافته بود. در حین اجرا، برنامه از یک بخش حافظه به بخش دیگری می‌پرید تا دستورالعمل‌های زیرروال مربوط را اجرا کند. در نتیجۀ مطابقت و همخوانی نزدیک بین متن برنامۀ فرترن و طرح‌بندی حافظۀ مورد نیاز برای اجرای برنامه، تولید برنامۀ مترجم فرترن نسبتاً ساده بود.
یک برنامه‌نویس باتجربۀ فرترن، از پیش دقیقاً می‌دانست که برنامه‌اش در خلال اجرا به چقدر حافظۀ ثابت نیاز خواهد داشت. در نقطۀ مقابل، یک برنامه‌نویس باتجربۀ الگول 60، چنین کنترلی بر روی برنامه‌های الگول 60 نداشت. حافظۀ مورد نیاز یک برنامۀ الگول 60 نوعاً در حین اجرای برنامه تغییر می‌یافت. یعنی مطابقت و همخوانی ثابتی بین متن برنامۀ الگول 60 و طرح‌بندی حافظۀ مورد نیاز برای اجرای برنامه، وجود نداشت. تخصیص حافظه، پویا بود و در نتیجه، تولید برنامۀ مترجم برای الگول 60، دشوارتر از فرترن بود. به‌علاوه، مدیریت تخصیص پویای حافظه توسط یک سیستم زمان اجرا ، نیازمند سربار قابل ملاحظه‌ای بود، کمی شبیه سیستم عامل‌هایی که در سال‌های بعد تولید شدند.
مشکل اصلی برنامه‌نویسی در اواخر دهۀ 1950 و دهۀ 1960، پرکردن شکاف بزرگی بود که بین زبان الگول 60 و ماشین وجود داشت، یعنی بین پویایی و ایستایی. چند پژوهشگر برجستۀ انگلیسی و آلمان‌غربی تلاش‌کردند تا از طریق محدود کردن ساخت‌های پویای زبان الگول 60 این کار را انجام دهند، مثلاً از طریق به کار نبردن رویّه‌های بازگشتی. همان‌گونه که در فصل 3 توضیح داده‌ام، این‌ها در اصل به سبک برنامه‌نویسی فرترن نزدیک شده‌اند. در سال‌های بعد، دیگرانی چون بارتون معماری‌های تازه‌ای برای ماشین طراحی کردند (یعنی معماری‌های پشته‌ای ) که می‌توانست نیازهای حافظۀ پویا را برآورده سازد و نیز شامل سیستم‌های حافظۀ مجازی بود. بارتون و همکارانش با پویاتر کردن ماشین، این شکاف را از جانب ماشین پر کردند.
ماشین بی 5000 بارتون، آن‌طور که دِنت در سال‌های بعد به یاد آورده است، فروش خوبی نداشت:
«سعی در فروش ماشینی که نه متصدّی رایانه ، نه کاربر و نه برنامه‌نویس می‌دانستند که برنامه در کجای حافظه قرار دارد، بسیار دشوار بود.»
با وجود این، دانشگاهیانی مانند دایکسترا از طرفداران پروپاقرص ماشین‌های باروز بودند. دایکسترا حتی در سال 1973 به‌عنوان مشاور پژوهشی به باروز پیوست، هر چند کارهایش را از خانه‌اش در هلند انجام می‌داد.
در سال 1960، دایکسترا زبان الگول 60 را با تمام ویژگی‌هایش درنظر گرفت و آن را با سرعت شگفت‌آوری به کمک همکار نزدیکش یوپ زونِوِلد پیاده‌سازی کرد. او شکاف بین نیازهای حافظۀ پویای الگول 60 و ماشین را با محدود کردن الگول 60 از میان نبرد. بلکه، همان‌گونه که خواهیم دید، او با یکنواخت کردن مفاهیم ظاهراً ناهمخوان زبان و برنامۀ مترجم، موفق به «پل زدن» بر روی آن شکاف شد. موریس ویلکس در سال 1962 دربارۀ این کار دایکسترا چنین گفت:
«دایکسترا با دلایل کافی نشان داده است که نوشتن برنامۀ مترجم می‌تواند کار بدیهی و ساده‌ای گردد، و این چنین نیز شده است، و او این را در برنامۀ مترجمش به نحوی بسیار عالی نشان داده است ... دایکسترا نوشتن برنامۀ مترجمی برای الگول را با نمادگذاری‌های خود، به کاری بدیهی تقلیل داده است.»
به‌علاوه، دایکسترا به شکاف بین زبان و ماشین به‌عنوان مسئله‌ای موقت می‌نگریست زیرا پدیدآمدن معماری‌های جدید ماشین، نظیر بی 5000 باروز را در آینده‌ای نزدیک پیش‌بینی می‌کرد.
مورد بعدی دایکسترا علیه جملات goto ، به نوبۀ خود، راهی برای پرکردن یک شکاف دیگر، یعنی شکاف مفهومی بین متن برنامۀ ایستای الگول 60 و پردازش پویای آن بر روی یک ماشین پشته‌ای انتزاعی بود. در واقع، در خلال دهۀ 1960، دایکسترا نیز مانند بسیاری دیگر به قواعد معنایی زبانی مانند الگول از دید اجرایی می‌نگریست. کنار گذاشتن ساخت‌های goto از یک برنامۀ الگول 60 باعث افزایش روشنی و وضوح آن به هنگام استدلال در مورد چگونگی عمل ماشین انتزاعی در زمان اجرای برنامه می‌شد.
دایکسترا تنها یکی از چند پژوهشگری بود که در خلال دهۀ 1960 علیه جملات goto موضع گرفتند، پس چرا مقالۀ 1968 او با عنوان «جملات Go to زیان‌آور شناخته شدند» بیشترین موج را به وجود آورد؟ به نظر من، این به‌طور غیرمستقیم به خاطر مقالۀ 1936 تورینگ و به ویژه مقالۀ 1966 بوهم و جاکوپینی با عنوان «روندنماها، ماشین‌های تورینگ و زبان‌هایی با تنها دو قاعدۀ ساخت» بود.
بوهم و جاکوپینی در مقالۀ سال 1966شان در اصل به آن‌‌هایی که طرفدار برنامه‌نویسی بدون goto بودند، چراغ سبز نشان دادند. بوهم و جاکوپینی با به کارگیری استادانۀ ماشین‌های تورینگ، موفق به اثبات یک نکتۀ بنیادی در برنامه‌نویسی شدند که نشان می‌داد برنامه‌نویسی بدون goto به قیمت از دست دادن توان محاسباتی تمام نمی‌شود. یعنی زبانی مانند الگول، با کنار گذاشتن حکم goto ، از توان محاسباتی‌اش کاسته نخواهد شد. برخی از خبرگان در جامعۀ برنامه‌نویسان به طور غیرمستقیم منتظر این چراغ سبز نظری مانده بودند و این دایکسترا بود که محصولش را برداشت کرد.

گفتگو با چهار برندۀ جایزۀ تورینگ
با وجودی که تمرکز این کتاب بر تورینگ و دایکسترا قرار دارد، امّا این یک اشتباه روش‌شناختی است چنانچه تنها به توضیح و تشریح دستاوردهای آنان بپردازیم. من برای به دست آوردن درک عمیق‌تر و غنی‌تری از میراث آنان، با چهار برندۀ جایزۀ تورینگ، یعنی تونی هور، نیکلاوس ویرث، باربارا لیسکوف و پیتر نور نیز به گفتگو نشسته‌ام. تمرکز هر گفتگو بر نقش و سهم پژوهشی خود آنان بوده، امّا در خلال آن، گاهی نیز پرسش‌هایی در مورد کارهای تورینگ و دایکسترا و تأثیراتی که بر پژوهش‌ها و کارهای آنان داشته پرسیده‌ام.
این که ویرث و به‌ویژه نور در مورد کارهای بعدی دایکسترا انتقاداتی داشتند ارتباطی به درست یا غلط بودن آن کارها ندارد بلکه به برنامه‌های پژوهشی متفاوت آنان و این که تا چه حدّ از برنامه‌های یکدیگر درک داشتند مربوط است.
در هر گفتگو، تا حدّ امکان با طرف مقابل همدلی کرده‌ام و تلاشم بر این بوده که هر چه بیشتر دلش را به دست آورم. نخستین گفتگوی من در بهار سال 2010 در کمبریج (انگلستان) با تونی هور و اساساً دربارۀ میزان پذیرش او از منطق و از جمله کارهای تورینگ بود. گفتگوی دوم من در پائیز 2010 در زوریخ با نیکلاوس ویرث و عمدتاً دربارۀ دیدگاه مهندسی او نسبت به حوزۀ برنامه‌نویسی بود. یک ماه بعد، باربارا لیسکوف را در بوستن ملاقات کردم و با او دربارۀ کارهایش در طراحی لایه‌ایِ سیستم عامل و افکارش در مورد انتزاع داده‌ها در خلال دهه‌های 1960 و 1970 به گفتگو پرداختم. چهارمین گفتگوی من در بهار سال 2011 در گنتوفت دانمارک با پیتر نور بود. بخشی از آن گفتگوی بسیار طولانی در مورد الگول 60 و تورینگ را در اینجا آورده‌ام. علاقه‌مندان به مطالعۀ متن کامل گفتگو و به ویژه، آگاهی از نظرات انتقادی نور دربارۀ پژوهش‌های دایکسترا می‌توانند به جزوه‌ای که با عنوان «چندگانگی در مهندسی نرم‌افزار: پیتر نور برندۀ جایزۀ تورینگ توضیح می‌دهد» نوشته‌ام مراجعه کنند.
تنها با انجام گفتگو با تعداد بیشتری از برنامه‌نویسان نسل اوّل در آیندۀ نزدیک است که به دست آوردن تصویری کلّی از رشتۀ مهندسی نرم‌افزار و به ویژه تأثیرات تورینگ و دایکسترا، امکان‌پذیر می‌گردد. به خوانندگان توصیه می‌کنم که فصل‌های 2و 3 را با وسواس و دقت بیشتری بخوانند. برای خواندن فصل‌های 4 تا 7 به چنین دقتی نیاز نیست و می‌توان آن‌ها را تفریحی خواند. همان‌گونه که متوجه خواهید شد به برخی از اظهارنظرهای هور و نور در فصل 2 پرداخته شده است. همچنین توضیحات ویرث و لیسکوف برای کسانی که به روش‌شناسی برنامه‌نویسی و به ویژه برنامه‌نویسی ساخت‌یافته (فرهنگستان زبان و ادب فارسی به تازگی معادل ساختمند را برگزیده که به نظر صحیح‌تر می‌آید امّا به دلیل رواج فراوان، از همان معادل ساخت‌یافته استفاده گردید. مترجم) علاقه‌مند باشند، بسیار سودمند است.
«ادامه دارد»
منبع
* Edgar G. Daylight, "The Dawn of Software Engineering", Lonely Scholar bvba, 2012.