jumprope-rs
Odin
Our great sponsors
jumprope-rs | Odin | |
---|---|---|
8 | 84 | |
129 | 5,641 | |
- | 5.7% | |
4.0 | 9.9 | |
11 months ago | 4 days ago | |
Rust | Odin | |
GNU General Public License v3.0 or later | BSD 3-clause "New" or "Revised" License |
Stars - the number of stars that a project has on GitHub. Growth - month over month growth in stars.
Activity is a relative number indicating how actively a project is being developed. Recent commits have higher weight than older ones.
For example, an activity of 9.0 indicates that a project is amongst the top 10% of the most actively developed projects that we are tracking.
jumprope-rs
-
Text Showdown: Gap Buffers vs. Ropes
Thanks for all the work in bootstrapping this part of the ecosystem! I opened an issue[1] on the memory issue for jumprope. It seems to really come down to the large size of skiplist nodes relative to the text.
I did some testing with JumpRopeBuf, but ultimately did not include it because I was comparing things from an "interactive editor" perspective where edits are applied immediately instead of a collaborative/CRDT use case where edits are async. But it did perform very well as you said! I feel like JumpRopeBuf feels similar to a piece table, where edits are stored separately and then joined reading.
[1] https://github.com/josephg/jumprope-rs/issues/5
-
How to Survive Your Project's First 100k Lines
Every piece of a large program should be tested like this. And if you can, test your whole program like this too. (Doable for most libraries, databases, compilers, etc. This is much harder for graphics engines or UI code.)
I've been doing this for years and I can't remember a single time I set something like this up and didn't find bugs. I'm constantly humbled by how effective fuzzy bois are.
This sounds complex, but code like this will usually be much smaller and easier to maintain than a thorough unit testing suite.
Here's an example from a rope (complex string) library I maintain. The library lets you insert or delete characters in a string at arbitrary locations. The randomizer loop is here[1]. I make Rope and a String, then in a loop make random changes and then call check() to make sure the contents match. And I check and all the expected internal invariants in the rope data structure hold:
[1] https://github.com/josephg/jumprope-rs/blob/ae2a3f3c2bc7fc1f...
When I first ran this test, it found a handful of bugs in my code. I also ran this same code on a few rust rope libraries in cargo, and about half of them fail this test.
-
Announcing crop, the fastest UTF-8 text rope for Rust
Jumprope author here. Thanks for the quick test! I just updated the benchmarks in jumprope/rope_benches to include Crop, and it looks to me like jumprope is about 2x faster than crop:
-
Google's OSS-Fuzz expands fuzz-reward program to $30000
I’d go further and say that writing most software without fuzz testing is insane. Fuzz testing is one of those things they should teach in school. They’re a super useful technique - up there with TDD and it’s a tragedy they aren’t more wildly used.
Fuzzers are so good because they find so many bugs relative to programmer effort (lines of code). They’re some of the most efficient testing you can do. If I had to choose between a full test suite and a fuzzer, I’d choose the fuzzer.
I use fuzzers whenever I have a self contained “machine” in my code which should have well defined behaviour. For example, a b-tree. I write little custom fuzzers each time. The fuzzing code randomly mutates the data structure and keeps a list of the expected btree content. Then periodically I verify that the list and the btree agree on what should be contained inside the list. In the project I’m working on at the moment, I have about 6 different fuzzers sprinkled throughout my testing code. (Btree fuzzer, rope fuzzer, file serialisation fuzzer, a few crdt fuzzers, and so on).
Writing fuzzers is quite devastating for the ego. Usually the first time I point a fuzzer at my code, even when my code has a lot of tests, the fuzzer throws an assertion failure instantly. “Iteration 2 … the state doesn’t match what was expected”.
Getting a fuzzer running all night without finding any bugs is a balm for the soul.
The code looks like this, if anyone is curious. Here’s a fuzzer for a rope (fancy string) implementation: https://github.com/josephg/jumprope-rs/blob/master/tests/tes...
-
The case against an alternative to C
Yep. A few years ago I implemented a skip list based rope library in C[1], and after learning rust I eventually ported it over[2].
The rust implementation was much less code than the C version. It generated a bigger assembly but it ran 20% faster or so. (I don't know why it ran faster than the C version - this was before the noalias analysis was turned on in the compiler).
Its now about 3x faster than C, thanks to some use of clever layered data structures. I could implement those optimizations in C, but I find rust easier to work with.
C has advantages, but performance is a bad reason to choose C over rust. In my experience, the runtime bounds checks it adds are remarkably cheap from a performance perspective. And its more than offset by the extra optimizations the rust compiler can do thanks to the extra knowledge the compiler has about your program. If my experience is anything to go by, naively porting C programs to rust would result in faster code a lot of the time.
And I find it easier to optimize rust code compared to C code, thanks to generics and the (excellent) crates ecosystem. If I was optimizing for runtime speed, I'd pick rust over C every time.
[1] https://github.com/josephg/librope
[2] https://github.com/josephg/jumprope-rs
-
Linked lists and Rust
Linked lists are also the basis for skip lists - which are awesome. One of the only data structures I know of which needs a random number generator to work correctly. I have a rope implementation that I tidied up over the last few days which uses a skip list. Its several times faster than the next fastest library I know of (ropey). They're both O(log n), but for some reason jumprope (with skip lists) still ended up several times faster than ropey's b-trees.
Odin
-
Zig, Rust, and Other Languages
There's also Odin[0] too. I tried using them all and Odin was pretty nice. Nim is also good too but a lot more features.
But - I concluded that language matters a lot less compared to APIs. Yes, the language should have enough good features to let the programmers express themselves, but overall well designed APIs matter a lot more than language. For example -tossing most of the C stdlib and following a consistent coding style (similar to one described here -[1]), with using Arenas for memory allocation, I can be just as productive in C.
[0] - https://odin-lang.org
-
Odin Programming Language
I highly recommend looking at:
* The Overview: <https://odin-lang.org/docs/overview/>
* examples/demo: <https://github.com/odin-lang/Odin/blob/master/examples/demo/...>
As for the first example: a basic lexing example is probably boring, but it does show some basic ideas of what the language is about. If people want to write better examples or just reorder the current ones, please feel free to make an issue or PR on the website's GitHub page: <https://github.com/odin-lang/odin-lang.org>.
-
babel tree
I use Odin primarily, it’s C-level but pascal/Go syntax and inspiration https://odin-lang.org/
- Botlib: Telegram Bots in C by Antirez
- "Odin is a general-purpose programming language with distinct typing built for high performance, modern systems and data-oriented programming."
- Austral Programming Language
- Small Joys with Odin
-
Can't decide what engine/library/framework I want to master
Website: https://odin-lang.org/
-
Download Odin and get started today! Includes binding to popular video game libraries
Get it from the website: https://odin-lang.org/ -- Odin includes bindings to popular gamedev libraries & APIs such as Raylib, SDL, DirectX, OpenGL and Vulkan.
- Check this odin file out for a demo of many of the language's features. It comes with the compiler inside the examples folder. I refer to it all the time when I need to figure out how to do something.
What are some alternatives?
crop - 🌾 A pretty fast text rope
zig - General-purpose programming language and toolchain for maintaining robust, optimal, and reusable software.
librope - UTF-8 rope library for C
v - Simple, fast, safe, compiled language for developing maintainable software. Compiles itself in <1s with zero library dependencies. Supports automatic C => V translation. https://vlang.io
EmeraldC - The Ultimate C Preprocessor
Nim - Nim is a statically typed compiled systems programming language. It combines successful concepts from mature languages like Python, Ada and Modula. Its design focuses on efficiency, expressiveness, and elegance (in that order of priority).
WebKit - Home of the WebKit project, the browser engine used by Safari, Mail, App Store and many other applications on macOS, iOS and Linux.
rust - Empowering everyone to build reliable and efficient software.
buffet - All-inclusive Buffer for C
carbon-lang - Carbon Language's main repository: documents, design, implementation, and related tools. (NOTE: Carbon Language is experimental; see README)
fast-check - Property based testing framework for JavaScript (like QuickCheck) written in TypeScript
Beef - Beef Programming Language