সংকলক, লিঙ্কার, লোডার কী?


উত্তর:


186
=====> COMPILATION PROCESS <======

                     |
                     |---->  Input is Source file(.c)
                     |
                     V
            +=================+
            |                 |
            | C Preprocessor  |
            |                 |
            +=================+
                     |
                     | ---> Pure C file ( comd:cc -E <file.name> )
                     |
                     V
            +=================+
            |                 |
            | Lexical Analyzer|
            |                 |
            +-----------------+
            |                 |
            | Syntax Analyzer |
            |                 |
            +-----------------+
            |                 |
            | Semantic Analyze|
            |                 |
            +-----------------+
            |                 |
            | Pre Optimization|
            |                 |
            +-----------------+
            |                 |
            | Code generation |
            |                 |
            +-----------------+
            |                 |
            | Post Optimize   |
            |                 |
            +=================+
                     |
                     |--->  Assembly code (comd: cc -S <file.name> )
                     |
                     V
            +=================+
            |                 |
            |   Assembler     |
            |                 |
            +=================+
                     |
                     |--->  Object file (.obj) (comd: cc -c <file.name>)
                     |
                     V
            +=================+
            |     Linker      |
            |      and        |
            |     loader      |
            +=================+
                     |
                     |--->  Executable (.Exe/a.out) (com:cc <file.name> ) 
                     |
                     V
            Executable file(a.out)

সি প্রিপ্রসেসর: -

সি প্রিপ্রোসেসিং সংকলনের প্রথম ধাপ। এটি পরিচালনা করে:

  1. #define বিবৃতি।
  2. #include বিবৃতি।
  3. শর্তাধীন বিবৃতি।
  4. ম্যাক্রো

ইউনিটের উদ্দেশ্য হ'ল সি উত্স ফাইলটি খাঁটি সি কোড ফাইলে রূপান্তর করা।

সি সংকলন:

ইউনিটে ছয়টি পদক্ষেপ রয়েছে:

1) লেক্সিকাল বিশ্লেষক:

এটি উত্স ফাইলটিতে অক্ষরগুলি একত্রিত করে একটি "টোকেন" গঠন করে। টোকেন হ'ল অক্ষরের একটি সেট যাতে 'স্পেস', 'ট্যাব' এবং 'নতুন লাইন' নেই। সুতরাং সংকলনের এই ইউনিটটিকে "টোকেনিজার "ও বলা হয়। এটি মন্তব্যগুলি সরিয়ে দেয়, প্রতীক টেবিল এবং স্থানান্তর টেবিল এন্ট্রি উত্পন্ন করে।

2) সিনট্যাকটিক বিশ্লেষক:

এই ইউনিট কোডটিতে সিনট্যাক্স পরীক্ষা করে। প্রাক্তন হিসাবে:

{
    int a;
    int b;
    int c;
    int d;

    d = a + b - c *   ;
}

উপরের কোডটি পার্স ত্রুটি তৈরি করবে কারণ সমীকরণটি ভারসাম্যপূর্ণ নয়। এই ইউনিটটি পার্সার ট্রিটি নিম্নলিখিতভাবে তৈরি করে এটি অভ্যন্তরীণভাবে পরীক্ষা করে:

                            =
                          /   \
                        d       -
                              /     \
                            +           *
                          /   \       /   \
                        a       b   c       ?

সুতরাং এই ইউনিটকে পার্সারও বলা হয়।

3) শব্দার্থ বিশ্লেষক:

এই ইউনিট বিবৃতিতে অর্থটি পরীক্ষা করে। প্রাক্তন হিসাবে:

{
    int i;
    int *p;

    p = i;
    -----
    -----
    -----
}

উপরের কোডটি "বেমানান ধরণের অ্যাসাইনমেন্ট" ত্রুটি উত্পন্ন করে।

4) প্রাক অপ্টিমাইজেশন:

এই ইউনিটটি সিপিইউ থেকে স্বতন্ত্র, অর্থাৎ দুটি ধরণের অপ্টিমাইজেশন রয়েছে

  1. প্রিপটিমাইজেশন (সিপিইউ স্বাধীন)
  2. পোস্টোপটিমাইজেশন (সিপিইউ নির্ভর)

