சி மொழி நடத்தைகளின் கணிக்க முடியாத உலகத்தை ஆராய்தல்
C இல் புரோகிராமிங் தனிப்பட்ட சவால்களுடன் வருகிறது, குறிப்பாக வரையறுக்கப்படாத மற்றும் செயல்படுத்தல்-வரையறுக்கப்பட்ட நடத்தைகள் உங்கள் குறியீட்டை எவ்வாறு பாதிக்கின்றன என்பதைப் புரிந்து கொள்ளும்போது. இந்த நடத்தைகள் சி மொழியின் நெகிழ்வுத்தன்மை மற்றும் சக்தியிலிருந்து உருவாகின்றன, ஆனால் அவை அபாயங்களையும் அறிமுகப்படுத்துகின்றன. ஒரு ஒற்றை மேற்பார்வை கணிக்க முடியாத திட்ட விளைவுகளுக்கு வழிவகுக்கும். 🚀
சில குறியீடு கட்டமைப்புகளுக்கு என்ன நடக்க வேண்டும் என்பதை C தரநிலை குறிப்பிடாதபோது வரையறுக்கப்படாத நடத்தை ஏற்படுகிறது, அதை முழுவதுமாக கம்பைலரிடம் விட்டுவிடுகிறது. மறுபுறம், செயல்படுத்தல்-வரையறுக்கப்பட்ட நடத்தை, கம்பைலர்கள் தங்கள் சொந்த விளக்கத்தை வழங்க அனுமதிக்கிறது, இது ஒரு கணிக்கக்கூடிய முடிவை உருவாக்குகிறது-அது இயங்குதளங்களில் மாறுபடலாம். கையடக்க மற்றும் வலுவான குறியீட்டை எழுதுவதை நோக்கமாகக் கொண்ட டெவலப்பர்களுக்கு இந்த வேறுபாடு முக்கியமானது.
பலர் ஆச்சரியப்படுகிறார்கள்: வரையறுக்கப்படாத நடத்தை ஒரு செயலாக்கத்தால் வெளிப்படையாக வரையறுக்கப்படவில்லை என்றால், அது தொகுக்கும் நேரப் பிழைக்கு வழிவகுக்குமா? அல்லது அத்தகைய குறியீடு தொடரியல் மற்றும் சொற்பொருள் சரிபார்ப்புகளைத் தவிர்த்து, விரிசல்களை இயக்க நேரமாக மாற்ற முடியுமா? C. 🤔 இல் சிக்கலான சிக்கல்களை பிழைத்திருத்தம் செய்யும் போது இவை முக்கிய கேள்விகள்
இந்த விவாதத்தில், வரையறுக்கப்படாத மற்றும் செயல்படுத்தல்-வரையறுக்கப்பட்ட நடத்தைகளின் நுணுக்கங்களை ஆராய்வோம், உறுதியான எடுத்துக்காட்டுகளை வழங்குவோம், மேலும் தொகுத்தல் மற்றும் பிழை கையாளுதல் பற்றிய அழுத்தமான கேள்விகளுக்கு பதிலளிப்போம். நீங்கள் ஒரு புதியவராக இருந்தாலும் சரி அல்லது அனுபவம் வாய்ந்த சி புரோகிராமராக இருந்தாலும் சரி, இந்த கருத்துக்களைப் புரிந்துகொள்வது மொழியின் தேர்ச்சிக்கு இன்றியமையாதது.
கட்டளை | பயன்பாட்டின் உதாரணம் |
---|---|
assert() | இயக்க நேரத்தின் போது அனுமானங்களை சரிபார்க்க அலகு சோதனைகளில் பயன்படுத்தப்படுகிறது. எடுத்துக்காட்டாக, அசெர்ட்(முடிவு == -2 || முடிவு == -3) பிரிவு வெளியீடு செயல்படுத்தல்-வரையறுக்கப்பட்ட சாத்தியக்கூறுகளுடன் பொருந்துகிறதா என்பதைச் சரிபார்க்கிறது. |
bool | C99 இல் அறிமுகப்படுத்தப்பட்ட பூலியன் தரவு வகைகளுக்குப் பயன்படுத்தப்பட்டது. எடுத்துக்காட்டாக, bool isDivisionValid(int divisor) ஆனது உள்ளீட்டின் அடிப்படையில் சரி அல்லது தவறு என்பதை வழங்குகிறது. |
scanf() | பயனர் உள்ளீட்டைப் பாதுகாப்பாகப் பிடிக்கிறது. ஸ்கிரிப்ட்டில், ஸ்கேன்ஃப்("%d %d", &a, &b) இரண்டு முழு எண்களைப் படிக்கிறது, இது பூஜ்ஜியத்தால் வகுத்தல் போன்ற வரையறுக்கப்படாத நடத்தையின் மாறும் கையாளுதலை உறுதி செய்கிறது. |
printf() | வடிவமைக்கப்பட்ட வெளியீட்டைக் காட்டுகிறது. எடுத்துக்காட்டாக, printf("பாதுகாப்பான பிரிவு: %d / %d = %dn", a, b, a / b) பிரிவு முடிவுகளை பயனருக்கு மாறும் வகையில் தெரிவிக்கிறது. |
#include <stdbool.h> | C இல் பூலியன் தரவு வகைகளுக்கான ஆதரவை உள்ளடக்கியது. இது தருக்க செயல்பாடுகளுக்கு உண்மை மற்றும் தவறான முக்கிய வார்த்தைகளைப் பயன்படுத்த அனுமதிக்கிறது. |
return | செயல்பாட்டின் வருவாய் மதிப்பைக் குறிப்பிடுகிறது. உதாரணமாக, ரிட்டர்ன் வகுப்பான் != 0; சரிபார்ப்பு செயல்பாட்டில் தருக்க சரியான தன்மையை உறுதி செய்கிறது. |
if | நிபந்தனை தர்க்கத்தை செயல்படுத்துகிறது. எடுத்துக்காட்டில், (isDivisionValid(b)) பூஜ்ஜியத்தால் வகுபடுவதைச் சரிபார்ப்பதன் மூலம் வரையறுக்கப்படாத நடத்தையைத் தடுக்கிறது. |
#include <stdlib.h> | நினைவக மேலாண்மை மற்றும் நிரல் நிறுத்தம் போன்ற பொதுவான பயன்பாடுகளுக்கான அணுகலை வழங்குகிறது. ஒட்டுமொத்த குறியீடு ஆதரவுக்காக இங்கே பயன்படுத்தப்படுகிறது. |
#include <assert.h> | சோதனைக்கான இயக்க நேர வலியுறுத்தல்களை இயக்குகிறது. செயல்படுத்தல்-வரையறுக்கப்பட்ட நடத்தை விளைவுகளை சரிபார்க்க உறுதி() அழைப்புகளில் இது பயன்படுத்தப்பட்டது. |
#include <stdio.h> | பயனர் தொடர்பு மற்றும் பிழைத்திருத்தத்திற்கு அத்தியாவசியமான printf() மற்றும் scanf() போன்ற நிலையான I/O செயல்பாடுகளை உள்ளடக்கியது. |
C இல் வரையறுக்கப்படாத மற்றும் செயல்படுத்தல்-வரையறுக்கப்பட்ட நடத்தையின் இயக்கவியல் பகுப்பாய்வு
மேலே கொடுக்கப்பட்ட ஸ்கிரிப்ட்கள் C இல் வரையறுக்கப்படாத மற்றும் செயல்படுத்தல்-வரையறுக்கப்பட்ட நடத்தைகளின் முக்கிய கருத்துகளை முன்னிலைப்படுத்துவதை நோக்கமாகக் கொண்டுள்ளன. முதல் ஸ்கிரிப்ட் தொடங்கப்படாத மாறிகள் அணுகப்படும்போது வரையறுக்கப்படாத நடத்தை எவ்வாறு வெளிப்படும் என்பதை விளக்குகிறது. எடுத்துக்காட்டாக, "x" போன்ற மாறியின் மதிப்பை துவக்காமல் அச்சிட முயற்சிப்பது கணிக்க முடியாத முடிவுகளுக்கு வழிவகுக்கும். வரையறுக்கப்படாத நடத்தை, கம்பைலர் மற்றும் இயக்க நேர சூழல் போன்ற காரணிகளைப் பொறுத்தது என்பதைப் புரிந்துகொள்வதன் முக்கியத்துவத்தை இது அடிக்கோடிட்டுக் காட்டுகிறது. நடத்தையைக் காண்பிப்பதன் மூலம், டெவலப்பர்கள் துவக்கத்தை புறக்கணிப்பதன் மூலம் ஏற்படும் அபாயங்களைக் காட்சிப்படுத்தலாம், இது குறிப்பிடத்தக்க பிழைத்திருத்த சவால்களை ஏற்படுத்தக்கூடிய ஒரு சிக்கலாகும். 🐛
இரண்டாவது ஸ்கிரிப்ட் செயல்படுத்தல்-வரையறுக்கப்பட்ட நடத்தையை ஆராய்கிறது, குறிப்பாக கையொப்பமிடப்பட்ட முழு எண் பிரிவின் விளைவாக. C தரநிலையானது எதிர்மறை எண்களை வகுக்கும் போது இரண்டு விளைவுகளுக்கு இடையே தேர்வு செய்ய கம்பைலர்களை அனுமதிக்கிறது, அதாவது -5 2 ஆல் வகுத்தல். செயல்பாடு இந்த விளைவுகளை எதிர்பார்த்து சரியாக கையாளப்படுவதை உறுதி செய்கிறது. இந்த ஸ்கிரிப்ட் குறிப்பாக செயல்படுத்தல்-வரையறுக்கப்பட்ட நடத்தை மாறுபடும் போது, கம்பைலரால் ஆவணப்படுத்தப்பட்டால், அது யூகிக்கக்கூடியதாக இருக்கும், இது வரையறுக்கப்படாத நடத்தையைக் காட்டிலும் குறைவான ஆபத்தானது. யூனிட் சோதனைகளைச் சேர்ப்பது பிழைகளை முன்கூட்டியே கண்டறிவதற்கான ஒரு சிறந்த நடைமுறையாகும், குறிப்பாக பல இயங்குதளங்களுக்கான கோட்பேஸ்களில்.
டைனமிக் இன்புட் ஹேண்ட்லிங் ஸ்கிரிப்ட், வரையறுக்கப்படாத நடத்தை தடுப்புகளை ஆராய்வதற்காக பயனர் தொடர்புகளின் அடுக்கைச் சேர்க்கிறது. எடுத்துக்காட்டாக, பூஜ்ஜியத்தால் வகுப்பதைத் தவிர்ப்பதன் மூலம் பாதுகாப்பான பிரிவை உறுதிப்படுத்த இது சரிபார்ப்பு செயல்பாட்டைப் பயன்படுத்துகிறது. பயனர்கள் இரண்டு முழு எண்களை உள்ளிடும்போது, நிரல் வகுப்பியை மதிப்பிடுகிறது மற்றும் முடிவைக் கணக்கிடுகிறது அல்லது உள்ளீடு தவறானது எனக் கொடியிடுகிறது. இந்த செயலூக்கமான அணுகுமுறை, இயக்க நேரச் சரிபார்ப்புகளை ஒருங்கிணைப்பதன் மூலம் பிழைகளைக் குறைக்கிறது மற்றும் பிழையான உள்ளீட்டை நிரல் நேர்த்தியாகக் கையாளுவதை உறுதிசெய்கிறது. இந்த உதாரணம் நிஜ உலக பயன்பாடுகளில் பிழை கையாளுதலின் முக்கியத்துவத்தை எடுத்துக்காட்டுகிறது. 🌟
இந்த அனைத்து ஸ்கிரிப்ட்களிலும், குறிப்பிட்ட C மொழி கட்டமைப்புகள் போன்றவை இருந்து நூலகம் தெளிவு மற்றும் பராமரிப்பை மேம்படுத்துகிறது. கூடுதலாக, மாடுலாரிட்டி தனிப்பட்ட செயல்பாடுகளை மீண்டும் பயன்படுத்த அல்லது சுயாதீனமாக சோதிக்க அனுமதிக்கிறது, இது பெரிய திட்டங்களில் விலைமதிப்பற்றது. பயனர் உள்ளீடு சரிபார்ப்பு, யூகிக்கக்கூடிய முடிவுகள் மற்றும் யூனிட் சோதனை ஆகியவற்றில் கவனம் செலுத்துவது பாதுகாப்பான மற்றும் திறமையான குறியீட்டை எழுதுவதற்கான சிறந்த நடைமுறைகளை பிரதிபலிக்கிறது. இந்த எடுத்துக்காட்டுகள் மூலம், டெவலப்பர்கள் C இல் வரையறுக்கப்படாத மற்றும் செயல்படுத்தல்-வரையறுக்கப்பட்ட நடத்தைகளின் நெகிழ்வுத்தன்மை மற்றும் சிக்கலான தன்மைக்கு இடையே உள்ள சமநிலையைப் பாராட்டலாம்.
C இல் வரையறுக்கப்படாத மற்றும் செயல்படுத்தல்-வரையறுக்கப்பட்ட நடத்தை விளக்கப்பட்டது
இந்த எடுத்துக்காட்டு சி நிரலாக்கத்தைப் பயன்படுத்தி வரையறுக்கப்படாத மற்றும் செயல்படுத்தல்-வரையறுக்கப்பட்ட நடத்தையை மட்டு மற்றும் மீண்டும் பயன்படுத்தக்கூடிய அணுகுமுறைகளுடன் கையாளுகிறது.
#include <stdio.h>
#include <stdlib.h>
// Function to demonstrate undefined behavior (e.g., uninitialized variable)
void demonstrateUndefinedBehavior() {
int x;
printf("Undefined behavior: value of x = %d\\n", x);
}
// Function to demonstrate implementation-defined behavior (e.g., signed integer division)
void demonstrateImplementationDefinedBehavior() {
int a = -5, b = 2;
printf("Implementation-defined behavior: -5 / 2 = %d\\n", a / b);
}
int main() {
printf("Demonstrating undefined and implementation-defined behavior in C:\\n");
demonstrateUndefinedBehavior();
demonstrateImplementationDefinedBehavior();
return 0;
}
ஒரு அலகு சோதனை மூலம் நடத்தை சரிபார்த்தல்
இந்த ஸ்கிரிப்ட் நடத்தை சரிபார்க்க C இல் ஒரு எளிய சோதனை கட்டமைப்பை உள்ளடக்கியது. இது விளிம்பு நிலைகளை ஆராய வடிவமைக்கப்பட்டுள்ளது.
#include <stdio.h>
#include <assert.h>
// Unit test for implementation-defined behavior
void testImplementationDefinedBehavior() {
int a = -5, b = 2;
int result = a / b;
assert(result == -2 || result == -3); // Depending on compiler, result may differ
printf("Test passed: Implementation-defined behavior for signed division\\n");
}
// Unit test for undefined behavior (here used safely with initialized variables)
void testUndefinedBehaviorSafe() {
int x = 10; // Initialize to prevent undefined behavior
assert(x == 10);
printf("Test passed: Safe handling of undefined behavior\\n");
}
int main() {
testImplementationDefinedBehavior();
testUndefinedBehaviorSafe();
printf("All tests passed!\\n");
return 0;
}
வரையறுக்கப்படாத நடத்தையைக் கண்டறிய C இல் டைனமிக் உள்ளீடு கையாளுதல்
C இல் பாதுகாப்பான குறியீட்டு நுட்பங்களைப் பயன்படுத்தி, வரையறுக்கப்படாத நடத்தையைத் தடுப்பதற்கான உள்ளீடு சரிபார்ப்பை இந்த எடுத்துக்காட்டில் உள்ளடக்கியது.
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
// Function to check division validity
bool isDivisionValid(int divisor) {
return divisor != 0;
}
int main() {
int a, b;
printf("Enter two integers (a and b):\\n");
scanf("%d %d", &a, &b);
if (isDivisionValid(b)) {
printf("Safe division: %d / %d = %d\\n", a, b, a / b);
} else {
printf("Error: Division by zero is undefined behavior.\\n");
}
return 0;
}
C இல் வரையறுக்கப்படாத மற்றும் செயல்படுத்தல்-வரையறுக்கப்பட்ட நடத்தையில் ஆழமாக ஆராய்தல்
C இல் வரையறுக்கப்படாத நடத்தை பெரும்பாலும் மொழியால் வழங்கப்படும் நெகிழ்வுத்தன்மையிலிருந்து வருகிறது, இது டெவலப்பர்கள் குறைந்த-நிலை நிரலாக்கத்தை செய்ய அனுமதிக்கிறது. இருப்பினும், இந்த சுதந்திரம் கணிக்க முடியாத விளைவுகளுக்கு வழிவகுக்கும். ஒதுக்கப்பட்ட இடையகத்திற்கு வெளியே நினைவகத்தை அணுகுவது போன்ற சில செயல்பாடுகள் எவ்வாறு வரையறுக்கப்படாத நடத்தை என வகைப்படுத்தப்படுகின்றன என்பது பெரும்பாலும் கவனிக்கப்படாத ஒரு முக்கிய அம்சமாகும். இந்த செயல்பாடுகள் ஒரு சூழ்நிலையில் வேலை செய்யக்கூடும், ஆனால் கம்பைலர் மேம்படுத்தல்கள் அல்லது வன்பொருள் விவரக்குறிப்புகள் காரணமாக மற்றொன்றில் செயலிழக்கக்கூடும். இந்த கணிக்க முடியாத தன்மை ஒரு சவாலாக இருக்கலாம், குறிப்பாக பாதுகாப்பு-முக்கியமான பயன்பாடுகளில். 🔐
செயல்படுத்தல்-வரையறுக்கப்பட்ட நடத்தை, இன்னும் யூகிக்கக்கூடியதாக இருந்தாலும், பெயர்வுத்திறனுக்கான சவால்களை இன்னும் முன்வைக்கிறது. உதாரணமாக, அடிப்படை தரவு வகைகளின் அளவு அல்லது எதிர்மறை முழு எண்களில் பிட்வைஸ் செயல்பாட்டின் விளைவு கம்பைலர்களுக்கு இடையில் மாறுபடும். இந்த வேறுபாடுகள் கம்பைலர் ஆவணங்களைப் படிப்பதன் முக்கியத்துவத்தை எடுத்துக்காட்டுகின்றன மற்றும் கருவிகளைப் பயன்படுத்துகின்றன சாத்தியமான பெயர்வுத்திறன் சிக்கல்களைக் கண்டறிய. கிராஸ்-பிளாட்ஃபார்ம் இணக்கத்தன்மையை மனதில் கொண்டு குறியீட்டை எழுதுவதற்கு, சூழல் முழுவதும் தொடர்ந்து செயல்படும் C இன் துணைக்குழுவுடன் ஒட்டிக்கொள்ள வேண்டும்.
மற்றொரு தொடர்புடைய கருத்து "குறிப்பிடப்படாத நடத்தை" ஆகும், இது முந்தைய இரண்டிலிருந்து சிறிது வேறுபடுகிறது. இந்த வழக்கில், C தரநிலையானது எந்தவொரு குறிப்பிட்ட முடிவும் தேவையில்லாமல் ஏற்றுக்கொள்ளக்கூடிய பல விளைவுகளை அனுமதிக்கிறது. எடுத்துக்காட்டாக, செயல்பாட்டு வாதங்களுக்கான மதிப்பீட்டின் வரிசை குறிப்பிடப்படவில்லை. டெவலப்பர்கள் ஒரு குறிப்பிட்ட வரிசையைச் சார்ந்து எழுதும் வெளிப்பாடுகளைத் தவிர்க்க வேண்டும் என்பதே இதன் பொருள். இந்த நுணுக்கங்களைப் புரிந்துகொள்வதன் மூலம், டெவலப்பர்கள் C இன் நடத்தை வரையறைகளின் நுணுக்கங்களிலிருந்து எழும் பிழைகளைத் தவிர்த்து, மிகவும் வலுவான, யூகிக்கக்கூடிய குறியீட்டை எழுதலாம். 🚀
- C இல் வரையறுக்கப்படாத நடத்தை என்றால் என்ன?
- சில குறியீடு கட்டமைப்புகளுக்கு என்ன நடக்க வேண்டும் என்பதை C தரநிலை குறிப்பிடாதபோது வரையறுக்கப்படாத நடத்தை ஏற்படுகிறது. எடுத்துக்காட்டாக, தொடங்கப்படாத மாறியை அணுகுவது வரையறுக்கப்படாத நடத்தையைத் தூண்டுகிறது.
- செயல்படுத்தல்-வரையறுக்கப்பட்ட நடத்தை வரையறுக்கப்படாத நடத்தையிலிருந்து எவ்வாறு வேறுபடுகிறது?
- வரையறுக்கப்படாத நடத்தைக்கு வரையறுக்கப்பட்ட விளைவு இல்லை என்றாலும், எதிர்மறை முழு எண்களைப் பிரிப்பதன் விளைவாக, செயல்படுத்தல்-வரையறுக்கப்பட்ட நடத்தை கம்பைலரால் ஆவணப்படுத்தப்படுகிறது.
- வரையறுக்கப்படாத நடத்தை ஏன் தொகுக்கும் நேரப் பிழையை ஏற்படுத்தாது?
- வரையறுக்கப்படாத நடத்தை தொடரியல் சரிபார்ப்புகளை அனுப்பலாம், ஏனெனில் இது பெரும்பாலும் செல்லுபடியாகும் இலக்கண விதிகளைப் பின்பற்றுகிறது, ஆனால் இயக்க நேரத்தில் கணிக்க முடியாத விளைவுகளுக்கு வழிவகுக்கிறது.
- வரையறுக்கப்படாத நடத்தையை அடையாளம் காண உதவும் கருவிகள் என்ன?
- போன்ற கருவிகள் மற்றும் உங்கள் குறியீட்டில் வரையறுக்கப்படாத நடத்தை நிகழ்வுகளைக் கண்டறிந்து பிழைத்திருத்தம் செய்ய உதவும்.
- வரையறுக்கப்படாத நடத்தையின் அபாயங்களை டெவலப்பர்கள் எவ்வாறு குறைக்கலாம்?
- மாறிகளை துவக்குதல், சுட்டிகளைச் சரிபார்த்தல் மற்றும் குறியீட்டைப் பகுப்பாய்வு செய்வதற்கான கருவிகளைப் பயன்படுத்துவது போன்ற சிறந்த நடைமுறைகளைப் பின்பற்றுவது அபாயங்களைக் கணிசமாகக் குறைக்கும்.
வலுவான மற்றும் சிறிய C நிரல்களை எழுதுவதற்கு வரையறுக்கப்படாத மற்றும் செயல்படுத்தல்-வரையறுக்கப்பட்ட நடத்தையைப் புரிந்துகொள்வது அவசியம். வரையறுக்கப்படாத நடத்தை கணிக்க முடியாத விளைவுகளுக்கு வழிவகுக்கும், அதே நேரத்தில் செயல்படுத்தல்-வரையறுக்கப்பட்ட நடத்தை சில முன்கணிப்புகளை வழங்குகிறது ஆனால் கவனமாக ஆவணப்படுத்தல் தேவைப்படுகிறது.
UBSan போன்ற கருவிகளைப் பயன்படுத்துவதன் மூலமும், மாறிகளை துவக்குதல் மற்றும் உள்ளீடுகளைச் சரிபார்த்தல் போன்ற சிறந்த நடைமுறைகளைக் கடைப்பிடிப்பதன் மூலமும், டெவலப்பர்கள் அபாயங்களைக் குறைக்கலாம். இந்த நுணுக்கங்களைப் பற்றிய விழிப்புணர்வு பாதுகாப்பான, திறமையான மற்றும் நம்பகமான மென்பொருளை உறுதிசெய்கிறது, பயனர்கள் மற்றும் டெவலப்பர்கள் இருவருக்கும் பயனளிக்கிறது. 🌟
- சி நிரலாக்கத்தில் வரையறுக்கப்படாத மற்றும் செயல்படுத்தல்-வரையறுக்கப்பட்ட நடத்தையை விளக்குகிறது: சி மொழி நடத்தை - cppreference.com
- வரையறுக்கப்படாத நடத்தை பிழைத்திருத்தத்திற்கான விரிவான கருவிகள்: வரையறுக்கப்படாத நடத்தை சானிடைசர் (UBSan) - கணகண வென்ற சப்தம்
- கையொப்பமிடப்பட்ட முழு எண் செயல்பாடுகளில் செயல்படுத்தல்-வரையறுக்கப்பட்ட விளைவுகளின் எடுத்துக்காட்டுகளை வழங்குகிறது: சி நிரலாக்க கேள்விகள் - ஸ்டாக் ஓவர்ஃப்ளோ
- சிறிய C குறியீட்டை எழுதுவதற்கான சிறந்த நடைமுறைகள் பற்றிய நுண்ணறிவுகளை வழங்குகிறது: SEI CERT C குறியீட்டு தரநிலை