زنگ تفریح: برنامه نویس و مهندس جمعه بیست و پنجم آذر 1390 21:54
یک برنامه‌نویس و یک مهندس در یک مسافرت طولانى هوائى کنار یکدیگر در هواپیما نشسته بودند.

برنامه‌نویس رو به مهندس کرد و گفت: مایلى با همدیگر بازى کنیم؟

مهندس که می‌خواست استراحت کند محترمانه عذر خواست و رویش را به طرف پنجره برگرداند و پتو را روى خودش کشید.

برنامه‌نویس دوباره گفت: بازى سرگرم‌کننده‌اى است. من از شما یک سوال می‌پرسم و اگر شما جوابش را نمی‌دانستید ۵ دلار به من بدهید. بعد شما از من یک سوال می‌کنید و اگر من جوابش را نمی‌دانستم من ۵ دلار به شما می‌دهم.

مهندس مجدداً معذرت خواست و چشمهایش را روى هم گذاشت تا خوابش ببرد.

این بار، برنامه‌نویس پیشنهاد دیگرى داد. گفت: خوب، اگر شما سوال مرا جواب ندادید ۵ دلار بدهید ولى اگر من نتوانستم سوال شما را جواب دهم ٥٠ دلار به شما می‌دهم.

این پیشنهاد چرت مهندس را پاره کرد و رضایت داد که با برنامه‌نویس بازى کند.
 
برنامه‌نویس نخستین سوال را مطرح کرد: «فاصله زمین تا ماه چقدر است؟»

مهندس بدون اینکه کلمه‌اى بر زبان آورد دست در جیبش کرد و ۵ دلار به برنامه‌نویس داد.

حالا نوبت خودش بود. مهندس گفت: «آن چیست که وقتى از تپه بالا می‌رود ۳ پا دارد و وقتى پائین می‌آید ۴ پا؟»

برنامه‌نویس نگاه تعجب آمیزى کرد و سپس به سراغ کامپیوتر قابل حملش رفت و تمام اطلاعات موجود در آن را مورد جستجو قرار داد. آنگاه از طریق مودم بیسیم کامپیوترش به اینترنت وصل شد و اطلاعات موجود در کتابخانه کنگره آمریکا را هم جستجو کرد. باز هم چیز بدرد بخورى پیدا نکرد. سپس براى تمام همکارانش پست الکترونیک فرستاد و سوال را با آنها در میان گذاشت و با یکى دو نفر هم گپ ( chat ) زد ولى آنها هم نتوانستند کمکى کنند.

بالاخره بعد از ۳ ساعت، مهندس را از خواب بیدار کرد و ٥٠ دلار به او داد. مهندس مودبانه ٥٠ دلار را گرفت و رویش را برگرداند تا دوباره بخوابد.

برنامه‌نویس بعد از کمى مکث، او را تکان داد و گفت: «خوب، جواب سوالت چه بود؟»

مهندس دوباره بدون اینکه کلمه‌اى بر زبان آورد دست در جیبش کرد و ۵ دلار به برنامه‌نویس داد و رویش را برگرداند و خوابید.

نوشته شده توسط برنامه نویس  | لینک ثابت |

مثالی از کپسوله سازی سه شنبه بیست و چهارم آبان 1390 20:2
یک مثال ساده درباره کپسوله سازی می زنم. اگر من از کسی برایتان تعریف کنم که او را نشناسید و بگویم وی ۸۰ سال سن دارد شما چه تصوری از او در ذهن می آورید؟ اگر بگویم او ۱۰ سال دارد چه تصوری می کنید؟

حالا می خواهیم کلاسی بسازیم که با توجه به سن٬ او را توصیف کند! سپس به طور همزمان سه شی از آن کلاس میسازیم و توصیف هر سن را چاپ می کنیم.

نمای کلی کلاس ما به صورت زیر خواهد بود:

╗════════════════════════════╔
║      HumanSpecifier        ║
║----------------------------║
║                 int Age +  ║
║                            ║
║----------------------------║
║     ()string SpecifyHim +  ║
║                            ║
╝════════════════════════════╚

