تور لحظه آخری
امروز : پنجشنبه ، 24 آبان 1403    احادیث و روایات:  امام علی (ع):مرگ آرى امّا پستى و خوارى هرگز، به اندك ساختن آرى امّا دست سوى اين و آن دراز كردن هرگ...
سرگرمی سبک زندگی سینما و تلویزیون فرهنگ و هنر پزشکی و سلامت اجتماع و خانواده تصویری دین و اندیشه ورزش اقتصادی سیاسی حوادث علم و فناوری سایتهای دانلود گوناگون شرکت ها

تبلیغات

تبلیغات متنی

صرافی ارکی چنج

صرافی rkchange

سایبان ماشین

دزدگیر منزل

تشریفات روناک

اجاره سند در شیراز

قیمت فنس

armanekasbokar

armanetejarat

صندوق تضمین

Future Innovate Tech

پی جو مشاغل برتر شیراز

لوله بازکنی تهران

آراد برندینگ

خرید یخچال خارجی

موسسه خیریه

واردات از چین

حمية السكري النوع الثاني

ناب مووی

دانلود فیلم

بانک کتاب

دریافت دیه موتورسیکلت از بیمه

طراحی سایت تهران سایت

irspeedy

درج اگهی ویژه

تعمیرات مک بوک

دانلود فیلم هندی

قیمت فرش

درب فریم لس

زانوبند زاپیامکس

روغن بهران بردبار ۳۲۰

قیمت سرور اچ پی

خرید بلیط هواپیما

بلیط اتوبوس پایانه

قیمت سرور dl380 g10

تعمیرات پکیج کرج

لیست قیمت گوشی شیائومی

خرید فالوور

بهترین وکیل کرج

بهترین وکیل تهران

اوزمپیک چیست

خرید اکانت تریدینگ ویو

خرید از چین

خرید از چین

تجهیزات کافی شاپ

نگهداری از سالمند شبانه روزی در منزل

بی متال زیمنس

ساختمان پزشکان

ویزای چک

محصولات فوراور

خرید سرور اچ پی ماهان شبکه

دوربین سیمکارتی چرخشی

همکاری آی نو و گزینه دو

کاشت ابرو طبیعی و‌ سریع

الک آزمایشگاهی

الک آزمایشگاهی

خرید سرور مجازی

قیمت بالابر هیدرولیکی

قیمت بالابر هیدرولیکی

قیمت بالابر هیدرولیکی

لوله و اتصالات آذین

قرص گلوریا

 






آمار وبسایت

 تعداد کل بازدیدها : 1829426423




هواشناسی

نرخ طلا سکه و  ارز

قیمت خودرو

فال حافظ

تعبیر خواب

فال انبیاء

متن قرآن



اضافه به علاقمنديها ارسال اين مطلب به دوستان آرشيو تمام مطالب
archive  refresh

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


واضح آرشیو وب فارسی:راسخون:
آشنايي با طرز کار کامپايلرها
آشنايي با طرز کار کامپايلرها   نويسنده: سيمون هندباي مترجم: فاطمه الهياري   شايد کامپيوترها به اندازه کافي باهوش باشند تا ربات هاي انسان نما را کنترل کنند، احساسات انسان را تشخيص دهند و حتي به فهم و تقليد سخنان او بپردازند اما آنها هنوز هم تا راهيابي به پيچيدگي هاي دنياي ذهني انسان، راه پرپيچ و خمي در پيش دارند. مضاف بر اين، حتي اگر پردازنده هايي پر قدرت و پيشرفته به وجود بيايند باز هم احتمال شبيه سازي بيولوژي انساني، کاري ناشدني است. در اين ميان تعداد ماشين ها و انسان هايي که براي برنامه ريزي و دادن دستور العمل به ربات ها نيازمند زبان متفاوتي هستند، روز به روز افزايش مي يابد. کامپايلرها يا همان هم گردان ها در مبحث برنامه نويسي براي کامپيوتر نقش بسيار مهمي دارند. اگر چه نحوه صحبت و تفکر کامپيوتر و انسان کاملاً از يکديگر متفاوت است، اما پردازنده يک کامپيوتر به منظور تطابق کامل با نرم افزاري که قرار است توسط آن راه اندازي شود، نيازمند قرار گرفتن در يک مسير مشخص و قابل پيش بيني است. در واقع هر يک از اجزاي پردازنده بايد مجموعه دستورالعمل هاي يکساني را درک کرده و به دستور العمل مشابه آن نيز همواره پاسخ يکساني داشته باشند. اطمينان از درستي همواره چنين عملکردي، مستلزم اين است که پردازنده ها از يک ساختار استاندارد و پذيرفته شده برخوردار باشند. در کامپيوترهاي 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]

bt

اضافه شدن مطلب/حذف مطلب







-


گوناگون

پربازدیدترینها
طراحی وب>


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