കംപൈലർ

right|thumb|350px|ബഹുഭാഷ-ബഹുലക്ഷ്യ മാതൃകാകം‌പൈലറിന്റെ ചിത്രം

ഒരു പ്രോഗ്രാമിംഗ് ഭാഷയിൽ എഴുതിയിരിക്കുന്ന പ്രോഗ്രാമിനെ വേറെയൊരു ഭാഷയിലുളള അതേ കാര്യക്ഷമതയുളള പ്രോഗ്രാമായിട്ടു മാറ്റുന്നതിനുള്ള കംപ്യൂട്ട‍ർ പ്രോഗ്രാം ആണ് **കംപൈലർ**. ഏതു ഭാഷയിലുള്ള പ്രോഗ്രാമിനെയാണോ മാറ്റേണ്ടത്, അതിനെ മൂലഭാഷയെന്നും (source language) മാറ്റം വരുത്തിയതിനു ശേഷം കിട്ടുന്ന ഭാഷയെ ലക്ഷ്യഭാഷ(target) എന്നും പറയുന്നു. ഉന്നതതലഭാഷകളെയാണ് (high level language) കമ്പൈലറുകളിൽ മൂലഭാഷയായി സ്വീകരിക്കുന്നത്. സാധാരണയായി കണ്ടുവരുന്ന മൂലഭാഷകൾ സി (C), സി++ (C++), ജാവ (Java), കോബോൾ (Cobol), പാസ്കൽ (Pascal) എന്നിവയാണ്. ലക്ഷ്യഭാഷകൾ ഒരു കംപ്യൂട്ട‍റിന്റെ യാന്ത്രിക ഭാഷയോ, intermediate ഭാഷയോ ആകാം. പരിവർത്തനം ചെയ്യുന്നതിനായി മൂലഭാഷയിൽ എഴുതിയ പ്രോഗ്രാമിനെ സോഴ്സ് കോഡ് എന്നും കംപൈലറുകളിൽ നിന്നു പരിവർത്തനത്തിനു വിധേയമായി പുറത്തു വരുന്ന ലക്ഷ്യഭാഷയിലുളള പ്രോഗ്രാമിനെ ഒബ്‌ജക്റ്റ് കോഡ് (object-code) എന്നുമാണ് വിളിക്കുന്നത്. ‍

കം‌പൈലറുകളെ അവയുടെ നിർമ്മാണരീതിയേയും ധർമ്മത്തേയും അടിസ്ഥാനമാക്കി സിംഗിൾ-പാസ്,മൾടി-പാസ്,ലോഡ് -ആന്റ്-ഗോ,ഡിബഗ്ഗിങ്,ഒപ്റ്റിമൈസിങ് എന്നിങ്ങനെ വിഭജിക്കാം.

## ചരിത്രം
1950കളുടെ ആദ്യകാലങ്ങളിൽ തന്നെ  കം‌പൈലർ പ്രോഗ്രാമുകൾ എഴുതിത്തുടങ്ങുകയും അവ പരീക്ഷിക്കുകയും പ്രയോഗത്തിൽ വരുത്തുകയും ചെയ്തിരുന്നു.പല കൂട്ടങ്ങളായി സ്വതന്ത്രമായി  പലയിടങ്ങളിലായാണ് ഈ പ്രോഗ്രാമുകൾ എഴുതിയിരുന്നത് എന്നതിനാൽ ആദ്യ കം‌പൈലർ പ്രോഗ്രാം ഏതെന്നും എന്നാണ് ആദ്യമായി പ്രയോഗത്തിൽ വരുത്തിയത് എന്നും വ്യക്തമല്ല.

ആദ്യത്തെ ഫോർട്രാൻ കംപൈലർ‍ 1957-ൽ  അമേരിക്കയിലെ ഐ.ബി.എം.(IBM) കോർറേഷനിലെ ജോൺ ബാക്കസ് പ്രയോഗത്തിൽ വരുത്തി. കംപൈലറുകൾ, നിർമ്മി‍ക്കാൻ ബുദ്ധിമുട്ടുളള വളരെ സങ്കീർണ്ണമായ പ്രോഗ്രാമുകളാണ്. ഫോർട്രാൻ കംപൈലർ നിർമ്മിക്കാൻ തന്നെ 18 വ‍ർഷങ്ങൾ വേണ്ടി വന്നു എന്നതിൽ നിന്നും ഈ സങ്കീർണത എത്രത്തോളമുണ്ടെന്ന് ഊഹിക്കാം.