و کد نوشته شده به این صورت می شود:

using System;
namespace Samples
{
    public class Program
    {
        public static void Main()
        {
            HumanSpecifier obj1 = new HumanSpecifier();
            obj1.Age = 2;
            HumanSpecifier obj2 = new HumanSpecifier();
            obj2.Age = 25;
            HumanSpecifier obj3 = new HumanSpecifier();
            obj3.Age = 120;

            Console.WriteLine(obj1.SpecifyHim());
            Console.WriteLine(obj2.SpecifyHim());
            Console.WriteLine(obj3.SpecifyHim());
            Console.ReadLine();
        }
    }

    public class HumanSpecifier
    {
        public int Age;
        public string SpecifyHim()
        {
            string result = "";
            if (Age <= 5) { result = "He/She is baby"; }
            if (Age > 5 && Age <= 10) { result = "He/She is child"; }
            if (Age > 10 && Age <= 20) { result = "He/She is young"; }
            if (Age > 20 && Age <= 40) { result = "He/She is adult"; }
            if (Age > 40 && Age <= 60) { result = "He/She is mature"; }
            if (Age > 60) { result = "He/She is old"; }
            return result;
        }
    }
}

این مثال برای کسانیکه تجربه ای در برنامه نویسی دارند مثال ساده ای است. ولی برای مبتدیان می تواند حاوی نکته هایی باشد!

مسائل را هر چقدر هم که ساده باشد به صورت شی گرا تصور کنید و آن را به کلاسهای مختلف تقسیم کنید. این مساله به سادگی با یک برنامه ساختار یافته هم حل می شد و همین نتیجه را می داد و احتیاجی به نوشتن کدهای اضافه تر هم نبود! ولی کد کمتر نوشتن هنر نیست! اگر کد بیشتر نوشتن منجر به حل مساله به صورت گروهی بیانجامد٬ در پروژه های بزرگ٬ زمان مجموع حل مساله پیچیده ای که به چندین کلاس کوچکتر شکسته شده اند و مجموع کلاس ها مساله نهایی را حل می کند در نهایت کوچک خواهد بود و مهمتر از همه اینکه مدیریت و خطایابی منطقی کدها آسانتر می شود.

در این مثال ما سه شی را همزمان در اختیار داریم و اگر بخواهیم اشیای دیگری هم در اختیار داشته باشیم مشکلی نخواهیم داشت! چرا که فقط کلاس Program دست خواهد خورد و کلاس HumanSpecifier بدون تغییر خواهد ماند. این موضوع چند منفعت دارد. اول اینکه کدهای اضافه تر ذهن برنامه نویس را از مساله اصلی دور نمی کند. دوم اینکه می توانید HumanSpecifier را در یک کتابخانه دیگر قرار دهید و آن را در اختیار چند برنامه نویس دیگر نیز قرار دهید. سوم اینکه این کار باعث می شود سلیقه های کد نویسی محفوظ بماند...

نوشته شده توسط برنامه نویس  | لینک ثابت |

کپسوله سازی چهارشنبه ششم مهر 1390 8:26
اولین خاصیت شی گرایی کپسوله سازی (Encapsulation) است. احتمالا نام کپسوله سازی مفهوم واضحی نداشته باشد. ولی اگر به کپسول هایی که در اطرافمان هستند نگاهی بیندازید خواهید دید که این نام مناسب است. مثلا کپسول گاز یا کپسول دارو چه کاری انجام می دهد؟ در اصل کپسول محفظه ای است تا موادی را در خودش نگه داری کند که به راحتی جابجا شود.

در شی گرایی٬ کلاس ها همان کپسول ها هستند که فیلدها (متغیرها) و متدها (روال ها و توابع) رو در خودشون نگه میدارن تا مدیریت کدها در یک پروژه بزرگ رو کمی راحت تر کنند.

توجه کنید که قبل از برنامه نویسی شی گرا باید یک طراحی شی گرا انجام دهید. یعنی هنگام تجزیه و تحلیل مساله باید ببینید که چه قسمتهایی از کار رابطه تنگاتنگی با هم دارند و چه قسمت هایی از هم مستقل هستند.

