rfc:vector
Differences
This shows you the differences between two versions of the page.
Both sides previous revisionPrevious revisionNext revision | Previous revisionLast revisionBoth sides next revision | ||
rfc:vector [2021/09/17 00:18] – tandre | rfc:vector [2021/09/24 00:49] – tandre | ||
---|---|---|---|
Line 3: | Line 3: | ||
* Date: 2021-09-16 | * Date: 2021-09-16 | ||
* Author: Tyson Andre, tandre@php.net | * Author: Tyson Andre, tandre@php.net | ||
- | * Status: | + | * Status: |
* Implementation: | * Implementation: | ||
* First Published at: http:// | * First Published at: http:// | ||
Line 15: | Line 15: | ||
It would be useful to have an efficient variable-length container in the standard library for the following reasons: | It would be useful to have an efficient variable-length container in the standard library for the following reasons: | ||
- | - To guarantee to application authors that the values really are a list without gaps, | + | |
- | | + | - To provide a better alternative to '' |
- | - To provide a better alternative to '' | + | - To give users the option of stronger runtime guarantees that property, parameter, or return values really contain a list of values without gaps, that array modifications don't introduce gaps or invalid keys, that values in the collection aren't references, etc. |
===== Proposal ===== | ===== Proposal ===== | ||
Line 90: | Line 91: | ||
- Short names are more convenient to remember/ | - Short names are more convenient to remember/ | ||
- | - Possible future additions such as a Deque/Queue based on a efficient C array representation rather than a linked list wouold | + | - Possible future additions such as a Deque/Queue based on a efficient C array representation rather than a linked list would conflict with existing Spl names such as '' |
+ | - There is already an addition to the spl without a prefix - '' | ||
==== Accepting an iterable ==== | ==== Accepting an iterable ==== | ||
Line 307: | Line 309: | ||
===== Future Scope ===== | ===== Future Scope ===== | ||
- | In the future, additional methods may be added to '' | + | If '' |
+ | |||
+ | Additional data structures from https:// | ||
===== Proposed Voting Choices ===== | ===== Proposed Voting Choices ===== | ||
Line 316: | Line 320: | ||
- https:// | - https:// | ||
+ | - https:// | ||
+ | - https:// | ||
===== Rejected Features ===== | ===== Rejected Features ===== | ||
+ | |||
+ | ==== Why not use php-ds instead? ==== | ||
+ | |||
+ | |||
+ | - No matter how useful or popular a PECL is, datastructures available in PHP's core will have much, much wider adoption in applications and libraries that are available in PECLs, allowing those applications and libraries to write faster and/or more memory efficient code. | ||
+ | - End users can make much stronger assumptions about the backwards compatibility and long-term availability of data structures that are included in core. | ||
+ | - The php-ds maintainers do not plan to merge the extension into php-src (see quote for full context) | ||
+ | - Opcache may be able to make stronger optimizations of internal classes found in php-src than any third party PECL. (e.g. because '' | ||
+ | |||
+ | === Perceived issues and uncertainties about php-ds distribution plans === | ||
+ | |||
+ | This has been asked about multiple times in threads on unrelated proposals (https:// | ||
+ | but the maintainer of php-ds had a long term goal of developing the separately from php's release cycle (and was still focusing on the PECL when I'd asked on the GitHub issue in the link in September 2020). | ||
+ | |||
+ | To quote the maintainer on the GitHub [[https:// | ||
+ | |||
+ | < | ||
+ | **//My long-term intention has been to not merge this extension into php-src.// I would like to see it become available as a default extension at the distribution level. Unfortunately I have no influence or understanding of that process.** Having an independent release and development cycle is a good thing, in my opinion. | ||
+ | |||
+ | If those plans change, **I would like to hold off until a 2.0 release** - I've learnt a lot over the last 4 years and would like to revisit some of the design decisions I made then, such as a significant reduction of the interfaces or perhaps more interfaces with greater specificity. Functions like '' | ||
+ | |||
+ | I have been working on a research project to design persistent data structures for immutability, | ||
+ | </ | ||
+ | |||
+ | < | ||
+ | > > Do you mean OS distribution level (Windows, Ubuntu, CentOS, HomeBrew for mac, etc.?) | ||
+ | |||
+ | > He meant distribution with PHP core (on all platforms where PHP is available) | ||
+ | |||
+ | Whichever is more viable - simply not merged into core, but distributed and enabled by default alongside it.0 | ||
+ | </ | ||
+ | |||
+ | There have been no proposals from the maintainer themselves so far to add php-ds to core or distribute it alongside core in any form. | ||
+ | That was just what the maintainer mentioned as a long term plan. | ||
+ | |||
+ | The model of distributing an extension separately from core has never been done before, and even if approved would raise multiple concerns: | ||
+ | |||
+ | * I personally doubt having it developed separately from php's release cycle would be accepted by voters (e.g. if unpopular decisions couldn' | ||
+ | * This may limit what features could be added by the community: For example, introducing the '' | ||
+ | * I'm not certain how backwards compatibility would be handled in that model, e.g. if the maintainers of ext-ds wanted to drop support for a method after it was released. | ||
+ | * This may cause delays in publishing php releases, e.g. if the maintainers were unable to quickly review patches for crashes, incompatibilities or compile errors introduced in new php versions, etc. | ||
+ | * and other concerns (e.g. API debates such as https:// | ||
+ | |||
+ | With php-ds itself getting merged anytime soon (if the maintainers continue to plan to distribute php-ds that way) seeming unlikely to me, I decided to start independently working on efficient data structure implementations. | ||
+ | I don't see dragging it in (against the maintainer' | ||
+ | But having efficient datastructures in PHP's core is still useful. | ||
+ | |||
+ | The timeline for php-ds 2.0 is also something I am uncertain about. | ||
+ | |||
+ | < | ||
+ | |||
+ | * //EDIT: I misread the maintainer' | ||
+ | |||
+ | While PECL development outside of php has its benefits for development and ability to make new features available in older php releases, | ||
+ | it's less likely that application and | ||
+ | library authors will start making use of those data structures because many users won't have any given PECL already installed. | ||
+ | (though php-ds also publishes a polyfill, it would not have the cpu and memory savings, and add its own overhead) | ||
+ | |||
+ | Additionally, | ||
+ | backwards compatibility and long-term availability of functionality that is merged into PHP's core. | ||
+ | |||
+ | So the choice of feature set, some names, signatures, and internal implementation details are different, because this is reimplementing a common datastructure found in different forms in many languages. | ||
+ | It's definitely a mature project, but I personally feel like reimplementing this (without referring to the php-ds source code and without copying the entire api as-is) is the best choice to add efficient data structures to core while respecting the maintainer' | ||
+ | |||
+ | As a result, I've been working on implementing data structures such as '' | ||
+ | |||
+ | === Minor differences in API design goals === | ||
+ | |||
+ | Traditionally, | ||
+ | |||
+ | My hopes for ease of use, readability, | ||
+ | |||
+ | < | ||
+ | < | ||
+ | |||
+ | Again, I understand the rationale behind this decision, like reducing duplication and keeping only the core functionality in DS. However, sometimes you have to take into consideration ease of use vs purity of the code. | ||
+ | |||
+ | Ease of use / DX / readability: | ||
+ | |||
+ | '' | ||
+ | |||
+ | Rather than: | ||
+ | |||
+ | '' | ||
+ | |||
+ | Speed: as you said, internal iteration is faster. And speed is one of the selling points of DS vs arrays. | ||
+ | |||
+ | Static analysis: I love the fact that '' | ||
+ | |||
+ | Thank you for your work on DS anyway, I already use the extension in my closed-source project, in particular Map. I would love to use data structures in my open-source projects, one day! 🤞 | ||
+ | </ | ||
+ | |||
+ | Additionally, | ||
+ | |||
==== Adding a native type instead (is_vec) ==== | ==== Adding a native type instead (is_vec) ==== | ||
Line 341: | Line 441: | ||
That would also require a lot more familiarity than I have with opcache and the JIT assembly compiler, and I expect it would be more controversial due to not working with existing code. | That would also require a lot more familiarity than I have with opcache and the JIT assembly compiler, and I expect it would be more controversial due to not working with existing code. | ||
- | For a language such as Hack where feature development is done by one company(Facebook), | + | For a language such as Hack where feature development is done by one company(Facebook), |
Additionally, | Additionally, | ||
Also, even if a type '' | Also, even if a type '' | ||
rfc/vector.txt · Last modified: 2021/09/26 16:46 by tandre