میخوای با یک کلیک ساده عضو سایت بشی تا تجربه بهتری در CGSector داشته باشی؟
فقط کافیه روی دکمه زیر کلیک کنی
عضویت / ورود با حساب گوگل
all-started-with-a-01
شنبه 17 آبان 1393
در
مقالات

همه چیز از یک 0 و 1 شروع شد !

شنبه 17 آبان 1393
سلام خدمت همه دوستان عزیز و همراه های همیشگی وبسایت؛ بعد از مدتی در خدمت شما هستم تا راجع به مطلبی تخصصی یعنی توسعه نرم افزار صحبت کنیم. اگر عمری باشد در 30 جلسه با همدیگر اصول توسعه و پیاده سازی نرم افزارها را بررسی خواهیم کرد و طی یک پروژه عملی، پلاگین ساده ای برای نرم افزارهای مکس و مایا پیاده سازی خواهیم کرد. توضیح این نکته ضروری است که ما در این پروژه از شیوه کدنویسی، بصورت 3 لایه استفاده خواهیم کرد تا پلاگین ما متکی به یک Api خاص نباشد و شما بتوانید خروجی تمرین را برای هر نرم افزاری بهینه کنید. اما مطلب جاری به بررسی دنیای پر رمز و راز توسعه نرم افزار می پردازد و با هم با پیش نیازها و تاریخچه عجیب و شگرف دنیای نرم افزار آشنا میشویم؛ پس بدون حاشیه شروع میکنیم.
 

1. همه چیز از یک 0 و 1 شروع شد ؟

اگر بخواهیم به قدمت برنامه نویسی اشاره بکنیم، باید اعتراف کنیم که این شاخه از علوم حدود یک قرن از دنیای کامپیوترهای امروزی مسن تر است. اولین نمونه های  عملی برنامه نویسی در ماشینهای بافندگی ثبت شده است؛ و اولین نامی هم که برمیخوریم جکارد برمی در فرانسه است که ماشینی تولید کرده بود با استفاده از پانچ کارتهایی مخصوص، نوع بافت را عوض میکرد و تنوعی قابل قبول در این ماشین ایجاد کرده بود. شیوه اجرا بافت در ماشین بصورت پشت سر هم بود و این تکنولوژی امکان بافتهای پیچیده به کارگران معمولی میداد. همزمان با پیشرفت ماشینهای خودکار، جنبش های مخالفی برای جلوگیری از پیشرفت این عرصه ایجاد شد که معتقد بودند ظهور این ماشینها یعنی بیکاری کارگران؛ اما این انتقادات از تحقیق و پژوهش دانشمندان جلوگیری نکرد و به نظر شخصی خودم نقطه عطف دنیای کامپیوتر با ارائه تئوری بول توسط George Boole در سال 1847 شکل گرفت. نکته کلیدی این تئوری اثبات ارتباط علم منطق با ریاضیات بود که دقیقا خلاف تصور پیشینیان که بر این باور بودند منطق بخشی از فلسفه است نه ریاضی بود !!! و این یعنی انقلاب.
 
اما یک نکته جالب اینجاست که تغییر این تفکر و استفاده از این منطق در علوم کامپیوتر حدود 100 سال به درازا انجامید ! اگر حدود 80 سال را بنا به اختصار فاکتور بگیریم به اوایل دهه 40 میلادی میرسیم که ماحصل پیشرفت علوم الکترونیک و مهندسی های نوین، زمینه ساز تولید اولین ماشینهای الکترونیکی که قادر به محاسبات ساده بودند شد. اگر تصور شما این است که برنامه نویسی این ماشین ها بصورت دستوری بوده سخت در اشتباهید ! در این ماشینها سوییچ ها و دستورات توسط دکمه ها و کابلهای برق انجام میگرفته و برای اجرای برنامه های ساده و کوتاه نیاز به ساعتها و شاید روزها تنظیمات بوده است !
 
مقدمه ای بر دنیای برنامه نویسی
 
ظهور پدرخوانده
پدرخوانده مورد نظر ما شخصیت کورلئونه فیلمی به همین نام نیست و منظور ما دقیقا جان وان نیومن میباشد که در سال 1945 اصول بنیادی و اساسی کامپیوترهای نوین را مطرح کرد و به همین دلیل بنام پدر علم نوین کامپیوتر شناخته میشود. اما این اصول چیست ؟
 