এই ইউনিটটি নিম্নলিখিত ফর্মগুলিতে কোডটি অনুকূলিত করে:

  • আই) ডেড কোড নির্মূলকরণ
  • দ্বিতীয়) সাব কোড বিলোপ
  • III) লুপ অপ্টিমাইজেশন

আই) ডেড কোড নির্মূল:

প্রাক্তন হিসাবে:

{
    int a = 10;
    if ( a > 5 ) {
        /*
        ...
        */
    } else {
       /*
       ...
       */
    }
}

এখানে, সংকলক সংকলনের সময় 'ক' এর মান জানে, সুতরাং এটিও জানে যে যদি শর্তটি সর্বদা সত্য হয়। সুতরাং এটি কোডের অন্য অংশটি সরিয়ে দেয়।

দ্বিতীয়) সাব কোড নির্মূল:

প্রাক্তন হিসাবে:

{
    int a, b, c;
    int x, y;

    /*
    ...
    */

    x = a + b;
    y = a + b + c;

    /*
    ...
    */
}

নিম্নলিখিত হিসাবে অনুকূলিত করা যেতে পারে:

{
    int a, b, c;
    int x, y;

    /*
     ...
    */

    x = a + b;
    y = x + c;      // a + b is replaced by x

    /*
     ...
    */
}

III) লুপ অপ্টিমাইজেশন:

প্রাক্তন হিসাবে:

{
    int a;
    for (i = 0; i < 1000; i++ ) {

    /*
     ...
    */

    a = 10;

    /*
     ...
    */
    }
}

উপরের কোডে, যদি 'এ' স্থানীয় হয় এবং লুপটিতে ব্যবহৃত না হয়, তবে এটি নিম্নরূপে অনুকূলিত হতে পারে:

{
    int a;
    a = 10;
    for (i = 0; i < 1000; i++ ) {
        /*
        ...
        */
    }
}

5) কোড জেনারেশন:

এখানে, সংকলকটি এসেম্বলি কোড তৈরি করে যাতে বেশি ঘন ঘন ব্যবহৃত ভেরিয়েবলগুলি রেজিস্টারে সংরক্ষণ করা হয়।

6) পোস্ট-অপটিমাইজেশন:

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

            -----
        jmp:<addr1>
<addr1> jmp:<addr2>
            -----
            -----

নিয়ন্ত্রণ সরাসরি লাফ দেয়।

তারপরে শেষ পর্বটি লিংকিং (যা এক্সিকিউটেবল বা লাইব্রেরি তৈরি করে)। যখন এক্সিকিউটেবল চালিত হয়, তখন এটি প্রয়োজনীয় লাইব্রেরিগুলি লোড হয়।


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

7) এসেম্ব্লার এবং সর্বাধিক গুরুত্বপূর্ণ 8) লিংকার এবং 9) লোডার যা জিজ্ঞাসা করা হয়েছিল?

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

এএসসিআইআই প্রতিনিধিত্ব:

[Source Code] ---> Compiler ---> [Object code] --*
                                                 |
[Source Code] ---> Compiler ---> [Object code] --*--> Linker --> [Executable] ---> Loader 
                                                 |                                    |
[Source Code] ---> Compiler ---> [Object code] --*                                    |
                                                 |                                    |
                                 [Library file]--*                                    V
                                                                       [Running Executable in Memory]

2
এই ব্যাখ্যা সরাসরি এগিয়ে। আপনার প্রভাষক হওয়ার কথা বিবেচনা করা উচিত। ধন্যবাদ
০.০

লিঙ্কার এবং লোডার সম্পর্কে উত্তর এড়ানোর জন্য ধন্যবাদ না!

29

আশা করি এটি আপনাকে আরও কিছুটা সহায়তা করবে।

প্রথমে এই চিত্রটি দিয়ে দেখুন:

                         (img source->internet)

source-> ইন্টারনেট

আপনি কোডের একটি অংশ তৈরি করুন এবং ফাইলটি (উত্স কোড) সংরক্ষণ করুন, তারপরে

