সংকলকরা কীভাবে ত্রুটি এবং সতর্কতাগুলির প্রতিবেদন করবে?


11

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

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

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

সি # তে একই সমস্যা নেই তবে এর কয়েকটি রয়েছে। দেখে মনে হচ্ছে সংকলনটি বেশ কয়েকটি পাসে ঘটে এবং একটি পাস ব্যর্থ হলে পরবর্তী পাসগুলি কার্যকর করা থেকে বিরত রাখবে। তার কারণে, আপনার বিল্ড ব্যর্থ হলে আপনি যে ত্রুটি গণনাটি পান তা প্রায়শই মারাত্মকভাবে অবমূল্যায়ন করা হয়। এক দৌড়ে এটি বলতে পারে যে আপনার দুটি ত্রুটি রয়েছে, তবে একবারে সেগুলি ঠিক করার পরে আপনি 26 টি নতুন পেয়ে যাবেন।

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

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

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

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

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

সংকলক ত্রুটিগুলি জানার সঠিক উপায়টি কী হওয়া উচিত বলে আপনি মনে করেন?


-1: "নন-সংকলিত ভাষাগুলিতে এখনও ক্রপিং ত্রুটি প্রতিবেদন করার অংশ তাদের রয়েছে" বিষয়গত এবং যুক্তিযুক্ত। সত্যিই অসহায়। এটি কি প্রশ্ন বা অভিযোগ?
এস .লট

2
@ এস.লোট আমার মনে হয় আপনি এখানে কিছুটা ধীরে ধীরে রয়েছেন। সংকলিত ভাষাগুলিতে আমি আরও কঠিন ছিলাম এবং এটি আপনাকে বিরক্ত করবে বলে মনে হয় না।
জিনাক

@ জ্নাক: অন্যান্য বিবৃতিগুলি সত্যবাদী এবং পার্সিংয়ের পক্ষে আরও শক্তিশালী to এই বিবৃতিটি সবচেয়ে সহজেই বিষয় ও যুক্তিযুক্ত হিসাবে দেখানো হয়েছিল।
এস .লট

1
@ এসলট আমি কী ভুল করে বলেছি যে পাইথন একবারে একটি ত্রুটি নির্দেশ করে?
zneak

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

উত্তর:


6

আপনার প্রশ্নটি আসলে আমরা কীভাবে সংকলক ত্রুটিগুলি প্রতিবেদন করব তা সম্পর্কে বলে মনে হচ্ছে না - বরং এটি সমস্যার শ্রেণিবদ্ধকরণ এবং সেগুলি সম্পর্কে কী করা উচিত about

যদি আমরা এই মুহুর্তের জন্য, সতর্কতা / ত্রুটি দ্বি-দ্বিবিজ্ঞানটি সঠিক বলে ধরে নিয়ে শুরু করি তবে আসুন আমরা কীভাবে এটির উপরে তৈরি করতে পারি তা দেখুন। কিছু ধারণা:

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

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

এখন আমি যে বিষয়গুলিতে আপনার সাথে একমত নই:

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

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

থটস?


আমরা যে বিষয়গুলিতে আমরা দ্বিমত পোষণ করি (দুহ) বাদে আমি আপনার সাথে একমত, সুতরাং আমার কাছ থেকে এটি +1। আমি মনে করি প্রতিটি কোডের পাথের পক্ষে কোনও মান ফিরিয়ে দেওয়া বা আপনার প্রোগ্রামটি বাতিল করা যথেষ্ট সহজ, আপনি যখন অপরিজ্ঞাত আচরণের ক্ষেত্রে পড়ে তখন তা কতটা খারাপ তা বিবেচনা করে।
zneak

7

আপনার উত্থাপিত একটি সমস্যা ছিল ত্রুটিগুলির অসম্পূর্ণ প্রতিবেদন - উদাহরণস্বরূপ, 2 টি ত্রুটির প্রতিবেদন করা এবং আপনি যখন এগুলি ঠিক করেন, তখন আপনি আরও একটি গুচ্ছ পান।

এটি (মূলত) সংকলক লেখকের অংশে একটি আপস। আপনি কী ত্রুটি করেছেন তার উপর নির্ভর করে, সংকলকটির পক্ষে আপনার যা খারাপভাবে হয়েছে তা ভুল বুঝতে শুরু করা খুব সহজ it উদাহরণস্বরূপ, একটি সাধারণ টাইপও বিবেচনা করুন যেখানে আপনার itn x;পরিবর্তে এর মতো কিছু রয়েছে int x;। যদি আপনি অন্য কিছু না করে কিছু itnবোঝায় তবে এটি একটি ত্রুটি হিসাবে প্রতিবেদন করা হবে। এটি যতদূর যায় ঠিক আছে তবে এখন কী ঘটবে তা বিবেচনা করুন - সংকলকটি প্রচুর কোডগুলিকে দেখায় যা ভেরিয়েবল হিসাবে ব্যবহার করার চেষ্টা করে x। এটি ক) থামানো উচিত এবং আপনাকে এটি ঠিক করতে দেওয়া উচিত, বা খ) 2000 টি ত্রুটি error: "x": undeclared identifierবা সেই অর্ডারটিতে কোনও স্প্রিং করা উচিত? আরেকটি সম্ভাবনা বিবেচনা করুন:

int main()[

এটি অন্য একটি সুস্পষ্ট স্পষ্ট টাইপ - সম্ভবত এটি একটি এর {পরিবর্তে হওয়া উচিত [। সংকলকটি আপনাকে সেই অংশটি খুব সহজেই বলতে পারে - তবে এর পরে কি এমন কিছু x=1;বলার মতো কোনও ত্রুটির প্রতিবেদন করা উচিত error: statement only allowed inside a function?

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

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

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


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

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

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