1 पॉइंट द्वारा GN⁺ 3 시간 전 | 1 टिप्पणियां | WhatsApp पर शेयर करें
  • परफॉर्मेंस ऑप्टिमाइज़ेशन में बड़ा इज़ाफा किया गया है, और QBE 1.3 vanilla coremark पर commercial compiler परफॉर्मेंस के 63% से अधिक तक पहुंचता है, जबकि Hare test suite में qbe-1.2 की तुलना में 33% सुधार दिखाता है
  • QBE 1.3, 1.0 के बाद की सबसे बड़ी रिलीज़ है, जिसमें लगभग 7k लाइनें जोड़ी गईं और 1.5k लाइनें हटाई गईं
  • नए ऑप्टिमाइज़ेशन में GVN/GCM, loop optimization, if elimination, CFG simplification आदि शामिल हैं, लेकिन केवल कुछ सत्यापित passes ही रखे गए हैं
  • inlining को इस ऑप्टिमाइज़ेशन सेट से बाहर रखा गया है, क्योंकि यह QBE के function-unit streaming compilation model के साथ ठीक से मेल नहीं खाता
  • ee_isdigit को inline करने और crcu8 को अधिक सरल branchless implementation में बदलने वाले coremark variant में, QBE अपने लक्ष्य gcc -O2 के मुकाबले 70% परफॉर्मेंस तक पहुंच गया
  • नया OCaml टूल mgen lispy IL pattern को C matching code में compile करता है, जिससे मौजूदा hand-written instruction selection logic को बदला या सरल किया जा सकता है
  • mgen special comment block में IL pattern ढूंढता है और उसके ठीक नीचे C code डालता है; इसका मौजूदा उपयोग isel.c में है
  • instruction DAG matching, Ken Thompson के Plan9 C compiler की तरह numbering approach अपनाता है, और एक सरल bytecode matcher भी generate करता है जिसे runmatch() interpret करता है
  • Windows ABI support जोड़ा गया है, जिससे -t amd64_win देने पर Windows target के लिए compile किया जा सकता है
  • QBE द्वारा generated assembly अब भी AT&T syntax में है, और इसे mingw assembler से compile करने का तरीका उपयुक्त बताया गया है
  • position-independent code support में सुधार किया गया है, जिससे अधिकतर targets पर shared object के साथ अधिक सहज linking और shared object बनाना संभव हुआ है
  • नए extern dynamic constant flag (DYNCONST) के जरिए IL स्तर पर dynamic library variable जैसे global symbol के indirect access को व्यक्त किया जा सकता है

1 टिप्पणियां

 
GN⁺ 3 시간 전
Lobste.rs की राय
  • मैं लंबे समय से चल रहे एक hobby project के रूप में TRIPOS/Amiga Exec स्टाइल का छोटा OS बना रहा हूँ
    इसमें memory protection नहीं है, flat memory map है, और message passing भी बस pointer पास करने के स्तर का है
    ऐसे सिस्टम को self-hosting बनाना हो तो PIE/PIC बना सकने वाला छोटा compiler कहीं ज़्यादा सुविधाजनक होता है। Amiga स्टाइल libraries तो स्वाभाविक रूप से PIC होनी ही चाहिए, और executable को shared memory map में कहीं लोड करते समय load-time patching बहुत कम करनी पड़े, यह भी अच्छा है
    GCC और Clang यह कर सकते हैं, लेकिन वे बहुत बड़े हैं। मैंने आख़िरी बार जब देखा था तब TCC PIC नहीं कर पाता था, इसलिए QBE को और देखना पड़ेगा

    • मेरा C compiler PIC बना सकता है, इसलिए आपकी रुचि हो सकती है: https://codeberg.org/lsof/antcc/
      उम्मीद है यह self-promotion जैसा न लगे। मुझे छोटे compilers का क्षेत्र सच में बहुत पसंद है, और इसे और testing की भी ज़रूरत है
    • मैं भी flat memory map, सब कुछ PIE, और system call को function call की तरह रखने वाला OS Ashet OS बना रहा हूँ
      यह पहले ही काफ़ी आगे बढ़ चुका है और कई platforms को support करता है
      जल्दी self-hosting तक पहुँचना मुश्किल लगता है। Thumb-2 code generation चाहिए, और उसे चलाने का व्यावहारिक तरीका लगभग सिर्फ़ अपना compiler लिखना ही है। kernel code को छोड़कर usable RAM केवल 8MB है, यही एक सीमा है
      यह ELF files को बदलकर बनाए गए अपने executable format .ashex का उपयोग करता है। इस प्रक्रिया में एक special section इस्तेमाल होता है जो असल में सिर्फ़ एक absolute jump होता है, और app loader उसे असली system call address से फिर लिख देता है
      flat memory system की कठिनाई shared objects को साफ़-सुथरे ढंग से support करने में है। अलग-अलग applications के बीच code साझा करना हो तो compiler support चाहिए ताकि सभी dynamic symbol access register में रखे गए variables के ज़रिए हों
  • नया extern keyword आने से बहुत खुशी हुई
    release notes में इसका ज़िक्र नहीं है, लेकिन यह thread के साथ भी काम करता है, जिससे initial-exec TLS संभव हो जाता है। इसकी ज़रूरत तब पड़ती है जब किसी दूसरी shared library में define किए गए thread-local global variable को access करना हो, और FreeBSD के ctype.h के लिए यह ज़रूरी है
    extern की ज़रूरत macOS या Haiku जैसे platforms पर shared library के सामान्य global variables, जैसे stderr, को access करने के लिए भी होती है। अब QBE-आधारित compilers कहीं ज़्यादा operating systems और use cases को support कर पाएँगे
    Roland के performance improvements के लिए भी बहुत आभार। उन्होंने सच में शानदार काम किया है

  • अगर मैंने इसे सही पढ़ा है, तो क्या अब official Windows support आ गया है?
    क्या यह QBE की ऐतिहासिक और अब तक की बड़ी सीमाओं में से एक नहीं थी? यह देखना सच में अच्छा है

  • क्या इस project का लक्ष्य Cranelift से overlap करता है? मुझे ठीक से समझ नहीं आता कि QBE कब इस्तेमाल करना चाहिए

    • QBE compiler backends की दुनिया का “OpenBSD” जैसा है। इसकी philosophy simplicity और minimalism है, और आधिकारिक विवरण के अनुसार इसका लक्ष्य है “industrial-strength optimizing compiler performance का 70% सिर्फ़ 10% code के साथ देना”
      इसका वास्तविक मुकाबला Cranelift और LLVM से है
      दुर्भाग्य से, पहले यह ज़्यादातर hobby languages या compiler implementations में ही इस्तेमाल होता था। उदाहरण के लिए, नई C-family language जैसी दिखने वाली myrddin अब शायद मृत है, और cproc अभी भी जीवित एक hobby C compiler implementation है
      फिर भी Hare ने QBE को अपनाने के बाद उम्मीद जगी है। आपके सवाल का जवाब यहाँ है: https://harelang.org/documentation/faq.html#why-qbe-instead-of-llvm
    • मुझे लगता है कि इसका लक्ष्य सिर्फ़ Cranelift ही नहीं, LLVM से भी overlap करता है
      मैं इसे बहुत गहराई से नहीं जानता, लेकिन तुलना की सामग्री काफ़ी है। जितना मुझे पता है, QBE बाकी दोनों की तुलना में कहीं अधिक सरल backend की ओर उन्मुख है
  • instruction-selection matcher बनाने के लिए छोटे DSL का उपयोग करने का तरीका सच में शानदार है