একটি দৃ strongly়ভাবে টাইপ করা ভাষা এবং একটি স্ট্যাটিকালি টাইপ করা ভাষার মধ্যে পার্থক্য কী?


440

এছাড়াও, একটি কি অন্যকে বোঝায়?



4
টিসিএল দৃ strongly়ভাবে টাইপ করা হয়। এটির কেবল স্ট্রিং রয়েছে: পি
নওফাল

21
@ নওফাল না, এটি কঠোরভাবে টাইপ করা হয়েছে;)
গিকোনট

উত্তর:


542

একটি দৃ strongly়ভাবে টাইপ করা ভাষা এবং একটি স্ট্যাটিকালি টাইপ করা ভাষার মধ্যে পার্থক্য কী?

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

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

স্ট্যাটিক বনাম গতিশীল

স্ট্যাটিকালি টাইপের বিপরীতটি হ'ল "ডায়নামিকালি টাইপড", যার অর্থ এটি

  1. রান সময় ব্যবহৃত মানগুলি ধরণে শ্রেণিবদ্ধ করা হয়।
  2. এই জাতীয় মানগুলি কীভাবে ব্যবহার করা যায় সে সম্পর্কেও বিধিনিষেধ রয়েছে।
  3. যখন এই বিধিনিষেধগুলি লঙ্ঘন করা হয়, লঙ্ঘনটি (গতিশীল) ধরণের ত্রুটি হিসাবে প্রতিবেদন করা হয়।

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

শক্তিশালী বনাম দুর্বল

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

আসলে এখানে কি চলছে?

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

  • অপেশাদাররা প্রায়শই তাদের "স্ট্যাটিক" এবং "গতিশীল" দিয়ে মিশ্রিত করে।

  • আপাতদৃষ্টিতে "দুর্বল টাইপিং" আপত্তিজনক রূপান্তরগুলির উপস্থিতি বা অনুপস্থিতি সম্পর্কে কথা বলতে কিছু লোক ব্যবহার করে।

  • পেশাদাররা শর্তাবলীর অর্থ কী তা নিয়ে একমত হতে পারে না।

  • সামগ্রিকভাবে আপনার দর্শকদের জানান বা আলোকিত করার সম্ভাবনা কম unlikely

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

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

একজন কি অন্যকে বোঝায়?

পেডেন্টিক স্তরে, না, কারণ "শক্তিশালী" শব্দের সত্যিকার অর্থে কোনও অর্থ নেই। তবে অনুশীলনে, লোকেরা প্রায়শই দুটি কাজের মধ্যে একটি করে:

  • তারা (ভুলভাবে) "স্ট্যাটিক" এবং "ডায়নামিক" বোঝাতে "শক্তিশালী" এবং "দুর্বল" ব্যবহার করে, সেক্ষেত্রে তারা (ভুলভাবে) "দৃ strongly়ভাবে টাইপড" এবং "স্ট্যাটিকালি টাইপড" ইন্টারচেঞ্জযোগ্যভাবে ব্যবহার করছে।

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

যে কোনও উপায়ে, কোনও ব্যক্তি যদি কোনও ভাষা "দৃ strongly়ভাবে টাইপড" বলে থাকেন, তবে সেই ব্যক্তি সম্ভবত একটি স্ট্যাটিক্যালি টাইপ করা ভাষা সম্পর্কে কথা বলছেন।


3
@ অ্যাডাম: আপাতত উত্থাপিত হওয়ার পক্ষে যথাযথভাবে সঠিক নয় :) ক্ল্লেটাসের উত্তরে অনেকগুলি ভুল ধারণা রয়েছে (যদিও আমি এর মধ্যে সবচেয়ে খারাপটিই সম্পাদনা করেছি), তাই আমি একটি উচ্চারণের কথায় সমস্ত কিছু বানান করতে বাধ্য হলাম ...
নরম্যান রামসে

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