കം‌പൈലറുകളുടെ ആദ്യകാല പ്രവർത്തനങ്ങളിൽ ബീജഗണിത സൂത്രവാക്യങ്ങളെ യാന്ത്രികഭാഷയിലേക്ക് പരിവർത്തനം ചെയ്യുക എന്നതായിരുന്നു പ്രധാനം.

## കം‌പൈലറുകളുടെ പശ്ചാത്തലം
കം‌പൈലറുകൾക്ക് പുറമെ നിരവധി പ്രോഗ്രാമുകൾ കൃത്യനിർവ്വഹണ യോഗ്യങ്ങളായ(executable) ലക്ഷ്യപ്രോഗ്രാമുകൾ ഉണ്ടാക്കുന്നുണ്ട്.മൂലപ്രോഗ്രാം മോഡ്യൂളുകളായി വിഭജിക്കപ്പെട്ട് വിവിധങ്ങളായ ഫയലുകളിൽ സൂക്ഷിച്ച് വെക്കുന്നു.വിഭജിക്കപ്പെട്ട ഇത്തരം പ്രോഗ്രാമുകൾ ശേഖരിക്കുന്നത് പ്രിപ്രൊസസർ എന്ന വ്യത്യസ്തമായ മറ്റൊരു പ്രോഗ്രാമാണ്.മാക്രോസ് എന്ന ചുരുക്കെഴുത്തുരൂപങ്ങളെ മൂലപ്രോഗ്രാം പ്രസ്താവനകളിലേക്ക് വികസിപ്പിക്കാനും പ്രിപ്രൊസസർ ഉപയോഗിക്കാം.

## മാതൃക
കം‌പൈലേഷന് പൊതുവിൽ ഉപയോഗിക്കുന്ന മാതൃകയാണ് അനാലിസിസ്-സിന്തെസിസ് മാതൃക.അനാലിസിസ് ഭാഗം മൂലഭാഷയെ ഘടകഭാഗങ്ങളായിവിഭജിച്ച്  മദ്ധ്യവർത്തിഭാഷ നിർമ്മിക്കുന്നു.ഈ സമയം മൂലപ്രോഗ്രാമിന്റെ കാരകങ്ങൾ നിർണയിക്കുകയും രേഖപ്പെടുത്തുകയും ചെയ്യുന്നു.ഇത് ട്രീ എന്നറിയപ്പെടുന്ന അധികാരശ്രേണിയിലാണ് (Hierarchy) നിർവഹിക്കുന്നത്.ഈ പശ്ചാത്തലത്തിൽ വിശേഷിച്ചുപയോഗിക്കുന്നത് സിന്റാക്സ് ട്രീ ആണ്.ഇതിലെ ഓരോ നോഡും കാരകത്തേയും ചിൾഡ്രൻ കാരകത്തിന്റെ ആർഗ്യുമെന്റിനേയും പ്രതിനിധീകരിക്കുന്നു.  ‍

അനാലിസിസ് ഭാഗത്ത് മൂലപ്രോഗ്രാമിനെ കൈകാര്യം ചെയ്യുന്നതിനായി അനവധി സോഫ്റ്റ്‌വേർ ഉപകരണങ്ങൾ ഉപയോഗിച്ചുവരുന്നു.അവയിൽ പ്രധാനപ്പെട്ടവ സ്ട്രൿചർ എഡിറ്ററുകള്‍,പ്രെറ്റി പ്രിന്ററുകൾ,സ്റ്റാറ്റിക് ചെക്കറുകള്‍,ഇന്റെർപ്രെറ്ററുകൾ എന്നിവയാണ്.