Shared-program technique
طبق این اصل سخت افزار کامپیوترها باید بسیار ساده باشند و نیازی نیست که برای هر برنامه به صورت دستی سیم کشی و تجهیز شوند. در عوض، دستورات نرم افزاری باید از ترکیب همان دستورات ساده سخت افزاری تشکیل شوند و یک دستور نرم افزار مرکب و پیچیده تر را بسازند. این اصل سخت افزارها را ساده و دستورات نرم افزاری را پیچیده می کرد.
 
Conditional control transfer
بر طبق این اصل که تاثیر عمیقی بر توسعه برنامه نویسی گذاشته است، برنامه کامپیوتری می تواند شامل بلاک های کوچکتری از دستورات بنام زیر روال (Subroutine)  شود، که می توانند در هر جای برنامه اصلی جای گیرند. این بلاک ها می توانند هر چندبار که لازم است در هر کجای برنامه اصلی استفاده شوند. بخش مهم دیگری از این اصل، کنترل روند برنامه کامپیوتری توسط دستورات منطقی مانند IF…Then و حلقه هایی مانند FOR را امکانپذیر میکرد.
 
و این داستان ادامه دارد
اما هنوز همه چیز کامل نبود تا اینکه در سال 1948 یک پازل دیگر از علوم کامپیوتر با ارائه تئوری ارتباطات توسط شانن کامل شد. این تئوری اصول استفاده از منطق باینری (0 و 1) در محاسبات کامپیوتری را ارائه میکرد و دنیای صفر و یک ها (باینری) که اساس و پایه کامپیوترهای الکترونیکی امروزی هستند را شکل می داد. از اینجا بود که چگونگی و معماری زبان 0 و 1 برای ارتباط با ماشینها کامل شد و برنامه نویسی شکل کاملتری به خود دید.
 

2. همیشه پایه یک زن در میان است !!!

نکته جالبی در مورد اولین برنامه نویس دنیا مطرح شده است که صد البته مخالفانی دارد اما ذکر آن خالی از لطف نیست. در دنیای برنامه نویسی از ایدا لاولیس به عنوان اولین برنامه نویس دنیا نام میبرند و او در سال 1837 برنامه هایی برای ماشین محاسباتی تفاضلی و مکانیکی چارلز ببیج نوشت و نام خود را به عنوان اولین برنامه نویس دنیا مطرح کرد. پس یک زن اولین برنامه نویس دنیاست. وزارت دفاع آمریکا در سال ۱۹۷۹ به افتخار این دانشمند، نام وی را بر زبان برنامه نویسی ایدا (آدا) گذاشت. جامعه کامپیوتر بریتانیا نیز از سال ۱۹۹۸ جایزه ای با نام او به برگزیدگان این رشته اهدا می کند. همچنین از سال ۲۰۰۸ مسابقات سالانه ای برای زنان دانشجوی علوم رایانه با نام وی برگزار میشود.
 

3. ظهور، شکوه و جاودانگی

اما دنیای برنامه نویسی و کامپیوتر پس از شکل گیری زبان ماشین به نحوی دیگر و به سرعتی فوق تصور، پیشرفت کرد که ما بطور خلاصه تر به بررسی اتفاقات مهم این دوره میپردازیم.
 
1949 میلادی ظهور کد کوتاه (Short Code)
پس از ارائه 2 اصل نیومن، زبان برنامه نویسی بنام کد کوتاه (Short Code) به وجود آمد. دستورات آن به صورت یک سری صفر و یک، تشکیل شده بود و اولین زبان برنامه نویسی برای کامپیوترهای الکترونیکی بود. ساخت این زبان برنامه نویسی به عنوان اولین قدم در جهت ساخت دنیای برنامه نویسی امروز شناخته میشود.
 
