টাইপটি আধুনিক প্রোগ্রামিং ভাষাগুলিতে পরিবর্তনশীল নামের পরে কেন চলে?


57

কেন এটি প্রায় সমস্ত আধুনিক প্রোগ্রামিং ভাষায় (গো, মরিচা, কোটলিন, সুইফ্ট, স্কালা, নিম, এমনকি পাইথনের শেষ সংস্করণ) প্রকারগুলি সর্বদা ভেরিয়েবলের ঘোষণায় পরিবর্তকের নামের পরে আসে, এবং এর আগে নয়?

কেন x: int = 42এবং না int x = 42?
দ্বিতীয়টি কি পূর্বের চেয়ে বেশি পাঠযোগ্য নয়?
এটি কি কেবল একটি প্রবণতা বা এই সমাধানের পিছনে আসলেই কোনও অর্থবহ কারণ রয়েছে?



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


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

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

উত্তর:


64

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

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

এই আর্গুমেন্টের বিশেষত শক্তিশালী পায় যখন আপনি সব ঐচ্ছিক টাইপ সংশোধনকারীদের একটি "অ আধুনিক" ভাষা সি ++ মত আছে, যেমন বিবেচনা *পয়েন্টার জন্য, &, রেফারেন্সের জন্য const, volatileইত্যাদি। একবার আপনি একাধিক ঘোষণার জন্য কমাতে ছুঁড়ে ফেললে আপনি পয়েন্টার int* a, b;না দেওয়ার মতো কিছু সত্যই অদ্ভুত অস্পষ্টতা পেতে শুরু করেন b

এমনকি সি ++ এখন আকারে ঘোষণা "ডান দিকে প্রকার" সমর্থন auto x = int{ 4 };, এবং এটি কিছু সুবিধার আছে


2
এই জাতীয় বাধ্যতামূলক কীওয়ার্ডগুলির অস্তিত্ব স্বীকার করার জন্য +1 varপার্সিং সরলকরণের বেশিরভাগ অংশ সরবরাহ করে।
বিট্রি

2
varকীওয়ার্ডের অস্তিত্ব কি নাম-প্রথম চিহ্নিতকরণের উদ্দেশ্যকে পরাভূত করে না? আমি var userInput: String = getUserInput()ওভার লেখার সুবিধা দেখছি না String userInput = getUserInput()। যদি userInput = getUserInput()অনুমতি দেওয়া হয় তবেই সুবিধাটি প্রাসঙ্গিক হতে পারে তবে এটি একটি স্কোপড ভেরিয়েবলের অন্তর্নিহিত ডিক্লারটনকে বোঝায়, যা আমি বেশ ঘৃণিত মনে করি।
কেডিবি

2
সি # এবং সি ++ এর মতো ভাষাগুলিতে @kdb এটি হবে var userInput = getUserInput()বা auto userInput = getUserInput(), সংকলকটি getUserInput()রিটার্ন জানে Stringতাই টাইপ ছাড়ের কীওয়ার্ড সহ আপনাকে এটি নির্দিষ্ট করতে হবে না। userInput = getUserInput()অবশ্যই ঘোষণা করার আগে ব্যবহার।
ওয়েস Toleman

32

প্রায় সব আধুনিক প্রোগ্রামিং ভাষায় কেন (গো, মরিচা, কোটলিন, সুইফ্ট, স্কালা, নিম, এমনকি পাইথন শেষ সংস্করণ) প্রকারগুলি সর্বদা পরিবর্তনশীল ঘোষণার পরে আসে, এবং এর আগে নয়?

আপনার ভিত্তি দুটি ফ্রন্টে ত্রুটিযুক্ত:

  • এখানে নতুন-ইশ প্রোগ্রামিং ভাষা রয়েছে যা সনাক্তকারীটির আগে টাইপ করে before সি, ডি, বা সিলোন উদাহরণস্বরূপ।
  • শনাক্তকারীর পরে প্রকারটি থাকা কোনও নতুন ঘটনা নয়, এটি কমপক্ষে পাস্কালে ফিরে আসে (১৯–৮-১৯69৯ নকশাকৃত, ১৯ 1970০ সালে প্রকাশিত), তবে আসলে গাণিতিক টাইপ থিওরিতে ব্যবহৃত হয়েছিল, যা শুরু হয় ১৯০২ ডলার। এটি এমএল (1973), সিএলইউ (1974), হোপ (1970), মডিউলা -2 (1977–1985), অ্যাদা (1980), মিরান্ডা (1985), ক্যামেল (1985), আইফেল (1985), ওবেরনেও ব্যবহৃত হয়েছিল (1986), মডুলা -3 (1986–1988), এবং হাস্কেল (1989)।

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