مثلا یک دانشگاه را در نظر بگیرید. بخش اداری دانشگاه با بخش علمی دانشگاه دو کار متفاوت از هم انجام می دهند (و معمولا ساختمان های جداگانه ای دارند!) ولی تا مراحل اداری انجام نشده باشد بخش علمی به دانشجویان سرویس نمی دهد. (وابستگی به هر حال وجود دارد ولی از نظر کارکرد از هم مستقل هستند)

ولی قسمتهای داخلی هر بخش رابطه های نزدیک تری با هم دارند. مثل قسمت ثبت نام و انتخاب واحد. (وابستگی بیشتری وجود دارد ولی برای جلوگیری از تداخل مشکلات داخلی یکدیگر در اتاقهای جداگانه قرار دارند - به عبارتی کپسوله شده اند.)

در داخل هر قسمت هم تعدادی کارمند مشغول خدمات دهی هستند که رابطه تنگاتنگی با هم دارند و برای انجام کار مدارک را مدام بین هم منتقل می کنند. (وابستگی زیادی به هم دارند)

پس هر قسمت را می توان یک کلاس در نظر گرفت و کارهای داخل کلاس را با فیلدها و متدها ساماندهی کرد. همچنین بخش های بزرگتر را می توان کلاس بزرگتری در نظر گرفت که دارای اشیای دیگری در داخل خود هستند.

از آنجا که کپسول ها دارای ابعاد فیزیکی هستند - تا مواد داخل خود را نگهداری کنند - کلاس ها هم با یک مستطیل مدل سازی می شوند تا فیلدها و متدهای خود را نگهداری کنند.

╗════════════════════════════╔
║          نام کلاس           ║
║----------------------------║
║                            ║
║         نام فیلدها         ║
║                            ║
║                            ║
║----------------------------║
║                            ║
║          نام متدها         ║
║                            ║
║                            ║
║                            ║
║                            ║
╝════════════════════════════╚

نوشته شده توسط برنامه نویس  | لینک ثابت |

شی گرایی پنجشنبه سی و یکم شهریور 1390 17:24
دانشمندانی که شی گرایی را مطرح می کردند بر این عقیده بودند که این طرح در طبیعت بسیار اجرا شده است. مثلا هر سیبی که می خوریم نمونه ای است که از کلاس سیب گرفته شده و تفاوت آنها در مزه و بو و رنگ و شکل است که همه آنها را خواص میوه نامیده ایم. همچنین همه از کلاس میوه ها ارث برده اند که به نوعی دارای خواص مشترک مانند ویتامین ها هستند.
همچنین نکته دیگری را لحاظ کرده بودند که به آن چندریخیتی (polymorphism) می گویند. مثلا ما می دانیم که پرندگان از طریق تخم گذاری زاد و ولد می کنند. یک استثنا خفاش است که در عین حال که پرنده است بچه زا است.
معرفی شی گرایی٬ تحولی را در نگرش به مهندسی نرم افزار برانگیخت. بسیاری آن را تنها راه حل ادامه برنامه نویسی می دانستند و گروهی نمی توانستند خود را با آن وفق دهند. قدیمی ترها چندان نمی توانستند خود را تغییر دهند و مبتدیان آن را غول چراغ جادو می دانستند.
به هرحال با ظهور زبانهای شی گرا نتیجه برآن شد که همه خواسته و ناخواسته شی گرا می نوشتند در حالیکه طراحی برخی ها ساختاریافته بود.
شی گرایی دارای سه ویژگی اصلی است: ۱- کپسوله سازی٬ ۲- وراثت٬ ۳- چندریختی
طبق ادعاهای صورت گرفته این ویژگی ها مدیریت کدها را آسان تر می کرد. ولی برای مدیرانی که آن را درک نمی کردند صد البته مدیریت را سخت تر می کرد.
کپسوله سازی در اصل این امکان را فراهم می کرد تا متغیرهای Global برچیده شوند مگر آنکه برنامه نویس آن را مجاز بداند. همچنین توابع و زیربرنامه ها که دیگر با نام متد شناخته می شدند می توانستند خصوصی یا عمومی باشند. این گزینه باعث می شد تا دیگر کمتر نگران برنامه نویسهایی باشیم که توصیه های ایمنی را جدی نمی گرفتند.
وراثت برای توسعه بسیار مفید ارزیابی می شود. مثلا پسری که مانند پدرش است ولی سطح تحصیلاتش بالاتر است و قابلیتهای بیشتری مانند خلبانی را دارد. این کار می تواند با اضافه کردن کدی به انتهای یک متد از کلاس والده خودش صورت گیرد. بدون اینکه احتیاج به سورس آن کلاس داشته باشیم. این موضوع باعث می شود تا توسعه یک کلاس ضمن پنهان ماندن محتویاتش صورت پذیرد.
چندریختی هم از آن حرف ها است. شما یک متد را صدا می زنید ولی ممکن است یک کار دیگر انجام دهد. این جمله بسیار درک نشدنی است. در صورت تحقق این چنین امکانی که همه چیز به هم می ریزد. نکته در اینجاست که این به طریقه استفاده از چندریختی مربوط می شود. مثلا همه موجودات زنده فعل حرکت را اجرا می کنند. ولی یکی می خزد٬ یکی می پرد و یکی راه می رود و می دود. البته دست برنامه نویس برای توسعه باز است و در صورت استفاده نادرست ممکن است موجودی هنگام اجرای فعل حرکت مسواک بزند.
نوشته شده توسط برنامه نویس  | لینک ثابت |