প্রাক প্রসেসিং : - নামটি যেমন বোঝায়, এটি সংকলনের অংশ নয়। তারা সংকলককে প্রকৃত সংকলনের আগে প্রয়োজনীয় প্রাক-প্রক্রিয়াকরণ করার নির্দেশ দেয়। আপনি এই ধাপটিকে পাঠ্য প্রতিস্থাপন বা # দ্বারা চিহ্নিত বিশেষ প্রিপ্রসেসর নির্দেশকদের ব্যাখ্যা করতে পারেন।

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

জমায়েত করা : - এসেম্বল কোডটি মেশিন কোডে অনুবাদিত হয়। আপনি এসেম্বেবলারকে একটি বিশেষ ধরণের কমপ্লায়ার বলতে পারেন।

সংযোগ স্থাপন : - এই কোডের টুকরো যদি লিঙ্ক করার জন্য অন্য কোনও উত্স ফাইলের প্রয়োজন হয় তবে এটি কার্যকর করার যোগ্য ফাইল হিসাবে লিংকটিকে লিঙ্ক করে।

এটির পরে অনেকগুলি প্রক্রিয়া ঘটে। হ্যাঁ, আপনি অনুমান করেছিলেন ঠিক এখানেই লোডারটির ভূমিকা:

লোডার : - এটি এক্সিকিউটেবল কোডটিকে মেমরিতে লোড করে; প্রোগ্রাম এবং ডেটা স্ট্যাক তৈরি করা হয়, নিবন্ধ শুরু হয়।

সামান্য অতিরিক্ত তথ্য: - http://www.geeksforgeeks.org/memory-layout-of-c-pramram/ , আপনি সেখানে মেমরি লেআউট দেখতে পারেন।


15

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

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

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


14

উইকিপিডিয়ায় একটি ভাল উত্তর থাকা উচিত, এখানে আমার চিন্তাভাবনাগুলি:

  • সংকলক: কিছুর.সি উত্স পড়ে, কিছু.ও অবজেক্ট লিখে।
  • লিঙ্কার: বেশ কয়েকটি * .o ফাইলগুলিকে একটি এক্সিকিউটেবল প্রোগ্রামে যোগদান করে।
  • লোডার: কোড যা একটি এক্সিকিউটেবলকে মেমরির মধ্যে লোড করে এবং এটি চলমান শুরু করে।

4

*

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

*

লিনাক্সজার্নালের লিঙ্কারস এবং লোডারগুলি এই ধারণাটি স্পষ্টতার সাথে ব্যাখ্যা করে। এটি ক্লাসিক নাম a.out কীভাবে এল তাও ব্যাখ্যা করে। (এসেম্বলারের আউটপুট)

একটি দ্রুত সংক্ষিপ্তসার,

c program --> [compiler] --> objectFile --> [linker] --> executable file (say, a.out)

আমরা এক্সিকিউটেবল পেয়েছি, এখন এই ফাইলটি আপনার বন্ধু বা আপনার গ্রাহককে দিন যাকে এই সফ্টওয়্যারটির প্রয়োজন আছে :)

যখন তারা এই সফ্টওয়্যারটি চালায়, কমান্ড লাইনে টাইপ করে বলুন ./a.out

execute in command line ./a.out --> [Loader] --> [execve] --> program is loaded in memory

প্রোগ্রামটি মেমরিতে লোড হয়ে গেলে, পিসি (প্রোগ্রামের কাউন্টার) এর প্রথম নির্দেশের দিকে ইঙ্গিত করে নিয়ন্ত্রণটি এই প্রোগ্রামে স্থানান্তরিত হয় a.out


4

কম্পাইলার:

এটি উত্স ফাইলটি পড়বে যা .c বা .cpp ইত্যাদির হতে পারে এবং এটি .o ফাইলকে অবজেক্ট ফাইল হিসাবে ডাকা হয়।

linker:

এটি বেশ কয়েকটি .o ফাইলগুলি একত্রিত করে যা একাধিক উত্স ফাইলের জন্য এক্সিকিউটেবল ফাইলের (জিসিসিতে ইএলএফ ফর্ম্যাট) রূপান্তর করতে পারে। লিঙ্ক দুটি ধরণের রয়েছে:

  • স্থির লিংক
  • গতিশীল লিঙ্কিং

