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


178

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

উদাহরণস্বরূপ, টাইপিং নামক এই নিবন্ধে : শক্তিশালী বনাম দুর্বল, স্ট্যাটিক বনাম ডায়নামিক বলেছেন যে পাইথন দৃ strongly়ভাবে টাইপ করা হয়েছে কারণ আপনি যদি চেষ্টা করেন তবে একটি ব্যতিক্রম পাবেন:

পাইথন

1 + "1"
Traceback (most recent call last):
File "", line 1, in ? 
TypeError: unsupported operand type(s) for +: 'int' and 'str'

তবে জাভা এবং সি # তে এ জাতীয় জিনিস সম্ভব এবং আমরা কেবল সে জন্য তাদের দুর্বলভাবে টাইপ করা বিবেচনা করি না।

জাভা

  int a = 10;
  String b = "b";
  String result = a + b;
  System.out.println(result);

সি শার্প

int a = 10;
string b = "b";
string c = a + b;
Console.WriteLine(c);

Weakly Type Languages নামে এই আরও একটি নিবন্ধে লেখক বলেছেন যে পার্ল দুর্বলভাবে টাইপ করা হয়েছে কারণ আমি কোনও সংখ্যায় একটি স্ট্রিং যুক্ত করতে পারি এবং কোনও স্পষ্ট রূপান্তর ছাড়াই বিপরীতমুখী করতে পারি।

পার্ল

$a=10;
$b="a";
$c=$a.$b;
print $c; #10a

সুতরাং একই উদাহরণ পার্লকে দুর্বলভাবে টাইপ করে তবে জাভা এবং সি # নয়?

জি, এই বিভ্রান্তিকর এখানে চিত্র বর্ণনা লিখুন

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

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

আমি বিশ্বাস করতে আগ্রহী, যদিও, এই ব্যাখ্যাটির ক্ষেত্রে আমার অবশ্যই ভুল হতে হবে, কেন বা কীভাবে এটি ব্যাখ্যা করতে হবে তা আমি জানি না।

সুতরাং, আমার প্রশ্নগুলি হ'ল:

  • কোনও ভাষার সত্যিকার অর্থে দুর্বলভাবে টাইপ করা মানে কী?
  • আপনি দুর্বলভাবে টাইপ করার কোনও ভাল উদাহরণ উল্লেখ করতে পারেন যা ভাষার দ্বারা স্বয়ংক্রিয় রূপান্তর / স্বয়ংক্রিয় জবরদস্তির সাথে সম্পর্কিত নয়?
  • কোনও ভাষা কি একই সাথে দুর্বলভাবে টাইপ করা যেতে পারে এবং দৃ strongly়ভাবে টাইপ করা যায়?

8
শক্তিশালী বনাম দুর্বল টাইপিং হ'ল টাইপ রূপান্তর সম্পর্কে (এটি আর কী হতে পারে?) আপনি যদি "খুব" দুর্বল ভাষার উদাহরণ চান তবে এটি দেখুন: ডেনটলসওটওয়্যারটি / টালকস / ওয়াট
ওয়াইল্ডক

2
@ উইল্ডডাক্ক সমস্ত ভাষা টাইপ রূপান্তর সরবরাহ করে তবে এগুলি সবই দুর্বলভাবে টাইপ করা বিবেচনা করা হয় না। নীচে দেখানো আমার উদাহরণগুলি প্রমাণ করে যে প্রোগ্রামাররা কীভাবে দৃ language়ভাবে টাইপ করা বিবেচিত অন্যান্য ভাষায় সম্ভব সেই একই উদাহরণগুলির উপর ভিত্তি করে কোনও ভাষা দুর্বলভাবে টাইপ করা বিবেচনা করে। যেমন আমার প্রশ্ন এখনও বিরাজ করে। পার্থক্য কি?
এডউইন ডালোরজো

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

3
আমি বিশ্বাস করি এটি সফ্টওয়্যার ইঞ্জিনিয়ারিংয়ের পক্ষে আরও উপযুক্ত ।
zzzzBov

4
@ ব্রেন্ডন একটি ভাসা এবং পূর্ণসংখ্যার যোগফল সম্পর্কে কী? পাইথনে কি পূর্ণসংখ্যাটি ভাসতে বাধ্য হয় না? আপনি কি এখন বলবেন যে পাইথন পুরোপুরি শক্তভাবে টাইপ করা হয়নি?
এডউইন ডালোরজো

