কেন বেশিরভাগ প্রোগ্রামিং ভাষা কেবল একটি ফাংশন থেকে একক মান ফেরত সমর্থন করে? [বন্ধ]


118

বেশিরভাগ (?) প্রোগ্রামিং ল্যাঙ্গুয়েজে ফাংশনগুলি কোনও সংখ্যার ইনপুট প্যারামিটারগুলিকে সমর্থন করার জন্য তৈরি করা হয়েছে তবে কেবলমাত্র একটি রিটার্ন মান?

বেশিরভাগ ভাষায়, এই সীমাবদ্ধতাটি যেমন "চারপাশে কাজ করা" সম্ভব হয়, যেমন আউট-প্যারামিটার ব্যবহার করে, পয়েন্টারগুলি রিটার্ন করে বা স্ট্রিং / ক্লাসগুলি সংজ্ঞায়িত করে / ফেরার মাধ্যমে। তবে এটি আশ্চর্যজনক বলে মনে হয় যে প্রোগ্রামিং ভাষাগুলি একাধিক "প্রাকৃতিক" উপায়ে একাধিক রিটার্ন মান সমর্থন করার জন্য তৈরি করা হয়নি।

এর কি কোন ব্যাখ্যা আছে?


40
আপনি কোনও অ্যারে ফিরিয়ে
আনতে

6
তাহলে কেন কেবল একটি যুক্তিই মঞ্জুর করবেন না? আমি সন্দেহ করি এটি বক্তৃতার সাথে আবদ্ধ। কিছু ধারণা নিন, স্মুশ তাদের একটি জিনিস নিয়ে যাবেন যে আপনি যে ভাগ্যবান / দুর্ভাগ্যবান তা শুনার পক্ষে ফিরে আসেন। প্রত্যাবর্তন প্রায় মতামত মত। "এটি" আপনি "এগুলি" দিয়ে যা করেন।
এরিক রেপেন

30
আমি বিশ্বাস করি পাইথন এর পদক্ষেপ বেশ সহজ এবং মার্জিত হল: আপনি একাধিক মান ফিরে যেতে হবে যখন কেবল একটি tuple ফিরে def f(): return (1,2,3)এবং তারপর আপনি tuple-unpacking "বিভাজিত" tuple ব্যবহার করতে পারেন: a,b,c = f() #a=1,b=2,c=3। একটি অ্যারে তৈরি করার প্রয়োজন নেই এবং ম্যানুয়ালি উপাদানগুলি নিষ্কাশন করার দরকার নেই, কোনও নতুন শ্রেণীর সংজ্ঞা দেওয়ার দরকার নেই।
বাকুরিউ

7
আমি আপনাকে অবহিত করতে পারি যে মতলব একটি পরিবর্তনশীল সংখ্যার রিটার্ন মান রয়েছে। আউটপুট আর্গুমেন্টের সংখ্যা কলিং স্বাক্ষর (যেমন দ্বারা নির্ধারিত হয় [a, b] = f()বনাম [a, b, c] = f()) এবং ভিতরে প্রাপ্ত fদ্বারা nargout। আমি মতলবের খুব বড় অনুরাগী নই তবে এটি সময়ে সময়ে বেশ কাজে আসে।
অঙ্কিত

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

উত্তর:


58

পাইথনের মতো কিছু ভাষা স্থানীয়ভাবে একাধিক রিটার্ন মানকে সমর্থন করে, অন্যদিকে সি # এর মতো কিছু ভাষা তাদের বেস লাইব্রেরির মাধ্যমে তাদের সমর্থন করে।

তবে সাধারণভাবে, এমনকি তাদের ভাষাগুলি সমর্থন করে এমন ভাষায়ও একাধিক রিটার্ন মান ব্যবহার করা হয় না কারণ এগুলি ম্লান:

  • ফাংশনগুলি যা একাধিক মান প্রত্যাবর্তন করে স্পষ্টভাবে নামকরণ করা শক্ত
  • প্রত্যাবর্তনের মানগুলির ক্রমটি ভুল করা সহজ

    (password, username) = GetUsernameAndPassword()  
    

    (এই একই কারণে, অনেক লোক কোনও ফাংশনে অনেক বেশি পরামিতি এড়ানো এড়ায়; কেউ কেউ এমনকি এটিকে এ পর্যন্ত বলে যে কোনও ফাংশনটিতে একই ধরণের দুটি প্যারামিটার না থাকা উচিত!)

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

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


50
বলা মুশকিল যে একটি টুপলে ফেরা একাধিক জিনিস ফিরিয়ে দিচ্ছে। এটি এক টুপল ফিরে । আপনি যে কোডটি লিখেছেন তা কিছু সিনট্যাকটিক চিনি ব্যবহার করে পরিষ্কারভাবে আনপ্যাক করে।

10
@ লেগো: আমি কোনও পার্থক্য দেখছি না - একটি টিপল হ'ল সংজ্ঞা অনুসারে একাধিক মান। আপনি যদি "একাধিক রিটার্ন মানগুলি" বিবেচনা করবেন তবে এটি না?
ব্লুরাজা - ড্যানি পিফ্লুঘুফুট

