কিছু গুরুত্বপূর্ণ সমস্যা রয়েছে যা আমি মনে করি বিদ্যমান উত্তরগুলি সমস্ত মিস করেছে।
দুর্বল টাইপিং এর অর্থ অন্তর্নিহিত উপস্থাপনায় অ্যাক্সেসের অনুমতি দেওয়া। সি-তে আমি অক্ষরগুলির জন্য একটি পয়েন্টার তৈরি করতে পারি, তারপরে সংকলকটি বলুন যে আমি এটি পূর্ণসংখ্যার পয়েন্টার হিসাবে ব্যবহার করতে চাই:
char sz[] = "abcdefg";
int *i = (int *)sz;
32-বিট পূর্ণসংখ্যার সাথে সামান্য এন্ডিয়ান প্ল্যাটফর্মে i
, এটি সংখ্যার অ্যারে তৈরি করে 0x64636261
এবং 0x00676665
। প্রকৃতপক্ষে, আপনি এমনকি তাদের পূর্ণসংখ্যার (উপযুক্ত আকারের) পয়েন্টারও কাস্ট করতে পারেন:
intptr_t i = (intptr_t)&sz;
এবং অবশ্যই এর অর্থ আমি সিস্টেমে যে কোনও জায়গায় মেমরির ওভাররাইট করতে পারি *
char *spam = (char *)0x12345678
spam[0] = 0;
* অবশ্যই আধুনিক ওএসের ব্যবহার ভার্চুয়াল মেমরি এবং পৃষ্ঠা সুরক্ষা যাতে আমি কেবল আমার নিজের প্রক্রিয়াটির স্মৃতিটিকে ওভাররাইট করতে পারি, তবে সি সম্পর্কে এমন কিছু নেই যা এই জাতীয় সুরক্ষা সরবরাহ করে, যে কেউ যে কখনও কোড করে বলেছিল, ক্লাসিক ম্যাক ওএস বা উইন 16 আপনাকে বলতে পারে।
Ditionতিহ্যবাহী লিস্প অনুরূপ ধরণের হ্যাকারির অনুমতি দেয়; কিছু প্ল্যাটফর্মে ডাবল-ওয়ার্ড ফ্লোট এবং কনস সেলগুলি একই ধরণের ছিল এবং আপনি কেবল অন্যটির প্রত্যাশা করে একটি ফাংশনে পাস করতে পারেন এবং এটি "কাজ করবে"।
বর্তমানে বেশিরভাগ ভাষা সি এবং লিস্পের মতো যথেষ্ট দুর্বল নয়, তবে তাদের অনেকগুলি এখনও কিছুটা ফাঁস রয়েছে। উদাহরণস্বরূপ, যে কোনও ওও ভাষা যাচাই করা আছে "ডাউনকাস্ট", * এটি একটি টাইপ ফাঁস: আপনি মূলত সংকলককে বলছেন "আমি জানি আমি আপনাকে নিরাপদ তা জানার জন্য পর্যাপ্ত তথ্য দিই নি, তবে আমি যথেষ্ট নিশ্চিত এটি হ'ল, "যখন কোনও প্রকারের সিস্টেমের পুরো বিষয়টি হ'ল কম্পাইলারের কাছে সর্বদা নিরাপদ কী তা জানার জন্য পর্যাপ্ত তথ্য থাকে।
* একটি চেক ডাউনডকাস্ট কেবল ভাষার টাইপ সিস্টেমকে দুর্বল করে না কারণ এটি চেকটিকে রানটাইম-এ স্থানান্তরিত করে। যদি এটি হয়ে থাকে তবে সাব-টাইপ পলিমারফিজম (ওরফে ভার্চুয়াল বা পুরো-গতিশীল ফাংশন কল) টাইপ সিস্টেমের একই লঙ্ঘন হবে এবং আমি মনে করি না যে কেউ এটি বলতে চায়।
খুব কম "স্ক্রিপ্টিং" ভাষা এই অর্থে দুর্বল। এমনকি পার্ল বা টিসিএল এ আপনি স্ট্রিং নিতে পারবেন না এবং কেবল এটির বাইটগুলি একটি পূর্ণসংখ্যা হিসাবে ব্যাখ্যা করতে পারবেন না But তবে এটি লক্ষণীয় যে সিপিথনে (এবং একইভাবে অনেক ভাষার জন্য অন্যান্য বহু অনুবাদকের জন্য) আপনি যদি সত্যই অধ্যবসায়ী হন তবে আপনি ব্যবহার করতে পারেন ctypes
আপ লোড করতে libpython
, একটি বস্তুর নিক্ষেপ id
একটি থেকে POINTER(Py_Object)
, এবং লিক করতে টাইপ করুন সিস্টেম বাধ্য। এটি টাইপ সিস্টেমটিকে দুর্বল করে তোলে বা না আপনার ব্যবহারের ক্ষেত্রে নির্ভর করে — আপনি যদি সুরক্ষা নিশ্চিত করতে কোনও ভাষা-নিষিদ্ধ সম্পাদনকারী স্যান্ডবক্স প্রয়োগ করতে চান তবে আপনাকে এই ধরণের পলায়ন নিয়ে মোকাবেলা করতে হবে…
* আপনি struct.unpack
বাইটগুলি পড়ার মতো একটি ফাংশন ব্যবহার করতে পারেন এবং "কীভাবে সি এই বাইটগুলি উপস্থাপন করবে" এর বাইরে একটি নতুন ইনট তৈরি করতে পারে তবে এটি স্পষ্টতই ফাঁস নয়; এমনকি হাস্কেলও এটির অনুমতি দেয়।
এদিকে, অন্তর্নিহিত রূপান্তরটি একটি দুর্বল বা ফাঁসযুক্ত ধরণের সিস্টেম থেকে সত্যই আলাদা একটি জিনিস।
প্রতিটি ভাষার, এমনকি হাস্কেলেরও কোনও পূর্ণসংখ্যাকে স্ট্রিং বা ফ্লোটে রূপান্তর করতে, বলতে, কাজ করে। তবে কিছু ভাষা আপনার জন্য সেই রূপান্তরগুলির কয়েকটি স্বয়ংক্রিয়ভাবে করবে - যেমন সিতে, আপনি যদি এমন কোনও ফাংশন কল করেন যা একটি চায় float
এবং আপনি এটি পাস করেন int
, এটি আপনার জন্য রূপান্তরিত হয়ে যায়। এটি অবশ্যই উদ্রেকহীন ওভারফ্লোগুলি সহ বাগগুলি নিয়ে যেতে পারে, তবে তারা দুর্বল টাইপ সিস্টেম থেকে পাওয়া একই ধরণের বাগ নয়। এবং সি আসলে এখানে কোনও দুর্বল হচ্ছে না; আপনি হাস্কেল-তে একটি ইন্টি এবং ফ্লোট যুক্ত করতে পারেন, বা একটি স্ট্রিংতে একটি ফ্লোটকে সংযুক্ত করতে পারেন, আপনাকে আরও স্পষ্টভাবে এটি করতে হবে।
এবং গতিশীল ভাষাগুলি সহ, এটি বেশ বিরল। পাইথন বা পার্লে "এমন কোনও ফাংশন যা একটি ফ্লোট চায়" বলে কিছু নেই। তবে সেখানে ওভারলোডেড ফাংশন রয়েছে যা বিভিন্ন ধরণের সাথে বিভিন্ন জিনিস করে, এবং একটি শক্তিশালী স্বজ্ঞাত ধারণা রয়েছে যা উদাহরণস্বরূপ, অন্য কোনও স্ট্রিং যুক্ত করা "একটি স্ট্রিং চায় এমন ফাংশন" " সেই অর্থে পার্ল, টিসিএল এবং জাভাস্ক্রিপ্ট অনেকগুলি অন্তর্নিহিত রূপান্তরগুলি ( "a" + 1
আপনাকে দেয় "a1"
) দেখায় , অন্যদিকে পাইথন অনেক কম কাজ করে ( "a" + 1
একটি ব্যতিক্রম উত্থাপন 1.0 + 1
করে তবে আপনাকে দেয় 2.0
*)। এই অনুভূতিটিকে আনুষ্ঠানিক শর্তে putোকানো কেবল শক্ত — কেন সেখানে +
স্ট্রিং এবং কোনও ইন্টি গ্রহণ করা উচিত নয় , যখন স্পষ্টতই অন্যান্য ক্রিয়াকলাপ যেমন সূচকের মতো থাকে, তখন কেন?
* আসলে, আধুনিক পাইথনে এটি ওও সাব টাইপিংয়ের ক্ষেত্রে ব্যাখ্যা করা যেতে পারে, যেহেতু isinstance(2, numbers.Real)
এটি সত্য। আমি মনে করি না যে 2
পার্ল বা জাভাস্ক্রিপ্টে স্ট্রিং টাইপের উদাহরণ রয়েছে এমন কোনও বোধ নেই … যদিও টিসিএল-তে এটি আসলে, কারণ সবকিছু স্ট্রিংয়ের উদাহরণ।
অবশেষে, আরও একটি সম্পূর্ণরূপে অরথগোনাল, "শক্তিশালী" বনাম "দুর্বল" টাইপিংয়ের সংজ্ঞা রয়েছে, যেখানে "শক্তিশালী" অর্থ শক্তিশালী / নমনীয় / ভাবপূর্ণ।
উদাহরণস্বরূপ, হাস্কেল আপনাকে এমন একটি সংখ্যার সংজ্ঞা দিতে দেয় যা একটি সংখ্যা, একটি স্ট্রিং, এই ধরণের একটি তালিকা, বা স্ট্রিং থেকে এই ধরণের মানচিত্র যা জেএসওএন থেকে ডিকোড করা যায় এমন কোনও উপস্থাপনের জন্য নিখুঁত উপায়। জাভাতে এ জাতীয় ধরণের সংজ্ঞা দেওয়ার কোনও উপায় নেই। তবে কমপক্ষে জাভাতে প্যারামিট্রিক (জেনেরিক) প্রকার রয়েছে, সুতরাং আপনি একটি ফাংশন লিখতে পারেন যা টিয়ের তালিকা নিয়ে থাকে এবং জানতে পারে যে উপাদানগুলি টি টাইপের; অন্যান্য জাভাগুলির মতো প্রথম ভাষা আপনাকে অবজেক্টের একটি তালিকা এবং ডাউনকাস্ট ব্যবহার করতে বাধ্য করেছিল। তবে অন্তত জাভা আপনাকে তাদের নিজস্ব পদ্ধতিতে নতুন ধরণের তৈরি করতে দেয়; সি আপনাকে কেবল কাঠামো তৈরি করতে দেয়। এবং বিসিপিএল এমনকি ছিল না। এবং তাই সমাবেশে, যেখানে একমাত্র প্রকারগুলি বিভিন্ন বিট দৈর্ঘ্য।
সুতরাং, সেই অর্থে, হাস্কেলের টাইপ সিস্টেমটি আধুনিক জাভার চেয়ে শক্তিশালী, যা পূর্বের জাভার চেয়ে শক্তিশালী, যা সি এর চেয়ে শক্তিশালী, যা বিসিপিএলের চেয়ে শক্তিশালী।
তো, পাইথন সেই বর্ণালীতে কোথায় ফিট? এটা কিছুটা কৃপণ। অনেক ক্ষেত্রে হাঁসের টাইপিং আপনাকে হাসকেলে যা করতে পারে তার সমস্ত কিছু এবং এমনকি কিছু কিছু যা আপনি নাও করতে পারেন তা অনুকরণ করতে দেয়; নিশ্চিত, সংকলন সময়ের পরিবর্তে রানটাইমগুলিতে ত্রুটিগুলি ধরা পড়ে, তবে তারা এখনও ধরা পড়ে। তবে, এমন কিছু ক্ষেত্রে রয়েছে যেখানে হাঁসের টাইপিং যথেষ্ট নয়। উদাহরণস্বরূপ, হাস্কেল-এ, আপনি বলতে পারেন যে খালি খালি তালিকায় অন্তরের তালিকা রয়েছে, তাই আপনি সিদ্ধান্ত নিতে পারেন যে +
সেই তালিকাটি বাদ দিয়ে 0 * ফিরে আসা উচিত; পাইথনে, একটি খালি তালিকা খালি তালিকা; +
এটির হ্রাস কী করা উচিত তা সিদ্ধান্ত নিতে আপনাকে সহায়তা করার জন্য কোনও ধরণের তথ্য নেই ।
* আসলে, হাস্কেল আপনাকে এটি করতে দেয় না; আপনি যদি হ্রাস ফাংশনটি কল করেন যা শূন্য তালিকায় কোনও প্রারম্ভিক মান নেয় না, আপনি একটি ত্রুটি পান। তবে এর টাইপ সিস্টেমটি যথেষ্ট শক্তিশালী যে আপনি এই কাজটি করতে পারেন, এবং পাইথনের তা নেই।