সি ++ সংকলক কি অপ্রয়োজনীয় বন্ধনীগুলি অপসারণ / অনুকূলিত করে?


19

কোড হবে

int a = ((1 + 2) + 3); // Easy to read

চেয়ে ধীর চালান

int a = 1 + 2 + 3; // (Barely) Not quite so easy to read

বা আধুনিক সংকলকগুলি "অকেজো" প্রথম বন্ধনী অপসারণ / অনুকূলিত করতে যথেষ্ট চতুর।

এটি খুব ক্ষুদ্রতর অপ্টিমাইজেশান উদ্বেগের মতো মনে হতে পারে তবে সি # / জাভা / ... এর চেয়ে সি ++ চয়ন করা সর্বোত্তমতা (আইএমএইচও) about


9
আমি মনে করি সি # এবং জাভা এটিও অনুকূলিত করবে। আমি বিশ্বাস করি যখন তারা পার্স করবে এবং এএসটি তৈরি করবে তখন তারা এ জাতীয় স্পষ্টত অকেজো জিনিসগুলি সরিয়ে ফেলবে।
ফরিদ নুরি নেশাত

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

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

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

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

উত্তর:


87

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

যদি আপনি কোনও প্রথম বন্ধনী না লিখেন তবে পার্সারটিকে অবশ্যই একটি পার্স গাছ তৈরি করার কাজটি করতে হবে এবং অপারেটরের অগ্রাধিকার এবং সাহচর্যতার নিয়মগুলি অবশ্যই এটি জানায় যে এটি কোন পার্স গাছটি তৈরি করতে হবে। আপনি কম্পাইলার যা (অন্তর্নিহিত) বন্ধনী এটি করা উচিত কহন হিসাবে যারা নিয়ম বিবেচনা করতে পারেন সন্নিবেশ আপনার কোড মধ্যে যদিও পার্সার এই ক্ষেত্রে বন্ধনী সহ আসলে কি কখনো মোকাবিলা করে না: এটা ঠিক যেমন প্রথম বন্ধনী যদি একই পারসে ট্রি উত্পাদন করতে নির্মাণ করা হয়েছে নির্দিষ্ট জায়গায় উপস্থিত ছিল। যদি আপনি ঠিক সেই জায়গাগুলিতে বন্ধনীরূপ স্থাপন করেন int a = (1+2)+3;( যেমন +সাহচর্যটি বাম দিকে থাকে) তবে পার্সার একই ফলাফলটিতে কিছুটা ভিন্ন রুটে পৌঁছে যাবে। যদি আপনি আলাদা আলাদা বন্ধনী স্থাপন করেন তবেint a = 1+(2+3);তারপরে আপনি একটি পৃথক পার্স গাছ লাগিয়ে চলেছেন, যা সম্ভবত বিভিন্ন কোড উত্পন্ন করার কারণ ঘটায় (যদিও তা নয়, কারণ সংকলক পার্স ট্রি তৈরির পরে রূপান্তরগুলি প্রয়োগ করতে পারে, যতক্ষণ না ফলাফল ফলাফল কার্যকর করার প্রভাব কখনই আলাদা হয় না এটা)। ধরুন যে পুনর্বিবেচনার কোডের মধ্যে কোনও পার্থক্য রয়েছে, সাধারণভাবে কোনটিই বেশি দক্ষ কিনা তা বলা যায় না; সবচেয়ে গুরুত্বপূর্ণ বিষয়টি অবশ্যই যে পার্স গাছগুলি বেশিরভাগ সময় গাণিতিকভাবে সমতুল্য ভাব প্রকাশ করে না, সুতরাং তাদের সম্পাদনের গতির তুলনা করা বিন্দুর পাশে থাকে: একমাত্র ঠিক এমন ফলাফলটি লিখতে হবে যা যথাযথ ফলাফল দেয়।

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

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


S / oldes / প্রাচীনতম /। ভাল উত্তর, +1।
ডেভিড কনরাড

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

কারণ a = b + c * d;, a = b + (c * d);হবে [নিরীহ] অনর্থক প্রথম বন্ধনী। যদি তারা আপনাকে কোডটি আরও পঠনযোগ্য করে তুলতে সহায়তা করে তবে তা ঠিক। a = (b + c) * d;অপ্রয়োজনীয় প্রথম বন্ধনী হবে - তারা প্রকৃতপক্ষে ফলস গাছকে পরিবর্তন করে এবং ভিন্ন ফলাফল দেয়। করার জন্য পুরোপুরি আইনী (বাস্তবে, প্রয়োজনীয়), তবে সেগুলি পূর্বনির্ধারিত ডিফল্ট গ্রুপিংয়ের মতো নয়।
ফিল পেরি