লোডার:

একটি প্রোগ্রাম যা এক্সিকিউটেবল ফাইলটিকে মেশিনের প্রাথমিক স্মৃতিতে লোড করে।


লিনাক্সে প্রোগ্রাম প্রয়োগের এই তিনটি স্তর সম্পর্কে একটি বিশদ অধ্যয়নের জন্য, দয়া করে এটি পড়ুন


1

সংকলক পরিবর্তনগুলির জন্য আপনার উত্স কোডটি ত্রুটিগুলির জন্য পরীক্ষা করে এবং এটিকে অবজেক্ট কোডে পরিবর্তন করে operating এটি অপারেটিং সিস্টেমটি চালিত কোড।

আপনি প্রায়শই একক ফাইলে একটি সম্পূর্ণ প্রোগ্রাম লিখেন না তাই লিঙ্কার আপনার সমস্ত অবজেক্ট কোড ফাইলগুলিকে লিঙ্ক করে।

আপনার প্রোগ্রামটি মূল স্মৃতিতে না থাকলে কার্যকর হবে না


1
  • সংকলক : যা মানব বোধগম্য ফর্ম্যাটটিকে মেশিনে বোধগম্য ফরম্যাটে রূপান্তর করে
  • লিঙ্কার : কোনটি মেশিনের বোধগম্য ফর্ম্যাটটিকে অপারেটিং সিস্টেমের বোধগম্য ফর্ম্যাটে রূপান্তর করে
  • লোডার : এমন সত্তা যা প্রোগ্রামটি লোড করে এবং র‌্যামে চালিত করে

লিঙ্কার এবং ইন্টারপ্রেটার হ'ল পারস্পরিক একচেটিয়া ইন্টারপ্রেটার কোড লাইন দ্বারা লাইন পাচ্ছেন এবং লাইন লাইন চালাবেন।


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

1

সংকলক এটি উত্স কোডকে অবজেক্ট কোডে রূপান্তর করে।

লিংকার এটি একাধিক অবজেক্ট ফাইলগুলিকে একক এক্সিকিউটেবল প্রোগ্রাম ফাইলের সাথে সংযুক্ত করে।

লোডার এটি এক্সিকিউটেবল ফাইলটিকে প্রধান স্মৃতিতে লোড করে।


1
আমি মনে করি আপনার উত্তরটি ইতিমধ্যে বিগত 10 বছর থেকে বিদ্যমান 14 উচ্চ মানের জবাবগুলিতে বেশিরভাগ ক্ষেত্রে covered
েকে

0

একটি সংকলক একটি বিশেষ প্রোগ্রাম যা একটি নির্দিষ্ট প্রোগ্রামিং ভাষায় রচিত বিবৃতিগুলি প্রক্রিয়া করে এবং তাদের মেশিনের ভাষা বা "কোড" রূপান্তর করে যা একটি কম্পিউটারের প্রসেসর ব্যবহার করে


0

একটি সংকলক প্রোগ্রামিং ভাষা থেকে কোডের লাইনগুলিকে মেশিন ভাষায় অনুবাদ করে।

একটি লিঙ্কার দুটি প্রোগ্রামের মধ্যে একটি লিঙ্ক তৈরি করে।

একটি লোডার প্রোগ্রামটি মূল ডাটাবেস, প্রোগ্রাম ইত্যাদির মেমোরিতে লোড করে


-1

সংকলক: এটি একটি সিস্টেম সফ্টওয়্যার যা প্রোগ্রাম, বস্তু ফাইল, বার্তা ইত্যাদির ত্রুটি সংশোধন করে

লিঙ্কার: এটি এমন একটি সিস্টেম সফ্টওয়্যার যা এক বা একাধিক অবজেক্ট ফাইল এবং কিছু লাইব্রেরি কোডকে কিছু এক্সিকিউটেবল কিছু লাইব্রেরি বা ত্রুটির তালিকার সাথে সংযুক্ত করে

লোডার: একটি প্রোগ্রাম যা এক্সিকিউটেবল ফাইলটিকে মেশিনের প্রাথমিক স্মৃতিতে লোড করে

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