"গোটো" বিবৃতিগুলি কী ধরণের বাগগুলি নিয়ে যায়? Historতিহাসিকভাবে কোন উল্লেখযোগ্য উদাহরণ আছে?


103

আমি বুঝতে পারি যে লুপগুলিতে নেস্ট করা লুপগুলি ভাঙ্গার জন্য সংরক্ষণ করুন; gotoবিবৃতি ফাঁকি এবং প্রোগ্রামিং এর একটি বাগ প্রবণ শৈলী যেমন তাচ্ছিল্য় ব্যবহার করা যেতে না করার জন্য করা হয়।

xkcd আল্ট টেক্সট: "নিল স্টিফেনসন তার লেবেলগুলির নাম 'ডিঙ্গো' পছন্দ করা সুন্দর বলে মনে করেন"
আসল কমিকটি এখানে দেখুন: http://xkcd.com/292/

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

  • অস্থায়িত্ব?
  • অপ্রকাশ্য বা অপঠনযোগ্য কোড?
  • নিরাপত্তা দুর্বলতা?
  • পুরোপুরি আর কিছু?

"গোটো" বিবৃতি আসলে কী ধরণের বাগ বাড়ে? Historতিহাসিকভাবে কোন উল্লেখযোগ্য উদাহরণ আছে?


33
আপনি কি এই বিষয়টিতে ডিজকস্ট্রার মূল শর্ট পেপার পড়েছেন? (এটি হ্যাঁ / কোনও প্রশ্ন নয় এবং একটি দ্ব্যর্থহীন তাত্ক্ষণিক "হ্যাঁ" বাদে অন্য কোনও উত্তর হ'ল "না"))
জন আর। স্ট্রোহম

2
আমি অনুমান করি যে কোনও বিপদজনক ব্যর্থতা ঘটে গেলে অ্যালার্মের প্রস্থান হয়। আপনি কখনই ফিরে পাবেন না। পাওয়ার ব্যর্থতা, ডিভাইস বা ফাইলগুলি অদৃশ্য হওয়ার মতো। কিছু ধরণের "অন ত্রুটি গোটো" ... তবে আমি মনে করি বেশিরভাগ "প্রায় বিপর্যয়কর" ত্রুটিগুলি আজকাল "ট্রাই - ক্যাচ" কনস্ট্রাকশন দ্বারা পরিচালনা করা যেতে পারে।
লেন

13
এখনও গণনা করা GOTO কেউ উল্লেখ করেনি। পৃথিবী যখন ছোট ছিল তখন বেসিকের লাইনের সংখ্যা ছিল। আপনি নিম্নলিখিত লিখতে পারেন: 100 এন = এ * 100; গোটো এন। এটি ডিবাগ করার চেষ্টা করুন :)
ম্যাকটল

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

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

উত্তর:


2

এটি দেখার একটি উপায় এখানে আমি এখনও অন্য উত্তরে দেখিনি।

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

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

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


অ-লোকাল গোতো?
উত্সাহক

thebrain.mcgill.ca/flash/capsules/experience_jaune03.html << মানুষের মন একবারে গড়ে things টি বিষয়ের উপর নজর রাখতে পারে। আপনার যুক্তি এই সীমাবদ্ধতার মধ্যে চলেছে, কারণ পরিধি বাড়ানোর ফলে আরও অনেকগুলি জিনিস যুক্ত হবে যা ট্র্যাক রাখা দরকার। সুতরাং যে ধরণের বাগগুলি প্রবর্তিত হবে তা হ'ল সম্ভাব্যতা বাদ দেওয়া ও ভুলে যাওয়া। আপনি "আপনার সুযোগকে সুদৃ .় রাখার জন্য" সাধারণভাবে একটি প্রশমন কৌশল এবং ভাল অনুশীলনেরও প্রস্তাব দেন। যেমন, আমি এই উত্তরটি গ্রহণ করি। গুড জব মার্টিন
আকিভা

1
কিভাবে শীতল হয়?! ২০০ জনেরও বেশি ভোট পড়েছে, মাত্র ১ টি নিয়ে জিতেছে!
মার্টিন মাট

68

এটি gotoনিজে থেকে খারাপ যে হয় না । (সর্বোপরি, কম্পিউটারে প্রতিটি ঝাঁপ দেওয়ার নির্দেশটি একটি গোটো।) সমস্যাটি হ'ল এখানে একটি মানবিক স্টাইলিং রয়েছে যা স্ট্রাকচার্ড প্রোগ্রামিংয়ের প্রাক-তারিখ রয়েছে, যাকে "ফ্লো-চার্ট" প্রোগ্রামিং বলা যেতে পারে।

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

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

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

অবশ্যই লোকেরা এখনও ছাড়াই স্প্যাগেটি কোড লিখতে পারে goto। সাধারণ পদ্ধতি হ'ল একটি লিখতে while(...) switch( iState ){..., যেখানে বিভিন্ন কেস iStateবিভিন্ন মানকে সেট করে । আসলে, সি বা সি ++ এ কেউ এটি করার জন্য একটি ম্যাক্রো লিখতে পারে এবং নামটি বলতে পারে GOTO, সুতরাং আপনি যে ব্যবহার করছেন না তা gotoবলা কোনও পার্থক্য ছাড়াই পার্থক্য।

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

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


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