19
এটি সত্যিই একটি আচ্ছন্নতম পার্থক্য, তবে একটি খালি টিপল বিবেচনা করুন ()। এটা কি একটা জিনিস নাকি শূন্য জিনিস? ব্যক্তিগতভাবে, আমি এটির একটি কথা বলব। আমি x = ()ঠিক ঠিক যেমন বরাদ্দ করতে পারি ঠিক করতে পারি x = randomTuple()। পরবর্তীকালে যদি ফিরে আসা টিপলটি খালি থাকে বা না থাকে তবে আমি এখনও একটি ফেরত টুপলকে অর্পণ করতে পারি x

19
... আমি কখনও দাবি করি নি যে টিপলগুলি অন্য জিনিসের জন্য ব্যবহার করা যায় না। তবে যুক্তি দিয়ে যে "পাইথন একাধিক রিটার্ন মান সমর্থন করে না, এটি টিপলসকে সমর্থন করে" কেবল অত্যন্ত অর্থহীন পেডেন্টিক being এটি এখনও একটি সঠিক উত্তর।
ব্লুরাজা - ড্যানি প্লেফুঘুফুট

14
টিপল বা ক্লাস দুটিই "একাধিক মান" নয়।
আন্দ্রেস এফ।

54

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

এটি পরিবর্তিত হয়নি কারণ প্রোগ্রামাররা outবিশ্রী কাঠামো হিসাবে পরামিতিগুলি খুঁজে পেয়েছে যা কেবলমাত্র সীমিত পরিস্থিতিতে দৃশ্যের জন্য দরকারী। অন্যান্য অনেক কিছুর মতো, সমর্থনটি নেই কারণ প্রয়োজনীয়তা / চাহিদা নেই।


5
@ ফ্রাস্ট্রেটেড উইথফর্মস ডিজাইনার - সাম্প্রতিক প্রশ্নে এটি সামান্যই উঠে এসেছে । আমি একদিকে 20 বছরে একাধিক আউটপুট চেয়েছি তা গণনা করতে পারি।
টেলাস্টিন

61
গণিতের কার্যাদি এবং বেশিরভাগ প্রোগ্রামিং ভাষায় ফাংশন দুটি খুব ভিন্ন জন্তু।
tdammers

17
প্রথম দিনগুলিতে @tdamrs, তারা চিন্তার মধ্যে খুব একই রকম ছিল। ফরট্রান, প্যাস্কেল এবং এটির মতো যেখানে গণনা আর্কিটেকচারের চেয়ে বেশি গণিত দ্বারা প্রভাবিত হয়।

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

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

35

গণিতে, একটি "সু-সংজ্ঞায়িত" ফাংশনটি এমন যেখানে একটি প্রদত্ত ইনপুটটির জন্য কেবলমাত্র 1 টি আউটপুট থাকে (সাইড নোট হিসাবে, আপনার কেবলমাত্র একক ইনপুট ফাংশন থাকতে পারে, এবং তবুও ত্রুটিযুক্তভাবে কারিঙ ব্যবহার করে একাধিক ইনপুট পাবেন )।

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

আপনি যে ধরণের ফাংশনগুলির বিষয়ে কথা বলছেন (যেমন বিভিন্ন ধরণের একাধিক মান ফেরত দেয় এমন ফাংশন ) এর জন্য আমি আপনাকে এটির চেয়ে কিছুটা আলাদা দেখছি: আমি আরও ভাল নকশার জন্য কার্যকরী হিসাবে আউট প্যারামের প্রয়োজনীয়তা / ব্যবহার দেখতে পাচ্ছি আরও দরকারী ডেটা কাঠামো। উদাহরণস্বরূপ, আমি পছন্দ করতাম যদি *.TryParse(...)পদ্ধতিগুলি Maybe<T>আউট প্যারাম ব্যবহার না করে একটি মোনাড ফিরিয়ে দেয় । এফ # তে এই কোডটি ভাবুন:

let s = "1"
match tryParse s with
| Some(i) -> // do whatever with i
| None -> // failed to parse

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

অন্যান্য পরিস্থিতিতে - যা আমি মনে করতে পারি না - একটি সাধারণ টুপলে যথেষ্ট T


1
তদতিরিক্ত, আমি সত্যিই সি # তে লিখতে সক্ষম হতে চাই: var (value, success) = ParseInt("foo");যা (int, bool) ParseInt(string s) { }ঘোষিত হওয়ার কারণে সংকলন-টাইপ টাইপ পরীক্ষা করা হবে। আমি জানি এটি জেনেরিক দিয়ে করা যেতে পারে তবে এটি একটি সুন্দর ভাষা সংযোজন করতে পারে।
হতাশার গ্রিমেস

10
@ গ্রিমেসোফডেস্পায়ার আপনি যা চান তা হ'ল বাক্য গঠন বিন্যাস করা, একাধিক রিটার্ন মান নয়।
ডোমেনিক

2
@ ওওয়ারেন: হ্যাঁ এখানে দেখুন এবং নোট করুন যে এই জাতীয় সমাধানটি ধারাবাহিকভাবে চলবে না: en.wikedia.org/wiki/Well-definition
স্টিভেন ইভার্স

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

1
@ মিশেলসিলার (আমি আপনার মন্তব্যের সাথে একমত) তবে দয়া করে মনে রাখবেন যে যুক্তিটি প্রত্যাবর্তনযোগ্য: "প্রোগ্রামের ফাংশনগুলি একাধিক মান ফিরিয়ে দিতে পারে কারণ তারা একটিমাত্র দ্বিখণ্ডিত মান দিতে পারে না" :)
আন্দ্রেস এফ।

