ജസ്റ്റ്-ഇൻ-ടൈം കംപൈലേഷൻ

(Just-in-time compilation എന്ന താളിൽ നിന്നും തിരിച്ചുവിട്ടതു പ്രകാരം)

ഒരു പ്രോഗ്രാം കോഡ് ആരംഭിക്കുന്നതിന് മുമ്പ് അത് പ്രവർത്തിക്കുമ്പോൾ തന്നെ മെഷീൻ ഭാഷയിലേക്ക് വിവർത്തനം ചെയ്യുന്നതാണ് ജസ്റ്റ്-ഇൻ-ടൈം (ജെഐടി) കംപൈലേഷൻ(ഡൈനാമിക് ട്രാൻസലേഷൻ അല്ലെങ്കിൽ റൺ-ടൈം കംപൈലേഷൻ എന്നും അറിയപ്പെടുന്നു)[1]. ഒറ്റയടിക്ക് മുൻകൂട്ടി ഉപയോഗിക്കുന്നതിനുപകരം യഥാർത്ഥ ഉപയോഗത്തെ അടിസ്ഥാനമാക്കി ഒപ്റ്റിമൈസ് ചെയ്തുകൊണ്ട് കോഡ് വേഗത്തിൽ പ്രവർത്തിപ്പിക്കാൻ ഇത് അനുവദിക്കുന്നു[2]. ജെഐടി കംപൈലേഷൻ എന്നാൽ കോഡ് ആരംഭിക്കുന്നതിന് മുമ്പ്, പ്രോഗ്രാം യഥാർത്ഥത്തിൽ ഉപയോഗത്തിലായിരിക്കുമ്പോൾ തന്നെ കമ്പ്യൂട്ടറിന് പ്രവർത്തിപ്പിക്കാൻ കഴിയുന്ന ഒരു ഫോർമാറ്റിലേക്ക് വിവർത്തനം ചെയ്യുക എന്നാണ് അർത്ഥമാക്കുന്നത്. കോഡിൻ്റെ ഏതൊക്കെ ഭാഗങ്ങൾ വിവർത്തനം ചെയ്യപ്പെടുകയാണെങ്കിൽ വേഗത്തിൽ പ്രവർത്തിക്കാൻ കഴിയുമെന്ന് മനസ്സിലാക്കുവാൻ ഈ രീതി കമ്പ്യൂട്ടറിനെ സഹായിക്കുന്നു, ഇത് മൊത്തത്തിൽ പ്രോഗ്രാം കൂടുതൽ സുഗമമായും കാര്യക്ഷമമായും പ്രവർത്തിക്കുന്നു.

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

ചരിത്രം

തിരുത്തുക

