[HN Gopher] A Universal I/O Abstraction for C++ (2020)
       ___________________________________________________________________
        
       A Universal I/O Abstraction for C++ (2020)
        
       Author : vg_head
       Score  : 67 points
       Date   : 2021-04-17 09:34 UTC (1 days ago)
        
 (HTM) web link (cor3ntin.github.io)
 (TXT) w3m dump (cor3ntin.github.io)
        
       | jcelerier wrote:
       | In the end the overall design looks like a semi-reified
       | asynchronous dataflow programming API based on coroutines.
       | 
       | I think that it would be useful to consider the existing (very
       | very very large) body of research on dataflow PL and APIs; e.g.
       | check this paper from 1982 which talks about dataflow,
       | coroutines, for handling file operations:
       | 
       | - https://scholarship.claremont.edu/cgi/viewcontent.cgi?articl...
       | 
       | More recent papers in the field:
       | 
       | - https://hal.archives-ouvertes.fr/hal-02865894/document
       | 
       | - https://library.oapen.org/bitstream/handle/20.500.12657/3772...
       | 
       | and older general overviews of the field:
       | 
       | - http://www.cs.ucf.edu/~dcm/Teaching/COT4810-Spring2011/Liter...
       | 
       | - http://210.47.10.86:8032/200009-3/65492.pdf#page=141
       | 
       | My main concern with this design, even if the code looks quite
       | neat, is that the actual dataflow graph is not reified, but
       | exists "invisibly" as part of the program source through the way
       | co_await calls are sequenced.
       | 
       | This means that it is not possible to do as an user, a static
       | analysis and scheduling of the tasks : it relies on the compiler
       | to perform this. But, this problem is in my experience quite
       | often very use-case-specific and ridden with informations
       | compilers do not possess. Not having the way tasks are
       | interdependent reified in an actual user-manipulable "graph"
       | object means that users won't have the possibility, to, say,
       | perform a topological sort or flow propagation on their async
       | graph in order to extract information on it that could be
       | necessary to perform a domain-specific optimization of said graph
       | (for instance if we know that a set of tasks are dependent on
       | each other in ways that aren't visible on the source code, but
       | are known to the programmers, it would make sense to schedule
       | them on a queue in their own thread).
        
         | gpderetta wrote:
         | Hum, in principle you can do arbitrary compile time
         | transformations to the datagraph before submitting it via
         | metaprogramming.
         | 
         | If you really want you could even convert the graph (fully or
         | partially) to a runtime representation.
         | 
         | The core of the proposals are not about specific classes or
         | functions other than some default algorithm implementations.
         | 
         | Instead they are mostly about defining concepts and protocols
         | so that independent async domains can coexist and iteroperate
         | in the same application.
         | 
         | This is similar to the STL where the most important part are
         | the various iterator concepts and the algorithm interfaces, not
         | the actual algo implementations and the containers.
        
         | motakraxxer wrote:
         | Could you please show an example for it?
        
           | jcelerier wrote:
           | In c++ some examples would be RaftLib or cpp-taskflow
        
       | bregma wrote:
       | I would hesitate to embrace a "universal" I/O abstraction that is
       | architected around a monolithic kernel. Linux and Windows are not
       | the only game in town. This design make make for a nice third-
       | party library for some applications, but it has no place being
       | cemented into the standard library.
        
       | jbluepolarbear wrote:
       | There's only one C++ library I'll use for I/O and networking and
       | that's POCO C++. I've used it in a lot of project over the last
       | 10 years and I haven't seen a better solution.
        
         | synergy20 wrote:
         | its open source version has Boost license which is fine, not
         | sure what's the difference between this and its POCO Pro
         | product, it's better than QT license model for sure, but worse
         | than than those "here is _all_ the code, pay me if you need
         | professional service but not the code"
        
       | secondcoming wrote:
       | C++'s networking support is one of its greatest shortcomings. If
       | I had the choice, I'd never use ASIO again and just use libuv.
       | 
       | Coroutines look interesting, I just need to get my head around
       | them. All code examples I've seen, just as with ASIO, deal with
       | the happy path only. For example, there's hardly a mention of
       | timeouts and the faff ASIO makes you do to get them to work. If
       | there's no 'read(..., timeout)' function then the API is broken
       | as far as I'm concerned.
       | 
       | Then you'll (probably) need to write your own HTTP parsing code
       | which, when you're half-way through, will make you realise that
       | HTTP is actually not trivial at all to implement correctly. Best
       | of luck writing your own HTTP2/3 engine. Boost.Beast seems like a
       | great attempt at doing it right, but I've never used it. (HTTP
       | needs to die, but that's a rant for another day)
       | 
       | IMO, it's too late for C++ and networking. If you need to read
       | from something simple like a serial device then fine, it's
       | probably ok. If you actually need to talk across the Internet
       | then there are other languages that will do it better than you
       | can.
       | 
       | Having said all this, personally, I know my limits and could
       | never come up with anything better than ASIO.
        
         | synergy20 wrote:
         | what about POCO libs mentioned above for network and IO
         | applications?
        
       | jfrd wrote:
       | Too bad C++ is the most terrible thing since forever.
       | 
       | https://twitter.com/Cor3ntin/status/1383875999033565194?s=20
        
         | emsy wrote:
         | All those "orange site bad" comments lol
        
         | pjmlp wrote:
         | Nah, that place I leave for C, the number one reason we keep
         | having memory corruption issues during the last 50 years of
         | computer history, and having taited every language that has
         | some level of compatibility with it.
        
           | linkdd wrote:
           | This kind of comments are forgetting all the good that C did
           | bring in the last 50 years of computer history.
           | 
           | <sarcasm>Too bad those shitty engineers in the 70s didn't
           | think of Rust...</sarcasm>
        
             | miohtama wrote:
             | They thought many ideas of it (see Lisp, Smalltalk) but
             | computers where not powerful enough for complex compilers.
             | Instead, the burden of ensuring correctness had to be left
             | as the cognitive burden for the developer for decades to
             | come.
        
             | jabl wrote:
             | > <sarcasm>Too bad those shitty engineers in the 70s didn't
             | think of Rust...</sarcasm>
             | 
             | True, Rust didn't exist back then, and yes, some (few!)
             | features in Rust weren't invented and worked out then, like
             | the ownership model.
             | 
             | OTOH the corollary to that statement isn't that C was some
             | shining beacon of good design taking advantage of the then
             | state of the art programming language knowledge. See e.g.
             | https://pastebin.com/UAQaWuWG
        
               | rualca wrote:
               | That pastebin leaves out the fact that C's spartan
               | approach and extreme simplicity allowed C to become the
               | most popular programming language in the world already in
               | the time of K&R, a book still renowned for it's clarity
               | and low mental baggage required to onboard onto a
               | programming language.
               | 
               | The pastebin also left out that Bjarne Stroustrup
               | developed C with classes, and the C, as a backward
               | compatible superset of C to take advantage of C's
               | unrivaled popularity.
               | 
               | We all can agree that the science and art behind
               | programming language design progressed a lot in the four
               | decades where we enjoyed C. However, it feels a kin to
               | rewriting history to depict C as a subpar language that
               | was poorly designed and had little to no redeeming
               | qualities, when facts speak for themselves.
        
             | mhh__ wrote:
             | Adding slices to C would kill a lot of bugs without going
             | all the way to rust.
        
           | xjay wrote:
           | The late pioneer in compiler optimization--Frances Allen--
           | agrees.
           | 
           | 2006: "..but something else had happened--and that was back
           | in 1973--[something] which I was very, very unhappy about--
           | and that was the advent of C! It derailed, as far as I was
           | concerned, the advances that I foresaw in compilers. One
           | _cannot_ let the user play with the addresses, and use
           | procedures, and play with pointers--which is pointing to the
           | data--and be able to understand how one can transform the
           | program to run more optimally. "
           | 
           | "There was an interesting debate at the SIGPLAN conference in
           | that period--about the relative need for optimization. It was
           | put on the table that it wasn't going to be needed anymore!
           | So. Anyway. You can have your own opinion on that, but I know
           | I have mine, beyond a doubt that it was a huge setback for--
           | in my opinion--languages and compilers--and the ability to
           | deliver performance--easily--to the user."
           | 
           | https://en.m.wikipedia.org/wiki/Frances_Allen
           | 
           | https://www.youtube.com/watch?v=NjoU-MjCws4&t=2450
        
             | titzer wrote:
             | She's exactly right. I'm really not sure how we came to
             | accept the worse-is-better argument that high performance
             | required exposing machine details into the source language,
             | and letting compiler writers just "do whatever is fastest",
             | regardless of safety. What it gave rise was to today's
             | situation where _none of_ application writers, library
             | writers, kernel writers, or compiler writers are quite sure
             | what will happen if a new optimization is introduced. Will
             | it break programs? By how much? Well, let 's roll the dice!
             | This is a direct result of allowing--no--even expecting,
             | programmers to peer behind the curtains to see machine
             | details that they frankly, shouldn't. It's why porting
             | programs from one machine to another is even a thing, as
             | opposed to just selecting a different output from a
             | compiler, or running a different VM.
             | 
             | Proper abstractions define exactly what happens in every
             | situation, and design unobservable details out. It is the
             | basis for optimizations that fundamentally cannot observed
             | (except side-channels, like timing and other resource
             | usage). Proper abstractions is why we have fast processors.
             | The ISA is a hard boundary.
        
       ___________________________________________________________________
       (page generated 2021-04-18 23:01 UTC)