സിന്തസിസ് ഭാഗം ലക്ഷ്യഭാഷയെ ഈ മദ്ധ്യവർത്തിഭാഷയിൽ നിന്നും നിർമ്മിച്ചെടുക്കുന്നു.
## കം‌പൈലർ രൂപകല്പന
കം‌പൈലർ രൂപകല്പന ചെയ്യുന്നത് ചെയ്തുതീർക്കേണ്ട പ്രവൃത്തിയുടെ സങ്കീർണ്ണതയേയും രൂപകല്പന ചെയ്യുന്നയാളുടെ പ്രവൃത്തിപരിചയവും ഉപകരണങ്ങൾ തുടങ്ങിയ റിസോഴ്സുകളേയും അടിസ്ഥാനമാക്കി ആണ് .
### ഏകപാസ്,ബഹുപാസ് കം‌പൈലറുകൾ
കം‌പൈലിങിൽ അനവധി പ്രവൃത്തികൾ ചെയ്യുന്നുണ്ട്.ആദ്യകാല കം‌പൈലറുകൾ എല്ലാ പ്രവൃത്തികളും ചെയ്യുന്ന പ്രോഗ്രാമുകളായിരുന്നു.എന്നാൽ ഇത്തരമൊരു പ്രോഗ്രാമിനെ സൂക്ഷിച്ചുവെക്കാൻ പാകത്തിലുള്ള മെമ്മറി ഉണ്ടായിരുന്നില്ല.ആയതിനാൽ ചെറിയ ചെറിയ പ്രോഗ്രാമുകളാക്കി വിഭജിച്ച് ഓരോ പ്രോഗ്രാമും മൂലപ്രോഗ്രാമിനെ ചില വിശകലനങ്ങൾക്കും പരിഭാഷപ്പെടുത്തലിനും വിധേയമാക്കുന്നു. ഒരു പാസിൽ തന്നെ കം‌പൈലിങ് നടത്തുന്നതുകൊണ്ട് പ്രവൃത്തിയെ അത് ലളിതമാക്കുന്നു എന്നൊരു ഗുണമുണ്ട്.കൂടാതെ ഇവ ബഹുപാസ് കം‌പൈലറുകളേക്കാൾ വേഗത കൂടിയവയായിരിക്കും. പാസ്കൽ എന്ന പ്രോഗ്രാമിങ് ഭാഷ ഒരു പാസിൽ കം‌പൈലേഷൻ നടത്താൻ സാധിക്കുന്ന രീതിയിലാണ് രൂപകല്പന ചെയ്തിരിക്കുന്നത്.എന്നാൽ ഇതിന്റെ പ്രധാന അഹിതം ഉന്നതനിലവാരമുള്ള കോഡുകൾ ഉല്പാദിപ്പിക്കാനാവശ്യമായ സങ്കീർണ്ണങ്ങളായ മെച്ചപ്പെടുത്തലുകൾ (optimisation)  ചെയ്യുന്നില്ല എന്നതാണ്.

എന്നാൽ ബഹുപാസ് കംപൈലറുകൾ അതിന്റെ അവസാന പാസിൽ നിന്നാണ് യാന്ത്രികഭാഷാകോഡുകൾ ഉല്പാദിപ്പിക്കുന്നത്.

## പ്രവ‍ർത്തനം
കംപൈലറുകൾ രണ്ടു ഭാഗങ്ങളായി കണക്കാക്കാവുന്നതാകുന്നു - മുൻഭാഗവും (front-end) പിൻ‍ഭാഗവും (back-end). മുൻഭാഗം മൂലഭാഷയെ കുറിച്ചുളള കാര്യങ്ങൾ നോക്കുമ്പോൾ പിൻഭാഗം ലക്ഷ്യഭാഷയുടെ സവിശേഷതകൾ അനുസരിച്ചു പ്രവർത്തിക്കുന്നു. ഇവ തമ്മിലുളള ആശയവിനിമയം ഒരു ഇടനില (intermediate) ഭാഷയിലൂടെ നടത്തുന്നു. രണ്ടു ഭാഗങ്ങളായി തിരിക്കുന്നതുകൊണ്ടു താഴെപ്പറയുന്ന ഗുണങ്ങളുണ്ട്
*കംപൈലറുകളുടെ പോർട്ടബിലിറ്റി (portability) അഥവാ വിവിധ തരം കംപ്യൂട്ടറുകളിൽ ഓടാനുളള കഴിവ് വർദ്ധിക്കുന്നു.
*ഭാഷയിൽ ഉണ്ടാവുന്ന പുതിയ മാറ്റങ്ങൾ ഉൾക്കൊളളാനുളള കഴിവ് വർദ്ധിക്കുന്നു.
*കംപൈലറിൽ ഉണ്ടാകാവുന്ന ബഗ്ഗുകൾ കാര്യമായി കുറയുന്നു.
### മുൻഭാഗം
കമ്പൈലറിന്റെ മുൻഭാഗത്തെ നാല് ഉപഭാഗങ്ങളായി വേ‍ർതിരിക്കാം
#ലെക്സിക്കൽ അനലൈസ‍ർ (lexical analyser) - മൂലഭാഷയിലെ കണികകളെ തിരിച്ചറിയാനും അവയിലെ അക്ഷരപ്പിശകുകൾ കണ്ടെത്താനും ഈ ഭാഗം ഉപകാരപ്പെടുന്നു.ഈ ഭാഗത്തെ സ്കാനർ(scanner)എന്നും പറയും.
#സിന്റാറ്റിക്ക് അനലൈസ‍ർ (syntatic analyser) - മൂലഭാഷയുടെ വ്യാകരണമുപയോഗിച്ചു ലെക്സിക്കൽ അനലൈസ‍റിൽ നിന്നു ലഭിക്കുന്ന കണികകളെ വാക്യങ്ങളായി യോജിപ്പിക്കുകയും വ്യാകരണതെറ്റുകൾ കണ്ടെത്തുകയും അവ തിരുത്താൻ പ്രോഗ്രാമറെ സഹായിക്കുകയും ചെയ്യുന്നു. ഈ ഭാഗത്തെ പാർസർ(parser) എന്നും വിളിക്കാറുണ്ട്. 
#സെമാന്റിക്ക് അനലൈസ‍ർ (semnatic analyser) - ഈ ഭാഗം വാക്യങ്ങളെ കൂട്ടിവായിക്കുകയും അവയുടെ അർത്ഥം ഗ്രഹിക്കുകയും ചെയ്യുന്നു.
#ഇടനില ഭാഷാനിർമ്മാണം(intermediate code generator) - മുൻഭാഗത്തെ പ്രവർത്തനങ്ങളുടെ അവസാനത്തെ പടിയാണ് ഇത്. ഇവിടെ നേരത്തെ ഗ്രഹിച്ച പ്രോഗ്രാമിനെ ഒരു ലളിതമായ ഇടനില ഭാഷയിൽ എഴുതുന്നു. ഈ ഭാഷ രണ്ടു ഭാഗങ്ങൾക്കും സൗക‍ര്യപ്രദമായ ഒന്നായാൽ മതി.

