বেশিরভাগ প্রোগ্রামিং ল্যাঙ্গুয়েজ এমনভাবে ডিজাইন করা হয়েছে যা কোনও সংখ্যার সাথে শুরু হওয়া কোনও সনাক্তকারী হিসাবে ঘোষণা করতে দেয় না। আমি কারণ জানতে শুধু কৌতূহল ছিল। আমি ইতিমধ্যে ওয়েবে অনুসন্ধান করেছি, তবে সন্তোষজনক ব্যাখ্যা খুঁজে পাই না।
বেশিরভাগ প্রোগ্রামিং ল্যাঙ্গুয়েজ এমনভাবে ডিজাইন করা হয়েছে যা কোনও সংখ্যার সাথে শুরু হওয়া কোনও সনাক্তকারী হিসাবে ঘোষণা করতে দেয় না। আমি কারণ জানতে শুধু কৌতূহল ছিল। আমি ইতিমধ্যে ওয়েবে অনুসন্ধান করেছি, তবে সন্তোষজনক ব্যাখ্যা খুঁজে পাই না।
উত্তর:
সি / সি ++ এ, কোনও অক্ষরের পরে সংখ্যার সংখ্যার ধ্রুবক হিসাবে বিবেচনা করা হয় এবং স্ট্রিংটি অনুসরণ করে, ধ্রুবকের প্রকারকে যোগ্য করে তোলে। সুতরাং উদাহরণস্বরূপ (এগুলি ভিসি ++, তারা কতটা মানক তা নিশ্চিত নয়):
সুতরাং ক) ড্যানিয়েল যেমন বলেছিলেন তেমন লেক্সারের পক্ষে এটি আরও সহজ তবে খ) এটি 0 0 এর পরিবর্তনশীল হতে পারে তবে 0u কখনও হয় না বলে এটি একটি স্পষ্ট পার্থক্য করে । প্লাসের অন্যান্য যোগ্যতা যেমন "আই 6464" এর পরে "এল" বা "ইউ" এর চেয়ে যুক্ত করা হয়েছিল এবং তারা প্রয়োজনে আরও সংযোজনের বিকল্পটি উন্মুক্ত রাখতে চান।
জনগণের সুবিধাগুলি লেজার প্রয়োগ করছে। (না, গুরুত্বের সাথে, এটি এ সম্পর্কে Various বিভিন্ন ভাষার অন্যান্য কারণ রয়েছে, তবে শেষ পর্যন্ত তা নেমে আসে))
0flu
আক্ষরিক এবং 0glu
স্থানীয় সনাক্তকারী হয়।
int 0u = 5; unsigned int x = 0u;
তবে আপনি এই কোডটির ব্যাখ্যা সংজ্ঞায়িত করতে বেছে নিয়েছেন (সম্ভবত x == 0 বা x == 5), মানুষ বিভ্রান্ত হতে চলেছে অস্পষ্টতার কারণে এইভাবে সংকলকটি প্রয়োগ করা তুচ্ছ হলেও, একজন ভাল ডিজাইনার সম্ভবত এটি না করে।
নিম্নলিখিত 2 টি মামলা বিবেচনা করুন:
ধরে নিই যে একটি শনাক্তকারী একটি সংখ্যা দিয়ে শুরু করতে পারে।
সুতরাং নীচের মতো একটি বিবৃতি বৈধ হবে (যেহেতু কোনও সনাক্তকারীতে 1 বা আরও বেশি অক্ষর থাকতে পারে):
int 3;
আমি যখন কোনও প্রোগ্রামে উপরের ভেরিয়েবলটি ব্যবহার করার চেষ্টা করি, এর ফলে সংকলক অস্পষ্ট হয়ে যাবে:
int 3, a;
3 = 5;
একটি = 3;
বিবৃতিতে a=3
3 এর ভূমিকা কী (এটি 5 এর মান সহ একটি পরিবর্তনশীল বা এটি 3 সংখ্যাটি)?
উপরের উদাহরণটির বিপরীতে, ধরে নেওয়া যাক যে কোনও ভাষা আসলে সংখ্যা দিয়ে শুরু করে শনাক্তকারীদের মঞ্জুরি দেওয়ার সময় অংকগুলি সনাক্তকারী হিসাবে ব্যবহার করার অনুমতি দেয় না। এটি নিম্নলিখিত সমস্যার কারণ হতে পারে:
ভেরিয়েবল সম্পর্কিত ভাষার নিয়ম যা বলে যে একটি ভেরিয়েবল 1 বা ততোধিক অক্ষর নিয়ে গঠিত হতে পারে তাকে একটি জটিল নিয়মে নতুন সংজ্ঞা দিতে হবে: ভেরিয়েবলের এক বা একাধিক অক্ষর থাকতে পারে এবং যদি এটি সংখ্যার সাথে শুরু না হয় তবে অবশ্যই অনন্য হতে হবে সংখ্যা (ইত্যাদি ..) দিয়ে শুরু করার সময় এটি একক অক্ষরের দৈর্ঘ্যের হতে পারে না
সমস্ত সংখ্যক (যেমন 333) এবং বৈধ বর্ণমালা প্রত্যয় (যেমন 34 এল) ভেরিয়েবলের নাম হিসাবে ব্যবহার করা হচ্ছে তখন সংকলকটিকে ত্রুটির ক্ষেত্রেগুলি পরীক্ষা করতে হবে এবং প্রতিবেদন করতে হবে। পাইথন এবং জেএসের মতো আলগাভাবে টাইপ করা ভাষাগুলিতে যেখানে আপনি ফ্লাইতে ভেরিয়েবলগুলি না জানিয়েই ব্যবহার করতে পারেন, সমস্ত সংখ্যার সাথে জড়িত বিশেষ কেসগুলি পরীক্ষা করা এমনকি অসম্ভব if (33==5)
হতে পারে উদাহরণস্বরূপ, এখানে 33 টি ভ্রান্ত অঘোষিত ভেরিয়েবল হতে পারে যা ব্যবহারকারী ঘোষণা করেছেন। তবে সংকলক এটি সনাক্ত করতে এবং ত্রুটির প্রতিবেদন করতে সক্ষম হবে না।
এই সীমাবদ্ধতা তৈরি করা প্রোগ্রামারকে সনাক্তকারী নাম হিসাবে নম্বর ব্যবহার করা থেকে বিরত রাখবে।
int char = float
হবে?
int
একটি কীওয়ার্ড এবং সনাক্তকারী নয় তা কীভাবে জানতে পারে ? ঠিক আছে, int
নামিক লেক্সেমির মতো উচ্চতর প্রাধান্য রয়েছে।
int 3,a; 3=5; a=3;
বিবৃতিতে a = 3, 3 কী সনাক্তকারী হিসাবে বা একটি সংখ্যা হিসাবে ব্যাখ্যা করা হয়? এটি দ্ব্যর্থহীনতার কারণ হয়। আশা করি এটা পরিষ্কার হয়ে গেছে।
সংকলক লেখকদের পক্ষে এটি সহজ করে তোলা এবং দক্ষতা পার্সিংয়ের সাথে বেশিরভাগ অংশের কিছুই করার নেই, তবে স্পষ্টভাবে পাঠযোগ্য এবং দ্ব্যর্থহীন কোডকে উত্সাহিত করে এমন একটি সিনট্যাক্স ডিজাইনিংয়ের সাথে আরও অনেক কিছু করা যায়।
তার ভাষা ডিজাইনার ভেবেছিলাম এটা যেমন শুধু সাধারণ সংখ্যা 1 টি পছন্দ সাংখ্যিক লিটারেল লিখতে পাবে চমৎকার হবে 1 ।
কোনও ভাষার সিনট্যাক্স ডিজাইন করা বেশ সম্ভব হবে যেখানে সংখ্যার আক্ষরিক উদাহরণটি টিল্ডাসের জন্য কিছু উপায়ে উদ্ধৃত করা হয়েছিল সুতরাং এক নম্বর সংখ্যার জন্য সংখ্যাগত আক্ষরিককে ~ 1 enc হিসাবে এনকোড করা হয়েছিল এবং কোন শব্দটি নয় এবং উদ্ধৃতিতে আবদ্ধ নয় এমন একটি পরিবর্তনশীল নাম হিসাবে গণ্য হত ।
সুতরাং আপনি যেমন বিবৃতি কোড করতে পারে:
1 = ~2~
two = 1 * ~2~
তবে এছাড়াও:
2 = ~3~
six = 2 + 2
আপনি যে বাক্য গঠনটি দ্বিধাহীন এবং কোড অনুসরণ করা কঠিন তা বেছে নেবেন না।
সি ভাষা এবং বেশিরভাগ "কোঁকড়ানো বন্ধনী" সি থেকে অবতীর্ণ ভাষাগুলি প্রোগ্রামারদের সরাসরি অক্টাল এবং হেক্সাডেসিমাল লিটারাল কোড করার অনুমতি দেয় এবং এটি গুরুত্বপূর্ণ হলে আক্ষরিক প্রকারটি নির্দিষ্ট করে দেওয়ার পক্ষে এটি একটি ভাল ধারণা বলে মনে হয়েছিল। সুতরাং
010 // Octal 10 = 8;
0x10 // Hexadecimal 10 = 16;
5l // long integer with decimal value 5
2.0d // double float with value 2
সুতরাং আপনি যদি ভেরিয়েবলের নাম সংখ্যা এবং বর্ণের সংমিশ্রণের পরে কোনও সংখ্যার সাথে শুরু করার অনুমতি দিয়ে থাকেন তবে অন্তত একটি অক্ষর অন্তর্ভুক্ত থাকে তবে আপনি প্রদত্ত গোষ্ঠীটি একটি ভেরিয়েবল নাম বা একটি সংখ্যার আক্ষরিক গঠিত কিনা তা নির্ধারণের সমস্যায় প্রোগ্রামারকে উপস্থাপন করবেন
2lll = 22 // OK
2ll = 2 // compiler error
এই ধরনের অস্পষ্টতা কাউকে প্রোগ্রাম লিখতে বা পড়তে সহায়তা করে না।
একটি ঘনিষ্ঠভাবে সম্পর্কিত বাস্তব বিশ্বের উদাহরণের জন্য আপনি PL / 1 ভাষার দিকে নজর রাখতে পারেন যার ডিজাইনাররা ভেরিয়েবলের নাম হিসাবে কীওয়ার্ড ব্যবহার করতে সক্ষম হবেন বলে একটি ভাল ধারণা ছিল যাতে:
IF THEN THEN THEN = ELSE; ELSE ELSE = THEN;
IF IF THEN ELSE = IF; ELSE THEN = ELSE;
DO WHILE (WHILE = DO); END = WHILE + DO; END;
বৈধ কোড যা সংকলন এবং কার্যকর করে।
পরবর্তী ভাষাগুলি কীভাবে ডিজাইন করা হয়েছিল তাতে ফোর্টরান একটি বিশাল প্রভাব ফেলেছিল। শুরুর দিকে (এর পরে কিছু সমস্যার সমাধান হয়ে গেছে) আপনি কোনও সনাক্তকারীকে কী নাম দিতে পারেন তা সীমাবদ্ধ করে ফোর্টরানের প্রায় কোনও নিয়ম ছিল না। কম্পাইলার এবং প্রোগ্রামার উভয়ের পক্ষে এই ভাষাটিকে পার্স করা অত্যন্ত কঠিন করে তুলেছিল। এখানে একটি ক্লাসিক উদাহরণ:
if if .eq. then then = else else else = endif endif
K I K K I I K I I K
এখানে আমি কে এবং শনাক্তকারীদের (ভেরিয়েবলের নাম) "ভাষার মূল শব্দগুলি" চিহ্নিত করেছি spe বানানটির কোনও পার্থক্য না থাকায় আমি মনে করি আপনি সম্ভবত বুঝতে পারবেন এটি কতটা বিভ্রান্তিকর হতে পারে। অবশ্যই, এটি একটি চূড়ান্ত উদাহরণ, এবং এটি উদ্দেশ্যপ্রণোদিত হয়ে কেউ এর মতো কোডটি কখনও লেখেনি unlikely কখনও কখনও মানুষ করেনি এবং মামলা একটি সহজ টাইপো কোড ভাষা বৈশিষ্ট বলেন যে এই পথ পার্স করা উচিত, যদিও এটি আদৌ দেয়ার উদ্দেশ্যে করা হয় নি হতে পারে অনেকটা মধ্যে - আইডেন্টিফায়ার নাম যদিও হিসাবে "রিসাইকেল" ভাষা মূল শব্দ। অন্য একটি সুপরিচিত উদাহরণের জন্য, এটি তুলনা করুন:
do 10 i = 1,10
এটি:
do 10 i = 1.10
প্রথমটি একটি ল লুপ - 10 বার কোডের একটি ব্লককে পুনরাবৃত্তি করে। দ্বিতীয়টি, তবে কমাটি দশমিক বিন্দুতে পরিবর্তিত হয়েছিল, সুতরাং এটি 1.10
নামের একটি ভেরিয়েবলের মান নির্ধারণ করে do 10 i
।
এর অর্থ এইও ছিল যে ফোর্টরান পার্সার লেখা তুলনামূলকভাবে কঠিন ছিল - আপনি নিশ্চিত হতে পারবেন না যে do
লাইনটির প্রারম্ভের শুরুতে সত্যই একটি মূল শব্দ ছিল যতক্ষণ না আপনি লাইনটির শেষে পৌঁছেছেন এবং যাচাই করা হয়েছে যে অন্য সমস্ত উপাদান do
লুপ উপস্থিত ছিল। পার্সারটিকে সাধারণত "ব্যাকট্র্যাক" করার জন্য প্রস্তুত থাকতে হয়েছিল, শুরু থেকেই লাইনটি পুনরায় পার্সিং করে সত্যিকার অর্থে কী ছিল তার "সঠিক" (তবে প্রায়শই অনিচ্ছাকৃত) উত্তরে আসতে হয়েছিল।
এর কয়েক বছর পরে, ভাষা ডিজাইনাররা (তাদের বেশিরভাগ ক্ষেত্রেই) বিপরীত চরমের দিকে এগিয়ে গেল - ব্যবহারকারীরা খুব বেশি অভিযোগ না করে ভাষা সম্পর্কে যতটা সম্ভব সীমাবদ্ধ করে দেয় ।
প্রারম্ভিক বেসিক, উদাহরণস্বরূপ, মূলত বলেন আপনি এমনকি একটি কী শব্দ ব্যবহার করতে পারছিল না অংশ একটি শনাক্তকারীর - উদাহরণস্বরূপ, fora=1
যেমন পার্স করা হবে for a = 1
(যেমন, শুরুতে for
লুপ, না একটি কাজ)। এটি স্পষ্টতই যথেষ্ট অভিযোগ উত্পন্ন করেছিল যে এটি খুব বেশি দিন স্থায়ী হয়নি। একটি অঙ্ক দিয়ে একটি শনাক্তকারী শুরু করার নিয়ম স্পষ্টতই প্রচুর অভিযোগ উত্পন্ন করেনি, তাই এটি ব্যবহার করা অব্যাহত রয়েছে (কমপক্ষে বেশিরভাগ ভাষায়)।
সম্ভবত এই কনভেনশনটি খুব প্রাথমিক ইতিহাসের ভাষা নকশার সিদ্ধান্ত থেকে বিকশিত হয়েছে, প্রাথমিক যন্ত্রগুলিতে লেক্সিকাল বিশ্লেষণ সহ পুরো সংকলকটি কয়েক কিওয়ার্ডে চলতে হয়েছিল, বর্তমান মোবাইল ডিভাইসে কেবল প্রথম-স্তরের প্রসেসরের ডেটা ক্যাশে তুলনায় কম মেমরি, সুতরাং অনুমোদিত ভেরিয়েবলের নামগুলি খুব সীমাবদ্ধ ছিল এবং খুব কম ওপ কোডে সংখ্যার ধ্রুবক থেকে আলাদা হওয়া সহজ ছিল।
সুতরাং, সম্মেলনটি প্রজন্মের প্রজন্মের অভ্যস্ত হয়ে ওঠে।
প্রোগ্রামিং ভাষার জন্য এটি কোনও যৌক্তিকভাবে প্রয়োজনীয় নিয়ম নয় বরং অনেক ভাষা ডিজাইনারদের দ্বারা ব্যবহৃত কনভেনশন।
আমি মূলত ভিন্ন ভাষা ডিজাইন করতে পারি যা সনাক্তকারীদের জন্য সমস্ত চরিত্রকে মঞ্জুরি দেয়। সমস্ত কোড লাইনের জন্য, প্রথম ২০ টি অক্ষর বিবৃতি প্রকারটি বর্ণনা করে তারপরে ২০ টি অক্ষর বিবৃতিটির জন্য প্রথম প্রতীকটি সংজ্ঞায়িত করবে এবং পরবর্তী ২০ টি অক্ষর বিবৃতিটির অপারেন্ড করবে। এই ভাষাটি একটি স্ট্যাক প্রসেসরে কার্যকর করা হবে।
01234567890123456789 01234567890123456789 01234567890123456789
decl symbol 12345
assign value 12345 12345
decl symbol 99999
assign value 99999 12345
push 12345
push 99999
add
print top
এই কোডটি সি হিসাবে অনুবাদ করা যেতে পারে নীচে:
int i12345 = 12345;
int i99999 = 12345;
printf("%d", i12345+i9999);
এখানেই শেষ. এটি অর্থহীন এবং নম্বর-না-শনাক্তকারীদের নিয়মটিও যৌক্তিক ভিত্তিতে অর্থহীন।
"লেসারের সুবিধার্থে" পাশাপাশি, "পাঠকের সুবিধার্থে" বিবেচনা করাও উপযুক্ত বলে আমি মনে করি।
কোড পড়ার সময় আপনাকে দ্রুত এবং বারবার শনাক্ত করতে হবে যে শব্দগুলি শনাক্তকারী এবং কোনটি সংখ্যা। শুরুতে ডিজিটের সন্ধান করা আমাদের ভিজ্যুয়াল প্যাটার্ন-ম্যাচিংয়ে আরও সহজ; এটি নিশ্চিত করার জন্য যদি আমাদের সমস্ত চরিত্রটি সাবধানতার সাথে পরীক্ষা করতে হয় তবে এটি একটি কাজ হবে।
এই প্রশ্নের উত্তরটি স্বয়ংক্রিয়তা বা আরও সুনির্দিষ্টভাবে সীমাবদ্ধ অটোম্যাটায় অন্তর্ভুক্ত যা নিয়মিত অভিব্যক্তি সংজ্ঞায়িত করে। নিয়মটি হ'ল ... সংকলকগুলির প্রতিটি পার্স যে অক্ষরকে তারা পার্স করে তা স্থির করতে সঠিক অ্যালগরিদম বা নিয়ম প্রয়োজন। শনাক্তকারীদের যদি কোনও নম্বর দিয়ে শুরু করার অনুমতি দেওয়া হয় তবে সংকলকটি ঠিক হয়ে যাবে.. টোকেন আসার প্রকৃতি সম্পর্কে ... এটি কি কোনও নম্বর বা শনাক্তকারী হবে ... এবং সংকলক হিসাবে আগের অবস্থানে ব্যাকট্র্যাক করতে পারে না .. .স .. তাই কম্পাইলারের কাছে এটি পরিষ্কার করার জন্য যে আগত টোকেন হ'ল একটি শনাক্তকারী বা একটি সংখ্যা ... এই বিধিনিষেধ আছে ... কোজ ... কম্পাইলার কেবল প্রথম অক্ষরটি স্ক্যান করেই জানে যে আগত টোকেন একটি সনাক্তকারী বা একটি নম্বর number