1951 ظهور اولین کامپایلر دنیا
اولین کامپایلر دنیا در این سال توسط هاپر بنام A-0 ایجاد شد. اما کامپایلر چیست ؟ به زبان ساده کامپایلر برنامه ای است که زبانی ورودی را به زبان خروجی دیگری تبدیل میکند؛ مثلا کامپایلر زبان سی، این زبان را به زبان اسمبلی یا زبان ماشین تبدیل میکند. اما صرفا کامپایلرها در علوم برنامه نویسی کاربرد ندارند و در جاهای متعددی و دقیقا هر جایی که با هر زبانی در ارتباط هستیم کاربرد دارند مثلا کامپایلری میتوانیم طراحی کنیم که زبان انگلیسی را به فارسی برساند ! نکته جالب دیگری که اینجا هست در رشته مهندسی نرم افزار درسی بنام اصول طراحی کامپایلرها هست که متاسفانه چون این درس بصورت اختیاری قرار دارد خیلی از عزیزان ترجیح میدهند به سمت آن نروند.
 
فرترن متولد شد
در سال 1957 زبان فرترن که اسم آن از FORmula TRANslating system گرفته شده بود به عنوان اولین زبان امروزی دنیا متولد شد. با ظهور این زبان دستورات برنامه نویسی ایجاد شد و شما کمتر از زبان سطح پایین ماشین در آن استفاده میکنید. دستورات بصورت IF و GOTO و ... اولین بار در این زبان استفاده شد و بحث تعریف داده به شکل امروزی نیز اولین بار در این زبان شکل گرفت. نکته ظریف این موضوع معرفی توسط IBM
 
ظهور زبان های متعدد جدید
با ارائه نسل جدید زبانهای برنامه نویسی دنیا، زبانهای بسیار متعددی در سالهای کوتاهی ارائه شد که BASIC, COBOL, B, C , PASCAL و ... از این دسته هستند (تا 1971 حدود 200 زبان ایجاد شد !) بدلیل اینکه زبانهای متعددی از این به بعد ایجاد شدند، بهتر است برای آشنای بیشتر با زبانهای برنامه نویسی، آنها را طی دسته بندی منسجم تری بررسی کنید که پیشنهاد من بررسی نسلهای زبانهای برنامه نویسی است که در این تاپیک در تالار گفتگو به صورت کامل به آن پرداخته ام.
 
مقدمه ای بر دنیای برنامه نویسی
 
یکی برای همه، همه برای یکی
یکی از موضوع هایی که حتما در این مقاله باید به آن اشاره بکنم بحث شی گراییست. حتما شما تا حالا نام برنامه نویسی شی گرا یا OOP را شنیده اید؛ اما به واقع این شی گرایی چیست ؟ به هر زبان برنامه نویسی که از اصول سه گانه شی گرایی حمایت کند، زبان شی گرا گفته میشود. اصول سه گانه شی گرایی به شرح زیر نعریف میشود:
 
1. کپسوله سازی
به فرض شما قصد تغییر منزلتان را دارید؛ پس نیاز به اسباب کشی امری بدیهی است. پس یکی از کارهایی که ممکن است انجام دهید دسته بندی وسایل مشترک و قرار دادن آن در کارتنی مخصوص و بسته بندی آن است. خب دقیقا در شی گرایی به این موضوع کپسوله سازی میگویند. به عبارت صحیح تر کپسوله سازی مکانیزمی عالی برای دسته بندی و همچنین حفاظت از اشیا در دنیای شی گرایی است. مثالهایی هم در زبان C++  و هم C#
 
public static void Main (string[] args)
{
    Matrix mt = new Matrix (10, 10);
    mt.print ();
}
 
class Matrix
{
        private int row, col;
        private int[,] array;//=new int[100,100];
        public Matrix(int RowCount,int ColCount)
    {
        this.row = RowCount;
        this.col = ColCount;
        this.array=new int[RowCount,ColCount];
    }
 
public void print()
    {
        Console.WriteLine (string.Format ("\nrow={0}\ncol={1}\n", row.ToString (), col.ToString ()));
    }
}
 
class Matrix
{
    private:
        int row, col;
        int *array;
    public:
        Matrix(int RowCount,int ColCount)
    {
        row = RowCount;
        col = ColCount;
        array = malloc(row * col * sizeof(int));
    }

void print()
    {
        cout<<row<<col;
    }
};
 
void Main ()
{
    Matrix mt(10, 10);
    mt.print ();
}
 
