If you have been following the talk around Google's latest language, Dart, then you might have heard things like "covariant arrays are widely regarded as a mistake" (src). But what is covariance? Why are covariant arrays considered a mistake? Who has covariant arrays? Why?
Saturday, October 29, 2011
Sunday, October 2, 2011
Your Favorite Language is Probably Terrible at Concurrency too
The internet has been ablaze with posts on NodeJS, to some people's joy and to others chagrin. Some have claimed that Node solves a long standing problem in concurrency, saying:
People are starting to build more on Node.js because it’s superior and it solves these problems that have always existed. I/O has been done wrong for the last 30 years
In my opinion, Node is bad at concurrency, and guess what? Your language probably isn't any better. But let's make sure we're on the same page first.
Sunday, July 31, 2011
C Gotcha Of The Day: Pointers aren't integers
The C standard is clear that pointers are not required to be convertible to or from an integer.
Friday, July 29, 2011
C Gotcha Of The Day: ptrdiff_t
Excerpt from C99 Draft (AFAIK this has not changed):
That means, while the type
The size of the result is implementation-defined, and its type (a signed integer type) isptrdiff_t
defined in the<stddef.h>
header. If the result is not representable in an object of that type, the behavior is undefined. In other words, if the expressionsP
andQ
point to, respectively, the i-th and j-th elements of an array object, the expression(P) - (Q)
has the value i−j provided the value fits in an object of typeptrdiff_t
.
That means, while the type
size_t
is capable of expressing the size of any object, you cannot guarantee that the subtraction of two pointers inside your object will result in defined behavior. That is because ptrdiff_t
is signed (so it can give you the direction of the difference) and size_t
is unsigned. You can use the macros PTRDIFF_MAX
and SIZE_MAX
to determine if your subtraction is safe though.
Tuesday, May 3, 2011
Sometimes I forget the full degree in which Python's "scoping" is broken.
>>> [s for s in [1, 2,3]]
[1, 2, 3]
>>> s
3
Wednesday, April 27, 2011
[JC] Efficient Parallel Programming in Poly/ML and Isabelle/ML
Authors: David C.J. Matthews and Makarius Wenzel
URL: http://www4.in.tum.de/~wenzelm/papers/parallel-ml.pdf
Year: 2010
I had not heard of Poly/ML or Isabelle/ML prior to reading this paper. I tried to do a bit of background research to get an idea for it, but I may have gotten some details wrong. If I made any mistakes below I will be happy to correct them.
Poly/ML is a full implementation of Standard ML originally developed by David Matthews. Larry Paulson was an early adopter and implemented the Isabelle theorem prover. Isabelle/ML is the implementation of Isabelle on Poly/ML. Poly/ML was originally implemented with a single threaded run time system (RTS). With the ubiquity of multicore machines the RTS was modified to support threading, the garbage collector was modified and threading APIs were introduced. Finally, the modifications were tested in Isabelle. This paper is relevant to the frequent debates that occur on the Ocaml mailing list. Ocaml currently has no support for parallelism and this deficiency is frequently brought up as a negative.
URL: http://www4.in.tum.de/~wenzelm/papers/parallel-ml.pdf
Year: 2010
I had not heard of Poly/ML or Isabelle/ML prior to reading this paper. I tried to do a bit of background research to get an idea for it, but I may have gotten some details wrong. If I made any mistakes below I will be happy to correct them.
The Paper
Poly/ML is a full implementation of Standard ML originally developed by David Matthews. Larry Paulson was an early adopter and implemented the Isabelle theorem prover. Isabelle/ML is the implementation of Isabelle on Poly/ML. Poly/ML was originally implemented with a single threaded run time system (RTS). With the ubiquity of multicore machines the RTS was modified to support threading, the garbage collector was modified and threading APIs were introduced. Finally, the modifications were tested in Isabelle. This paper is relevant to the frequent debates that occur on the Ocaml mailing list. Ocaml currently has no support for parallelism and this deficiency is frequently brought up as a negative.
Labels:
functional programming,
journal club,
ml,
ocaml,
parallelism
Thursday, April 14, 2011
A little gotcha in overloading comparison methods in Python
Python supports chaining relational operators so you can express 2 < 3 < 4 and get true. It looks like this is implemented as a little compiler trick that actually creates the expression "2 < 3 and 3 < 4". This can be confusing if you try to do something insane like implement Haskell's (>>=) in Python using (>=). Something like:
Just(10) >= (lambda x : Just(x + 1)) >= (lambda x : Just(x / 2))
Will actually become:Just(10) >= (lambda x : Just(x + 1)) and \
(lambda x : Just(x + 1)) >= (lambda x : Just(x / 2))
This only seems to only apply to the relational operators, choosing to implement (>>=) with (>>) in Python seems to work fine. Here is a Gist showing the problem from @apgwoz: https://gist.github.com/916132.
Tuesday, April 12, 2011
Unicorn is Unix, What?
I'm late to this blog post but @apgwoz just sent it to me. I found it pretty silly. Apparently we should like Unicorn because it uses a lot of Unix system calls...
There’s another problem with Unix programming in Ruby that I’ll just touch on briefly: Java people and Windows people. They’re going to tell you that fork(2) is bad because they don’t have it on their platform, or it sucks on their platform, or whatever, but it’s cool, you know, because they have native threads, and threads are like, way better anyways.False dichotomies are the best form of logic.
Fuck that.
Don’t ever let anyone tell you that fork(2) is bad. Thirty years from now, there will still be a fork(2) and a pipe(2) and a exec(2) and smart people will still be using them to solve hard problems reliably and predictably, just like they were thirty years ago.
Subscribe to:
Posts (Atom)