"ഗ്നു കമ്പൈലർ ശേഖരം" എന്ന താളിന്റെ പതിപ്പുകൾ തമ്മിലുള്ള വ്യത്യാസം

12,305 ബൈറ്റുകൾ കൂട്ടിച്ചേർത്തിരിക്കുന്നു ,  9 വർഷം മുമ്പ്
ലേഖനത്തിൽ കൂട്ടിച്ചേർക്കലുകളും അവലംബം നൽകലും
(ലേഖനത്തിൽ കൂട്ടിച്ചേർക്കലുകളും അവലംബം നൽകലും)
 
=== മധ്യഭാഗം ===
മധ്യഭാഗം എല്ലാ പ്രോഗ്രാമിങ്ങ് ഭാഷകൾക്കും ഒന്നുതന്നെ. ഈ ഭാഗത്ത് വച്ച് പ്രോഗ്രാമുകളിൽ കമ്പൈലർ‌ പലവിധത്തിലും ഉള്ള മാറ്റങ്ങൾ വരുത്തുന്നു. അവസാനമായി ഉണ്ടാകുന്ന പ്രോഗ്രാമിന്റെ വലിപ്പം കുറക്കാനോ പ്രവർത്തന സമയത്തെ വേഗത വർദ്ധിപ്പിക്കാനോ ഒക്കെ ഉദ്ദേശിച്ചുള്ളവയാണ് ഈ മാറ്റങ്ങൾ‌. ഇതിനെ മെച്ചപ്പെടുത്തലുകൾ (ഓപ്റ്റിമൈസേഷൻ) എന്ന് വിളിക്കുന്നു. ഇത്തരം മെച്ചപ്പെടുത്തലുകൾ എല്ലാ ഭാഗത്തുവച്ചും നടക്കാറുണ്ടെങ്കിലും മധ്യഭാഗത്ത് വച്ചാണ് ഏറ്റവുമധികമായി നടക്കുന്നത്. മുൻഭാഗത്തിന് പ്രോഗ്രാം എന്ത് എന്തുചെയ്യുന്നു, അതിലെ നിർദ്ദേശങ്ങൾ ഏത് ക്രമത്തിലാണ് പാലിക്കപ്പെടുക എന്നിങ്ങനെയുള്ള കാര്യങ്ങൾ അറിയാൻ സാധിക്കില്ല. നിർദ്ദേശങ്ങളെ ജെനറിക് രീതിയിലേക്ക് മാറ്റുക, പ്രോഗ്രാമിങ്ങ് ഭാഷയുടെ വ്യാകരണം പാലിക്കപ്പെട്ടിട്ടുണ്ടോ എന്നുറപ്പുവരുത്തുക എന്നിവ മാത്രമാണ് അതിന് ചെയ്യാൻ സാധിക്കുന്നത്. എന്നാൽ മധ്യഭാഗം കൂടുതൽ കാര്യക്ഷമമായ രീതിയിൽ തന്നെ പ്രോഗ്രാമിനെ അപഗ്രഥിക്കുന്നു. ഭാഷാ വ്യാകരണങ്ങൾ തുടങ്ങിയവയിൽ പ്രശ്നങ്ങൾ ഉണ്ടെങ്കിൽ ആദ്യ ഭാഗം തന്നെ ഉപഭോക്താവിന് സന്ദേശം നൽകി കമ്പൈലിങ്ങ് നിർത്തി വയ്ക്കും. ബീജഗണിത സമവാക്യങ്ങളെ ലളിതമാക്കുക മുതലായ നിരവധി മെച്ചപ്പെടുത്തലുകൾ മധ്യഭാഗം നടത്തുന്നു. ഉദാഹരണമായി, a = a + 1 + 9 എന്ന പ്രസ്താവനയെ a = a + 10 എന്നാക്കി മാറ്റുന്നു. പ്രോഗ്രാം പ്രവർത്തിക്കുന്ന സമയത്ത് നടക്കുമായിരുന്ന രണ്ട് സങ്കലന പ്രക്രിയകളെ ഒന്നാക്കി കുറക്കാൻ ഇതുകൊണ്ട് സാധിക്കും. മറ്റൊരു ഉദാഹരണത്തിന് ഒരു ലൂപ്പ് പരിഗണിക്കാം,
 
int a, b = 10;
for (i=0; i < 3; i++) {
a = b;
printf("%d", a);
}
 
