পরিবর্তনশীল নাম সংখ্যা দিয়ে শুরু করা যাবে না কেন?


136

কিছুক্ষণ আগে আমি নতুন সি ++ বিকাশকারীকে নিয়ে কাজ করছি যখন তিনি এই প্রশ্নটি জিজ্ঞাসা করেছিলেন: "পরিবর্তনশীল নাম সংখ্যা দিয়ে শুরু করা যায় না কেন?"

কিছু সংখ্যায় সেগুলির পাঠ্য থাকতে পারে (123456L, 123456U) ব্যতীত আমি কোনও উত্তর আনতে পারিনি এবং এটি সম্ভব হবে না যদি সংকলকরা কিছু পরিমাণে আলফা অক্ষরগুলির একটি ভেরিয়েবলের নাম দিয়ে সবকিছু ভাবছিলেন।

এটা কি সঠিক উত্তর ছিল? আরও কি কোনও কারণ আছে?

string 2BeOrNot2Be = "that is the question"; // Why won't this compile?

15
এবং কেন তাদের মধ্যে স্পেস থাকতে পারে না?
টিম

4
এই সমস্যাটি কমপক্ষে 20 বছরের মধ্যে সি ++ এর পূর্বাভাস দেয়, যদি না প্রথম ম্যাক্রো এসেম্ববলারদের কাছে ফিরে আসে।
কেন সৌম্য

2
ঠিক আছে, FORTH এ, আপনি এটি করতে পারেন। আফাইক, একটি শব্দ আছে যা 0স্ট্যাকের দিকে 0 ঠেলে দেয়। আর একটি হল 0=0 টি স্ট্যাকের মধ্যে রয়েছে কিনা তা যাচাই করে।
ইনগো

12
কেন এই প্রশ্ন এত জনপ্রিয় এবং উত্তর এত ভুল? অনেক ভাষা ভেরিয়েবলকে সংখ্যা দিয়ে শুরু করতে দেয়। সি ++ এটি নয় তবে এটি কেবল একটি সুবিধাজনক সীমাবদ্ধতা যা নির্দিষ্ট অস্পষ্টতা এড়ায়। কখনও কখনও এসও আমাকে সমস্ত ভুল উপায়ে বিস্মিত করে।
ডেভিড.পিএফএক্স

5
যদি আজ এসও-তে এই প্রশ্ন জিজ্ঞাসা করা হয়, তবে এটি মতামত ভিত্তিক এবং নিকটতম হিসাবে আখ্যায়িত হবে। এই জিজ্ঞাসা করার জন্য ধন্যবাদ।
বুন

উত্তর:


116

কারণ তখন অঙ্কগুলির একটি স্ট্রিং একটি বৈধ শনাক্তকারী পাশাপাশি একটি বৈধ সংখ্যা হবে।

int 17 = 497;
int 42 = 6 * 9;
String 1111 = "Totally text";

37
ওয়েল, তারা যদি ভেরিয়েবলগুলি কেবল সংখ্যা হতে পারে না তা বলে। তারপর কি?
পাইরোলিস্টিকাল

6
লেসারের পক্ষে নিয়মটি ব্যবহার করে শনাক্তকারী বাছাই করতে নিয়মিত অভিব্যক্তি প্রকাশ করতে আমার আরও বেশি সময় লাগবে, যদি এটি এমনকি সম্ভব হয়, তবে আমি বুঝতে পারি যে কোনও ভাষায় সেভাবে এখনও কেন প্রয়োগ করা হয়নি, বর্ণিত কারণগুলি ছাড়াও অন্যান্য উত্তর।
skiphoppy

39
যদি এটির সংখ্যা + আলফা হতে হয় তবে আপনি এখনও স্ট্রিং 0x123 = "হ্যালো ওয়ার্ল্ড" করতে পারতেন। আপনি যদি না জানিয়ে থাকেন যে পরিবর্তনশীল নামগুলি হ'ল "সংখ্যাগুলি + আলফা যা বৈধ সংখ্যার উপাধিতে পার্স করে না" এবং এটি কেবল নির্বোধ।
ইওলসন

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

