গতিশীল টাইপিং কোন কার্যকারিতা মঞ্জুরি দেয়? [বন্ধ]


91

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

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


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

28
ক্রিস স্মিথ যেমন তাঁর প্রবন্ধে লেখেন টাইপ সিস্টেমে বিতর্ক করার আগে কী জানতে হবে : "সমস্যাটি, এই ক্ষেত্রে, বেশিরভাগ প্রোগ্রামারদের সীমিত অভিজ্ঞতা আছে এবং তারা অনেকগুলি ভাষা ব্যবহার করেননি। প্রসঙ্গে, এখানে ছয় বা সাত "প্রচুর পরিমাণে" গণনা করা হয় না ... ... এর দুটি আকর্ষণীয় পরিণতি হ'ল: (1) অনেক প্রোগ্রামার অত্যন্ত স্থিতিশীলভাবে টাইপ করা ভাষা ব্যবহার করেছেন ((2) অনেক প্রোগ্রামার গতিশীল টাইপযুক্ত ভাষা খুব খারাপ ব্যবহার করেছেন used "
ড্যানিয়েল প্রাইডেন

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

10
@জারেকটমকজাক: এটি হ'ল কিছু গতিময় টাইপের ভাষার বৈশিষ্ট্য। তবে স্ট্যাটিক্যালি টাইপ করা ভাষার পক্ষে রানটাইমে সংশোধনযোগ্য হওয়া সম্ভব। উদাহরণস্বরূপ, ভিজ্যুয়াল স্টুডিও আপনাকে ডি #گرের ব্রেকপয়েন্টে থাকার সময় আপনাকে সি # কোডটি পুনরায় লেখার অনুমতি দেয় এবং এমনকি নতুন কোড পরিবর্তন করে আপনার কোডটি আবার চালানোর জন্য নির্দেশিক পয়েন্টারটিকে রিওয়াইন্ড করে। আমি ক্রিস স্মিথকে আমার অন্য মন্তব্যে উদ্ধৃত করে বলেছিলাম: "অনেক প্রোগ্রামার খুব স্ট্যাটিচ্যালি টাইপযুক্ত ভাষা ব্যবহার করেছেন" - আপনি জানেন এমন সমস্ত স্ট্যাটিকালি টাইপ করা ভাষার বিচার করবেন না।
ড্যানিয়েল প্রাইডেন

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

উত্তর:


50

যেহেতু আপনি একটি নির্দিষ্ট উদাহরণ চেয়েছিলেন, আমি আপনাকে একটি উপহার দেব।

রব Conery এর বৃহদায়তন ORM কোডের 400 লাইন। এটি এতটা ছোট কারণ রব এসকিউএল টেবিলগুলিকে মানচিত্র করতে এবং এসকিউএল টেবিলগুলিকে মিরর করার জন্য প্রচুর স্থিতিশীল প্রকারের প্রয়োজন ছাড়াই অবজেক্টের ফলাফল সরবরাহ করতে সক্ষম। এটি dynamicসি # তে ডেটা টাইপ ব্যবহার করে সম্পন্ন হয় । রবের ওয়েব পৃষ্ঠাটি এই প্রক্রিয়াটি বিশদভাবে বর্ণনা করে তবে এটি স্পষ্ট বলে মনে হয় যে এই বিশেষ ব্যবহারের ক্ষেত্রে ডায়নামিক টাইপিং কোডটির সংক্ষিপ্ততার জন্য বেশিরভাগ ক্ষেত্রে দায়ী।

স্যাম জাফরনের ড্যাপারের সাথে তুলনা করুন , যা স্থির ধরনের ব্যবহার করে; SQLMapperএকা বর্গ কোডের 3000 লাইন।

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


গতিশীল টাইপিং আপনাকে টাইপ সিদ্ধান্তগুলি রানটাইম থেকে স্থগিত করতে দেয় এখানেই শেষ.

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

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

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


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


22
আমি যদি দুটি সংখ্যার স্ট্রিং একসাথে যোগ করি তবে আমি এখনও কোনও সংখ্যার ফলাফল আশা করি না।
pdr

