স্থির টাইপিং কীভাবে বড় প্রকল্পগুলিতে সত্যই সহায়ক?


9

একটি স্ক্রিপ্টিং প্রোগ্রামিং ভাষার সাইটের প্রধান পৃষ্ঠায় কৌতূহল করার সময়, আমি এই উত্তরণটির মুখোমুখি হয়েছি:

যখন কোনও সিস্টেম আপনার মাথায় রাখতে খুব বড় হয়ে যায়, আপনি স্ট্যাটিক প্রকারগুলি যুক্ত করতে পারেন।

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

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

অতিরিক্ত হিসাবে, যেমন ফাংশন ঘোষিত হয় type funcname()..., whitout বুদ্ধিমান typeআপনি প্রতিটি লাইন যা ফাংশন বলা হয় ও অনুসন্ধান করতে হবে, কারণ আপনার শুধু জানি funcname, যখন পাইথন মধ্যে এবং আপনার মত coud শুধু অনুসন্ধান def funcnameবা function funcnameযা শুধুমাত্র একবারে ঘটে, ঘোষণা।

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

সুতরাং, কোনও ফাংশনটির রিটার্নের ধরনটি যা স্পষ্টতই স্ট্যাটিকভাবে টাইপ করা ভাষাগুলির স্ট্রিংহট পয়েন্ট নয় তা জানার ব্যতীত, স্ট্যাটিক টাইপিং কীভাবে বড় প্রকল্পগুলিতে সত্যই সহায়ক?



2
আপনি যদি অন্য প্রশ্নের উত্তরগুলি পড়েন তবে আপনি সম্ভবত এটির জন্য আপনার প্রয়োজনীয় উত্তরগুলি পেয়ে যাবেন, তারা মূলত বিভিন্ন দৃষ্টিকোণ থেকে একই জিনিস জিজ্ঞাসা করছেন :)
সারা

1
সুইফ্ট এবং খেলার মাঠগুলি স্ট্যাটিকালি টাইপ করা ভাষার একটি আরপিএল।
ডেভেন 11

2
ভাষা সংকলিত হয় না, বাস্তবায়ন হয়। "সংকলিত" ভাষার জন্য একটি REPL লেখার উপায় হ'ল এমন কিছু লিখুন যা ভাষার ব্যাখ্যা করতে পারে বা কমপক্ষে কমপ্লেক্স করে এবং লাইন দ্বারা লাইন চালিত করে প্রয়োজনীয় অবস্থাটি প্রায় রাখে। এছাড়াও, জাভা 9 একটি REPL সহ শিপ করবে ship
সেবাস্তিয়ান রেডল

2
@ ইউজার 24২৪৫০ an২২: এখানে কীভাবে একজন দোভাষীর জন্য একটি REPL করবেন: কোড পড়ুন, দোভাষীর কাছে প্রেরণ করুন, ফলাফল মুদ্রণ করুন। সংকলকটির জন্য কীভাবে একটি REPL করবেন তা এখানে: কোড পড়ুন, সংকলকটিতে প্রেরণ করুন, সংকলিত কোডটি চালান , ফলাফল মুদ্রণ করুন। পাই হিসাবে সহজ। এফএসআই (দ্য এফইআরইপিএল), জিএইচসিআই (জিএইচসি হাস্কেলের আরপিএল), স্কালার আরইপিএল এবং ক্লিং ঠিক তাই করে।
জার্গ ডব্লু মিট্টাগ

উত্তর:


21

আরও বেশি, আরএপিএলগুলির সাথে এটি বিভিন্ন ইনপুটগুলির সাথে তার ফেরতের প্রকারের জন্য কোনও ফাংশন পরীক্ষা করা তুচ্ছ

এটা তুচ্ছ নয়। এটি মোটেই তুচ্ছ নয় । তুচ্ছ কাজগুলির জন্য এটি করা কেবল তুচ্ছ।

উদাহরণস্বরূপ, আপনি তুচ্ছভাবে একটি ফাংশন সংজ্ঞায়িত করতে পারেন যেখানে রিটার্ন টাইপ পুরোপুরি ইনপুট টাইপের উপর নির্ভর করে।

getAnswer(v) {
 return v.answer
}