কেন x: int = 42এবং না int x = 42? দ্বিতীয়টি কি পূর্বের চেয়ে বেশি পাঠযোগ্য নয়?

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

এটি কি কেবল একটি প্রবণতা বা এরকম কোনও সমাধানের পিছনে আসলেই কোনও অর্থবহ কারণ রয়েছে?

যদি এটি একটি প্রবণতা হয় তবে এটি বেশ জেদী: আমি যেমনটি বলেছি, গণিতে এটি একশো বছর পিছিয়ে যায়।

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

val i: Int = 10

তারপরে টাইপটি ছেড়ে দেওয়া এবং এটির মতো অনুমান করা তুচ্ছ ial

val i = 10

প্রকারটি যদি শনাক্তকারীটির আগে আসে তবে:

Int i = 10

তারপরে পার্সারকে কোনও ঘোষণার থেকে একটি অভিব্যক্তি আলাদা করার পক্ষে শক্ত হয়ে উঠতে শুরু করে:

i = 10

ভাষা ডিজাইনাররা সাধারণত যে সমাধানটি নিয়ে আসে তা হ'ল "আমি কোনও টাইপ লিখতে চাই না" মূলশব্দটি প্রবর্তন করে যা টাইপের পরিবর্তে লিখতে হয়:

var  i = 10; // C♯
auto i = 10; // C++

তবে এটি আসলে খুব একটা বোঝায় না: আপনাকে মূলত স্পষ্টভাবে একটি টাইপ লিখতে হবে যা বলে যে আপনি কোনও প্রকার লেখেন না। তাই না? এটিকে ছেড়ে দেওয়া আরও সহজ এবং বোধগম্য হবে তবে ব্যাকরণটি আরও জটিল করে তুলেছে।

(এবং আসুন এমনকি সি মধ্যে ফাংশন পয়েন্টার ধরণের সম্পর্কে কথা বলা যাক )

উপরে উল্লিখিত বেশ কয়েকটি ভাষার ডিজাইনাররা এই বিষয়টিতে ওজন দিয়েছেন:

  • এফএকিউ যান (এছাড়াও দেখুন: গো ঘোষণার সিনট্যাক্স ):

    পিছনে ঘোষণা কেন?

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

    int* a, b;
    

    aপয়েন্টার হিসাবে ঘোষনা করে কিন্তু না b; যাও

    var a, b *int
    

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

    var a uint64 = 1
    

    হিসাবে একই প্রভাব আছে

    a := uint64(1)
    

    পার্সিংকে কেবলমাত্র ব্যাকরণ নয় এমন প্রকারের জন্য একটি পৃথক ব্যাকরণ রেখেও সরল করা হয়; যেমন কীওয়ার্ডগুলি funcএবং chanবিষয়গুলি পরিষ্কার রাখুন।

  • কোটলিন এফএকিউ :

    ডানদিকে প্রকারের ঘোষণা কেন?

    আমরা বিশ্বাস করি এটি কোডটিকে আরও পঠনযোগ্য করে তোলে। তদতিরিক্ত, এটি কিছু দুর্দান্ত সিনট্যাকটিক বৈশিষ্ট্য সক্ষম করে। উদাহরণস্বরূপ, প্রকারের টীকাগুলি ছেড়ে দেওয়া সহজ। স্কেলাও প্রমাণ করেছে যে এটি কোনও সমস্যা নয়।

  • স্কালায় প্রোগ্রামিং :

    জাভা থেকে প্রধান বিচ্যুতি টাইপ টীকাগুলির সিনট্যাক্স সম্পর্কিত — এটি জাভাতে " variable: Type" এর পরিবর্তে " Type variable" "। স্কালার পোস্টফিক্স টাইপের সিনট্যাক্স প্যাসকেল, মডুলা -2 বা আইফেলের সাথে সাদৃশ্যপূর্ণ। এই বিচ্যুতিটির মূল কারণটি টাইপ অনুক্রমের সাথে সম্পর্কিত, যা আপনাকে প্রায়শই কোনও ভেরিয়েবলের ধরণ বা কোনও পদ্ধতির রিটার্নের ধরণ বাদ দিতে দেয়। variable: Typeএই সিনট্যাক্সটি ব্যবহার করা সহজ "কোলন এবং প্রকারটি ছেড়ে দিন। তবে সি-স্টাইলের Type variableসিনট্যাক্সে আপনি কেবল টাইপটি ছেড়ে দিতে পারবেন না-সংজ্ঞা আর চালু করার জন্য কোনও মার্কার থাকবে না। আপনার অনুপস্থিত প্রকারের জন্য স্থানধারক হতে কিছু বিকল্প কীওয়ার্ডের প্রয়োজন হবে (সিএ ♯.০, যা varএই উদ্দেশ্যে কিছু প্রকারের অনুমান ব্যবহার করে )। এই জাতীয় বিকল্প কীওয়ার্ড স্কালার পদ্ধতির চেয়ে বেশি অ্যাড-হক এবং কম নিয়মিত অনুভব করে।

