কেন জাভাতে বিভিন্ন আকারের সংখ্যার জন্য আদিম সংখ্যা রয়েছে?


20

জাভা সেখানে আদিম ধরনের হয় byte, short, intএবং longএবং জন্য একই জিনিস floatএবং double। কোনও ব্যক্তির আদিম মানের জন্য কতগুলি বাইট ব্যবহার করা উচিত সেট করা কেন প্রয়োজনীয়? সংখ্যাটি কত বড় হয়েছে তার উপর নির্ভর করে আকারটি কেবল গতিশীলভাবে নির্ধারণ করা যায়নি?

আমি ভাবতে পারি এমন 2 টি কারণ রয়েছে:

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

আমি এখনও মনে করি একটি একক intএবং floatপ্রকারের সাহায্যে সরলভাবে অর্জনের অনেক কিছুই ঘটতে পারে , জাভা এই পথে না যাওয়ার সিদ্ধান্ত নেওয়ার কোনও নির্দিষ্ট কারণ ছিল কি?


4
নিম্নগামীদের কাছে, আমি যুক্ত করব যে এই প্রশ্নটি এমন একটি প্রশ্নের সাথে সংযুক্ত যা সংকলক গবেষকরা উত্তরটির সন্ধান করছেন
rwong

সুতরাং আপনি যদি কোনও সংখ্যায় যুক্ত হন তবে আপনি ভাবেন যে প্রকারটি গতিশীলভাবে পরিবর্তন করা উচিত? আমি এমনকি টাইপ পরিবর্তন করতে চান? যদি সংখ্যাটি স্বীকৃত আলফা = এ + বি হিসাবে শুরু হয়; আপনি কি পান যে সংকলকটিতে কিছুটা কঠিন হবে। জাভা কেন এটি নির্দিষ্ট?
পাপারাজ্জো

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

1
@ টফ্রো আমি বুঝতে পারি না দশমিক, বাইনারি ইত্যাদি আপনার পছন্দ মতো বিন্যাসে কেবল সংখ্যাটি প্রেরণ করুন সিরিয়ালিকেশন একটি সম্পূর্ণ orthogonal উদ্বেগ।
উদ্যানক্ষেত্র

1
@ গার্ডেনহেড এটি অরথোগোনাল, হ্যাঁ, তবে ... আপনি কেবল জাভাতে লিখিত একটি সার্ভার এবং সি-তে লেখা একটি ক্লায়েন্টের মধ্যে যোগাযোগ করতে চান সেই ক্ষেত্রে বিবেচনা করুন অবশ্যই এটি একটি উত্সর্গীকৃত অবকাঠামো দিয়ে সমাধান করা যেতে পারে। উদাহরণস্বরূপ ডেভেলপার্স . google.com/protocol-buffers এর মতো জিনিস রয়েছে । তবে এটি নেটওয়ার্কের মাধ্যমে একটি পূর্ণসংখ্যা নম্বর স্থানান্তর করার ছোট্ট বাদামের জন্য একটি বৃহত্তর স্লেজহ্যামার। (আমি জানি, এটি এখানে দৃ strong় যুক্তি নয়, তবে বিবেচনার জন্য একটি বিষয় হতে পারে - বিশদ আলোচনা করা মন্তব্যের আওতার বাইরে)।
মার্কো 13

উত্তর:


16

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

বিকল্প

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

জায়গার সীমাবদ্ধতা

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

দক্ষতা

এমনকি যদি আমরা স্থানটিকে উপেক্ষা করি, তবুও আমরা সিপিইউ দ্বারা সীমাবদ্ধ, যার কেবলমাত্র একটি নির্দিষ্ট সংখ্যক বাইট (64৪-বিট আর্কিটেকচারে 8 বাইট) পরিচালনা করে এমন নির্দেশাবলী রয়েছে। এর অর্থ এমনকি একটি একক 8-বাইট longপ্রকার সরবরাহ করা সীমাহীন প্রাকৃতিক সংখ্যার ধরণের চেয়ে ভাষার বাস্তবায়নকে উল্লেখযোগ্যভাবে সহজ করে তুলবে, সরাসরি একক অন্তর্নিহিত সিপিইউ নির্দেশিকায় পাটিগণিতের ক্রিয়াকলাপকে ম্যাপ করতে সক্ষম হয়ে । আপনি প্রোগ্রামার ইচ্ছামত বৃহৎ সংখ্যক ব্যবহার করার অনুমতি দেয়, তাহলে একটি একক গাণিতিক অপারেশন ম্যাপ করা আবশ্যক ক্রম জটিল মেশিন নির্দেশাবলীর, যা নিচে প্রোগ্রাম মন্থর হবে। এটি হ'ল পয়েন্ট (1) যা আপনি উত্থাপন করেছেন।