10
@ আইলসন: আমি একটি এসেম্বলারের সাথে কাজ করেছি যা এই নিয়মটি হেক্স সংখ্যায় প্রয়োগ করেছিল যা দিয়ে শুরু হয়েছিল A- Fএবং শেষ হয়েছিল h। বাখের টু পার্ট ইনভেনশন # 13 (যৌক্তিক নাম? Bach) এর জন্য গানের ডেটাতে নির্দেশ করার জন্য কোনও লেবেল সংজ্ঞায়িত করার চেষ্টা করার পরে প্রথমবার আমাকে ছিটিয়ে ফেলল ।
সুপারক্যাট

116

এই সম্পর্কে ভাল চিন্তা করুন:

int 2d = 42;
double a = 2d;

একটি কি? 2.0? বা 42?

ইঙ্গিত, যদি আপনি এটি না পান, d এর পরে একটি সংখ্যার অর্থ হ'ল সংখ্যার আগে ডাবল আক্ষরিক হয়


11
এটি আসলে একটি [তুলনামূলকভাবে] দেরিতে আসার স্বরলিপি ("ডাবল" এর জন্য "ডি"), সি 89 স্ট্যান্ডার্ড আইআইআরসি। সনাক্তকারীগুলিতে শীর্ষস্থানীয় সংখ্যাগুলি যদি ভাষায় হয় তবে এটি সম্ভব হয় না, তবে এটি কারণ সংখ্যাগুলি কোনও সনাক্তকারী শুরু করতে পারে না।
কেন সৌম্য

1
dসি ++ তে কোনও বৈধ ভাসমান আক্ষরিক প্রত্যয় নয়। ভাসমান লিটারালগুলি ডিফল্টরূপে দ্বিগুণ হয়, আপনি ব্যবহার করতে পারেন fবা আপনার lযদি একটি ফ্লোট বা দীর্ঘ ডাবল আক্ষরিক প্রয়োজন হয়।
সিবি বেইলি

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

50

এটি এখন একটি সম্মেলন, তবে এটি প্রযুক্তিগত প্রয়োজন হিসাবে শুরু হয়েছিল।

পুরানো দিনগুলিতে, ফরটারন বা বেসিকের মতো ভাষার পার্সারগুলিকে স্পেস ব্যবহারের প্রয়োজন হয় না। সুতরাং, মূলত, নিম্নলিখিতটি অভিন্ন:

10 V1=100
20 PRINT V1

এবং

10V1=100
20PRINTV1

এখন ধরুন যে সংখ্যার উপসর্গগুলি অনুমোদিত ছিল। আপনি কিভাবে এটি ব্যাখ্যা করবেন?

101V=100

যেমন

10 1V = 100

বা হিসাবে

101 V = 100

বা হিসাবে

1 01V = 100

সুতরাং, এটি অবৈধ করা হয়েছিল।