23

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


আহ! খুব আকর্ষণীয় বিশদ। +1 টি!
স্টিভেন এভার্স

এটি গ্রহণযোগ্য উত্তর হওয়া উচিত। সাধারণত লোকেরা যখন সংকলকগুলি তৈরি করে তখন টার্গেট মেশিনগুলি সম্পর্কে চিন্তা করে। আরেকটি উপমা হ'ল কেন আমাদের কাছে ইনট, ফ্লোট, চর / স্ট্রিং ইত্যাদি রয়েছে কারণ এটি লক্ষ্য মেশিন দ্বারা সমর্থিত। লক্ষ্যটি বেয়ার মেটাল নয় (যেমন jvm), আপনি এখনও খুব বেশি অনুকরণ না করে শালীন পারফরম্যান্স পেতে চান।
imel96

26
... আপনি সহজেই কোনও ফাংশন থেকে একাধিক মান প্রত্যাবর্তনের জন্য একটি কলিং কনভেনশন সংজ্ঞায়িত করতে পারেন, প্রায় একইভাবে আপনি কোনও ফাংশনে একাধিক মান পাস করার জন্য একটি কলিং কনভেনশনকে সংজ্ঞায়িত করতে পারেন। এটি কোনও উত্তর নয়। -1
ব্লুরাজা - ড্যানি প্লেফুঘুফুট

2
এটি জেনে রাখা আকর্ষণীয় হবে যে স্ট্যাক-ভিত্তিক এক্সিকিউশন ইঞ্জিনগুলি (জেভিএম, সিএলআর) কখনও একাধিক রিটার্ন মান বিবেচনা করেছে / অনুমোদিত করেছে .. এটি বেশ সহজ হওয়া উচিত; ফোনকারীকে ঠিক সঠিক সংখ্যাটি পপ করতে হবে ঠিক যেমন এটি যুক্তির সঠিক সংখ্যাকে ঠেলে দেয়!
লরেঞ্জো ডিম্যাটé

1
@David না, cdecl (তাত্ত্বিকভাবে) প্যারামিটার সীমাহীন সংখ্যক জন্য করতে পারবেন (যে কারণেই ভারার্গস ফাংশন সম্ভব হয়) । কিছু সি-কম্পাইলার ফাংশন প্রতি কয়েক ডজন বা শত আর্গুমেন্ট, যা আমি মনে করি এখনও যুক্তিসঙ্গত চেয়ে -_- বেশি আপনার সীমিত হতে পারে যদিও
ড্যানি Pflughoeft - BlueRaja

18

আপনি অতীতে যে একাধিক রিটার্ন মান ব্যবহার করতেন সেগুলি ব্যবহারের অনেকগুলি আধুনিক ভাষা বৈশিষ্ট্যগুলির সাথে আর প্রয়োজন হয় না। একটি ত্রুটি কোড ফেরত চান? একটি ব্যতিক্রম নিক্ষেপ বা একটি ফিরে Either<T, Throwable>। একটি alচ্ছিক ফলাফল ফিরে চান? ফিরে আসুন Option<T>। বিভিন্ন ধরণের একটি ফেরত দিতে চান? একটি Either<T1, T2>বা একটি ট্যাগ ইউনিয়ন ফিরে।

এমনকি ক্ষেত্রে যেখানে আপনি সত্যি সত্যি মধ্যে প্রয়োজন একাধিক মান ফিরে যাওয়ার, আধুনিক ভাষা সাধারণত tuples বা ডাটা স্ট্রাকচার (তালিকা, এরে, অভিধান) কোন ধরণের সমর্থন বা বেঁধে বা প্যাটার্ন ম্যাচিং ডেসট্রাকচারিং কিছু ফর্ম, যা প্যাকেজিং তোলে আপ হিসাবে ভাল হিসাবে বস্তু আপনার একাধিক মানকে একক মান হিসাবে এবং তারপরে এটি আবার একাধিক মানকে তুচ্ছ into

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

চুনি

def foo; return 1, 2, 3 end

one, two, three = foo

one
# => 1

three
# => 3

পাইথন

def foo(): return 1, 2, 3

one, two, three = foo()

one
# >>> 1

three
# >>> 3

scala

def foo = (1, 2, 3)

val (one, two, three) = foo
// => one:   Int = 1
// => two:   Int = 2
// => three: Int = 3

Haskell,

let foo = (1, 2, 3)

let (one, two, three) = foo

one
-- > 1

three
-- > 3

Perl6

sub foo { 1, 2, 3 }

my ($one, $two, $three) = foo

$one
# > 1

$three
# > 3

1
আমি মনে করি একটি দিক হ'ল, কিছু ভাষায় (যেমন মতলব) কোনও ফাংশন তার কতগুলি মান দেয় তা নমনীয় হতে পারে; দেখতে উপরে আমার মন্তব্য । মতলবতে আমার অনেক পছন্দ আছে না, তবে মতলব থেকে উদাহরণস্বরূপ পাইথনে পোর্ট করার সময় এই কয়েকটি (সম্ভবত একমাত্র) বৈশিষ্ট্যটি আমি মিস করি।
অঙ্কিত

