Windows and Line Terminator CR+LF

பசங்களுக்கு ப்ரோக்ராம்மிங் படிப்பிக்கும் போது அடிக்கடி வரும் ஒரு பிரச்சினை, ஸ்ட்ரிங் நியூ லைன் பத்தி பேசும் போது பொதுவா எல்லா ப்ரோக்ராமிங் மொழியும் ஒரே சிங்கிள் “\n” (Linefeed என்கிற எழுத்து – ASCII குறியில் LF, decimal value: 10, Hex value: A  மட்டும்) எழுத்தையே பயன்படுத்துது அதாவது ஒரு பைட், ஆனா விண்டோசில் இந்த line terminator எழுத்தை பார்க்கும் போது இரண்டு எழுத்துக்கள் சேர்ந்து இது உருவாக்கப்பட்டுள்ளது. அதாவது CR என்கிற Carriage Return எழுத்தது (ASCII decimal value: 13, Hex value: D) இது பசங்களுக்கு பெரிய பிரச்சினை. ஏன் இந்த ரெண்டெழுத்து?நீங்க லினக்ஸ் முறைமையை பயன்படுத்தினால் அதில் LF மட்டுமே  line terminator எழுத்தாக பயன்படுகிறது. ஏன் இந்த வேறுபாடு? தெளிவாக பார்க்கலாம்.

இப்போ 68k க்கான assembly மொழி படிப்பிக்கும் போது, இந்த இரண்டு எழுத்தையும் சேர்த்து டிபைன் பண்ணவேண்டி இருப்பதால், இதைப் பற்றி கொஞ்சம் தெளிவாக பார்க்கலம் என்பதே இந்தக் கட்டுரையின் நோக்கம்.

ஆரம்பக் காலத்தில் மானிட்டர்களை பயன்படுத்தி கணனியில் வெளியீட்டை பெற முன்னர், பிரிண்டர்கள் பிரதான வெளியீட்டு சாதனமாக பயன்பட்டது. அப்போது ஒரு வரி எழுதிவிட்டு அடுத்த வரிக்கு செல்ல பயன்பட்ட முறை தான் இந்த carriage return மற்றும் linefeed.

Carriage return எழுத்து பிரிண்டர் ஹெட்டை (printer head) முதலாவது எழுத்துக்கான column இல் கொண்டுவந்து நிறுத்தும். அதாவது column 0 என்று வைத்துக் கொள்ளலாம். அதாவது ஒரு பேப்பரின் இடப்பக்கத்தில் முதலாவது எழுத்தை எழுதக் கூடிய இடம் என்று எடுத்துக்கொள்ளுங்கள். இப்போது ஒரு பிரச்சினை, இந்த CR பிரிண்டர் head ஐ முதலாவது column இல் தான் கொண்டு வந்து நிறுத்தி இருக்கிறது, அப்படியாயின் இப்போது நாம் பிரிண்ட் பண்ணினால், ஏற்கனவே அந்த லைனில் எழுதப்பட்ட எழுத்துகளுக்கு மேலே மீண்டும் பிரின்ட் செய்யப்படும். ஆகவே பேப்பரை சற்றே மேலே உயர்த்தி அடுத்த லைனுக்கு கொண்டு செல்லவேண்டும் அல்லவா? அதற்குத்தான் linefeed எழுத்து.

Linefeed பேப்பரை ஒரு வரி மேலே தூக்கும், ஆனால் பிரிண்டர் ஹெட் அவ்விடத்திலேயே இருக்கும். ஒவ்வொரு சொல்லிற்கும் linefeed ஐ மட்டும் பயன்படுத்தினால் வெளியீடு பின்வருமாறு வரும்.

2017-07-06_210416.png

இப்போது உங்களுக்கு புரிந்திருக்கும், புதிய லைனில் பிரின்ட் செய்ய அடுத்த லைனுக்கும் செல்லவேண்டும் அதே வேளை பிரிண்டர் ஹெட் மீண்டும் column 0 இற்கு வரவேண்டும். ஆகவேதான் புதிய லைனை உருவாக விண்டோஸ் OS CR+LF இரண்டு எழுத்துக்களையும் பயன்படுத்துகிறது. இதற்கு இரண்டு பைட்கள் தேவைப்படும்.

ஆனால் லினக்ஸ் முறைமை, யூனிக்ஸ் முறைமையை அடிப்படையாக கொண்டது, யூனிக்ஸ் முறைமையில் LF மட்டுமே வெளிப்படையாக பயன்படுத்தப்படுகிறது. CR ஐ அது மறைமுகமாக சேர்த்துக்கொள்கிறது. இதனால் ஒவ்வொரு லைனிலும் ஒரு பைட் வீதம் மிச்சப்படுத்த முடியும்!

யூனிக்ஸ் இயங்கு முறையில் இருக்கும் அடிப்படைகளை C மொழி கொண்டிருப்பதால், அந்த மொழியில் புதிய லைனிற்கு செல்வதற்கு வெறும் ஒரு எழுத்தை மட்டுமே பயன்படுத்தினர்; அதாவது “\n” எனும் எழுத்து, ஏனைய மொழிகளும் அதாவது C++, Java மற்றும் ஏனையவையும் இதனையை பின்பற்றத் தொடங்கினர்.

மேலே கூறிய இந்த மொழிக்கான விண்டோஸ் காம்பைலர்கள் இந்த “\n” எழுத்தை CR+LF என இரு எழுத்துகளாக மாற்றிக்கொள்ளும்.

அசம்பிளி மொழியில் (68k Motorola processor) பொதுவாக எழுத்துக்களை வேறு லைன்களில் காட்டும் போது, CR, LF ஆகியவற்றை பின்வருமாறு பயன்படுத்துவோம்.

[code]

CR     EQU $0A
LF     EQU $0D

MESS   DC.B ‘HELLO WORLD’,CR,LF,’NEW LINE HERE,0
[/code]

MESS  என்கிற வல்யுவை நீங்கள் பிரிண்ட் செய்தால் அது பின்வருமாறு அமையும்.

[code]
HELLO WORLD
NEW LINE HERE
[/code]

EASy68K ஐ பயன்படுத்தி நீங்கள் இதனை இயக்கி பார்க்க விரும்பினால் இதோ உங்களுக்காக முழுப் ப்ரோக்ராமும்.

[code]
START:      ORG    $1000

            LEA     MESS,A1
            MOVE.B  #14,D0
            TRAP    #15

            SIMHALT             ; halt simulator

CR          EQU     $0A
LF          EQU     $0D

MESS        DC.B    'HELLO WORLD',CR,LF,'THIS IS ON NEW LINE',0

            END    START
[/code]

மேலே எழுதிய அசம்பிளி கோட் அசம்பிள் செய்யப்பட்டு ரன் செய்தால் வரும் விடையை கீழே பார்க்கலாம்.

2017-07-06_205909.png

2017-07-06_205947.png

மேலதிக தகவல்கள்:

ASCII value க்களை பார்க்க – http://www.asciitable.com/

68K processor க்கான இலவச விண்டோஸ் simulator – http://www.easy68k.com/