سلام بر جهان! پنجشنبه ششم مرداد 1390 20:37
برنامه سلام برجهان! (!Hello World) به صورت یک برنامه سنتی درآمده که برای شروع به کار هر زبانی نوشته می شود! مثلا برنامه سلام بر جهان٬ در سی شارپ به شکل زیر نوشته می شود:

using System;
namespace Samples
{
        public class Program
        {
                  public static void Main()
                  {
                             Console.WriteLine("Hello World!");
                  }
        }
}

این برنامه را به سادگی می توان در یک فایل ذخیره کرد و با کامپایلر سی شارپ آن را کامپایل کرد. پس از کامپایل کردن یک فایل اجرایی به دست می آید که پس از اجرا کردن عبارت Hello World! در یک پنجره سیاه نمایش داده می شود.

هرچند برنامه های کاربردی به مراتب پیچیده تر هستند ولی این برنامه هم برای یک مبتدی پیچیدگی های خاص خودش را دارد. توجه کنید که برای نوشتن یک متن ساده چند خط برنامه نوشته ایم!

بیایید کمی خطوط نوشته شده را تجزیه و تحلیل کنیم.

خط اول (;using System): دستور using بیانگر این است که می خواهیم از یک namespace (فضای نام) استفاده کنیم. اسم این فضای نام System است. توجه کنید که در سی شارپ حروف کوچک و بزرگ با هم تفاوت دارند. همچنین انتهای هر دستور با یک ; مشخص می شود.

خط دوم (namespace Samples): دستور namespace فضایی را ایجاد می کند تا کلاس های خود را دسته بندی کنیم. مثلا وقتی می خواهیم یک ساختمان بسازیم٬ زمین ساختمان را به چند قسمت تقسیم می کنیم و برای آنها نامهایی اختصاص می دهیم. مثل آشپزخانه٬ اتاق خواب٬ اتاق پذیرایی و ... هر کدام از این اتاق ها یک namespace هستند. در اینجا اسم فضای نام را Samples گذاشته ایم.

خط سوم و آخر { } که به آن یک بلاک دستورات گفته می شود٬ محدوده یک دستور را مشخص می کند.

خط چهارم (public class Program): دستور public مشخص می کند که دسترسی٬ عمومی می باشد. دسترسی ها برای جلوگیری از خرابکاری های احتمالی به کار می روند. پنج نوع دسترسی وجود دارد که بعدا توضیح داده می شوند.