22
@ রবার্ট আমি আপনার বেশিরভাগ উত্তরের সাথে একমত তবে নোট করুন যে ইন্টারেক্টিভ রিড-ইভাল-প্রিন্ট লুপগুলির সাথে স্ট্যাচ্যালি টাইপ করা ভাষা রয়েছে যেমন স্কেলা এবং হাস্কেল। এটি হতে পারে যে সি # কেবল একটি বিশেষ ইন্টারেক্টিভ ভাষা নয়।
আন্দ্রেস এফ

14
আমাকে একটি হাস্কেল শিখতে হবে।
রবার্ট হার্ভে

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

8
"আপনি দুটি স্ট্রিং একসাথে যুক্ত করতে যাবেন না এবং স্ট্রিংয়ের সংখ্যাসূচক তথ্য না থাকলে একটি সংখ্যক উত্তর আশা করবেন না, এবং যদি তা না করে তবে আপনি অপ্রত্যাশিত ফলাফল পেতে চলেছেন" দুঃখিত, গতিশীল বনাম স্ট্যাটিক টাইপিংয়ের সাথে এর কোনও সম্পর্ক নেই , এটি শক্তিশালী বনাম দুর্বল টাইপিং।
বার্টে

26

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

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

তবে বেশিরভাগ স্ট্যাটিক টাইপ সিস্টেমগুলি এ জাতীয় আচরণ করে না। স্ট্যাটিক টাইপ সিস্টেমের দুটি সাধারণ বৈশিষ্ট্য যা সীমাবদ্ধতা আরোপ করতে পারে:

সংকলক একটি স্ট্যাটিক ধরণের ত্রুটিযুক্ত এমন একটি প্রোগ্রাম প্রত্যাখ্যান করতে পারে।

এটি একটি সীমাবদ্ধতা কারণ অনেক ধরণের নিরাপদ প্রোগ্রামে অগত্যা একটি স্ট্যাটিক ধরণের ত্রুটি থাকে।

উদাহরণস্বরূপ, আমার কাছে পাইথন স্ক্রিপ্ট রয়েছে যা পাইথন 2 এবং পাইথন 3 উভয় হিসাবে চালানো দরকার Some কিছু ফাংশন পাইথন 2 এবং 3 এর মধ্যে তাদের প্যারামিটারের ধরনগুলি পরিবর্তন করেছে, সুতরাং আমার কাছে কোড রয়েছে:

if sys.version_info[0] == 2:
    wfile.write(txt)
else:
    wfile.write(bytes(txt, 'utf-8'))

পাইথন 2 স্ট্যাটিক টাইপ পরীক্ষক পাইথন 3 কোড (এবং বিপরীতে) প্রত্যাখ্যান করবে, যদিও এটি কখনও কার্যকর হয় না। আমার টাইপ নিরাপদ প্রোগ্রামে একটি স্ট্যাটিক টাইপ ত্রুটি রয়েছে।

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

স্ট্যাটিক টাইপ পরীক্ষা করে ধরে নেওয়া হয় যে রানটাইম পরিবেশটি কমপাইল সময় তথ্য দ্বারা যথাযথভাবে বর্ণিত। তবে ভবিষ্যতের ভবিষ্যদ্বাণী করা বিপদজনক!

এখানে আরও একটি সীমাবদ্ধতা রয়েছে:

সংকলকটি এমন কোড তৈরি করতে পারে যা ধরে নেয় যে রানটাইম টাইপটি স্ট্যাটিক প্রকার।

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

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

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

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


2
"পাইথন 2 স্ট্যাটিক টাইপ পরীক্ষক পাইথন 3 কোডটি প্রত্যাখ্যান করবে (এবং তদ্বিপরীত), যদিও এটি কখনও কার্যকর হয় না uted আমার টাইপ নিরাপদ প্রোগ্রামে একটি স্ট্যাটিক টাইপ ত্রুটি থাকে" " আপনার সত্যিকারের যা দরকার তা মনে হচ্ছে কিছু ধরণের "স্থিতিশীল যদি" ​​রয়েছে, যেখানে সংস্থাপক / দোভাষী যদি শর্তটি মিথ্যা থাকে তবে কোডটি দেখতে পান না।
ডেভিড স্টোন

