Ptionচ্ছিক সেমিকোলন


10

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

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

এর পিছনে ডিজাইনের সিদ্ধান্তগুলি কী কী? আমি বুঝতে পারি যে একই লাইনে একাধিক বিবৃতি লেখার সময় সেমিকোলনগুলি অপরিহার্য, তবে এগুলি বাধ্যতামূলক করার জন্য (সি অনুসরণ করা বাদ দিয়ে) অন্য কোনও কারণ আছে কি?


1
আপনার স্টেটমেন্ট টার্মিনেটর (পার্ল, সি) এবং স্টেটমেন্ট ডিলিমেটারগুলি (জাভাস্ক্রিপ্ট, পাস্কাল) সম্পর্কে ভাবতে হবে।

5
পাইথনে, সেমিকোলনগুলি একই লাইনে একাধিক বিবৃতি পৃথক করতে ব্যবহৃত হতে পারে। এবং যেহেতু একটি "খালি" বিবৃতি অনুমোদিত, বেশিরভাগ বিবৃতি শেষে অর্ধিকোলন ব্যবহার করা যেতে পারে।
গ্রেগ হিউগিল 21

1
I understand that semicolons are essential when writing multiple statements on the same line- ভাষার উপর নির্ভর করে। আমার পছন্দসই ব্যক্তির এ জাতীয় কোনও ডিলিমিটার নেই, পরবর্তী ক্রিয়াকলাপটি সমস্ত ফাংশন আর্গুমেন্ট ব্যবহার করা হয়ে গেলে শুরু হয়।
ইজকাটা

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

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

উত্তর:


24

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

যে ভাষা ডিজাইনাররা তাদের alচ্ছিক করে তুলেছেন তারা বৃহত্তর সিনট্যাক্টিক নমনীয়তার পরিবর্তে অস্পষ্টতার সাথে বাঁচতে বেছে নিয়েছেন।


7
পুনঃটুইট এটি করার এক, সুস্পষ্ট উপায় এবং একমাত্র হওয়া উচিত। ঘটনাচক্রে, পার্লে এটি করার একমাত্র উপায় আছে way

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

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

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

1
@ ম্যাসিজে পাইচোটকা - অবশ্যই এটি যেহেতু সত্যিই সর্বজনীন সম্মেলন ছিল না - আলগোল-পারিবারিক ভাষাগুলির অর্থ এই নয় যে অন্যান্য ভাষাগুলি সেটির তুলনায় নিজেদেরকে সংজ্ঞায়িত করে, সুতরাং আমার "ফেলে দেওয়া" দাবিটি সেই অর্থে ভুল - তবে সবকিছুর সাথে সি-পারিবারিক ভাষাগুলি আজকাল কিছুটা মনে হয় feels
স্টিভ 314

15

জাভাস্ক্রিপ্ট আমাদের দেখিয়েছে যে এটি খুব খারাপ ধারণা। উদাহরণ স্বরূপ:

return
0;

সি-তে, এটি 0 এর মান দেয় Java জাভাস্ক্রিপ্টে, এটি ফিরে আসে undefinedকারণ রিটার্ন স্টেটমেন্টের পরে একটি সেমিকোলন sertedোকানো হয়, এবং অবিলম্বে স্পষ্ট হয় না যে আপনি কেন স্বয়ংক্রিয় সেমিকোলন সন্নিবেশের বিশদ সম্পর্কে জানতে না পারলে আপনার কোডটি কেন ভেঙে যাচ্ছে।


1
@ ডেলানন: পাইথন সি এর মতো দেখতে ডিজাইন করা হয়নি এটি ইন্ডেন্টেশন ভিত্তিক এবং এটি অত্যন্ত লাইন-ভিত্তিক হিসাবে সুপরিচিত এবং এটির জন্য সেমিকোলন প্রয়োজন হয় না। জাভাস্ক্রিপ্ট টেকনিক্যালি করে তাদের প্রয়োজন; এটি একটি নিখোঁজ পাওয়া গেলে এটি একটি সন্নিবেশ করানো হয়, যা সিনট্যাক্টিক্যালি বৈধ বিবৃতিটির মতো দেখতে সম্পূর্ণ ভিন্ন শব্দার্থবিজ্ঞানের সাথে দুটি স্বতন্ত্র বিবৃতিতে রূপান্তর করে।
ম্যাসন হুইলারের

