نوشته شده توسط : مهدی فیضی

تا همين اواخر تمامي برنامه هاي کامپيوتري با اين روش نوشته مي شدند و به اين ترتيب محدوديت هاي موجود در مسير برنامه نويسي نيز خيلي زود نقاب از چهره بر مي داشتند. نوشتن زبان ماشين نه تنها کار بسيار دشواري است، بلکه هر برنامه اي براي ساختار هر ماشيني کاربردپذير نيست؛ براي مثال برنامه هاي نوشته شده براي طيف zx در يک کامپيوتر PC قابل اجرا نمي باشد.
در دهه هاي 1950 و 1960 و با ظهور زبان هاي برنامه نويسي مانند FORTRAN و COBOL که کاملاً مستقل از ماشين بودند، معايب اين گونه برنامه نويسي ها نمود بيشتري يافت. اين زبان هاي سطح بالاتر (و معادل هاي پيشرفته آنها مانند برنامه C++) به برنامه نويسي امکان مي دهند تا کدهاي برنامه را به طريقي ساده تر و مفهوم تر براي انسان به تحرير در آورد. استفاده از زبان هاي سطح بالاتر همچنين نياز به کدنويس براي فهم تمام کليات و جزئيات پنهان در ISA را از بين مي برد زيرا کامپيوتر هنوز هم براي فهم دستورات از زبان کاربرد، نيازمند يک هم گردان براي ترجمه کدهاي زبان برنامه به زبان ماشين جهت اجرا شدن در ساختار مقصد است.
تبديل کدهاي يک زبان سطح بالاتر به دستورالعمل هاي سطح پايين تر بايد به درستي صورت گيرد که در جاي خود کاري بسيار دشوار است. اين تغيير و تبديل شباهت چنداني به ترجمه بين دو زبان مثلاً از فرانسه به انگليسي ندارد و بيشتر به مانند بازنويسي يک دستورالعمل در زبان انگليسي (براي مثال «از اينجا به سمت يک پنجره ديگر حرکت کن») با تمام جزئيات آن است. هم گردان در اين حالت به جاي جايگزيني گنگ لغات يک زبان با معادل آن در زبان ديگر، بايد کدهاي برنامه اي که مشغول ترجمه آن است را کاملاً « درک نمايد.»

آشنايي با طرز کار کامپايلرها

ساختار LEX

زماني که هم گردان از درک کدهاي يک برنامه باز مي ماند در ابتداي امر به جاي اينکه کد مورد نظر را به صورت بخش هاي حاوي دستورالعمل، تعاريف و غيره ببيند آن را به شکل رديفي از کاراکترها در مقابل خود مشاهده مي کند. يک هم گردان در اولين گام بايد اين کد را طبق قوانين زباني که به آن نوشته شده است، مورد بررسي قرار دهد و سپس آن را به بخش هايي که با نام تک واژه ها (lexemes) شناخته مي شوند، تقسيم بندي نمايد. اين کدها بايستي بر اساس معني و مفهومي که با خود دارند، با نظمي مشخص کنار يکديگر قرار گيرند تا به ايجاد يک تکه داده (token) بيانجامند. براي درک راحت تر اين مفهوم مي توانيد تجزيه و تحليل يک جمله انگليسي مانند: The cow jumped over the moon (گاو روي ماه پريد) را به ذهن بياوريد.


نخستين گام درتحليل لغوي، بررسي تمامي تعابير برخاسته از يک کد و تلاش براي کنار هم قرار دادن گروه کاراکترهاي نزديک به هم در قالب يک تک واژه است که مثلاً در مورد جمله انگليسي مذکور، اين مفهوم را مي توان در تشخيص چارچوب هاي معنايي هر کلمه جست و جو کرد. تحليلگر واژه به هنگام تجزيه و تحليل يک کد، تمامي اجزاي کاراکترهاي معتبر و احتمالي و مرتبط با تک واژه کاربردي را مي شناسد و کار را ابتدا از کاراکترهاي محتمل تر شروع مي کند. در اين مرحله، هدف شناسايي تک واژه هاي شکل گرفته در طويل ترين رديف کاراکترها است که با قوانين زبان برنامه در تناسب باشند: انجام اين کار از تعداد تکه داده هاي توليد شده در تحليل ها مي کاهد و کدهاي بهتري را به دست مي دهد. در نمونه ذکر شده، تحليلگر به جاي توقف روي کلمه «jump» (پريدن)- که واژه اي درست است – راه خود را ادامه داده و با تشخيص «ed» آخر کلمه، تک واژه طويل تري به دست مي آورد.


تحليلگر لغوي در صورت يافتن هر گونه عدم تناسب بين کاراکترها و قوانين تک واژه هاي موجود، پيغام خطا مي دهد و در اين حالت برنامه نويس بايد آن را مورد بازنويسي قرار داده يا حذف نمايد. در غير اين صورت تحليلگر کد مورد نظر را براي تجزيه تک واژه هاي شناسايي شده به کار مي گيرد و محتواي کد را بدون تغيير باقي مي گذارد. هر تک واژه در قالب يک تکه داده نوشته شده است که ارزش و نوع منحصر به خود را دارد: در نمونه جمله انگليسي که قبلاً ذکر شد، هر تکه داده بايد شامل يک طبقه بندي واژگاني باشد که به وسيله خود کلمه دنبال شود: براي مثال اسم: cow، فعل:jumped و غيره.