উত্তর:


210

আপডেট: 15 ই অক্টোবর, 2012 এ এই প্রশ্নটি আমার ব্লগের বিষয় ছিল the দুর্দান্ত প্রশ্নের জন্য ধন্যবাদ!


কোনও ভাষা "দুর্বলভাবে টাইপ করা" এর অর্থ কী?

এর অর্থ "এই ভাষাটি এমন টাইপ সিস্টেম ব্যবহার করে যা আমি বিরক্তিকর বলে মনে করি"। বৈকল্পিকভাবে একটি "দৃ typ়ভাবে টাইপ করা" ভাষা হ'ল একটি টাইপ সিস্টেমের একটি ভাষা যা আমি আনন্দদায়ক বলে মনে করি।

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

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

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

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

আসলেই এটি কোনটি? এটা বলা অসম্ভব; এটি স্পিকারের দৃষ্টিভঙ্গি এবং বিভিন্ন ভাষার বৈশিষ্ট্যগুলির প্রতি তাদের মনোভাবের উপর নির্ভর করে।


14
@ এডালোরজো: (১) ধরণের তত্ত্বের কোন দিকগুলি প্রাসঙ্গিক এবং কোনটি অপ্রাসঙ্গিক সে সম্পর্কে স্বাদ এবং ব্যক্তিগত মতামতের উপর ভিত্তি করে এবং (২) কোন ভাষার প্রয়োগ কেবল বা কেবল ধরণের নিষেধাজ্ঞার জন্য উত্সাহিত করার প্রয়োজন কিনা তা নিয়ে । যেমন আমি উল্লেখ করেছি, কেউ যুক্তিযুক্তভাবে বলতে পারে যে সি # টি দৃ strongly়ভাবে টাইপ করা হয়েছে কারণ এটি স্ট্যাটিক টাইপিংকে অনুমতি দেয় এবং উত্সাহ দেয় এবং কেউ ঠিক যুক্তিযুক্তভাবে বলতে পারে যে এটি দুর্বলভাবে টাইপ করা হয়েছে কারণ এটি সম্ভাব্যতাটিকে প্রকারের সুরক্ষা লঙ্ঘনের অনুমতি দেয়
এরিক লিপার্ট

4
@ এডালোরজো: আবার সমাবেশের ক্ষেত্রে এটি মতের বিষয়। একটি সংসদীয় ভাষা সংকলক আপনাকে 32 বিট রেজিস্টারে স্ট্যাক থেকে 64 বিট ডাবল স্থানান্তর করতে অনুমতি দেবে না; এটি আপনাকে 32 বিট পয়েন্টারটিকে স্ট্যাক থেকে 32 বিট রেজিস্টারে একটি 64 বিট ডাবলকে সরানোর অনুমতি দেবে। সেই অর্থে ভাষাটি "টাইপসেফ" - এটি তথ্যের ধরণের শ্রেণিবিন্যাসের ভিত্তিতে প্রোগ্রামটির বৈধতার উপর একটি বিধিনিষেধ আরোপ করে। সেই বিধিনিষেধটি "শক্তিশালী" বা "দুর্বল" তা মতামতের বিষয়, তবে এটি স্পষ্টভাবে একটি বিধিনিষেধ।
এরিক লিপার্ট

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

7
@edalorzo: সঠিক। উদাহরণস্বরূপ, টাইপযুক্ত ল্যাম্বডা ক্যালকুলাস আপনি যতটা পেতে পারেন তত দুর্বল টাইপ করা হয়েছে। প্রতিটি ফাংশন একটি ফাংশন থেকে শুরু করে একটি ফাংশন; কোনও ডেটা কোনও নিষেধাজ্ঞা ছাড়াই যে কোনও কার্যক্রমে প্রেরণ করা যায় কারণ সবকিছু "একই ধরণের" এর। টাইপযুক্ত ল্যাম্বদা ক্যালকুলাসে একটি অভিব্যক্তির বৈধতা কেবল তার সিনট্যাকটিক ফর্মের উপর নির্ভর করে, কোনও শব্দার্থবিজ্ঞানের বিশ্লেষণের উপর নয় যা কিছু নির্দিষ্ট ধরণের বৈশিষ্ট্য হিসাবে নির্দিষ্ট অভিব্যক্তিগুলিকে শ্রেণিবদ্ধ করে।
এরিক লিপার্ট

