কোনও ভাষা কেন ব্লকের জন্য স্পষ্টত চিহ্নিতকারীদের চেয়ে ইন্ডেন্টেশন পছন্দ করবে?


11

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

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

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

কেন কোনও ভাষা ডিজাইনার স্পষ্ট ব্লক চিহ্নিতকারীগুলির উপরে ইন্ডেন্টেশন বেছে নেবে?


8
কোনও উত্তর নয়, তবে হাস্কেল পাইথনের চেয়ে হোয়াইটস্পেস সংবেদনশীলতাটিকে অনেক বেশি alচ্ছিক করে তোলে । আপনি বেশিরভাগ জিনিসের জন্য সেমিকোলন ব্যবহার করতে পারেন, এবং ইচ্ছুক হলে কোঁকড়ানো ধনুর্বন্ধনী মধ্যে ব্লক মোড়ানো করতে পারেন। let x =1; y = 2; z = 3সম্পূর্ণ বৈধ, যেমন হয় do { putStrLn $ show x; putStrLn $ show y; putStrLn $ show z; }। তাদের একই লাইনে থাকার দরকার নেই।
কেচালোক্স

8
"একটি স্বয়ংক্রিয় বিন্যাস সরঞ্জাম তৈরি করা অসম্ভব" - প্রকৃতপক্ষে, ইনডেন্টেশন নিয়মের কারণে পাইথনে এ জাতীয় একটি স্বর বিন্যাস সরঞ্জামের প্রয়োজন নেই।
ডক ব্রাউন

13
উম, বৃদ্ধি খাঁজ হয় একটি সুনির্দিষ্ট ব্লক চিহ্নিতকারী।
কার্ল বিলেফেল্ট

3
@ কে.গকিনিস: কোনও ভাষা নকশার সিদ্ধান্তের পিছনে সঠিক অনুপ্রেরণার সেরা উত্স হ'ল ভাষা নকশাকারীরা।
রবার্ট হার্ভে

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

উত্তর:


13

গিডো ভন রসম

গুইডো ভ্যান রসমের সাথে একটি সাক্ষাত্কার থেকে , যা পুস্তকগুলিতে ডটকমের ডটকমের সাথে পুরো টেক্সটে দেখা যাবে (জোর আমার):

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

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

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

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

ডোনাল্ড ই নুথ এবং পিটার জে ল্যান্ডিন

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


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

if (test(x)):
  foo(x)
  bar(x)

দেব barসবসময় বলা যেতে বা শুধুমাত্র পরীক্ষা সফল তাহলে কি হবে?

দলবদ্ধকরণ কনস্ট্রাক্টসগুলি রিডানডেন্সিটির একটি স্তর যুক্ত করে যা আপনি যখন নিজের কোডটি স্বয়ংক্রিয়ভাবে যুক্ত করেন তখন কোনও ভুলকে চিহ্নিত করতে আপনাকে সহায়তা করে। সি তে, সমমানের কোডটি নীচে স্বয়ংক্রিয়ভাবে যুক্ত হতে পারে:

if (test(x))
  foo(x);
bar(x);

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

ইন পাইথন: মিথস আঁকাবাঁকা রেখা সম্পর্কে , সেখানে C থেকে একটি কল্পনানুসারে খারাপ উদাহরণ রয়েছে:

/*  Warning:  bogus C code!  */

if (some condition)
        if (another condition)
                do_something(fancy);
else
        this_sucks(badluck);

উপরের মত একই ঘটনাটি, ইমাক্সে, আমি পুরো ব্লক / ফাংশনটি হাইলাইট করি, ট্যাব টিপুন এবং তারপরে সমস্ত কোডটি পুনরায় পাঠানো হয়। মানব ইন্ডেন্টেশন এবং কোড কাঠামোর মধ্যে পার্থক্য আমাকে বলে কিছু বন্ধ রয়েছে (এটি এবং পূর্ববর্তী মন্তব্য!)।

এছাড়াও, মধ্যবর্তী কোড যেখানে সিটিতে ইন্ডেন্টেশন বন্ধ রয়েছে কেবল মাস্টার শাখার মাধ্যমে এটি তৈরি করে না, সমস্ত স্টাইলের চেকগুলি জায়গাটিতে থাকা জিসিসি / জেনকিন্স আমাকে চিৎকার করবে। পাইথনের উপরে বর্ণিত একটির মতোই আমার সম্প্রতি একটি সমস্যা হয়েছিল, যার এক পর্যায়ে ইন্ডেন্টেশন বন্ধ রয়েছে statement কখনও কখনও আমার সিতে কোড থাকে যা একটি বন্ধনী বন্ধনী ছাড়িয়ে যায়, কিন্তু তারপরে আমি ট্যাব এবং কোড ইনডেন্টগুলিকে "ভুলভাবে" আঘাত করি: এটি বাগটি দেখার আরও একটি সুযোগ।


