"যদি" এবং "যখন" ব্যবহার করা হয় তখন ভাষার কেন প্রকাশের চারপাশে বন্ধনী প্রয়োজন?


67

সি, জাভা, এবং C মত ভাষাসমূহ ++, সব একটি সম্পূর্ণ অভিব্যক্তি প্রায় প্রথম বন্ধনী প্রয়োজন যখন একটি ব্যবহৃত if, whileঅথবা switch

if (true) {
    // Do something
}

উল্টোদিকে

if true {
    // Do something
}

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


20
পাস্কলের জন্য প্রথম বন্ধনী প্রয়োজন হয় না (কারণ এটির প্রয়োজন একটি THEN)।
জিমিবি

30
পাইথন, রুবি না।
smci

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

7
আকর্ষণীয়ভাবে যান, বন্ধনীগুলির প্রয়োজন না হলেও ধনুর্বন্ধনী প্রয়োজন।
কোস

25
প্রশ্নটি খানিকটা টোটোলজিক্যাল। রাউন্ড ম্যানহোলটি কেন চারিদিক জুড়ে? সব ভাই কেন পুরুষ? পেরেন-প্রয়োজনীয়-ভাষাগুলির জন্য কেন সমস্ত প্যারেন প্রয়োজন? গোল ম্যানহোল কভারগুলি সংজ্ঞা অনুসারে গোল হয়; ভাইরা সংজ্ঞা অনুসারে পুরুষ; যে ভাষাগুলির প্যারেন প্রয়োজন তাদের সংজ্ঞা অনুসারে পেরেন দরকার।
এরিক লিপার্ট

উত্তর:


155

সেখানে থাকতে হবে কিছু বলার যেখানে শর্ত শেষ হয় ও শাখা শুরু প্রণালী। এটি করার বিভিন্ন উপায় রয়েছে।

কিছু কিছু ভাষায়, কোন কন্ডিশন হয় এ সব , যেমন স্মলটক, স্ব, Newspeak, IO, Ioke, Seph এবং শৌখিন হবে। শর্তাধীন শাখা প্রশাখাগুলি অন্যান্য পদ্ধতির মতোই সাধারণ পদ্ধতি হিসাবে কার্যকর করা হয়। পদ্ধতিটি বুলিয়ান আইটেমগুলিতে প্রয়োগ করা হয় এবং একটি বুলিয়ানকে ডাকা হয়। এইভাবে, শর্তটি হ'ল পদ্ধতিটির গ্রহনকারী এবং দুটি শাখা দুটি আর্গুমেন্ট, যেমন ছোট্ট টালায়:

aBooleanExpression ifTrue: [23] ifFalse: [42].

যদি আপনি জাভার সাথে বেশি পরিচিত হন তবে এটি নীচের সাথে সমান:

aBooleanExpression.ifThenElse(() -> 23, () -> 42);

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

(if aBooleanExpression 23 42)

কিছু ভাষাগুলি ডিলিমিটার হিসাবে কীওয়ার্ড ব্যবহার করে, যেমন আলগোল, অ্যাডা, বেসিক, পাস্কাল, মডিউলা -২, ওবেরন, ওবেরন -২, অ্যাক্টিভ ওবারন, উপাদান প্যাসকাল, জোনন, মডুলা -3:

IF aBooleanExpression THEN RETURN 23 ELSE RETURN 42;

রুবিতে আপনি কোনও কীওয়ার্ড বা এক্সপ্রেশন বিভাজক (সেমিকোলন বা নিউলাইন) ব্যবহার করতে পারেন:

if a_boolean_expression then 23 else 42 end

if a_boolean_expression; 23 else 42 end

# non-idiomatic, the minimum amount of whitespace required syntactically
if a_boolean_expression
23 else 42 end

# idiomatic, although only the first newline is required syntactically
if a_boolean_expression
  23
else
  42
end