1960-ൽ ലിസ്പ് പ്രോഗ്രാമിംഗ് ഭാഷയ്‌ക്കായി ജോൺ മക്കാർത്തിയാണ് ആദ്യമായി അറിയപ്പെടുന്ന ജെഐടി കമ്പൈലർ വികസിപ്പിച്ചെടുത്തത്. റികർസീവ് ഫങ്ഷൻസ് ഓഫ് സിംമ്പോളിക് എക്സപ്രക്ഷൻസ് ആൻഡ് ദെയർ കംപ്യൂട്ടേഷൻ ബൈ മെഷീൻ പാർട്ട് I എന്ന ഈ ആദ്യകാല കൃതി ഭാവിയിലെ ജെഐടി കംപൈലേഷൻ ടെക്നിക്കുകൾക്ക് അടിത്തറയിട്ടു, മുൻകൂറായി പ്രവർത്തിക്കാതെ കോഡ് മെഷീൻ ഭാഷയിലേക്ക് പരിവർത്തനം ചെയ്തുകൊണ്ട് പ്രോഗ്രാമുകൾ കൂടുതൽ കാര്യക്ഷമമായി പ്രവർത്തിക്കാൻ അനുവദിച്ചു. ഈ സമീപനം പ്രോഗ്രാമിംഗ് ഭാഷകൾക്ക് മികച്ച പ്രകടനവും പൊരുത്തപ്പെടുത്തലും സാധ്യമാക്കി[4]. 1960-ൽ ജോൺ മക്കാർത്തിയുടെ ജെഐടി ലിപ്സുമായി ചേർന്ന് പ്രവർത്തിച്ചു, പഞ്ച് കാർഡുകളിൽ കംപൈലർ ഔട്ട്‌പുട്ട് ഭൗതികമായി സംഭരിക്കുന്നതിനുള്ള ബുദ്ധിമുട്ട് ഒഴിവാക്കാനും, ഫ്ലൈയിൽ നിന്ന് നേരിട്ട് എക്‌സിക്യൂട്ടബിൾ കോഡിലേക്ക് കംപൈൽ ചെയ്യുന്നതിലൂടെ പ്രക്രിയ കാര്യക്ഷമമാക്കാനും ലക്ഷ്യമിട്ടുള്ളതാണ് (ഒരു "കംപൈൽ ആൻഡ് ഗോ" സിസ്റ്റം)[5]. 1968-ൽ, കെൻ തോംസൺ ക്യുഇഡി ടെക്സ്റ്റ് എഡിറ്ററിൽ റെഗുലർ എക്സ്പ്രഷനുകൾ ഉപയോഗിച്ചു, ടെക്സ്റ്റ് പാറ്റേണുകൾ വേഗത്തിൽ കണ്ടെത്താനും എഡിറ്റുചെയ്യാനും ഉപയോക്താക്കളെ അനുവദിക്കുന്നതിനുള്ള ആദ്യകാല ടൂളുകളിൽ ഒന്നാണ്. ഡോക്യുമെൻ്റുകൾക്കുള്ളിൽ നിർദ്ദിഷ്ട പദങ്ങളോ ഫോർമാറ്റുകളോ തിരയാനും തൽക്ഷണം മാറ്റങ്ങൾ വരുത്താനും ഇത് മൂലം സാധ്യമായി, ആധുനിക ടെക്സ്റ്റ് തിരയലിനും എഡിറ്റിംഗ് ടൂളുകൾക്കും അടിത്തറയിട്ടു[6]. ഡൈനാമിക് കോഡ് എക്സിക്യൂഷൻ്റെയും ടെക്സ്റ്റ് പ്രോസസ്സിംഗിൻ്റെയും ആദ്യകാല രീതികൾ രൂപപ്പെടുത്താൻ രണ്ട് നവീകരണങ്ങളും സഹായിച്ചു. ഐബിഎം 7094 സിസ്റ്റത്തിൽ പ്രവർത്തിക്കുന്ന കോഡിലേക്ക് റെഗുലർ എക്‌സ്‌പ്രഷനുകൾ നേരിട്ട് കംപൈൽ ചെയ്തുകൊണ്ട് കെൻ തോംസൺ ക്യുഇഡി എഡിറ്ററിൽ പാറ്റേൺ മാച്ചിംഗിന്റെ വേഗത മെച്ചപ്പെടുത്തി. പിന്നീട്, 1970-ൽ, ജെയിംസ് ജി. മിച്ചൽ ഇന്റപ്രെട്ടേഷനിൽ നിന്ന് കംപൈൽ ചെയ്ത കോഡ് സൃഷ്ടിക്കുന്നതിനുള്ള ഒരു സാങ്കേതികത വികസിപ്പിച്ചെടുത്തു, അത് അദ്ദേഹം LC² എന്ന പരീക്ഷണ ഭാഷയിൽ നടപ്പിലാക്കി. ആവർത്തിച്ചുള്ള ഇന്റർപ്രെട്ടേഷന്റെ ആവശ്യകത കുറച്ചുകൊണ്ടും ഭാവിയിലെ കംപൈലർ ഡിസൈനുകളെയും ജസ്റ്റ്-ഇൻ-ടൈം (JIT) കംപൈലേഷൻ രീതികളെയും സ്വാധീനിച്ചുകൊണ്ട് കോഡ് കൂടുതൽ കാര്യക്ഷമമായി നടപ്പിലാക്കാൻ ഈ സാങ്കേതികത സിസ്റ്റത്തെ അനുവദിച്ചു[7][8].

