కంపైలర్

కంపైలర్ (Compiler) అనగా హై లెవల్ ప్రోగ్రామింగ్ భాషలో రాసిన ప్రోగ్రాములను కంప్యూటర్కు  అర్థమయ్యే మెషీన్ భాషకు తర్జుమా చేసే ఒక సాఫ్టువేరు. దీనిని తెలుగులో కూర్పరి అందాం. కూర్పరి ఒక ఉన్నత స్థాయి భాషలో రాసిన క్రమణికని మరొక నిమ్న  స్థాయి భాషలోకి తర్జుమా చెయ్యటానికి కంప్యూటరు వాడే మరొక క్రమణిక. ఉన్నత స్థాయి భాష అంటే మనుష్యులకి సులభంగా అర్థం అయే భాష. నిమ్న  స్థాయి భాష అంటే యంత్రానికి (ఇక్కడ కంప్యూటర్ కి అని వ్యాఖ్యానం చెప్పుకోవాలి) సులభంగా అర్థం అయే భాష. 

మానవులు కంప్యూటర్లతో సంభాషించవలసి వచ్చినప్పుడు ఒక చిక్కు సమశ్య ఎదురవుతుంది. క్రమణికలు రాసే వ్యక్తులు వారికి అర్థం అయే భాషలో (అనగా ఇంగ్లీషులోనో, తెలుగులోనో) రాయడానికి మొగ్గు చూపుతారు. కాని కంప్యూటర్లకి మానవులు వాడే సహజ భాషలు (natural languages) అర్థం కావు. వాటికి అర్థం అయేది యాంత్రిక భాష (machine language). కనుక మనం మనకి అర్థం అయే భాషలో రాసిన క్రమణికలని కంప్యూటర్లకి అర్థం అయే భాషలోకి మార్చగలిగే సదుపాయం ఉండాలి. అటువంటి సదుపాయాలలో కూర్పరి (compiler) ఒకటి.  

ఒక భాషకు కంపైలర్ తయారు చేయాలంటే ముందు ఆ భాషకు వ్యాకరణాన్ని (గ్రామర్) రూపొందించాలి. ఈ వ్యాకరణాన్ని అనుసరించి మనం రాసిన ప్రోగ్రాములను కంపైలర్ సరియైనదా? కాదా? అనేది నిర్ణయిస్తుంది. మెషీన్ భాష నుంచి హైలెవెల్ కంప్యూటర్ భాషకు మార్చే సాఫ్టువేర్లను డీకంపైలర్ అని వ్యవహరిస్తుంటారు.

కూర్పు దశలు
ఒక కూర్పరి (కంపైలర్) ఉన్నత స్థాయి భాషలో రాసిన క్రమణికని (హై లెవల్ ప్రోగ్రామును) మెషీన్ భాషకు తర్జుమా చెయ్యడంలో వివిధ దశలున్నాయి.
 నైఘంటిక విశ్లేషణ (lexical analysis)
 వ్యాకరణ విశ్లేషణ (syntactic analysis)
 అర్థ విశ్లేషణ (semantic analysis) 
 క్రమణికల ఉత్ప్పత్తి (code generation)
 సర్వోత్తమ క్రమణికల ఎంపిక (code optimization) 
ఈ దశలని ఇప్పుడు వివరంగా పరిశీలిద్దాం. 

(1) నైఘంటిక విశ్లేషణ (lexical analysis) దశలో క్రమణికని ఆనవాళ్లు (tokens) గా విరగ్గొడతారు. (2)
వ్యాకరణ విశ్లేషణ దశలో పైన విభజించిన విడిభాగాలు, లేదా ఆనవాళ్ళు, వ్యాకరణ పరంగా సరియైన క్రమణికని ఏర్పరుస్తాయో లేదో నిర్ణయిస్తారు. అంతే కాకుండా ఆనవాళ్లని ఉపయోగించి వ్యాకరణ వృక్షాన్ని (syntax tree) నిర్మిస్తారు. (3) తరువాత అర్థ విశ్లేషణ చేసి క్రమణిక అర్థవంతంగా ఉందో లేదో పరీక్షిస్తారు. (4) క్రమణికల ఉత్ప్పత్తి దశలో వ్యాకరణ వృక్షాన్ని ఆధారంగా చేసుకుని ఒక మధ్యస్థ స్థాయి భాషలో ఆదేశాలు (instructions) గా మారుస్తారు. (4) సర్వోత్తమ క్రమణికల ఎంపిక దశలో క్రమణికల సామర్థ్యాన్ని పెంచడానికి ఆదేశాల నిర్మాణంలో మార్పులు చేస్తారు. ఇప్పుడు ఈ దశలని కమరి మకొంచెం లోతుగా పరిశీళిద్దాం.

నైఘంటిక విశ్లేషణ (lexical analysis)
చిన్న ఉదాహరణతో మొదలు పెడదాం. క్రమణికలు ఇంగ్లీషు మాటలలోనే రాయాలని నిబంధన లేదు కాని, సౌలభ్యానికి మన మొదటి ఆదేశం తరఫున ఈ దిగువ ఇంగ్లీషు వాక్యం వాడదాం. 