23
@ মাইকডুনলাভে: সম্পর্কিত: "উপরের কোডে বাগগুলি সম্পর্কে সাবধান থাকুন; আমি কেবল এটি সঠিক প্রমাণ করেছি, চেষ্টা করেও দেখিনি।" staff.fnwi.uva.nl/p.vanemdeboas/knuthnote.pdf
মাকিং হাঁস

26
@ রবার্টহারভে এটি মোটেই সত্য নয় যে নির্ভুলতার প্রমাণগুলি কেবল তুচ্ছ প্রোগ্রামগুলির জন্য ব্যবহারিক। স্ট্রাকচার্ড প্রোগ্রামিংয়ের চেয়ে বেশি বিশেষায়িত সরঞ্জামগুলি অবশ্য প্রয়োজনীয়।
মাইক হাস্কেল

18
@ এসএমএলটারস: এটি একটি গবেষণা প্রকল্প। এই জাতীয় গবেষণা প্রকল্পের লক্ষ্যটি দেখাতে হবে যে তাদের যদি সংস্থান থাকে তবে তারা একটি যাচাই করা সংকলক লিখতে পারে । আপনি যদি তাদের বর্তমান কাজটি দেখুন, আপনি দেখতে পাবেন যে তারা কেবল সি এর পরবর্তী সংস্করণগুলিকে সমর্থন করার জন্য আগ্রহী নয়, বরং তারা প্রমাণ করতে পারে এমন সঠিকতার বৈশিষ্ট্যগুলি প্রসারিত করতে আগ্রহী। এবং তার জন্য, তারা সি 90, সি 99, সি 11, পাস্কাল, ফোর্টরান, আলগোল বা প্ল্যাঙ্ককলকে সমর্থন করে কিনা তা সম্পূর্ণ অপ্রাসঙ্গিক।
Jörg ডব্লু মিটাগ

8
@ মার্টিনো: আমি সেই "বোসন বাক্যাংশগুলি" নিয়ে আলোচনা করছি, যেখানে প্রোগ্রামাররা একমত হয় যে এটি খারাপ বা ভাল, কারণ তারা তা না করলে তারা বসে থাকবে sat জিনিসগুলির আরও মূল কারণ থাকতে হবে।
মাইক ডুনলাভে

63

কেন গোটো বিপজ্জনক?

  • gotoঅস্থিরতা নিজেই সৃষ্টি করে না। প্রায় ১০,০০,০০০ gotoএর পরেও লিনাক্স কার্নেলটি স্থিরতার মডেল।
  • gotoনিজে থেকে সুরক্ষিত দুর্বলতা সৃষ্টি করা উচিত নয়। তবে কয়েকটি ভাষায়, এটি try/ catchব্যতিক্রম পরিচালনা ব্লকগুলির সাথে মিশ্রণের ফলে এই সিইআরটি সুপারিশ অনুসারে বর্ণিত দুর্বলতাগুলি হতে পারে । মূলধারার সি ++ সংকলকগুলি এ জাতীয় ত্রুটিগুলি পতাকাঙ্কিত করে এবং প্রতিরোধ করে, তবে দুর্ভাগ্যক্রমে, পুরানো বা আরও বহিরাগত সংকলকগুলি এটি করে না।
  • gotoঅপঠনযোগ্য এবং অনিবার্য কোডের কারণ। এটিকে স্প্যাগেটি কোডও বলা হয় , কারণ স্প্যাগেটি প্লেটের মতো, যখন অনেকগুলি গোটো থাকে তখন নিয়ন্ত্রণের প্রবাহকে অনুসরণ করা খুব কঠিন।

এমনকি যদি আপনি স্প্যাগেটি কোড এড়াতে পরিচালনা করেন এবং আপনি যদি কয়েকটি গোটো ব্যবহার করেন তবে সেগুলি তবুও বাগের মতো এবং রিসোর্স ফাঁসকে সহজতর করে:

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

অতিরিক্ত তথ্য এবং উদ্ধৃতি:

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

  • জেমস গোসলিং এবং হেনরি ম্যাকগিল্টন তাদের 1995 জাভা ভাষার পরিবেশের সাদা কাগজে লিখেছিলেন :

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

  • বাজার্ন স্ট্রোস্ট্রাপ এই গ্রাহককে এই আমন্ত্রণমূলক পদগুলিতে গোটো সংজ্ঞা দিয়েছেন :

    গেটো - কুখ্যাত গোটো মেশিন উত্পন্ন সি ++ কোডে প্রাথমিকভাবে দরকারী।

কখন ব্যবহার করা যাবে?

কে অ্যান্ড আর এর মতো আমি গোটোস সম্পর্কে গোপনীয় নই। আমি স্বীকার করি যে এমন কিছু পরিস্থিতি রয়েছে যেখানে গেটো কারও জীবনকে সহজ করা যায়।

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

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