2
আমি এখন খুব বিভ্রান্ত! ঠিক আছে, আখড়ার প্রিয় গ্রেড গ্ল্যাডিয়েটারস, আমার মতো দরিদ্র আত্মা কি নিম্নলিখিত সাধারণ বোঝার সাথে যেতে পারেন? 1. স্ট্যাটিক: মানগুলি সংকলনের সময় ধরণের সাথে সম্পর্কিত এবং সময় রান নয় 2। ডায়নামিক: মানগুলি রানটাইম চলাকালীন টাইপের সাথে সম্পর্কিত, সুতরাং রানটাইম চলাকালীন মানের ধরণটি পরিবর্তিত হতে পারে - তাই কাস্টিং সম্পর্কিত সমস্যাগুলি টাইপ করার ক্ষেত্রে আরও প্রবণতা রানটাইমের সময় ৩. শক্তিশালী / দুর্বল: ভুলে যাও! এগুলি প্রযুক্তিগত পদ এবং কেবল খারাপ নামকরণ নয়। এটি কোন প্রসঙ্গে কথা বলছে তার উপর নির্ভর করে। আমি কি এই সাধারণ বোঝার সাথে আমার জীবন চালিয়ে যেতে পারি? :(
সৌরভ পাতিল

"প্রদত্ত প্রকারের (বা শ্রেণি) প্রতিটি মূল্য কি সেই ধরণের কোনও কনস্ট্রাক্টরকে কল করে তৈরি করার নিশ্চয়তা পেয়েছে?" সি তে উত্তর নেই। সি-তে এই পরিস্থিতি ঘটে এমন কেউ কেউ উদাহরণ প্রদান করতে পারে? আমি মনে করি এটিতে স্ট্রোকের পয়েন্টার castালাই জড়িত?
কোরাজা

শক্তিশালী এবং দুর্বল টাইপিং: এরকম কোনও শ্রেণিবিন্যাস নেই।
রাউল

248

এটি প্রায়শই ভুল বোঝাবুঝি হয় তাই এটি পরিষ্কার করে দেওয়া যাক।

স্ট্যাটিক / ডায়নামিক টাইপিং

স্ট্যাটিক টাইপিং যেখানে টাইপটি সংযুক্ত থাকে ভেরিয়েবলের সাথে । প্রকারগুলি সংকলনের সময় পরীক্ষা করা হয়।

গতিশীল টাইপিং হ'ল টাইপটি মানটির সাথে আবদ্ধ । প্রকারগুলি রানের সময় পরীক্ষা করা হয়।

জাভাতে উদাহরণস্বরূপ:

String s = "abcd";

s"সব সময় প্রবেশ করুন" একটি হতে হবে String। তার জীবনের সময় এটি বিভিন্ন দিকে নির্দেশ করতে পারে String(যেহেতু sজাভাতে একটি উল্লেখ)। এটির একটি nullমান থাকতে পারে তবে এটি কখনই উল্লেখ করে নাInteger বাList । এটা স্থির টাইপিং।

পিএইচপি-তে:

$s = "abcd";          // $s is a string
$s = 123;             // $s is now an integer
$s = array(1, 2, 3);  // $s is now an array
$s = new DOMDocument; // $s is an instance of the DOMDocument class

এটি ডায়নামিক টাইপিং।

শক্তিশালী / দুর্বল টাইপিং

(সতর্কতা সম্পাদনা করুন!)

স্ট্রং টাইপিং এমন একটি বাক্যাংশ যা অর্থের সাথে একমত হয় না। স্থির টাইপিং ব্যতীত অন্য কিছু বোঝাতে এই শব্দটি ব্যবহার করে এমন বেশিরভাগ প্রোগ্রামাররা এটি বোঝাতে ব্যবহার করে যে এখানে একটি ধরণের শৃঙ্খলা রয়েছে যা সংকলক দ্বারা প্রয়োগ করা হয়েছে। উদাহরণস্বরূপ, সিএলইউতে একটি শক্তিশালী টাইপ সিস্টেম রয়েছে যা ক্লায়েন্ট কোডকে প্রকারটি সরবরাহকারী কনস্ট্রাক্টরগুলি ব্যবহার না করে বিমূর্ত প্রকারের মান তৈরি করতে দেয় না to সিতে কিছুটা শক্তিশালী টাইপ সিস্টেম থাকে তবে এটি একটি ডিগ্রীতে "বিপর্যস্ত" হতে পারে কারণ একটি প্রোগ্রাম সর্বদা একটি পয়েন্টার ধরণের মানটিকে অন্য পয়েন্টার ধরণের মান হিসাবে ফেলে দিতে পারে। সুতরাং উদাহরণস্বরূপ, সিতে আপনি ফিরে আসা কোনও মানটি নিতে পারেন malloc()এবং আনন্দের সাথে এটিকে নিক্ষেপ করতে পারেনFILE* এবং সংকলক আপনাকে থামানোর চেষ্টা করবে না — এমনকি আপনাকে সতর্ক করেও যে আপনি কোনও অদ্ভুত কিছু করছেন।

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

দুর্বল টাইপিং থেকে বোঝা যায় যে সংকলক একটি টাইপিং ডিসপ্লাইন প্রয়োগ করে না, বা সম্ভবত বাস্তবায়ন সহজেই বিমুখ করা যেতে পারে।

এই উত্তরের মূলটি অন্তর্নিহিত রূপান্তর (কখনও কখনও "অন্তর্ভুক্ত প্রচার" নামেও ডাকা হয়) সহ দুর্বল টাইপিংয়ের সাথে জটিল । উদাহরণস্বরূপ, জাভাতে:

String s = "abc" + 123; // "abc123";

এই কোডটি অন্তর্নিহিত প্রচারের একটি উদাহরণ: 123 সহ্য করার আগে স্পষ্টভাবে একটি স্ট্রিংয়ে রূপান্তরিত হয় "abc"। এটি যুক্তিযুক্ত হতে পারে জাভা সংকলক সেই কোডটি আবার লিখে দেয়:

String s = "abc" + new Integer(123).toString();

একটি ক্লাসিক পিএইচপি বিবেচনা করুন "সমস্যার সাথে শুরু করে":

if (strpos('abcdef', 'abc') == false) {
  // not found
}

এখানে ত্রুটিটি হ'ল strpos()ম্যাচের সূচকটি ফিরিয়ে দেয়, ০.০ হচ্ছে বুলিয়ানকে জোর করা falseহয় এবং সুতরাং শর্তটি আসলে সত্য। অন্তর্নিহিত রূপান্তর এড়ানোর ===পরিবর্তে সমাধানটি ব্যবহার করা ==

এই উদাহরণটি ব্যাখ্যা করে যে কীভাবে অন্তর্ভুক্ত রূপান্তর এবং গতিশীল টাইপিংয়ের সংমিশ্রণ প্রোগ্রামারগুলিকে বিপথগামী করতে পারে।

রুবির সাথে এর তুলনা করুন:

val = "abc" + 123

যা একটি রানটাইম ত্রুটি কারণ রুবিতে 123 অবজেক্টটি কেবল স্পষ্টভাবে রূপান্তরিত হয় না কারণ এটি কোনও +পদ্ধতিতে পাস করার ঘটনা ঘটে । রুবিতে প্রোগ্রামারকে অবশ্যই রূপান্তরটি সুস্পষ্ট করতে হবে:

val = "abc" + 123.to_s

পিএইচপি এবং রুবীর তুলনা করা এখানে একটি ভাল চিত্র। দুটিই গতিময়ভাবে টাইপ করা ভাষা তবে পিএইচপি-তে প্রচুর অন্তর্নিহিত রূপান্তর রয়েছে এবং রুবি (সম্ভবত অবাক হলেও আপনি যদি এটির সাথে পরিচিত না হন) doesn't

স্ট্যাটিক / ডায়নামিক বনাম স্ট্রং / দুর্বল

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

সুতরাং আপনার প্রশ্নের উত্তর দিতে: এটি দেখার বেশিরভাগ উপায় যা বেশিরভাগই সঠিক বলে হ'ল স্ট্যাটিক টাইপিং হ'ল সংকলন-টাইপ টাইপ সুরক্ষা এবং শক্ত টাইপিংটি রানটাইম টাইপ সুরক্ষা।

এর কারণ হ'ল স্থিতভাবে টাইপ করা ভাষায় ভেরিয়েবলগুলির একটি প্রকার থাকে যা অবশ্যই ঘোষণা করতে হবে এবং সংকলনের সময় পরীক্ষা করা যায়। একটি দৃ strongly়-টাইপিত ভাষার মান রয়েছে যা রান টাইমে টাইপ করে এবং প্রোগ্রামারটির পক্ষে গতিশীল চেক ছাড়াই টাইপ সিস্টেমটিকে বিকৃত করা কঠিন।

তবে এটি বোঝা গুরুত্বপূর্ণ যে কোনও ভাষা স্ট্যাটিক / স্ট্রং, স্ট্যাটিক / দুর্বল, ডায়নামিক / স্ট্রং বা ডায়নামিক / দুর্বল হতে পারে।


$ গুলি একটি পূর্ণসংখ্যা বা স্ট্রিং না বলার পরিবর্তে আপনি যদি বলছেন যে টাইপটি ভেরিয়েবলের সাথে নয় বরং "abcd" বা 1234 এর সাথে যুক্ত associated
শ্রীনিবাস রেড্ডি থাটিপার্থি

স্পষ্ট উদাহরণ সহ দুর্দান্ত উত্তর। যাইহোক, আমি মনে করি এটি দু'দিকী ধারণার মত শক্তিশালী / স্থির সম্পর্কে জিজ্ঞাসা করে কেন এই বিভ্রান্তির সম্পূর্ণ সমাধান করে না। উদাহরণস্বরূপ, ওপির শব্দটির "স্ট্যাটিক টাইপিং কি আইএমপিএলই শক্তিশালী টাইপ করে?" আপনার উত্তর তাদের স্বাধীনতার উপর জোর দেয়। কেন শক্তিশালী প্রায়ই স্ট্যাটিক সঙ্গে যুক্ত করা হয় শোধন করা চালিয়ে যেতে, নর্মান রামসে পূর্ববর্তী উত্তর খুবই ভালো stackoverflow.com/questions/376611/...
JasDev

1
"abc" + 123একটি রানটাইম ত্রুটি, রুবিতে একটি সংকলন ত্রুটি নয়। এটি একটি সংকলন ত্রুটি হলে রুবি স্থিরভাবে টাইপ করা হত।
sepp2k

দুর্বল টাইপিং উদাহরণগুলির উন্নতি করতে হবে (আমার উত্তর দেখুন) তবে অন্যথায় সুন্দর বিন্যাস করা।
অ্যাডাম জেন্ট

আমার মতে শক্তিশালী বনাম দুর্বল টাইপগিন এটি: শক্তিশালী: "সি" + ট্রু = রানটাইম ত্রুটি বা সংকলনের সময় ত্রুটি। দুর্বল: "সি" + ট্রু = "বি" বা "ডি" কারণ সমস্ত কিছুই কাঁচা বাইট হিসাবে বিবেচিত হয়। শক্তিশালী: সি #, রুবি, সি ++ দুর্বল: সমাবেশ, সি (অন্তর্ভুক্ত শূন্য পয়েন্টারগুলির কারণে)
জোনাথন অ্যালেন

17

উভয়ই দুটি ভিন্ন অক্ষের খুঁটি:

  • শক্তভাবে টাইপ করা বনাম। দুর্বল টাইপ করা
  • স্থিতিযুক্ত টাইপ বনাম গতিশীল টাইপ

শক্তভাবে টাইপ করা মানে, একটি স্বয়ংক্রিয়ভাবে এক থেকে অন্য ধরণের রূপান্তরিত হবে না। স্বাস্থ্যহীন টাইপ বিপরীত: পার্ল একটি স্ট্রিং মত ব্যবহার করতে পারেন "123"স্বয়ংক্রিয়ভাবে int- এ সেটিকে রূপান্তর দ্বারা, একটি সাংখ্যিক প্রেক্ষাপটে 123। পাইথনের মতো দৃ strongly়ভাবে টাইপিত ভাষা এটি করবে না।

স্ট্যাটিকালি টাইপ করা মানে, সংকলক সংকলন সময়ে প্রতিটি ভেরিয়েবলের প্রকারটি বের করে। গতিময়ভাবে টাইপ করা ভাষাগুলি রানটাইমের সময় কেবলমাত্র ভেরিয়েবলের প্রকারগুলি খুঁজে বের করে।


6
আমার দ্বিমত আছে একটি দৃ strongly়ভাবে টাইপ করা ভাষা হ'ল রান টাইমে প্রকারগুলি কী তা জানে। দুর্বলভাবে টাইপ করা ভাষা হ'ল অ্যাসেম্বলি পছন্দ করে না। আপনার উদাহরণ একটি তৃতীয় অক্ষ, "অন্তর্নির্মিত বনাম সুস্পষ্ট রূপান্তর"।
জোনাথন অ্যালেন

1
প্রকৃতপক্ষে স্বাভাবিক আমি জোনাথনকে সম্মত করি তবে আপনি যদি স্ট্যাটিক বিশ্লেষণ সম্পূর্ণ করেন এবং কাস্টিংকে অনুমতি না দেন তবে রানটাইমের সময় প্রকারটি টাইপ করার জন্য আপনার কাছে প্রকারের টাইপ থাকতে হবে না। (আমার সম্পাদিত উত্তর দেখুন)
অ্যাডাম জেন্ট

1
পাইথন একটি গতিশীল টাইপ করা এবং
দৃ a়ভাবে

13

শক্তভাবে টাইপ করা মানে ধরণের মধ্যে রূপান্তরগুলির মধ্যে বিধিনিষেধ রয়েছে। স্ট্যাটিকালি টাইপ করা মানে এই যে প্রকারগুলি গতিশীল নয় - আপনি একবার ভেরিয়েবল তৈরির পরে এটি পরিবর্তন করতে পারবেন না।


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

ববি, দুর্বলভাবে টাইপিত ভাষায় "5" == 5 টি 0x35 == 0x05 হিসাবে পঠিত। বা অন্য কথায়, সবকিছু কাঁচা বাইট হিসাবে বিবেচনা করা হয়।
জোনাথন অ্যালেন

আপনার উভয়ের সাথে আমার একমত হতে হবে না। লুয়া নিন; আপনি "5" == 5 তুলনা করতে পারেন এবং এটি মিথ্যা ফিরে আসবে, তবে "5" + 0 গিয়ে একটি দ্রুত রূপান্তর করা যেতে পারে
আরসিআইএক্স

12

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

জাভা উপরের উদাহরণটি দুর্বলতার কারণে টাইপ করা হচ্ছে

String s = "abc" + 123;

দুর্বলভাবে টাইপ করা উদাহরণ নয় কারণ এটি সত্যই করছে:

String s = "abc" + new Integer(123).toString()

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

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

ভাষার রানটাইমটি সত্যই সংজ্ঞায়িত করে যে এটি দুর্বলভাবে টাইপ করা হয়েছে কি না অন্যথায় এর সত্যই ন্যায়বিচার।

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


বি সম্ভবত আরও ভাল, যদি কিছুটা কম পরিচিত, উদাহরণস্বরূপ।
টম হাটিন -

জাভাস্ক্রিপ্টটি বরং দুর্বলভাবে টাইপ করা হয়েছে তবে খুব কম প্রকার রয়েছে বলেই আপনি সত্যিই নতুন ধরনের নির্মাণ করতে পারবেন না।
অ্যাডাম জেন্ট

10

উত্তর ইতিমধ্যে উপরে দেওয়া হয়েছে। শক্তিশালী বনাম সপ্তাহ এবং স্থির বনাম গতিশীল ধারণার মধ্যে পার্থক্য করার চেষ্টা করা।

শক্তভাবে টাইপ করা ভিএস দুর্বল টাইপ কী?

শক্তভাবে টাইপ করা: স্বয়ংক্রিয়ভাবে এক ধরণের থেকে অন্য ধরণের রূপান্তরিত হবে না

গো বা পাইথনে দৃ strongly়ভাবে টাইপ করা ভাষাগুলির মতো "2" + 8 একটি ধরণের ত্রুটি বাড়িয়ে তুলবে, কারণ তারা "টাইপ জবরদস্তি" দেয় না।

দুর্বল (lyিলে )ালাভাবে) টাইপ করা হয়েছে: স্বয়ংক্রিয়ভাবে এক ধরণের অন্যটিতে রূপান্তরিত হবে: জাভাস্ক্রিপ্ট বা পার্লের মতো দুর্বলভাবে টাইপ করা ভাষাগুলি কোনও ত্রুটি ফেলবে না এবং এই ক্ষেত্রে জাভাস্ক্রিপ্টের ফলাফল হবে '28' এবং পার্লের ফলাফল হবে 10।