7
এটি কোনও খারাপ ধারণা নয়, এটি কেবলমাত্র এমন লোকদের জন্যই বিভ্রান্ত হয় যারা জাভাস্ক্রিপ্টটি ব্যবহার করার চেষ্টা করে এটির স্বয়ংক্রিয় সেমিকোলন সন্নিবেশ সম্পর্কে শিখতে বিরত না করে । সম্ভবত "এটি একটি খুব খারাপ ধারণা" বলার পরিবর্তে আপনি আরও সঠিকভাবে বলতে পারেন "সেমিকোলনগুলি alচ্ছিকভাবে তৈরি করা প্রোগ্রামারদের জন্য ক্ষতির পরিচয় দেয় যারা বাইরে যান না এবং সমস্ত বিবরণ শিখেন না"।
তেহশ্রাইক

4
@ ডেলানান: এটি অবাক করার কারণ হ'ল জাভা স্ক্রিপ্ট সাধারণত কোনও লাইনের শেষে একটি অর্ধপরিমাণ প্রবেশ করায় না , অন্যথায়-অবৈধ প্রোগ্রামটি সংশোধন করে। এর পরে returnজাভা স্ক্রিপ্ট একটি সেমিকোলন সন্নিবেশ করবে যেখানে প্রোগ্রামটি বৈধ হবে না কেন কেবল মুষ্টিমেয় কয়েকটি ক্ষেত্রে। (তবে অবশ্যই, এটি ম্যাসন হুইলারের বক্তব্যকে ক্ষুন্ন করে The সমস্যাটি সেমিকোলনগুলি
alচ্ছিক

6
@TehShrike: সেমিকোলন তৈরীর জন্য ঐচ্ছিক প্রবর্তন ফাঁদ সব প্রোগ্রামারদের, কারণ এটি ইচ্ছামত ব্যাখ্যা টাইপস আপনাকে জিজ্ঞাসা আপনি কি বোঝানো পরিবর্তে। প্রত্যেকে এখনই টাইপ তৈরি করে।
জান হুডেক

1
জাভাস্ক্রিপ্ট দেখিয়েছে যে এটির implementationচ্ছিক অর্ধবৃত্তগুলির প্রয়োগ ত্রুটিযুক্ত। এটি দেখায় না যে optionচ্ছিক সেমিকোলনগুলি প্রতি সেজে খারাপ।
কোডসইনচওস

4

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

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

উদাহরণস্বরূপ, সি স্টেটমেন্টের নিম্নলিখিত সিরিজের সেমিকোলনগুলি .োকানোর চেষ্টা করুন।

functionCall(3, 4) 9 + (3 / 8) variable++ while(1) { printf("Hello, world\n") }

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


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

3

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

functionCall(3, 4) 9 + (3 / 8) variable++ while(1) { printf("Hello, world\n") }

কল্পনা করুন আপনি একটি অতিরিক্ত খোলা পেরেন টাইপ করেছেন:

functionCall((3, 4) 9 + (3 / 8) variable++ while(1) { printf("Hello, world\n") }

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

functionCall((3, 4);  <- something is wrong here. emit error and keep going.
                      9 + (3 / 8); variable++; while(1) { printf("Hello, world\n"); }

এখন পার্সারের পক্ষে ত্রুটির প্রতিবেদন করা আরও সহজ এবং লাইন / কলামটি যেখানে ঘটেছে তা সনাক্ত করা সহজ।


1
ফোর্টরান এবং বেসিক কমপক্ষে শালীনভাবে লাইন-ধারাবাহিকতা চিহ্নিতকারী (যথাক্রমে & এবং _) বেছে নিয়েছে। নিখুঁত "" ওএমজি এর জন্য তারা কী ভাবছিল ", কিছুই
ফক্সপ্রকে

2

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

--One statement per line
x = 1
y = 2

--Multiple statements per line
x = 1 y = 2

--You can add semicolons if you want but its just for clarity:
x = 1; y = 2

0

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

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