എന്നതിൽ a എന്ന ചരത്തിന്റെ മൂല്യം മൂന്ന് തവണ ആ പ്രസ്താവനയിലൂടെ കടന്ന് പോകുമ്പോളും മാറുന്നില്ല. അതിനാൽ കമ്പൈലർ അതിനെ ലൂപ്പിന് പുറത്തേക്ക് മാറ്റും. b എന്ന ചരം വേറെ എവിടെയും ഉപയോഗിക്കുകയോ അതിന്റെ മൂല്യത്തിൽ മാറ്റം വരികയോ ചെയ്യുന്നില്ല. അതിനാൽ ആ ചരത്തിന്റെ ആവശ്യം തന്നെ വരുന്നില്ല. ഇത് കൂടാതെ പ്രോഗ്രാമിന്റെ വേഗത വർദ്ധിപ്പിക്കുന്ന തരത്തിലുള്ള മെച്ചപ്പെടുത്തലാണ് നടത്തുന്നതെങ്കിൽ മൂന്ന് തവണ മാത്രമാണ് ആ ലൂപ്പിലെ പ്രസ്താവനകളെ പ്രവർത്തിപ്പിക്കേണ്ടത് എന്നത് പരിഗണിച്ച് ആ ലൂപ്പ് ഒഴിവാക്കി പകരം മൂന്ന് തവണ printf("%d", 10); എന്നതിന് സമമായ പ്രസ്താവനകൾ അവിടെ ചേർക്കുന്നു. പ്രവർത്തന സമയത്ത് i എന്ന ചരത്തിന്റെ മൂല്യം പരിശോധിക്കാനും വർദ്ധിപ്പിക്കാനും വേണ്ട സമയം ഇതിലൂടെ ലാഭിക്കം.
 
