বাম থেকে ডান ভাষার সিনট্যাক্সের সুবিধা


18

আমি চ্যানেল 9 এ হার্ব সুটারের সাথে একটি সাক্ষাত্কার দেখছি এবং তিনি ভিডিওটির শেষে উল্লেখ করেছিলেন যে ডান থেকে ভাষার ডানদিকে বাক্য গঠনটি ভবিষ্যতের সি ++ স্ট্যান্ডার্ডের জন্য তার হুইললিস্টের শীর্ষে থাকবে (যদিও তিনি স্বীকার করেন যে সি ++ সেভাবে পরিবর্তন করা হচ্ছে) পুরোপুরি সম্পূর্ণ ভিন্ন জন্তুটির জন্য তৈরি করবে)।

বাদে:

  • মানুষের দ্বারা আরও বোধগম্য, খালি চোখে পরিষ্কার eg যেমন

    //C syntax
    
    /*pointer to function taking a pointer to function(which takes 2 integers as 
    
    arguments and returns an int), and an int as arguments and returning an int*/
    
    int (*fp)(int (*ff)(int x, int y), int b)
    
    //Go analogous syntax which is left to write
    
    f func(func(int,int) int, int) int
  • পার্স করা সহজ (ভিডিওতে উল্লিখিত হিসাবে আরও ভাল সরঞ্জাম সহায়তার দিকে পরিচালিত করে - যেমন কোড রিফ্যাক্টরিং)

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


1
হাস্কেল বাম থেকে ডান ব্যবহার করে:f :: (Int -> Int -> Int) -> Int -> Int
করলি হরভাথ

1
ActionScript পাশাপাশি: function strlen(s:String):int {...}। এছাড়াও, টাইপ করা ল্যাম্বদা ক্যালকুলাস (অতএব, হাস্কেল)।
outis

2
কেউ কি দয়া করে সমাপ্ত ভোটগুলি ব্যাখ্যা করতে পারেন :)? আমি এটি বন্ধ করার কোনও কারণ দেখতে পাচ্ছি না তবে আমি একটি "ভুল" প্রশ্ন জিজ্ঞাসা করছি।

1
আমি বন্ধ করার পক্ষে ভোট দিইনি, তবে, দেবদেবশের মন্তব্য প্রাসঙ্গিক, এটি প্রোগ্রামারদের পক্ষে আরও উপযুক্ত, আশা করি কেউ এটিকে স্থানান্তরিত করবেন ....
নিম

3
@ ফ্র্যাঙ্ক: এবং ফাংশন পয়েন্টারের ক্ষেত্রে ভুলে যাবেন না যে বাক্য গঠনটি বিশ্রী কারণ প্রকৃত প্রকারটি বিভক্ত ! এটি একটি নিম্ন ধাক্কা ...
ম্যাথিউ এম।

উত্তর:


12

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

অ্যারে টাইপের আর্গুমেন্ট বা ফাংশন পয়েন্টার টাইপের যে কোনও ক্রিয়াকলাপ প্রত্যাবর্তন করে তা বর্তমানে পড়া শক্ত hard

// common way of obtaining the static size in elements of an array:
template <typename T, int N>
char (&array_size_impl( T (&)[N] ))[N];
// alternative parser:
template <typename T, int N>               // this would probably be changed also
array_simple_impl function( T [N] & ) char [N] &;

এবং ভুল বোঝাবুঝির জন্য কম সুযোগ থাকবে ( সর্বাধিক ভিক্সিং-পার্স হিসাবে ):

// Current C++
type x( another_type() );      // create an instance x of type passing a
                               // default constructed another_type temporary?
                               // or declare a function x that returns type and takes as argument
                               // a function that has no arguments and returns another_type
// How the compiler reads it:
x function( function() another_type ) type;

// What many people mean:
x type { another_type{} };

সি ++ 0x (অর্থাত্ {}প্রাথমিককরণ সনাক্তকরণের জন্য) অভিন্ন সূচনা করার অনুরূপ পদ্ধতির ব্যবহার similar মনে রাখবেন যে বাম থেকে ডানদিকে যাওয়ার সাথে এটি যে বিষয়টি আমরা সংজ্ঞায়িত করছি তা আরও পরিষ্কার। অনেক লোককে (নিশ্চিতভাবেই) অতীতের এই পার্সিং ত্রুটির দ্বারা যেকোনও সময় কামড় দেওয়া হয়েছে (একাধিকবার), এবং বাম থেকে ডান সিনট্যাক্সের ক্ষেত্রে এটি হবে না।


