টাইপ-সেফ কী?


উত্তর:


246

প্রকারের সুরক্ষাটির অর্থ হ'ল সংকলক সংকলনের সময় প্রকারকে বৈধতা দেবে এবং আপনি যদি ভেরিয়েবলের জন্য ভুল প্রকারটি নির্ধারণ করার চেষ্টা করেন তবে একটি ত্রুটি নিক্ষেপ করবে।

কয়েকটি সহজ উদাহরণ:

// Fails, Trying to put an integer in a string
String one = 1;
// Also fails.
int foo = "bar";

এটি পদ্ধতি আর্গুমেন্টগুলিতেও প্রযোজ্য, যেহেতু আপনি তাদের কাছে সুস্পষ্ট ধরণের পার করছেন:

int AddTwoNumbers(int a, int b)
{
    return a + b;
}

যদি আমি এটি ব্যবহার করে কল করার চেষ্টা করি:

int Sum = AddTwoNumbers(5, "5");

সংকলকটি একটি ত্রুটি ফেলবে, কারণ আমি একটি স্ট্রিং ("5") দিয়ে যাচ্ছি এবং এটি একটি পূর্ণসংখ্যা আশা করে।

জাভাস্ক্রিপ্টের মতো স্বচ্ছভাবে টাইপিত ভাষায় আমি নিম্নলিখিতগুলি করতে পারি:

function AddTwoNumbers(a, b)
{
    return a + b;
}

আমি যদি এটিকে ডাকি:

Sum = AddTwoNumbers(5, "5");

জাভাস্ক্রিপ্ট স্বয়ংক্রিয়ভাবে 5 টি স্ট্রিংয়ে রূপান্তর করে এবং "55" প্রদান করে। এটি স্ট্রিং কনটেনটেশনের জন্য + চিহ্ন ব্যবহার করে জাভাস্ক্রিপ্টের কারণে। এটিকে টাইপ-সচেতন করতে আপনার এমন কিছু করতে হবে:

function AddTwoNumbers(a, b)
{
    return Number(a) + Number(b);
}

বা, সম্ভবত:

function AddOnlyTwoNumbers(a, b)
{
    if (isNaN(a) || isNaN(b))
        return false;
    return Number(a) + Number(b);
}

আমি যদি এটিকে ডাকি:

Sum = AddTwoNumbers(5, " dogs");

জাভাস্ক্রিপ্ট স্বয়ংক্রিয়ভাবে 5 টি একটি স্ট্রিংয়ে রূপান্তরিত করে এবং তাদের সংযোজন করে, "5 কুকুর" ফিরিয়ে দেয়।

সমস্ত গতিশীল ভাষাগুলি জাভাস্ক্রিপ্টের মতো ক্ষমাযোগ্য নয় (আসলে একটি গতিশীল ভাষা বোঝায় না একটি শিথিল টাইপ করা ভাষা (পাইথন দেখুন)), এর মধ্যে কিছু আসলে আপনাকে অবৈধ টাইপ কাস্টিংয়ের ক্ষেত্রে রানটাইম ত্রুটি দেবে।

এটি সুবিধাজনক হওয়ার পরে এটি আপনাকে অনেকগুলি ত্রুটি উন্মুক্ত করে যা সহজেই বাদ দেওয়া যায় এবং কেবল চলমান প্রোগ্রামটি পরীক্ষা করেই চিহ্নিত করা যায়। ব্যক্তিগতভাবে, আমি আমার সংকলকটি যদি আমার ভুল করে থাকে তবে আমাকে তা বলতে পছন্দ করি।

এখন, সি # তে ফিরে ...

সি # কোভারিয়েন্স নামে পরিচিত একটি ভাষা বৈশিষ্ট্য সমর্থন করে , এর মূলত অর্থ এই যে আপনি একটি শিশু প্রকারের জন্য বেস টাইপটি প্রতিস্থাপন করতে পারেন এবং ত্রুটির কারণ নাও তৈরি করতে পারেন, উদাহরণস্বরূপ:

 public class Foo : Bar
 {
 }

এখানে, আমি একটি নতুন ক্লাস তৈরি করেছি (ফু) যা সাবক্লাস বার করে। আমি এখন একটি পদ্ধতি তৈরি করতে পারি:

 void DoSomething(Bar myBar)

এবং এটি একটি ফু বা একটি বার ব্যবহার করে আর্গুমেন্ট হিসাবে কল করুন, উভয়ই ত্রুটির কারণ না করেই কাজ করবে। এটি কাজ করে কারণ সি # জানে যে বারের কোনও শিশু শ্রেণি বারের ইন্টারফেসটি প্রয়োগ করে।

তবে আপনি বিপরীতটি করতে পারবেন না:

void DoSomething(Foo myFoo)

এই পরিস্থিতিতে আমি এই পদ্ধতিতে বারটি পাস করতে পারি না, কারণ সংকলক জানে না যে বার ফু এর ইন্টারফেস প্রয়োগ করে। এটি কারণ একটি শিশু শ্রেণি পিতামাতার শ্রেণীর চেয়ে অনেক বেশি আলাদা (এবং সাধারণত হবে)।

অবশ্যই, এখন আমি গভীর প্রান্তটি ছাড়িয়ে গিয়েছি এবং মূল প্রশ্নের ক্ষেত্র ছাড়িয়ে চলেছি, তবে এটি জানা ভাল বিষয় :)