String greeting = "hello!";

ఈ వాక్యంలో అయిదు "ఆనవాళ్లు" (tokens)  ఉన్నాయి. అవి: 
 String
 greeting
 =
 "hello!"
 ;

వ్యాకరణ విశ్లేషణ (syntactic analysis)
పై దశలో తయారు చేసిన ఆనవాళ్ళతో ఒక వ్యాకరణ వృక్షాన్ని నిర్మిస్తారు. ఈ దశలో మనం రాసిన ఆదేశాలలో ఏవైనా వ్యాకరణ దోషాలు ఉన్నాయేమో చూసి, ఉంటే ఆ తప్పులని ఎత్తి చూపుతూ వినియోగదారులకి సలహాలు ఇస్తుంది కూర్పరి.  (In this phase, the compiler checks the grammatic structure of the source code and its syntactic correctness.)

అర్థ విశ్లేషణ (semantic analysis)
మనం రాసిన ఆదేశాలు వ్యాకరణ యుక్తంగా ఉన్నంత మాత్రాన్న సరిపోదు; అవి అర్థభరితంగా కూడా ఉండాలి. ఉదాహరణకి a అనేది పూర్ణసంఖ్య అని ఒక ఆదేశంలో చెప్పిన తరువాత ఆ a = 3.2 అని  మరొక ఆదేశంలో చెబితే కంప్యూటర్ మనం చెప్పేది అర్థం చేసుకోలేదు. ఇలాంటి తప్పులు ఎన్నో రకాలు ఎదురవుతూ ఉంటాయి. ఉదాహరణకి  type checking, flow control checking, label checking anEvi.

క్రమణికల ఉత్ప్పత్తి (code generation)

సర్వోత్తమ క్రమణికల ఎంపిక(code optimization)

ఉదాహరణ
ఉదాహరణకి 
x = y*25 
అనే ఆదేశాన్ని తీసుకుందాం. దీని అర్థం ఏమిటంటే  "y  అనే చలరాసిని తీసుకుని, దానిని 25 చేత గుణించి, అలా గుణించగా వచ్చిన విలువని ని  x ఆపాదించాలి." ఇక్కడ * గుణకారానికి గుర్తు. 
ముందు దీనిని నైఘంటిక విశ్లేషణ చేద్దాం. అనగా, x = y*25 అనే దానిని ఆనవాళ్లు (identifiers or id)గా విడగొడదాం. అప్పుడు వచ్చే ఆనవాళ్లు ఇవి:
 x = id1
 =
 y = id2
 * 
 25 = id3
ఈ ఆనవాళ్ళు ఉపయోగించి మనకి ఇచ్చిన ఆదేశాన్ని తిరగ రాద్దాం

id1 = id2 * id3

ఇక్కడితో నైఘంటిక విశ్లేషణ పూర్తి అయింది. 

ఇప్పుడు వ్యాకరణ విశ్లేషణకి వీలుగా వ్యాకరణ వృక్షాన్ని నిర్మించాలి.  "ఊర్ధ్వమూలం, అధోశాఖా..." అన్నట్లు ఈ చెట్టు తలకిందులుగా ఉంటుంది. మూలంలో = గుర్తు పెట్టాలి. మూలం నుండి కిందకి రెండు కొమ్మలు దిగుతాయి. ఎడం పక్క కొమ్మ మీద  id1 అని రాస్తాం. కుడి పక్క * గుర్తు పెట్టాలి. ఇప్పుడు ఈ * మూలంగా మరొక రెండు కొమ్మలు కిందకి దిగుతాయి. ఎడం పక్క కొమ్మ మీద id2 అనిన్నీ, కుడి పక్క కొమ్మ మీద id3 అనిన్నీ రాస్తాం. ఇక్కడితో వ్యాకరణ విశ్లేషణ పూర్తి అయింది.

ఇప్పుడు అర్థ విశ్లేషణకి వీలుగా వ్యాకరణ వృక్షానికి అర్థం కల్పించాలి. మనకి id3 విలువ 25 అని తెలుసు, కనుక ఆ విలువని అక్కడ ప్రతిక్షేపిస్తాం. ఇక్కడితో అర్థ విశ్లేషణ పూర్తి అయింది.

ఇప్పుడు క్రమణికని రాయడానికి ఉపక్రమించవచ్చు.

మనకి తెలిసిన 25 ని temp1 అనే పేరుగల తాత్కాలిక గది లో భద్రపరుస్తాం. ఈ పని చెయ్యడానికి (temp1 = 25) అనే ఆదేశాన్ని వాడదాం. ఇప్పుడు temp1 లో ఉన్న శాల్తీని id2 చేత గుణించి, ఆ ఫలితాన్ని తాత్కాలిక temp2 లో భద్రపరుద్దాం. ఈ పని చెయ్యడానికి (temp2 = id2*temp1) అనే ఆదేశాన్ని వాడదాం. ఇప్పుడు temp2 లో ఉన్నదే id1 అని గుర్తిద్దాం.

మూలాలు 

గణక ప్రక్రియ