دستور class مشخص می کند که ما می خواهیم یک قالب بسازیم. مثلا برای تولید یک لیوان پلاستیکی٬ ابتدا قالبی برای لیوان ایجاد می کنیم که مشخصه های آن لیوان مانند شکل و اندازه را تعیین می کند و سپس شروع به ساختن خود لیوان می کنیم! کلاس (class) دقیقا همین مفهوم را دارد. قبل از اینکه برنامه ای که می نویسیم در حافظه قرار بگیرد٬ ابتدا کلاس آن نوشته می شود تا کامپایلر دقیقا بداند که چگونه باید به برنامه شما فضای حافظه اختصاص بدهد.

اسم کلاس در اینجا Program گذاشته شده است.

خط ششم ( ()public static void Main ): قبل از توضیح کلمه به کلمه دستورات باید بگویم که این خط به طور کلی معنای خاصی برای کامپایلر دارد. وقتی برنامه ای می خواهد آغاز به کار بکند باید از جایی شروع شود! در سی شارپ متد ()Main برای این منظور درنظر گرفته شده است و این خط به طور خاص مشخص می کند که برنامه از اینجا شروع به کار می کند.

خط هشتم ( ;("!Console.WriteLine("Hello World ): کلمه Console نام یک کلاس است. دستورات مختلفی در این کلاس وجود دارد که یکی از آنها WriteLine می باشد که پارامتر خود را (در اینجا Hello World!) درون یک پنجره سیاه نمایش می دهد.

اینکه از کجا باید کلاس ها و دستورات داخل کلاس ها را بشناسیم٬ باید بگویم فقط تجربه! هیچ کس نام تمام کلاسهای موجود را نمی داند! درست مانند اینکه هیچ کس نام تمام کتابهای جهان یا حتی یک کتابخانه بزرگ را نمی داند. بنابراین تنها کار این است که شروع به خواندن و تجربه بکنید تا بتوانید با استفاده از امکانات موجود در کلاسها یک برنامه بنویسید و بر کامپیوتر حکمرانی کنید تا تمام فرامین شما را یک به یک اجرا کند...

نوشته شده توسط برنامه نویس  | لینک ثابت |

برای برنامه نویسی از کجا شروع کنیم؟ سه شنبه بیست و یکم تیر 1390 19:59
سوال بسیار خوبی است! من هم هر وقت می خواهم یک زبان جدید یاد بگیرم همین سوال برایم پیش می آید! پاسخ این سوال ساده خیلی سخته... اول از همه باید تصمیم بگیرید که چه زبانی را می خواهید انتخاب کنید. زبانهای زیادی وجود دارد. درست مانند زبان انسانهای کشورهای مختلف (شاید هم بیشتر). هر چند برای نوشتن یک برنامه لازم است که حداقل یک زبان برنامه نویسی را بلد باشیم ولی این همه کار نیست! شما علاوه بر دانستن یک زبان باید در حل مسائل و طرح الگوریتم هم خلاقیت داشته باشید و این چیزی است که به یک برنامه نویس ارزش می دهد و او را حرفه ای می کند...

پس بیایید برای انتخاب زبان سخت گیری نکنیم! (مباحث مختلفی بین برنامه نویسان حرفه ای وجود دارد که قدرت فلان زبان از فلان زبان بیشتر و بهتر است. یا اینکه حتما باید از بیسیک شروع کرد...) من به تجربه دریافته ام که به هیچ چیز نباید تکیه کنی! در هنرستان به ما بیسیک می آموختند. بالطبع من هم برنامه نویسی را با بیسیک شروع کردم ولی به سرعت دریافتم که باید تمام آموخته هایم از بیسیک را کنار بگذارم چرا که درس بیسیک تمام شده بود و باید پاسکال یاد می گرفتیم و بعد از آن سی و غیره. پس تنها چیزی که از آموخته ها برایم باقی می ماند این بود که چطور می توانم یک مساله را با توجه به امکانات زبانی که می دانستم حل کنم. پس از سالها کار کردن با دلفی دوباره مجبور شدم زبان برنامه نویسی ام را عوض کنم! چرا که دلفی هم عمر خودش را به سرعت تمام کرد.

در حال حاضر به زبانهای ویژوال بیسیک دات نت و سی شارپ برنامه نویسی می کنم و هیچ بعید نیست که مجبور شوم آن ها را هم کنار بگذارم...

اگر بخواهیم کمی واقع بین باشیم٬ با توجه به وجود بیشترین دسترسی منابع (مستندات و مثالها)٬ بهتر است از زبان های مایکروسافتی (مثل همان ویژوال بیسیک دات نت و سی شارپ) استفاده کنیم.

و اگر بخواهی کمی دور اندیش باشیم٬ با توجه به هزینه های نرم افزارهای قانونی بهتر است به سراغ سیستم عامل لینوکس و زبانهایی مثل جاوا و پی اچ پی و امثالهم برویم.

ولی من فعلا واقع بین هستم تا دور اندیش! بنابراین از زبان سی شارپ استفاده می کنم.

برای شروع هم باید خیلی تلاش کنید. همانطور که یک موشک فضاپیما بیشترین تلاش و انرژی اش را در شروع پرتاب و کنده شدن از جاذبه زمین صرف می کند.

برای شروع آماده اید؟

نوشته شده توسط برنامه نویس  | لینک ثابت |

ماشین کامپیوتر دوشنبه سی ام خرداد 1390 18:57
برای توضیح کار ماشین پیچیده ای مثل کامپیوتر ابتدا باید جزئیات بی نهایتش را حذف کنیم و آن را تا حد امکان ساده کنیم... برای این کار فقط یک پردازنده و یک حافظه متصل به پردازنده را تصور می کنیم!

پردازنده از چند قسمت تشکیل شده که مهمترین قسمتهای آن "واحد حساب و منطق" (ALU) و "واحد کنترل" (Controller) است. در اصل تمام درخواست ها (دستورات کد شده برنامه ها) ابتدا از حافظه وارد واحد کنترل شده و این واحد وظیفه دیکد کردن دستورات را دارد و هر دستور را به واحد مربوطه انتقال می دهد تا انجام شود. (چیزی شبیه واحد پذیرش در بیمارستان!)

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

در این بین دستوراتی برای پردازنده در نظر گرفته شده که بتواند مقدار شمارنده را عوض کند تا روند حرکت کار تغییر کند. به این پرش (JUMP) گفته می شود.

با توجه به این که دستور چه باشد (مثل پرش٬ جمع٬ تفریق٬ ...) مقداری را بر دستور الزام می کند (مثل پرش به کدام آدرس؟ جمع یا تفریق چه مقادیری؟ ...). به این ترتیب به دستور٬ "عملگر" و به مقادیر لازم "عملوند" گفته می شود. نکته دیگر در رابطه با دستور "طول علوند" است. مثلا برای جمع دو عدد یک بایتی٬ دو بایت فضا لازم است که اگر یک بایت هم به دستور جمع اختصاص دهیم می شود سه بایت. ولی برای جمع دو عدد اعشاری ۱۶ بایت فضا لازم است... یعنی پردازنده برای اینکه بداند بعد از عملگر جمع باید چند بایت از حافظه را بخواند٬ باید نوع دستور جمع را بداند! به عبارت دیگر کد عملگر جمع یک بایتی ها با کد عملگر جمع دو بایتی ها متفاوت است.

به عنوان نمونه برنامه زیر محتوای دو متغیر (رجیستر) را با هم جمع می کند.

زبان اسمبلی کد عملیاتی هگزادسیمال کد عملیاتی باینری آدرس حافظه برنامه

LD A,E

7B

01111011

1800

ADD A,D

82

10000010

1801

LD L,A

6F

01101111

1802

LD A,0

3E00

0011111000000000

1803

ADC A,0

CE00

1100111000000000

1805

LD H,A

67

01100111

1807

RST 38H

FF

11111111

1808

به طور خلاصه می توان عملکرد کنترلر پردازنده را مانند چرخ دنده ای تشبیه کرد که با توجه به جریان ورودی الکتریسیته (دستور عملگر) می چرخد و مسیر جریان های دیگر (عملوندها) را به سمت واحد مخصوص هدایت می کند تا عمل مورد نظر در آن واحد ها صورت بگیرد...

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

نکته آخر اینکه بسیاری از کارهایی پیچیده ای که در نظر ما هستند٬ برای کامپیوتر چندان هم پیچیده نیست! مثلا همین خواندن و نوشتن وبلاگ٬ چیزی جز روشن و خاموش شدن نقاطی از صفحه نمایش نیستند... ولی برای رسیدن به این هدف٬ سالها تکامل لازم بوده و میلیونها دستور در ثانیه در حال اجرا است...

نوشته شده توسط برنامه نویس  | لینک ثابت |

در آغاز تاریخ... سه شنبه ششم اردیبهشت 1390 17:56

به نظرم بهتره از اول شروع کنم. از دوران ماقبل برنامه نویسی! تو اون دوران همه چیز به صورت الکترونیکی و با تعدادی دگمه کار می کرد. مثل رادیوهای عصر آهن! هنوز چیزی برنامه ریزی نمی شد و برای ساخت یک محصول می بایست اطلاعات زیادی از فیزیک و الکتریسیته و الکترونیک می دانستید. بخاطر همین هم بود که دانشمندان قدیمی مثل نیوتن همه چیز دان بودند و هر کس چیزی ابداع می کرد به ضمیمه تاریخ پیوست می خورد. (البته دلیل محبوبیت و معروفیت افرادی مانند نیوتن و اینشتین چیزهای دیگری بود.)

یکی از بهترین دیدگاههای ریاضی دانها توابع متناوب و تکرار شونده بود. علی الخصوص دایره بهترین شکلی بود که هندسه آن را کشید. چرا که هر چقدر می چرخید چیزی جز دایره تولید نمی کرد. بهترین جلوه فیزیکی دایره هم ساعت عقریه ای است. امروزه این دستگاه با حرکتهای متناوب اجسام درونش، یک دایره فرضی را در یک روز دوبار می چرخند.

این طرز تفکر که بتوان کارهای متناوب و تکراری را به صورت خودکار و بدون دخالت مستقیم انسان انجام داد موجب تولید صدها و هزاران محصول تکرار شونده مثل آبمیوه گیری و جاروبرقی و ... شد.

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

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

این بار سیستم عامل و کامپایلرها طراحی شدند تا بار کار تکراری را به دوش بگیرند و به عنوان لایه ای جلوتر از سخت افزار در ارتباط با انسانها باشند. بقیه داستان هم تکراری است. نسل های مختلف سیستم عامل و زبانهای برنامه نویسی لایه هایی ساختند تا کارهای تکراری را کم کنند.

اگر به الگوی ماشینهایی که در اطرافمان هستند توجه کنید می بینید که همه آنها مدام مشغول تکرار یک کار هستند. مثلا اتومبیل مدام مشغول انفجارهای کوچکی هست که نیروی محرکه ای را به چرخها برساند که مدام در حال چرخیدن باشند.

کامپیوتر هم از این امر مستثنی نیست. ولی شاید انقدر این کار را مخفیانه انجام می دهد که دستگاهی عجیب تر به نظر می رسد.

در قسمت بعدی راز کارهای تکراری این دستگاه را بیان می کنم.

نوشته شده توسط برنامه نویس  | لینک ثابت |

به توفیق خدای صانع پاک ... که دانش میدهد بر ملک و افلاک

ز بلبل نامه بیتی چند گویم ... چو آب رفته باز آمد به جویم

قلم برگیر ور از دل عیان کن ... سرآغازش به نام غیب دان کن

خداوندی که جز وی کس نشاید ... که تا بر بندگان روزی گشاید

قلم میشد به سر از درد هجران ... همی بارید خون بر شکل باران

چو بر کافر مشک ناب داده ... به زنجیرش سراسر اب داده

قلم غواص دریای معانی ... سخنهایش همه چون درّ کانی

ز بهر دردمندان غم گساری ... بماند تا قیامت یادگاری

بود روح و روان اهل دانش ... ز روی عقل و از افهام دانش

 

عطار نیشابوری

نوشته شده توسط برنامه نویس  | لینک ثابت |