3
@ মার্ক আমি তাকে এই বিষয়ে আরও বিভিন্ন ব্যাখ্যা প্রদান করার পূর্বে ভবিষ্যদ্বাণী করার জন্য তাকে আরও একটি +1 দেব। এই "দুর্বলভাবে টাইপ করা" একটি "পৌরাণিক ধারণা" বা "শহুরে কিংবদন্তি" বলে মনে হচ্ছে, প্রত্যেকেই এটি প্রত্যক্ষ করেছে, তবে কেউই এটি বিদ্যমান বলে প্রমাণ করতে পারে না :-)
এডউইন ডালোরজো

64

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

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

$foo = "123" + "456";           # $foo = 579
$bar = substr($foo, 2, 1);      # $bar = 9
$bar .= " lives";               # $bar = "9 lives"
$foo -= $bar;                   # $foo = 579 - 9 = 570

অবশ্যই, আপনি যেমনটি সঠিকভাবে নোট করেছেন, এগুলি সবগুলি কেবল জোর করে টাইপ করা হিসাবে দেখা যায়। তবে মুল বক্তব্যটি হ'ল পার্লে, প্রকারগুলি সর্বদা জোর করে। প্রকৃতপক্ষে, কোনও ব্যবহারকারীর পক্ষে কোনও ভেরিয়েবলের অভ্যন্তরীণ "প্রকার" কী হতে পারে তা বলা খুব শক্ত: উপরের আমার উদাহরণে লাইন 2 এ, এটি জিজ্ঞাসা করছে যে $barস্ট্রিংয়ের মানটি "9"নাকি সংখ্যাটি 9বেশ অর্থহীন, যেহেতু যতটা পার্ল সম্পর্কিত, সেগুলি একই জিনিস । প্রকৃতপক্ষে, পার্ল স্কেলারের পক্ষে অভ্যন্তরীণভাবে একই সাথে একটি স্ট্রিং এবং একটি সংখ্যাসূচক মান উভয়ই থাকা সম্ভব , যেমন $fooউপরের লাইন 2 এর পরে ক্ষেত্রে ।

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

সুতরাং, উদাহরণস্বরূপ, পার্লের একটি সংখ্যাসূচক সংযোজন অপারেটর ( +) এবং একটি স্ট্রিং কন্ডেশনেট অপারেটর ( .) উভয়ই রয়েছে এবং এটির প্রয়োজন : যেমন আপনি উপরে দেখেছেন, স্ট্রিংগুলি যুক্ত করতে ( "1" + "2" == "3") বা সংখ্যার সংমিশ্রণ ( ) সংযোগ করা পুরোপুরি ঠিক আছে 1 . 2 == 12। একইভাবে, সাংখ্যিক তুলনা অপারেটরদের ==, !=, <, >, <=, >=এবং <=>তাদের আর্গুমেন্ট সাংখ্যিক মান তুলনা, যখন স্ট্রিং তুলনা অপারেটরদের eq, ne, lt, gt, le, geএবং cmpতাদের lexicographically তুলনা স্ট্রিং হিসেবে। সুতরাং 2 < 10, তবে 2 gt 10(তবে "02" lt 10, যখন "02" == 2) (মনে রাখবেন, জাভা স্ক্রিপ্টের মতো কিছু অন্যান্য ভাষাও পার্লের মতো দুর্বল টাইপ করার সময় সমন্বিত করার চেষ্টা করুন)এছাড়াও অপারেটর ওভারলোডিং করছেন। এটি প্রায়শই কদর্যতা বাড়ে, যেমন সাহসিকতার ক্ষতি হ'ল +)

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

সকল বলেন যে, এক তর্ক হতে পারে পার্ল যে করে শক্তিশালী ধরনের আছে; এগুলি কেবল আপনি যে ধরণের আশা করতে পারেন তা নয়। বিশেষত, উপরে আলোচনা করা "স্কেলার" প্রকারের পাশাপাশি পার্লের দুটি কাঠামোগত প্রকারও রয়েছে: "অ্যারে" এবং "হ্যাশ"। এরাই খুব বিন্দু যেখানে পার্ল ভেরিয়েবল বিভিন্ন আছে scalars থেকে স্বতন্ত্র, sigils (তাদের টাইপ ইঙ্গিত $, scalars জন্য @, অ্যারে জন্য %হ্যাশ জন্য) 1 । সেখানে হয় , যাতে করে আপনি এই ধরনের মধ্যে বলপ্রয়োগ নিয়ম করতে যেমন লিখতে %foo = @bar, কিন্তু তাদের অনেক বেশ লজি হয়: যেমন, $foo = @barনির্ধারণ দৈর্ঘ্য অ্যারের @barকরতে$fooএটির বিষয়বস্তু নয়। (এছাড়াও, আরও কয়েকটি অদ্ভুত ধরণের রয়েছে যেমন টাইপব্লাবস এবং আই / ও হ্যান্ডলগুলি, আপনি প্রায়শই উন্মুক্ত দেখেন না))

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