برخي از هم گردان ها به واسطه يک مرحله پيش پردازش، که از قوانين کاربردي دقيق در کدهاي منبع پيروي مي کند، به ادامه يا ترکيب تحليل لغوي مي پردازند. در ابتدايي ترين هم گردان ها جايگزين هاي تعريف شده ساده اي براي کاربر وجود دارد که شبيه به عملکرد برنامه word در يافتن و جايگزيني لغات است اما اين پردازش در کامپايلر C و ++C پيچيدگي بيشتري دارد. برنامه نويس با استفاده از کدي که در ابتداي خط نشان قرار دارد، به کامپايلر فرمان مي دهد تا عملکردهاي پيچيده تري مانند افزودن بخشي از يک کد که در حال حاضر جاي ديگري نوشته شده است را به اجرا بگذارد. اين کار به برنامه نويس امکان مي دهد تا يک جريان يا شي را در بخشي از پروژه تعريف کرده و يا آن را در بخش ديگري مورد استفاده مجدد قرار دهد.


در هم گردان ++C، مرحله پيش پردازش با يک همسان يابي مهم سروکار دارد که به برنامه نويسان امکان مي دهد بلوک هاي کدي را که تنها در شرايط خاص، مانند زماني که پلتفورم مقصد ويندوز يک PC است، ترجمه مي شود، بنويسند. در يک فضاي بسط يافته که پلتفورم هاي متفاوتي قابليت ترجمه مي يابند، اين کار مي تواند در اضافه کردن کد مورد نياز براي يک ساختار مشخص و به خصوص، روش مفيدي محسوب گردد.


آشنايي با طرز کار کامپايلرها

تحليل اجزا

با به رمز درآوردن کد منبع و اتمام تمامي فرايندهاي پيش پردازش، بايد اطمينان حاصل شود که زبان حاصل منحصراً در بر گيرنده اصطلاحات زبان منبع است. اين کار بيشتر با اين هدف انجام مي پذيرد که جملات در تمامي زمينه هاي مورد استفاده، معناي درستي داشته و هيچ يک از جملات ضروري حذف نشده باشند. فرآيندي که در زبان هاي برنامه نويسي به عنوان تحليل نحوي از آن ياد مي شود، مجموعه قوانيني را به کار مي بندند که مشخص مي کند کدام تکه داده توانايي ساختن يک اصطلاح معتبر را طي يک ترتيب قرار گيري منظم از تکه داده ها دارد.


زماني که يک کد در مطابقت با قوانين دستوري زبان قرار مي گيرد، تحليلگر کامپيوتر شروع به تجديد ساختار آن بر اساس معنا مي نمايد. اين کار مستلزم تبديل رديف هاي طولي تکه داده ها به ساختاري با نام درخت تجزيه است ( گام 3 در نمودار) که ترکيب دستوري اصطلاحات زبان مبدأ را نشان مي دهد. ذکر اين نکته لازم است که تمامي عملکردهاي انجام شده در کد منبع اصلي تاکنون در بخشي از هم گردان با نام نرم افزار نهايي صورت گرفته اند.


پس از تکميل درخت تجزيه، هم گردان قادر است معني کد را مورد بررسي قرار داده و ايجاد دستورالعمل هاي مورد نياز براي اجراي آن را بررسي کند. عملکردها، تعاريف و ديگر مؤلفه هاي کد برنامه به زبان اوليه مختص هم گردان که امکان تحليل هاي بعدي از بستر آن وجود دارد، ترجمه شده اند. در آخر، هم گردان کد اوليه را مورد آزمايش قرار مي دهد و اطلاعات مرتبط با برنامه، مانند داده هاي در حال تهيه را يکپارچه سازي کرده و منابع احتمالي مورد نياز و آن دسته از عملکردهاي برنامه را که ناگزير روي نتايج عملکرد ديگر بخش ها وابسته اند را اصلاح و ذخيره سازي مي کند. تمامي اين ملاحظات مسيرش شکل گرفتن ساختار کد خروجي را طرح مي نمايد.


هم گردان در صورت داشتن فهم بهتر از کد کنوني ارائه شده در زبان هاي سازگار با ماشين، قادر است آن را ارتقاء ببخشد که اين يکي از مهم ترين عملکردهاي يک برنامه هم گردان است. برنامه هم گردان در ابتدا روش هايي را جست و جو مي کند که از طريق آنها با استفاده از حافظه و حتي صرف انرژي کمتر، کدهاي متفاوت، امکان اجرا شدن داشته باشند. تحقق اين هدف، از راه هاي متفاوتي مانند حذف بقاياي « کدهاي راکد» که وجود آنها براي برنامه ضروري نيست، امکان پذير است؛ زيرا براي مثال آنها عملکردهاي بي ثبات و متغيري را به اجرا مي گذارند که منبع آن مشخص نيست.


