Could you go into detail why you think that a hypergraph is needed? I think every program can be represented by a directed graph of basic blocks.
The following function has an obvious visual representation as a processing block:
int add(int a, int b);
But how do you represent a function allowing other functions in its signature, e.g: void transformInPlace(int* input, int (*func)(int));The point I wanted to make was that no matter what design choice you make as a language author, to make this DAG/AST as palatable for the end user, be it with a imperative, functional, logic or concatenive style of programming, a price is aways payed, in terms of complexity at some level (time, space, ergonomics), no matter what you do.
Many visual programming languages are based around DAGs and they do represent the computation itself. The edges are usually not nodes either, so those DAGs are not hypergraphs.