[HN Gopher] Build Your Own Redis with C/C++ ___________________________________________________________________ Build Your Own Redis with C/C++ Author : ibobev Score : 68 points Date : 2023-03-18 20:11 UTC (2 hours ago) (HTM) web link (build-your-own.org) (TXT) w3m dump (build-your-own.org) | TheChaplain wrote: | For giggles I was watching this thread waiting to see how long | until the word "rust" appeared. Didn't take long :^) | | Someone on reddit joked that Rust is becoming the new Crossfit | meme; | | "How can you tell when someone programs in Rust?" "Don't worry, | they'll tell you." | noncoml wrote: | You know what? If I was more confident in my coding abilities, | or some seriously good static analysis tool was available for C | or C++, I would program in one of those languages. | | I'm really not big fan of Rust, but I love that's it's always | looking over my shoulder for stupid mistakes. | throwaway5959 wrote: | It's OK. The truth is that even seasoned C/C++ developers | can't write safe C/C++ code. Otherwise exploits wouldn't | exist and static analysis wouldn't be necessary. | | What are you building with Rust? | noncoml wrote: | I've been programming professionally in C since 2005 and | still short myself in the foot all the time. | | I'm Rust I'm found various side projects. An all in one | PiHole like dns server, a distributed key value store based | on raft and an openwrt module. | | But nothing interesting or revolutionary enough to share. | | How about you? | 1024core wrote: | > The truth is that even seasoned C/C++ developers can't | write safe C/C++ code. | | Except DJB, of course.... ;-) | josephg wrote: | I love C and Rust - I've been using rust full time for the | past couple of years. | | But if I wanted to let loose these days and write some code | without worrying about the safety that rust has to offer, I'd | reach for Zig. It seems to solve a lot of C's problems while | being a much cleaner, well thought through language for low | level code. Im a fan! | mattrighetti wrote: | I would really love to take a look at this book but I'm not | really interested in C/C++, has anyone tried to follow along but | with another language? How did you find it? | [deleted] | jvans wrote: | I have done something similar with ruby, this is a great book: | https://workingwithruby.com/downloads/Working%20With%20TCP%2... | | I would recommend doing C at some point in your career, nothing | comes close in terms of forcing you to understand the hardware | you are using. | sitzkrieg wrote: | id recommend assembly language to really achieve this. the | further away you get from x86 the more enjoyable it seems to | be fore a human. skilldricks easy6502 is a really good start | Mike_12345 wrote: | That was true in the 70's but C doesn't require that you | understand much about modern hardware. | https://queue.acm.org/detail.cfm?id=3212479 | doodlesdev wrote: | It still is more low level than any other language | currently (that can be run on multiple architectures) which | I think is what the OP was saying. If you compile C without | compiler optimizations, it will generate code that is | exactly what you wrote. The argument the paper makes is | that the instructions available in modern processors and | the way we use them to optimize code (such as instruction | level parallelism) is a consequence of C being so important | despite being made for much older and much simpler | machines. Because if the generated binaries from any C | compiler without optimizations isn't low level then you | might as well say the same about x86 assembly, and then | you're basically out of options. | Mike_12345 wrote: | But it's not. It has become a high level language. The | idea that C is still a low level language is no longer | true. It is highly abstracted from modern hardware. | | Edit: I just saw your edited comment. Yeah the point is | you really don't need to know much about the hardware to | write C. It doesn't force you to understand what's | actually going on behind the scenes. | doodlesdev wrote: | Yeah sorry about the ninja edit. Very often I reply to a | comment without actually finishing and then edit it. I | thought Hacker News was delaying my comments by 1 minute | though according to my configs? Anyways, I agree that you | don't really need a deep understanding of the hardware | nowadays to write C, but my point is that it's still | useful to learn because you still need more understanding | of the hardware than you need to write something such as | Ruby. | | The point the OP was making is that it still forces you | to learn more about the hardware than other languages. | Arguably, it also forces you to learn more about the | software itself with things being much more explicit than | in a modern complex language such as Rust. I'm also just | not aware of _any_ language that actually maps well to | what the CPU is doing nowadays since they are such | complex pieces of silicon. | Mike_12345 wrote: | But does it really force you to learn more about the | hardware versus other languages? I am challenging that | assumption or belief. | | C has memory pointers, but those are pointers in a flat | memory space abstracted over the physical memory | hierarchy. | | So yes, you do need to understand that the hardware has | memory addresses and that pointers can reference memory | addresses. Aside from that I don't see much difference to | Java or Python in terms of requiring a deeper | understanding. Even Python has bitwise operators. | Gibbon1 wrote: | My take is both C and the hardware are targeting the same | abstract machine. It seems too that attempts shift things | one direction or another haven't been successful. | Itainium which tries to force the compiler to deal with | instruction scheduling and parallelism, failed. Things | like LISP machines also didn't do well. | | So thinking in terms of the abstract machine are valid | for now. The exceptions mostly have to do with caching | and understanding that processor can and does execute | short sequences of instructions in parallel. | _gabe_ wrote: | This whole article seems to be picking a lot of nits. I | didn't read it too deeply, so feel free to correct me if | I'm wrong, but the biggest complaints highlighted in the | article are: | | 1. Modern CPUs use instruction level parallelism (ILP) | | 2. Memory isn't linear (you have separate caches, L1, L2, | L3 and main memory) | | If you've ever debugged a C or C++ program in release, | you've quickly found out about ILP. The code still maps | relatively close to the hardware, it just won't run in the | sequential order you've provided it in. Many C and C++ | programmers know this and try to make the implicit | assumptions in their code explicit to allow the compiler to | reorder instructions more easily/reduce memory dependency | chains[0]. | | And I'm sure you've heard _several_ proponents over the | past few years (Mike Acton comes to mind) espousing data | oriented design. This is an entire code methodology | intended to help the CPU caches, and it shows an implicit | understanding that memory is not linear. Heck, most C /C++ | programmers realize that they're using VRAM all the time, | and the memory locations they get aren't necessarily backed | by physical memory until the OS sorts it out. This is | especially transparent if you've ever done any sort of | memmapping with files or played with virtual memory. | | Anyways, C doesn't necessarily map directly to the | hardware, but it's a heck of a lot easier to intuit what a | C program will end up doing on the CPU vs what a Python | program will do. And most C/C++ programmers realize this | fact, and actively write code to utilize the fact that C | does not map directly to hardware. | | [0]: https://johnnysswlab.com/instruction-level- | parallelism-in-pr... | josephg wrote: | Yeah. Also, learning C is still probably the best way to | learn how raw pointers work. And pointers underpin | everything - even if you spend your life in Python or | Java. | | When I was teaching programming, it was always a rite of | passage for my students to implement a linked list in C. | Once it clicked for them, the world of programming opened | up. | | C is also still the universal glue language for FFI. | Wanna call Swift from Rust? You can always reach for C. | iudqnolq wrote: | if you're interested in Rust this might help. It's intended to | be an introduction to the tokio async runtime for Rust by | having you implement a minimal redis. | | https://tokio.rs/tokio/tutorial/setup | [deleted] | tylerhannan wrote: | I sort of want, one day, to read the same article targeted at | Delphi or Turbo Pascal. lol. | FpUser wrote: | All styles of programming for implementing Redis are supported | in Delphi. It'll work just fine. As for Turbo Pascal - replace | it with FreePascal/Lazarus which together comprise opensource | version of Delphi. | andsoitis wrote: | > lol | | What's the joke? I don't get it. | sbmthakur wrote: | Codecrafters has a similar exercise: | | https://app.codecrafters.io/courses/redis?track=c | intelVISA wrote: | No C++? Hard pass from me. | JTyQZSnP3cQGa8B wrote: | It seems to be a nice project but they should remove "C++" from | the name since both languages have nothing in common anymore, | especially the use of smart pointers and Boost.Asio compared to | "malloc and socket" that is used in the book. | hewlett wrote: | You can still use raw pointers and sockets in C++, which the | code examples provided in the book do | JTyQZSnP3cQGa8B wrote: | I agree but no one calls this C++ anymore especially since | C++14/17, and I fail to see why you would use a C++ compiler | for such a code. | [deleted] | gpderetta wrote: | Well, if you are implementing something like ASIO, and of | course c++ is a good language for that, you'll be dealing | with sockets directly. | Arelius wrote: | I'm starting to understand there are clearly 2 different | worlds, if you live in one where C++ assumes the use of smart | pointers, or especially Boost. | | In the C++ world I live/work Boost is avoided like the plague. | I always wondered how Boost continues to exist, but it seems in | certain communities it's held up as a standard to strive for. | heywhatupboys wrote: | > C/C++ | | there is _NO SUCH THING_ | user5534762135 wrote: | "Build your own Redis with Rust/Fortran" | | If the author actually can't understand the difference between C | and C++, there's a pretty low chance of any good code being in | the book. If they do, they should keep an eye on the editor next | time they go into empty marketing mode for the title. | noncoml wrote: | I kid you not I once had a recruiter asking someone with | experience in C/C+/C++ | | Not a typo for C#. He really wanted someone with experience in | C+ | heywhatupboys wrote: | benefit of the doubt: C with classes? | noncoml wrote: | Maybe. Who knows what his client asked. To me he confirmed | they were looking for C+... | josephg wrote: | I've lost count of the number of recruiters who shorten | Javascript to Java. Those are not the same thing! Arghhhhh | matttb wrote: | > The code is written as direct and straightforwardly as the | author could. It's mostly plain C with minimal C++ features. | | Sounds fair to me | sitzkrieg wrote: | this is also one of my biggest pet peeves too | mzimbres wrote: | I haven't created Redis itself but a Redis client library. It all | started with a chat server I wanted to write on top of | Boost.Beast (and by consequence Boost.Asio) and at the time none | of the clients available would fill my needs and wishes | | - Be asynchronous and based on Boost.Asio. | | - Perform automatic command pipelining [1]. All C++ libraries I | looked at the time would open new connections for that, which | results in unacceptable performance losses. | | - Parse Redis responses directly in their final data structures | avoiding extra copies. This is useful for example to store json | strings in Redis and read them back efficiently. | | With time I built more performance features | | - Full duplex communication. | | - Support for RESP3 and server pushes on the same connection that | is being used for request/response. | | - Event demultiplexing: It can server thousands of requests (e.g. | websocket sessions) on a single connection to Redis with back | pressure. This is important to keep the number of connections to | Redis low and avoid latency introduced by countermeasures like | [3]. | | This client was proposed and accepted in Boost (but not yet | integrated), interested readers can find links to the review here | [2]. | | [1] https://redis.io/docs/manual/pipelining/ | | [2] https://github.com/boostorg/redis/issues/53 | | [3] https://github.com/twitter/twemproxy ___________________________________________________________________ (page generated 2023-03-18 23:00 UTC)