1
তবে পাইথন বা রুবির মতো গতিশীল ভাষা সম্পর্কে কী বলা যায়? ধরুন আমি মতলব sortফাংশনের মতো কিছু লিখছি : sorted = sort(array)কেবল বাছাই করা অ্যারে প্রদান করে, যেখানে [sorted, indices] = sort(array)উভয়ই প্রদান করে। পাইথনে আমি যেভাবে ভাবতে পারি তা হ'ল বা sortএর লাইন ধরে একটি পতাকা পাস করা । sort(array, nout=2)sort(array, indices=True)
অঙ্কিত

2
@ মাইকসেলিনি আমার মনে হয় না। একটি ফাংশন ফাংশনটি ( ) নামে ডাকা হয় কত আউটপুট আর্গুমেন্টের সাথে বলতে পারে এবং সে [a, b, c] = func(some, thing)অনুযায়ী কাজ করে act এটি দরকারী, উদাহরণস্বরূপ, যদি প্রথম আউটপুট আর্গুমেন্ট গণনা করা সস্তা তবে দ্বিতীয়টির গণনা ব্যয়বহুল। আমি অন্য কোনও ভাষার সাথে পরিচিত নই যেখানে ম্যাটল্যাবের সমতুল্য nargoutরান-টাইমে উপলব্ধ।
জারিত

1
@gerrit পাইথন সঠিক সমাধান এই লিখতে হল: sorted, _ = sort(array)
মাইলস রাউট

1
@ মাইলসআরট: এবং sortফাংশনটি বলতে পারে যে সূচকগুলি গণনা করার দরকার নেই? এটা দুর্দান্ত, আমি এটা জানতাম না।
Jörg ডব্লু মিটাগ

12

একক রিটার্নের মান এত জনপ্রিয় হওয়ার আসল কারণটি হ'ল বহু ভাষাতে ব্যবহৃত অভিব্যক্তি। যে কোনও ভাষায় যেখানে আপনার মত প্রকাশ হতে পারে x + 1আপনি ইতিমধ্যে একক রিটার্ন মান হিসাবে বিবেচনা করছেন কারণ আপনি আপনার মাথার একটি অভিব্যক্তিটিকে টুকরো টুকরো করে এবং প্রতিটি টুকরোটির মান নির্ধারণ করে মূল্যায়ন করেন। আপনি দেখুন xএবং সিদ্ধান্ত নিন যে এর মান 3 (উদাহরণস্বরূপ), এবং আপনি 1 এ তাকান এবং তারপরে আপনি তাকানx + 1এবং সমস্তটি একত্রিত করে সিদ্ধান্ত নিন যে পুরোটির মান 4 the প্রতিটি অভিব্যক্তির অংশের একটি মান থাকে, অন্য কোনও সংখ্যার মান নয়; এটাই প্রত্যেকের প্রত্যাশা প্রকাশের প্রাকৃতিক শব্দার্থবিদ্যা। এমনকি যদি কোনও ফাংশন এক জোড়া মান দেয় তবে এটি এখনও দুটি মানের কাজ করে এমন একটি মান ফিরে আসে, কারণ কোনও ফাংশনটি এমন দুটি মানকে দেয় যা কোনওভাবে একক সংগ্রহের মধ্যে আবৃত হয় না returns

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

পার্ল হ'ল একটি ভাষা যা কখনও কখনও ফাংশনগুলি একাধিক মান ফিরিয়ে আনার মতো কাজ করতে পারে যদিও এটি সাধারণত তালিকা ফিরিয়ে দেওয়া বিবেচনা করে না। পার্লের "ইন্টারপোলেট" তালিকাটি যেভাবে আমাদের তালিকাগুলি দেয় (1, foo(), 3)তাতে 3 টি উপাদান থাকতে পারে কারণ বেশিরভাগ লোক যারা জানেন না পার্ল আশা করতে পারে তবে কেবল সহজেই কেবল 2 টি উপাদান, 4 উপাদান বা কোনও বৃহত্তর সংখ্যক উপাদান থাকতে পারে foo()। পার্ল মধ্যে তালিকাসমূহ হয় চ্যাপ্টা থাকে যাতে কোনো অন্বিত তালিকা সবসময় একটি তালিকার শব্দার্থবিদ্যা নেই; এটি কেবলমাত্র বৃহত্তর তালিকার একটি অংশ হতে পারে।

একাধিক মান ফিরিয়ে আনার আরেকটি উপায় হ'ল বিকল্প এক্সপ্রেশন শব্দার্থক পদার্থ যেখানে কোনও এক্সপ্রেশন একাধিক মান থাকতে পারে এবং প্রতিটি মান একটি সম্ভাবনার প্রতিনিধিত্ব করে। x + 1আবার নিন , তবে এবার কল্পনা করুন যেটির xদুটি মান রয়েছে {3, 4}, তারপরের মানগুলি x + 1হবে {4, 5}, এবং মানগুলি x + x6 8, 8}, অথবা {6, 7, 8 maybe হতে পারে , কোনও মূল্যায়নের জন্য একাধিক মান ব্যবহার করার অনুমতি রয়েছে কিনা তার উপর নির্ভর করে xপ্রোলোল যেমন কোনও প্রশ্নের একাধিক উত্তর দেওয়ার জন্য ব্যাকট্র্যাকিং ব্যবহার করে এর মতো একটি ভাষা প্রয়োগ করা যেতে পারে ।

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