গো এর শাখাগুলি ব্লক হওয়া দরকার এবং অভিব্যক্তি বা বিবৃতি দেয় না যা কোঁকড়ানো ধনুর্বন্ধনী বাধ্যতামূলক করে তোলে। অতএব, বন্ধনীগুলির প্রয়োজন নেই, যদিও আপনি চাইলে এগুলি যুক্ত করতে পারেন; পার্ল and এবং মরিচা এই ক্ষেত্রে একই:

if aBooleanExpression { return 23 } else { return 42 }

কিছু ভাষা শর্তটি সীমিত করতে অন্যান্য অ-অক্ষরীয় অক্ষর ব্যবহার করে, যেমন পাইথন:

if aBooleanExpression: return 23
else: return 42

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


8
খুব ভাল ওভারভিউ।
পিটার এ স্নাইডার

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

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

4
পুনঃ লিস্প: "আসলে, ম্যাক্রোস" " অনুশীলনে আইএফ হ'ল স্কিম এবং সিএলে একটি বিশেষ ফর্ম (সম্পূর্ণতার জন্য)।
coredump

1
@ লুশেনকো: এবং, যেমন, এমআইএসসি-তে, যা অলস-দ্বারা-ডিফল্ট, সমস্ত শর্তসাপেক্ষ ফর্মগুলি কেবলমাত্র সাধারণ ক্রিয়া, ম্যাক্রো বা বিশেষ ফর্ম নয় special (প্রকৃতপক্ষে, আফয়ার, এমআইএসসি-র শূন্য বিশেষ ফর্ম রয়েছে?)
জার্গ ডব্লু মিতাগ

70

বন্ধনীগুলি কেবল অপ্রয়োজনীয় যদি আপনি বন্ধনী ব্যবহার করেন।

if true ++ x;

উদাহরণস্বরূপ এগুলি ছাড়া অস্পষ্ট হয়ে যায়।


28
@RobertHarvey - প্রথম বন্ধনী হয় প্রায় কাছাকাছি প্রতিটি ভাষায় আমি সচেতন আছি প্রয়োজনীয়। অবশ্যই সি এবং এর আত্মীয়। ওপি কেন তারা জিজ্ঞাসা করা হয় করা হয় প্রয়োজন - এবং এটি কারণ ভাষা অন্যথায় দ্ব্যর্থক হয়ে যায়।
টেলাস্টিন

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

12
আমি অবাক হয়ে গিয়েছিলাম যে কেউ সবচেয়ে যুক্তিসঙ্গত এবং পঠনযোগ্য সংস্করণ উল্লেখ করেনি - পাস্কেলে (ইনক্লু। ডেলফি) এটি if Condition then ...
উলিচ গেরহার্ড

18
বিপরীত কাজ করার একটি ভাল উদাহরণ Go এটি ধনুর্বন্ধনী {}বাধ্যতামূলক করে তোলে এবং তাই অভিব্যক্তি কাছাকাছি পেরেন প্রয়োজন হয় না। পেরেনগুলি কেবল প্রয়োজনই নয় তবে আমি যদি মনে করি সঠিকভাবে যোগ করা একটি সংকলনের ত্রুটির কারণ হতে পারে - সেগুলি নিষিদ্ধ
slebetman

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

21

একটি ifবিবৃতিতে প্যারেন্টেসিসের গাণিতিক এক্সপ্রেশনগুলির মধ্যে ব্যবহৃত প্রথম বন্ধনীগুলির একই অর্থ হয় না। পাটিগণিতগুলি গাণিতিক এক্সপ্রেশনগুলিতে একসাথে গোষ্ঠীভুক্ত করতে ব্যবহৃত হয়। একটি ifবিবৃতিতে প্যারেন্থিসগুলি বুলিয়ান অভিব্যক্তিটি সীমিত করতে ব্যবহৃত হয়; এটি হ'ল বাকী ifবিবৃতি থেকে বুলিয়ান অভিব্যক্তিটি আলাদা করা ।

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


এটি কীভাবে সংকলকটিকে সহজতর করে তা আমি দেখতে পাচ্ছি না। নিয়ম `IF '(' প্রকাশ ')' বিবৃতি` এর চেয়ে সহজ নয় IF primary_expression statement। লক্ষ্য করুন যে দ্বিতীয়টি সমান দ্ব্যর্থহীন।
ব্যবহারকারী58697

