কেন রুবি স্রষ্টা প্রতীক ধারণাটি ব্যবহার করতে বেছে নিয়েছিলেন?


15

tl; dr: প্রতীকগুলির ভাষা-অজ্ঞাত সংজ্ঞা এবং অন্যান্য ভাষায় এগুলি রাখার কারণ থাকতে পারে?

তাহলে, কেন রুবি স্রষ্টা symbolsভাষায় ধারণাটি ব্যবহার করলেন ?

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

মূল প্রশ্নটি হ'ল, symbolsরুবির ধারণাটি কী পারফরম্যান্সের জন্য বিদ্যমান, বা ভাষার কিছুটা রচনার কারণে প্রয়োজনীয় কিছু?

রুবির কোনও প্রোগ্রামটি কি তার চেয়ে হালকা এবং / বা দ্রুততর হবে, আসুন ধরা যাক, পাইথন বা জাভাস্ক্রিপ্টের অংশ? যদি তাই হয় তবে কি তা হবে symbols?

যেহেতু রুবির একটি উদ্দেশ্য মানুষের পক্ষে সহজভাবে পড়তে এবং লিখতে সহজ হয়, তাই এর সৃষ্টিকর্তা দোভাষী নিজেই এই উন্নতিগুলি (যেমন এটি অন্য ভাষায় হতে পারে) প্রয়োগ করে কোডিংয়ের প্রক্রিয়াটি সহজ করতে পারেন নি?

দেখে মনে হচ্ছে প্রত্যেকে কেবল কী symbolsকী এবং কীভাবে তাদের ব্যবহার করতে হয় তা জানতে চায় এবং কেন তারা সেখানে প্রথম স্থানে নেই।


স্কালায় আমার মাথার উপরের দিক থেকে সিম্বল রয়েছে। আমার মনে হয় অনেক লিপস করল।
ডি বেন নোবল

উত্তর:


17

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

রুবি নিম্নলিখিত পদক্ষেপে ডিজাইন করা একটি ভাষা:

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

সুতরাং, তাত্ত্বিকভাবে, রুবি মূলত একটি লিস্প ছিলেন।

এখন থেকে একে ম্যাজলিস্প বলি। ;-)

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

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

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

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


5
ভাল উত্তর. তবে আমি মাতজের সাথে একমত নই: আমি কখনই ম্যাক্রোকে লিস্প উপভাষা না করে কোনও ভাষা বলার কথা ভাবব না। লিস্পের রানটাইম-মেটাপোগ্র্যামিং সুবিধাগুলি হ'ল জিনিসটি যা এই ভাষাকে তার দারুণ শক্তি দেয়, এটি তার অস্বাভাবিক সরল, অনভিজ্ঞ ব্যাকরণের জন্য তৈরি করে।
--মাস্টার

11

তাহলে, কেন রুবি স্রষ্টাদের symbolsভাষায় ধারণাটি ব্যবহার করতে হয়েছিল?

ঠিক আছে, তারা কঠোরভাবে "করতে" ছিল না, তারা বেছে নিয়েছিল। এছাড়াও, নোট করুন যে কঠোরভাবে বলা Symbols ভাষার ভাষার অংশ নয়, তারা মূল গ্রন্থাগারের অংশ। তারা কি ভাষা-স্তরের আক্ষরিক সিনট্যাক্স আছে, কিন্তু তারা ঠিক যেমন ভাল কাজ করবে যদি আপনি কল করে তাদের গঠন করা ছিল Symbol::new

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

এই "প্রচুর অন্যান্য ভাষা" কী তা আপনি বলেননি, তবে এখানে Symbolরুবির মতো ডেটাটাইপযুক্ত ভাষার একটি ছোট্ট অংশ রয়েছে :