ভাসমান পয়েন্ট ধরণের

এখনও পর্যন্ত আলোচনাটি কেবলমাত্র পূর্ণসংখ্যা সম্পর্কিত করে। ভাসমান-পয়েন্টের ধরণগুলি একটি অত্যন্ত জন্তু এবং অত্যন্ত সূক্ষ্ম শব্দার্থক এবং প্রান্ত-কেসযুক্ত are সুতরাং, যদিও আমরা সহজেই প্রতিস্থাপন করতে পারে int, long, short, এবং byteএকটি একক সঙ্গে natধরন, এটা স্পষ্ট নয় কি ফ্লোটিং পয়েন্ট সংখ্যার টাইপ এমনকি হয় । এগুলি প্রকৃত সংখ্যা নয়, স্পষ্টতই, যেহেতু প্রোগ্রামিং ভাষায় আসল সংখ্যা থাকতে পারে না। এগুলি বেশ যুক্তিযুক্ত সংখ্যা নয়, হয় (যদিও এটি ইচ্ছা করলে যৌক্তিক ধরণের তৈরি করা সোজা-এগিয়ে)। মূলত, আইইইই আনুমানিক আসল সংখ্যাগুলি কিন্ডার করার সিদ্ধান্ত নিয়েছে এবং তখন থেকেই সমস্ত ভাষা (এবং প্রোগ্রামাররা) তাদের সাথে আটকে রয়েছে।

অবশেষে:

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

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


2
আমাদের ভাসমান সত্যের আসল কীটি হ'ল আমরা তাদের জন্য ডেডিকেটেড হার্ডওয়্যার
রেখেছি

কোনও প্রকারের সংখ্যাসূচক এনকোডিংও নির্ভরশীলভাবে টাইপ করা ভাষাগুলিতে ঘটে এবং কিছুটা কম পরিমাণে অন্যান্য ভাষা যেমন এনামস
জে.কে.

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

1
আমি আদার সাথে পরিচিত নই। আমি কি কোনও ধরণের ক্ষেত্রে পূর্ণসংখ্যাকে সীমাবদ্ধ রাখতে পারি type my_type = int (7, 2343)?
উদ্যানক্ষেত্র

1
হাঁ। বাক্য গঠনটি হবে: টাইপ মাই টাইপ টাইপটি 7..2343
ডিভসম্যান

9

কারণটি খুব সহজ: দক্ষতা । একাধিক উপায়ে

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

  2. 32-বিট সিস্টেমে অযাচিত ওভারহেড: যদি স্থির আকার 64-বিট দীর্ঘকে সমস্ত কিছু মানচিত্র করার সিদ্ধান্ত নেওয়া হত, তবে 32-বিট আর্কিটেকচারগুলিতে এটি একটি বিশাল জরিমানা চাপিয়ে দিত যে 64৪- একটি 32-বিট অপারেশন চেয়ে বিট অপারেশন।

  3. মেমোরি অপব্যয়: প্রচুর পরিমাণে হার্ডওয়্যার রয়েছে যা মেমরির প্রান্তিককরণ সম্পর্কে খুব চটজলদি নয়, (ইন্টেল x86 এবং x64 আর্কিটেকচারগুলির উদাহরণ হিসাবে,) সুতরাং সেই হার্ডওয়্যারটিতে 100 বাইটের একটি অ্যারে কেবল 100 বাইট মেমরি দখল করতে পারে। তবে, যদি আপনার আর কোনও বাইট না থাকে এবং তার পরিবর্তে আপনাকে দীর্ঘ ব্যবহার করতে হয়, একই অ্যারেটি আরও মেমরির পরিমাণ বাড়িয়ে তুলবে। এবং বাইট অ্যারেগুলি খুব সাধারণ।

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

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

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

  7. পলিমারফিজমের ওভারহেড: রানটাইমের সময় সংখ্যার আকার পরিবর্তন করার অর্থ এটি পলিমারফিক হতে হবে। এর পরিবর্তে এর অর্থ হ'ল এটি স্ট্যাকের জন্য বরাদ্দকৃত একটি নির্দিষ্ট আকারের আদিম হতে পারে না, এটি একটি বস্তু হতে হবে, গাদাতে বরাদ্দ। এটি মারাত্মকভাবে অদক্ষ। (উপরে # 1 পুনরায় পড়ুন।)