গোটোর ব্যবহার ভাষার উপর নির্ভর করে:

  • সি ++ এ, আরআইআই এর যথাযথ ব্যবহারের ফলে সংকলকটি সুযোগের বাইরে চলে যাওয়া সামগ্রীগুলি স্বয়ংক্রিয়ভাবে ধ্বংস করে দেয়, যাতে সংস্থানগুলি / লকটি যে কোনও উপায়ে পরিষ্কার করা যায়, এবং আর কিছুই করার দরকার নেই।

  • জাভা (উপরে জাভার লেখক উদ্ধৃতি এবং এই দেখতে এতে যান জন্য কোন প্রয়োজন আছে চমৎকার স্ট্যাক ওভারফ্লো উত্তর ): আবর্জনা সংগ্রাহক সাফ করে যে জগাখিচুড়ি, break, continue, এবং try/ catchব্যতিক্রম হ্যান্ডলিং সব ক্ষেত্রে যেখানে আবরণ gotoসহায়ক হতে পারে, কিন্তু একটি নিরাপদ এবং ভাল বইতে দেবেন। জাভার জনপ্রিয়তা প্রমাণ করে যে আধুনিক ভাষায় গোটো স্টেটমেন্ট এড়ানো যায়।

বিখ্যাত এসএসএল জুমটি দুর্বলতায় ব্যর্থ হয়েছে

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

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

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

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

ত্রুটি ফাংশন রয়েছে SSLEncodeSignedServerKeyExchange()মধ্যে এই ফাইলটি :

    if ((err = ReadyHash(&SSLHashSHA1, &hashCtx)) != 0)
        goto fail;
    if ((err =...) !=0)
        goto fail;
    if ((err = SSLHashSHA1.update(&hashCtx, &signedParams)) != 0)
        goto fail;
        goto fail;  // <====OUCH: INDENTATION MISLEADS: THIS IS UNCONDITIONDAL!!
    if (...)
        goto fail;

    ... // Do some cryptographic operations here

fail:
    ... // Free resources to process error

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

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

পদ্ধতির 1: যদি ক্লজ বা নেস্টেড ifএস

ক্রমানুসারে ত্রুটির জন্য প্রচুর শর্ত পরীক্ষা করার পরিবর্তে, এবং failসমস্যাগুলির ক্ষেত্রে প্রতিবার কোনও লেবেলে প্রেরণ করার পরিবর্তে, ifকোনও ব্যক্তি পূর্ব-শর্তে ক্রিপ্টোগ্রাফিক ক্রিয়াকলাপগুলি সম্পাদন করার পক্ষে বেছে নিতে পারেন যা কোনও ভুল প্রাক-শর্ত না থাকলেই এটি করতে পারে:

    if ((err = ReadyHash(&SSLHashSHA1, &hashCtx)) == 0 &&
        (err = ...) == 0 ) &&
        (err = ReadyHash(&SSLHashSHA1, &hashCtx)) == 0) &&
        ...
        (err = ...) == 0 ) )
    {
         ... // Do some cryptographic operations here
    }
    ... // Free resources

পদ্ধতির 2: একটি ত্রুটি সংযোজক ব্যবহার করুন

এই পদ্ধতির উপর ভিত্তি করে যে এখানে প্রায় সমস্ত বিবৃতি errত্রুটি কোড সেট করতে কিছু ফাংশন কল করে এবং বাকী কোডটি কেবল err0 হলে (যেমন ত্রুটি ছাড়াই কার্যকর করা ফাংশন) কল করে। একটি দুর্দান্ত নিরাপদ এবং পঠনযোগ্য বিকল্প হ'ল:

bool ok = true;
ok =  ok && (err = ReadyHash(&SSLHashSHA1, &hashCtx))) == 0;
ok =  ok && (err = NextFunction(...)) == 0;
...
ok =  ok && (err = ...) == 0;
... // Free resources

এখানে, একটিও গোটো নেই: ব্যর্থতার প্রস্থান পয়েন্টে দ্রুত ঝাঁপিয়ে পড়ার ঝুঁকি নেই। এবং দৃশ্যত এটি একটি ভুল বিভক্ত রেখা বা একটি ভুলে যাওয়া চিহ্নিত করা সহজ হবে ok &&

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

এমনকি আপনি ফাংশনের শেষে একটি ধারাবাহিকতা পরীক্ষা করতে পারেন যা পরীক্ষার পর্যায়ে ঠিক পতাকা এবং ত্রুটির কোডের মধ্যে মিল খুঁজে পাওয়া যায় না।

assert( (ok==false && err!=0) || (ok==true && err==0) );

যেমন একটি ভুল ==0একটি সঙ্গে অনবধানতাবশত প্রতিস্থাপিত !=0বা যৌক্তিক সংযোজক ত্রুটি সহজে ডিবাগিং সময়ে বিক্ষোভ করা হবে।

যেমনটি বলেছেন: আমি ভান করি না যে বিকল্প নির্মাণগুলি কোনও ত্রুটি এড়াতে পারত। আমি কেবল এটিই বলতে চাই যে তারা ত্রুটিটি ঘটানো আরও জটিল করে তুলতে পারে।


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

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