9

এই উত্তরে যেমন পরামর্শ দেওয়া হয়েছে , এটি হার্ডওয়্যার সমর্থনের বিষয়, যদিও ভাষা নকশায় traditionতিহ্যও একটি ভূমিকা পালন করে।

যখন কোনও ফাংশন প্রত্যাবর্তন করে এটি নির্দিষ্ট রেজিষ্টারে প্রত্যাবর্তনকারী অবজেক্টে একটি পয়েন্টার রেখে দেয়

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

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

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

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

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

সুতরাং আসুন সমাবেশ ভাষা পরীক্ষা করা যাক। আসুন প্রথমে 6502 এ দেখুন , একটি 1975 মাইক্রোপ্রসেসর যা অ্যাপল II এবং VIC-20 মাইক্রোকম্পিউটারগুলির দ্বারা বিখ্যাতভাবে ব্যবহৃত হয়েছিল। প্রোগ্রামিং ল্যাঙ্গুয়েজের ভোর বেলা ২০, ৩০ বছর আগে প্রথম কম্পিউটারের তুলনায় শক্তিশালী হলেও তদানীন্তন মেইনফ্রেম এবং মিনি কম্পিউটারে যা ব্যবহৃত হয়েছিল তার তুলনায় এটি খুব দুর্বল ছিল।

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

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

আপনি যদি প্রসেসরের দিকে তাকান যা 6502, 6800 কে অনুপ্রাণিত করেছিল , এটির একটি অতিরিক্ত রেজিস্ট্রার, সূচক রেজিস্টার (আইএক্স), এসপি হিসাবে বিস্তৃত ছিল, যা এসপি থেকে মান গ্রহণ করতে পারে।

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

SP + 8: param 2
SP + 6: param 1
SP + 4: return address
SP + 2: local 2
SP + 0: local 1

এটি যে কোনও সংখ্যক বার বলা যেতে পারে কারণ সমস্ত অস্থায়ী স্থান স্ট্যাকের মধ্যে রয়েছে।

8080 , টিআরএস-80 CP / এম-ভিত্তিক microcomputers একটি হোস্ট ব্যবহার করা 6800 অনুরূপ কিছু করতে পারে, স্ট্যাক এসপি ঠেলাঠেলি এবং তারপর তার পরোক্ষ রেজিস্টার, ঐ খ তে এটি পপিং দ্বারা।

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

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

সুতরাং সাধারণত যা করা হত তা ছিল রিটার্ন মানটির জন্য একটি নিবন্ধক সংরক্ষণ করা । কলিং কোড জানত যে রিটার্নের মানটি একটি নির্দিষ্ট রেজিস্টারে থাকবে, এটি সংরক্ষণ বা ব্যবহার না করা অবধি সংরক্ষণ করতে হবে।

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

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

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

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


@gnat "প্রয়োজনীয় মান প্রদানের জন্য" হিসাবে "অবহিত করা" ব্যবহার উদ্দেশ্যমূলক ছিল was
ড্যানিয়েল সি সোব্রাল 21

আপনি এই সম্পর্কে দৃ strongly়ভাবে মনে হলে রোলব্যাক নির্দ্বিধায় বোধ করুন; প্রতি আমার পড়া প্রভাব এখানে সামান্য ভাল ফিট: "প্রভাবিত ... একটি গুরুত্বপূর্ণ ভাবে"
মশা

1
+1 যেমন এটি উল্লেখ করেছে যে সমকালীন সিপিইউগুলির প্রচুর রেজিস্ট্রি সেট (অনেকগুলি এবিআইতে যেমন, x64 অ্যাবি ব্যবহৃত হয়) এর তুলনায় প্রারম্ভিক সিপিইউগুলির স্পার্স রেজিস্টার গণনাও গেম চেঞ্জার হতে পারে এবং পূর্ববর্তী বাধ্যতামূলক কারণগুলি কেবলমাত্র 1 মান ফেরত দিতে পারে আজকাল কেবল একটি historicalতিহাসিক কারণ হতে পারে।
বিটকলার

আমি নিশ্চিত নই যে প্রথম দিকের 8-বিট মাইক্রো সিপিইউগুলির ভাষা নকশায় অনেক প্রভাব রয়েছে এবং কোনও আর্কিটেকচার জুড়ে সি বা ফোর্টরান কলিং কনভেনশনে কী কী জিনিসগুলির প্রয়োজনীয়তা অনুমান করা হয় on ফরট্রান ধরে নিয়েছে আপনি অ্যারে আরগগুলি পাস করতে পারবেন (মূলত পয়েন্টার)। সুতরাং ইতিমধ্যে আপনার 6502 মত মেশিনগুলিতে ফোরট্রানের জন্য বড় বাস্তবায়ন সমস্যা রয়েছে কারণ পয়েন্টার + সূচকের অ্যাড্রেসিং-মোডের অভাবের কারণে, যেমন আপনার উত্তরে আলোচনা করা হয়েছে এবং সি থেকে জেড 80 সংকলক কেন দুর্বল কোড তৈরি করে? retrocomputing.SE এ।
পিটার কর্ডেস

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