1
গৌণ নিট: লাইন সংখ্যাগুলি 1-6 কলামে এবং এক্সিকিউটেবল কোডের পরে 8 নম্বর কলামে থাকতে হয়েছিল অন্যদিকে DO 10 I=1,50অস্পষ্টভাবে পার্স করা যেতে পারে DO1 0I=1,50[ঘটনাচক্রে, যদি কোনও কমা পরিবর্তে কোনও সময়কাল ব্যবহার করে, বিবৃতিটি একটি অ্যাসাইনমেন্ট হয়ে যায় ভাসমান-পয়েন্ট ভেরিয়েবলের নামকরণ DO10I
সুপারক্যাট

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

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

42

কারণ সংকলনের সময় লেটিক্যাল বিশ্লেষণে ব্যাকট্র্যাকিং এড়ানো হয়। একটি পরিবর্তনশীল:

Apple;

সংকলক এটি 'শ' অক্ষরটি পূরণ করার সাথে সাথেই এটি সনাক্তকারী জানতে পারবে।

তবে একটি পরিবর্তনশীল:

123apple;

সংকলক সিদ্ধান্ত নিতে পারবে না যে এটি একটি সংখ্যা বা সনাক্তকারী এটি 'এ' হিট না করা পর্যন্ত, এবং ফলস্বরূপ এটির পিছনে ট্র্যাকিংয়ের প্রয়োজন।


2
আমার সংকলক ডিজাইন শ্রেণীর কথা মনে রেখে উত্তর দেওয়ার জন্য, এই উত্তরটি সরাসরি চলে যায়! যশ
nehem

15

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

যে জায়গাগুলিতে স্থান তুচ্ছ (যেমন ALGOL এবং মূল ফোরট্রান যদি আমি সঠিকভাবে মনে করি) সেই কারণগুলির জন্য শনাক্তকারীদের শুরু করতে নম্বরগুলি গ্রহণ করতে পারেনি।

স্টোরেজ বা সংখ্যার ভিত্তিকে বোঝানোর জন্য বিশেষ লক্ষণগুলির আগে - এটি আবার ফিরে যায়।


9

আমি সম্মত হই যে শনাক্তকারীদের একটি অঙ্ক দিয়ে শুরু করার অনুমতি দেওয়া সুবিধাজনক হবে। একজন বা দু'জন লোক উল্লেখ করেছেন যে আপনি আপনার সনাক্তকারীকে আন্ডারস্কোর প্রিভেন্ড করে এই বিধিনিষেধের আশ্বাস পেতে পারেন, কিন্তু এটি সত্যিই কুৎসিত।

আমি মনে করি সমস্যাটির একটি অংশ 0xdeadbeef এর মতো সংখ্যাগুলি থেকে আসে যা একটি অঙ্ক দিয়ে শুরু করতে পারে এমন শনাক্তকারীদের জন্য নিয়মগুলি মনে রাখা সহজ করে তোলে। এটি করার একটি উপায় হতে পারে [এ-জা-জেড _] + এর সাথে মিল থাকা কোনও কিছুর অনুমতি দেওয়া + যা কোনও কীওয়ার্ড বা সংখ্যাটি আক্ষরিক নয়। সমস্যাটি হ'ল এটি 0xdeadpork এর মতো অদ্ভুত জিনিসের দিকে পরিচালিত হতে পারে তবে 0xdeadbeef নয়। পরিশেষে, আমি মনে করি আমাদের সকল মাংসের সাথে ন্যায়বিচার করা উচিত: পি।

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


8
এলএল - "সমস্যাটি হ'ল এর ফলে 0xdeadpork এর মতো অদ্ভুত জিনিসগুলি হতে পারে তবে 0xdeadbeef নয় timate অবশেষে, আমি মনে করি আমাদের সকল খাবারের সাথে ন্যায্য হওয়া উচিত: পি।"
মিঃ-ইউরো

6

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

অন্য বিকল্পটি হ'ল এটি আক্ষরিক নয় কিনা তা যাচাই করা হবে এবং শনাক্তকারীর ডোমেনটিকে মহাবিশ্বের বিয়োগফলকে আক্ষরিক হতে হবে। তবে এটি করতে আপনাকে প্রতিটি টোকেনের প্রতিটি চরিত্র পরীক্ষা করতে হবে এটি কীভাবে শ্রেণিবদ্ধ করা যায় তা জানতে।

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


6

পরিবর্তনশীল নামগুলি একটি অঙ্ক দিয়ে শুরু করতে পারে না, কারণ এটি নীচের মতো কিছু সমস্যা সৃষ্টি করতে পারে:

int a = 2;
int 2 = 5;
int c = 2 * a; 

গ এর মান কত? 4, বা 10 হয়!

আরেকটি উদাহরণ:

float 5 = 25;
float b = 5.5;

প্রথম 5 সংখ্যা, বা একটি অবজেক্ট (। অপারেটর) দ্বিতীয় 5 এর মতো একই সমস্যা রয়েছে।

হতে পারে, আরও কিছু কারণ রয়েছে। সুতরাং, চলক নামের শুরুতে আমাদের কোনও অঙ্ক ব্যবহার করা উচিত নয়।


এমনকি যদি শনাক্তকারীদের কমপক্ষে একটি অ-অঙ্কের অক্ষর থাকতে পারে তবে এটির ক্ষেত্রেও এমন একটি সংখ্যার বিন্যাসের প্রয়োজন হয় যা অক্ষরে অক্ষরে অক্ষরে অক্ষরযুক্ত থাকে [যেমন 0x1234 $ 1234 এবং 1E6 লিখতে হবে 1.E6 বা 1.0E6 হিসাবে] বা অন্যথায় আইনী এবং অবৈধ সনাক্তকারী নামগুলির একটি বিজোড় সংমিশ্রণ রয়েছে।
সুপারক্যাট

4

ভেরিয়েবল নামের শুরু করতে একটি ডিজিটের ব্যবহার সংকলন বা ইন্টারপার্টেশনের সময় ত্রুটি পরীক্ষা করা আরও জটিল করে তোলে।

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

আমি যতদূর মনে করতে পারি (প্রায় ৪০ বছর), আমি মনে করি না যে আমি এমন কোনও ভাষা ব্যবহার করেছি যা ভেরিয়েবলের নাম শুরু করতে কোনও অঙ্ক ব্যবহার করার অনুমতি দেয়। আমি নিশ্চিত যে এটি কমপক্ষে একবার করা হয়েছিল। হতে পারে, এখানে কেউ আসলে এটি কোথাও দেখেছেন।


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

4

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

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

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

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


1
আসলে, এখানে বেশ কয়েকটি ভাষা রয়েছে যা আপনাকে অক্ষর চিহ্নিতকরণ শনাক্তকরণগুলি রাখতে দেয় allow তাদের "সিগিলস" বলা হয় এবং আপনার সেগুলি পার্ল এবং পিএইচপিতে রয়েছে।
জেসন বেকার

আপনি এখনও পিএইচপি-তে কোনও সংখ্যা দিয়ে একটি ভেরিয়েবল নাম শুরু করার অনুমতি না পেয়ে থাকেন - ভাষার নিয়মগুলি এটি নিষিদ্ধ করে। :-) তবে ঠিক একই কারণে আপনি কমপোজ করতে পারেন।
স্ট্যাটিক্সান

