An article called "Perl cannot be parsed, a formal proof" is doing the rounds. So, does Perl decide the meaning of its parsed code at "run-time" or "compile-time"?
In some discussions I've read, I get the impression the arguments stem from imprecise terminology, so please try to define your technical terms in your answer. I have deliberately not defined "run-time", "statically" or "parsed" so that I can get perspectives from people who perhaps define those terms differently to me.
This isn't about static analysis. Its a theoretical question about Perl's behaviour.
Perl has a well-defined "compile time" phase, which is followed by a well-defined "runtime" phase. However, there are ways of transitioning from one to the other. Many dynamic languages have eval
constructs that allow compilation of new code during the runtime phase; in Perl the inverse is possible as well -- and common. BEGIN
blocks (and the implicit BEGIN
block caused by use
) invoke a temporary runtime phase during compile-time. A BEGIN
block is executed as soon as it's compiled, instead of waiting for the rest of the compilation unit (i.e. current file or current eval
) to compile. Since BEGIN
s run before the code that follows them is compiled, they can influence the compilation of the following code in practically any way (although in practice the main things they do are to import or define subroutines, or to enable strictness or warnings).
A use Foo;
is basically equivalent to BEGIN { require foo; foo->import(); }
, with require being (like eval STRING
) one of the ways to invoke compile-time from runtime, meaning that we're now within compile-time within runtime within compile-time and the whole thing is recursive.
Anyway, what it boils down to for the decidability of parsing Perl is that since the compilation of one bit of code can be influenced by the execution of a preceding piece of code (which can in theory do anything), we've got ourselves a halting-problem type situation; the only way to correctly parse a given Perl file in general is by executing it.