7

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

f :: Int -> (Int, Int)
f x = (x - 1, x + 1)

// Even C++ have tuples - see Boost.Graph for use
std::pair<int, int> f(int x) {
  return std::make_pair(x - 1, x + 1);
}

উপরের উদাহরণে, fএকটি ফাংশন 2 ইনস ফেরত দেয়।

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

data MyValue = MyValue Int Int

g :: Int -> MyValue
g x = MyValue (x - 1, x + 1)

অবশেষে, outপ্যারামিটারগুলি এমনকি কার্যকরী ভাষাগুলিতেও অনুকরণ করা যায় IORef। বেশিরভাগ ভাষায় ভেরিয়েবলের জন্য স্থানীয় সমর্থন না থাকার বিভিন্ন কারণ রয়েছে:

  • অস্পষ্ট শব্দার্থবিজ্ঞান : নিম্নলিখিত ফাংশনটি 0 বা 1 মুদ্রণ করে? আমি 0 টি মুদ্রণ করতে পারে এমন ভাষা এবং 1 টি মুদ্রণ করে এমন ভাষা সম্পর্কে জানি 1. এটি উভয়েরই সুবিধা রয়েছে (উভয়ই পারফরম্যান্সের ক্ষেত্রে, পাশাপাশি প্রোগ্রামারের মানসিক মডেলটির সাথে মেলে):

    int x;
    
    int f(out int y) {
      x = 0;
      y = 1;
      printf("%d\n", x);
    }
    f(out x);
    
  • অ-স্থানীয়করণের প্রভাব : উপরের উদাহরণ হিসাবে, আপনি দেখতে পাচ্ছেন যে আপনার একটি দীর্ঘ শৃঙ্খলা থাকতে পারে এবং অভ্যন্তরীণতম কার্যটি বিশ্বব্যাপী অবস্থাকে প্রভাবিত করে। সাধারণভাবে, ফাংশনটির প্রয়োজনীয়তাগুলি কী, এবং যদি পরিবর্তন আইনী হয় তবে তা যুক্তি করা শক্ত করে তোলে। প্রদত্ত যে বেশিরভাগ আধুনিক দৃষ্টান্তগুলি হয় হয় প্রভাবগুলি স্থানীয়করণের চেষ্টা করে (ওওপিতে এনক্যাপসুলেশন) বা পার্শ্ব-প্রভাবগুলি (ফাংশনাল প্রোগ্রামিং) মুছে ফেলার চেষ্টা করে, এটি সেই দৃষ্টান্তগুলির সাথে সাংঘর্ষিক।

  • অপ্রয়োজনীয় হচ্ছে : আপনার যদি টিপলস থাকে তবে আপনার কাছে outপ্যারামিটারগুলির কার্যকারিতা 99% এবং প্রতিমা ব্যবহারের 100% রয়েছে। যদি আপনি মিশ্রণটিতে পয়েন্টার যুক্ত করেন তবে আপনি অবশিষ্ট 1% কভার করেন।

আমার এমন একটি ভাষার নামকরণে সমস্যা হয় যা একটি টিপল, শ্রেণি বা outপ্যারামিটার ব্যবহার করে একাধিক মান ফেরত দিতে পারে না (এবং বেশিরভাগ ক্ষেত্রে এই পদ্ধতিগুলির 2 বা ততোধিক অনুমোদিত)।


+1 কীভাবে কার্যকরী ভাষাগুলি এটি একটি মার্জিত এবং বেদনাদায়ক উপায়ে পরিচালনা করে তা উল্লেখ করার জন্য।
আন্দ্রেস এফ।

1
প্রযুক্তিগতভাবে আপনি এখনও একটি একক মান ফিরিয়ে দিচ্ছেন: ডি (একমাত্র মানটি একাধিক মানকে বিভক্ত করার জন্য তুচ্ছ)।
টমাস এডিং

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

1
টিউপল "ওয়ার্কআরাউন্ড" বিনামূল্যেও আসে না। এটি অপ্টিমাইজেশনের সুযোগগুলি অবরুদ্ধ করে। যদি কোনও এবিআই বিদ্যমান থাকে যা সিপিইউ রেজিস্টারে এন রিটার্ন মানগুলি ফেরত দেওয়ার অনুমতি দেয় তবে সংকলকটি আসলে একটি টিউপল উদাহরণ তৈরি করে এটি নির্মাণের পরিবর্তে অনুকূলিত করতে পারে।
বিট টিকলার

1
@ বিট টিকলার এ বি আই নিয়ন্ত্রণ করলে রেজিস্টাররা পাস করার জন্য কাঠামোর প্রথম এন ক্ষেত্রগুলিতে ফিরে আসা বাধা দেওয়ার কিছুই নেই।
ম্যাকিয়েজ পাইচোটকা

6

আমার মনে হয় এটা কারণ এর এক্সপ্রেশন যেমন (a + b[i]) * c

এক্সপ্রেশনগুলি "একক" মান নিয়ে গঠিত। উপরে বর্ণিত চারটি ভেরিয়েবলের যেকোন জায়গায় একটি একক মানটি ফেরত ফাংশনটি সরাসরি একটি অভিব্যক্তিতে ব্যবহার করা যেতে পারে। একটি বহিরাগত আউটপুট ফাংশন একটি এক্সপ্রেশন মধ্যে অন্তত কিছুটা আনাড়ি হয়।

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


