Chasm Meetings
May 7th 2022 8AM (UTC)
Agenda
What happened since the last meeting?
What's the current status?
- Chasm exists and is functional
- Missing Issue: Can't add classes
- Can't slice into root node because of LazyClassNode ugliness
- Suggestion: Abstract lazy nodes (maybe reuse for methods) and clean up CoW
- Issue: Local Variable Representation
- Local variable indices exist, but are not useful for Chasm
- There are multiple ways to represent locals
- Parameters are part of locals, but: Parameters are also part of the descriptor
- We have to ensure no redundant data in the tree
- What about signatures?
- Ignored by JVM, used for decompilation and reflection
- Ideally keep them valid
- But they contain redundant information
- Missing issue: Records?
- Chasm-Lang exsits and is functional
- Issue: Intrinsics
- Issue: Specification
- Issue: Better Errors
- Chasm-Gradle-Plugin exists and is functional (kinda)
- Simple implementation, but it works
- IDE integration is meh
- Attached as files rather than maven dependencies (maybe ok?)
- Attached once per source set (e.g. once for main and once for test)
- Doesn't run on sync (maybe ok?)
- Slow!
- Mostly because of deflate and inflate
- Consider "caching" of unzipped input files
- Consider writing only files changed since last transformation
- Speed is not super important in prod (because caching)
- Speed is important in dev (because no caching)
- Chasm-Access-Widener exists locally and is partly functional
- Doesn't have descriptor matching because of the above issues
- Quilt loader integration is missing
- Waiting on loader merging upstream
- Might require significant changes to KnotClassLoader
- Chasm-Mixin is missing
What needs to be done next?
- Focus on Chasm class issue
- Focus on Lang Specification
- Focus on Loader
- Focus on Accesswidener
- After that:
- Development branch
- Repository versioning
Additional Notes
- Meetings every 2 weeks (in the weeks without dev meeting)
- Somewhat fixed time: Monday 5pm UTC before dev-meeting
- This is just a test
May 16th 2022 5PM (UTC)
Agenda
What happened since the last meeting?
Nothing
What's the current status?
Same as last meeting
What needs to be done next?
Same as last meeting
Remapping
Mixin
- Mixin is based of Strings
- Mixin annotations don't get remapped.
- Refmap is gnererated containing mappings from dev names to runtime names
- Annotations are remapped at runtime
Chasm
- We need to remap transformers
- Preferably at compile time, but needs to be supported at runtime
- Different ways of doing it:
- Regex replace in the actual transformer
- Make "special strings" that get remapped
- Pro: Doesn't require much work work in chasm
- Con: Only works for fully qualified names
- Make a special node in the chasm structure
- E.g. "remap" object in the root node
- Pro: No extra logic in chasm
- Con: Remapper needs to understand chasm file format
- Intrinsic function for remapping
- E.g.
remap("net/minecraft/World")
- Con: Remapping only at runtime
- Con: Frontend needs to be mapping aware
- Pro: No extra work in chasm required (intrinsics provided by runtime)
- Pro: Remapper doesn't need to understand chasm file format
- Extract special node to a separate File
- E.g. "remap" object in separate file
- Pro: Remapper only needs to remap json
- Con: Special logic to import external files BUT wanted anyway (for config or similar)
- Put references into special class containting references
- E.g.
transformerId.Remap
- Pro: Remapper needs no extra work
- Pro: No extra work in chasm
- Con: Cursed af
- Con: Bigger files
- Solution number 4 seems preferred
The transformer (doesn't need to be remapped):
Refmap in dev, generated by frontend:
Refmap in mod, remapped by build tool:
May 30th 2022 5PM (UTC)
Agenda
- Additional files/includes
- Versioning
- Blanketcon
What happened since the last meeting?
What's the current status?
- Chasm exists and is functional
- Issue: Local Variable Representation
- Missing issue: Records?
- Chasm-Lang exsits and is functional
- Issue: Intrinsics
- Issue: Specification
- Issue: Better Errors
- Issue: Treat
classes
as a fucntion input
- Chasm-Gradle-Plugin exists and is functional (kinda)
- Simple implementation, but it works
- IDE integration is meh
- Slow!
- Doesn't work with loom
- Chasm-Access-Widener exists locally and is partly functional
- Doesn't have descriptor matching because of the above issues
- Quilt loader integration is missing
Waiting on loader merging upstream
- Loader is diverging from upstream
- Might require significant changes to KnotClassLoader
- Probably replace the entirety of Knot
- Wait for loader-plugins since that also messes with Knot
- Chasm-Mixin is missing
Additional Files/Includes
We want to include additional files in transformers, e.g.
Problem: In order to allow caching, we need to be aware of all used input files.
Solution:
- Keep track of files used during last execution, rerun if any changed
- Requires some additional logic in chasm to emit file list
- Pessimistically assume all files in a certain path to be required
- No extra logic in chasm, but might hash unnecessary files
- Disadvantage: "magic direcory" makes it hard to differnetiate between transformers and libs
We choose option one.
Versioning
Currently: Chasm uses 0.0.1-SNAPSHOT for everything.
Once chasm becomes "somewhat stable", we need better versions.
Suggest a git layout for the "far" future:
- Main branch
- Always the lastest release version (e.g. 1.2.3)
- Bump major opr minor version when merging development branch
- Development branch
- Always has the next minor release snapshot version (e.g. 1.3.0-SNAPSHOT)
- Probably just released on the snapshot maven
- Aways based on the main branch
- Rebase when a patch gets applied
- All development happens in PRs
- Feature PRs
- Target development branch
- Merging doesn't bump the version
- Patch PRs
- Target main branch
- Bump patch version
Blanketcon
Blanketcon is happening and we have a keynote June 11th, 18:00 UTC, directly after quilt dev meeting.
We need to prepare a presentation!
June 20th 2022 5PM (UTC)
Cancelled
June 17th 2022 5PM (UTC)
Agenda
- Module Restructure
- JavaCC21
- Lang CodeGen
- Lang API
What happened since the last meeting?
- Blanketcon happened!
- Some issues have been opened
Current status
Same as last time, except one PR for restructuring:
https://github.com/QuiltMC/chasm/pull/53
Restructure Modules
Chasm and Chasm-Lang interop will be removed from Chasm-Lang to make the module dependency free.
Two options:
- Move the code into the chasm module
- Move it into a new module
For now, we choose the first option.
Switch to JavaCC21
Antlr problems:
- Needs dependency that is 3 times the size of chasm
- Shadowing is awkward with licensing
Switching to JavaCC:
Pros:
- Chasm-Lang is dependency free
- Chasm-Lang is much smaller (including dependencies)
- No licensing concerns whatsoever
Cons:
- Requires a somewhat sizable rewrite
- JavaCC is ooooold and outdated -> JavaCC21 instead
- JavaCC21 has no versioning
- JavaCC21 has no docs, but it's mostly the same as JavaCC
Conclusion: Leave issue open until it bothers me.
Lang Code Generation
People have to generate Chasm-Lang.
For both frontends (Mixin, AW) and the remapper.
It would be nice to have a library for this.
Basically:
- Construct/Modify an
Expression
- Write an
Expression
to file
- Or similar?
Lang API
Currently there's no api/internal split.
Additionally, the public API isn't "nice".
Needs work.
July 18th 2022 5PM (UTC)
Agenda
- Go over PR#54
- Discuss further steps
What happened since the last meeting?
PR 54
- Switch to JavaCC21
- AST is currently free of implementation detail
- Bad OOP, likely to change it back
- Currying is broken
- Probably best fixed with closures
- Consider replacing the Chasm specific tree with the new Chasm-Lang AST
- Saves on conversions
- Reduces code base size
- Possibly a lot of work
August 15th 2022 5pm 6:30pm
Present:
Agenda
- Review current stauts
- Contribution Guideline
- Chasm Roadmap
- Innclude directives
- Json parity
- Parser Talk
What happened since the last meeting?
PRs:
- #54 Lang rework (by CheaterCodes)
- #55 Chasm Renderer (by RTTV)
- #57 Map & Flatten (by will)
- #58 Fix Annotations (by FoundationGames)
- #64 Add Metadata (by CheaterCodes)
- #65 Fix Slice Offset (by CheaterCodes)
- #66 Fix Trailing Commas (by CheaterCodes)
- #67 Source Spans (by CheaterCodes)
Lots of testing by FoundationGames:
- Add chasm to nil-loader (kind of)
- Start on a mixin fork (Chasmix)
Currently in the works
PRs:
- #61 Fix operator precedence (and more) (by Kropp)
- #60 Fix error in writing annotations (by Kropp)
- #59 Map operators (by FoundationGames
Contribution Guideline #50
- CONTRIBUTING.MD
- General stuff, PR procedure etc.
- Every bugfix PR should included tests
Branch protection is enabled:
- Contribution only via PR
- Requires one Review (from the team)
- Must pass checks (build + tests + checkstyle, aka ./gradlew build)
- Must be up to date (via merge)
Chasm Roadmap
TLDR: I want to write stuff down without creating issues.
GitHub Projects?
- Would allow for tracking milestones
- Allows short entries without issues
- Also tracks issues
- Extra effort for no gain?
Include directives
We want the option to include other Chassembly files in a Chassembly file.
E.g.
Problem: Who's managing the filesystem?
- Easy solution: Don't provide this functionality
- Execution environment can provide an intrinsic (e.g. quilt-loader)
- Problem: Not portable
- Problem: Makes Chasm harder to use
- Better Solution: Require an implementation
- Execution environment must provide an intrinsic (e.g. quilt-loader)
- Problem: Makes Chasm harder to use
- Big change: Make Chasm filesystem aware
- Move all jar unpacking logic etc. into chasm
- Problem: More work for Chasm, possibly less flexibility
- Problem: Even less portable?
- Best Solution?: Require an implementation, provide a default in ChasmUtils
- Chasm provides an optional default implementation, but allows replacing it.
- Problem: Possibly complex/out of scope
Json Parity
Include is intended for Chassembly files.
Main usecase: Reference (remapped) class names in separate file.
Question: Should those files be Json? Should Chassembly be a superset of Json?
Reasoning:
Remappers might want to use a Json library and not Chassembly.
Specifically, "new quilt-mappings" might be Json based, so Json library is already bundled.
What's needed to read Json?
- Strings as keys
- Number formatting?
- Parsing details? (e.g. String escapes)
- Do we want to test this? (test suite)
- How much is missing for json5?
How much is missing for js?
Parser Talk
Previously: Antlr4
- Adaptive LL(*)
- Visitor Based
- Priblem: Big runtime dependency (>300kB)
Currently: JavaCC21
- LL(k)
- Embedded Java Code based
- Problem: Lots of code repetition
Alternatively: JavaCC21 with tree building #63
- LL(k)
- Autogenerate Parse Tree
- Problem: Generated AST is almost useless
- Nodes are mostly just empty marker classes
- Functionality needs to be injected
- 50kB of empty classes
- Not really suitable as API
Ideal: Parser generator XX
- LL or LALR or whatever, powerful enough for Chassembly
- Visitor Based (No parse tree required)
- No runtime dependency, small footprint
- Problem: Don't know any
Good news: Parsing is not an implementation detail
- Public AST should remain stable
- Changing the parser shouldn't require a full rewrite
September 14th 2022 5:30pm
Present:
- Kropp
- Earthcomputer
- CheaterCodes
Agenda
- Review current stauts
- Include Directives
- Release Roadmap
- Labels
- Chassembly Optimization
- Chassembly IntelliJ Plugin
- ASM Chasm Frontend?
What happened since the last meeting?
- Multiple bugfix PRs #70, #71, #72, #74
- Include Intrinsics #73
Include Intrinsics
- New intrinsics to include files:
- Implementer must provide a
readFile
function:
- Must be pure
- Path format (currently) implementation defined
- Must be OS independent
- Possibly also allows configs e.g.
include("config:modid/config/name")
Release Roadmap
Github project now available under https://github.com/orgs/QuiltMC/projects/12/views/1
- Every team member can (and should!) add items to the list
- Every team member can (and should!) convert drafts to issues
- Please use liberally!
Labels
Problem: Copying instructions from one method to another poroduces invalid bytecode.
How should this be handled?
- Transformers SHOULD prefix labels they produce with their ID
- Method labels are not globally unique
- Method labels could be unique, but this doesn't actually solve problems
- Two transformers copying from the same method still need to prefix
- Prefixing isn't hard
- Not enforced in code?
- Not sure if we could
- General assumption:
- Compiler developers know what they're doing
- So that users don't have to
- Needs documentation!!
- Transformer ID is provided by execution environment
- We need to pass the ID to the transformer (just like
classes
)
Optimization
Why is it needed?
- Recursion is essential to transformers
- E.g. Looping through a list
- Intrinsics only help for (common) special cases
- Default performance is suboptimal
Possible optimization:
- Common subexpression extraction and reordering
- Must maintain original behaviour (especially errors)
- Tail recursion
- Reorder for more tail recursion
- Perform function substitution late to keep stack space small
- Mutability
- Lists are immutable
- Modifying a list requires copying it
- If the original isn't used afterwards, the list can be mutated instead
- Similar to Rust move vs. copy
Chassembly IntelliJ Plugin
Earthcomputer has been working on an IntelliJ plugin for Chassembly language support.
- "Not meant to help writing Chassembly by hand!!1!11!" (exceptions apply)
- Make frontend development easier
- Mostly for writing libraries and for manual experimentation
- Not yet published
ASM Chasm Frontend
Earthcomputer has been working on a Chassembly JVM bytecode interpreter
- Support legacy ASM trasformers
- Partially suppoirt mixin plugins?
- Limitations apply
- Still pure (e.g. no internet access)
Kotlin Frontend?
Kotlin team has created a channel for discussing frontend ideas.
No specifics yet.
January 11th 2023 20:00pm UTC
Present:
- Kropp
- Pyrofab
- Will
- Earthcomputer
- CheaterCodes
Agenda
- Chasm pre-release
- Transformer Format
- Lock Lifetimes
- Transformer Sorting
What happened since the last meeting?
- Lots of Chassembly things (syntax, intrinsics)
- "Virtual" Transformers
Chasm pre-release