cappulada what we ve learned and why binding c is hard
play

Cappulada: What weve learned And why binding C++ is hard Johannes - PowerPoint PPT Presentation

Cappulada: What weve learned And why binding C++ is hard Johannes Kliemann FOSDEM, Brussels, 2020-02-01 Recall Cappulada 2019 Goals Automatically bind C++ APIs to Existing solutions (GCC) Ada No template support Maintain


  1. Cappulada: What we’ve learned And why binding C++ is hard Johannes Kliemann FOSDEM, Brussels, 2020-02-01

  2. Recall Cappulada 2019 Goals ■ Automatically bind C++ APIs to ■ Existing solutions (GCC) Ada ▪ No template support ■ Maintain API layout and type safety ▪ No proper support to use non- ■ Maintain semantically appropriate valid identifiers in Ada mappings ▪ Generates uncompilable code ■ Generate mangled symbols ▪ No automatic handling of ■ Detect and avoid name collisions constructors/destructors ■ Be SPARK compatible where ▪ Fixing requires maintaining a fork possible in the long term ■ Be better than existing solutions 2020-02-01 2

  3. Recall Cappulada 2019 Achievements and Shortcomings ■ Shortcomings ■ Achievements ▪ Partial template specialization ▪ Templates ▪ Typedefs on specific types ▪ Classes, namespaces, nesting ▪ Auto keyword ▪ Inheritance, with virtual classes ▪ Operator overloads ▪ Builtin types, typedefs, enums, arrays, pointers, references ▪ Function templates ▪ Member functions, function ▪ Merging multiple equally named pointers namespaces ▪ Private, public, protected scopes ▪ Destructors ▪ Mangling ▪ Multiple inheritance 2020-02-01 3

  4. Why is it hard? Complexity and Semantics ■ Both languages are complex ■ Inherent semantic differences ▪ Ada 2012 Standard has ~1300 ▪ Arrays: separate type in Ada, pages builtin construct in C++ ▪ C++17 Standard has ~1600 ▪ C++ templates can be used for pages meta programming, Ada generics cannot ▪ C++ builds upon C so we need to support C, too ▪ Both have different calling conventions ▪ C11 Standard has ~700 pages 2020-02-01 4

  5. What doesn’t work? 2020-02-01 5

  6. What doesn’t work? Using Ada Generics with C++ Templates template <typename T> class A ■ Templates in C++ are static { ■ Linker symbol is generated from void inc(T *t); the template arguments }; ■ Template arguments are always static A<int>::inc(int *t); _ZN1AIiE3incEPi 2020-02-01 6

  7. What doesn’t work? Using Ada Generics with C++ Templates generic type T is private package A is type Class is limited null record with Convention => CPP; procedure Inc (This : in out Class; X : in out T) with Import, Convention => CPP, External_Name => “_ZN1AI” & M (X) & ”E3incEP” & M (X); -- _ZN1AIiE3incEPi end A; a.ads: entity for aspect "Import" must be a static expression a.ads: non-static function call (RM 4.9(6,18)) 2020-02-01 7

  8. What doesn’t work? Using Ada Generics with C++ Templates ■ Theory ▪ Overloading M for Mangling ■ Practice ▪ Overloading doesn’t work on function M (X : Integer) private types return String ▪ Return value of M is not static is (“i”); ▪ Generic formal parameters are never considered static ■ Potential Solution ▪ Preprocessor 2020-02-01 8

  9. What doesn’t work? C++ Pass by Value type A is limited record X : Integer; end record with class A Import, { Convention => CPP; public: int X; function Con return A with A(); Import, Convention => CPP, }; External_Name => “...”; pragma CPP_Constructor(Con); 2020-02-01 9

  10. What doesn’t work? C++ Pass by Value class A { procedure Print (X : A) with public: Import, int X; A(); Convention => CPP, }; External_Name => “...”; void print(A a); 2020-02-01 10

  11. What doesn’t work? C++ Pass by Value ■ Problem: A will be passed by reference from Ada but expected by value in C++ ■ Considered Solution: Import Print with Convention C_Pass_By_Copy ■ Problem: C_Pass_By_Copy Convention allowed only for record type ■ Potential Solution: Define a record identical to the class ■ Problem: Unable to convert between both safely (unlike in C++) 2020-02-01 11

  12. What doesn’t work? Automatic destructor calling ■ Automatically called destructors are not supported in the compiler ■ Destructor could be called manually ■ Controlled objects can implement this functionality 2020-02-01 12

  13. What have we learned? ■ Even if everything fits it’s much work ■ Some things could in theory work ▪ With really high effort ▪ With additional tools ▪ At the cost of usability and safety ■ Some things just won’t work at all 2020-02-01 13

  14. Don’t you fear that you import the weirdness of C++ into Ada? 2020-02-01 14

  15. YES! 2020-02-01 15

  16. Questions? Gneiss: A Nice Component Framework in SPARK Sunday 12:00 K.4.601 (Microkernel devroom) Johannes Kliemann kliemann@componolit.com @Componolit · componolit.com · github.com/Componolit 2020-02-01 16

Download Presentation
Download Policy: The content available on the website is offered to you 'AS IS' for your personal information and use only. It cannot be commercialized, licensed, or distributed on other websites without prior consent from the author. To download a presentation, simply click this link. If you encounter any difficulties during the download process, it's possible that the publisher has removed the file from their server.

Recommend


More recommend