4

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


3
আপনি যেখানে একাধিক রিটার্ন ক্লিয়ারার এবং / বা আরও কার্যকর কোড সরবরাহ করেন তার একটি উদাহরণ সরবরাহ করতে পারেন?
স্টিভেন এভার্স

3
উদাহরণস্বরূপ, সি ++ সিওএম প্রোগ্রামিংয়ে অনেক ফাংশনের একটি [out]প্যারামিটার থাকে তবে কার্যত সকলেই একটি HRESULT(ত্রুটি কোড) ফেরত দেয় । সেখানে কেবল একটি জুটি পাওয়া বেশ ব্যবহারিক হবে। পাইথনের মতো টিউপসগুলিতে যেমন ভাল সমর্থন রয়েছে এমন ভাষাগুলিতে, আমি দেখেছি এমন প্রচুর কোডে এটি ব্যবহৃত হয়।
ফেলিক্স ডমব্যাক

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

3
প্রচুর সময় আপনি অ-সুস্পষ্ট উপায়ে রিটার্ন মানটিতে তথ্য এনকোডিং শেষ করেন - যেমন; নেতিবাচক মানগুলি ত্রুটি কোডগুলি, ধনাত্মক মানগুলি ফলাফল। Yuk। একটি হ্যাশ টেবিল অ্যাক্সেস করা, আইটেমটি পাওয়া গেছে কিনা তা নির্দেশ করতে এবং আইটেমটি ফিরে পাওয়া সর্বদা অদৃশ্য।
ddyer

