কেন ফোথের নমনীয়তা এটির জন্য ব্যাকরণকে অনুপযুক্ত করে তোলে?


10

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

এটি আমাকে এই পোস্টের বিষয়টিতে নিয়ে আসে। আমি ফোর্থে উইকিপিডিয়া নিবন্ধের মাধ্যমে পড়ছিলাম , একটি স্ট্যাক-ভিত্তিক ভাষা যা পোস্টফিক্স শৈলী এক্সপ্রেশন ব্যবহার করে। নিবন্ধে, আমি নীচের বিবৃতিটি দেখেছি:

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

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

আসলে, আমি নীচে ফোর্থের একটি সাধারণ উপসেটের জন্য একটি বিএনএফ স্টাইলের ব্যাকরণ লেখার চেষ্টা করার সিদ্ধান্ত নিয়েছি:

program        ::= stmt+
stmt           ::= func | expr
func           ::= ':' expr+ ';'
expr           ::= INTEGER | word
word           ::= ('+' | '-' | '*' | '/' )

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

সংক্ষেপে, কেন ফোর্থের নতুন শব্দগুলি (সাব্রুটাইনস) সংজ্ঞায়িত করা লিখিত ব্যাকরণের পক্ষে অনুপযুক্ত?


1
"অনুপযুক্ত" এই প্রসঙ্গে একটি শক্ত শব্দ। আরও ভাল শব্দটি সম্ভবত "অপ্রয়োজনীয়" হতে পারে।
রবার্ট হার্ভে

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

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

উত্তর:


10

একটি "সাধারণ" শব্দটি প্রায় একটি সাবরুটাইন।

... তবে আপনি কোনও ব্যবহারকারী-সংজ্ঞায়িত সংজ্ঞাযুক্ত শব্দ লিখতে পারেন , যা সংকলক কীভাবে কাজ করে তা পরিবর্তন করে। উদাহরণস্বরূপ, একটি সংজ্ঞা সাধারণত কোলন (":") দিয়ে শুরু হয় এবং সেমিকোলন (";") দিয়ে শেষ হয়। তবে আপনি যদি চান, আপনি (উদাহরণস্বরূপ) কোলন কী করে তা পরিবর্তন করতে পারেন, এবং প্রক্রিয়াতে কীভাবে একটি শব্দের সংজ্ঞাটি "সংকলিত" করা যায়, এর সাহায্যে সংকলকটি কীভাবে কাজ করে এবং ভাষার ব্যাকরণকে স্বীকৃত করা যায় তা পরিবর্তন করতে পারেন।

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


2
আপনি কি নিশ্চিত যে ফোর্থের এই সম্পত্তিটি ব্যাকরণকে বদলেছে কেবল শব্দার্থককেই নয়?
ডক ব্রাউন

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

@ ডকব্রাউন আপনি কী ধরনের ব্যাকরণ লিখতে পারেন যা আমাকে ফোরে সি ইন্টারপ্রেটার লেখার অনুমতি দেয় এবং তারপরে হঠাৎ প্রোগ্রামের মাঝখানে সিটিতে স্যুইচ করে দেয়?
ব্যবহারকারী 253751

@ এমমিবিস: আচ্ছা, আমার প্রশ্নটি - ফোরথ কি সত্যিই এরকম কিছু করার অনুমতি দেয়? সংযুক্ত নিবন্ধটি থেকে, এটি আমার কাছে সহজাতভাবে পরিষ্কার নয়।
ডক ব্রাউন

@ ডকব্রাউন হ্যাঁ এটি করে। সংকলনের সময় আপনি আপনার কোডটি চালাতে পারেন, এর অর্থ আপনি যদি চান তবে আপনি সম্পূর্ণরূপে সংকলকটি নিতে পারেন। মূলত আপনি ফোর সংকলক / দোভাষীর মাঝখানে আপনার সি সংকলক / দোভাষী চালাতে পারেন। (আপনি শেষ পর্যন্ত
ফোরটিতে

3

ফোর্থে, আপনি সংকলন সময়ে কোড চালাতে পারেন।

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

আরও সাধারণভাবে, আপনি সোর্স কোড থেকে যুক্তিগুলি পড়ার শব্দগুলি সংজ্ঞায়িত করতে পারেন। Ditionতিহ্যগতভাবে আপনি শব্দগুলি একইভাবে সংকলকটি পড়তেন তবে এটির প্রয়োজন হয় না।

উদাহরণস্বরূপ, ."শব্দ (যা একটি স্ট্রিং ছাপে) পড়ুন না, যে পর্যন্ত পরবর্তী স্থান, পরবর্তী পর্যন্ত সার্চ "। যদি আপনি : PRINTHELLO ." Hello ; : func2 world!" ;কোনও বিশেষ কেস ছাড়াই কোডটি বিশ্লেষণ করার চেষ্টা করেন তবে দেখতে ."পাবেন যে এটি সঠিকভাবে পার্স করা হয়নি।

আপনি অবশ্যই একটি বিশেষ ক্ষেত্রে যোগ করতে পারেন ."আপনার ব্যাকরণ, কিন্তু ব্যাকরণ এখনো ভুল হবে মত যদি প্রোগ্রামার তাদের নিজস্ব শব্দ সংজ্ঞায়িত ."- উদাহরণস্বরূপ এখানে দেওয়া হল: : MY_PRINT POSTPONE ." ; IMMEDIATE। এই শব্দটি সমান ."; আমি লিখতে পারি MY_PRINT Hello ; world! "এবং আপনার ব্যাকরণটি এটি বিশ্লেষণ করতে সক্ষম হওয়া প্রয়োজন। সে জন্য শুভকামনা।

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