এক্সপ্রেশন সম্পর্কে কীভাবে? এই "বাম থেকে ডান সিনট্যাক্স" কীভাবে অপারেটরের অগ্রাধিকার এবং মূল্যায়নের আদেশকে প্রভাবিত করবে?

1
@ এসেলাভেক: আপনি যদি সাক্ষাত্কারে ফিরে যান তবে আপনি খেয়াল করবেন যে তিনি ভাষার পুরো বাক্য গঠনটি পরিবর্তন করতে চান না, কেবলমাত্র ঘোষণাপত্র এবং সংজ্ঞা এস। অবশ্যই, এটি অন্যান্য অভিব্যক্তিগুলিতে প্রসারিত হতে পারে, আমি খুব বেশি নিশ্চিত নই যে উপরের উদাহরণগুলির মধ্যে শেষ লাইনটি সঠিক বাম-থেকে-ডান (অস্থায়ীভাবে কীভাবে তৈরি হয়, সেটিকে কীভাবে পরিবর্তিত করা দরকার হতে পারে তা ভেবে দেখুন ... সি # তে এটি newঅপারেটরের জন্য দুটি শব্দার্থক প্রদানের মাধ্যমে সমাধান করা হয় structবা classযা সি ++ এর মতো প্রযোজ্য নয়, যেমন সি ++ তে মান / রেফারেন্সের ধরণের কোনও পার্থক্য নেই।
ডেভিড রডগ্র্যাগজ - ড্রিবাস

5

কিভাবে আমরা এখানে পেয়েছি

ফাংশন পয়েন্ট ঘোষণার জন্য সি সিনট্যাক্সের ব্যবহারটি মিরর করার উদ্দেশ্যে করা হয়েছিল। এর থেকে নিয়মিত ফাংশন ঘোষণার বিষয়টি বিবেচনা করুন <math.h>:

double round(double number);

পয়েন্ট ভেরিয়েবলের জন্য আপনি টাইপ সুরক্ষা ব্যবহার করে এটি নির্ধারণ করতে পারেন

fp = round;

আপনার fpএই বিন্দুটি ভেরিয়েবলটি এভাবে ঘোষণা করা দরকার :

double (*fp)(double number);

সব আপনাকে যা করতে হবে সুতরাং কিভাবে আপনি ফাংশন ব্যবহার হবে, এবং একটি পয়েন্টার রেফারেন্স সঙ্গে যে ফাংশনের নাম প্রতিস্থাপন, উপার্জন তাকান roundমধ্যে *fp। যাইহোক, আপনার প্যারেনসের একটি অতিরিক্ত সেট দরকার, যা কেউ কেউ বলবে এটি কিছুটা মেসওয়্যার করে তোলে।

যুক্তিযুক্তভাবে, এটি মূল সিতে আরও সহজ হত, যার এমনকি ফাংশন স্বাক্ষরও ছিল না, তবে আসুন সেখানে ফিরে যাবেন না, ঠিক আছে?

স্থানটি এটি বিশেষত দুষ্টু হয়ে ওঠে তা কোনও ফাংশন কীভাবে ঘোষণার জন্য তা আর্গুমেন্ট হিসাবে গ্রহণ করে বা কোনও ফাংশনটিতে নির্দেশক বা উভয়কে ফিরিয়ে দেয়।

আপনার যদি কোনও ফাংশন থাকে:

void myhandler(int signo);

আপনি এটি সিগন্যাল ফাংশন (3) এ এভাবে দিতে পারেন:

signal(SIGHUP, myhandler);

বা আপনি যদি পুরানো হ্যান্ডলারটি রাখতে চান তবে

old_handler = signal(SIGHUP, new_handler);

যা বেশ সহজ। কি চমত্কার সহজ - না চমত্কার, না সহজ - ঘোষণাগুলি সঠিকভাবে পাচ্ছেন।

signal(int signo, ???)

ঠিক আছে, আপনি কেবল আপনার ফাংশন ঘোষণায় ফিরে যান এবং একটি বিন্দু রেফারেন্সের জন্য নাম অদলবদল করুন:

signal(int sendsig, void (*hisfunc)(int gotsig));

যেহেতু আপনি ঘোষণা করছেন না gotsig, আপনি বাদ দিলে পড়া সহজ হতে পারে:

signal(int sendsig, void (*hisfunc)(int));

হয়তো বা না. :(

এটি পর্যাপ্ত নয়, তবে সংকেত (3) পুরানো হ্যান্ডলারটিও ফিরিয়ে দেয়:

old_handler = signal(SIGHUP, new_handler);

সুতরাং এখন আপনি কীভাবে এই সমস্ত ঘোষণা করবেন তা খুঁজে বের করতে হবে।

void (*old_handler)(int gotsig);

আপনি যে ভেরিয়েবলটি নির্ধারণ করতে যাচ্ছেন তার জন্য যথেষ্ট। মনে রাখবেন আপনি gotsigএখানে সত্যই ঘোষণা করছেন না , কেবলমাত্র old_handler। সুতরাং এটি সত্যিই যথেষ্ট:

void (*old_handler)(int);

এটি আমাদের সংকেত (3) এর সঠিক সংজ্ঞা এনেছে:

void (*signal(int signo, void (*handler)(int)))(int);

টাইপডিফস টু রেসকিউ

এই সময়ের মধ্যে, আমি মনে করি সকলেই একমত হবেন যে এটি একটি গণ্ডগোল। কখনও কখনও আপনার বিমূর্তির নাম দেওয়া ভাল; প্রায়ই, সত্যিই। ডান সঙ্গে typedef, এটি বোঝা অনেক সহজ হয়ে যায়:

typedef void (*sig_t) (int);

এখন আপনার নিজের হ্যান্ডলার পরিবর্তনশীল হয়ে ওঠে

sig_t old_handler, new_handler;

এবং সিগন্যালের জন্য আপনার ঘোষণাটি (3) ন্যায়সঙ্গত হয়ে ওঠে

sig_t signal(int signo, sig_t handler);

যা হঠাৎ বোধগম্য। * এর থেকে মুক্তি পাওয়ার সাথে সাথে কিছু বিভ্রান্তিকর বন্ধনীর হাত থেকে মুক্তি পাওয়া যায় (এবং তারা বলে যে প্যারেনরা সবসময় বিষয়গুলি বুঝতে সহজ করে তোলে - হাহ!)। আপনার ব্যবহার এখনও একইরকম:

old_handler = signal(SIGHUP, new_handler);

কিন্তু এখন আপনার জন্য ঘোষণা বুঝতে সুযোগ আছে old_handler, new_handlerএবং এমনকি signalযখন প্রথম আপনি তাদের বা প্রয়োজন সম্মুখীন তাদের লিখতে।

উপসংহার

খুব কম সি প্রোগ্রামার, এটি প্রমাণিত হয়েছে যে, রেফারেন্স উপকরণগুলির সাথে পরামর্শ না করেই এই বিষয়গুলির জন্য সঠিক ঘোষণাগুলি তৈরি করতে সক্ষম।

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

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


1
প্রচেষ্টার জন্য অবহিত, কঠোরভাবে অনুসরণ করা ... +1 যদিও এটি এই বিন্দুর চিত্র তুলে ধরেছে যে সি তে সঠিক অধিকার পাওয়া কখনও কখনও কঠিন
celavek

4

আমি মনে করি আপনি বাম-থেকে-ডানদিকে কিছুটা ফোকাস করার সময় আপনি কিছুটা বিন্দুটি মিস করেছেন।

সি এবং সি ++ এর সমস্যা হ'ল তাদের মধ্যে রয়েছে ভয়াবহ ব্যাকরণ, যা পড়া (মানব) এবং পার্স (সরঞ্জাম) উভয়ের পক্ষেই কঠিন।

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

সুতরাং আপনি সম্ভবত পড়ার এবং পার্সিংয়ের দিকে মনোনিবেশ করার সময় এটি পেরেক দিয়েছিলেন ... এবং এটি একটি বড় বিষয় :)


এটি Eclipse উপরের ঘোষণার মতো জিনিসগুলি বিশ্লেষণ করতে এখনও অক্ষম হওয়ায় এটি একটি বিস্মিত অবাক। তারা কেন আসল সি পার্সার ব্যবহার করে না gcc?
tchrist

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