1983-ൽ സ്മോൾടോക്ക് ഒരു ജെഐടി കംപൈലേഷൻ അപ്രോച്ച് അവതരിപ്പിച്ചു, അത് ആവശ്യാനുസരണം കോഡ് മെഷീൻ ഭാഷയിലേക്ക് വിവർത്തനം ചെയ്തു. ഭാവിയിലെ ഉപയോഗത്തിനായി സിസ്റ്റം ഈ കംപൈൽ ചെയ്ത കോഡ് സംരക്ഷിച്ചു. അതിനാൽ ഓരോ തവണയും അത് വീണ്ടും ചെയ്യേണ്ടതില്ല. മെമ്മറി കുറവാണെങ്കിൽ, അത് സേവ് ചെയ്ത കോഡ് നീക്കം ചെയ്യുകയും ആവശ്യമെങ്കിൽ പിന്നീട് അത് പുനഃസൃഷ്ടിക്കുകയും ചെയ്യും. ആവശ്യാനുസരണം കോഡ് കൈകാര്യം ചെയ്യുന്നതിനുള്ള ഈ മികച്ച മാർഗം സിസ്റ്റത്തിൻ്റെ മെമ്മറി ലഭ്യതയ്ക്ക് അനുസൃതമായി ജെഐടി കംപൈലറുകൾ ഇന്ന് കാണുന്ന പ്രവർത്തന രീതി രൂപപ്പെടുത്താൻ സഹായിച്ചു[9]. സൺ മൈക്രോസിസ്റ്റംസിൻ്റെ സെൽഫ് പ്രോഗ്രാമിംഗ് ഭാഷ ജെഐടി ടെക്‌നിക്കുകളിൽ കാര്യമായ പുരോഗതി വരുത്തി, സെൽഫ് പ്രോഗ്രാമിംഗ് എൺവയൺമെന്റ് അക്കാലത്തെ ഏറ്റവും വേഗതയേറിയ സ്മോൾടോക്ക് സിസ്റ്റമായി മാറി. പൂർണ്ണമായും ഒബ്ജക്റ്റ് ഓറിയൻ്റഡ് ഭാഷയിൽ ശ്രദ്ധേയമായ സിയുടെ പകുതി വേഗതയിൽ എത്താൻ ഇതിന് കഴിഞ്ഞു. അഡാപ്റ്റീവ് കംപൈലേഷൻ, അഡ്വാൻസ്ഡ് ഒബ്ജക്റ്റ് ഓറിയൻ്റഡ് ഡിസൈനുകൾ, ഉയർന്ന പ്രവർത്തനക്ഷമതയുള്ള, ഡൈനാമിക്-ടൈപ്പ്ഡ് പ്രോഗ്രാമിംഗ് ഭാഷകൾക്ക് വേദിയൊരുക്കുക തുടങ്ങിയ നൂതനമായ ഒപ്റ്റിമൈസേഷനുകളിലൂടെയാണ് ഈ കാര്യക്ഷമത കൈവരിക്കാനായത്[10].

സൺ മൈക്രോസിസ്റ്റംസ് തുടക്കത്തിൽ സെൽഫ് പ്രോഗ്രാമിംഗ് ഭാഷ ഉപേക്ഷിച്ചു, എന്നാൽ സാങ്കേതികവിദ്യയും ഗവേഷണവും ജാവയുടെ വികസനത്തിന് ഗണ്യമായ സംഭാവന നൽകി. "ജസ്റ്റ്-ഇൻ-ടൈം കംപൈലേഷൻ" എന്ന ആശയം "ജസ്റ്റ് ഇൻ ടൈം" എന്ന മാനുഫാക്ചറിംഗ് പദത്തിൽ നിന്ന് സ്വീകരിക്കുകയും ജാവയിലൂടെ വ്യാപകമായി അംഗീകരിക്കപ്പെടുകയും ചെയ്തു, ജെയിംസ് ഗോസ്ലിംഗ് 1993-ൽ തന്നെ ഈ പദാവലി സ്വീകരിച്ചു[11] . ഹോട്ട്‌സ്‌പോട്ട് പോലുള്ള ആധുനിക ജാവ വെർച്വൽ മെഷീനുകളിൽ (ജെവിഎം) ഉപയോഗിക്കുന്ന ഒരു പ്രധാന സാങ്കേതികവിദ്യയാണ് ജെഐടി (ജസ്റ്റ്-ഇൻ-ടൈം) കംപൈലേഷൻ. റൺടൈമിൽ ഒപ്റ്റിമൈസ് ചെയ്ത നേറ്റീവ് മെഷീൻ കോഡിലേക്ക് ജാവ ബൈറ്റ്കോഡ് ചലനാത്മകമായി കംപൈൽ ചെയ്യുന്നതിലൂടെ ഇത് പ്രകടനം ഗണ്യമായി മെച്ചപ്പെടുത്തുന്നു. "ഹോട്ട് സ്പോട്ടുകൾ" എന്നറിയപ്പെടുന്ന, പതിവായി നടപ്പിലാക്കുന്ന കോഡ് വിഭാഗങ്ങളെ തിരിച്ചറിയാൻ ജെവിഎം(JVM) ആപ്ലിക്കേഷനെ പ്രൊഫൈൽ ചെയ്യുന്നു. ഈ ഹോട്ട് സ്പോട്ടുകൾക്കായി, ജെഐടി കംപൈലർ വളരെയധികം ഒപ്റ്റിമൈസ് ചെയ്ത മെഷീൻ കോഡ് സൃഷ്ടിക്കുന്നു, ഇത് ഗണ്യമായ പ്രകടന നേട്ടത്തിന് കാരണമാകുന്നു. ഈ സമീപനം പ്ലാറ്റ്‌ഫോം സ്വാതന്ത്ര്യം നിലനിർത്തിക്കൊണ്ടുതന്നെ നേറ്റീവ് പെർഫോമൻസ് നിലവാരം കൈവരിക്കാൻ ജാവ ആപ്ലിക്കേഷനുകളെ പ്രാപ്‌തമാക്കുന്നു.

പരമ്പരാഗത ബൈറ്റ്കോഡ് ഘട്ടം മറികടന്ന് പിഎ(PA)-8000 പ്രോസസറിനായുള്ള മെഷീൻ കോഡ് നേരിട്ട് ഒപ്റ്റിമൈസ് ചെയ്ത ഒരു പരീക്ഷണാത്മക ജെഐടി കംപൈലറായിരുന്നു എച്ച്പി(HP) ഡൈനാമോ പ്രോജക്റ്റ്. ഈ പ്രോജക്റ്റ് മെഷീൻ കോഡ് നേരിട്ട് ഒപ്റ്റിമൈസ് ചെയ്തുകൊണ്ട് വേഗതയേറിയ കോഡാണ് ഉപയോഗിക്കുന്നത്, എന്നാൽ ഇത് തടസ്സങ്ങളില്ലാതെ പ്രവർത്തിക്കുന്നത് സാധ്യമല്ലാതായി[12]. മെഷീൻ കോഡ് നേരിട്ട് ഒപ്റ്റിമൈസ് ചെയ്തുകൊണ്ട് ഡൈനാമോ പ്രോജക്റ്റ് 30% വേഗത കൈവരിച്ചു. പരമ്പരാഗത കംപൈലറുകൾക്ക് ചെയ്യാൻ കഴിയാത്ത, ഇൻലൈനിംഗ് കോഡ്, ലൈബ്രറി കോളുകൾ ഒപ്റ്റിമൈസ് ചെയ്യൽ തുടങ്ങിയ വിപുലമായ ഒപ്റ്റിമൈസേഷനുകൾ ഇത് അനുവദിച്ചു[13] [14].

2020 നവംബറിൽ, പിഎച്ച്പി 8.0 ഒരു ജെഐടി കമ്പൈലർ അവതരിപ്പിച്ചു.[15]

ഒരു ബൈറ്റ്കോഡ്-കംപൈൽ ചെയ്ത സിസ്റ്റത്തിൽ, സോഴ്സ് കോഡ് ബൈറ്റ്കോഡ് എന്നറിയപ്പെടുന്ന ഒരു ഇൻ്റർമീഡിയറ്റ് റെപ്രസന്റേഷനിലേക്ക്(IR (ഇൻ്റർമീഡിയറ്റ് റെപ്രസൻ്റേഷൻ) നിങ്ങളുടെ പ്രോഗ്രാമിൻ്റെ പകുതി പതിപ്പ് പോലെയാണ്. ഇത് ഒറിജിനൽ കോഡിനേക്കാൾ ലളിതമാണ്, പക്ഷേ മെഷീൻ്റെ ഭാഷയിലല്ല, എന്നാൽ ഹാർഡ്‌വെയറിൽ പ്രവർത്തിക്കുന്ന അന്തിമ കോഡിലേക്ക് പരിവർത്തനം ചെയ്യാൻ കമ്പ്യൂട്ടറിന് ഇത് മൂലം സാധിക്കുന്നു) വിവർത്തനം ചെയ്യപ്പെടുന്നു. ബൈറ്റ്കോഡ് ഏതെങ്കിലും ഒരു കമ്പ്യൂട്ടറിന് മാത്രമുള്ളതല്ല; വ്യത്യസ്‌ത തരം കമ്പ്യൂട്ടറുകളിൽ പ്രവർത്തിക്കാൻ കഴിയുന്ന ഒരു സാർവത്രിക ഫോർമാറ്റാണിത്, ഇത് വിവിധ സിസ്റ്റങ്ങളിലുടനീളം പോർട്ടബിൾ ആക്കുന്നു.

  1. Languages, Compilers, and Runtime Systems, University of Michigan, Computer Science and Engineering, archived from the original on 2018-03-26, retrieved March 15, 2018
  2. Aycock 2003.
  3. "Does the JIT take advantage of my CPU?". David Notario's WebLog. Retrieved 2018-12-03.
  4. Aycock 2003, 2. JIT Compilation Techniques, 2.1 Genesis, p. 98.
  5. McCarthy, J. (April 1960). "Recursive functions of symbolic expressions and their computation by machine, Part I". Communications of the ACM. 3 (4): 184–195. CiteSeerX 10.1.1.111.8833. doi:10.1145/367177.367199. S2CID 1489409.
  6. Thompson 1968.
  7. Aycock 2003, 2. JIT Compilation Techniques, 2.2 LC², p. 98–99.
  8. Mitchell, J.G. (1970). "The design and construction of flexible and efficient interactive programming systems". {{cite journal}}: Cite journal requires |journal= (help)
  9. Deutsch, L.P.; Schiffman, A.M. (1984). "Efficient implementation of the smalltalk-80 system" (PDF). Proceedings of the 11th ACM SIGACT-SIGPLAN symposium on Principles of programming languages - POPL '84. pp. 297–302. doi:10.1145/800017.800542. ISBN 0-89791-125-3. S2CID 3045432. Archived from the original (PDF) on 2004-06-18.
  10. "97-pep.ps". research.sun.com. Archived from the original on 24 November 2006. Retrieved 15 January 2022.
  11. Aycock 2003, 2.14 Java, p. 107, footnote 13.
  12. "Dynamo: A Transparent Dynamic Optimization System". Vasanth Bala, Evelyn Duesterwald, Sanjeev Banerjia. PLDI '00 Proceedings of the ACM SIGPLAN 2000 conference on Programming language design and implementation. pages 1 to 12. DOI 10.1145/349299.349303. Retrieved March 28, 2012
  13. John Jannotti. "HP's Dynamo". Ars Technica. Retrieved 2013-07-05.
  14. "The HP Dynamo Project". Archived from the original on October 19, 2002. Retrieved 2016-04-12.{{cite web}}: CS1 maint: unfit URL (link)
  15. Tung, Liam (27 November 2020). "Programming language PHP 8 is out: This new JIT compiler points to better performance". ZDNet. Retrieved 28 November 2020.
"https://ml.wikipedia.org/w/index.php?title=ജസ്റ്റ്-ഇൻ-ടൈം_കംപൈലേഷൻ&oldid=4138210" എന്ന താളിൽനിന്ന് ശേഖരിച്ചത്