দ্রষ্টব্য: সিলোন ডিজাইনাররা প্রিফিক্স টাইপের বাক্য গঠন কেন ব্যবহার করেছেন তাও নথিভুক্ত করেছেন :

পোস্টফিক্স ধরণের টীকাগুলির পরিবর্তে উপসর্গ

আপনি ঘোষণার নামের পরে প্যাস্কল এবং এমএল পরিবর্তে প্রথমে টীকা টান দেওয়ার ক্ষেত্রে সি এবং জাভা অনুসরণ করেন কেন?

কারণ আমরা এটি মনে করি:

shared Float e = ....
shared Float log(Float b, Float x) { ... }

এর চেয়ে পড়ার পক্ষে সহজ কি:

shared value e: Float = .... 
shared function log(b: Float, x: Float): Float { ... }

এবং আমরা সহজেই বুঝতে পারি না যে কেউ কীভাবে অন্যথায় ভাবতে পারে!

ব্যক্তিগতভাবে, আমি তাদের "যুক্তি" অন্যদের তুলনায় অনেক কম বিশ্বাস করি find


4
টাইপ ছেড়ে করার ক্ষমতা মনে হয় এবং এখনও সহজ পার্সিং যোগে মঞ্জুর করা হয় var, auto, let, বা মত পরিবর্তনশীল টাইপ ঘোষণা হয় পাশ যা দ্বারা নয়। var Int x = 5অথবা Int var x = 5উভয়ই সংক্ষিপ্ত করা যেতে পারে var x = 5
বিট্রি

5
যখন আপনি এটির জন্য সমানভাবে পাঠযোগ্য হয়ে ওঠেন এবং toচ্ছিক প্রকারের যুক্তিটি দৃ is় হয়, তবুও আমি উল্লেখ করতে চাই যে আইডিই এই ধরণের উপর ভিত্তি করে ভেরিয়েবলের নামগুলি স্বয়ংক্রিয়ভাবে প্রস্তাব করতে সক্ষম নয়। আমি মিস করি যখন আমি টাইপস্ক্রিপ্ট লিখি।
পিয়েরে হেনরি 13

"Your premise is flawed on two fronts" ঐ সব চেয়ে সি # বা ডি নতুন হয়
Det

3
"তবে এটি আসলে খুব একটা বোঝায় না: আপনাকে মূলত স্পষ্টভাবে একটি টাইপ লিখতে হবে যা বলে যে আপনি কোনও প্রকার লেখেন না।" ঠিক আছে, টাইপ অন-রাইট ভার্সনটি আপনার উদাহরণে হুবহু একই রকম ... এছাড়াও আমি এটির দ্বিমত পোষণ করি না বলেও আমি একমত নই। এটি funcগো হিসাবে ঠিক ততটা জ্ঞান দেয় ।
সোপেল

4

পাস্কাল এটিও করে, এবং কোনও নতুন ভাষা নয়। এটি স্ক্র্যাচ থেকে তৈরি যদিও একাডেমিক ভাষা ছিল।

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

সি # এবং জাভা স্টেম সি থেকে তাই তাদের "পূর্ববর্তী শিল্প" কে সম্মান করতে হবে, তাই অভিজ্ঞ প্রোগ্রামারকে বিভ্রান্ত না করা।


3
আদাও সেভাবে করে, তবে অ্যাডা অবশ্যই একটি "একাডেমিক ভাষা" নয়।
জন আর। স্ট্রোহম

আডা এটি করেছিলেন কারণ এটি পাস্কাল এবং মডিউলা ২ থেকে প্রচুর পরিমাণে আঁকড়েছিল
রোবটটি