@ ইউজার ৫৮৯77: না, কেবলমাত্র পরেরটির অস্পষ্টতা রয়েছে যেখানে একটি পোস্টফিক্স অপারেটর primary_expressionএকটি এক্সপ্রেশন-বিবৃতিতে উপসর্গ অপারেটর থেকে আলাদা করা যায় না। টেলাস্টিনের উত্তরটি অনুলিপি করতে if true ++ x;,। এছাড়াও, যদি খালি বিবৃতি উপস্থিত থাকে if a & f;তবে হয় &শর্তের ভিতরে একটি খালি বিবৃতি এবং বাইনারি হতে পারে , বা &বিবৃতি শুরুর দিকে একটি অ্যানারি হতে পারে। তবে প্রথম বন্ধনী যখন মিলছে তখন
ওপেনিংয়ের

@ এসএমএলটার্স একটি পোস্টফিক্স অপারেটর প্রাথমিক হিসাবে পার্স করে না । একটি প্রাথমিক প্রকাশের অন্যতম IDENTIFIER, CONSTANT, STRING_LITERALএবং '(' expression ')'
ব্যবহারকারী58697

@ ইউজার ৫৮৯77: মনে হচ্ছে আপনার একটি বিশেষ ভাষা মনে আছে। এবং এটি একটি নিয়ম বলে মনে হয় যে বন্ধনীগুলির প্রয়োজন হয় না এবং কেবল শর্তগুলি যদি "আইডেন্টিফায়ার, কনস্ট্যান্ট বা STRING_LITERAL" হয়। আমি নিশ্চিত নই যে বিষয়গুলি সহজ করে তোলে।
এমসাল্টারস

16

অন্যরা ইতিমধ্যে আংশিকভাবে উল্লেখ করেছেন যে এটি এক্সপ্রেশনগুলিও বৈধ বিবৃতি এবং এইমাত্র একটি বিবৃতি সহ একটি ব্লকের ক্ষেত্রে আপনি বন্ধনীগুলি ড্রপ করতে পারেন। এর অর্থ এই যে নিম্নলিখিতটি অস্পষ্ট:

if true
    +x;

কারণ এটি ব্যাখ্যা করা যেতে পারে:

if (true + x) {}

পরিবর্তে:

if (true) {+x;}

বেশ কয়েকটি ভাষা (উদাহরণস্বরূপ পাইথন) আপনাকে প্রথম বন্ধনী এড়াতে দেয় তবে এখনও একটি শেষ শর্ত চিহ্নিতকারী রয়েছে:

যদি সত্য : + x

তবে আপনি সঠিক যে আমরা পারে একটি ভাষা যেখানে একটি অভিব্যক্তি: একটি ভাষা যেখানে প্রথম বন্ধনী প্রয়োজনীয় না হয় সংজ্ঞায়িত না করে একটি বৈধ বিবৃতি এই সমস্যা থাকবে না।

দুর্ভাগ্যক্রমে এর অর্থ এই যে:

 ++x;
 functionCall(1,2,3);

বৈধ বিবৃতি হবে না , তাই আপনাকে প্রকাশ না করেই এই জাতীয় ক্রিয়া সম্পাদন করতে সক্ষম হতে কিছু অদ্ভুত বাক্য গঠন প্রবর্তন করতে হবে। এটি করার একটি সহজ উপায় হ'ল এই জাতীয় কোনও মার্কারের দ্বারা সহজেই অভিব্যক্তিটি প্রতিস্থাপন করা [statement]:

[statement] ++x;
[statement] functionCall(1,2,3);

আপনাকে যেহেতু লিখতে হবে তা এখন অস্পষ্টতা অদৃশ্য হয়ে গেছে:

if true
    [statement] ++x;

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


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

একটা জিনিষ যেমন একটি স্পষ্ট মার্কার ছাড়া দুটি পৃথক syntaxes আছে মনে আসে যে, হবে উদাহরণস্বরূপ: বল বিবৃতি (তাই পরিবর্তে ইউনিকোড প্রতীক ব্যবহার করতে forআপনি অক্ষর কিছু ইউনিকোড প্রকরণ ব্যবহার করতে চাই f, oএবং r), এক্সপ্রেশন হতে সময় শুধুমাত্র এএসসিআইআই।