1 বাস্তবিক, sigil উল্লেখ করে মানের প্রকার অ্যাক্সেস করা, যাতে উদাঃ অ্যারের মধ্যে প্রথম স্কালে @fooবোঝানো হয় $foo[0]। আরও তথ্যের জন্য পারফেলাক 4 দেখুন ।

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


19

এরিক যা বলেছে তা ছাড়াও নিম্নলিখিত সি কোডটি বিবেচনা করুন:

void f(void* x);

f(42);
f("hello");

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

তবুও রানটাইম এখনও টাইপ পরীক্ষা করে দেখবে! যদি কাস্টটি অবৈধ হয়, রানটাইম সিস্টেম এটি ধরবে এবং একটি ব্যতিক্রম ছুঁড়ে দেবে।

টাইপ ইরেজরের সাথে, এটি ঘটে না - প্রকারের তথ্য ফেলে দেওয়া হয়। void*সি তে একটি কাস্ট ঠিক এটি করে। এই ক্ষেত্রে, উপরোক্ত সি # পদ্ধতি ঘোষণার থেকে মূলত পৃথক void f(Object x)

(প্রযুক্তিগতভাবে, সি # অনিরাপদ কোড বা মার্শালিংয়ের মাধ্যমে মুছার ধরণের অনুমতি দেয় allows)

এটি যতটা দুর্বল টাইপ হয় ততই পায়। অন্য সব কিছুর স্ট্যাটিক বনাম গতিশীল ধরনের পরীক্ষা করা সময় অর্থাত শুধু একটি ব্যাপার যখন একটি টাইপ পরীক্ষা করা হয়।


1
+1 ভাল পয়েন্ট, আপনি এখন আমাকে এমন বৈশিষ্ট্য হিসাবে মুছে ফেলার কথা ভাবিয়ে তুলেছেন যা "দুর্বলতা-টাইপডনেস" বোঝাতে পারে। জাভাতেও টাইপ ইরেজোর রয়েছে এবং রানটাইম এ টাইপ সিস্টেম আপনাকে এমন প্রতিবন্ধকতাগুলি লঙ্ঘন করতে দেয় যা সংকলক কখনও অনুমোদন করে না। সি উদাহরণটি পয়েন্টটি বর্ণনা করার জন্য দুর্দান্ত।
এডউইন ডালোরজো

1
সম্মত, পেঁয়াজের স্তর বা নরক রয়েছে। এগুলি টাইপ দুর্বলতার আরও উল্লেখযোগ্য সংজ্ঞা বলে মনে হয়।
জোডরেল

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

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

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

14

স্ট্রং টাইপিংয়ের উইকিপিডিয়া নিবন্ধ থেকে একটি নিখুঁত উদাহরণ এসেছে :

সাধারণত শক্তিশালী টাইপিং থেকে বোঝা যায় যে প্রোগ্রামিং ভাষার সংঘটিত হওয়ার অনুমতিপ্রাপ্ত ইন্টারমিক্সিংয়ের উপর কঠোর বিধিনিষেধ রয়েছে।

দুর্বল টাইপিং

a = 2
b = "2"

concatenate(a, b) # returns "22"
add(a, b) # returns 4

শক্ত টাইপিং

a = 2
b = "2"

concatenate(a, b) # Type Error
add(a, b) # Type Error
concatenate(str(a), b) #Returns "22"
add(a, int(b)) # Returns 4

লক্ষ্য করুন যে একটি দুর্বল টাইপিং ভাষা ত্রুটি ছাড়াই বিভিন্ন ধরণের সংযোগ করতে পারে। একটি শক্তিশালী প্রকারের ভাষার জন্য ইনপুট ধরণের প্রত্যাশিত প্রকারগুলি হওয়া দরকার। শক্তিশালী প্রকারের ভাষায় একটি প্রকার রূপান্তর করা যেতে পারে ( str(a)একটি পূর্ণসংখ্যাকে একটি স্ট্রিংয়ে রূপান্তর করে) বা (ালাই ( int(b))।

এটি সমস্ত টাইপিংয়ের ব্যাখ্যার উপর নির্ভর করে।


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

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

4

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

একটি তাত্ত্বিক দিক থেকে, আমি মনে করি লুকা কার্ডেলি এবং পিটার ওয়েগনারের প্রবন্ধটি বোঝার জন্য প্রকারভেদ, ডেটা অ্যাবস্ট্রাকশন এবং পলিমারফিজমের নামটি পড়েছি best

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

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

নিবন্ধ অবিরত ...

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

যেমন, শক্তিশালী টাইপিংয়ের অর্থ টাইপ ত্রুটির অনুপস্থিতি, আমি কেবল ধরে নিতে পারি যে দুর্বল টাইপিংয়ের বিপরীত অর্থ: টাইপ ত্রুটির সম্ভাবনা উপস্থিতি। রানটাইম বা কম্পাইল সময়? এখানে অপ্রাসঙ্গিক বলে মনে হচ্ছে।

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

অন্যদিকে, আমি ভাতা চেয়ে বলতে পারে ClassCastExceptionএবং ArrayStoreException(জাভা) ও InvalidCastException, ArrayTypeMismatchException(C #) কম্পাইল সময়ে স্বাস্থ্যহীন টাইপ করার একটি স্তর, অন্তত ইঙ্গিত করবে? এরিকের উত্তর এটির সাথে একমত বলে মনে হচ্ছে।

এই প্রশ্নের উত্তরগুলির একটিতে প্রদত্ত একটি রেফারেন্সে টাইপফুল প্রোগ্রামিং নামের একটি দ্বিতীয় নিবন্ধে সরবরাহ করা হয়েছে, লুকা কার্ডেলি প্রকার লঙ্ঘনের ধারণাটি আবিষ্কার করেছেন:

বেশিরভাগ সিস্টেম প্রোগ্রামিং ল্যাঙ্গুয়েজ নির্বিচারে লঙ্ঘনের অনুমতি দেয়, কিছু নির্বিচারে, কিছু কেবল কোনও প্রোগ্রামের সীমিত অংশগুলিতে। টাইপ লঙ্ঘনের সাথে জড়িত অপারেশনগুলিকে আনসাউন্ড বলা হয়। প্রকারের লঙ্ঘন বিভিন্ন শ্রেণিতে পড়ে [যার মধ্যে আমরা উল্লেখ করতে পারি]:

বেসিক-মান জারণ : এর মধ্যে পূর্ণসংখ্যা, বুলিয়ান, অক্ষর, সেট ইত্যাদির মধ্যে রূপান্তর অন্তর্ভুক্ত রয়েছে here

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

এর ভিত্তিতে পাইথন, পার্ল, জাভা বা সি # দুর্বলভাবে টাইপ করা হয় না।

কার্ডেলি দুটি প্রকারের বিভক্তির উল্লেখ করেছেন যা আমি সত্যই দুর্বল টাইপের ক্ষেত্রে বিবেচনা করি:

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

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

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


4

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

শক্ত টাইপিংয়ের অর্থ এই যে প্রকারগুলি জোর করে না, বা কমপক্ষে কম জোর করে।

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

অনেকে সম্প্রতি "দৃ manifest় টাইপড" দিয়ে "সুস্পষ্টভাবে টাইপড" বিভ্রান্ত করছেন। "ম্যানিফেস্টলি টাইপড" এর অর্থ হ'ল আপনি আপনার ভেরিয়েবলের প্রকারগুলি স্পষ্টভাবে ঘোষণা করেন।

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

সি এবং সি ++ স্পষ্টত টাইপ করা হয়, স্ট্যাটিকালি টাইপ করা হয় এবং কিছুটা দৃ strongly়ভাবে টাইপ করা হয়, কারণ আপনি নিজের প্রকারগুলি ঘোষণা করেন, প্রকারগুলি সংকলনের সময় নির্ধারিত হয় এবং আপনি পূর্ণসংখ্যা এবং পয়েন্টার, বা পূর্ণসংখ্যার এবং দ্বিগুণ মিশ্রিত করতে পারেন, বা এমনকি এক প্রকারে একটি পয়েন্টারও castালতে পারেন অন্য ধরণের পয়েন্টার।

হাস্কেল একটি আকর্ষণীয় উদাহরণ, কারণ এটি সুস্পষ্টভাবে টাইপ করা হয় না, তবে এটি স্থিতিশীল এবং দৃ strongly়ভাবে টাইপও করা হয়।


+1 কারণ আমি মুদ্রিত শব্দটি "ম্যানিফেস্টলি টাইপড" পছন্দ করি, যা জাভা এবং সি # এর মতো ভাষাগুলিকে শ্রেণিবদ্ধ করে যেখানে আপনি স্পষ্টভাবে প্রকারগুলি ঘোষণা করতে এবং হাস্কেল এবং স্কালার মতো অন্যান্য স্ট্যাটিকাল-টাইপ ভাষা থেকে আলাদা করতে হবে যেখানে টাইপ অনুকরণ গুরুত্বপূর্ণ ভূমিকা পালন করে এবং এটি সাধারণত আপনি যেমন বলেছেন তেমন লোককে বিভ্রান্ত করে এবং তাদের বিশ্বাস করে যে এই ভাষাগুলি গতিময়-টাইপযুক্ত।
এডউইন ডালোরজো

3

শক্তিশালী <=> দুর্বল টাইপিং কেবলমাত্র একটি ডেটাটাইপের জন্য অন্য ভাষাতে ভাষা দ্বারা স্বয়ংক্রিয়ভাবে কতটা বা কতটা স্বল্পমাত্রায় জোর করা হয় তার ধারাবাহিকতা সম্পর্কে নয়, তবে প্রকৃত মানগুলি কতটা দৃ strongly় বা দুর্বল টাইপ করা হয়। পাইথন এবং জাভাতে এবং বেশিরভাগ সি # তে মানগুলিতে পাথরের ধরণ রয়েছে। পার্লে, খুব বেশি কিছু নেই - একটি ভেরিয়েবলে সঞ্চয় করার জন্য কেবল কয়েক মুঠো বিভিন্ন ভ্যালুটিটাইপ রয়েছে।

একের পর এক কেস খুলি।


পাইথন

পাইথন উদাহরণে 1 + "1", +অপারেটর কল __add__টাইপ জন্য intএটা স্ট্রিং দান "1"একটি আর্গুমেন্ট হিসাবে - NotImplemented এই ফলাফল, তবে:

>>> (1).__add__('1')
NotImplemented

এরপরে, দোভাষী দোসরটির চেষ্টা করে __radd__:

>>> '1'.__radd__(1)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'str' object has no attribute '__radd__'

এটি ব্যর্থ হওয়ার +সাথে সাথে অপারেটর ফলাফলটি ব্যর্থ হয় TypeError: unsupported operand type(s) for +: 'int' and 'str'। যেমনটি, ব্যতিক্রমটি শক্তিশালী টাইপিং সম্পর্কে খুব বেশি কিছু বলে না, তবে অপারেটর একই যুক্তিতে স্বয়ংক্রিয়ভাবে তার যুক্তি + জোর করে না এমনটি একটি পয়েন্টার যে পাইথনটি ধারাবাহিকতায় সবচেয়ে দুর্বলতমভাবে টাইপ করা ভাষা নয়।

অন্যদিকে, পাইথন মধ্যে 'a' * 5 হয় বাস্তবায়িত:

>>> 'a' * 5
'aaaaa'

এটাই,

>>> 'a'.__mul__(5)
'aaaaa'

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


জাভা

জাভা উদাহরণটি কেবল String result = "1" + 1;কাজের সুবিধার্থে কাজ করে, অপারেটরটি +স্ট্রিংয়ের জন্য ওভারলোড হয়। জাভা +অপারেটর একটি তৈরিতে ক্রম প্রতিস্থাপন StringBuilder(দেখুন এই ):

String result = a + b;
// becomes something like
String result = new StringBuilder().append(a).append(b).toString()

এটি বরং খুব স্থিতিশীল টাইপিংয়ের উদাহরণ, সত্যিকারের জবরদস্তি ছাড়াই - StringBuilderএকটি পদ্ধতি রয়েছে append(Object)যা এখানে বিশেষভাবে ব্যবহৃত হয়। ডকুমেন্টেশন নিম্নলিখিত বলে:

Objectযুক্তির স্ট্রিং প্রতিনিধিত্ব যুক্ত করে App

সামগ্রিক প্রভাবটি হুবহু হ'ল যুক্তিটি পদ্ধতি দ্বারা একটি স্ট্রিংয়ে রূপান্তরিত হয়েছিল String.valueOf(Object)এবং সেই স্ট্রিংয়ের অক্ষরগুলি এই অক্ষর অনুসারে যুক্ত হয়েছিল।

যেখানে String.valueOfতখন

অবজেক্ট আর্গুমেন্টের স্ট্রিং প্রতিনিধিত্ব করে। [প্রত্যাবর্তন] যদি আর্গুমেন্ট হয় null, তারপরে সমান একটি স্ট্রিং "null"; অন্যথায়, এর মান obj.toString()ফিরে আসে।

সুতরাং এটি ভাষার দ্বারা নিখুঁতভাবে কোনও জবরদস্তির ঘটনা নয় - প্রতিটি উদ্বেগকে বস্তুগুলিতেই অর্পণ করে।


সি শার্প

এখানে জোন স্কিটির উত্তর অনুসারে , অপারেটর +এমনকি stringক্লাসের জন্য ওভারলোড হয় না - জাভা সদৃশ, এটি স্থির এবং শক্তিশালী উভয় টাইপিংয়ের জন্য ধন্যবাদ সংকলক দ্বারা উত্পন্ন সুবিধা।


পার্ল

পারলডাটা যেমন ব্যাখ্যা করে,

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

পার্লের সংখ্যা, বুলিয়ানস, স্ট্রিং, নালস, undefinedএস, অন্যান্য অবজেক্টের রেফারেন্স ইত্যাদির জন্য পৃথক ডেটা টাইপ নেই - এটি কেবল এই সমস্তগুলির জন্য একটি প্রকার, স্কেলারের ধরণের; 0 0 এর মতো একটি স্কেলারের মান। একটি স্ট্যালার ভেরিয়েবল যা একটি স্ট্রিং হিসাবে সেট করা হয়েছিল তা সত্যই একটি সংখ্যায় পরিবর্তিত হতে পারে এবং সেখান থেকে যদি কেবল একটি সংখ্যার প্রসঙ্গে অ্যাক্সেস করা হয় তবে "কেবল একটি স্ট্রিং" থেকে আলাদা আচরণ করতে পারে। স্কেলার পার্লে যে কোনও কিছু রাখতে পারে, এটি সিস্টেমে যতটা অবজেক্ট রয়েছে ততটাই। যদিও পাইথনে নামগুলি কেবলমাত্র বস্তুগুলিকে বোঝায়, পার্লের নামগুলিতে স্কেলারের মানগুলি পরিবর্তনযোগ্য অবজেক্ট। তদ্ব্যতীত, অবজেক্ট ওরিয়েন্টেড টাইপ সিস্টেমটি এর উপরে চটকানো রয়েছে: পার্ল - স্কেলার, তালিকাগুলি এবং হ্যাশগুলিতে মাত্র 3 টি ডাটাটাইপ রয়েছে। পার্লের কোনও ব্যবহারকারী সংজ্ঞায়িত অবজেক্ট হ'ল একটি blessপ্যাকেজটির এড (এটি পূর্ববর্তী 3 টির মধ্যে একটিরই নির্দেশক) - আপনি যে কোনও মান নিতে এবং যে কোনও তাত্ক্ষণিক সময়ে কোনও শ্রেণিকে আশীর্বাদ করতে পারেন।

পার্ল এমনকি আপনি কদম মানগুলির শ্রেণি পরিবর্তন করতে পারবেন - পাইথনে এটি সম্ভব নয় যেখানে কোনও শ্রেণির একটি মান তৈরি করতে আপনার স্পষ্টভাবে সেই শ্রেণীর অন্তর্গত object.__new__বা একই জাতীয় মান নির্ধারণ করতে হবে । পাইথনে আপনি সৃষ্টির পরে অবজেক্টের মূল পরিবর্তন করতে পারবেন না, পার্লে আপনি আরও কিছু করতে পারেন:

package Foo;
package Bar;

my $val = 42;
# $val is now a scalar value set from double
bless \$val, Foo;
# all references to $val now belong to class Foo
my $obj = \$val;
# now $obj refers to the SV stored in $val
# thus this prints: Foo=SCALAR(0x1c7d8c8)
print \$val, "\n"; 
# all references to $val now belong to class Bar
bless \$val, Bar;
# thus this prints Bar=SCALAR(0x1c7d8c8)
print \$val, "\n";
# we change the value stored in $val from number to a string
$val = 'abc';
# yet still the SV is blessed: Bar=SCALAR(0x1c7d8c8)
print \$val, "\n";
# and on the course, the $obj now refers to a "Bar" even though
# at the time of copying it did refer to a "Foo".
print $obj, "\n";

সুতরাং প্রকারের পরিচয়টি দুর্বলভাবে ভেরিয়েবলের সাথে আবদ্ধ এবং ফ্লাইয়ের কোনও রেফারেন্সের মাধ্যমে এটি পরিবর্তন করা যেতে পারে। আসলে, আপনি যদি

my $another = $val;

\$anotherশ্রেণি পরিচয় নেই, তবুও \$valআশীর্বাদযুক্ত রেফারেন্স দেবে।


টি এল; ডিআর

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


এটি সম্পূর্ণ বিভ্রান্ত। যে পার্ল 5 ভেরিয়েবলের টাইপ নেই তার মানগুলির সাথে কোনও ফলসই থাকে না , যা সর্বদা একটি ধরণের থাকে।
জিম বাল্টার

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

মানগুলি ধরণের পরিবর্তন করে না - এটি অসম্পূর্ণ; মান সর্বদা এক প্রকারের । একটি ভেরিয়েবলের মানটি পরিবর্তন করতে পারে। 1 থেকে "1" তে পরিবর্তন হ'ল 1 থেকে 2 পরিবর্তনের মতোই পরিবর্তনের মান
জিম বাল্টার

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

পিএস এটি দেখানো যেতে পারে যে এমনকি পার্লে <ডিজিটস> এবং "<ডিজিটস>" এর বিভিন্ন মান রয়েছে, কেবল ভিন্ন ধরণের নয়। পার্ল <ডিজিটের> এবং "<ডিজিটের>" তোলে প্রদর্শিত মাধ্যমে বেশিরভাগ ক্ষেত্রেই একই মান আছে অন্তর্নিহিত ধর্মান্তর কিন্তু বিভ্রম সম্পূর্ণ নয়; যেমন "12" | "34" হ'ল 36 এবং 12 | 34 হ'ল 46. আর একটি উদাহরণ হ'ল "00" সংখ্যাগতভাবে বেশিরভাগ প্রেক্ষাপটে 00 এর সমান, তবে বুলিয়ান প্রসঙ্গে নয়, যেখানে "00" সত্য তবে 00 টি মিথ্যা।
জিম বাল্টার

1

অন্য অনেকে যেমন প্রকাশ করেছেন, "শক্তিশালী" বনাম "দুর্বল" টাইপিংয়ের পুরো ধারণাটি সমস্যাযুক্ত।

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

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

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

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

এমন একটি বস্তু চান যা রঙের নীল বর্ণিত একটি বস্তুর যুক্তি দিয়ে "+" বার্তাটির কিছু অর্থপূর্ণ প্রতিক্রিয়া তৈরি করতে পারে? আপনি এটি গতিময়-টাইপ করা ভাষায় করতে পারেন, তবে এটি স্ট্যাটিকালি-টাইপ করা ভাষায় ব্যথা।


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

0

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

void func(string a) {...}

ভেরিয়েবল aটাইপ স্ট্রিংয়ের হিসাবে পরিচিত এবং কোনও বেমানান অপারেশন সংকলন সময়ে ধরা পড়বে।

পাইথন:

def func(a)
  ...

ভেরিয়েবলটি aযে কোনও কিছু হতে পারে এবং আমাদের কাছে এমন কোড থাকতে পারে যা একটি অবৈধ পদ্ধতি কল করে, যা কেবল রানটাইমে ধরা পড়বে।


12
আমি মনে করি আপনি শক্তিশালী টাইপ বনাম দুর্বল টাইপিং সহ গতিশীল টাইপিং বনাম স্ট্যাটিক টাইপিংকে বিভ্রান্ত করছেন। আপনার কোডের উভয় সংস্করণে, রানটাইম টাইপ সিস্টেমগুলি খুব ভাল করেই জানে যে একটি স্ট্রিং। এটি ঠিক যে প্রথম ক্ষেত্রে, সংকলক আপনাকে বলতে পারে যে, দ্বিতীয়টিতে এটি করতে পারে না। তবে এটি এইগুলির কোনওটিই দুর্বল-টাইপ করে না।
এডউইন ডালোরজো
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.