26
আমি মনে করি যে এই উত্তরটি ভুল: সংকলনের সময় প্রকারের সুরক্ষা অগত্যা প্রয়োগ করা হয় না। আমি বুঝতে পারি যে উদাহরণস্বরূপ, স্কিমটি ধরণের সুরক্ষিত হিসাবে বিবেচিত হয় তবে গতিশীলভাবে পরীক্ষা করা হয় (টাইপ সুরক্ষা রানটাইমের সময় প্রয়োগ করা হয়)। এটি বেশিরভাগ টাইপ এবং প্রোগ্রামিং ভাষার সাথে পরিচয় করিয়ে দিচ্ছেন, বেঞ্জামিন সি পিয়ার্সের দ্বারা।
নিকোলাস রিনাডো

11
আপনি যা বর্ণনা করেন তাকে বহুত্ববাদ বলে না, প্রচলিত নয় called Covariance জেনেরিক ব্যবহার করা হয়।
ইলিডানএস 4 মনিকার

@ নিকোলাসরিনাডো নোট করুন যে গতিশীল ভাষা এবং স্ট্যাটিকের মধ্যে ব্যবধানটি "ব্যাখ্যা করা" ভাষার জন্য গতিশীল সংকলন এবং প্রাক-সংকলন দ্বারা এবং "সংকলিত" ভাষাগুলির প্রতিবিম্ব দ্বারা ক্ষয় হচ্ছে। প্রতিচ্ছবি রানটাইম হাঁসের টাইপিংয়ের মঞ্জুরি দেয়, উদাহরণস্বরূপ, তাই একটি সংকলিত ভাষা বলতে পারে "আরে, এর একটি কোয়াক () পদ্ধতি রয়েছে, আমি সেটিকে কল করব এবং দেখি কী হবে"। পাস্কাল জাতীয় ভাষায় প্রায়শই (alচ্ছিক) রানটাইম ওভারফ্লো চেকিং থাকে, যার ফলে রানটাইমের সময় এই "সংকলক" ত্রুটিগুলি ঘটে থাকে "8 বিট গন্তব্য {কোর ডাম্প into" তে সরবরাহ করা পূর্ণসংখ্যার ফিট করে না।
কোড বিদ্বেষক

2
আপনার উদাহরণটি "দৃ strongly়ভাবে টাইপড" নামক একটি ধারণার সাথে সম্পর্কিত যা টাইপ সুরক্ষার মতো নয়। প্রকার সুরক্ষা হ'ল যখন কোনও ভাষা কার্যকরকরণে টাইপ ত্রুটি সনাক্ত করতে বা সময় সংকলন করতে পারে। উদাহরণস্বরূপ পাইথন দুর্বলভাবে টাইপ করা হয়েছে এবং নিরাপদ টাইপ করুন। এই উত্তরটি পতাকাঙ্কিত হওয়া উচিত কারণ এটি খুব বিভ্রান্তিকর।
দান্তেবারবা

সাধারণভাবে ব্যাখ্যা ভাল। তবে প্রকারের সুরক্ষা জোরালোভাবে টাইপের মতো নয়
জ্ঞানচিহ্ন

57

প্রকার-সুরক্ষা স্থির / গতিশীল টাইপিং বা শক্তিশালী / দুর্বল টাইপিংয়ের সাথে বিভ্রান্ত হওয়া উচিত নয়।

একটি টাইপ-সেফ ল্যাঙ্গুয়েজ হ'ল ডেটাতে চালিত করতে পারে এমন একমাত্র অপারেশন হ'ল ডেটার ধরণ দ্বারা তাত্পর্যপূর্ণ। এটি হ'ল, যদি আপনার ডেটা টাইপ করা হয় Xএবং Xঅপারেশন সমর্থন করে না y, তবে ভাষা আপনাকে কার্যকর করতে অনুমতি দেবে না y(X)

এই সংজ্ঞাটি কখন পরীক্ষা করা হয় সে সম্পর্কে কোনও বিধি সেট করে না । এটি সংকলন সময়ে (স্ট্যাটিক টাইপিং) বা রানটাইম (ডায়নামিক টাইপিং) এ সাধারণত ব্যতিক্রমগুলির মাধ্যমে হতে পারে। এটি উভয় একটি বিট হতে পারে: কিছু স্ট্যাটিক্যালি টাইপ ভাষায় এক ধরনের থেকে অন্য ঢালাই ডেটাতে আপনি অনুমতি, এবং কাস্ট বৈধতা রানটাইম (কল্পনা করে যে আপনি একটি নিক্ষেপ করার চেষ্টা করছেন এ চেক করা আবশ্যক Objectএকটি থেকে Consumer- কম্পাইলার কোন হয়েছে এটি গ্রহণযোগ্য কিনা তা জানার উপায়)।