12
আপনি শর্টকাট বুলিয়ান অপারেটর আচরণ ব্যবহার করছেন পার্শ্ব-প্রতিক্রিয়া মাধ্যমে একটি বিবৃতি কার্যকর করতে এবং দাবিটি যে একটি ifবিবৃতি অপেক্ষা আরও পরিষ্কার ? মজা বার. :)
ক্রেগ

38
যদি "গোটো ব্যর্থ" না হয়ে একটি বিবৃতি "ব্যর্থ = সত্য" হয়ে থাকে তবে ঠিক একই জিনিসটি ঘটত।
gnasher729

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

34

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

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

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

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

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

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

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


2
মন্তব্যগুলি বর্ধিত আলোচনার জন্য নয়; এই কথোপকথন চ্যাটে সরানো হয়েছে ।
ম্যাপেল_শ্যাফ্ট

11

"গোটো" বিবৃতিগুলি কী ধরণের বাগগুলি নিয়ে যায়? Historতিহাসিকভাবে কোন উল্লেখযোগ্য উদাহরণ আছে?

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

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

১৯68৮ সালে যখন এডজার ডিজকસ્ત્રা "গোটোকে ক্ষতিকারক বলে বিবেচিত" বলে ঘোষণা করেছিলেন তখন তিনি মুষ্টিমেয় কিছু উদাহরণ দেননি যেখানে সম্পর্কিত বাগগুলিকে গোটোয় দোষ দেওয়া যেতে পারে, বরং তিনি ঘোষণা করেছিলেন যে উচ্চ স্তরের ভাষার জন্যgoto এটি অপ্রয়োজনীয় এবং এটি কোনটির পক্ষে এড়ানো উচিত? আমরা আজ সাধারণ নিয়ন্ত্রণ প্রবাহ বিবেচনা করি: লুপস এবং শর্তসাপেক্ষ। তার কথা:

যাওয়ার নিরবচ্ছিন্ন ব্যবহারের তাত্ক্ষণিক পরিণতি হয়েছে যে প্রক্রিয়াটির অগ্রগতি বর্ণনা করার জন্য একটি অর্থবহ সমন্বয়ের একটি সার্থক সেট খুঁজে পাওয়া মারাত্মকভাবে শক্ত হয়ে যায়।
[...] যান বিবৃতি যেমন আছে তেমনি খুব আদিম হয়; কারও প্রোগ্রামে গোলমাল করার জন্য এটি অনেক বেশি আমন্ত্রণ।

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

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

একটি অ্যাপোক্রিফল উদাহরণ

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

একটি পাল্টা-উদাহরণ

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

রেকর্ডের জন্য, আমি এই পাল্টা-উদাহরণটি স্থিতিশীলভাবে বিশ্লেষণ করা বেশ সহজ বলে মনে করি।


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

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

@ অ্যারনহল এটি মূল অর্থ নয়।
মাইলস রাউট

11

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

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

যখন খোঁচা কার্ডগুলি বর্তমান প্রোগ্রামিং আর্ট ছিল, তাদের অনুশীলনকারীরা অনুরূপভাবে আপনাকে কার্ডের সংগঠন, বিবৃতি কীভাবে সংখ্যায়ন করতে হবে ইত্যাদি সম্পর্কিত কার্যকর পরামর্শ দিতে পারে। আমি নিশ্চিত নই যে সেই পরামর্শটি আজ খুব প্রাসঙ্গিক।

"টু স্টেটমেন্টস টু স্টেটমেন্টস" শব্দবন্ধটি জানতে এমনকি আপনি কি যথেষ্ট বয়স্ক ? আপনার এটি জানার দরকার নেই, তবে আপনি যদি তা না করেন তবে আপনি যে historicalতিহাসিক প্রসঙ্গে যে সতর্কতার বিরুদ্ধে gotoমূলত প্রাসঙ্গিক ছিলেন তার সাথে আপনি পরিচিত নন ।

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

তবে কি gotoবক্তব্যকে গালি দেওয়া যাবে না?

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

আপনি সাম্প্রতিক ভৌতিক গল্পের অভাব লক্ষ্য করতে পারেন gotoযাতে খলনায়ক অভিনয় করে plays বেশিরভাগ বা এই গল্পগুলির 30 বা 40 বছরের পুরানো বলে মনে হচ্ছে। আপনি যদি সেই গল্পগুলিকে বেশিরভাগ অপ্রচলিত হিসাবে বিবেচনা করেন তবে আপনি দৃ .় ভূমিতে দাঁড়াবেন।


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

1
আপনার পোস্টটি খুব ভাল খারাপ আমি মন্তব্যগুলিকে হ্রাস করতে পারি না।
পিটার বি

7

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


1
ভিজ্যুয়াল বেসিক 6 এবং ভিবিএর মধ্যে বেদনাদায়ক ত্রুটি পরিচালনার সমস্যা রয়েছে, তবে On Error Goto errhআপনি যদি ব্যবহার করেন তবে Resumeআপনি আবার চেষ্টা করতে পারেন , Resume Nextআপত্তিজনক লাইনটি এড়িয়ে যেতে পারেন এবং Erlএটি কোন লাইনটি ছিল তা জানতে (আপনি যদি লাইন নম্বর ব্যবহার করেন)।
সিস টিমারম্যান