1
@ ওরেঞ্জডগ সত্য, এটি লজ্জাজনক বেনের মন্তব্যে এমন কয়েকজন লোক বেরিয়ে এসেছিল যারা ভিএমএস দাবি করতে পছন্দ করে দেশীয়ের চেয়ে দ্রুত।
gbjbaanb

1
@ জোনাসক্লেকার: আমার শুরুর বাক্যটি শিরোনামে প্রণীত প্রশ্নটিকে প্রকৃতপক্ষে বোঝায়: সংকলক কীভাবে সংযোজনকারী কাজ করে তার একটি ভুল ধারণার ভিত্তিতে যেহেতু সংকলক সন্নিবেশ করানো হয় বা বন্ধনীগুলি সরিয়ে দেয় কিনা সে সম্পর্কে সত্যই কোনও প্রশ্নের উত্তর দিতে পারে না। তবে আমি একমত যে কোন জ্ঞানের ব্যবধানটি মোকাবেলা করা দরকার তা পুরোপুরি পরিষ্কার agree
মার্ক ভ্যান লিউউইন

46

প্রথম বন্ধনীগুলি কেবল আপনার সুবিধার জন্য রয়েছে - সংকলক নয়। সংকলকটি আপনার বিবৃতি উপস্থাপনের জন্য সঠিক মেশিন কোড তৈরি করবে।

এফওয়াইআই, সংকলকটি পুরোপুরি পারলে এটি অপ্টিমাইজ করার পক্ষে যথেষ্ট চালাক। আপনার উদাহরণগুলিতে, এটি int a = 6;সংকলন সময়ে রূপান্তরিত হবে ।


9
একদম - আপনার পছন্দ মতো অনেকগুলি প্রথম বন্ধনী আটকে দিন এবং
সংকলকটি

23
@ সার্জ সত্য প্রোগ্রামিং আপনার কোডের পাঠযোগ্যতা সম্পর্কে পারফরম্যান্সের চেয়ে বেশি। আপনি পরের বছর নিজেকে ঘৃণা করবেন যখন আপনার একটি ক্র্যাশ ডিবাগ করতে হবে এবং আপনার কেবল "অনুকূলিত" কোডটি যেতে হবে।
র‌্যাচেট ফ্রিক

1
@ratchetfreak, আপনি ঠিক তবুও আমি আমার কোডটি কীভাবে মন্তব্য করবেন তাও জানি। int a = 6; // = (1 + 2) + 3
সার্জ

20
@ সার্জ আমি জানি যে এক বছরের টুইটের পরে ধরে রাখা হবে না, সময় মতামত এবং কোড সিঙ্কের বাইরে চলে যাবে এবং তারপরে আপনি শেষ করবেনint a = 8;// = 2*3 + 5
র‌্যাচেট ফ্রিক

21
অথবা int five = 7; //HR made us change this to six...
www.thedailywtf.com

23

আপনি আসলে যে প্রশ্নটি করেছিলেন সেটির উত্তর হ্যাঁ না, তবে আপনি যে প্রশ্নটি করতে চেয়েছিলেন তার উত্তর হ্যাঁ is বন্ধনী যুক্ত করা কোডটি ধীর করে না।

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

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

আমাকে সাবধানে বলতে দাও। আপনি যদি এমন কোনও অভিব্যক্তিগুলিতে বন্ধনী যুক্ত করেন যা কঠোরভাবে অপ্রয়োজনীয় (কোনও অভিব্যক্তির মূল্যায়নের অর্থ বা ক্রমের উপর কোনও প্রভাব ফেলবে না) সংকলক নিঃশব্দে সেগুলি তাদের ত্যাগ করবে এবং একই কোড তৈরি করবে।

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

short int a = 30001, b = 30002, c = 30003;
int d = -a + b + c;    // ok
int d = (-a + b) + c;  // ok, same code
int d = (-a + b + c);  // ok, same code
int d = ((((-a + b)) + c));  // ok, same code
int d = -a + (b + c);  // undefined behaviour, different code

সুতরাং আপনি চাইলে প্রথম বন্ধনী যুক্ত করুন, তবে নিশ্চিত করুন যে সেগুলি সত্যই অপ্রয়োজনীয়!