### പിൻഭാഗം
പിൻഭാഗത്തിന്റെ പ്രവർത്തനങ്ങൾ രണ്ടായി തിരിക്കാം.
#ഒപ്റ്റിമൈസേഷൻ (optimisation) - ആവശ്യമില്ലാത്തതും , രണ്ടു പ്രാവശ്യമുളളതുമായ ആജ്ഞകൾ നീക്കം ചെയ്യുകയും, ക്രമം മാറ്റി തിരുത്തുകയും, കൂടുതൽ കാര്യക്ഷമതയുളള ആജ്ഞാശേഖരങ്ങളായി രൂപാന്തരപ്പെടുത്തുകയും മറ്റുമാണ് ഈ ഭാഗം ചെയ്യുന്നത്.
#കോഡ് നിർമ്മാണം (code generation) -ലക്ഷ്യഭാഷയിലേക്കുളള വിവർത്തനം - കാര്യക്ഷമമാക്കിയ ഇടനില ഭാഷാവാക്യങ്ങളെ കോഡ് ജെനറേറ്റർ യാന്ത്രിക ഭാഷയായി മാറ്റുന്നു. ഇവിടെയും യാന്ത്രിക ഭാഷയുടെ സവിശേഷതകൾ പരിഗണിച്ചു ചെറിയ ഒപ്റ്റിമൈസേഷൻ നടത്തുന്നു.

## നിർമ്മാണം
കംപൈലറുകളുടെ നിർമ്മാണം ഇപ്പോൾ താരതമ്യേനെ എളുപ്പമായി തീർന്നിരിക്കുന്നു. പാർസറും സ്കാനറും സ്വയം ഉണ്ടാക്കുന്ന ഉപകര‍ണങ്ങൾ ഇപ്പോൾ ലഭ്യമാണ്. ലെക (Lex),യാക്ക് (yacc) , ജെ ലക്സ് (jlex) , കപ് (cup) എന്നിവയാണ‍് അവയിൽ ചിലത്. ഒരോ ഭാഗവും സ്വതന്ത്ര മോഡ്യൂളുകളായി(modules) നിർമ്മിച്ചാൽ അവ അങ്ങോട്ടും ഇങ്ങോട്ടും മാറ്റി വിവിധയിനം കംപൈലറുകൾ ഉണ്ടാക്കാവുന്നതാണ്.

## അവലംബം
*Principles of Compiler Design ലേഖകർ Aho.A.V and Ullman J.D---Narosa1977
*Compilers: Principles, Techniques and Tools by Alfred V. Aho, Ravi Sethi, and Jeffrey D. Ullman (ISBN 0-201-10088-6) link to publisher. Also known as 'The Dragon Book'.

## അവലംബം

## കുറിപ്പുകൾ
 

വർഗ്ഗം:കംപൈലറുകൾ
വർഗ്ഗം:കംപൈലർ തിയറി
വർഗ്ഗം:കമ്പ്യൂട്ടർ ലൈബ്രറികൾ
വർഗ്ഗം:അമേരിക്കൻ കണ്ടുപിടിത്തങ്ങൾ