এই ক্ষেত্রে, getAnswerসত্যিই নেই আছে একটি একক রিটার্ন টাইপ। রিটার্নের ধরনটি কী তা শিখতে আপনি কোনও নমুনা ইনপুট দিয়ে এটিকে কল করতে পারেন এমন কোনও পরীক্ষা নেই ever এটি সর্বদা আসল যুক্তির উপর নির্ভর করবে । রানটাইম এ।

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

getAnswer(x, y) {
   if (x + y.answer == 13)
       return 1;
   return "1";
}

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

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

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

স্মৃতি থেকে, def funcnameপাইথনে যথেষ্ট হবে না, কারণ ফাংশনটি নির্বিচারে পুনরায় বরাদ্দ করা যেতে পারে। বা একাধিক মডিউল বারবার ঘোষণা করা যেতে পারে। বা ক্লাসে। প্রভৃতি

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

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


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

ফাংশনগুলির রিটার্নের ধরণটি জেনে রাখা কখন কী ফাংশন করে তা আপনাকে জানায় না । প্রকার লেখার পরিবর্তে আপনি নমুনা মান সহ ডক পরীক্ষাগুলি লিখতে পারতেন। উদাহরণস্বরূপ, (শব্দ 'কিছু শব্দ ওউয়ে') => ['কিছু', 'শব্দ', 'ওইউ'] (শব্দের স্ট্রিং) -> [স্ট্রিং], (জিপ {অবসি} [১.৩]) সাথে তুলনা করুন => [(ক, ১), (খ, ২), (সি, ৩)] এর ধরণ সহ।
aoeu256

18

অনেক প্রোগ্রামার সহ একটি প্রকল্পের কথা চিন্তা করুন, যা বছরের পর বছর পরিবর্তিত হয়েছে। আপনি এটি বজায় রাখতে হবে। একটি ফাংশন আছে

getAnswer(v) {
 return v.answer
}

পৃথিবীতে এটি কী করে? কি v? উপাদান answerকোথা থেকে আসে?

getAnswer(v : AnswerBot) {
  return v.answer
}

এখন আমাদের আরও কিছু তথ্য আছে -; এটি এক ধরণের প্রয়োজন AnswerBot

আমরা যদি ক্লাস-ভিত্তিক ভাষায় যাই তবে আমরা বলতে পারি

class AnswerBot {
  var answer : String
  func getAnswer() -> String {
    return answer
  }
}

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


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

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

1
আমি অনুমান করি এটি কার্যকরী প্রোগ্রামিংয়ের একটি ভুল বোঝাবুঝির কারণ এটি। তবে, তারা বিশ্বব্যাপী নেমস্পেসে রয়েছেন বলে আপনি কী বোঝাতে চাইছেন?
ব্যবহারকারী 6245072

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

2
@ ডেভেন 11 "আসলে আমি এখানে জাভাস্ক্রিপ্ট ভাবছি", তবে অন্যান্য গতিশীল ভাষার প্রকৃত নাম স্থান / মডিউল / প্যাকেজ রয়েছে এবং আপনাকে পুনরায় সংজ্ঞা সম্পর্কে সতর্ক করতে পারে। আপনি কিছুটা বেশি সাধারণ হতে পারেন।
coredump

10

আপনার কাছে মনে হচ্ছে যে বৃহত স্থিতিশীল প্রকল্পগুলির সাথে কাজ করার বিষয়ে আপনার কয়েকটি ভুল ধারণা রয়েছে যা আপনার রায়কে মেঘলাতে পারে। এখানে কিছু পয়েন্টার রয়েছে:

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

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

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

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

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

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

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

আরও বেশি, আরএপিএলগুলির সাথে এটি বিভিন্ন ইনপুটগুলির সাথে তার ফেরতের প্রকারের জন্য কোনও ফাংশন পরীক্ষা করা তুচ্ছ

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

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

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


4
You seem to have a few misconceptions about working with large static projects that may be clouding your judgement.ঠিক আছে, আমি কেবল 14 বছর বয়সী এবং আমি কেবল অ্যান্ড্রয়েডে এক বছরেরও কম সময় থেকে প্রোগ্রাম করি, তাই এটি আমার অনুমান সম্ভব।
ব্যবহারকারী 6245072

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