পার্ল উদাহরণ:

my $a = "2" + 8;
print $a,"\n";

এটিকে মেইন.পিএল এ সংরক্ষণ করুন এবং রান করুন perl main.plএবং আপনি আউটপুট 10 পাবেন।

স্ট্যাটিক ভিএস ডায়নামিক টাইপ কী?

প্রোগ্রামিংয়ে প্রোগ্রামার স্থিতিশীল টাইপিং এবং গতিশীল টাইপিংয়ের যে বিন্দুতে ভেরিয়েবল প্রকারগুলি পরীক্ষা করা হয় তার সাথে সম্মতি দেয়। স্ট্যাটিক টাইপ করা ভাষাগুলি হ'ল সংকলন সময়ে টাইপ চেকিং করা হয়, অন্যদিকে ডায়নামিক টাইপ করা ভাষাগুলি হ'ল টাইপ চেকিং রান-টাইমে করা হয়।

  • স্থিতিশীল: রান-টাইমের আগে প্রকারগুলি পরীক্ষা করা হয়
  • গতিশীল: কার্যকর করার সময়, ফ্লাইগুলিতে প্রকার পরীক্ষা করা হয়

এর অর্থ কী?

Go এ এটি রান-টাইমের আগে টাইপ করা চেকগুলি (স্ট্যাটিক চেক)। এর অর্থ এটি কেবল সম্পাদিত কোডটি অনুবাদ এবং টাইপ-চেকগুলিই নয়, কোডটি চালানোর আগে এটি সমস্ত কোড এবং টাইপ ত্রুটির মাধ্যমে স্ক্যান করবে be উদাহরণ স্বরূপ,