@ ডেভিডস্টোন যা সি ++ তে বিদ্যমান রয়েছে
মিলিন্ড আর

A Python 2 static type checker would reject the Python 3 code (and vice versa), even though it would never be executed. My type safe program contains a static type error. যে কোনও যুক্তিসঙ্গত স্থিতী ভাষায়, আপনি IFDEFউভয় ক্ষেত্রেই টাইপ সুরক্ষা বজায় রেখে টাইপ প্রিপ্রোসেসর স্টেটমেন্ট দিয়ে এটি করতে পারেন ।
ম্যাসন হুইলারের

1
@ ম্যাসনভিয়েল, ডেভিডস্টোন নং, প্রিপ্রোসেসর ট্রিকস এবং স্ট্যাটিক_আইপি উভয়ই স্থির। আমার উদাহরণে আমি পাইথন 2 এবং পাইথন 3 ব্যবহার করেছি তবে এটি কেবল অ্যামেজিংমোডুল ২.০ এবং অ্যামেজিংমোডিউল ৩.০ হিসাবে সহজেই হতে পারে, যেখানে সংস্করণগুলির মধ্যে কিছু ইন্টারফেস পরিবর্তিত হয়েছিল। আপনি যে ইন্টারফেসটি জানতে পারবেন তা প্রাথমিকভাবে মডিউল আমদানির সময় হয় যা প্রয়োজনীয় সময়ে রানটাইমে হয় (অন্তত যদি আপনার ডায়নামিক লিঙ্কিং সমর্থন করার কোনও ইচ্ছা থাকে)।
ridiculous_fish

18

হাঁসের-টাইপযুক্ত ভেরিয়েবলগুলি হ'ল সবার আগে যে জিনিসটি মনে হয় তবে বেশিরভাগ ক্ষেত্রে আপনি স্ট্যাটিক ধরণের অনুক্রমের মাধ্যমে একই সুবিধা পেতে পারেন।

তবে গতিশীলভাবে তৈরি সংগ্রহগুলিতে হাঁসের টাইপিং অন্য যে কোনও উপায়ে অর্জন করা শক্ত:

>>> d = JSON.parse(foo)
>>> d['bar'][3]
12
>>> d['baz']['qux']
'quux'

সুতরাং, কি ধরনের JSON.parseফিরে আসে? আন্তঃসংখ্যার-বা-অভিধানগুলির-স্ট্রিং-এর অ্যারেগুলির একটি অভিধান? না, এটি যথেষ্ট সাধারণও নয়।

JSON.parseকিছু ধরণের "বৈকল্পিক মান" ফিরিয়ে আনতে হবে যা নাল, বুল, ফ্লোট, স্ট্রিং, এ জাতীয় যে কোনও ধরণের পুনরাবৃত্তির সাথে অ্যারে হতে পারে, বা স্ট্রিং থেকে এই ধরণের যে কোনওটিতে পুনরাবৃত্তির সাথে অভিধান হতে পারে। ডায়নামিক টাইপিংয়ের মূল শক্তিগুলি এ জাতীয় বৈকল্পিক ধরণের থেকে আসে।

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

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


21
আপনার জেএসএন পার্সিং উদাহরণটি কোনও বীজগণিত ডেটা টাইপ দ্বারা সহজেই স্থিতিভাবে পরিচালনা করা যায়

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

4
@ ম্যাটফেনউইক বীজগণিত ডেটা প্রকারগুলি কার্যকরী ভাষাগুলিতে (অনুশীলনে) বেশ সীমাবদ্ধ। জাভা এবং সি # এর মতো ভাষা সম্পর্কে কী?
5:25

4
ADT গুলি ট্যাগ ইউনিয়ন হিসাবে সি / সি ++ তে বিদ্যমান। এটি কার্যকরী ভাষার পক্ষে অনন্য নয়।
ক্লার্ক গাবেল