6
  1. কারণ স্ট্যাটিক চেকার স্ট্যাটিকালি টাইপ করা ভাষার জন্য আরও সহজ easier
    • কোনও গতিময় ভাষার বৈশিষ্ট্য ছাড়াই একটি সর্বনিম্নে, যদি এটি সংকলিত হয়, তবে রানটাইমে কোনও অমীমাংসিত ফাংশন নেই। এটি এডিএ প্রকল্পগুলিতে এবং মাইক্রোকন্ট্রোলারগুলিতে সি সাধারণ। (মাইক্রোকন্ট্রোলার প্রোগ্রামগুলি মাঝে মাঝে বড় হয় ... শত শত ক্লোকের মতো বড়)
  2. স্ট্যাটিক সংকলন রেফারেন্স চেকগুলি ফাংশন ইনগ্রেন্টদের একটি উপসেট, যা স্থির ভাষায় সংকলন-সময় পরীক্ষা করা যায়।
  3. স্থির ভাষাগুলিতে সাধারণত আরও রেফারেন্সিয়াল স্বচ্ছতা থাকে। ফলাফলটি হ'ল কোনও নতুন বিকাশকারী একক ফাইলে ডুব দিতে পারে এবং যা চলছে তার কিছুটি বুঝতে পারে এবং একটি বাগ ঠিক করতে পারে বা কোডবেজে সমস্ত অদ্ভুত জিনিস না জেনে একটি ছোট বৈশিষ্ট্য যুক্ত করতে পারে।

বলুন, জাভাস্ক্রিপ্ট, রুবি বা স্মলটালকের সাথে তুলনা করুন, যেখানে বিকাশকারীরা রান সময়ে মূল ভাষার কার্যকারিতা পুনরায় সংজ্ঞায়িত করে। এটি বৃহত প্রকল্পটি বোঝা আরও শক্ত করে তোলে।

বড় প্রকল্পগুলিতে কেবল বেশি লোক থাকে না, তাদের আরও সময় থাকে। প্রত্যেকের ভুলে যাওয়ার বা এগিয়ে যাওয়ার জন্য পর্যাপ্ত সময়।

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


Anecdotally, an acquaintance of mine has a secure "Job For Life" programming in Lisp. Nobody except the team can understand the code-base.এটা কি আসলেই খারাপ? তারা যে ব্যক্তিগতকৃতকরণ যুক্ত করেছে তাদের কী আরও বেশি উত্পাদনশীল হতে সাহায্য করে না?
ব্যবহারকারী 6245072

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

চলমান লিস্প প্রোগ্রাম থেকে ইউনিট পরীক্ষা তৈরি করতে আপনি কি ট্রেসার ব্যবহার করতে পারবেন না? পাইথনের মতো আপনি একটি প্রিন্ট_আর্গস নামে একটি ডেকরেটর (ক্রিয়াবিজ্ঞান) তৈরি করতে পারেন যা কোনও ফাংশন গ্রহণ করে এবং একটি পরিবর্তিত ফাংশন দেয় যা তার যুক্তিটি প্রিন্ট করে। তারপরে আপনি এটিকে sys.modules এ পুরো প্রোগ্রামটিতে প্রয়োগ করতে পারেন, যদিও এটি করার সহজ উপায় হ'ল sys.set_trace ব্যবহার করা।
aoeu256

@ aoeu256 আমি লিস্প রানটাইম পরিবেশের ক্ষমতাগুলির সাথে পরিচিত নই। তবে তারা ম্যাক্রোগুলি ভারী ব্যবহার করেছিল, তাই কোনও সাধারণ লিস্প প্রোগ্রামার কোডটি পড়তে পারেনি; লিস্প সম্পর্কে ম্যাক্রোগুলি সমস্ত কিছু পরিবর্তনের কারণে রানটাইমটিতে "সাধারণ" জিনিসগুলি কাজ করার চেষ্টা করা সম্ভবত সম্ভব নয়।
টিম উইলিসক্রফ্ট

@ টিমউইলিসক্রফ্ট এই ধরণের স্টাফ করার আগে সমস্ত ম্যাক্রো প্রসারিত না হওয়া পর্যন্ত আপনি অপেক্ষা করতে পারেন। ইমাক্সে আপনাকে ইনলাইন ম্যাক্রোগুলি প্রসারিত করতে (এবং ইনলাইন ফাংশনগুলি সম্ভবত হতে পারে) শর্টকাট কী রয়েছে।
aoeu256