2
একটি ল্যাঙ্গুয়েজ আসলে বিদ্যমান যেমন একটি অভিব্যক্তি বিবৃতি মার্কার ব্যবহার করে: আপনি তার পার্শ্ব প্রতিক্রিয়া জন্য একটি মান নির্ণয় করা চান, আপনি স্পষ্টভাবে প্রয়োজন discardনিম তার মান । তবে, এটি কেবল প্রকারের সুরক্ষার জন্য সম্পন্ন হয়েছে, সিনট্যাকটিক কারণে নয়।
আমন

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

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

1
80 এর দশকে খুব জনপ্রিয় একটি ভাষা রয়েছে যা পেরেন, ব্রেসেস, কোলন বা অন্য কোনও মার্কার ছাড়াই ব্লক করে এবং সর্বত্র বিবৃতি হিসাবে অভিব্যক্তি গ্রহণ করে এবং কিছু বিবৃতি অভিব্যক্তির মতো কাজ করে (যৌগিক অপারেটরগুলি যেমন + = এবং ++)। এটি আরও খারাপ, কম্পাইলারের আগে একটি বোবা প্রসেসর রয়েছে ( ?উদাহরণস্বরূপ পিপির পরে সিম্বল একটি ফাংশন)। নেই ;। অবশ্যই, ধারাবাহিকতা রেখার জন্য এটির চিহ্নিতকারী প্রয়োজন তবে এটি নিরুত্সাহিত। harbour.github.io/doc/clc53.html#if-Cmd । সংকলকটি দ্রুত এবং সহজ (বাইসন / ফ্লেক্স দিয়ে তৈরি)।
ম্যানেরো

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

10

সি-পারিবারিক ভাষার জন্য এই বন্ধনীগুলির প্রয়োজনীয়তা সাধারণ, তবে সর্বজনীন নয়।

পার্ল 6 এর আরো লক্ষণীয় অন্বিত পরিবর্তন হল যে তারা ব্যাকরণ পরিবর্তিত যাতে আপনি প্রথম বন্ধনী প্রায় দিতে হবে না if, forএবং অনুরূপ বিবৃতি 'শর্ত। পার্ল 6 এ এর ​​মতো কিছু পুরোপুরি বৈধ:

if $x == 4 {
    ...
}

যেমনটি

while $queue.pop {
    ...
}

তবে এগুলি কেবলমাত্র এক্সপ্রেশন হিসাবে আপনি চাইলে আপনি তাদের চারপাশে বন্ধনী স্থাপন করতে পারেন, সেক্ষেত্রে তারা সি, সি #, জাভা ইত্যাদির মতো বাক্য গঠনের প্রয়োজনীয় অংশের পরিবর্তে কেবল সাধারণ গোষ্ঠীগুলি are

মরিচা এই বিভাগে পার্ল 6 এর অনুরূপ সিনট্যাক্স রয়েছে:

if x == 4 {
    ...
}

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


যদিও আপনার উত্তরটি অন্য ভাষাগুলিতে কিছুটা অন্তর্দৃষ্টি জোগায়, এটির উত্তর দেয় না "এই অদ্ভুত বাক্য গঠন কেন বিদ্যমান এবং কেন এটি এত সাধারণ?"

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

পার্ল 5 এ উভয়ই রয়েছে। ব্লক সহ একটি সাধারণ if বা লুপ কনস্ট্রাক্টসের জন্য, প্যারেনগুলি প্রয়োজন, যেমন মধ্যে if ( $x == 4 ) { ... }বা foreach my $foo ( @bar ) { ... }। পোস্টফিক্স স্বরলিপি ব্যবহার করা হলে প্যারেন্সগুলি alচ্ছিক, যেমন return unless $foo;বা তেমন ++$x while s/foo/bar/g;
সিমবাচ

6