package main

import "fmt"

func foo(a int) {
    if (a > 0) {
        fmt.Println("I am feeling lucky (maybe).")
    } else {
        fmt.Println("2" + 8)
    }
}

func main() {
    foo(2)
}

এই ফাইলটি মেইন.গো এ সংরক্ষণ করুন এবং এটি চালান, আপনি এর জন্য সংকলন ব্যর্থ বার্তা পাবেন।

go run main.go
# command-line-arguments
./main.go:9:25: cannot convert "2" (type untyped string) to type int
./main.go:9:25: invalid operation: "2" + 8 (mismatched types string and int)

তবে পাইথনের ক্ষেত্রে এই মামলাটি বৈধ নয়। উদাহরণস্বরূপ নিম্নলিখিত কোডের ব্লকটি প্রথম foo (2) কলের জন্য কার্যকর হবে এবং দ্বিতীয় foo (0) কলের জন্য ব্যর্থ হবে। এটি কারণ পাইথনটি গতিশীলভাবে টাইপ করা হয়, এটি কেবল এটির সম্পাদনা করে কোডটি অনুবাদ করে টাইপ-চেক করে। অন্য ব্লক foo (2) এর জন্য কখনই কার্যকর করে না, সুতরাং "2" + 8 কখনও দেখেনি এবং foo (0) কলের জন্য এটি সেই ব্লকটি কার্যকর করার চেষ্টা করবে এবং ব্যর্থ হয়েছে।