4

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


2
লেক্সিং প্রক্রিয়া খুব কমই বাধা হয়। অবশ্যই, এটি সনাক্তকারী টোকেনগুলির জন্য রেজেক্সকে আরও জটিল করে তোলে তবে তারা এখনও সুপার-ফাস্ট ডিএফএ হতে পারে। এগুলির রানটাইম হল অন্যান্য বেশিরভাগ কাজের তুলনায় শিমগুলি বাদাম accomp

4

সীমাবদ্ধতা নির্বিচারে। বিভিন্ন লিসপ সংখ্যার সাথে শুরু করতে প্রতীক নামের অনুমতি দেয়।



2

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

0x, 2 ডি, 5555


এই বিধিনিষেধটি এমন ভাষায় ধারণ করে যেখানে এই ধরণের সিনট্যাক্সের অনুমতি নেই।
জেসন বেকার

2

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

এটি কি ডাইকস্ট্রা না বলেছিলেন যে "কোনও সরঞ্জামের সবচেয়ে গুরুত্বপূর্ণ দিকটি এর ব্যবহারকারীর উপর প্রভাব রয়েছে"?


1

সম্ভবত কারণ এটি একটি সংখ্যা বা সনাক্তকারী এবং traditionতিহ্যের কারণে এটি মানুষের পক্ষে বলা সহজ করে তোলে। একটি অঙ্ক দিয়ে শুরু করতে পারে এমন শনাক্তকারীদের থাকার কারণে লেজিক্যাল স্ক্যানগুলি এত বেশি জটিল করে তুলবে না।

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


জিনিসটি হ'ল ফোরথের সত্যিকার অর্থে খুব পরিশীলিত পার্সার নেই। সত্যই, এটির যত্ন নেওয়ার মতো সমস্ত বিষয় হ'ল যদি কোনও শনাক্তকরণ সাদাটে দুই সেট এর মধ্যে থাকে।
জেসন বেকার

