On 05/02/17 23:25, Alex Bowers wrote:
> And here is the previous messaging without borked formatting. Sorry folks.
> 
> 
> FFI RFC
> ======
> 
> There are many languages that support an FFI implementation.
> 
> NodeJS
> Python
> C++
> Ruby
> 
> FFI allows you to call a native C function without requiring the
> boilerplate of an extension to be written.
> 
> There are several benefits to having FFI
> 
> - Performance
> - Shareability / Bundling
> - Common functionality between languages
> 
> Performance
> ===
> Although less pronounced than the 5.x versions, there is still a
> performance benefit to having native C code over PHP code. For
> example, you could utilise threading inside of your FFI methods, which
> PHP does not expose the ability to do.
> 
> Shareability
> ===
> 
> If you wish to implement some of your source code in C, the current
> way to share it is to build it as an extension. This is cumbersome,
> and restricts use-cases such as shared hosting, where the ability to
> install your own extensions is probably restricted. However, with FFI,
> the shared object can be loaded from any location, and so that
> restriction is no longer in place.
> 
> They could even be distributed via composer.
> 
> Common functionality between languages
> ===
> 
> If you have some complex logic that needs to be replicated in several
> languages for whatever reason; implementing it several times over
> would lead to uncertain bugs and technical debt increasing heavily. If
> you could share the same logic amongst them all using FFI, then this
> is no longer an issue.
> 
> Example
> ===
> 
> Take an example of a rust program that takes two numbers in and gives
> you the sum of them.
> 
> ```rust
> #[no_mangle]
> pub extern fn add(a: i32, b: i32) -> i32 {
>     a + b
> }
> 
> ```
> 
> with the Cargo.toml file containing:
> 
> ```
> [package]
> name = "math"
> version = "0.1.0"
> authors = ["Alex Bowers <bowersb...@gmail.com>"]
> 
> [dependencies]
> 
> [lib]
> name = "math"
> crate-type = ["dylib"]
> ```
> 
> `cargo build --release` will create `.so`, `.dylib`, or `.dll` files
> depending on your system.
> 
> These should be usable within PHP using the exposed functions.
> 
> ```php
> $math = ffi("/path/to/math.so");
> $result = $math->add(1, 5);
> 
> echo $result; // 6
> ```
> 
> With the implementation at its most basic level, calling the `add`
> method with incorrect parameters would likely cause a segfault.
> 
> A way around that could be that the methods are not immediately
> exposed, but have to be configured.
> 
> Something like:
> 
> ```php
> $math = ffi("/path/to/math.so");
> $math->add(1, 5); // Throws RuntimeException, method not configured
> 
> $math->configure('add', int $a, int $b);
> 
> $math->add(1, 5); // 6
> $math->add('a', 5); Fatal error: Uncaught TypeError: Argument 1 passed
> to add() must be of the type integer, string given
> ```
> 
> Prior art:
> ===
> https://pecl.php.net/package/ffi - Last release > 13
> yearshttps://github.com/mgdm/MFFI - Not stable, last commit > 1 year,
> no releases
> 

Trying to add answers later today, in the meantime, please have a look
at https://github.com/m6w6/ext-psi


-- 
Regards,
Mike

Attachment: signature.asc
Description: OpenPGP digital signature

Reply via email to