نرم افزار چیست؟
یک پاسخ ساده برای آن عبارتست از: سخت افزار را می توانید لمس کنید اما نرم افزار را نه!
اما این پاسخ بسیار سطحی و ساده است. اگر بخواهیم دقیقتر بگوییم زمانیکه از نرم افزار صحبت می کنیم در حقیقت منظورمان برنامه ای است که در کامپیوتر اجرا می شود. در طول تاریخ، دنیای نرم افزارها و برنامه های کامپیوتری به موازات توسعه برنامه نویسی (Programming) و زبانهای برنامه نویسی (Programming languages) توسعه یافته است. بنابراین مطالعه روند توسعه دنیای برنامه نویسی ما را به مطالعه تاریخچه دنیای نرم افزار رهنمون می سازد.
برنامه کامپیوتری چیست؟
یک کار مشخص در کامپیوتر با اجرای سلسه دستورات به صورت پشت سرهم انجام می شود. این مجموعه دستورات که به منظور انجام یک کار مشخص به صورت مرتب در یک فایل تهیه و تدوین می شوند، برنامه کامپیوتری نامیده می شود. به کسی که این سلسله دستورات را تهیه می کند، برنامه نویس می گویند. محتویات این فایل را سورس یا منطق برنامه می نامند. در یک برنامه کامپیوتری فقط دستوراتی وجود دارند که توسط کامپیوتر قابل اجرا هستند. این دستورات با یک ترتیب از پیش تعیین شده و بر اساس یک مسیر منطقی پشت سرهم قرار گرفته اند. اگر همه آنها به درستی اجرا شوند، در آخر کار خاصی را که هدف برنامه نویس بوده است به انجام می رسانند.
قدیمیترین نمونه عملی از برنامه نویسی به سال 1801 در کشور فرانسه توسط شخصی بنام جکارد برمی گردد. او یک دستگاه بافندگی طراحی کرده بود که می توانست اعمال خاصی از بافندگی را که روی کارتهای سوراخ شده (Punched card) ثبت شده بودند به ترتیب انجام دهد. این تکنولوژی اجازه تولید بافت های پیچیده و با کیفیت تر را به کارگران معمولی می داد. اکنون به جای کارگران متعدد و ماهر، فقط یک نفر برای مدیریت کل دستگاه کافی بود. روند تقریبا مشابهی نیز در خلال انقلاب صنعتی در انگلیس به وقوع پیوست. به دنبال استفاده از ماشینهای خودکار و کاهش نیروی کار انسانی، جنبشی تحت عنوان لودیت ها به راه افتاد. این جنبش متشکل بود از افرادی که مخالف توسعه تکنولوژی بودند و برای جایگاه شغلی، نان و رزق و روزی خود با تکنولوژی می جنگیدند.
در این دوره، برنامه نویسی به موازات ساخت ماشین های جدید توسط پاسکال، بابیج، شوالتز و ... توسعه می یافت. برای حل هر مشکلی یک ماشین جدید ساخته می شود که چرخ دنده ها، سیم ها، میله ها و دستورات جدیدتری نسبت به قبل داشت.
در سال 1847 یک ریاضیدارن انگلیسی بنام George Boole با ارائه جبر منطقی، ارتباط میان علم ریاضیات و منطق را اثبات کرد. برای اولین بار او اثبات کرد که علم منطق بیشتر بخشی از ریاضیات است تا فلسفه! این عمل که یک گام بزرگ در تفکر بشریت به حساب می آید تقریبا صد سال (تا سال 1940) طول کشید تا در محاسبات کامپیوتری به کار گرفته شود.
در دهه 1940 اولین کامپیوتر الکترونیکی ساخته شد. حافظه محدود و سرعت بسیار پایین (به نسبت سرعت کامپیوترهای امروزی) از ویژگی های بارز کامپیوترهای الکترونیکی اولیه بودند. در این سالها که به عصر اطلاعات معروف بود، اجرای برنامه ها در کامپیوترها مستلزم تنظیم کلیدها، سوییچ ها و اتصال سیم های مختلف بود که منطق برنامه را مشخص می کردند.
در چنین حالتی برنامه نویسی چیزی به جز تنظیم تعداد بسیار زیادی سیم نبود. یک محاسبات چند دقیقه ای نیازمند صرف روزها وقت برای اتصال میان سیم ها، کلیدها و پورت ها بود. برای هر عملی سخت افزار خاصی طراحی شده بود که می بایست توسط سیم ها و پورتها به یکدیگر متصل می شدند تا برنامه اصلی را شکل دهند.
جان وان نیومن در سال 1945 هنگامی که در انیستیتو تحقیقات عالی مشغول بکار بود، 2 اصل اساسی را ارائه کرد که تاثیر مستقیمی بر مسیر توسعه برنامه نویسی گذاشت؛
اولین اصل "تکنیک برنامه مشترک" (Shared-program technique) نام داشت. بر طبق این اصل سخت افزار کامپیوترها باید بسیار ساده باشند و نیازی نیست که برای هر برنامه به صورت دستی سیم کشی و تجهیز شوند. در عوض، دستورات نرم افزاری باید از ترکیب همان دستورات ساده سخت افزاری تشکیل شوند و یک دستور نرم افزار مرکب و پیچیده تر را بسازند. این اصل سخت افزارها را ساده و دستورات نرم افزاری را پیچیده می کرد.
وان نیومن اصل دوم خود را "انتقال کنترل به صورت شرطی" (Conditional Control Transfer) نامید. بر طبق این اصل که تاثیر عمیقی بر توسعه برنامه نویسی گذاشته است، برنامه کامپیوتری می تواند شامل بلاک های کوچکتری از دستورات بنام زیرروال (Subroutine) شود که می توانند در هر جای برنامه اصلی جای گیرند. این بلاک ها می توانند هر چندبار که لازم است در هر کجای برنامه اصلی استفاده شوند. بخش مهم دیگری از این اصل، کنترل روند برنامه کامپیوتری توسط دستورات منطقی مانند IF…Then و حلقه هایی مانند FOR را امکانپذیر می کرد.
سال 1948 همزمان بود با ارائه تئوری ریاضی ارتباطات توسط کلود شانن (Claude Shannon, 1916-2001). ارائه تز تئوری ریاضی ارتباطات او اساس تئوری اطلاعات (Information Theory) را شکل داد. این تئوری نحوه استفاده از منطق باینری (اعداد در مبنای دو، همان صفر و یک ها) در محاسبات نرم افزاری در کامپیوترها را بیان می کرد. تز ارائه شده توسط شانن دنیای صفر و یک ها (باینری) که اساس و پایه کامپیوترهای الکترونیکی امروزی هستند را شکل می داد. بعدها اولین کامپیوتر باینری در حین جنگ جهانی دوم توسط یک آلمانی بنام زوس ساخته شد.
در سال 1949، پس از ارائه 2اصل وان نیومن، زبان برنامه نویسی بنام کد کوتاه (Short Code) به وجود آمد. کد کوتاه که دستورات آن به صورت یک سری صفر و یک تشکیل شده بود، اولین زبان برنامه نویسی برای کامپیوترهای الکترونیکی به حساب می آید. ساخت این زبان برنامه نویسی به عنوان اولین قدم در جهت ساخت دنیای برنامه نویسی امروز به حساب می آید. در سال 1951، گریس هاپر اولین کامپایلر دنیای کامپیوتر را به نام A-0 نوشت. کامپایلر به برنامه ای گفته می شود که دستورات برنامه نویسی را به دستورات صفر و یک (در آن زمان دستورات زبان کد کوتاه) تبدیل می کند. از آن پس برنامه نویس نیازی به ورود کدهای صفر و یک نداشت و توسعه دنیای برنامه نویسی سرعتی چند برابر یافت.
پس از آن فورترن (FORTRAN) به عنوان اولین زبان برنامه نویسی به شکل امروزی در سال 1957 توسط شرکت IBM ساخته شد. نام آن مخفف سیستم تبدیل فرمول (FORmula TRANslating system) بود. دستورات آن بسیار ساده بودند و فقط شامل دستورات IF ، DO و GOTO می شدند. هرچند دستورات این زبان امروزه بسیار محدود و ناکارآمد تلقی می شود اما در آن زبان قدم بسیار بزرگی رو به جلو بود. انواع داده ای نیز برای اولین بار در زبان FORTRAN ارائه شدند. داده هایی مانند متغیرهای منطقی، صحیح، حقیقی و اعداد با دقت مضاعف در FORTRAN قابل تعریف و استفاده بودند.
اگرچه زبان FORTRAN در کار با اعداد و داده ها بسیار خوب عمل می کرد اما در دریافت ورودی و صدور خروجی بسیار محدودیت داشت. با شروع استفاده از کامپیوتر در دنیای تجارت، زبانهایی مانند COBOL نیز پا به عرصه ظهور گذاشتند. COBOL که از ابتدا به منظور استفاده در حوزه برنامه های تجاری طراحی شده بود، فقط شامل انواع داده ای عددی و رشته متنی می شد. امکان گروه بندی داده ها در آرایه ها و رکوردها، مدیریت داده ها را تسهیل می کرد. این امکانات فضا را برای رشد نرم افزارهای ذخیره و بازیابی اطلاعات فراهم کرد.
تا سال 1972 بیش از 200 زبان برنامه نویسی مختلف ظهور کرد. اکثر این زبانها به منظور کاربرد خاصی توسعه یافته بودند، برخی دیگر نیز ویرایش جدیدی از زبانهای قبلی بودند.
نسل های زبان های برنامه نویسی
با توجه به مطالعات پیشین در زمینه روند توسعه ابزارهای برنامه نویسی، می توان این ابزارها را به چند نسل مختلف تقسیم بندی کرد؛
نسل اول
در سالهای دهه 1950 برنامه نویسی کامپیوترهای اولیه توسط تغییر سیم ها و تنظیم هزاران کلید و سوییچ انجام میشد. در برخی موارد این تنظیمات بر روی کاغذهای طومار گونه و یا کارت های سوراخشده نوشته می شدند که به کامپیوتر می گفتند چه کاری را (What)، به چه صورت (How) و در چه زمانی (When) انجام دهد.
به منظور اجرای یک نرم افزار، برنامه نویس باید اطلاعات جامع و کاملی از کامپیوتر موردنظر می داشت. یک اشتباه کوچک منجر به شکست در کل برنامه کامپیوتری میشد.
نسل دوم
در این دوره افراد به دنبال ابزارهای سریعتر و راحتتری برای برنامه نویسی بودند. نتیجه این تلاشها تولد نسل دوم زبان های برنامه نویسی در اواسط دهه 1950 شد. در این نسل از نمادها به جای دستورات صفر و یک استفاده می شد.
نسل سوم
در اواخر دهه 1950 مفسرهای زبان های طبیعی و کامپایلرهای پا به عرصه ظهور گذاشتند. قدیمیترین زبان برنامه نویسی این نسل FORTRAN است که در سال 1953 توسط IBM ساخته شد. در سال 1959 زبان برنامه نویسی COBOL به منظور استفاده در دنیای نرم افزارهای تجاری عرضه گردید.
زبانهای سطح بالای برنامه نویسی مانند BASIC ، PASCAL ، ALGOL ، PL/I و C در این دوره معرفی شدند.
نسل چهارم
زبانهای این نسل برنامه نویس را قادر می سازند تا کارهای سطح بالاتر و بیشتری را توسط کد کمتری انجام دهد. هر دستور از زبانهای این نسل معادل صدها دستور از زبانهای نسل سوم است. برنامه هایی که توسط این زبانهای نوشته می شوند، نیاز به یک محیط سخت افزاری خاص و امکانات خاص برای اجرا شدن دارند. در دهه 1990 درخواست ها برای استفاده از این زبانها بسیار زیاد شد و کمپانی هایی مانند Oracle و SUN تلاشهایی در این زمینه انجام دادند.
نسل پنجم
این نسل از زبانهای برنامه نویسی هنوز در مرحله تئوری هستند و تا به امروز نمونه عملی از آنها ساخته نشده است. بسیاری از تلاشها به دلیل محدودیت سخت افزارها، عملیاتی نشده اند. استفاده از زبان طبیعی و روزمره برای تفهیم کارها به کامپیوترها از ویژگی های بارز این نسل به شمار می رود. استفاده از شبکه های عصبی و هوش مصنوعی و همچنین استفاده از Agent ها به منظور انجام کارها در کامپیوتر از دیگر ویژگی های این نسل از زبان ها هستند.
زبانهای برنامه نویسی از دیرباز تا کنون توسعه یافته اند. از سیم کشی کامپیوترها تا زبانهای سطح بالای نسل سوم و چهارم. این گامها هر کدام ابزارها و امکانات جدیدتر و بهتری را در اختیار برنامه نویسان قرار دادند و به طبع آن نرم افزارهای کامپیوتری نیز بهتر و پیشرفته تر شدند.
برنامه نویسی و تولید نرم افزارهای امروزی حاصل دسترنج ساعتها تفکر و تلاش این اشخاص است. همانطور که قبلا توضیح داده شد کامپیوترهای امروزی از لحاظ سخت افزاری بسیار ساده طراحی می شوند و این نرم افزار است که با ترکیب این اعمال می تواند کارهای بزرگتر و پیچیده تری را به انجام برساند. به موازات بهبود زبان و ابزارهای برنامه نویسی، توقع از نرم افزارها نیز بالاتر رفته است. امروزه نرم افزارها خدمات بسیاری را باید ارائه دهند. هر یک از خدمات باید به صورت کامل، با دقت بالا و سریع ارائه گردد تا بتواند توقع مخاطب را تامین کند. هر نرم افزار امروزی برای انجام یک کار ممکن است به صدها یا هزاران خط دستورات نیاز داشته باشد.
آنچه گذشت مروری اجمالی بود بر رویدادهایی که قدم به قدم دنیای امروز ما را شکل داده اند.