এর মধ্যে একটি দিক রয়েছে যা আমি অবাক হয়ে বলছি যে বিদ্যমান উত্তরগুলির কোনওটিই সামনে আসে নি।

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

এটি আপনাকে পছন্দ মতো জিনিস লিখতে দেয়

if (x = getValue() == 42) { ... }

অথবা

if (x == y = 47) { ... }

অথবা

unsigned int n = 0 /* given m == SOME_VALUE */;
while (n < m && *p1++ = *p2++) { n++; }

(যা স্পষ্টভাবে বিবেচনা করা হয় while (n < m && *p1++ = *p2++ != 0) { n++; }কারণ সি অ-শূন্যকে সত্য হিসাবে গণ্য করে; ঘটনাক্রমে, আমি মনে করি এটি কেবল স্ট্যান্ডার্ড লাইব্রেরিতে স্ট্রান্সপি () এর সম্পর্কে)

অথবা এমনকি

if (x = 17);

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

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

প্যারেন্টেসিস ফাংশন আর্গুমেন্ট থেকে ফাংশন নামগুলি সীমিত করতে ব্যবহৃত হয়েছিল, তাই আমার ধারণা যে কীওয়ার্ড আর্গুমেন্ট থেকে কীওয়ার্ডগুলি সীমিত করতে তারা প্রাকৃতিক পছন্দ বলে মনে হয়েছিল।

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

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


5

কারণটি বেশিরভাগ ইতিহাস।

প্রথম সি সংকলকটি যখন লেখা হয়েছিল, কম্পিউটারগুলিতে খুব সীমাবদ্ধ র‌্যাম, সিপিইউ এবং সংকলক রয়েছে যেখানে সংকলক লেখকদের সহায়তার জন্য কয়েকটি সরঞ্জাম সহ "হাতে হাতে" লেখা আছে। সুতরাং জটিল নিয়মগুলি একটি সংকলকটিতে প্রয়োগ করা ব্যয়বহুল ছিল । সি ++, সি #, জাভা ইত্যাদি সমস্তই সি প্রোগ্রামারদের শেখার জন্য সহজ করার জন্য তৈরি করা হয়েছিল , সুতরাং কোনও "অপ্রয়োজনীয়" পরিবর্তন করা হয়নি।

'সি লাইক' ভাষায় শর্তসাপেক্ষে ( if, while, etc) স্পষ্টভাবে blockঅফ কোডের প্রয়োজন হয় না , আপনি কেবল একটি সাধারণ বিবৃতি ব্যবহার করতে পারেন।

if (a == d) doIt()

অথবা আপনি একটি মধ্যে একসঙ্গে বিবৃতি একত্রিত করতে পারেন compound statementতাদের সঙ্গে রেখে{}

আমরা সংস্থাপকটি পছন্দ করি যাতে আমরা ত্রুটি করি এবং এটি বুঝতে পারি এমন ত্রুটি বার্তা হিসাবে দিতে পারি।


3

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

এই কারণেই এই সমস্ত ভাষাগুলির এই বিবৃতিগুলির শর্তের চারপাশে বন্ধনীগুলির প্রয়োজনীয়তার কারণ হ'ল সি করে, এবং প্রশ্নটি সত্যই ঠিক কেন সি-র এই বন্ধনীগুলির প্রয়োজন।

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

কেউ এটিও অনুমান করতে পারে যে কম অক্ষর ব্যবহার করে প্রোগ্রাম লেখার দক্ষতাকে একটি সুবিধা হিসাবে বিবেচনা করা হয়েছিল, এবং দুটি প্যারেন্যাসিসগুলি THENসেই সময়কার ফরটারান এবং অন্যান্য উচ্চ-স্তরের ভাষায় ব্যবহৃত কীওয়ার্ডের চেয়ে কম স্থান নেয় ; প্রকৃতপক্ষে, যেহেতু প্রথম বন্ধনীর চিহ্নগুলি স্থানের স্থানগুলি প্রতীকগুলির ডেলিমিটার হিসাবে প্রতিস্থাপন করতে পারে, if(a==b)তার চেয়ে কম চারটি অক্ষর ছিল IF a==b THEN