2
@ স্পিকার আপনি একাধিক ক্লাস ব্যবহার করে একটি ক্লাসিকাল ওও ভাষায় ADT গুলি অনুকরণ করতে পারেন যা সমস্ত সাধারণ ইন্টারফেস থেকে প্রাপ্ত হয়, getClass () বা getType () এ রান-টাইম কল এবং সমতা পরীক্ষা করে। অথবা আপনি ডাবল প্রেরণ ব্যবহার করতে পারেন, তবে আমি মনে করি যে সি ++ তে বেশি অর্থ প্রদান করে। সুতরাং আপনার কাছে একটি জেএসবজেক্ট ইন্টারফেস এবং জেএসএসটিং, জেএসএনম্বার, জেএস্যাশ এবং জেএসআরাই ক্লাস থাকতে পারে। তারপরে এই "টি টাইপড" ডেটা স্ট্রাকচারকে "অ্যাপ্লিকেশন টাইপড" ডেটা স্ট্রাকচারে রূপান্তর করতে আপনার কিছু কোডের প্রয়োজন হবে। তবে আপনি সম্ভবত এটি গতিশীল টাইপযুক্ত ভাষায়ও করতে চান।
ড্যানিয়েল ইয়াঙ্কোভস্কি

12

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

আমি একটি উদাহরণ করব। ধরা যাক আপনি ডেটা অবজেক্টস, সেগুলির সংগ্রহ ইত্যাদির বিবরণ দেওয়ার জন্য একটি সাধারণ ডেটা মডেল প্রয়োগ করেছেন যা স্থিতিস্থাপকভাবে এই অর্থে টাইপ করা হয়েছে যে, যদি মডেলটি xফু টাইপের অবজেক্টের বৈশিষ্ট্যটি একটি পূর্ণসংখ্যা ধারণ করে, তবে অবশ্যই সর্বদা একটি পূর্ণসংখ্যা রাখা উচিত। কারণ এটি একটি রানটাইম কনস্ট্রাক্ট, আপনি এটি স্ট্যাটিকালি টাইপ করতে পারবেন না। মনে করুন আপনি YAML ফাইলগুলিতে বর্ণিত ডেটা সংরক্ষণ করেন store আপনি একটি হ্যাশ মানচিত্র তৈরি করেন (পরে কোনও ওয়াইএএমএল লাইব্রেরির কাছে হস্তান্তরিত হতে হবে), xবৈশিষ্ট্যটি পান, মানচিত্রে এটি সঞ্চয় করুন, অন্য বৈশিষ্ট্যটি পান যা ঘটনাক্রমে ঘটেছিল, ... একটি দ্বিতীয় রাখা? the_map[some_key]এখনকার ধরণ কী ? ভাল অঙ্কুর, আমরা জানি যে some_keyএটি 'x'এবং ফলস্বরূপ অবশ্যই একটি পূর্ণসংখ্যা হওয়া উচিত, তবে টাইপ সিস্টেম এমনকি এ সম্পর্কে যুক্তিও শুরু করতে পারে না।

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

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


জেনেরিক ধরণের বক্সিংয়ের প্রয়োজনীয়তা নেই।
রবার্ট হার্ভে

নিবন্ধন করুন আমি কথা বলা হয় নি জাভা C # এর বক্সিং, আমি "কিছু রাপার ক্লাস যার একমাত্র উদ্দেশ্য ইউ একটি উপপ্রকার মধ্যে T মান প্রতিনিধিত্ব করছে এটা মোড়ানো" সম্পর্কে কথা বলা হয়েছিল। প্যারামেট্রিক পলিমারফিজম (যাকে আপনি জেনেরিক টাইপিং বলছেন) তবে আমার উদাহরণটির জন্য প্রযোজ্য নয়। এটি কংক্রিটের ধরণের চেয়ে একটি সংকলন-বিমূর্ত বিমূর্ততা, তবে আমাদের রানটাইম টাইপিং ব্যবস্থা দরকার।

এটি উল্লেখ করার মতো হতে পারে যে স্কালার টাইপ সিস্টেম টিউরিং সম্পূর্ণ। সুতরাং টাইপ সিস্টেমগুলি আপনার ছবির চেয়ে কম তুচ্ছ হতে পারে।
অ্যান্ড্রিয়া

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