প্রকার-সুরক্ষা অর্থ জোরালোভাবে টাইপ করা উচিত নয়, হয় - কিছু ভাষা কুখ্যাতভাবে দুর্বলভাবে টাইপ করা হয় তবে তবুও তর্কসাপেক্ষে নিরাপদ টাইপ করা হয়। জাভাস্ক্রিপ্ট ধরুন, উদাহরণস্বরূপ: এর টাইপ সিস্টেমটি যতই দুর্বল তা ততই দুর্বল, তবে এখনও কঠোরভাবে সংজ্ঞায়িত। এটি ডেটা স্বয়ংক্রিয়ভাবে ingালাইয়ের অনুমতি দেয় (বলুন, ইনটগুলিতে স্ট্রিংগুলি) তবে ভাল সংজ্ঞায়িত নিয়মের মধ্যে রয়েছে। আমার জ্ঞানের এমন কোনও ঘটনা নেই যেখানে জাভাস্ক্রিপ্ট প্রোগ্রাম কোনও অপরিজ্ঞাত ফ্যাশনে আচরণ করবে এবং আপনি যদি যথেষ্ট চালাক (আমি নই) তবে জাভাস্ক্রিপ্ট কোডটি পড়ার পরে কী হবে তা অনুমান করতে সক্ষম হওয়া উচিত।

একটি টাইপ-অনিরাপদ প্রোগ্রামিং ভাষার উদাহরণ সি: অ্যারের সীমানার বাইরে অ্যারে মান পড়া / লেখার স্পেসিফিকেশন দ্বারা একটি অপরিজ্ঞাত আচরণ রয়েছে । কী হবে তা ভবিষ্যদ্বাণী করা অসম্ভব। সি এমন একটি ভাষা যা একটি টাইপ সিস্টেম রয়েছে তবে এটি নিরাপদ নয়।


1
টাইপ-অনিরাপদ ভাষাগুলির অন্যান্য উদাহরণগুলি কী কী? "অ্যারের সীমানার বাইরে অ্যারের মান লিখার দ্বারা কী বোঝায় তা নির্দিষ্টকরণের দ্বারা একটি অপরিজ্ঞাত আচরণ করে what তবে কী হবে তা অনুমান করা অসম্ভব"। জাভাস্ক্রিপ্টের মতো, এটি কি আবার অনির্ধারিত ঠিক ফিরে আসবে? বা সত্যিই কিছু ঘটতে পারে। আপনি এর উদাহরণ দিতে পারেন?
আরকে

1
@ অক্ষয়রাজকোর নিশ্চিত অ্যারেগুলি মেমোরি পয়েন্টার, সুতরাং সীমার বাইরে লিখে আপনি অন্য কোনও প্রোগ্রামের ডেটা ওভাররাইট করে যাচ্ছেন - যা কিছুই করতে পারে না, প্রোগ্রামটি ক্র্যাশ করতে পারে, এটি আপনার হার্ড ড্রাইভটি মুছে ফেলতে পারে - এটি অপরিবর্তিত এবং নির্ভর করে কে এই বিট মেমরিটি পড়ছে এবং কীভাবে এটি এটি প্রতিক্রিয়া জানাতে হবে।
নিকোলাস রিনাডো

@ নিকোলাস রিনাডো এটি সঠিক নয়। ভার্চুয়াল মেমরি সম্পর্কে আপনার পড়া উচিত। প্রতিটি প্রক্রিয়াটির নিজস্ব ভার্চুয়াল ঠিকানার স্থান থাকে তাই কোনও প্রক্রিয়া এইভাবে "অন্য প্রোগ্রামের ডেটা ওভাররাইট" করতে পারে না।
ইলস্টাম

আপনি সঠিক - এটি আপনার পড়া উচিত ছিল আপনার প্রোগ্রামের মেমরির অন্য একটি অংশকে ওভাররাইট করে - আমি বিশ্বাস করি, প্রোগ্রামটি নিজেই আছে?
নিকোলাস রিনাডো

@ নিকোলাসরেইনোডো প্রোগ্রামটির কোড বিভাগটি কেবল ভার্চুয়াল ঠিকানার জায়গায় ম্যাপ করা আছে। সুতরাং আপনি যদি এটিতে লেখার চেষ্টা করেন যা একটি বিভাজন ত্রুটির কারণ হতে পারে এবং আপনার প্রোগ্রামটি ক্র্যাশ হয়ে যাবে। পাশাপাশি আপনি যদি আনম্যাপড মেমোরিতে লেখার চেষ্টা করেছিলেন যা একটি পৃষ্ঠা ত্রুটি এবং আবার ক্রাশের কারণ হতে পারে। তবে, আপনি যদি দুর্ভাগ্য হন তবে আপনি কেবল প্রক্রিয়াটির স্ট্যাক বা হিপ থেকে ডেটা ওভাররাইট করতে পারেন (অন্যান্য ভেরিয়েবল বা অন্যান্য স্টাফের মতো)। সেক্ষেত্রে আপনি সম্ভবত অবিলম্বে ক্রাশ করবেন না যা আরও খারাপ কারণ আপনি পরবর্তী সময়ে (আশা করা যায়) ত্রুটিটি লক্ষ্য করবেন না!
ইলস্টাম

32

প্রকারের সুরক্ষা কেবল একটি সংকলন সময় সীমাবদ্ধতা নয়, তবে একটি রান টাইম সীমাবদ্ধতা। আমি এতক্ষণ পরেও অনুভব করি, আমরা এটিতে আরও স্পষ্টতা যোগ করতে পারি।

টাইপ সুরক্ষা সম্পর্কিত 2 টি মূল সমস্যা রয়েছে। মেমরি ** এবং ডেটা টাইপ (এটি সম্পর্কিত অপারেশন সহ)।

স্মৃতি**