def foo(a):
    if a > 0:
        print 'I am feeling lucky.'
    else:
        print "2" + 8
foo(2)
foo(0)

আপনি নিম্নলিখিত আউটপুট দেখতে পাবেন

python main.py
I am feeling lucky.
Traceback (most recent call last):
  File "pyth.py", line 7, in <module>
    foo(0)
  File "pyth.py", line 5, in foo
    print "2" + 8
TypeError: cannot concatenate 'str' and 'int' objects

8

একটি অন্যকে বোঝায় না। কোনও ভাষা স্থিতিশীল হওয়ার জন্য টাইপ করার জন্য এর অর্থ হ'ল সংকলনের সময় সমস্ত ভেরিয়েবলের প্রকারগুলি জানা বা অনুমান করা হয়।

একটি দৃ strongly ়ভাবে টাইপ করা ভাষা আপনাকে এক প্রকারের অন্য হিসাবে ব্যবহার করতে দেয় না। সি একটি দুর্বলভাবে টাইপ করা ভাষা এবং দৃ strongly়ভাবে টাইপ করা ভাষাগুলি যা মঞ্জুরি দেয় না তার একটি উত্তম উদাহরণ। সিতে আপনি ভুল টাইপের একটি ডেটা উপাদান পাস করতে পারেন এবং এটি অভিযোগ করবে না। প্রবলভাবে টাইপ করা ভাষায় আপনি পারবেন না।


7

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

স্ট্যাটিক টাইপিংয়ের সম্ভবত সম্ভবত টাইপগুলি সংকলন সময়ে নির্ধারিত হয় (বা এটি সংকলিত ভাষার জন্য সমতুল্য) এবং প্রোগ্রামের সম্পাদনার সময় পরিবর্তন করতে পারে না।

নোট করুন যে এই শ্রেণিবিন্যাসগুলি পারস্পরিক একচেটিয়া নয়, প্রকৃতপক্ষে আমি তাদের ঘন ঘন একসাথে হওয়ার প্রত্যাশা করব। অনেক দৃ strongly়ভাবে টাইপ করা ভাষাও স্ট্যাটিকালি টাইপ করা হয়।

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

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.