മുൻഭാഗം തയ്യാറാക്കുന്ന ജെനറിക് രൂപത്തെ ജിമ്പിൾ എന്ന രൂപത്തിലേക്ക് ആദ്യമേ തന്നെ മധ്യഭാഗം മാറ്റുന്നു. ഇതിനെ ജിംപ്ലിഫിക്കേഷൻ എന്ന് വിളിക്കാറുണ്ട്. മക്‌ഗിൽ സർവ്വകലാശാലയുടെ <ref>[http://gcc.gnu.org/onlinedocs/gccint/GIMPLE.html ജിസിസിയുടെ ഓൺലൈൻ സഹായം]</ref> മക്‌കാറ്റ് കമ്പൈലറിൽ ഉപയോഗിച്ചിരുന്ന സിമ്പിൾ എന്ന രീതിയിൽ നിന്ന് പ്രചോദനമുൾക്കൊണ്ടാണ് ജിമ്പിൾ രൂപീകരിക്കപ്പെട്ടത്. ജെനറിക്കിനോട് സാമ്യമുള്ളതാണെങ്കിലും ജിമ്പിൾ രീതിയിൽ ചില പരിധികൾ പാലിച്ചുപോരുന്നു. ഒരു പ്രസ്താവനയിൽ ഒന്നിലധികം ഓപ്പറാന്റുകൾ ഉണ്ടായിരിക്കരുത്, ഒരു പ്രസ്താവനയിൽ ഒന്നിലധികം നിബന്ധനകൾ പരിശൊധിക്കപ്പെടരുത് തുടങ്ങിയവ ഇവയിൽ ചിലതാണ്. ജിമ്പിൾ രൂപത്തെ പിന്നീട് സ്റ്റാറ്റിക് സിംഗിൾ അസൈൻമെന്റ് (എസ്സ് എസ്സ് എ)എന്ന രൂപത്തിലേക്ക് മാറ്റുന്നു. ഈ രൂപത്തിന്റെ പ്രത്യേകത അതിൽ നിന്ന് നിർദ്ദേശങ്ങളെ പ്രവർത്തിപ്പിക്കേണ്ട ക്രമം, ചരങ്ങളുടെ മൂല്യങ്ങൾ‌ ഉൾപ്പെടെയുള്ള വിവരങ്ങൾ പ്രോഗ്രാമിൽ എങ്ങനെയൊക്കെ കൈമാറ്റം ചെയ്യപ്പെടൂന്നു എന്നൊക്കെയുള്ള കാര്യങ്ങൾ വളരെ വ്യക്തമായി മനസ്സിലാക്കാൻ സാധിക്കും എന്നതാണ്. (അല്ലെങ്കിൽ ഇക്കാര്യങ്ങൾ മനസ്സിലാക്കാനായുള്ള ഒരു പ്രോഗ്രാം എഴുതാൻ എളുപ്പമായിരിക്കും). പ്രോഗ്രാമിൽ മെച്ചപ്പെടുത്തലുകൾ നടത്താനുള്ള എളുപ്പത്തിനായാണ് ഈ രീതി ഉപയോഗിക്കുന്നത്. ഉപഭോക്താവ് കമ്പൈലർ‌ പ്രവർത്തിപ്പിക്കുന്ന സമയത്ത് പ്രദിപാദിച്ച ഐഛികങ്ങൾക്കനുസരിച്ചുള്ള മെച്ചപ്പെടുത്തലുകൾ നടത്തിയ ശേഷം എസ്സ് എസ്സ് എ യെ വീണ്ടൂം ജിമ്പിളിലേക്ക് തന്നെ മാറ്റുന്നു. അവസാനമായി ജിമ്പിളിൽ നിന്ന് രെജിസ്റ്റർ‌ ട്രാൻസ്‌ഫർ‌ ലാംഗ്വേജ് (ആർ‌ റ്റി എൽ) എന്ന രൂപത്തിലേക്ക് മാറ്റിയ പ്രോഗ്രാം തയ്യാറാക്കപ്പെടുന്നു. എല്ലാ കമ്പ്യൂട്ടർ‌ പ്രോസസറുകളിലും രജിസ്റ്ററുകൾ ഉണ്ടായിരിക്കും‌. വിവിധ തരത്തിലുള്ള ക്രിയകൾ നടത്തുന്നതിനായി വിവരങ്ങളെ ഈ രജിസ്റ്ററുകളിൽ ശേഖരിക്കുന്നു. ഓരോ പ്രോസസറുകളിലും ഉള്ള രെജിസ്റ്ററൂകൾ വ്യത്യസ്തമായിരിക്കും‌. എന്നാൽ ആർ‌ റ്റി എല്ലിൽ പൊതുവായ ചില പേരുകളും രജിസ്റ്ററുകളുടെ പട്ടികയും ആയിരിക്കും പരാമർശിച്ചിരിക്കുക.
 
=== പിൻഭാഗം ===
മധ്യഭാഗം തയ്യാറാക്കിയ ആർ‌ റ്റി എൽ ആണ് പിൻഭാഗം സ്വീകരിക്കുന്നത്. ആർ റ്റി എല്ലിൽ ഉള്ള പ്രോഗ്രാമിനെ അസംബ്ലി ഭാഷയുമായി സാമ്യമുള്ള ഒരു താൽക്കാലിക രൂപത്തിലേക്ക് മാറ്റുന്നു. ജിസിസിയുടെ മുൻഭാഗം ഓരോ ഭാഷകൾക്കും വ്യത്യസ്തമായിരിക്കുന്നത് പോലെ പിൻഭാഗം ഓരോ പ്രോസസറുകൾക്കും വ്യത്യസ്തമായിരിക്കും‌. ഓരോ പ്രോസസറുകൾക്കും വ്യത്യസ്ത അസംബ്ലി ഭാഷയാണ് മനസ്സിലാകുക എന്നതാണ് ഇതിന്റെ കാരണം. ഇന്റൽ, ആം, സ്പാർക്ക്, ആൽഫ, പവർപിസി എന്നിങ്ങനെ ജിസിസി പിൻതുൺക്കുന്ന ഓരോ ആർക്കിട്ടെക്ക്ചറുകൾക്കുമായി പ്രത്യേക പിൻഭാഗം ഉണ്ടാകും‌. നിലവിലുള്ള ഒരു പ്രോഗ്രാമിങ്ങ് ഭാഷയെ ഒരു പുതിയ ആർക്കിട്ടെക്ചറിൽ പിൻതുണക്കുന്നതിനായി ഒരു പുതിയ പിൻഭാഗം എഴുതിയാൽ മതിയാകും. മുൻഭാഗം ഭാഷയുമായും പിൻഭാഗം ആർക്കിട്ടെക്ചറുമായും ബന്ധപ്പെട്ടിരിക്കുമ്പോൾ‌ മധ്യഭാഗം പൊതുവാണ്. ആർക്കിട്ടെക്ചറിൽ ഉള്ള രജിസ്റ്ററുകൾക്കനുസരിച്ച്, അതിന്റെ അസംബ്ലി ഭാഷയിലേക്ക് നേരത്തെ തയ്യാറാക്കിയ താൽക്കാലിക രൂപത്തെ മാറ്റുകയും‌ ആർക്കിട്ടെക്ചറിന്റെ പ്രത്യേകതകൾക്കും അത് നൽകുന്ന സൗകര്യങ്ങൾക്കും അനുസരിച്ചുള്ള മെച്ചപ്പെടുത്തലുകൾ ആ അസംബ്ലി ഭാഷയിലുള്ള പ്രോഗ്രാമിൽ വരുത്തുകയും ചെയ്യുന്നതോടെ കമ്പൈലേഷൻ പൂർണ്ണമാകുന്നു.
 
പിൻഭാഗം തയ്യാറാക്കുന്ന അസംബ്ലി ഭാഷയിലുള്ള പ്രോഗ്രാം ആണ് കമ്പൈലറിന്റെ ഔട്ട്പുട്ട്. ഇതിനെ ഒരു ഫയലിലേക്ക് എഴുതുകയും അസംബ്ലർ ഉപയോഗിച്ച് യന്ത്രഭാഷയിലേക്ക് മാറ്റുകയും ചെയ്യുന്നു.
 
== അവലംബം ==
http://www.redhat.com/magazine/002dec04/features/gcc/
 
http://gcc.gnu.org/onlinedocs/gccint/
 
<references/>
{{ഗ്നു}}
33

തിരുത്തലുകൾ

"https://ml.wikipedia.org/wiki/പ്രത്യേകം:മൊബൈൽവ്യത്യാസം/1442700" എന്ന താളിൽനിന്ന് ശേഖരിച്ചത്