Sure, you can detect pure functions in some cases. For instance,
int f(int x)
{
return x*2;
}
can be detected as pure with simple static analysis. The difficulty is doing this in general, and detecting interfaces which use "internal" state but are externally pure is basically impossible.
GCC does have the warning options -Wsuggest-attribute=pure
and -Wsuggest-attribute=const
, which suggest functions that might be candidates for the pure
and const
attributes. I'm not sure whether it opts to be conservative (i.e. missing many pure functions, but never suggesting it for a non-pure function) or lets the user decide.
Note that GCC's definition of pure
is "depending only on arguments and global variables":
Many functions have no effects except the return value and their return value depends only on the parameters and/or global variables. Such a function can be subject to common subexpression elimination and loop optimization just as an arithmetic operator would be. These functions should be declared with the attribute pure
.
— GCC manual
Strict purity, i.e. the same results for the same arguments in all circumstances, is represented by the const
attribute, but such a function cannot even dereference a pointer passed to it. So the parallelisation opportunities for pure
functions are limited, but much fewer functions can be const
compared to the pure functions you can write in a language like Haskell.
By the way, automatically parallelising pure functions is not as easy as you might think; the hard part becomes deciding what to parallelise. Parallelise computations that are too cheap, and overhead makes it pointless. Don't parallelise enough, and you don't reap the benefits. I don't know of any practical functional language implementation that does automatic parallelisation for this reason, although libraries like repa parallelise many operations behind the scenes without explicit parallelism in the user code.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…