@ ডেলান আমি সম্মত আমি কেবল দেখছিলাম যে টাইপ সিস্টেমগুলি মোটামুটি জটিল স্টাফ করতে পারে। আমার ধারণা ছিল যে আপনার উত্তরটির অর্থ হ'ল টাইপ সিস্টেমটি কেবল তুচ্ছ যাচাই করতে পারে তবে দ্বিতীয় পাঠে আপনি এরকম কিছু লেখেন নি!
Andrea

7

স্ট্যাটিক টাইপিংয়ের সাথে আপনি ডায়নামিক টাইপিংয়ের কিছুই করতে পারবেন না যা আপনি করতে পারবেন না, কারণ আপনি স্ট্যাটিকালি টাইপ করা ভাষার উপরে ডায়নামিক টাইপিং প্রয়োগ করতে পারেন।

হাস্কেলের একটি সংক্ষিপ্ত উদাহরণ:

data Data = DString String | DInt Int | DDouble Double

-- defining a '+' operator here, with explicit promotion behavior
DString a + DString b = DString (a ++ b)
DString a + DInt b = DString (a ++ show b)
DString a + DDouble b = DString (a ++ show b)
DInt a + DString b = DString (show a ++ b)
DInt a + DInt b = DInt (a + b)
DInt a + DDouble b = DDouble (fromIntegral a + b)
DDouble a + DString b = DString (show a ++ b)
DDouble a + DInt b = DDouble (a + fromIntegral b)
DDouble a + DDouble b = DDouble (a + b)

পর্যাপ্ত ক্ষেত্রে আপনি যে কোনও গতিশীল টাইপ সিস্টেম প্রয়োগ করতে পারেন।

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

সম্পাদনা করুন: আমি এইটিকে সহজ রাখতে চেয়েছিলাম তবে কোনও অবজেক্টের মডেল সম্পর্কে এখানে আরও বিশদ রয়েছে

একটি ফাংশনটি আর্গুমেন্ট হিসাবে ডেটার একটি তালিকা নেয় এবং ইমপ্লোমনেডে পার্শ্ব প্রতিক্রিয়া সহ গণনা সম্পাদন করে এবং একটি ডেটা ফেরত দেয়।

type Function = [Data] -> ImplMonad Data

DMember হয় হয় সদস্যের মান বা একটি ফাংশন।

data DMember = DMemValue Data | DMemFunction Function

Dataঅবজেক্টস এবং ফাংশনগুলি অন্তর্ভুক্ত করার জন্য প্রসারিত করুন । অবজেক্টস নামযুক্ত সদস্যদের তালিকা।

data Data = .... | DObject [(String, DMember)] | DFunction Function

এই স্থিতিশীল প্রকারগুলি আমি পরিচিত প্রতিটি গতিশীল টাইপ করা অবজেক্ট সিস্টেমটি প্রয়োগ করতে যথেষ্ট।


এটি মোটেও একরকম নয় কারণ আপনি সংজ্ঞাটি না ঘটিয়ে নতুন ধরনের যুক্ত করতে পারবেন না Data
জেড

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

2
@ জেদ একবার আপনি যখন বস্তুর মডেল, মৌলিক ধরণের এবং আদিম ক্রিয়াকলাপগুলি প্রয়োগ করেন, অন্য কোনও ভিত্তি তৈরির প্রয়োজন হয় না। আপনি এই ডায়ালিকটিতে মূল গতিময় ভাষায় প্রোগ্রামগুলি সহজে এবং স্বয়ংক্রিয়ভাবে অনুবাদ করতে পারেন।
নোভাডেনিজেন

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

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

3

ঝিল্লি :

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

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

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


4
হ্যাঁ, হাস্কেল বাস্তবে অস্তিত্বের ধরণগুলি ব্যবহার করে এটি করতে পারে। আপনার যদি কিছু ধরণের ক্লাস ফু থাকে তবে আপনি যে ইন্টারফেসটি ইনস্ট্যান্ট করে কোনও প্রকারের মোড়কে তৈরি করতে পারেন। class Foo a where ... data Wrapper = forall a. Foo a => Wrapper a
জ্যাক ম্যাকআর্থার

