4 ms·
I've skimmed this article a few times now, and something I've always had trouble with was this: “…problem like this are damaging if one is trying to present pr
by geocar 10y ago
I've skimmed this article a few times now, and something I've always had trouble with was this:
“…problem like this are damaging if one is trying to present programming as a discipline subject to mathematical analysis.”
because in general programmers steadfastly refuse to subject their discipline to mathematical analysis, and continue to look for some aesthetic balance between "enough abstraction" and "enough whitespace".
Here is a program to sum a list of numbers:
+/
This definition is even less cumbersome than the Miranda or the Lisp, but it's unclear what the author expects us to conclude from this. And yet I think it's perfectly reasonable to posit that shorter programs are better. Shorter programs have less bugs[1], and run faster[2], and yet for some reason there are a lot of programmers who believe their job is to produce more code. Fuck those guys. Seriously.
[1]: See Code Complete and Software Estimation: Demystifying the Black Art, by Steve McConnell.
[2]: https://stacresearch.com/m3 https://stacresearch.com/m3
Then we have the pursuit of "traditional mathematical notation": I don't think it produces better programs or better programmers. Computers do not execute mathematical notation, and mathematicians can't agree on their notation to enough specificity to permit as much useful computation[3]. It is clear that notation is important[4], but there is frighteningly little real research in this space. Zero-cost abstractions still take up source code, and yet many programmers think this is given as a good thing, despite Dijkstra’s wonderfully succinct observation:
“…the intellectual effort needed to conceive or to understand a program need not grow more than proportional to program length.”
[3]: See Whitehead and Russell, Principia Mathematica
[4]: http://www.jsoftware.com/papers/tot.htm http://www.jsoftware.com/papers/tot.htm
Lazy is also bad. Computers aren't lazy. Starting off by thinking about them as lazy puts programmers on that path for total abstraction. So much energy has been put into trying to hide concurrency-problems[5] that it's no wonder most big-data programs generate so much heat. The real value in Scheme Streams is that they're explicitly concurrent, and other languages that have optimised for those constructs[6] have discovered a great deal of utility.
[5]: http://hadoop.apache.org/ http://hadoop.apache.org/
[6]: O=spawn(fun(P)->P!{f,self(),F()} end,[self()]), receive{f,O,X}->X end.
It's almost like we've plucked some ideas, said they're important, and then used them as a lens to study our languages without even doing the first thing by showing how we can know they are important to the point of excluding everything else.
About the only thing I really like about Miranda (and Haskell, etc) is the pattern matching, which is dope. Seriously good stuff. I don't know how to square that with array languages, but I think it's worth thinking about since they (array languages) seem to have otherwise sorted out program length and notation.
- shakna 10y ago> Shorter programs have less bugs[1], and run faster[2] I'd heartily disagree with that statement. Short programs can run faster, but that entirely depends on the implementation of the language/architecture that they're running upon. Consider the following: struct { char msg[400]; double d; int i; }; struct { double d; int i; char msg[400]; }; The code is nearly identical, only the order is different, but the second uses far far less memory than the first. Secondly, shorter programs can be bug free, but that depends on the level of abstraction exposed, and how that translates into language that can be understood by those using it. There's no shortage of regex bugs in the wild, and its a fairly concise language. Perl has often been criticised for having too concise a language, leaving it prone to code rot. However, all that being said, I think there needs to be a balance between abstraction, and mathematical analysis, and I would also say there hasn't yet been enough actual research into the effect of syntax, rather, syntax has been a result of the abstraction its presenting, or the underlying implementation the language relies upon. We do need abstraction, parsing mathematic notation or estoric languages like Malbolge are difficult for the human brain, even with experience. I mean, Brainfuck isn't that far from what a processor actually runs, being registers and jump statements, but... ++++++++++[>+++++++>++++++++++>+++>+<<<<-]>++.>+.+++++++..+++.>++.<<+++++++++++++++.>.+++.------.--------.>+.>. We don't need a Turing Tarpit. But neither do we need the insane amounts of boilerplate that Java forces upon you to do even the simplest things that Java is meant to be good at. I think that in recent years, mathematics has given us the tools to build better syntaxes: * Better type inference * Better proofing of type safety Though I think Scala's syntax is still overly verbose, DOT calculus is a great step in the right direction for being able to create a syntax with both zero cost abstractions, type safety, and a more concise syntax.
- eutectic 10y agoWith GCC, both those structs seem to have a size of 416 bytes. Can you elaborate on what you meant?
- shakna 10y ago32 or 64bit GCC? I was referring to Struct Padding[0]. Assuming a 32bit GCC, then the first would be padded with 24 bytes, the second with 16 bytes. This padding doesn't show up under size, but does affect speed in small ways, and available memory (yay for dealing with memory constrained systems!). [0] http://www.catb.org/esr/structure-packing/ http://www.catb.org/esr/structure-packing/