ما هو LLVM ولماذا هو مطلوب؟

مرحبا! أعتقد أن لدى العديد من الأشخاص سؤالًا آخر على الفور - لماذا نحتاج إلى مقال آخر حول LLVM على الإطلاق ، لأن هناك أكثر من مائة منهم في حبري ؟ كانت مهمتي هي كتابة "مقدمة للموضوع" لبقيتنا - نحن المطورون المحترفون الذين لا يخططون لإنشاء مجمّعين ولا يهتمون على الإطلاق بخصائص جهاز LLVM IR. على حد علمي ، لم يحدث هذا بعد.



الشيء الرئيسي الذي يثير اهتمام الجميع تقريبًا - وما أخطط للحديث عنه - هو عنوان المقال. لماذا تحتاج إلى LLVM عندما يكون لديك GCC و Visual C ++؟ إذا لم تكن مبرمج C ++ ، فهل يجب أن تقلق؟ هل LLVM Clang على أي حال؟ أم لا؟ وماذا تعني هذه الأحرف الأربعة في الواقع؟



ما في الاسم؟



لنبدأ بالسؤال الأخير. ماذا وراء الحروف LLVM؟ ذات مرة كانت عبارة عن اختصار لـ "Low Level Virtual Machine" ، لكنها في الوقت الحاضر تعني ... لا شيء على الإطلاق.



ولدت LLVM كمشروع بحثي من قبل كريس لاتنر (ثم ​​طالب ماجستير في جامعة إلينوي في أوربانا شامبين) وفيكرام أدوي(ثم ​​وحتى يومنا هذا أساتذة في نفس الجامعة). كان الهدف من المشروع هو إنشاء برامج تمثيل وسيط (IR) تسمح "بالتحسين القوي طوال عمر التطبيق" - شيء مثل Java bytecode ، فقط أكثر برودة. الفكرة الرئيسية هي عمل تمثيل مناسب تمامًا للتجميع الثابت (عندما يتلقى المترجم برنامجًا مكتوبًا بلغة عالية المستوى ، على سبيل المثال C ++ ، كمدخل ، يترجمه إلى LLVM IR ، ويحسن ، ويحصل على رمز الجهاز السريع كإخراج) ، وديناميكي (عندما يتلقى نظام وقت التشغيل رمز الجهاز كمدخل مع LLVM IR المخزن في ملف الكائن أثناء التجميع الثابت ،يعمل على تحسينه - مع الأخذ في الاعتبار ملف التعريف الديناميكي الذي تم جمعه بحلول هذا الوقت - ويحصل على رمز آلة أسرع عند الإخراج ، والذي يمكنك من أجله الاستمرار في جمع ملف التعريف والتحسين وما إلى ذلك).



? ? .



, " ":





, , LLVM — , "LLVM" . ! — llvm.org , LLVM , , .



? 2005 ...



Apple, Google --



Apple Objective-C ( ) LLVM. Apple ? , Apple , . , Apple PowerPC, (Symantec) , .



2005 Apple GCC, , GPL. GPLv3, GCC GCC 4.3. Apple , GCC, XCode, GCC 4.2. GPL , "": GCC, , , — ! LLVM "" ( UIUC, Apache 2.0), , .



Apple , " ", LLVM - GCC. "-" , ; "-" — , LLVM IR. GCC-- LLVM-- , — , , "". 2006 , "Clang".



"clang" — "C" "language". "C" C- , C C++ Objective-C. , "clang" "-", "-"! — !



- Clang - LLVM Clang/LLVM Clang. ( !) C++ .



LLVM Clang Google. Apple, Google LLVM — GCC , . Google — , , . Clang . Clang — Windows. GCC Windows, GCC , . , PDB, GCC — - .



Google , GCC; - Intel Microsoft. Google - Clang. Windows ( Google, - : Chromium Google Earth) LLVM Android. Android: " Android. , ( ) ."



, Google, LLVM . LLVM: ARM, IBM, Sony, Samsung, NXP, Facebook, Argonne National Lab… , " ". GCC, LLVM — , Intel Qualcomm. " " — LLVM , , , .



LLVM GCC



, : " , , Apple Google, … - ? LLVM? GCC ?"



— ! GCC , . , , , , , GPL , GCC — GCC, , ?



, GCC — GCC LLVM. "" ARM (Google, Samsung, Qualcomm ARM) LLVM — , ARM LLVM "" , GCC.



C++. , Google, ISO C++ — , , — - Clang. Clang / LLVM. , : C++ Clang'.



Clang — , Android LLVM — . , Clang warning', GCC, . , Clang' , Clang Static Analyzer, , , ++, .



LLVM , : "", - OpenMP ( ), lld (- ), libc++ ( C++). LLVM — GCC , . , LLVM — , .



Clang GCC, . — . , , C C++ " " — GCC Clang -.



, . , ?



    #include <stdio.h>

    static void die() {
      while(1)
        ;
    }

    int main() {
      printf("begin\n");
      die();
      printf("unreachable\n");
    }


"gcc -O2" "clang -O2" — . " " C ( ? — ). "", , — " "! ( C ). , Clang GCC . , ( ?) , .



"gcc" "clang" ( "g++" "clang++" C++) - . ? — ?



, , , ARM — , "" .



"" LLVM



LLVM C++. LLVM — , — . , LLVM "" . LLVM, LLVM , .



Clang Static Analyzer, , OpenMP, libc++ lld — , C++ . Rust LLVM — , Rust LLVM ! C++ Rust, LLVM ( , ) D, Fortran, Haskell, Julia, Kotlin, Lua, PHP, Python. -, LLVM IR, ! LLVM .



LLVM — , . ML — TensorFlow Google PyTorch Facebook — LLVM .



LLVM , . ML ( , ), - , LLVM.



LLVM — "core" LLVM ! LLVM Developers' Meeting " " IT. , , Huawei, — , LLVM .



, , LLVM . LLVM- ?



LLVM ( Intel, NXP Huawei), . ! — , : LLVM . ? — ? :)




All Articles