@SteveEvers মতলব sortফাংশন স্বাভাবিকভাবে একটি অ্যারের বাছাই করে: sorted_array = sort(array)। মাঝে মাঝে এও সংশ্লিষ্ট সূচকের প্রয়োজন: [sorted_array, indices] = sort(array)। কখনও কখনও আমি কেবল সূচকগুলি চাই: [~, indices]= সাজানো (অ্যারে) . The function সাজ্ট` বলতে পারে কত আউটপুট আর্গুমেন্টের প্রয়োজন হয় তাই যদি 1 এর তুলনায় 2 আউটপুটগুলির জন্য অতিরিক্ত কাজ করা প্রয়োজন হয় তবে প্রয়োজনে কেবল সেই ফলাফলগুলি গণনা করতে পারে।
অঙ্কিত

2

বেশিরভাগ ভাষায় যেখানে ফাংশন সমর্থিত আপনি যেখানেই এই ধরণের ভেরিয়েবল ব্যবহার করতে পারেন যেখানেই কোনও ফাংশন কল ব্যবহার করতে পারেন: -

x = n + sqrt(y);

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


5
কেবল অনুপযুক্ত ফাংশন ব্যবহার করবেন না। এটি কোনও ফাংশন দ্বারা উত্থাপিত "সমস্যা" থেকে আলাদা নয় যা কোনও মান দেয় না বা অ-সংখ্যাসূচক মান দেয় না।
ডিডিয়ার

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

এমনকি যখন এগুলি না হয়, পাইথনের টিপল আনপ্যাকিংয়ের মতো, আপনি কোনটি বেছে নিতে পারেন তা বেছে নিতে পারেন:foo()[0]
ইজকাটা

হুবহু, যদি কোনও ফাংশন 2 টি মান দেয়, তবে তার ফেরতের প্রকারটি 2 মান, একক মান নয়। প্রোগ্রামিং ভাষা আপনার মন পড়া উচিত নয়।
মার্ক ই। হাজেস

1

আমি কেবল হার্ভেয়ের উত্তরটি তৈরি করতে চাই। আমি এই প্রশ্নটি মূলত একটি নিউজ টেক সাইটে (আর্স্টেকনিকা) পেয়েছি এবং একটি আশ্চর্য ব্যাখ্যা পেয়েছি যে আমি সত্যিই এই প্রশ্নের মূলটির উত্তর পেয়েছি এবং অন্য সমস্ত উত্তর (হার্ভে বাদে) থেকে আমি অনুপস্থিত রয়েছি:

ফাংশন থেকে একক রিটার্নের উত্স মেশিন কোডের মধ্যে। মেশিন কোড স্তরে, একটি ফাংশন এ (সঞ্চালক) রেজিস্ট্রারে কোনও মান ফিরিয়ে দিতে পারে। অন্য কোনও রিটার্ন মান স্ট্যাকের মধ্যে থাকবে।

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

এটি জিজ্ঞাসা করার মতো যে কেন অ্যাসাইনমেন্ট একবারে এক পরিবর্তনশীল। আপনার কাছে এমন কোনও ভাষা থাকতে পারে যা উদাহরণস্বরূপ a, b = 1, 2 এর অনুমতি দেয়। তবে এটি মেশিনের কোড স্তরে শেষ হবে = = 1 এর পরে বি = 2।

প্রোগ্রামিং ল্যাঙ্গুয়েজ কনস্ট্রাক্টসের কিছুটা যুক্তি রয়েছে যা কোডটি সংকলন ও চলমান অবস্থায় আসলে কী ঘটবে সে সম্পর্কে কিছুটা সংলগ্নতা বহন করে।


সি-এর মতো নিম্ন-স্তরের ভাষা যদি প্রথম শ্রেণীর বৈশিষ্ট্য হিসাবে একাধিক রিটার্ন মানগুলিকে সমর্থন করে তবে সি কলিং কনভেনশনগুলিতে একাধিক রিটার্ন-মান রেজিস্টার অন্তর্ভুক্ত থাকবে, x86- এ পূর্ণসংখ্যা / পয়েন্টার ফাংশন আরোগুলি পাস করার জন্য 6 টি রেজিস্টার ব্যবহার করা হয় same 64 সিস্টেম ভি এবিআই। (আসলে x86-64 এসআইএসভি আরডিএক্সে 16 বাইট প্যাক করে স্ট্রাক্ট রিটার্ক করে: আরএক্স রেজিস্টার জুটি This এটি ভাল তবে স্ট্রাকটি কেবল লোড করা হয়েছিল এবং সংরক্ষণ করা হবে, তবে অতিরিক্ত আনপ্যাকিংয়ের জন্য পৃথক রেগগুলিতে পৃথক সদস্য থাকা এমনকি ব্যয় করতে হবে) যদি তারা b৪ বিটের চেয়ে সংকীর্ণ হয়))
পিটার

সুস্পষ্ট কনভেনশনটি RAX হবে, তারপরে আরগ-পাসিং রেজস। (আরডিআই, আরএসআই, আরডিএক্স, আরসিএক্স, আর 8, আর 9) অথবা উইন্ডোজ এক্স 64 কনভেনশনে, আরসিএক্স, আরডিএক্স, আর 8, আর 9। সি যেহেতু স্থানীয়ভাবে একাধিক রিটার্ন মান না রাখে, সি এবিআই / কলিং কনভেনশনগুলি কেবল বিস্তৃত পূর্ণসংখ্যা এবং কিছু স্ট্রাক্টের জন্য একাধিক রিটার্ন রেজিস্টার নির্দিষ্ট করে। এআরএম ® আর্কিটেকচারের জন্য প্রসেসার কল স্ট্যান্ডার্ড দেখুন : 2 পৃথক, তবে সম্পর্কিত রিটার্ন মানগুলি এআরএম-তে 2 রিটার্ন মান পাওয়ার জন্য সংক্ষেপককে দক্ষ asm করতে সংকলকটি পেতে একটি প্রশস্ত int ব্যবহার করার উদাহরণ হিসাবে।
পিটার কর্ডেস

-1

এটি গণিত দিয়ে শুরু হয়েছিল। ফর্ম্যাটান, "ফর্মুলা অনুবাদ" এর জন্য নামকরণ করা হয়েছিল প্রথম সংকলক। ফরট্রান ফিজিক্স / ম্যাথ / ইঞ্জিনিয়ারিং-এর দিকে পরিচালিত ছিল এবং ছিল।

প্রায় পুরানো কোবোলের কোনও সুস্পষ্ট ফেরতের মূল্য ছিল না; এটি সবেমাত্র সাবরুটাইনস ছিল। সেই থেকে এটি বেশিরভাগ জড়তা।

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


4
এই প্রশ্ন জিজ্ঞাসা উত্তর না
মশা

@ উত্তর আমার জন্য এটি উত্তর। এটি বোঝার জন্য ইতিমধ্যে কারও একটি ব্যাকগ্রাউন্ডের প্রয়োজন আছে এবং সেই ব্যক্তি সম্ভবত প্রশ্নটি জিজ্ঞাসা করবেন না ...
নেট

"ফরচরান ... প্রথম সংকলকটি ছিল" এর মত বিবৃতিগুলি মোট জগাখিচু হবার জন্য নেচকে খুব কমই খুব পটভূমি প্রয়োজন । এটি ভুলও নয়। শুধু এই "উত্তর" বাকি ভালো
মশা

লিঙ্কটি বলছে এর আগে সংকলকগুলিতে চেষ্টা করা হয়েছিল, তবে "আইবিএম-এ জন ব্যাকাসের নেতৃত্বে ফোরট্রান দলকে সাধারণত ১৯৫7 সালে প্রথম সম্পূর্ণ সংকলক প্রবর্তন করার জন্য কৃতিত্ব দেওয়া হয়"। প্রশ্ন করা হয়েছিল কেন শুধু একজন? আমি যেমন বলেছি। এটি বেশিরভাগই গণিত এবং জড়তা ছিল। "ফাংশন" শব্দটির গাণিতিক সংজ্ঞাটির জন্য ঠিক এক ফলাফলের মান প্রয়োজন requires সুতরাং এটি একটি পরিচিত ফর্ম ছিল।
রিকি

-2

প্রসেসর মেশিনের নির্দেশাবলীতে ফাংশন কলগুলি কীভাবে করা হয় এবং মেশিন কোড থেকে সমস্ত প্রোগ্রামিং ভাষাগুলি উত্থাপিত হয় তা যেমন: সি -> অ্যাসেম্বলি -> যন্ত্র fact

প্রসেসরগুলি কীভাবে ফাংশন কলগুলি সম্পাদন করে

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

এখন, কেন প্রসেসরগুলি এইভাবে ডিজাইন করা হয়েছিল ... এটি সম্ভবত সম্পদের সীমাবদ্ধতার প্রশ্ন question

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