6

অন্যান্য উত্তরে আলোচনা করা পয়েন্টগুলি পুনরাবৃত্তি করা এড়াতে, আমি পরিবর্তে একাধিক দৃষ্টিভঙ্গি রূপরেখার চেষ্টা করব।

ভাষা নকশা দৃষ্টিকোণ থেকে

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

.তিহাসিক কারণ

জাভা ইতিহাস সম্পর্কে উইকিপিডিয়া নিবন্ধে এটি ইতিমধ্যে আলোচনা হয়েছে এবং মার্কো 13 এর উত্তরে সংক্ষেপে আলোচনা করা হয়েছে ।

আমি এটা উল্লেখ করব:

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

দক্ষতার কারণ

দক্ষতা কখন গুরুত্বপূর্ণ?

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

স্টোরেজ দক্ষতা (মেমরি বা ডিস্কে)

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

কার্যকর করার দক্ষতা (সিপিইউর মধ্যে, বা সিপিইউ এবং মেমরির মধ্যে)

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

নির্দিষ্ট পরিসংখ্যানের মধ্যে সীমাবদ্ধ থাকলেও, ছোট পূর্ণসংখ্যার জন্য বিমূর্ততা সরবরাহ করার জন্য প্রোগ্রামিং ভাষার প্রয়োজন languages

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

ইনটেরোপিরাবিলিটি

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

স্ট্রিং হ্যান্ডলিং

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

ফাইল ফর্ম্যাট হ্যান্ডলিং

  • অনেকগুলি ফাইল ফর্ম্যাট সি-এর মতো মানসিকতার সাথে ডিজাইন করা হয়েছিল। এই হিসাবে, সরু প্রস্থের ক্ষেত্রগুলির ব্যবহার প্রচলিত ছিল।

আকাঙ্ক্ষিততা, সফ্টওয়্যার গুণমান এবং প্রোগ্রামারের দায়িত্ব

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

নিম্নলিখিত পরিস্থিতি বিবেচনা করুন।

  • একটি সফ্টওয়্যার API একটি JSON অনুরোধ গ্রহণ করে। অনুরোধটিতে শিশুদের অনুরোধগুলির একটি অ্যারে রয়েছে। পুরো JSON অনুরোধ ডিফল্ট অ্যালগরিদম দিয়ে সংকুচিত করা যেতে পারে।
  • দূষিত ব্যবহারকারী এক বিলিয়ন সন্তানের অনুরোধ সম্বলিত একটি JSON অনুরোধ তৈরি করে। সমস্ত সন্তানের অনুরোধ অনুরূপ; দূষিত ব্যবহারকারী সিস্টেমটি বেআইনি কাজ করে কিছু সিপিইউ চক্র জ্বালানোর উদ্দেশ্যে चाहन्छ। সংকোচনের কারণে, এই অভিন্ন বাচ্চাদের অনুরোধগুলি খুব ছোট মোট আকারে সংকুচিত হয়।
  • এটা স্পষ্ট যে ডেটা সংকুচিত আকারের উপর একটি পূর্বনির্ধারিত সীমা যথেষ্ট নয়। পরিবর্তে, এপিআই-র মধ্যে এটির অন্তর্ভুক্ত থাকা শিশু অনুরোধগুলির সংখ্যার উপর একটি পূর্বনির্ধারিত সীমা, এবং / অথবা ডেটার বিচ্ছিন্ন আকারের একটি পূর্বনির্ধারিত সীমা চাপানো দরকার।

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