একটি charচরিত্রের জন্য সাধারণত 1 বাইট বা 8 বিট প্রয়োজন (ভাষা, জাভা এবং সি # স্টোর ইউনিকোড অক্ষরের উপর নির্ভর করে যার 16 বিট লাগে)। একটি int4 বাইট, অথবা 32 বিট (সাধারণত) প্রয়োজন।

দৃশ্যরূপে:

char: |-|-|-|-|-|-|-|-|

int : |-|-|-|-|-|-|-|-| |-|-|-|-|-|-|-|-| |-|-|-|-|-|-|-|-| |-|-|-|-|-|-|-|-|

একটি প্রকার সুরক্ষিত ভাষা রান-টাইমে কোনও চরকে intোকানোর অনুমতি দেয় না (এটি কোনও ধরণের শ্রেণীর orালাই বা স্মৃতি ব্যতিক্রমের বাইরে ফেলে দেওয়া উচিত)। তবে, কোনও ধরণের অনিরাপদ ভাষায়, আপনি বিদ্যমান ডেটা মেমরির আরও 3 সংলগ্ন বাইটগুলিতে ওভাররাইট করতে পারবেন।

int >> char:

|-|-|-|-|-|-|-|-| |?|?|?|?|?|?|?|?| |?|?|?|?|?|?|?|?| |?|?|?|?|?|?|?|?|

উপরের ক্ষেত্রে, ডানদিকে 3 বাইটগুলি ওভাররাইট করা হয়েছে, সুতরাং যে মেমোরিটির কোনও পয়েন্টার (টানা 3 অক্ষর বলুন) যা অনুমানযোগ্য চর মূল্য পাওয়ার প্রত্যাশা করে এখন আবর্জনা ফেলবে। এটি undefinedআপনার প্রোগ্রামে আচরণের কারণ ঘটায় (বা আরও খারাপ, সম্ভবত অন্যান্য প্রোগ্রামগুলিতে ওএস মেমরির বরাদ্দ করে - এই দিনগুলিতে খুব কমই সম্ভাবনা রয়েছে)।

** যদিও এই প্রথম সংখ্যাটি প্রযুক্তিগতভাবে ডেটা টাইপ সম্পর্কিত নয়, নিরাপদ ভাষাগুলি এটিকে সহজাতভাবে সম্বোধন করে এবং মেমরির বরাদ্দ কীভাবে "দেখায়" তার সম্পর্কে অজানা তাদের দৃষ্টিভঙ্গি করে বিষয়টি বর্ণনা করে।

ডেটা টাইপ

আরও সূক্ষ্ম এবং প্রত্যক্ষ প্রকারের সমস্যাটি যেখানে দুটি ডেটা টাইপ একই মেমরির বরাদ্দ ব্যবহার করে। একটি স্বাক্ষরবিহীন ইন্ট বনাম কোনও int নিন। উভয় 32 বিট। (ঠিক তত সহজেই চর [৪] এবং একটি অন্তর্নিহিত হতে পারে তবে আরও সাধারণ সমস্যাটি হ'ল ইউন্ট বনাম ইনট)।

|-|-|-|-|-|-|-|-| |-|-|-|-|-|-|-|-| |-|-|-|-|-|-|-|-| |-|-|-|-|-|-|-|-|

|-|-|-|-|-|-|-|-| |-|-|-|-|-|-|-|-| |-|-|-|-|-|-|-|-| |-|-|-|-|-|-|-|-|

একটি প্রকার অনিরাপদ ভাষা প্রোগ্রামারকে 32 বিটের যথাযথ বরাদ্দ স্প্যানটিকে উল্লেখ করতে দেয়, তবে যখন স্বাক্ষরবিহীন অন্তরের মানটি কোনও int (বা বিপরীতে) এর স্পেসে পড়ে তখন আমাদের আবার undefinedআচরণ হয়। কোনও ব্যাংকিং প্রোগ্রামে এটি যে সমস্যার সৃষ্টি করতে পারে তা কল্পনা করুন:

"ডুড! আমি 30 ডলার ওভারড্রাফ্ট করেছি এবং এখন আমার $ 65,506 বাকি আছে!"

... 'অবশ্যই, ব্যাংকিং প্রোগ্রামগুলি অনেক বড় ডেটা ধরণের ব্যবহার করে। ;) হাঃ হাঃ হাঃ!

যেমন অন্যরা ইতিমধ্যে চিহ্নিত করেছে, পরের সংখ্যাটি হ'ল ধরণের গণ্যক্রমিক ক্রিয়াকলাপ। এটি ইতিমধ্যে পর্যাপ্তভাবে কভার করা হয়েছে।

গতি বনাম সুরক্ষা

বর্তমানে বেশিরভাগ প্রোগ্রামারদের সি বা সি ++ এর মতো কিছু ব্যবহার না করা হলে এ জাতীয় বিষয় নিয়ে কখনই চিন্তা করার দরকার নেই। এই উভয় ভাষাই প্রোগ্রামারদের ঝুঁকি হ্রাস করার সর্বোত্তম প্রচেষ্টা সত্ত্বেও রানার সময় (সরাসরি মেমরি রেফারেন্সিং) টাইপ সুরক্ষা সহজেই লঙ্ঘন করতে দেয়। যাইহোক, এটি সব খারাপ নয়।

এই ভাষাগুলি এত গুণে গতিযুক্ত হওয়ার একটি কারণ, রান টাইম ক্রিয়াকলাপের সময় ধরণের সামঞ্জস্যতা যাচাই করে এগুলি বোঝা হয় না, উদাহরণস্বরূপ জাভা। তারা ধরে নিয়েছে যে বিকাশকারী একটি ভাল যুক্তিযুক্ত সত্তা যারা স্ট্রিং এবং কোনও সংযোগ একসাথে যোগ করবেন না এবং এর জন্য বিকাশকারীকে গতি / দক্ষতার সাথে পুরস্কৃত করা হয়।


27

অনেক উত্তর এখানে স্ট্যাটিক-টাইপিং এবং গতিশীল-টাইপিংয়ের সাথে টাইপ-সুরক্ষার সাথে লড়াই করে। একটি গতিশীল টাইপ করা ভাষা (ছোট্ট টালকের মতো) পাশাপাশি টাইপ-সেফও হতে পারে।

একটি সংক্ষিপ্ত উত্তর: কোনও অপারেশন অপরিজ্ঞাত আচরণের দিকে পরিচালিত না করে কোনও ভাষা টাইপ-নিরাপদ হিসাবে বিবেচিত হয়। ভাষা কঠোরভাবে টাইপ করার জন্য সুস্পষ্ট ধরণের রূপান্তরগুলির প্রয়োজনীয়তা বিবেচনা করে , কারণ স্বয়ংক্রিয় রূপান্তরগুলি মাঝে মাঝে ভাল সংজ্ঞায়িত তবে অপ্রত্যাশিত / অনিচ্ছাকৃত আচরণের দিকে পরিচালিত করে।


1
অপেক্ষা করুন, আপনার টাইপ-সুরক্ষার সংজ্ঞাটিতে একটি শব্দ "টাইপ" নেই: ডি if no operation leads to undefined behavior
ভাসিলিনভিকভ

1
এছাড়াও, আমি এই জাতীয় সংজ্ঞার সাথে একমত নই। আমি মনে করি টাইপ-সুরক্ষার অর্থ হ'ল 1. প্রকারের অস্তিত্ব 2. সংকলকটির কাছে তাদের জ্ঞান এবং যথাযথ চেকগুলি।
ভাসিলিনোভিকভ

10

একটি প্রোগ্রামিং ভাষা যা 'টাইপ-সেফ' এর অর্থ নিম্নলিখিত জিনিসগুলি:

  1. আপনি অবিচ্ছিন্ন পরিবর্তনশীলগুলি থেকে পড়তে পারবেন না
  2. আপনি অ্যারেগুলি তাদের সীমা ছাড়িয়ে যেতে পারেন না
  3. আপনি চেক না করা টাইপ কাস্ট করতে পারবেন না

8

লিবারেল আর্টস মেজর থেকে একটি ব্যাখ্যা, কোনও কম্প সায়েন্স মেজর নয়:

লোকেরা যখন বলে যে কোনও ভাষা বা ভাষার বৈশিষ্ট্য প্রকারের সুরক্ষিত রয়েছে, তাদের অর্থ হল যে ভাষাটি আপনাকে রোধ করতে সহায়তা করবে, উদাহরণস্বরূপ, এমন কোনও কিছুকে পাস করা যা কোনও যুক্তির সাথে পূর্ণসংখ্যা নয় যা কোনও পূর্ণসংখ্যাকে প্রত্যাশা করে।

উদাহরণস্বরূপ, সি # তে, আমি একটি ফাংশনটিকে এই হিসাবে সংজ্ঞায়িত করি:

 void foo(int arg)

সংকলকটি তখন আমাকে এটি করতে বাধা দেবে:

  // call foo
  foo("hello world")

অন্যান্য ভাষায়, সংকলকটি আমাকে থামায় না (বা কোনও সংকলক নেই ...), সুতরাং স্ট্রিংটি যুক্তিটিতে পৌঁছে দেওয়া হবে এবং তারপরে সম্ভবত খারাপ কিছু ঘটবে।

সুরক্ষিত ভাষাগুলি টাইপ করুন "সংকলন সময়" এ আরও ধরার চেষ্টা করুন।

নীচের দিকে, নিরাপদ ভাষার সাথে টাইপ করুন, যখন আপনার "123" এর মতো স্ট্রিং থাকে এবং আপনি যখন এটি কোনও ইন্টের মতো চালনা করতে চান, তখন আপনাকে স্ট্রিংটিকে একটি ইনটে রূপান্তর করতে আরও কোড লিখতে হবে, বা যখন আপনার কোনও ইন্টার 123 এর মতো এবং এটি একটি বার্তায় ব্যবহার করতে চান, "উত্তরটি 123", আপনাকে স্ট্রিংতে রূপান্তর / কাস্ট করতে আরও কোড লিখতে হবে।


4
লিবারেল আর্টস মেজর একটি ব্যাখ্যা বলবেন :) আপনি স্ট্যাটিক টাইপিং এবং ডায়নামিক টাইপিংয়ের সাথেও বিবাদ করছেন।
ইডিডাক

1
লিবারেল আর্টস "মেজর", "মেজর" নয়।
কোরি ট্র্যাজার

5

আরও ভাল বোঝার জন্য নীচের ভিডিওটি দেখুন যা নিরাপদ ভাষা (সি #) টাইপ করে না এবং নিরাপদ ভাষা (জাভাস্ক্রিপ্ট) টাইপ করে না code

http://www.youtube.com/watch?v=Rlw_njQhkxw

দীর্ঘ পাঠের জন্য এখন।

প্রকার সুরক্ষা মানে ধরণের ত্রুটিগুলি রোধ করা। যখন টাইপ ত্রুটি ঘটে তখন এক প্রকারের ডেটা টাইপ অপ্রয়োজনীয়ভাবে অন্য ধরণের জন্য বরাদ্দ করা হয় এবং আমরা অনাকাঙ্ক্ষিত ফলাফল পাই।

উদাহরণস্বরূপ জাভাস্ক্রিপ্ট কোনও প্রকারের নিরাপদ ভাষা নয়। নীচের কোডটিতে "num" একটি সংখ্যার ভেরিয়েবল এবং "str" ​​স্ট্রিং। জাভাস্ক্রিপ্ট আমাকে "num + str" করার অনুমতি দেয়, এখন অনুগ্রহ করে এটি পাটিগণিত বা সংলগ্নতা করবে।

এখন নীচের কোডের জন্য ফলাফলগুলি "55" হয় তবে গুরুত্বপূর্ণ বিষয়টি হ'ল বিভ্রান্তিটি সৃষ্টি করে যে এটি কী ধরণের অপারেশন করবে।

এটি ঘটছে কারণ জাভাস্ক্রিপ্ট কোনও প্রকার নিরাপদ ভাষা নয়। এটি সীমাবদ্ধতা ছাড়াই অন্য ধরণের এক ধরণের ডেটা সেট করার অনুমতি দেয়।

<script>
var num = 5; // numeric
var str = "5"; // string
var z = num + str; // arthimetic or concat ????
alert(z); // displays  “55”
</script>

সি # একটি প্রকার নিরাপদ ভাষা। এটি একটি ডেটা টাইপকে অন্য ডেটা টাইপের জন্য বরাদ্দ করার অনুমতি দেয় না। নীচের কোডটি বিভিন্ন ডেটা ধরণের "+" অপারেটরের অনুমতি দেয় না।

এখানে চিত্র বর্ণনা লিখুন


4

প্রকার-সুরক্ষার অর্থ প্রোগ্রামিয়ালি, কোনও চলক, ফেরতের মান, বা যুক্তির জন্য ডেটা ধরণের একটি নির্দিষ্ট মানদণ্ডের মধ্যে মাপসই করা আবশ্যক।

অনুশীলনে, এর অর্থ হ'ল 7 (একটি পূর্ণসংখ্যা টাইপ) "7" (স্ট্রিং টাইপের একটি উদ্ধৃত চরিত্র) থেকে পৃথক।

পিএইচপি, জাভাস্ক্রিপ্ট এবং অন্যান্য গতিশীল স্ক্রিপ্টিং ভাষাগুলি সাধারণত দুর্বলভাবে টাইপ করা হয়, আপনি "7" + 3 যুক্ত করার চেষ্টা করলে তারা একটি (স্ট্রিং) "7" কে একটি (পূর্ণসংখ্যার) 7 তে রূপান্তরিত করবে, যদিও মাঝে মাঝে আপনাকে এটি করতে হয় স্পষ্টতই (এবং জাভাস্ক্রিপ্ট সংমিশ্রনের জন্য "+" অক্ষর ব্যবহার করে)।

সি / সি ++ / জাভা এটি বুঝতে পারে না, বা ফলাফলটিকে "73" এর পরিবর্তে যুক্ত করবে। প্রকারের সুরক্ষা প্রকারের প্রয়োজনীয়তাটিকে স্পষ্ট করে কোডগুলিতে এই ধরণের বাগগুলি প্রতিরোধ করে।

প্রকার সুরক্ষা খুব দরকারী। উপরের "7" + 3 এর সমাধানটি কাস্ট (টাইপ) "7" + 3 (সমান 10) টাইপ করা হবে।


3

ধারনা:

অর্থগুলির মতো খুব সাধারণ টাইপ নিরাপদ হতে, এটি নিশ্চিত করে যে ভেরিয়েবলের ধরণটি নিরাপদ হওয়া উচিত

  1. কোনও ভুল ডেটা টাইপ যেমন পূর্ণসংখ্যার সাথে স্ট্রিং টাইপের একটি পরিবর্তনশীল সংরক্ষণ বা আরম্ভ করতে পারে না
  2. সীমাবদ্ধ সূচকগুলি অ্যাক্সেসযোগ্য নয়
  3. শুধুমাত্র নির্দিষ্ট মেমরি অবস্থানের অনুমতি দিন

সুতরাং ভেরিয়েবলের ক্ষেত্রে এটি আপনার স্টোরেজের প্রকারের সুরক্ষা সম্পর্কে।


2

এই ব্যাখ্যাটি চেষ্টা করে দেখুন ...

টাইপসেফের অর্থ হ'ল সংকলনের সময় ভেরিয়েবলগুলি যথাযথ অ্যাসাইনমেন্টের জন্য স্থিরভাবে পরীক্ষা করা হয়। উদাহরণস্বরূপ, একটি স্ট্রিং বা একটি পূর্ণসংখ্যার ধারক। এই দুটি ভিন্ন ডেটা ধরণের ক্রস-অ্যাসাইনড করা যাবে না (যেমন, আপনি কোনও স্ট্রিংয়ের জন্য একটি পূর্ণসংখ্যাকে বরাদ্দ করতে পারবেন না বা আপনি কোনও পূর্ণসংখ্যার সাথে একটি স্ট্রিংও বরাদ্দ করতে পারবেন না)।

নন-টাইপসেফ আচরণের জন্য, এটি বিবেচনা করুন:

object x = 89;
int y;

যদি আপনি এটি করার চেষ্টা করেন:

y = x;

সংকলকটি একটি ত্রুটি নিক্ষেপ করে যা বলে যে এটি একটি সিস্টেমকে রূপান্তর করতে পারে না b অবজেক্টটিকে একটি পূর্ণসংখ্যায় পরিণত করে। আপনার এটি স্পষ্টভাবে করা দরকার। একটি উপায় হবে:

y = Convert.ToInt32( x );

উপরের অ্যাসাইনমেন্টটি টাইপসেফ নয়। একটি টাইপসেফ অ্যাসিগমেন্টমেন্ট যেখানে প্রকারগুলি একে অপরকে সরাসরি বরাদ্দ করা যায়।

এএসপি.এনইটি-তে নন প্রকারের সংরক্ষণাগার সংগ্রহ প্রচুর পরিমাণে রয়েছে (যেমন, অ্যাপ্লিকেশন, সেশন এবং ভিউস্টেট সংগ্রহ)। এই সংগ্রহগুলি সম্পর্কে সুসংবাদটি হ'ল (একাধিক সার্ভারের রাজ্য পরিচালনার বিবেচনাকে হ্রাস করা) আপনি তিনটি সংগ্রহের যে কোনও একটিতে কোনও প্রকারের ডেটা টাইপ করতে পারেন। খারাপ খবর: কারণ এই সংগ্রহগুলি টাইপসেফ নয়, আপনি যখন এগুলি ফিরিয়ে আনবেন তখন আপনাকে যথাযথভাবে মানগুলি কাস্ট করতে হবে।

উদাহরণ স্বরূপ:

Session[ "x" ] = 34;

ঠিকভাবে কাজ করে. তবে পূর্ণসংখ্যার মানটি পুনরায় বরাদ্দ করতে আপনার প্রয়োজন:

int i = Convert.ToInt32( Session[ "x" ] );

জেনেরিকগুলি সম্পর্কে যে পদ্ধতিগুলি আপনাকে সহজেই টাইপসেফ সংগ্রহগুলি কার্যকর করতে সহায়তা করে সে সম্পর্কে পড়ুন।

সি # একটি প্রকারভেদ ভাষা তবে সি # 4.0 সম্পর্কে নিবন্ধগুলির জন্য দেখুন; আকর্ষণীয় গতিশীল সম্ভাবনা তাঁত (এটি কি ভাল জিনিস যে সি # অবশ্যই অপশন কঠোরভাবে বন্ধ করছে: বন্ধ ... আমরা দেখব)।


ব্যক্তিগতভাবে, আমি কনভার্টকে ঘৃণা করি T স্বরলিপিটি দেওয়ার জন্য, আপনি কেবল নিরাপদ কাস্ট ব্যবহার করেন না কেন? কলস্ট্যাকে এটি কেবলমাত্র কম ফাংশন কল।
ফ্লাইওয়াত

2

প্রকার-নিরাপদ এমন এক কোড যা কেবল অ্যাক্সেসের জন্য অনুমোদিত মেমরির অবস্থানগুলিতে অ্যাক্সেস করে এবং কেবলমাত্র সংজ্ঞায়িত, অনুমতিযোগ্য উপায়ে। প্রকার-সুরক্ষিত কোড কোনও বস্তুর অপারেশন করতে পারে না যা সেই বস্তুর পক্ষে অবৈধ। সি # এবং ভিবি.এনইটি ভাষা সংকলকরা সর্বদা টাইপ-নিরাপদ কোড তৈরি করে, যা জেআইটি সংকলনের সময় টাইপ-নিরাপদ হওয়ার জন্য যাচাই করা হয়।


আপনি কি স্মৃতি সুরক্ষা বোঝাতে চান?
গোলাপট

1

প্রকার-নিরাপদ মানে একটি প্রোগ্রামের ভেরিয়েবলের জন্য নির্ধারিত মানগুলির সেটটি অবশ্যই সংজ্ঞায়িত এবং পরীক্ষার যোগ্য মানদণ্ডে মাপসই হয়। প্রকার-নিরাপদ ভেরিয়েবলগুলি আরও শক্তিশালী প্রোগ্রামগুলিতে নেতৃত্ব দেয় কারণ ভেরিয়েবলগুলি ম্যানিপুলেট করে এমন অ্যালগরিদমগুলি বিশ্বাস করতে পারে যে ভেরিয়েবলটি কেবলমাত্র মানগুলির একটি সংজ্ঞায়িত সেটগুলির মধ্যে একটি গ্রহণ করবে। এই বিশ্বাস রাখা ডেটা এবং প্রোগ্রামের অখণ্ডতা এবং গুণমান নিশ্চিত করে।

অনেকগুলি ভেরিয়েবলের জন্য, ভ্যারিয়েবলের জন্য নির্ধারিত মানগুলির সেটটি প্রোগ্রামটি লেখার সময় সংজ্ঞায়িত করা হয়। উদাহরণস্বরূপ, "রঙ" নামক একটি ভেরিয়েবলকে "লাল", "সবুজ", বা "নীল" এবং অন্য কোনও মান কখনও গ্রহণ করতে দেওয়া হতে পারে। অন্যান্য ভেরিয়েবলের ক্ষেত্রে সেই মানদণ্ড রান-টাইমে পরিবর্তিত হতে পারে। উদাহরণস্বরূপ, "রঙ" নামক একটি ভেরিয়েবল কেবলমাত্র একটি "রঙ" টেবিলের "নাম" কলামের একটি সম্পর্কযুক্ত ডাটাবেসে মান গ্রহণের অনুমতি দেওয়া যেতে পারে, যেখানে "লাল," সবুজ "এবং" নীল "তিনটি মান রয়েছে "রঙ" টেবিলের "নাম" এর জন্য, তবে কম্পিউটার প্রোগ্রামের অন্য কোনও অংশ প্রোগ্রামটি চলাকালীন সেই তালিকায় যুক্ত করতে সক্ষম হতে পারে, এবং রঙগুলি সারণীতে যুক্ত হওয়ার পরে ভেরিয়েবল নতুন মানগুলি গ্রহণ করতে পারে ।

অনেক প্রকার-সুরক্ষিত ভাষা ভেরিয়েবলের জন্য কঠোরভাবে সংজ্ঞা দেওয়ার জন্য এবং কেবল একটি ভেরিয়েবলকে একই "প্রকার" এর মান নির্ধারণের অনুমতি দিয়ে "টাইপ-সুরক্ষা" এর মায়াজাল দেয়। এই পদ্ধতির সাথে বেশ কয়েকটি সমস্যা রয়েছে। উদাহরণস্বরূপ, কোনও প্রোগ্রামে একটি পরিবর্তনশীল "YearOfBirth" থাকতে পারে যা সেই বছর যে কোনও ব্যক্তি জন্মগ্রহণ করেছিলেন এবং এটি একটি সংক্ষিপ্ত পূর্ণসংখ্যার হিসাবে টাইপ-কাস্ট করতে প্ররোচিত হয়। তবে এটি সংক্ষিপ্ত পূর্ণসংখ্যার নয়। এই বছর, এটি এমন একটি সংখ্যা যা 2009 এর চেয়ে কম এবং -10000 এর চেয়ে বেশি। যাইহোক, প্রোগ্রামটি চালানোর সাথে সাথে এই সেটটি প্রতি বছর 1 দ্বারা বৃদ্ধি পায়। এটিকে একটি "শর্ট ইনট" তৈরি করা পর্যাপ্ত নয়। এই পরিবর্তনশীল টাইপ-নিরাপদ করতে যা প্রয়োজন তা একটি রান-টাইম বৈধতা ফাংশন যা নিশ্চিত করে যে সংখ্যাটি সর্বদা -10000 এর চেয়ে বেশি এবং পরের ক্যালেন্ডারের বছরের তুলনায় কম।

পার্ল, পাইথন, রুবি, এসকিউএলাইট এবং লুয়ার মতো ডাইনামিক টাইপিং (বা হাঁস-টাইপিং, বা ম্যানিফেস্ট টাইপিং) ব্যবহার করা ভাষাগুলিতে টাইপড ভেরিয়েবলের ধারণা নেই। এটি প্রোগ্রামারকে প্রতিটি পরিবর্তনশীলের জন্য এটি সঠিক কিনা তা নিশ্চিত করতে বা অব্যক্ত রান-টাইম ব্যতিক্রমগুলির পরিণতি সহ্য করার জন্য একটি রান-টাইম বৈধতা রচনা লিখতে বাধ্য করে। আমার অভিজ্ঞতায়, সি, সি ++, জাভা এবং সি # এর মতো স্ট্যাটিকালি টাইপ করা ভাষায় প্রোগ্রামাররা প্রায়শই এই ভেবে উদ্রেক হয়ে থাকে যে প্রকার-সুরক্ষার সুবিধার্থে স্ট্যাটিকালি সংজ্ঞায়িত প্রকারগুলি তাদের যা করতে হবে তা কেবল। এটি অনেকগুলি দরকারী কম্পিউটার প্রোগ্রামগুলির জন্য সহজভাবে সত্য নয় এবং এটি কোনও নির্দিষ্ট কম্পিউটার প্রোগ্রামের ক্ষেত্রে সত্য কিনা তা অনুমান করা শক্ত।

দীর্ঘ এবং সংক্ষিপ্ত .... আপনি কি টাইপ-সুরক্ষা চান? যদি তা হয়, তবে কোনও চলককে যখন কোনও মান নির্ধারিত হয় তা নিশ্চিত করার জন্য রান-টাইম ফাংশনগুলি লিখুন, এটি ভাল-সংজ্ঞায়িত মানদণ্ডের সাথে সঙ্গতি রাখে। ডাউন-সাইডটি হ'ল এটি বেশিরভাগ কম্পিউটার প্রোগ্রামগুলির জন্য ডোমেন বিশ্লেষণকে সত্যই কঠিন করে তোলে কারণ আপনাকে প্রতিটি প্রোগ্রামের ভেরিয়েবলের মানদণ্ড স্পষ্টভাবে সংজ্ঞায়িত করতে হয়।


2
পাইথন ভেরিয়েবলগুলি টাইপ করা হয় ( প্রকৃতপক্ষে দৃ strongly ়ভাবে টাইপ করা হয়)। এটি করার চেষ্টা করুন, উদাহরণস্বরূপ: "str" ​​+ 1. আপনি একটি ত্রুটি পাবেন। যাইহোক, প্রকারগুলি সময় সংকলনের পরিবর্তে রানটাইমের সময় পরীক্ষা করা হয়।
মিপাদি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.