کد راکد به جاي اينکه يک فاجعه استفناک تصور شود، مي تواند به عنوان حاصل يک برنامه نويسي ناقص يا بد تلقي گردد که از تفاوت بين آنچه براي انسان به صورت شهودي است و آنچه براي کامپيوتر کارآمد است، ناشي مي شود. يک لوپ ساده کد، به مانند آنچه که به وسيله FOR و NEXT در يک زبان تعريف شده اند، مي تواند نمونه خوبي براي مورد ذکر شده باشد.


حلقه ها به برنامه نويسان امکان مي دهند تا از ساده ترين راه ممکن به تکرار بخشي از يک کد براي تمام موقعيت هاي مشابه يا براي يک دوره زماني خاص بپردازند؛ اما از آنجا که حلقه ها روش کارآمدي براي انسان در سازماندهي کدها هستند، تجزيه يک حلقه در طول بهينه سازي احتمالاً آشکار مي کند که تبديل يک حلقه پيچيده به چندين حلقه ساده يا حتي يک حلقه کوتاه با محتواي ساده و قابل استفاده در زمان هاي مختلف، مي تواند به افزايش سرعت کامپيوتر منجر گردد.


با تجزيه و بهينه سازي کد از اين روش، برنامه نويس از طريق هم گردان امکان مي يابد تا به هنگام آزمايش نهايي کارآمدي و کارايي کدها، با آنها به زباني که براي خودشان قابل فهم است، کار کند. بهينه سازي عملاً فرآيندي دائمي است و زماني که هم گردان، کدها را در قالب دستورالعمل به سيستم مقصد ارائه مي کند، به جريان در مي آيند. ضرورت اين رويکرد مرحله بندي شده از آنجا ناشي مي شود که اغلب ارتقا بخشي از يک کد ترجمه شده به شکل ساير بخش هاي ترجمه شده است.


آخرين بهينه سازي به پلتفورم مقصد اختصاص دارد و به عملکردهاي شناخته شده کمک مي کند تا در ساختار مد نظر سريع تر عمل نمايند و يا به برنامه ريزي محاسباتي مجدد مي پردازد که مستلزم انجام گرفتن در يک مجموعه منظم نيست. به هنگام عملياتي شدن کدها، بررسي نوع اطلاعاتي که بايد در بخش هاي مختلف ذخيره اطلاعات قرار گيرد، سبب مي شود فرآيند بهينه سازي زمان مورد نياز جهت حذف داده هاي اضافي را در زمان قبل و بعد از محاسبات کاهش دهد. براي مثال در حالي که کد اصلي هنوز محاسبه دوم را برنامه ريزي نکرده است، محاسبه دوم بلافاصله بعد ازمحاسبه اول انجام مي پذيرد.


آشنايي با طرز کار کامپايلرها

تفسير

زماني که کد نهايي توسط هم گردان توليد مي شود و آمادگي اجرا در سيستم مقصد را مي يابد، خصوصاً براي کاربري هاي اينترنتي مانند Google Map که نيازمند کار در پلتفورم هاي متفاوت است، هميشه به نحو ايده آلي پاسخگوي نيازها نيست. يکي از راهکارها اين است که يک کد واسط با قابليت اجرا در يک ماشين مجازي ترجمه، در سيستم مقصد به وجود آيد؛ به طوري که در زمان اجرا، شرايط و فضاي مناسبي را فراهم آورد. اما اين رويکرد بدين معنا نيست که کد واسط تنها مختص سيستم مقصد است و نقايص آن، شامل کند شدن عملکرد يک ماشين مجازي و ارائه تفسير و ترجمه يک رديف مشابه از کدها، در هر زمان امکان بروز دارند.


فضاهاي توسعه يافته اي مانند جاوا و مايکروسافت دات نت، مي توانند در جايي که کد واسط مستقيماً در زمان اجرا به دستورالعمل هاي کد ماشين ترجمه مي شود، يک برنامه هم گردان «هم زمان» را به اجرا در بياورند. اگر چه اتخاذ چنين رويکردي مستلزم اشغال حجم زيادي از حافظه و کندي راه اندازي يک برنامه است، اما معمولاً در زمان توليد کدهاي آشنا با ISA سيستم مقصد، بسيار سريع تر از يک ماشين مفسر عمل مي کند. به علاوه اين روش هر بلوک از کد را با هدف اينکه تنها يک بار مورد ترجمه قرار گيرد، ذخيره مي نمايد.


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


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


منبع:نشريه دنياي کامپيوتر و ارتباطات، ش 90

 




:: بازدید از این مطلب : 69
|
امتیاز مطلب : 16
|
تعداد امتیازدهندگان : 4
|
مجموع امتیاز : 4
تاریخ انتشار : سه شنبه 17 خرداد 1390 | نظرات ()
مطالب مرتبط با این پست
لیست
می توانید دیدگاه خود را بنویسید


نام
آدرس ایمیل
وب سایت/بلاگ
:) :( ;) :D
;)) :X :? :P
:* =(( :O };-
:B /:) =DD :S
-) :-(( :-| :-))
نظر خصوصی

 کد را وارد نمایید:

آپلود عکس دلخواه: