தமிழ்

குறியீடு உருவாக்கத்தில் இடைநிலை பிரதிநிதித்துவங்களின் (IR) உலகை ஆராயுங்கள். அவற்றின் வகைகள், நன்மைகள் மற்றும் பல்வேறு கட்டமைப்புகளுக்கு குறியீட்டை மேம்படுத்துவதில் அவற்றின் முக்கியத்துவத்தைப் பற்றி அறியுங்கள்.

குறியீடு உருவாக்கம்: இடைநிலை பிரதிநிதித்துவங்கள் பற்றிய ஒரு ஆழமான பார்வை

கணினி அறிவியலின் துறையில், குறியீடு உருவாக்கம் என்பது தொகுப்பு செயல்முறையில் ஒரு முக்கியமான கட்டமாக உள்ளது. இது ஒரு உயர்-நிலை நிரலாக்க மொழியை ஒரு இயந்திரம் புரிந்து கொண்டு செயல்படுத்தக்கூடிய ஒரு கீழ்-நிலை வடிவத்திற்கு மாற்றும் கலை. இருப்பினும், இந்த மாற்றம் எப்போதும் நேரடியாக இருப்பதில்லை. பெரும்பாலும், கம்பைலர்கள் இடைநிலை பிரதிநிதித்துவம் (IR) என்று அழைக்கப்படும் ஒன்றைப் பயன்படுத்தி ஒரு இடைநிலை படியை பயன்படுத்துகின்றன.

இடைநிலை பிரதிநிதித்துவம் என்றால் என்ன?

ஒரு இடைநிலை பிரதிநிதித்துவம் (IR) என்பது ஒரு கம்பைலரால் மூலக் குறியீட்டை மேம்படுத்தல் மற்றும் குறியீடு உருவாக்கத்திற்கு ஏற்ற வகையில் பிரதிநிதித்துவப்படுத்தப் பயன்படுத்தப்படும் ஒரு மொழியாகும். இதை மூல மொழி (எ.கா., பைத்தான், ஜாவா, சி++) மற்றும் இலக்கு இயந்திரக் குறியீடு அல்லது அசெம்பிளி மொழிக்கு இடையே ஒரு பாலமாக நினையுங்கள். இது மூல மற்றும் இலக்கு சூழல்களின் சிக்கல்களை எளிதாக்கும் ஒரு சுருக்கமாகும்.

உதாரணமாக, பைத்தான் குறியீட்டை நேரடியாக x86 அசெம்பிளிக்கு மொழிபெயர்ப்பதற்குப் பதிலாக, ஒரு கம்பைலர் முதலில் அதை ஒரு IR ஆக மாற்றலாம். இந்த IR பின்னர் மேம்படுத்தப்பட்டு, இலக்கு கட்டமைப்பின் குறியீடாக மாற்றப்படலாம். இந்த அணுகுமுறையின் சக்தி முன்-முனையை (மொழி-சார்ந்த பாகுபடுத்தல் மற்றும் சொற்பொருள் பகுப்பாய்வு) பின்-முனையிலிருந்து (இயந்திரம்-சார்ந்த குறியீடு உருவாக்கம் மற்றும் மேம்படுத்தல்) பிரிப்பதில் இருந்து உருவாகிறது.

இடைநிலை பிரதிநிதித்துவங்களை ஏன் பயன்படுத்த வேண்டும்?

IR-களின் பயன்பாடு கம்பைலர் வடிவமைப்பு மற்றும் செயலாக்கத்தில் பல முக்கிய நன்மைகளை வழங்குகிறது:

இடைநிலை பிரதிநிதித்துவங்களின் வகைகள்

IR-கள் பல்வேறு வடிவங்களில் வருகின்றன, ஒவ்வொன்றும் அதன் சொந்த பலம் மற்றும் బలவீனங்களைக் கொண்டுள்ளன. இங்கே சில பொதுவான வகைகள் உள்ளன:

1. சுருக்க தொடரியல் மரம் (AST)

AST என்பது மூலக் குறியீட்டின் கட்டமைப்பின் மரம் போன்ற பிரதிநிதித்துவம் ஆகும். இது கோவைகள், கூற்றுகள் மற்றும் அறிவிப்புகள் போன்ற குறியீட்டின் வெவ்வேறு பகுதிகளுக்கு இடையேயான இலக்கண உறவுகளைப் பிடிக்கிறது.

உதாரணம்: `x = y + 2 * z` என்ற கோவையைக் கவனியுங்கள். இந்த கோவைக்கான ஒரு AST இப்படி இருக்கலாம்:


      =
     / \
    x   +
       / \
      y   *
         / \
        2   z

AST-கள் பொதுவாக தொகுப்பின் ஆரம்ப கட்டங்களில் சொற்பொருள் பகுப்பாய்வு மற்றும் வகை சரிபார்ப்பு போன்ற பணிகளுக்குப் பயன்படுத்தப்படுகின்றன. அவை மூலக் குறியீட்டிற்கு ஒப்பீட்டளவில் நெருக்கமாக உள்ளன மற்றும் அதன் அசல் கட்டமைப்பின் பெரும்பகுதியைத் தக்கவைத்துக்கொள்கின்றன, இது பிழைத்திருத்தம் மற்றும் மூல-நிலை மாற்றங்களுக்கு பயனுள்ளதாக இருக்கும்.

2. மூன்று-முகவரி குறியீடு (TAC)

TAC என்பது வழிமுறைகளின் ஒரு நேரியல் வரிசையாகும், அங்கு ஒவ்வொரு வழிமுறைக்கும் அதிகபட்சம் மூன்று இயங்கிகள் இருக்கும். இது பொதுவாக `x = y op z` என்ற வடிவத்தை எடுக்கும், இங்கு `x`, `y`, மற்றும் `z` ஆகியவை மாறிகள் அல்லது மாறிலிகள், மற்றும் `op` என்பது ஒரு செயலி. TAC சிக்கலான செயல்பாடுகளின் வெளிப்பாட்டை எளிய படிகளின் தொடராக எளிதாக்குகிறது.

உதாரணம்: மீண்டும் `x = y + 2 * z` என்ற கோவையைக் கவனியுங்கள். அதற்கான TAC இப்படி இருக்கலாம்:


t1 = 2 * z
t2 = y + t1
x = t2

இங்கே, `t1` மற்றும் `t2` ஆகியவை கம்பைலரால் அறிமுகப்படுத்தப்பட்ட தற்காலிக மாறிகள். TAC பெரும்பாலும் மேம்படுத்தல் பாஸ்களுக்கு பயன்படுத்தப்படுகிறது, ஏனெனில் அதன் எளிய கட்டமைப்பு குறியீட்டை பகுப்பாய்வு செய்வதையும் மாற்றுவதையும் எளிதாக்குகிறது. இது இயந்திரக் குறியீட்டை உருவாக்குவதற்கும் ஒரு நல்ல பொருத்தமாகும்.

3. நிலையான ஒற்றை ஒதுக்கீட்டு (SSA) வடிவம்

SSA என்பது TAC-இன் ஒரு மாறுபாடாகும், அங்கு ஒவ்வொரு மாறிக்கும் ஒரு முறை மட்டுமே மதிப்பு ஒதுக்கப்படும். ஒரு மாறிக்கு ஒரு புதிய மதிப்பை ஒதுக்க வேண்டும் என்றால், மாறியின் ஒரு புதிய பதிப்பு உருவாக்கப்படுகிறது. SSA தரவு ஓட்ட பகுப்பாய்வு மற்றும் மேம்படுத்தலை மிகவும் எளிதாக்குகிறது, ஏனெனில் இது ஒரே மாறிக்கு பல ஒதுக்கீடுகளைக் கண்காணிக்கும் தேவையை நீக்குகிறது.

உதாரணம்: பின்வரும் குறியீட்டுத் துணுக்கைக் கவனியுங்கள்:


x = 10
y = x + 5
x = 20
z = x + y

இதற்கு சமமான SSA வடிவம்:


x1 = 10
y1 = x1 + 5
x2 = 20
z1 = x2 + y1

ஒவ்வொரு மாறிக்கும் ஒரு முறை மட்டுமே ஒதுக்கீடு செய்யப்படுவதைக் கவனியுங்கள். `x` மீண்டும் ஒதுக்கப்படும்போது, ஒரு புதிய பதிப்பு `x2` உருவாக்கப்படுகிறது. SSA மாறிலி பரப்புதல் மற்றும் இறந்த குறியீடு நீக்கம் போன்ற பல மேம்படுத்தல் வழிமுறைகளை எளிதாக்குகிறது. ஃபை செயல்பாடுகள், பொதுவாக `x3 = phi(x1, x2)` என எழுதப்படுபவை, கட்டுப்பாட்டு ஓட்ட இணைப்பு புள்ளிகளிலும் அடிக்கடி காணப்படுகின்றன. ஃபை செயல்பாட்டை அடைய எடுக்கப்பட்ட பாதையைப் பொறுத்து `x3` `x1` அல்லது `x2` இன் மதிப்பை எடுக்கும் என்பதை இது குறிக்கிறது.

4. கட்டுப்பாட்டு ஓட்ட வரைபடம் (CFG)

ஒரு CFG ஒரு நிரலுக்குள் செயல்படுத்தப்படும் ஓட்டத்தை பிரதிபலிக்கிறது. இது ஒரு திசைப்படுத்தப்பட்ட வரைபடம், அங்கு கணுக்கள் அடிப்படைத் தொகுதிகளை (ஒற்றை நுழைவு மற்றும் வெளியேறும் புள்ளியுடன் கூடிய வழிமுறைகளின் வரிசைகள்) குறிக்கின்றன, மற்றும் விளிம்புகள் அவற்றுக்கு இடையேயான சாத்தியமான கட்டுப்பாட்டு ஓட்ட மாற்றங்களைக் குறிக்கின்றன.

CFG-கள் உயிர்வாழ்வு பகுப்பாய்வு, அடையும் வரையறைகள் மற்றும் லூப் கண்டறிதல் உள்ளிட்ட பல்வேறு பகுப்பாய்வுகளுக்கு அவசியமானவை. வழிமுறைகள் செயல்படுத்தப்படும் வரிசையையும், நிரல் வழியாக தரவு எவ்வாறு பாய்கிறது என்பதையும் கம்பைலர் புரிந்துகொள்ள அவை உதவுகின்றன.

5. திசைப்படுத்தப்பட்ட சுழற்சியற்ற வரைபடம் (DAG)

CFG-ஐப் போன்றது ஆனால் அடிப்படைத் தொகுதிகளுக்குள் உள்ள கோவைகளில் கவனம் செலுத்துகிறது. ஒரு DAG செயல்பாடுகளுக்கு இடையிலான சார்புகளை பார்வைக்குரியதாக பிரதிபலிக்கிறது, இது பொதுவான துணைக்கோவை நீக்கம் மற்றும் ஒரு அடிப்படைத் தொகுதிக்குள் உள்ள பிற மாற்றங்களை மேம்படுத்த உதவுகிறது.

6. இயங்குதள-குறிப்பிட்ட IR-கள் (உதாரணங்கள்: LLVM IR, JVM பைட்கோட்)

சில அமைப்புகள் இயங்குதள-குறிப்பிட்ட IR-களைப் பயன்படுத்துகின்றன. இரண்டு முக்கிய உதாரணங்கள் LLVM IR மற்றும் JVM பைட்கோட் ஆகும்.

LLVM IR

LLVM (குறைந்த நிலை மெய்நிகர் இயந்திரம்) என்பது ஒரு சக்திவாய்ந்த மற்றும் நெகிழ்வான IR-ஐ வழங்கும் ஒரு கம்பைலர் உள்கட்டமைப்பு திட்டமாகும். LLVM IR என்பது ஒரு வலுவாக தட்டச்சு செய்யப்பட்ட, குறைந்த-நிலை மொழியாகும், இது பரந்த அளவிலான இலக்கு கட்டமைப்புகளை ஆதரிக்கிறது. இது கிளங் (சி, சி++, ஆப்ஜெக்டிவ்-சி-க்கு), ஸ்விஃப்ட் மற்றும் ரஸ்ட் உள்ளிட்ட பல கம்பைலர்களால் பயன்படுத்தப்படுகிறது.

LLVM IR எளிதில் மேம்படுத்தப்பட்டு இயந்திரக் குறியீடாக மொழிபெயர்க்கப்பட வடிவமைக்கப்பட்டுள்ளது. இது SSA வடிவம், வெவ்வேறு தரவு வகைகளுக்கான ஆதரவு மற்றும் ஒரு செறிவான வழிமுறைகள் போன்ற அம்சங்களை உள்ளடக்கியது. LLVM உள்கட்டமைப்பு LLVM IR-லிருந்து குறியீட்டைப் பகுப்பாய்வு செய்வதற்கும், மாற்றுவதற்கும், உருவாக்குவதற்கும் கருவிகளின் தொகுப்பை வழங்குகிறது.

JVM பைட்கோட்

JVM (ஜாவா மெய்நிகர் இயந்திரம்) பைட்கோட் என்பது ஜாவா மெய்நிகர் இயந்திரத்தால் பயன்படுத்தப்படும் IR ஆகும். இது JVM-ஆல் செயல்படுத்தப்படும் ஒரு அடுக்கு-அடிப்படையிலான மொழியாகும். ஜாவா கம்பைலர்கள் ஜாவா மூலக் குறியீட்டை JVM பைட்கோடாக மொழிபெயர்க்கின்றன, அதை பின்னர் JVM செயல்படுத்தல் உள்ள எந்த தளத்திலும் இயக்க முடியும்.

JVM பைட்கோட் இயங்குதள-சார்பற்றதாகவும் பாதுகாப்பானதாகவும் வடிவமைக்கப்பட்டுள்ளது. இது குப்பை சேகரிப்பு மற்றும் டைனமிக் வகுப்பு ஏற்றுதல் போன்ற அம்சங்களை உள்ளடக்கியது. JVM பைட்கோடை செயல்படுத்துவதற்கும் நினைவகத்தை நிர்வகிப்பதற்கும் ஒரு இயக்க நேர சூழலை வழங்குகிறது.

மேம்படுத்தலில் IR-இன் பங்கு

குறியீடு மேம்படுத்தலில் IR-கள் ஒரு முக்கிய பங்கு வகிக்கின்றன. நிரலை எளிமைப்படுத்தப்பட்ட மற்றும் தரப்படுத்தப்பட்ட வடிவத்தில் பிரதிநிதித்துவப்படுத்துவதன் மூலம், IR-கள் உருவாக்கப்பட்ட குறியீட்டின் செயல்திறனை மேம்படுத்தும் பல்வேறு மாற்றங்களைச் செய்ய கம்பைலர்களுக்கு உதவுகின்றன. சில பொதுவான மேம்படுத்தல் நுட்பங்கள் பின்வருமாறு:

இந்த மேம்படுத்தல்கள் IR-இல் செய்யப்படுகின்றன, அதாவது கம்பைலர் ஆதரிக்கும் அனைத்து இலக்கு கட்டமைப்புகளுக்கும் அவை பயனளிக்க முடியும். இது IR-களைப் பயன்படுத்துவதன் ஒரு முக்கிய நன்மையாகும், ஏனெனில் இது டெவலப்பர்கள் மேம்படுத்தல் பாஸ்களை ஒரு முறை எழுதி பரந்த அளவிலான தளங்களுக்குப் பயன்படுத்த அனுமதிக்கிறது. உதாரணமாக, LLVM மேம்படுத்தி, LLVM IR-லிருந்து உருவாக்கப்பட்ட குறியீட்டின் செயல்திறனை மேம்படுத்தப் பயன்படுத்தக்கூடிய ஒரு பெரிய மேம்படுத்தல் பாஸ்களின் தொகுப்பை வழங்குகிறது. இது LLVM-இன் மேம்படுத்திக்கு பங்களிக்கும் டெவலப்பர்கள் சி++, ஸ்விஃப்ட் மற்றும் ரஸ்ட் உள்ளிட்ட பல மொழிகளுக்கான செயல்திறனை மேம்படுத்த அனுமதிக்கிறது.

ஒரு பயனுள்ள இடைநிலை பிரதிநிதித்துவத்தை உருவாக்குதல்

ஒரு நல்ல IR-ஐ வடிவமைப்பது ஒரு நுட்பமான சமநிலைப்படுத்தும் செயல். இங்கே சில பரிசீலனைகள் உள்ளன:

நிஜ-உலக IR-களின் உதாரணங்கள்

சில பிரபலமான மொழிகள் மற்றும் அமைப்புகளில் IR-கள் எவ்வாறு பயன்படுத்தப்படுகின்றன என்பதைப் பார்ப்போம்:

IR மற்றும் மெய்நிகர் இயந்திரங்கள்

IR-கள் மெய்நிகர் இயந்திரங்களின் (VMs) செயல்பாட்டிற்கு அடிப்படையானவை. ஒரு VM பொதுவாக நேட்டிவ் இயந்திரக் குறியீட்டிற்குப் பதிலாக JVM பைட்கோட் அல்லது CIL போன்ற ஒரு IR-ஐ செயல்படுத்துகிறது. இது VM-ஐ ஒரு இயங்குதள-சார்பற்ற செயல்படுத்தல் சூழலை வழங்க அனுமதிக்கிறது. VM இயக்க நேரத்தில் IR-இல் டைனமிக் மேம்படுத்தல்களையும் செய்யலாம், இது செயல்திறனை மேலும் மேம்படுத்துகிறது.

இந்த செயல்முறை பொதுவாக பின்வருவனவற்றை உள்ளடக்கியது:

  1. மூலக் குறியீட்டை IR ஆகத் தொகுத்தல்.
  2. IR-ஐ VM-இல் ஏற்றுதல்.
  3. IR-ஐ நேட்டிவ் இயந்திரக் குறியீடாக விளக்குதல் அல்லது ஜஸ்ட்-இன்-டைம் (JIT) தொகுப்பு செய்தல்.
  4. நேட்டிவ் இயந்திரக் குறியீட்டைச் செயல்படுத்துதல்.

JIT தொகுப்பு, நிலையான தொகுப்பை விட சிறந்த செயல்திறனுக்கு வழிவகுக்கும், இயக்க நேர நடத்தையின் அடிப்படையில் குறியீட்டை மாறும் வகையில் மேம்படுத்த VM-களை அனுமதிக்கிறது.

இடைநிலை பிரதிநிதித்துவங்களின் எதிர்காலம்

புதிய பிரதிநிதித்துவங்கள் மற்றும் மேம்படுத்தல் நுட்பங்கள் குறித்த தற்போதைய ஆராய்ச்சியுடன் IR-களின் புலம் தொடர்ந்து வளர்ந்து வருகிறது. தற்போதைய சில போக்குகள் பின்வருமாறு:

சவால்கள் மற்றும் பரிசீலனைகள்

நன்மைகள் இருந்தபோதிலும், IR-களுடன் பணிபுரிவது சில சவால்களை முன்வைக்கிறது:

முடிவுரை

இடைநிலை பிரதிநிதித்துவங்கள் நவீன கம்பைலர் வடிவமைப்பு மற்றும் மெய்நிகர் இயந்திர தொழில்நுட்பத்தின் ஒரு மூலக்கல்லாகும். அவை குறியீட்டு பெயர்வுத்திறன், மேம்படுத்தல் மற்றும் கூறுநிலையை செயல்படுத்தும் ஒரு முக்கியமான சுருக்கத்தை வழங்குகின்றன. பல்வேறு வகையான IR-களையும், தொகுப்புச் செயல்பாட்டில் அவற்றின் பங்கையும் புரிந்துகொள்வதன் மூலம், டெவலப்பர்கள் மென்பொருள் மேம்பாட்டின் சிக்கல்கள் மற்றும் திறமையான மற்றும் நம்பகமான குறியீட்டை உருவாக்குவதில் உள்ள சவால்களைப் பற்றி ஆழ்ந்த பாராட்டைப் பெற முடியும்.

தொழில்நுட்பம் தொடர்ந்து முன்னேறும்போது, உயர்-நிலை நிரலாக்க மொழிகளுக்கும், வன்பொருள் கட்டமைப்புகளின் எப்போதும் மாறிவரும் நிலப்பரப்பிற்கும் இடையிலான இடைவெளியைக் குறைப்பதில் IR-கள் சந்தேகத்திற்கு இடமின்றி பெருகிய முறையில் முக்கிய பங்கு வகிக்கும். வன்பொருள் சார்ந்த விவரங்களை சுருக்கி அதே நேரத்தில் சக்திவாய்ந்த மேம்படுத்தல்களுக்கு அனுமதிக்கும் அவற்றின் திறன், அவற்றை மென்பொருள் மேம்பாட்டிற்கான இன்றியமையாத கருவிகளாக ஆக்குகிறது.