আমি কখনো করিনা. সত্যিকারের সুবিধা না পাওয়ার জন্য ত্রুটির ঝুঁকি রয়েছে।


পাদটীকা: স্বাক্ষরযুক্ত স্বাক্ষরযুক্ত আচরণটি ঘটে যখন একটি স্বাক্ষরিত পূর্ণসংখ্যা এক্সপ্রেশনটি এই ক্ষেত্রে -32767 থেকে +32767 এ প্রকাশ করতে পারে এমন সীমার বাইরে থাকা কোনও মানের মূল্যায়ন করে। এটি একটি জটিল বিষয়, এই উত্তরের সুযোগ নেই।


শেষ লাইনে অপরিজ্ঞাত আচরণটি হ'ল কারণ একটি স্বাক্ষরযুক্ত শর্টের সাইন পরে কেবল 15 বিট রয়েছে, তাই সর্বোচ্চ 32767 আকারের, তাই না? সেই তুচ্ছ উদাহরণে, সংকলকটির ওভারফ্লো সম্পর্কে সতর্ক করা উচিত, তাই না? কাউন্টার হিসাবে উদাহরণস্বরূপ, +1। যদি সেগুলি কোনও ফাংশনের পরামিতি হয় তবে আপনি কোনও সতর্কতা পাবেন না। এছাড়াও, যদি aসত্যিকার অর্থে স্বাক্ষর না করা যায়, আপনার গণনার সাথে নেতৃত্ব দেওয়া -a + bযদি সহজেই aনেতিবাচক এবং bইতিবাচক হয় তবে উপচে পড়তে পারে ।
প্যাট্রিক এম

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

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

@ সুপের্যাট: আমার মনে হয় না। ফলাফলের সাধারণ ধরণ এবং প্রকারের সংক্ষিপ্ত অন্তর্ভুক্ত হওয়া উচিত। যদি এটি এমন কিছু না হয় যা জিজ্ঞাসা করা হয় তবে সম্ভবত আপনি একটি প্রশ্ন পোস্ট করতে চান?
ডেভিড.পিএফএফএক্স

@ ডেভিড.পিএফএক্স: সি গাণিতিক প্রচারগুলির নিয়মগুলি বেশ স্পষ্ট: প্রকারের চেয়ে ছোট সমস্ত কিছু না intপ্রচার করা হয় intযদি না সেই ধরণের ক্ষেত্রে এটি প্রচারিত হয় সে ক্ষেত্রে তার সমস্ত মান উপস্থাপন করতে সক্ষম হয় না unsigned intসংজ্ঞায়িতকারীরা পদোন্নতিগুলি বাদ দিতে পারে যদি সমস্ত সংজ্ঞায়িত আচরণ একই রকম হয় যদি প্রচারগুলি অন্তর্ভুক্ত ছিল । এমন একটি মেশিনে যেখানে 16-বিট প্রকারের মোড়ক বিমূর্ত বীজগণিত রিং হিসাবে আচরণ করে, (a + b) + c এবং a + (b + c) সমতুল্য। যদি intএকটি 16 বিট যে ধরনের ওভারফ্লো উপর আটকা পড়েছে, কিন্তু, তারপর মামলা হবে যেখানে এক্সপ্রেশন এক ...
supercat

7

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

সুতরাং, আপনি এবং আমি কোথায় দেখতে পাব ...

  • "int a = ((1 + 2) + 3);"

... একটি সংকলক এর থেকে আরও কিছু নির্গত হতে পারে:

  • চর [1] :: "A"
  • Int32 :: DeclareStackVariable ()
  • Int32 :: 0x00000001
  • Int32 :: 0x00000002
  • Int32 :: যোগ ()
  • Int32 :: 0x00000003
  • Int32 :: যোগ ()
  • Int32 :: AssignToVariable ()
  • অকার্যকর :: DiscardResult ()

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

ঠিক আছে, এটি আপনি এবং আমি যে জিনিস দিয়েছি সেগুলির মতো কিছুই নয়, তবে আমরা এটি চালাচ্ছি না!


4
কোনও সি সি ++ সংকলক নেই যা দূর থেকেও এর মতো কিছু তৈরি করতে পারে। সাধারণত তারা আসল সিপিইউ কোড তৈরি করে এবং সমাবেশটি এটিকেও দেখায় না।
MSalters

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