@ চিজটিম্মারম্যান আমি ভিজ্যুয়াল বেসিকের সাথে খুব কম কাজ করেছি, আমি এটি জানতাম না। আমি এটি সম্পর্কে একটি মন্তব্য যুক্ত করব।
qfwfq

2
@ চিজটিম্মারম্যান: "রেজ্যুমে" এর ভিবি 6 শব্দার্থবিজ্ঞানগুলি ভয়াবহ, যদি কোনও সাব্রোটিনের মধ্যে ত্রুটি দেখা দেয় যার নিজস্ব অন-ত্রুটি ব্লক নেই। Resumeশুরু থেকে সেই ফাংশনটি পুনরায় সম্পাদন Resume Nextকরবে এবং যে ফাংশনটি এখনও হয়নি তা এড়িয়ে যাবে।
সুপারক্যাট

2
@ সুপের্যাট যেমনটি আমি বলেছিলাম, এটি বেদনাদায়ক। আপনার যদি সঠিক লাইনটি জানা দরকার তবে আপনার সমস্তটি সংখ্যক করে নেওয়া উচিত, অথবা অস্থায়ীভাবে ত্রুটি পরিচালনা করার সাথে On Error Goto 0এবং ম্যানুয়ালি ডিবাগের অক্ষম করা উচিত । Resumeযাচাই করা Err.Numberএবং প্রয়োজনীয় সামঞ্জস্য করার পরে ব্যবহার করা উচিত ।
সিস টিমারম্যান

1
আমার লক্ষ করা উচিত যে একটি আধুনিক ভাষায়, gotoকেবল লেবেলযুক্ত লাইনগুলি নিয়ে কাজ করে, যা লেবেলযুক্ত লুপগুলি ছাড়িয়ে গেছে বলে মনে হয় ।
সিস টিমারম্যান

7

অন্যান্য প্রবাহ নিয়ন্ত্রণের তুলনায় মানুষের পক্ষে যুক্তি করা খুব শক্ত।

প্রোগ্রামিং সঠিক কোড কঠিন। সঠিক প্রোগ্রামগুলি লেখা শক্ত, কর্মসূচিগুলি সঠিক কিনা তা নির্ধারণ করা শক্ত প্রোগ্রামগুলি প্রমাণ করা শক্ত।

অস্পষ্টভাবে কোড পেতে কোডিং যা আপনি চান তা প্রোগ্রামিং সম্পর্কিত সমস্ত কিছুর তুলনায় সহজ।

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

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

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

কর্টিন সমর্থন ব্যতীত ভাষায় "অগভীর" কর্টিনগুলি (যেমন সি ++ প্রি-সি ++ 20 এবং সি) গোটোস এবং ম্যানুয়াল স্টেট ম্যানেজমেন্টের মিশ্রণ ব্যবহার করে সম্ভব। "ডিপ" কর্টিনগুলি সি এর কার্যকারিতা setjmpএবং longjmpফাংশন ব্যবহার করে করা যেতে পারে

এমন কেস রয়েছে যেখানে কর্টাইনগুলি এতটাই কার্যকর যে এগুলি ম্যানুয়ালি এবং সাবধানে লেখাই মূল্যবান।

সি ++ এর ক্ষেত্রে এগুলি যথেষ্ট কার্যকর হিসাবে পাওয়া যাচ্ছে যে তারা তাদের সমর্থন করার জন্য ভাষা প্রসারিত করছে। gotoগুলি এবং ম্যানুয়াল রাষ্ট্র ব্যবস্থাপনা একটি শূন্য খরচ বিমূর্ততা স্তর পিছনে লুকিয়ে করা হচ্ছে, তাদের লিখতে প্রোগ্রামারদের অনুমতি ছাড়া এতে যান, তাদের জগাখিচুড়ি প্রমাণ করতে হচ্ছে অসুবিধা void**এস, ম্যানুয়াল নির্মাণ / রাজ্য ধ্বংস, ইত্যাদি সঠিক।

এতে যান একটি উচ্চ স্তরের বিমূর্ততা পিছনে লুকিয়ে পরার মত whileবা forবা ifবা switch। এই উচ্চ স্তরের বিমূর্ততা সঠিক প্রমাণ এবং চেক করা সহজ।

যদি ভাষা তাদের কিছু অনুপস্থিত থাকে (যেমন কিছু আধুনিক ভাষাগুলি কর্টিনগুলি অনুপস্থিত), হয় এমন একটি প্যাটার্নের সাথে লম্পট করে যা সমস্যার সাথে খাপ খায় না, বা গোটো ব্যবহার করে, আপনার বিকল্প হয়ে ওঠে।