এর অর্থ ওপি'র দৃষ্টিভঙ্গি,

কোনও ব্যক্তির আদিম মানের জন্য কতগুলি বাইট ব্যবহার করা উচিত সেট করা কেন প্রয়োজনীয়?

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


2

এটি সব হার্ডওয়ার থেকে আসে।

একটি বাইট হ'ল বেশিরভাগ হার্ডওয়্যারে মেমরির ক্ষুদ্রতম ঠিকানাযোগ্য একক।

আপনি সুনির্দিষ্টভাবে উল্লেখ করেছেন এমন প্রতিটি ধরণ কিছু বাইটের একাধিক থেকে নির্মিত।

একটি বাইট 8 বিট হয়। এটির সাহায্যে আপনি 8 বুলিয়ান প্রকাশ করতে পারেন তবে আপনি একবারে কেবল একটিতে সন্ধান করতে পারবেন না। আপনি ঠিকানা 1, আপনি 8 সব ঠিক করা।

এবং এটি এত সহজ ছিল তবে আমরা একটি 8 বিট বাস থেকে 16, 32, এবং এখন bit৪ বিটের বাসে চলে যাই।

যার অর্থ আমরা যখন বাইট স্তরে এখনও সম্বোধন করতে পারি তখন আমরা তার প্রতিবেশী বাইট না পেয়ে মেমরি থেকে আর একটি বাইট পেতে পারি না।

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

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

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

তাহলে কেন এটি ভালভাবে কাজ করল না?

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

অবিচ্ছেদ্য ধরণের বাইরে যেতে এবং বিমূর্ত আকারটি ঠিক রেখে একসঙ্গে কাজ হয়নি।

সুতরাং তারা পারে। তারা ঠিক করেনি।

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

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

জাভা ঠিক সেই ভাষা নয়।


" একটি ভাষা তাদের ধরণের মধ্যে স্বেচ্ছাসেবী সীমানা বেক করার জন্য এতদূর যেতে পারে " এবং প্রকৃতপক্ষে পাসকালের এগুলির একটি রূপ রয়েছে সাব্রিজ টাইপের সাথে।
পিটার টেলর

1

সম্ভবত জাভাতে এই ধরণের উপস্থিতিগুলির একটি গুরুত্বপূর্ণ কারণ হ'ল সহজ এবং দু: খজনকভাবে প্রযুক্তিগত:

সি এবং সি ++ এও এই ধরণের ছিল!

যদিও এই কারণটি প্রমাণ হিসাবে প্রমাণ করা শক্ত, তবে কমপক্ষে কিছু দৃ strong় প্রমাণ রয়েছে: ওক ভাষা সুনির্দিষ্টকরণ (সংস্করণ 0.2) এ নিম্নোক্ত প্যাসেজটি রয়েছে:

3.1 পূর্ণসংখ্যার প্রকার

ওক ভাষার পূর্ণসংখ্যার সি এবং সি ++ এর মতো দুটি ব্যতিক্রম রয়েছে: সমস্ত পূর্ণসংখ্যার প্রকারগুলি মেশিন স্বাধীন, এবং সি চালু হওয়ার পর থেকেই বিশ্বের কিছু পরিবর্তনকে প্রতিস্থাপন করতে কিছু traditionalতিহ্যবাহী সংজ্ঞা পরিবর্তন করা হয়েছে। চারটি পূর্ণসংখ্যার প্রকারের 8, 16, 32, এবং 64 বিটের প্রস্থ রয়েছে এবং unsignedসংশোধক দ্বারা উপসর্গ না করা সই করা হয় ।

সুতরাং প্রশ্নটি ফুটে উঠতে পারে:

কেন সংক্ষিপ্ত, অন্তর্নিহিত এবং দীর্ঘ আবিষ্কার হয়েছিল?

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