@ এসএমএলটাররা নিতপিকিংয়ের ঝাঁকুনি থেকে 'এরকম কিছু' নির্গত হয় যদি আপনি এলএলভিএম আইএসএকে 'এরকম কিছু' বলে মনে করেন (এটি এসএসএ ভিত্তিক স্ট্যাক নয়)। এটি দেওয়া যে এলএলভিএম এবং জেভিএম আইএসএ (এএফআইকে) এর জন্য জেভিএম ব্যাকেন্ড লেখার সম্ভাবনা রয়েছে স্ট্যাক ভিত্তিক ঝনঝন-> llvm-> জেভিএম দেখতে খুব মিল দেখাবে।
ম্যাকিয়েজ পাইচোটকা

আমি মনে করি না এলএলভিএম আইএসএর মধ্যে রানটাইম স্ট্রিং লিটারাল (কেবল প্রথম দুটি নির্দেশাবলী) ব্যবহার করে নাম স্ট্যাক ভেরিয়েবল সংজ্ঞায়িত করার ক্ষমতা আছে। এটি রান-টাইম এবং সংকলন-কালকে গুরুত্ব সহকারে মেশাচ্ছে। পার্থক্যটি গুরুত্বপূর্ণ কারণ এই প্রশ্নটি ঠিক সেই বিভ্রান্তির বিষয়ে।
এমসাল্টাররা

6

নির্ভর করে যদি এটি ভাসমান পয়েন্ট হয় বা না:

  • ভাসমান পয়েন্টে পাটিগণিত সংযোজন মিশ্রণমূলক হয় না তাই অপ্টিমাইজার অপারেশনগুলি পুনরায় অর্ডার করতে পারে না (যদি আপনি ফাস্টমথ সংকলক সুইচ না যোগ করেন)।

  • পূর্ণসংখ্যার ক্রিয়াকলাপগুলিতে তারা পুনরায় সাজানো যায়।

আপনার উদাহরণে উভয়ই ঠিক একই সময় চলবে কারণ তারা ঠিক একই কোডটি সংকলন করবে (সংযোজনটি বাম থেকে ডানদিকে মূল্যায়ন করা হয়)।

তবে জাভা এবং সি # এটি অপ্টিমাইজ করতে সক্ষম করবে, তারা কেবল রানটাইম এ এটি করবে।


ভাসমান পয়েন্ট অপারেশনগুলি আনার জন্য +1 সাহসী নয়।
ডোভাল

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

1
শেষ বাক্য সম্পর্কে, আমি মনে করি না। জাভা a এবং c # উভয় ক্ষেত্রেই সংকলকটি অনুকূলিত বাইকোড / আইএল উত্পাদন করবে। রানটাইম প্রভাবিত হয় না।
স্টেফানো আল্তেরি

আইএল এই ধরণের অভিব্যক্তিতে কাজ করে না, নির্দেশাবলী একটি স্ট্যাক থেকে একটি নির্দিষ্ট সংখ্যক মান নেয় এবং একটি নির্দিষ্ট সংখ্যক মানকে (সাধারণত 0 বা 1) স্ট্যাকটিতে ফিরিয়ে দেয়। সি # তে রানটাইমের সময় এই ধরণের জিনিসটি অপ্টিমাইজ করা হচ্ছে বাজে কথা।
জন হান্না

6

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


5

উভয় কোডই হার্ড কোডিং 6 হিসাবে শেষ:

movl    $6, -4(%rbp)

এখানে নিজের জন্য পরীক্ষা করুন


2
এটা কি assembly.ynh.io অজানা?
পিটার মর্টেনসেন

এটি একটি সিউডো সংকলক যা অনলাইনে x86 এসেম্বলিতে সি কোডটি রূপান্তর করে
MonoThreaded

1

না, তবে হ্যাঁ, তবে অন্যভাবে হতে পারে তবে না।