অস্পষ্টভাবে কম্পিউটার পাওয়ার জন্য আপনি সাধারণ ক্ষেত্রে এটি যা করতে চান তা করা সহজ । নির্ভরযোগ্যভাবে দৃust় কোড লেখা শক্ত । গোটো দ্বিতীয়টির তুলনায় প্রথমটিকে অনেক বেশি সহায়তা করে; এটি "ক্ষতিকারক হিসাবে বিবেচিত", কারণ এটি বাগের উপর নজর রাখার জন্য গভীর এবং কঠোর সহ অতিমাত্রায় "कार्यरत" কোডের একটি চিহ্ন। পর্যাপ্ত পরিশ্রমের সাহায্যে আপনি এখনও "গোটো" সহ নির্ভরযোগ্যভাবে শক্তিশালী কোড তৈরি করতে পারেন, তাই নিরঙ্কুশ হিসাবে নিয়ম রাখা ভুল; তবে থাম্বের নিয়ম হিসাবে এটি একটি ভাল।


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

1
ওহ, আমার সবেমাত্র গুগল করা উচিত: fanf.livej Journal.com/105413.html কর্টিন চালানোর জন্য স্ট্যাক স্পেস তৈরির বর্ণনা করে। (যা আমার সন্দেহ হয়েছিল, কেবল সেটজ্যাম্প / লংজ্যাম্প ব্যবহারের উপরে এটি প্রয়োজনীয়)।
পিটার কর্ডেস

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

6

এই কোডটি দেখুন, http://www-personal.umich.edu/~axe/research/Software/CC/CC2/TourExec1.1.f.html থেকে যা প্রকৃতপক্ষে একটি বড় কারাগারের দ্বিমা সিমুলেশনের অংশ ছিল। আপনি যদি পুরানো ফরটারান বা বেসিক কোডটি দেখে থাকেন তবে বুঝতে পারবেন যে এটি এতটা অস্বাভাবিক নয়।

C  Not nice rules in second round of tour (cut and pasted 7/15/93)
   FUNCTION K75R(J,M,K,L,R,JA)
C  BY P D HARRINGTON
C  TYPED BY JM 3/20/79
   DIMENSION HIST(4,2),ROW(4),COL(2),ID(2)
   K75R=JA       ! Added 7/32/93 to report own old value
   IF (M .EQ. 2) GOTO 25
   IF (M .GT. 1) GOTO 10
   DO 5 IA = 1,4
     DO 5 IB = 1,2
5  HIST(IA,IB) = 0

   IBURN = 0
   ID(1) = 0
   ID(2) = 0
   IDEF = 0
   ITWIN = 0
   ISTRNG = 0
   ICOOP = 0
   ITRY = 0
   IRDCHK = 0
   IRAND = 0
   IPARTY = 1
   IND = 0
   MY = 0
   INDEF = 5
   IOPP = 0
   PROB = .2
   K75R = 0
   RETURN

10 IF (IRAND .EQ. 1) GOTO 70
   IOPP = IOPP + J
   HIST(IND,J+1) = HIST(IND,J+1) + 1
   IF (M .EQ. 15 .OR. MOD(M,15) .NE. 0 .OR. IRAND .EQ. 2) GOTO 25
   IF (HIST(1,1) / (M - 2) .GE. .8) GOTO 25
   IF (IOPP * 4 .LT. M - 2 .OR. IOPP * 4 .GT. 3 * M - 6) GOTO 25
   DO 12 IA = 1,4
12 ROW(IA) = HIST(IA,1) + HIST(IA,2)

   DO 14 IB = 1,2
     SUM = .0
     DO 13 IA = 1,4
13   SUM = SUM + HIST(IA,IB)
14 COL(IB) = SUM

   SUM = .0
   DO 16 IA = 1,4
     DO 16 IB = 1,2
       EX = ROW(IA) * COL(IB) / (M - 2)
       IF (EX .LE. 1.) GOTO 16
       SUM = SUM + ((HIST(IA,IB) - EX) ** 2) / EX
16 CONTINUE

   IF (SUM .GT. 3) GOTO 25
   IRAND = 1
   K75R = 1
   RETURN

25 IF (ITRY .EQ. 1 .AND. J .EQ. 1) IBURN = 1
   IF (M .LE. 37 .AND. J .EQ. 0) ITWIN = ITWIN + 1
   IF (M .EQ. 38 .AND. J .EQ. 1) ITWIN = ITWIN + 1
   IF (M .GE. 39 .AND. ITWIN .EQ. 37 .AND. J .EQ. 1) ITWIN = 0
   IF (ITWIN .EQ. 37) GOTO 80
   IDEF = IDEF * J + J
   IF (IDEF .GE. 20) GOTO 90
   IPARTY = 3 - IPARTY
   ID(IPARTY) = ID(IPARTY) * J + J
   IF (ID(IPARTY) .GE. INDEF) GOTO 78
   IF (ICOOP .GE. 1) GOTO 80
   IF (M .LT. 37 .OR. IBURN .EQ. 1) GOTO 34
   IF (M .EQ. 37) GOTO 32
   IF (R .GT. PROB) GOTO 34
32 ITRY = 2
   ICOOP = 2
   PROB = PROB + .05
   GOTO 92

34 IF (J .EQ. 0) GOTO 80
   GOTO 90

70 IRDCHK = IRDCHK + J * 4 - 3
   IF (IRDCHK .GE. 11) GOTO 75
   K75R = 1
   RETURN