1

মনে করুন আপনি সংখ্যার সাথে প্রতীক নামগুলি শুরু করতে দিয়েছিলেন। এখন ধরুন আপনি কোনও ভেরিয়েবলের নাম 12345foobar রাখতে চান। আপনি কিভাবে 12345 থেকে এটি পার্থক্য করবেন? এটি নিয়মিত প্রকাশের সাথে করা খুব ভয়ঙ্কর নয় difficult সমস্যাটি আসলে পারফরম্যান্সের একটি। কেন এটি দুর্দান্ত বিশদে রয়েছে তা আমি সত্যিই ব্যাখ্যা করতে পারি না, তবে এটি মূলত এই ফোটায় যে 12345foobar থেকে 12345 থেকে আলাদা করার জন্য ব্যাকট্র্যাকিংয়ের প্রয়োজন requires এটি নিয়মিত অভিব্যক্তিটিকে অ-নিরস্ত করে তোলে।

এই একটি অনেক ভালো ব্যাখ্যা এখানে


1
কিভাবে এক একটি রেগুলার এক্সপ্রেশন ডিজাইন একটি পরিবর্তনশীল নামে করার অনুমতি করবে ifqবা doublezনা ifবা double? অঙ্কগুলি দিয়ে শনাক্তকারীদের মঞ্জুরি দেওয়ার মূল সমস্যাটি হ'ল হেক্স লিটারেল এবং ভাসমান-পয়েন্ট সংখ্যাগুলির বিদ্যমান ফর্ম রয়েছে যা সম্পূর্ণরূপে বর্ণানুক্রমিক অক্ষরের সমন্বয়ে থাকে (ভাষাগুলি 0x1234 এর পরিবর্তে 34 1234 বা h'1234 জাতীয় কিছু ব্যবহার করে এবং এর মতো সংখ্যার প্রয়োজন হয়) 1E23 একটি সময়কাল অন্তর্ভুক্ত করার জন্য, সমস্যাটি এড়াতে পারে)। মনে রাখবেন যে রেজেক্স-পার্সিংয়ের সি এর চেষ্টাগুলি ইতিমধ্যে পছন্দ মতো জিনিসগুলিতে ছড়িয়ে যেতে পারে 0x12E+5
সুপারক্যাট

1

সংকলকের পক্ষে সংখ্যার চেয়ে মেমরি লোকেশনে ASCII ব্যবহার করে একটি পরিবর্তনীয় সনাক্ত করা সহজ।


1

সংকলকটির নিম্নরূপ 7 টি পর্যায় রয়েছে:

  1. আভিধানিক বিশ্লেষণ
  2. সিনট্যাক্স বিশ্লেষণ
  3. শব্দার্থবিজ্ঞান বিশ্লেষণ
  4. অন্তর্বর্তী কোড জেনারেশন
  5. কোড অপ্টিমাইজেশন
  6. কোড জেনারেশন
  7. প্রতীক টেবিল

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

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


0

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

প্রশ্ন জিজ্ঞাসার অনুরূপ যে দাবাতে একবারে রাজা কেন চারটি স্থান সরিয়ে নিতে পারবেন না? এটা কারণ দাবা যে একটি অবৈধ পদক্ষেপ। এটা অন্য খেলা নিশ্চিত করতে পারেন। এটি কেবল যে নিয়মগুলি খেলেছে তার উপর নির্ভর করে।


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

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

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

হ্যাঁ, এটির প্রতিফলন করার পরে আমি বুঝতে পেরেছিলাম আপনি কোথায় যাচ্ছেন। তোমার একটা কথা আছে আমি অনুমান করি যে আমি অবাধে অ্যাকামের রেজারটি প্রয়োগ করছিলাম এবং ধরে নেওয়া হয়েছিল যে ভেরিয়েবলগুলি সংখ্যার সাথে কেন শুরু হয় না, কারণ এখানে সংখ্যা নেই কারণ এটির কোনও সঠিক উত্তর নেই।
kemiller2002