আমি সবচেয়ে গুরুত্বপূর্ণ কারণগুলি ভাবতে পারি

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

  • এটি সত্য যে, বাস্তবে, এটি একক প্রকারের সাহায্যে সমস্ত ক্ষেত্র এবং স্থানীয় ভেরিয়েবলের প্রতিনিধিত্ব করা এবং এই ধরণের কল করতে বুদ্ধিমান হবে int। স্ট্যাকওভারফ্লো সম্পর্কে এটি সম্পর্কিত একটি প্রশ্ন রয়েছে: কেন জাভা এপিআই সংক্ষিপ্ত বা বাইটের পরিবর্তে ইন্ট ব্যবহার করে? । আমার উত্তরটিতে আমি যেমন উল্লেখ করেছি, ছোট প্রকারের ( byteএবং short) থাকার একটি যুক্তি হ'ল আপনি এই ধরণের অ্যারে তৈরি করতে পারেন : জাভাতে অ্যারেগুলির একটি প্রতিনিধিত্ব রয়েছে যা "হার্ডওয়্যারটির কাছাকাছি" এখনও রয়েছে। অন্যান্য ভাষার বিপরীতে (এবং Integer[n]অ্যারের মতো বস্তুর অ্যারের বিপরীতে ) একটি int[n]অ্যারে উল্লেখের সংগ্রহ নয় যেখানে মানগুলি স্তূপ জুড়ে ছড়িয়ে ছিটিয়ে থাকে। পরিবর্তে, এটি হবেঅনুশীলনে বাইটসের একটানা ব্লক হতে পারে n*4- একটি পরিচিত আকার এবং ডেটা বিন্যাস সহ মেমরির এক অংশ। আপনি যখন ইচ্ছামত আকারের পূর্ণসংখ্যার মান অবজেক্টের সংকলনে বা একটিতে byte[1000](যা 1000 বাইট নেয়) মধ্যে 1000 বাইট সংরক্ষণ করার পছন্দ রাখেন, তবে পরবর্তীকৃত সত্যিকার অর্থে কিছু স্মৃতি সঞ্চয় করতে পারে। (এর কিছু অন্যান্য সুবিধা আরও সূক্ষ্ম হতে পারে এবং নেটিভ লাইব্রেরিতে জাভা হস্তক্ষেপ করার সময় কেবল স্পষ্ট হয়ে ওঠে)


আপনি বিশেষভাবে জিজ্ঞাসা করা পয়েন্টগুলি সম্পর্কে:

সংখ্যাটি কত বড় হয়েছে তার উপর নির্ভর করে আকারটি কেবল গতিশীলভাবে নির্ধারণ করা যায়নি?

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

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


পার্শ্ব নোট:

  • unsignedওক স্পপে উল্লিখিত মোডিফায়ার সম্পর্কে আপনি হয়ত ভাবতেন। আসলে, এটিতে একটি মন্তব্য রয়েছে: " unsignedএখনও কার্যকর করা হয়নি; এটি কখনও হতে পারে না।" । এবং তারা সঠিক ছিল।

  • কেন সি / সি ++ এর কেন এই পৃথক পূর্ণসংখ্যার ধরণ ছিল তা ভাববার পাশাপাশি আপনি ভাবতে পারেন যে এগুলি কেন এত ভয়াবহভাবে গণ্ডগোল করেছে যে আপনি কখনই জানেন না যে কতগুলি বিট intরয়েছে। এটির সমর্থনযোগ্যতাগুলি সাধারণত পারফরম্যান্সের সাথে সম্পর্কিত এবং অন্য কোথাও সন্ধান করা যেতে পারে।


0

এটি অবশ্যই দেখায় যে আপনি এখনও অভিনয় এবং আর্কিটেকচার সম্পর্কে শেখানো হচ্ছে না।

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

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

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


0

বেশ কয়েকটি ভাল কারণ রয়েছে

(1) একটি দীর্ঘ বাইট ভেরিয়েবল শ্লোকগুলির সঞ্চয় যখন তাত্পর্যপূর্ণ হয় তবে কয়েক মিলিয়ন অ্যারেতে সঞ্চয় খুব তাৎপর্যপূর্ণ।

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

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