محبوبترینها
نمایش جنگ دینامیت شو در تهران [از بیوگرافی میلاد صالح پور تا خرید بلیط]
9 روش جرم گیری ماشین لباسشویی سامسونگ برای از بین بردن بوی بد
ساندویچ پانل: بهترین گزینه برای ساخت و ساز سریع
خرید بیمه، استعلام و مقایسه انواع بیمه درمان ✅?
پروازهای مشهد به دبی چه زمانی ارزان میشوند؟
تجربه غذاهای فرانسوی در قلب پاریس بهترین رستورانها و کافهها
دلایل زنگ زدن فلزات و روش های جلوگیری از آن
خرید بلیط چارتر هواپیمایی ماهان _ ماهان گشت
سیگنال در ترید چیست؟ بررسی انواع سیگنال در ترید
بهترین هدیه تولد برای متولدین زمستان: هدیههای کاربردی برای روزهای سرد
در خرید پارچه برزنتی به چه نکاتی باید توجه کنیم؟
صفحه اول
آرشیو مطالب
ورود/عضویت
هواشناسی
قیمت طلا سکه و ارز
قیمت خودرو
مطالب در سایت شما
تبادل لینک
ارتباط با ما
مطالب سایت سرگرمی سبک زندگی سینما و تلویزیون فرهنگ و هنر پزشکی و سلامت اجتماع و خانواده تصویری دین و اندیشه ورزش اقتصادی سیاسی حوادث علم و فناوری سایتهای دانلود گوناگون
مطالب سایت سرگرمی سبک زندگی سینما و تلویزیون فرهنگ و هنر پزشکی و سلامت اجتماع و خانواده تصویری دین و اندیشه ورزش اقتصادی سیاسی حوادث علم و فناوری سایتهای دانلود گوناگون
آمار وبسایت
تعداد کل بازدیدها :
1829426423
آشنايي با طرز کار کامپايلرها
واضح آرشیو وب فارسی:راسخون:
آشنايي با طرز کار کامپايلرها نويسنده: سيمون هندباي مترجم: فاطمه الهياري شايد کامپيوترها به اندازه کافي باهوش باشند تا ربات هاي انسان نما را کنترل کنند، احساسات انسان را تشخيص دهند و حتي به فهم و تقليد سخنان او بپردازند اما آنها هنوز هم تا راهيابي به پيچيدگي هاي دنياي ذهني انسان، راه پرپيچ و خمي در پيش دارند. مضاف بر اين، حتي اگر پردازنده هايي پر قدرت و پيشرفته به وجود بيايند باز هم احتمال شبيه سازي بيولوژي انساني، کاري ناشدني است. در اين ميان تعداد ماشين ها و انسان هايي که براي برنامه ريزي و دادن دستور العمل به ربات ها نيازمند زبان متفاوتي هستند، روز به روز افزايش مي يابد. کامپايلرها يا همان هم گردان ها در مبحث برنامه نويسي براي کامپيوتر نقش بسيار مهمي دارند. اگر چه نحوه صحبت و تفکر کامپيوتر و انسان کاملاً از يکديگر متفاوت است، اما پردازنده يک کامپيوتر به منظور تطابق کامل با نرم افزاري که قرار است توسط آن راه اندازي شود، نيازمند قرار گرفتن در يک مسير مشخص و قابل پيش بيني است. در واقع هر يک از اجزاي پردازنده بايد مجموعه دستورالعمل هاي يکساني را درک کرده و به دستور العمل مشابه آن نيز همواره پاسخ يکساني داشته باشند. اطمينان از درستي همواره چنين عملکردي، مستلزم اين است که پردازنده ها از يک ساختار استاندارد و پذيرفته شده برخوردار باشند. در کامپيوترهاي PC، اپل و مکينتاش که از اواخر سال 2006 وارد بازار شده اند، اين پردازنده با نام x86 شناخته مي شوند. ساختار x86 پيشرفته کنوني، در واقع از ساختار 16 بيتي استفاده شده در پردازنده 8086 اينتل در سال 1978 نسخه برداري شده که بسط بيشتري يافته است. اگر ساختار يک کامپيوتر حاوي مشخصه هاي سطح پاييني باشد، جهت کارکرد بخش هاي متفاوت سيستم که ترتيب قرار گيري و عملکرد آنها از لحاظ فيزيکي مرتب شده است، نيازمند مشخصه هاي سطح بالاتري است که به ساختار مجموعه دستور العمل (ISA) معروف است و فرمان هاي (opcodes) را که براي عملکرد سيستم ايجاد شده اند، تعريف مي کند. با استفاده از اين مجموعه فرمان ها و برنامه هايي که بر اساس آنها و عموماً به زبان ماشين نوشته شده است، دادن دستورالعمل مستقيم به کامپيوتر امکان پذير مي گردد. تا همين اواخر تمامي برنامه هاي کامپيوتري با اين روش نوشته مي شدند و به اين ترتيب محدوديت هاي موجود در مسير برنامه نويسي نيز خيلي زود نقاب از چهره بر مي داشتند. نوشتن زبان ماشين نه تنها کار بسيار دشواري است، بلکه هر برنامه اي براي ساختار هر ماشيني کاربردپذير نيست؛ براي مثال برنامه هاي نوشته شده براي طيف 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 /ج
این صفحه را در گوگل محبوب کنید
[ارسال شده از: راسخون]
[مشاهده در: www.rasekhoon.net]
[تعداد بازديد از اين مطلب: 423]
صفحات پیشنهادی
-
گوناگون
پربازدیدترینها