4

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

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

সংযোজন হিসাবে ফাংশনগুলি প্রকারের সাথে ঘোষিত হিসাবে funcname()..., হাইট আউট জ্ঞান প্রকারের আপনাকে ফাংশনটি বলা হয় এমন প্রতিটি লাইন অনুসন্ধান করতে হবে, কারণ আপনি কেবল জানেন funcname, পাইথন এবং লাইকগুলিতে আপনি কেবল অনুসন্ধান করতে পারেন def funcnameবা function funcnameযা কেবল একবার ঘটে ঘোষণাপত্রে।

এটি সিনট্যাক্সের বিষয়, যা স্থির টাইপিং থেকে সম্পূর্ণ সম্পর্কিত নয়।

সি পরিবারের বাক্য গঠনটি প্রকৃতপক্ষে বন্ধুত্বপূর্ণ যখন আপনি আপনার নিষ্পত্তিকরণে বিশেষ সরঞ্জাম না করে কোনও ঘোষণার সন্ধান করতে চান। অন্যান্য ভাষায় এই সমস্যা নেই। মরিচের ঘোষণার বাক্য গঠনটি দেখুন:

fn funcname(a: i32) -> i32

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

যে কোনও ভাষার ব্যাখ্যা করা যায় এবং যে কোনও ভাষার একটি আরপিএল থাকতে পারে।


সুতরাং, কোনও ফাংশনটির রিটার্নের ধরনটি ছাড়াও যা পরিষ্কারভাবে স্ট্যাটিকালি টাইপ করা ভাষার একটি শক্তিশালী বিন্দু নয় তা জানতে, স্ট্যাটিক টাইপিং কীভাবে বড় প্রকল্পগুলিতে সত্যই সহায়ক?

আমি একটি বিমূর্ত পদ্ধতিতে উত্তর দেব।

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

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

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

আমি অনুমানগুলি দুই ধরণের মধ্যে শ্রেণীবদ্ধ করতে চাই।

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

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

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

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

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

যখন আমাদের প্রকারগুলি ভুল হয়, বিশ্লেষণটি দেরি না করে তাত্ক্ষণিক ত্রুটিটিকে আমাদের নজরে এনে আমাদের সময় সাশ্রয় করে। যখন আমাদের প্রকারগুলি সঠিক হয়, বিশ্লেষণটি নিশ্চিত করে আমাদের সময় বাঁচায় যখন কোনও ত্রুটি ঘটে তখন আমরা তাত্ক্ষণিক ধরণের ত্রুটিগুলি বাতিল করতে পারি।


3

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

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

এখন আপনি জটিল ধরণের ব্যবহার করে এটি ক্লাসে আরও আকৃষ্ট করতে পারেন যা আকরিক কার্যকারিতা রয়েছে এমন একটি ক্লাস তৈরি করে আপনি এগুলি পাশ করা শুরু করতে পারেন এবং হঠাৎ আপনি আপনার প্রোগ্রামে আরও অনেক কাঠামো অর্জন করতে পারেন। কাঠামোগত প্রোগ্রামগুলি হ'ল সঠিকভাবে কাজ করা আরও সহজ, এবং বজায় রাখাও।


আপনাকে স্ট্যাটিক টাইপ ইনফারেন্স (পাইলিন্ট) করতে হবে না, আপনি ডায়নামিক টাইপ ইনফারেন্স chrislaffra.blogspot.com/2016/12/… করতে পারেন যা পাইপির জেআইটি সংকলক দ্বারাও করা হয়। ডায়নামিক টাইপ আনফারেন্সির আরও একটি সংস্করণ রয়েছে যেখানে কোনও কম্পিউটার এলোমেলোভাবে মক অবজেক্টগুলিকে আর্গুমেন্টে রাখে এবং দেখায় কী কারণে ত্রুটি ঘটেছে। থামানোর সমস্যাটি 99% কেসের ক্ষেত্রে আসে না, আপনি যদি খুব বেশি সময় নেন তবে কেবল অ্যালগরিদম বন্ধ করুন (পাইথন এইভাবে অসীম পুনরাবৃত্তি পরিচালনা করে, এটির পুনরাবৃত্তি সীমা সেট করা যেতে পারে)।
aoeu256
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.