এছাড়াও অন্যান্য ভাষা রয়েছে যা Symbolবিভিন্ন আকারে এর বৈশিষ্ট্যগুলি সরবরাহ করে । জাভাতে, উদাহরণস্বরূপ, রুবির Stringগুলি এর বৈশিষ্ট্যগুলি দুটি (আসলে তিনটি) ধরণের মধ্যে বিভক্ত: Stringএবং StringBuilder/ StringBuffer। অন্যদিকে, রুবির Symbolপ্রকারের বৈশিষ্ট্যগুলি জাভা Stringপ্রকারে ভাঁজ করা হয়েছে : জাভা Stringগুলি অভ্যন্তরীণ হতে পারে , আক্ষরিক স্ট্রিং এবং Stringগুলি যা সংকলন-সময় মূল্যায়িত ধ্রুবক এক্সপ্রেশনগুলির ফলস্বরূপ স্বয়ংক্রিয়ভাবে অভ্যন্তরীণ হয়, গতিশীলভাবে উত্পাদিত Stringএসকে কল করে অভ্যন্তরীণ করা যায় String.internপদ্ধতি। Stringজাভাতে ইন্টার্ন করা হুবহু Symbolরুবির মতো, তবে এটি আলাদা ধরণের হিসাবে প্রয়োগ করা হয়নি, এটি জাভা থেকে আলাদা একটি রাষ্ট্র মাত্রStringথাকতে পারে। (দ্রষ্টব্য: রুবির পূর্ববর্তী সংস্করণগুলিতে, String#to_symবলা হত String#internএবং সেই পদ্ধতিটি আজও উত্তরাধিকারের নাম হিসাবে বিদ্যমান))

মূল প্রশ্নটি হতে পারে: symbolsরুবিতে কী ধারণাটি নিজের এবং অন্যান্য ভাষাগুলির উপর একটি পারফরম্যান্স অভিপ্রায় হিসাবে উপস্থিত রয়েছে,

Symbolগুলি সুনির্দিষ্ট শব্দার্থবিজ্ঞানের সাথে প্রথম এবং সর্বাগ্রে একটি ডেটাটাইপ । এই শব্দার্থবিজ্ঞানগুলি কিছু পারফরম্যান্স অপারেশনগুলি (যেমন দ্রুত ও (1) সমতা পরীক্ষা) বাস্তবায়ন করাও সম্ভব করে তোলে তবে এটি মূল উদ্দেশ্য নয়।

ভাষা ঠিকভাবে লেখার কারণে বা কিছু আছে যা প্রয়োজন?

Symbolরুবি ভাষায় মোটেই প্রয়োজন হয় না, রুবি সেগুলি ছাড়া ঠিক কাজ করবে। এগুলি খাঁটিভাবে একটি গ্রন্থাগার বৈশিষ্ট্য। ভাষার সাথে আবদ্ধভাবে ঠিক একটি জায়গা রয়েছে Symbol: একটি defপদ্ধতির সংজ্ঞা Symbolপ্রকাশটি যে পদ্ধতির সংজ্ঞা দেওয়া হচ্ছে তার নাম বোঝাতে একটি মূল্যায়ন করে । যাইহোক, এটি একটি বরং সাম্প্রতিক পরিবর্তন, তার আগে, রিটার্ন মানটি কেবল অনির্ধারিত ছিল। এমআরআই কেবল মূল্যায়িত হয় nil, রুবিনিয়াস কোনও Rubinius::CompiledMethodবস্তুর কাছে মূল্যায়ন করেন ইত্যাদি। এটি একটি UnboundMethod... বা মাত্র একটি মূল্যায়ন করা সম্ভব হবে String

রুবির কোনও প্রোগ্রাম কি হালকা এবং / বা তার চেয়ে দ্রুততর হতে পারে, যাক, পাইথন বা নোডের অংশ? যদি তাই হয় তবে কি তা হবে symbols?

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

যেহেতু রুবির একটি উদ্দেশ্য মানুষের পক্ষে সহজভাবে পড়তে এবং লিখতে সহজ হয়, তাই এর নির্মাতারা কি অনুবাদকদের নিজেই (যেমন এটি অন্যান্য ভাষায় হতে পারে) উন্নতিগুলি প্রয়োগ করে কোডিংয়ের প্রক্রিয়াটি সহজ করতে পারেন না?

নং Symbolগুলি কোনও সংকলক অপ্টিমাইজেশন নয়। এগুলি নির্দিষ্ট শব্দার্থবিজ্ঞানের সাথে পৃথক ডেটাটাইপ। এগুলি YARV এর ফ্লোনমের মতো নয় যা এগুলির জন্য ব্যক্তিগত অভ্যন্তরীণ অপ্টিমাইজেশন Float। এ পরিস্থিতির জন্য হিসাবে একই নয় Integer, Bignumএবং Fixnum, যা হওয়া উচিত অদৃশ্য ব্যক্তিগত অভ্যন্তরীণ অপ্টিমাইজেশান বিস্তারিত, কিন্তু দুর্ভাগ্যবশত নয়। (এটি শেষ পর্যন্ত রুবি ২.৪ এ স্থির হতে চলেছে, যা সরিয়ে দেয় Fixnumএবং Bignumঠিক ছেড়ে যায় Integer))

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

প্রতীকগুলির ভাষা-অজ্ঞাত সংজ্ঞা এবং অন্য ভাষাগুলিতে এগুলি রাখার কারণ থাকতে পারে?

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

এগুলিকে একটি ভাষায় রাখার কারণগুলি ভাষা থেকে পৃথক, একই রকম। কিছু ভাষাগুলি তাদের উপর অন্যের চেয়ে বেশি নির্ভর করে।

লিস্প পরিবারে, উদাহরণস্বরূপ, "পরিবর্তনশীল" কোনও ধারণা নেই। পরিবর্তে, আপনি Symbolমানগুলির সাথে যুক্ত হয়েছেন।

প্রতিফলিত বা অন্তর্মুখ ক্ষমতা ভাষায়, Symbolগুলি প্রায়ই রুবি মধ্যে, প্রতিফলন API গুলি প্রতিফলিত সত্ত্বা নামগুলি বোঝাতে যেমন, ব্যবহার করা হয় Object#methods, Object#singleton_methods, Object#public_methods, Object#protected_methods, এবং Object#public_methodsএকটি আসতে Arrayএর Symbolগুলি (যদিও তারা ঠিক যেমন ভাল একটি আসতে পারে Arrayএর Methodগুলি)। Object#public_sendএকটি সময় লাগে Symbolবার্তা নাম বাচক একটি আর্গুমেন্ট পাঠানোর জন্য (যদিও এটি একটি গ্রহণ Stringপাশাপাশি, Symbolআরও শব্দার্থগতভাবে সঠিক)।