خب در مثال بالا ما کلاسی برای کار بر روی ماتریس ها ایجاد کرده ایم و اگر دقت کنید اعضای کلاس مثل تعداد سطر و ستون و همچنین آرایه ای که مقادیر ماتریس را در درون خود نگه داشته را بصورت خصوصی تعریف کردیم و به اصلاح حفاظت کرده ایم. در شی گرایی مفهوم کپسوله سازی با کلاس پیاده سازی میشود.
 
2. وراثت
در جهان واقعی فرزند، صفتهایش را از پدر و مادر به ارث میبرد. در کدنویسی ما با استفاده از این  قابلیت در کنار ایجاد کدی تمیز، در حجم کد نیز به طرز قابل ملاحظه ای صرفه جویی کرده ایم. در شی گرایی کلاسیک رابطه is a برای بررسی وراثت استفاده میگردد. مثال :
 
class shape{}
class rectangle{}
rectasngle is a shape? Yes yess
 
در نتیجه میتوانیم از وراثت استفاده کنیم. پس فقط در تعریف کلاس rectangle اصلاح کوچکی ایجاد میکنیم :
 
class rectangle : shape
{
}
 
اگر قصد بررسی صرفه جویی در کدنویسی با استفاده از وراثت را دارید به مثال زیر توجه کنید :
 
class Parent
{
    private string message;
 
public string Message
    {
        get { return message; }
        set { message = value; }
    }
 
public void ShowMessage()
    {
        Console.WriteLine(message);
    }
 
public Parent(string message)
    {
        this.message = message;
    }
}
 
class Child : Parent
{
    public Child(string message) : base(message)
    {}
}
 
در مثال بالا کلاس child تمامی متدها (توابع) کلاس parent را دارد؛ بدون نوشتن یک خط !
 
3. چند ریختی
اصل سوم از اصول اساسی شی گرایی چند ریختی است. اجازه بدهید که برای فهم بیشتر این اصل از مثالی که چند سال پیش از کتاب جاوا نوشته جیمز گاسلینگ خواندم استفاده کنم :
 
یک سگ دارای حس بویایی است ! زمانیکه بوی غذا حس کند؛ از دهان سگ آب راه افتاده و زبانش را بیرون می آورد. زمانیکه بوی دشمن حس کند؛ پارس کرده و آماده حمله میشود. و ...
 
اگر مثال بالا بیشتر بررسی کنیم متوجه میشوم حس بویایی با وجود اینکه همیشه ثابت بوده بسته به فاکتوری مثل بوهای مختلف، واکنش های مختلف سگ را ایجاد کرده یا به عبارت شی گرایی ریختهای مختلفی از واکنش های سگ ایجاد کرده که به این مفهوم چندریختی میگویند ! اجازه دهید که توضیحات بیشتر را در مورد شی گرایی به آموزشهای آینده منتقل بکنم. در این مقاله صرفا قصد آشنایی اولیه با دنیای برنامه نویسی و شی گرایی داشتم تا باب مقاله های تخصصی توسعه و برنامه نویسی در این سایت باز بشود. این دنیا بسیار نامحدود است و اگر بخواهیم با همه آن آشنا شویم یک عمر هم کم است. دلیل صحبت از شی گرایی در جهت آشنایی دوستانی که قصد توسعه پلاگین برای نرم افزارهای 3 بعدی مثل مکس و مایا دارند و میخواهند از SDK این نرم افزارها استفاده کنند بود و بدانند که دنیای شی گرایی نه تنها سخت نیست بلکه فوق العاده است. اکثر SDK نرم افزارها فقط برای Visual C++ هستند و از اینرو حتما باید دوستان عزیز با مفهوم شی گرایی آشنا بشوند. استفاده از زبانهای MaxScript و Mel و Python خوب است اما استفاده از C++  عالیست !
 
مقدمه ای بر دنیای برنامه نویسی
 
خب بحث را کوتاه میکنم و امیدوارم نظر دوستان در مورد دنیای توسعه و کدنویسی یا پیشنهاد های سازنده و یا بیان خاطرات و همچنین تعریف تجربه شخصیشون توی قسمت نظرات ببینیم و امیدوارم این مقاله مورد عنایت دوستان قرار بگیرد. توضیح این نکته ضروریست که همراهی شما دلگرمی همه عزیزان در سایت میباشد پس منتظر حمایتهای گرم شما هستیم.
 

اشتراک گذاری:

دیدگاه ها ( 54 نظر )

دیدگاه خود را بنویسید