3
"ধর্মীয় যুদ্ধ এড়াতে ..." আমি আশ্চর্য হয়েছি যে আসল কারণটি তুচ্ছ।
রবার্ট হার্ভে

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

@ জ্যাক্কসবি দয়া করে আমাকে বলুন যে উদ্ধৃতিটি থেকে কোন প্রসঙ্গটি অনুপস্থিত, যাতে আমি উত্তরটি সম্পাদনা করতে পারি।
coredump

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

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

7

এটি অত্যন্ত সাবজেক্টিভ এবং অনেকগুলি শিখা যুদ্ধের কারণ। যাহোক:

রয়ে প্রতীক ব্লক delimiting এবং খাঁজ শুকনো নীতি লঙ্ঘন করে , যেহেতু আপনি দুটি ভিন্ন উপায়ে একই তথ্য প্রকাশ করে। স্বয়ংক্রিয় খাঁজ সরঞ্জামের অস্তিত্ব একটি হল উপসর্গ শুকনো লঙ্ঘনের: আপনি স্বয়ংক্রিয়ভাবে খাঁজ শো তৈরি করতে পারেন যে এটা অপ্রয়োজনীয় তথ্য, এবং এটা মানে খাঁজ এবং চিহ্ন পারে সিঙ্ক যা কোড বিভ্রান্তিকর হতে খুঁজে পেতে।

পাইথন ডিজাইন এবং ইতিহাস এফএকিউ খুব স্পষ্টভাবে বলে:

পাইথন বিবৃতি বিভাজনের জন্য ইন্ডেন্টেশন ব্যবহার করে কেন?

গিডো ভ্যান রসুম বিশ্বাস করেন যে গ্রুপিংয়ের জন্য ইনডেন্টেশন ব্যবহার অত্যন্ত মার্জিত এবং গড় পাইথন প্রোগ্রামের স্পষ্টতায় অনেক অবদান রাখে। বেশিরভাগ মানুষ এই বৈশিষ্ট্যটি কিছু সময়ের পরে পছন্দ করতে শেখে।

যেহেতু কোনও প্রারম্ভিক / শেষ বন্ধনী নেই তাই পার্সার এবং মানব পাঠক দ্বারা চিহ্নিত গ্রুপিংয়ের মধ্যে মতভেদ থাকতে পারে না।

এটি সত্য যে আপনি পাইথনের জন্য কোনও স্বয়ংক্রিয় ইন্ডেন্টেশন সরঞ্জাম তৈরি করতে পারবেন না, তবে এটি একটি ভাল বিষয়: এর অর্থ দাঁড়ায় যে সিনট্যাক্সটিতে আপনার কাছে পুনর্নির্মাণের জন্য স্বয়ংক্রিয় সরঞ্জামগুলি দরকার need

ট্যাব বনাম স্পেস পাইথনের একটি বৈধ উদ্বেগ এবং এটি একই কোডবেজে কখনও ট্যাব এবং স্পেসগুলি মিশ্রিত করার পরামর্শ দেওয়া হয় না mix

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


6
ডাবল-এন্ট্রি অ্যাকাউন্টিংও ডিআরওয়াই লঙ্ঘন করে। রিডানডেনসি মাঝে মাঝে একটি বৈশিষ্ট্য।
coredump

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

@ কর্ডাম্প - এখন আমি জানি কেন আমি হিসাবরক্ষক নই।
JeffO

3
আপনি কি কোবোলকে PROCEDURE DIVISION.খুব মিস করছেন? আমি কখনই বলতে পারি না যে DATA DIVISIONএই নতুন অনুবাদিত ভাষাগুলিতে কোথায় শেষ এবং পদ্ধতিগুলি শুরু হয়।
এমএসডব্লিউ

2
@ কর্ডাম্প: "ইন্ডেন্টেশন দেখানো আমার বিপরীতে যেটি মনে রেখেছিল তা ত্রুটি প্রতিরোধের জন্য যথেষ্ট" - হুবহু।
জ্যাকবিবি

2

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


1
আমি দেখতে পাচ্ছি যে কেন কেউ সেমিকোলন এবং কোঁকড়া ধনুর্বন্ধনী শব্দকে বিবেচনা করবে। তবে 4/8/12 বার স্পেস টাইপ করা কি কম উত্পাদনশীল নয়? এবং যদি আপনি কোনওটি মিস করেন (যেহেতু তারা অদৃশ্য) আপনি সমস্যায় পড়েছেন।
মনিকাকে

5
এজন্য আপনি স্পেসগুলির পরিবর্তে ট্যাব ব্যবহার করেন বা এমন একটি IDE যা কীভাবে ট্যাবগুলিকে চার-স্থান ব্লকে রূপান্তর করতে পারে তা বোঝে।
রবার্ট হার্ভে

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

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

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