সংকলকগুলি কি দ্রুতগতি বারের জন্য মাল্টিথ্রেডিং ব্যবহার করে?


16

আমি যদি আমার সংকলকগুলির কোর্সটি সঠিকভাবে মনে করি তবে সাধারণ সংকলকটির নিম্নলিখিত সরলিকৃত রূপরেখা রয়েছে:

  • একটি লেজিকাল বিশ্লেষক উত্স কোড অক্ষর দ্বারা অক্ষর স্ক্যান করে (বা কিছু স্ক্যানিং ফাংশন কল করে)
  • বৈধতার জন্য লেক্সেমির অভিধানের বিপরীতে ইনপুট অক্ষরের স্ট্রিং পরীক্ষা করা হয়
  • যদি লেক্সেমটি বৈধ হয় তবে এটি এর সাথে সম্পর্কিত টোকেন হিসাবে শ্রেণিবদ্ধ করা হয়
  • পার্সার টোকেনের সংমিশ্রণের বাক্য গঠনটিকে বৈধতা দেয়; টোকেনটি-বাই-টোকেন

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




1
@ রবার্টহার্ভে প্রথম লিঙ্কের শীর্ষ উত্তরটি লিখেছেন, "তবে সংকলকরা এখনও তারা একক থ্রেডযুক্ত।" সুতরাং যে একটি না?
প্রোটন

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

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

উত্তর:


29

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

কেন এমন? ঠিক আছে, কম্পাইলাররা যে কাজগুলি করে সেগুলির বেশিরভাগই সহজেই সমান্তরালে নিজেকে ধার দেয় না:

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

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

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

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

2

সংকলন একটি "বিব্রতকরভাবে সমান্তরাল" সমস্যা।

কেউ একটি ফাইল সংকলনের সময় সম্পর্কে চিন্তা করে না। লোকেরা 1000 টি ফাইল সংকলনের সময় সম্পর্কে যত্নশীল। এবং 1000 টি ফাইলের জন্য, প্রসেসরের প্রতিটি কোর সমস্ত কোর সম্পূর্ণ ব্যস্ত রেখে সুখে একবারে একটি ফাইল তৈরি করতে পারে।

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

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