এর নাম ECMAScript সালে Symbolকরা একটি দ্বারা মৌলিক ভবিষ্যতে এর নাম ECMAScript সামর্থ্য-নিরাপদ তৈরীর বিল্ডিং ব্লক। তারা প্রতিবিম্ব একটি বড় ভূমিকা পালন করে।


এরলং পরমাণুগুলি সরাসরি প্রোলোগের কাছ থেকে নেওয়া হয়েছিল (রবার্ট ভার্ডিং আমাকে বলেছিল যে কোনও সময়)
কে

2

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

my_hash = {"a" => 1, "b" => 2, "c" => 3}
100_000.times { |i| puts my_hash["a"] }

"ক" স্ট্রিংটি স্মৃতিতে 101,000 বার তৈরি করা হয়েছে। পরিবর্তে আমি যদি একটি প্রতীক ব্যবহার করি:

my_hash = {a: 1, b: 2, c: 3}
100_000.times { |i| puts my_hash[:a] }

প্রতীকটি :aমেমরিতে এখনও একটি অবজেক্ট। এটি স্ট্রিংয়ের চেয়ে প্রতীককে আরও বেশি দক্ষ করে তোলে।

আপডেট আপডেট এখানে একটি মানদণ্ড ( কোডেকડેমি থেকে নেওয়া ) যা পারফরম্যান্সের পার্থক্যটি দেখায়:

require 'benchmark'

string_AZ = Hash[("a".."z").to_a.zip((1..26).to_a)]
symbol_AZ = Hash[(:a..:z).to_a.zip((1..26).to_a)]

string_time = Benchmark.realtime do
  100_000.times { string_AZ["r"] }
end

symbol_time = Benchmark.realtime do
  100_000.times { symbol_AZ[:r] }
end

puts "String time: #{string_time} seconds."
puts "Symbol time: #{symbol_time} seconds."

আমার এমবিপির জন্য এখানে আমার ফলাফলগুলি:

String time: 0.1254125550040044 seconds.
Symbol time: 0.07360960397636518 seconds.

একটি হ্যাশের কীগুলি সনাক্তকরণের জন্য স্ট্রিং বনাম প্রতীকগুলি ব্যবহার করার ক্ষেত্রে একটি স্পষ্ট পার্থক্য রয়েছে।


আমি নিশ্চিত নই যে এই ঘটনাটি কিনা। আমি প্রত্যাশা করব যে রুবি প্রয়োগটি একই কোডটি একাধিকবার চালিত করবে, প্রতিটি পুনরাবৃত্তির জন্য কোডটি বারবার পার্স করে না। এমনকি যদি প্রতিটি লেজিক ঘটনাটি "a"সত্যই একটি নতুন স্ট্রিং হয় তবে আমি মনে করি আপনার উদাহরণে ঠিক দুটি হবে "a"(এবং একটি বাস্তবায়ন এমনকি স্মৃতি ভাগ করে নিতে পারে যতক্ষণ না তার মধ্যে একটি রূপান্তরিত হয়)। কয়েক মিলিয়ন স্ট্রিং তৈরি করতে আপনার সম্ভবত স্ট্রিং.নেউ ("এ") ব্যবহার করতে হবে। তবে আমি রুবি তেমন পারদর্শী নই, তাই হয়তো আমার ভুল হয়েছে।
coredump

1
কোডেকেডেমির একটি পাঠে, তারা আমার উদাহরণের মতো স্ট্রিং বনাম প্রতীকগুলির জন্য একটি মাপদণ্ড তৈরি করে। আমি এটি উত্তরে যুক্ত করব।
কিথ ম্যাটিক্স

1
মানদণ্ড যুক্ত করার জন্য ধন্যবাদ। আপনার পরীক্ষাটি হ্যাশটেবল (পরিচয় বনাম স্ট্রিং তুলনা) এর দ্রুত পরীক্ষার কারণে স্ট্রিংয়ের পরিবর্তে চিহ্নগুলি ব্যবহার করে প্রাপ্ত প্রত্যাশিত লাভটি দেখায়, তবে প্রতিটি পুনরুক্তিতে স্ট্রিংগুলি বরাদ্দ হওয়ার কোনও উপায় নেই is আমি এটির সাথে একটি সংস্করণ যুক্ত করেছি string_AZ[String.new("r")]যাতে এটি কোনও পার্থক্য করে কিনা to আমি স্ট্রিংগুলির জন্য 21 মিমি (আসল সংস্করণ), প্রতীক সহ 7ms এবং প্রতিটি বারে 50 মিনিট তাজা স্ট্রিং সহ পাই। সুতরাং আমি বলব যে আক্ষরিক "r"সংস্করণ দিয়ে স্ট্রিংগুলি এত বেশি বরাদ্দ করা হয় না ।
coredump

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