75 IRAND = 2
   ICOOP = 2
   K75R = 0
   RETURN

78 ID(IPARTY) = 0
   ISTRNG = ISTRNG + 1
   IF (ISTRNG .EQ. 8) INDEF = 3
80 K75R = 0
   ITRY = ITRY - 1
   ICOOP = ICOOP - 1
   GOTO 95

90 ID(IPARTY) = ID(IPARTY) + 1
92 K75R = 1
95 IND = 2 * MY + J + 1
   MY = K75R
   RETURN
   END

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


4
এত সত্য :-) উল্লেখ করার মতো হতে পারে: লিগ্যাসি ফরটান এবং বেসিকের ব্লক স্ট্রাকচার ছিল না, যাতে যদি কোনও তম ধারাটি একটি লাইনে ধরে না রাখতে পারে তবে গোটোই ছিল একমাত্র বিকল্প।
ক্রিস্টোফ

সংখ্যার পরিবর্তে পাঠ্য লেবেল, বা সংখ্যাযুক্ত লাইনে কমপক্ষে মন্তব্য করা অনেক সাহায্য করবে।
সিইস টিমারম্যান

আমার ফোরট্রাণ-চতুর্থ দিনগুলিতে: আমি IF / ELSE IF / ELSE ব্লক, WHIP লুপ এবং BREAK এবং পরবর্তীগুলিতে লুপগুলিতে প্রয়োগ করতে আমার GOTO ব্যবহারকে সীমাবদ্ধ করেছি। কেউ আমাকে স্প্যাগেটি কোডের কুফলগুলি দেখিয়েছে এবং আপনাকে GOTO দিয়ে আপনার ব্লক কাঠামো বাস্তবায়ন করতে হবে এমনকি আপনার এড়াতে কেন কাঠামো করা উচিত। পরে আমি একটি প্রি-প্রসেসর (RATFOR, IIRC) ব্যবহার শুরু করি। গোটো অভ্যন্তরীণভাবে মন্দ নয়, এটি একটি মাত্রাতিরিক্ত-শক্তিশালী নিম্ন-স্তরের নির্মাণ যা মানচিত্রে একটি শাখা নির্দেশকে মানচিত্র দেয়। আপনার ভাষাটি স্বল্প হওয়ায় আপনার যদি এটি ব্যবহার করতে হয় তবে সঠিক ব্লক স্ট্রাকচারগুলি তৈরি বা বাড়ানোর জন্য এটি ব্যবহার করুন।
নিগেল 222

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

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

0

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

কোডের একক ইউনিটের মধ্যে একই নীতি প্রয়োগ হয়। আপনি যদি ধারাবাহিকভাবে কাঠামোগত প্রোগ্রামিং বা অবজেক্ট-ভিত্তিক প্রোগ্রামিং নীতিগুলি প্রয়োগ করেন তবে আপনি তা করবেন না:

  1. কোডের মাধ্যমে অপ্রত্যাশিত পথ তৈরি করুন
  2. অপরিজ্ঞাত বা অনির্বচনীয় পরিবর্তনশীল মান সহ কোড বিভাগে উপস্থিত হন
  3. অপরিজ্ঞাত বা অনির্বচনীয় পরিবর্তনশীল মান সহ কোডের একটি পথ থেকে প্রস্থান করুন
  4. একটি লেনদেন ইউনিট সম্পূর্ণ করতে ব্যর্থ
  5. মেমোরিতে কোড বা ডেটার অংশগুলি কার্যকরভাবে মৃত অবস্থায় ছেড়ে দিন, তবে আবর্জনা পরিষ্কার ও পুনঃনির্ধারণের জন্য অযোগ্য, কারণ আপনি কোডটি নিয়ন্ত্রণের পথটি ইউনিট থেকে বেরিয়ে আসার কারণে তাদেরকে মুক্তি দেওয়ার আহ্বান জানিয়ে একটি সুস্পষ্ট কনস্ট্রাক্ট ব্যবহার করে তাদের মুক্তির লক্ষণ প্রকাশ করেন নি

এই প্রসেসিং ত্রুটিগুলির আরও কয়েকটি সাধারণ লক্ষণগুলির মধ্যে রয়েছে মেমরি ফাঁস, মেমরি হোর্ডিং, পয়েন্টার ওভারফ্লোস, ক্রাশস, অসম্পূর্ণ ডেটা রেকর্ডস, রেকর্ড অ্যাড / সিএইচ / ব্যতিক্রমগুলি মুছে ফেলা, মেমরি পৃষ্ঠার ত্রুটিগুলি ইত্যাদি and

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


3
আপনি gotoএকবারও উল্লেখ না করে উত্তর দিয়েছেন । :)
রবার্ট হার্ভে

0

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


কারণ / ব্যবহার করবেন ব্যবহার করতে এতে যান :

  • আপনার যদি লুপের প্রয়োজন হয় তবে আপনাকে ব্যবহার করতে হবে whileবা for

  • আপনার যদি শর্তসাপূর্ণ লাফের প্রয়োজন হয় তবে ব্যবহার করুন if/then/else

  • আপনার যদি পদ্ধতির প্রয়োজন হয় তবে একটি ফাংশন / পদ্ধতিতে কল করুন।

  • আপনার যদি কোনও ফাংশন ছাড়তে হয় তবে ঠিক return