যে কোনও ইভেন্টে, মানুষ সিতে লিখিত প্রোগ্রামগুলি সহজেই পড়তে, লিখতে এবং বুঝতে সক্ষম হতে পারে, কোনও সংকলক কত সহজেই সিটিতে লিখিত প্রোগ্রামগুলি পার্স করতে এবং সংকলন করতে পারে এবং কত কিলোবাইট (!) এর মধ্যে কিছুটা ভারসাম্য বজায় রাখতে হয়েছিল between প্রোগ্রাম উত্স এবং সংকলক নিজেই উভয় জন্য প্রয়োজন হবে। আর শর্ত প্রায় প্রথম বন্ধনী if, whileএবং switch বিবৃতি ছিল লোকেরা কীভাবে সি নকশা যে ভারসাম্য বজায় রাখতে বেছে নেওয়া হয়েছে

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


আমি নিশ্চিত নই যে এ কথাটি ঠিক নয় যে সি ++ ঠিক সেভাবে ডিজাইন করা হয়েছিল "সেই প্রোগ্রামারদের একটি নতুন ভাষা ব্যবহার করার জন্য" এইভাবে তৈরি করা হয়েছিল "। ক্লাস সহ সি মনে আছে ?
একটি সিভিএন

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

@ মাইকেলKjörling আমি মনে করি যে আমার উত্তরটির মূল শব্দটি বোঝায় যে ভাষা নকশাটি আসলে তার চেয়ে বেশি "নকশা" ছিল greater আমি উত্তরটি সম্পাদনা করে স্পষ্ট করে বলতে চেষ্টা করেছি যে এটি কেবলমাত্র একটি জিনিস যা ভাষার নকশায় রূপান্তরিত হয়েছিল।
ডেভিড কে

3

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

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

না, অস্পষ্টতা প্রথম বন্ধনীর কারণ নয়। আমি অনুমান করি যে কোনও একটি সি এর একটি সংস্করণ তৈরি করতে পারে যা শর্তের আশেপাশে প্রথম বন্ধনীর প্রয়োজন হয় না (সুতরাং এগুলি alচ্ছিক করে তোলে) এবং যা এখনও সব ক্ষেত্রে বৈধ কোড তৈরি করে। উদাহরণটির if a ++ b;সমতুল্য if (a) ++b;বা if (a++) b;যতটুকু উপযুক্ত বলে মনে হয় তা হিসাবে ব্যাখ্যা করা যেতে পারে ।

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

এবং প্রকৃতপক্ষে, সি একটি পাস পার্সার ব্যবহার করে পার্সেবল হতে ডিজাইন করা হয়েছিল। শর্তের আশেপাশে বাধ্যতামূলক বন্ধনীগুলির সাথে একটি বাক্য গঠন ব্যবহার করা এই দিকটিকে সমর্থন করে।


আমি আমার উত্তরে একটি ডাউনভোট দেখছি। আপনি এটি সম্পর্কে কি পছন্দ করেন না একটি মন্তব্যে ব্যাখ্যা করার জন্য দয়া করে বিনীত হন। সম্ভবত আমি তখন এটি উন্নতি করতে পারেন।
Alfe

0

ফোর্টরান if, কোবল, পিএল / 1, আলগোল, অ্যালগো -68, পাস্কাল, মডুলা, এক্সপিএল, পিএল / এম, এমপিএল, ... বা কোনও thenকীওয়ার্ড থাকা অন্য কোনও ভাষায় অবস্থার আশেপাশের প্যারেন্টিসগুলির প্রয়োজন হয় না । নিম্নলিখিত থেকে thenসীমানা পরিবেশন করে ।conditionstatement

সি ইত্যাদিতে বন্ধ হওয়া বন্ধনীগুলি এর মতো কাজ করে thenএবং প্রারম্ভিকটি আনুষ্ঠানিকভাবে অপ্রয়োজনীয়।

উপরোক্ত মন্তব্যগুলি প্রথাগতভাবে পার্স করা ভাষাগুলিতে প্রযোজ্য।


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