On Mon, Aug 12, 2024 at 10:19 AM Lanre <lnearw...@gmail.com> wrote:
> > > On Mon, Aug 12, 2024 at 9:49 AM Levi Morrison <levi.morri...@datadoghq.com> > wrote: > >> On Sun, Aug 11, 2024 at 4:54 PM Lanre <lnearw...@gmail.com> wrote: >> > >> > Hello, >> > >> > I’m considering adding some C++ enhancements to the Zend API. These >> changes would be encapsulated within `#ifdef __cplusplus` guards, so they >> wouldn’t interfere with the existing C implementation. The primary goal is >> to provide a nicer interface for extensions while maintaining compatibility >> with C. >> > >> > Key points: >> > - **Struct-based Approach:** Everything will still use structs—no >> classes or non-public/non-static members. >> > - **Isolation:** Any enhancements that can be isolated from the C >> implementation will be, and they will reside in a common `zend_api_cxx` >> header file. >> > - **Proposed Enhancements:** >> > - Constructors and destructors, along with comparison operator >> overloads for `zval`. >> > - Constructor overloads for common `zval` initializations. >> > - Member methods for common `zval` operations. >> > >> > I’m happy to implement and maintain these changes. Since this doesn’t >> affect userland, do you think an RFC is necessary? >> > >> > Also, if anyone has suggestions or ideas for this C++ API, I’d love to >> hear them. >> > >> > Cheers, >> > Lanre >> >> I am not opposed, but there are some logistics questions: >> 1. Since it's for extensions and not core, how will we be sure it is >> maintained? What will test it? >> 2. Since it's in core, and C++ is a rapidly evolving language, what >> will the required C++ version be? What would our policy be on updating >> it? >> 3. How will we be sure about edges around language mismatches in C >> and C++? For instance, they have different rules regarding unions, >> which we make liberal use of. >> 4. C++ has many features and some are controversial. Will any be >> disallowed such as exceptions? >> >> There is one part of C++ specifically that I think could be pretty >> nice if we can figure out all the details: compile-time evaluation of >> the string hash function. This could make dealing with >> well-known/compile-time strings easier. >> > > 1. As for testing, we can implement either a second zend_test extension or > add the tests to the current one. > 2. C++ is indeed a rapidly evolving language, I suggest starting with a > conservative approach by targeting a stable C++ version that balances > modern features with broad compatibility—C++17 or C++20 could be good > candidates. As for updating the required version, we could establish a > policy where we review the C++ version every couple of years, aligning it > with broader trends in C++ adoption and compiler support across platforms. > This would help us avoid potential fragmentation or compatibility issues. > 3. As long as we stick to the struct based approach, we should be fine > regarding the common edge cases. The idea is to keep the structs compatible > with C while supporting C++ features > 4. To maintain a clean and consistent API, I suggest we disallow certain > C++ features like exceptions. Exceptions could introduce complexity and > unpredictability, especially when mixed with C's error handling mechanisms. > > > Overall, the goal is to use C++ to enhance the API without compromising > the stability and simplicity of the C core. We can focus on C++ features > that bring clear benefits, such as stronger type safety and cleaner > abstractions, while avoiding those that might introduce unnecessary > complexity. > > Cheers, > Lanre > Also I already implemented a compile time version of the string hash function (for one of my extensions), feel free to use it if you need ( https://gist.github.com/oplanre/e384ed2a4c0fea698ed0e15d24157611) but it most likely won't be part of this PR/RFC Cheers, Lanre