আমি আমার আঙ্গুলের যে জায়গাগুলিতে আমি gotoসঠিকভাবে ব্যবহার এবং ব্যবহার দেখেছি তার উপর নির্ভর করতে পারি ।

  • CPython
  • libKTX
  • সম্ভবত আরও কিছু

LibKTX এ একটি ফাংশন রয়েছে যা নিম্নলিখিত কোড রয়েছে

if(something)
    goto cleanup;

if(bla)
    goto cleanup;

cleanup:
    delete [] array;

gotoভাষা এখন সি হওয়ায় এই জায়গায় এখন উপযোগী :

  • আমরা একটি ফাংশন ভিতরে হয়
  • আমরা একটি ক্লিনআপ ফাংশন লিখতে পারি না (কারণ আমরা অন্য স্কোপটিতে প্রবেশ করি এবং অ্যাক্সেসযোগ্য কলার ফাংশন স্থিতি করা আরও বোঝা)

এই ব্যবহারের ক্ষেত্রে ব্যবহারযোগ্য কারণ সি তে আমাদের ক্লাস নেই, সুতরাং পরিষ্কার করার সহজ উপায়টি ব্যবহার করা হয় goto

আমাদের যদি সি ++ তে একই কোড থাকে তবে আর গোটো করার দরকার নেই:

class MyClass{
    public:

    void Function(){
        if(something)
            return Cleanup(); // invalid syntax in C#, but valid in C++
        if(bla)
            return Cleanup(); // invalid syntax in C#, but valid in C++
    }

    // access same members, no need to pass state (compiler do it for us).
    void Cleanup(){

    }



}

এটি কী ধরণের বাগগুলি নিয়ে যেতে পারে? কিছু. অসীম লুপস, কার্যকর আদেশের ক্রম, স্ট্যাক স্ক্রু ..

একটি ডকুমেন্টেড কেসটি এসএসএলের একটি দুর্বলতা যা গোটোর ভুল ব্যবহারের কারণে মাঝারি আক্রমণগুলিতে ম্যানকে অনুমতি দেয়: এখানে নিবন্ধটি

এটি একটি টাইপোর ত্রুটি, তবে কিছুক্ষণের জন্য লক্ষ্য করা গেল না, যদি কোডটি অন্যভাবে কাঠামোগত করা হয় তবে সঠিকভাবে পরীক্ষা করা হয়েছিল যেমন ত্রুটি সম্ভব হত না।


2
একটি উত্তরে প্রচুর মন্তব্য রয়েছে যা খুব স্পষ্টভাবে ব্যাখ্যা করে যে "গোটো" এর ব্যবহারটি এসএসএল বাগের পক্ষে সম্পূর্ণ অপ্রতিরোধ্য ছিল - বাগের এক লাইনের কোডের অযত্ন সদৃশতার কারণে ঘটেছিল, তাই এটি একবার শর্তযুক্তভাবে কার্যকর করা হয়েছিল এবং একবার নিঃশর্তভাবে কার্যকর হয়েছিল।
gnasher729

হ্যাঁ আমি গ্রহণ করার আগে একটি গোটো বাগের আরও ভাল historicalতিহাসিক উদাহরণের জন্য অপেক্ষা করছি। যেমন বললে; কোডের এই লাইনে কী ছিল তা আসলেই কিছু যায় আসে না; কোঁকড়া ধনুর্বন্ধনী এর অভাব এটি কার্যকর করে এবং নির্বিশেষে একটি ত্রুটি ঘটায়। আমি যদিও কৌতূহলী; "স্ট্যাক স্ক্রু" কী?
আকিভা

1
কোডের একটি উদাহরণ যা আমি পূর্বে পিএল / 1 সিসিএস এ কাজ করেছি। প্রোগ্রামে একক লাইন মানচিত্রের সমন্বিত একটি পর্দা রাখা হয়েছে। স্ক্রিনটি ফিরে এলে এটি প্রেরিত মানচিত্রের অ্যারেটি খুঁজে পেয়েছিল। একটি অ্যারেতে সূচকটি খুঁজে পেতে এর উপাদানগুলি ব্যবহার করে এবং তারপরে সেই সূচকটি অ্যারে ভেরিয়েবলের একটি সূচককে একটি GOTO করতে ব্যবহার করে যাতে এটি সেই পৃথক মানচিত্রে প্রক্রিয়া করতে পারে। যদি প্রেরণকৃত মানচিত্রের অ্যারেটি ভুল ছিল (বা দূষিত হয়েছিল) তবে এটি ভুল লেবেলে একটি GOTO করার চেষ্টা করতে পারে বা আরও খারাপ ক্র্যাশ হতে পারে কারণ লেবেল ভেরিয়েবলগুলির অ্যারের সমাপ্তির পরে এটি কোনও উপাদান অ্যাক্সেস করেছিল। কেস টাইপ সিনট্যাক্স ব্যবহার করতে পুনরায় লিখিত।
Kickstart
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.