আমি বলছি না আপনি ভুল, মন, মাঝেমধ্যে সি ++ স্ট্যান্ডার্ড সংস্থাগুলির সিদ্ধান্ত মারাত্মক বোঝাপড়া ছাড়িয়ে যায় এবং আপনি "পরিণতিতে শেষ করেন কারণ তাদের কিছু সিদ্ধান্ত নিতে হয়েছিল এবং তারা এই সিদ্ধান্ত নিয়েছে"। তবে সেখানে কমপক্ষে একটি প্রশ্ন জিজ্ঞাসা করতে হবে :-)
স্টিভ জেসোপ

0

মূলত এটি কেবল কারণেই সংখ্যাগুলির চেয়ে স্ট্রিং হিসাবে ভেরিয়েবলের নামগুলি মনে রাখা সহজ (তবে আপনি এটি আরও অর্থ দিতে পারেন) যদিও স্ট্রিংয়ের অর্থটি বাড়ানোর জন্য স্ট্রিংয়ের মধ্যে সংখ্যার অন্তর্ভুক্ত করা যেতে পারে বা একই ভেরিয়েবল নামের ব্যবহারের অনুমতি দিতে পারে তবে এটিকে আলাদা, তবে নিকটতম অর্থ বা প্রসঙ্গ হিসাবে চিহ্নিত করা হয়েছে। উদাহরণস্বরূপ লুপ 1, লুপ 2 ইত্যাদি আপনাকে সর্বদা জানতে দেয় যে আপনি লুপে ছিলেন এবং / অথবা লুপ 2 লুপ 1 এর মধ্যে একটি লুপ। ভেরিয়েবল হিসাবে আপনি কোনটিকে (আরও অর্থ) পছন্দ করবেন: ঠিকানা বা 1121298? কোনটি মনে রাখা সহজ? তবে, ভাষাটি যদি বোঝাতে এমন কিছু ব্যবহার করে যে এটি কেবল পাঠ্য বা সংখ্যা নয় (যেমন $ ইন $ ঠিকানা) এটি সংঘটিতকারীকে বলতে পারে যে নিম্নলিখিতটি যা ভেরিয়েবল হিসাবে বিবেচিত হবে ( এক্ষেত্রে).


0

সংকলক দ্বারা সংকলনের সময় চলকটিকে মান হিসাবে বিবেচনা করা যেতে পারে তাই মানটি পুনরাবৃত্তভাবে পুনরায় মানটিকে কল করতে পারে


0

কোডের টুকরোটি সংকলন করার সময় লেটিকাল বিশ্লেষণের পর্যায়ে ব্যাকট্র্যাকিং এড়ানো হয় । অ্যাপলের মতো পরিবর্তনশীল; , সংক্ষিপ্ত বিশ্লেষণের পর্যায়ে অক্ষর 'এ' অক্ষরটি পূরণ করার সাথে সাথে সংকলকটি তার তাত্ক্ষণিকভাবে তাকে জানবে। তবে, 123apple এর মত একটি পরিবর্তনশীল; , সংকলক সিদ্ধান্ত নিতে সক্ষম হবে না এটির একটি সংখ্যা বা সনাক্তকারী এটি 'এ' হিট না হওয়া পর্যন্ত এবং এটি পরিবর্তনশীল কিনা তা সনাক্ত করার জন্য লেক্সিকাল বিশ্লেষণের পর্যায়ে যেতে ব্যাকট্র্যাকিংয়ের প্রয়োজন। তবে এটি সংকলকটিতে সমর্থিত নয়।

উল্লেখ


0

ভেরিয়েবল ঘোষণার ক্ষেত্রে এর সাথে কোনও ভুল হতে পারে না b তবে সেই পরিবর্তনশীলটিকে অন্য কোথাও ব্যবহার করার চেষ্টা করার সময় কিছুটা অস্পষ্টতা থাকে:

1 = "হ্যালো ওয়ার্ল্ড!" মুদ্রণ (1) মুদ্রণ (1)

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

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