@ জ্যাকএমসি আর্থার, ব্যাখ্যা করার জন্য ধন্যবাদ। আমার কাছে বসে বসে হাস্কেলকে শেখার এটি আর একটি কারণ।
মাইক স্যামুয়েল

2
আপনার ঝিল্লিটি একটি 'ইন্টারফেস' এবং বস্তুর প্রকারগুলি "অস্তিত্বের সাথে টাইপ করা হয়" - এটি হ'ল আমরা জানি যে ইন্টারফেসের অধীনে এগুলি বিদ্যমান, তবে আমরা কেবল এটি জানি। ডেটা বিমূর্তকরণের জন্য অস্তিত্বের ধরণগুলি 80 এর দশক থেকেই জানা যায়। একটি ভাল রেফারেন্স cs.cmu.edu/~rW/plbook/book.pdf অধ্যায় 21.1
ডন স্টুয়ার্ট

@DonStewart। জাভা প্রক্সি ক্লাসগুলি কি তখন অস্তিত্বের ধরণের প্রক্রিয়া? ঝিল্লিগুলি জটিল হয়ে ওঠে এমন এক জায়গায় নামমাত্র টাইপ সিস্টেম সহ ভাষাগুলিতে এমন ধরণের সংজ্ঞাটির বাইরে দৃশ্যমান কংক্রিটের নাম রয়েছে। উদাহরণস্বরূপ, Stringজাভাতে এটি একটি কংক্রিটের ধরণ হওয়ায় এটি মোড়ানো যায় না । টাইপ করার চেষ্টা করে না বলে স্মার্টটাকের এই সমস্যা নেই #doesNotUnderstand
মাইক স্যামুয়েল

1

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

নির্দিষ্ট পরিস্থিতি ও সমস্যাগুলিতে কেন ডায়নামিক টাইপিং আরও উপযুক্ত এবং আরও উপযুক্ত।

প্রথমে, সংজ্ঞায়িত করা যাক

সত্তা - আমার কোডে কিছু সত্তা সম্পর্কে সাধারণ ধারণা দরকার। এটি আদিম সংখ্যা থেকে জটিল ডেটা পর্যন্ত যে কোনও কিছু হতে পারে।

আচরণ - বলুন আমাদের সত্তার কিছু স্টেট রয়েছে এবং এমন একটি পদ্ধতির সেট রয়েছে যা বাইরের বিশ্বের সত্তাকে নির্দিষ্ট প্রতিক্রিয়াগুলির নির্দেশ দেয়। এই সত্তার স্টেটকে + ইন্টারফেসটিকে এর আচরণ বলতে দেয়। সরঞ্জামের ভাষা সরবরাহ করে একটি সত্তা নির্দিষ্ট উপায়ে একাধিক আচরণ করতে পারে

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

এটি সম্ভবত এমন কিছু যা অপরিচিত নয়। এবং যেমনটি আপনি বলেছিলেন আপনি পার্থক্যটি বুঝতে পেরেছেন তবে এখনও। সম্ভবত সম্পূর্ণ এবং সবচেয়ে সঠিক ব্যাখ্যা না হলেও আমি কিছু মুল্য আনতে যথেষ্ট মজা আশা করি :)

স্ট্যাটিক টাইপিং - কোড চালানো শুরুর আগে আপনার প্রোগ্রামের সমস্ত সত্তার আচরণের সংকলন সময়ে পরীক্ষা করা হয়। এর অর্থ হ'ল যদি আপনি উদাহরণস্বরূপ আপনার টাইপ ব্যক্তির সত্ত্বাকে যাদুকর আচরণ করতে চান (তবে আচরণ করতে চান) তবে আপনাকে সত্ত্বা ম্যাজিশিয়ানপারসনকে সংজ্ঞায়িত করতে হবে এবং থ্রো ম্যাজিক () এর মতো যাদুকরের আচরণ দিতে হবে। আপনি যদি আপনার কোডটিতে থাকেন তবে ভুল করে সাধারণ ব্যক্তিকে জানান th থ্রোম্যাগিক () সংকলক আপনাকে বলবে"Error >>> hell, this Person has no this behavior, dunno throwing magics, no run!".

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

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

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