লোকেরা ইতিমধ্যে চিহ্নিত করেছে, (এমন একটি ভাষা ধরে নেওয়া যেখানে সংযোজন বাম-সহযোগী, যেমন সি, সি ++, সি # বা জাভা) এক্সপ্রেশনটি ((1 + 2) + 3)হুবহু সমান 1 + 2 + 3। তারা সোর্স কোডে কিছু লেখার বিভিন্ন উপায়, যার ফলে ফলাফলের মেশিন কোড বা বাইট কোডের শূন্য প্রভাব পড়ে।

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

তবে আপনার প্রশ্নের আরও কিছু আছে।

যে কোনও বুদ্ধিমান সি, সি ++, জাভা, বা সি # সংকলকের ক্ষেত্রে, আপনি যে বিবৃতি দিয়েছেন তার উভয়টির ফলাফলই ঠিক একই ফলাফল হিসাবে প্রত্যাশা করব:

int a = 6;

আক্ষরিক উপর গণিত করতে ফলাফল কোড কেন সময় নষ্ট করা উচিত? প্রোগ্রামের অবস্থায় কোন পরিবর্তন ফল করা বন্ধ করে দেবে 1 + 2 + 3হচ্ছে 6, যাতে এটা কি কোডে যেতে হবে মৃত্যুদন্ড কার্যকর করা হচ্ছে। প্রকৃতপক্ষে, এমনকি এটিও নয় (আপনি সেই 6টির সাথে কী করছেন তার উপর নির্ভর করে, সম্ভবত আমরা পুরো জিনিসটি ফেলে দিতে পারি; এমনকি সি # এর দর্শনের সাথে "ভারীভাবে অনুকূলিত হবেন না, যেহেতু জিটারটি যেভাবেই এটি অনুকূল করে তুলবে" হয় তা প্রকাশ করবে) এর সমতুল্য int a = 6বা কেবল অপ্রয়োজনীয় হিসাবে পুরো জিনিসটিকে ফেলে দেয়)।

এটি যদিও আপনাকে আপনার প্রশ্নের সম্ভাব্য বর্ধনের দিকে নিয়ে যায়। নিম্নোক্ত বিবেচনা কর:

int a = (b - 2) / 2;
/* or */
int a = (b / 2)--;

এবং

int c;
if(d < 100)
  c = 0;
else
  c = d * 31;
/* or */
int c = d < 100 ? 0 : d * 32 - d
/* or */
int c = d < 100 && d * 32 - d;
/* or */
int c = (d < 100) * (d * 32 - d);

(দ্রষ্টব্য, এই শেষ দুটি উদাহরণ বৈধ সি # নয়, অন্যদিকে এখানে সমস্ত কিছু রয়েছে এবং সেগুলি সি, সি ++ এবং জাভাতে বৈধ)

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

এবং এগুলি আপনার প্রশ্নের সাথে পুরোপুরি সম্পর্কিত নয়, কারণ তারা বেশিরভাগ ক্ষেত্রে ধারণাগতভাবে কিছু করা হয় এমন ক্রমের মধ্যে পার্থক্য সম্পর্কে ।

তাদের প্রত্যেকটিতে সন্দেহ হওয়ার কারণ রয়েছে যে একজনের চেয়ে অন্যটির চেয়ে দ্রুত গতি হতে পারে। একক হ্রাস একটি বিশেষায়িত নির্দেশনা (b / 2)--থাকতে পারে , তাই সত্যিই চেয়ে দ্রুত হতে পারে (b - 2) / 2d * 32সম্ভবত দ্রুত তা বাঁক দ্বারা উত্পাদিত যেতে পারে d << 5উপার্জন তাই d * 32 - dযতো তাড়াতাড়ি d * 31। শেষ দুটি মধ্যে পার্থক্য বিশেষ আকর্ষণীয়; একটি কিছু ক্ষেত্রে কিছু প্রসেসিং এড়িয়ে যেতে দেয় তবে অন্যটি শাখার ভুল পূর্বাভাসের সম্ভাবনা এড়িয়ে চলে।

সুতরাং, এটি আমাদের দুটি প্রশ্ন রেখে গেছে: ১. আসলেই কি একজনের তুলনায় অন্যটি দ্রুত হয়? ২. কোনও সংকলক কি ধীর গতিতে দ্রুত রূপান্তর করবে?

এবং উত্তর 1। এটি নির্ভর করে। 2. হতে পারে।

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

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

এটি খুব ক্ষুদ্রতর অপ্টিমাইজেশান উদ্বেগের মতো বলে মনে হতে পারে,

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

তবে সি ++ সি / জাভা / ... এর উপরে সি ++ নির্বাচন করা সর্বোত্তমতা (আইএমএইচও) about

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

এই ভাষার একে অপরের চেয়ে আলাদা সুবিধা রয়েছে advant

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

এটি অপ্টিমাইজেশন নয়।

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

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

অনুকূলতা হ'ল যখন আমরা কোনও নির্দিষ্ট দিক এবং / অথবা নির্দিষ্ট ক্ষেত্রে বিবেচনা করে উন্নতি করি। সাধারণ উদাহরণগুলি হ'ল:

  1. এটি এখন একটি ব্যবহারের ক্ষেত্রে দ্রুত, তবে অন্যটির জন্য ধীর।
  2. এটি এখন দ্রুত, তবে আরও মেমরি ব্যবহার করে।
  3. এটি এখন মেমরির উপর হালকা তবে ধীর।
  4. এটি এখন দ্রুত, তবে বজায় রাখা আরও শক্ত।
  5. এটি রক্ষণাবেক্ষণ করা এখন সহজ তবে ধীর।

এই জাতীয় মামলাগুলি ন্যায়সঙ্গত হবে যদি, উদাহরণস্বরূপ:

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

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

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

"সি ++ এর উপরে সি # / জাভা / ... নির্বাচন করা সর্বোত্তম অনুকূলকরণ" বলার অর্থ কেবল তখনই বোধগম্য হয় যদি আপনি মনে করেন যে সি ++ সত্যই সফল হয়, কারণ অপ্টিমাইজেশনটি "সত্ত্বেও ... আরও ভাল" নয় "not আপনি যদি মনে করেন যে সি ++ নিজেই থাকা সত্ত্বেও আরও ভাল, তবে আপনার শেষ জিনিসটি হ'ল এই জাতীয় মিনিটের সম্ভাব্য মাইক্রো অপ্টগুলি সম্পর্কে চিন্তা করা উচিত। প্রকৃতপক্ষে, আপনি সম্ভবত এটিকে একেবারেই পরিত্যাগ করা ভাল; হ্যাপি হ্যাকারগুলিও এটির জন্য অনুকূলিতকরণের একটি গুণ!

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


0

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

int a = 1 + 2 + 3;

ব্যবহারিকভাবে অস্তিত্বের প্রতিটি ভাষার একটি নিয়ম রয়েছে যে 1 + 2 যোগ করে যোগফলকে মূল্যায়ন করা হয়, তারপরে ফলাফলটি আরও 3 যোগ করুন

int a = 1 + (2 + 3);

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

int a = 10 - (5 - 4);

প্রথম বন্ধনী সমালোচিত; তাদের ছেড়ে যাওয়া 9 থেকে 1 এ ফলাফল পরিবর্তন করবে।

সংকলকটি কোন ক্রমে কোন ক্রিয়াকলাপ সম্পাদিত হয় তা নির্ধারণ করার পরে, প্রথম বন্ধনী সম্পূর্ণরূপে ভুলে যায়। সংকলক এই মুহুর্তে যা মনে রাখে তা হ'ল কোন ক্রমটি কোন ক্রম সম্পাদন করবে। তাই আসলে কিছুই যে কম্পাইলার এখানে নিখুত হতে পারে, প্রথম বন্ধনী দ্বারা আছে সর্বস্বান্ত


practically every language in existence; APL ছাড়া: চেষ্টা করুন (এখানে) [tryapl.org] লিখে (1-2)+3, (2) 1-(2+3)(-4) এবং 1-2+3(এছাড়াও -4)।
টেমসডিং

0

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

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

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


1
আমি নিশ্চিত নই যে এটি প্রশ্নের উত্তর দেয়। সহায়ক অনুচ্ছেদগুলি সাহায্যের চেয়ে বিভ্রান্তিকর। জাভা সংকলক সি ++ কম্পাইলারের সাথে কীভাবে প্রাসঙ্গিক?
অ্যাডাম জুকারম্যান

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

3
প্যারেন্টিসেস "অপারেশন অর্ডার" জোর করে না। তারা অগ্রাধিকার পরিবর্তন। সুতরাং, এ a = f() + (g() + h());, কম্পাইলার মুক্ত ডাকতে f, gআর hযাতে (বা কোনো আদেশ এটা pleases)।
অলোক

আমার এই বক্তব্যের সাথে কিছু মতবিরোধ আছে ... আপনি একেবারে প্রথম বন্ধনীর সাথে ক্রিয়াকলাপের আদেশকে বাধ্য করতে পারেন।
জিনজাই

0

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

((a+b)+c)

এটি এটিকে অনুবাদ করে:

 a b + c +

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

বিষয়টির আরও তথ্যের জন্য আমি উইকিপিডিয়া নিবন্ধটি বিপরীত পোলিশ নোটেশনের প্রস্তাব দিই ।


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