2
@ স্টিভেন বার্নাপ, একটি দ্রুত অনুসন্ধানে জানা গেছে যে মডারুলা -২-তে উইথের প্রথম বইটি 1982 সালের মাঝামাঝি সময়ে প্রকাশিত হয়েছিল। এর আগে বেশ কয়েক বছর আগে অ্যাডা বিকাশাধীন ছিল (১৯D7 বা তার পরে ডওডি 1 ছিল, যেমনটি আমি স্মরণ করি), এবং ১৯ 198৩ সালে এএনএসআই স্ট্যান্ডার্ড এবং মিল-এসটিডি উভয় হিসাবে প্রমিত করা হয়েছিল Ad তাদের সূচনা পয়েন্ট হিসাবে। (বেল ল্যাবগুলি সি এর ভিত্তিতে প্রার্থীর ভাষা জমা দেওয়ার জন্য ডিওডি দ্বারা আমন্ত্রণ জানানো হয়েছিল। তারা অস্বীকার করে বলেছিল যে সিড তখন ডিওড মিশন-সমালোচনামূলক সফ্টওয়্যারটির পক্ষে যথেষ্ট শক্তিশালী হবে না।)
জন আর স্ট্রোহম

আমাকে অবশ্যই ভুল ধারণা করা উচিত আমি ভের্থ অ্যাডা জড়িত ছিল।
এ রোবট

পাসকাল শুরু বন্ধ একটি একাডেমিক ভাষা, কিন্তু 90s শেষে এটি হচ্ছে শেষপ্রান্তে ছিল ভাষা উইন্ডোজ ডেল্ফী হলো, এর মাধ্যমে অ্যাপ পর্যন্ত Borland মূল্যের সঙ্গে হাঙ্গর jumped এবং দরজা জন্য জাভা এবং C # খোলা বাম লিখতে আসুন এবং পুরস্কার চুরি। লিগ্যাসি উইন্ডোজ অ্যাপ ওয়ার্ল্ডে আপনি এখনও সেখানে এক টন দেলফি দেখতে পাবেন।
শায়নে

1

কেন x: int = 42এবং না int x = 42? দ্বিতীয়টি কি পূর্বের চেয়ে বেশি পাঠযোগ্য নয়?

এই জাতীয় একটি সহজ উদাহরণে, খুব বেশি পার্থক্য নেই, তবে আসুন এটি আরও জটিল করুন: int* a, b;

এটি সি-তে একটি আসল, বৈধ ঘোষণা, তবে এটি স্বজ্ঞাতভাবে এটির মতো দেখাবে বলে তা করে না। দেখে মনে হচ্ছে আমরা দুটি ধরণের ভেরিয়েবল ঘোষনা করছি int*তবে বাস্তবে আমরা এক int*এবং একটিকে ঘোষণা করছি int

যদি আপনার ভাষাটি তার ঘোষণাগুলিতে পরিবর্তনশীল নাম (গুলি) এর পরে টাইপ করে রাখে তবে সেই সমস্যাটি প্রবেশ করা অসম্ভব।


4
আমি নিশ্চিত নই যে ধরণের ঘোষণার পরে কেন স্থানান্তরিত করবে এটি এতে প্রভাব ফেলবে। কি x, y *int;দুই *intঅথবা এক *intএবং এক int? দুটির পরিবর্তে একটি তৈরি করা int*বা *intএকটি টোকেন এটিকে সমাধান করবে, বা এর মতো অতিরিক্ত সিনট্যাকটিক উপাদান ব্যবহার করবে :, যা উভয় দিক থেকেই কাজ করতে পারে।
বিট্রি

@ 8bittree প্রতিটি ভাষা আমি যে তার সাথে পরিচিত নই নাম প্রথম ঘোষণা মত একটি অতিরিক্ত টোকেন ব্যবহার করেন, ব্যবহার :বা as, নাম এবং টাইপ মধ্যে।
ম্যাসন হুইলার


2
এবং গো-এর x, y *intঅর্থ "পয়েন্টার-টু-ইন্ট টাইপ সহ দুটি ভেরিয়েবল x এবং y ঘোষণা করুন"।
ভ্যাটাইন

10
সি # উপসর্গ বাক্সটি ব্যবহার করে, তবুও এটি int[] x, yদুটি অ্যারে হিসাবে বিবেচনা করে। এটি কেবল নিরীহ সি সিনট্যাক্স যা এই পরিবর্তনকারীদের পরিবর্তনশীল (এবং উপসর্গ এবং পোস্টফিক্সের মিশ্রণ, কম নয়) হিসাবে অবিচ্ছিন্ন অপারেটর হিসাবে বিবেচনা করে যা সমস্যা সৃষ্টি করে।
কোডসইনচাউস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.