Having written my extensive Befunge–98 test suite, Mycology, I ran every interpreter claiming to support Befunge–98 I could find on it.
Old results can be found at the 2008–11–15 version of this page. Since the scene is a bit more lively these days and to cut down on mostly uninteresting information, the current version of this page includes only interpreters with a reasonable chance of getting updated and/or interpreters which have a reasonable level of standards conformance.
Page history
2010–04–02
- New results, testing a significantly lower amount of interpreters.
- Mycology updated to version 2010–04–01.
- CCBI updated to version 2.0.
- cfunge updated to revision 828.
- Language::Befunge updated to version 4.12.
- PyFunge updated to version 0.5-rc2.
- Rc/Funge–98 updated to version 1.27, and version 2.02.00 added.
- Stinkhorn updated to revision 4. (Now Mercurial, not SVN.)
2010–04–01
- Archived old results and history to the 2008–11–15 results page.
Interpreters tested
| Interpreter | Description |
|---|---|
| CCBI 2.0 |
My own interpreter, written in version one of the D programming language. CCBI passes all the Mycology tests with flying colours, as I’ve obviously been testing against it. This doesn’t mean that it’s correct according to the Funge–98 spec: if you feel my interpretation of something is wrong, go ahead and e-mail me. |
| cfunge r828 |
cfunge is a POSIX-only Befunge interpreter written in C99 by Arvid Norlander, AKA AnMaster. It’s been tested against Mycology since before the first release and he’s been helpful in reporting bugs, so its standards support is very good. Parts of its functionality are almost copy-pasted from CCBI, and I think AnMaster trusts CCBI a bit more than he should. In some cases, this means that CCBI bugs remain in it for some time. But that does help it in getting a full pass from Mycology. Quite a few fingerprints are implemented in cfunge, though it shies away from those which require changes to interpreter-internal data structures. |
| Language::Befunge 4.12 |
Language::Befunge, by Jerome Quelin, was the only other interpreter in active development at the time of Mycology’s release. It’s written in Perl and claims to support arbitrary-dimension Funges: this is likely what makes it really slow—on my machine, it takes over 15 seconds to run Mycology. It has received some attention as regards Mycology conformance, and as of 4.12 it gets all the way to the end with only a few minor BADs. |
| PyFunge 0.5-rc2 |
PyFunge is an interpreter by Kang “Tokigun” Seonghoon. It is written, as you may expect, in Python. This is another one that’s seen improvements since the release of Mycology. It implements a lot of fingerprints now, and receives only a single BAD in all of Mycology: in the INDV fingerprint. This one can really be blamed on the poor INDV documentation, though. |
| Rc/Funge–98 2.02.00 |
Rc/Funge–98, by Mike Riley, is another POSIX-only interpreter written in C (though not C99, like cfunge). This one is set apart from all the others in that it:
It’s got fairly good Befunge–98 support to boot, especially the latest versions: in the summer of 2008 Mike returned to the Funge world, beginning to rapidly bring his interpreter up to Mycology standards and creating many more fingerprints. In Mycology terms, both 1.27 and 2.02.00 are unfortunately limited by their mistreatment of form feeds: as far as I can tell, they are considered to terminate the file in Befunge mode, when they should be ignored. (Perhaps they increment the z-coordinate even in Befunge?) It must be noted, however, that it gets a full pass in TRDS! No minor feat, that. In the process of fixing his TRDS code for MycoTRDS he found a few bugs in MycoTRDS as well as CCBI, and we checked to see that our TRDS implementations (the only two known to exist) behave identically. |
| Stinkhorn r4 |
An interpreter in C++, Stinkhorn, originally named befunge98, by Lee Houghton now manages to get all the way to the end of Mycology with just a few minor BADs. This was the first interpreter to be updated after Mycology was released. It’s nice to see that Mycology had some impact. Since then, of course, we’ve got all sorts of updates: newcomers like cfunge and returning giants like Rc/Funge–98. |
Results
What follows is the table of results. I arbitrarily split Mycology into sections, displayed on the left side of the table body. In each section, an interpreter may have one of the following results:
- GOOD
- The results were exactly as expected. Some parts may be UNDEF (see below).
- BAD
- Something went wrong. Some parts may be GOOD or UNDEF, but at least one BAD is present.
- UNDEF
- There is no expected result. This happens mainly with fingerprints where semantics have been very loosely specified.
- N/A
- Not applicable: the interpreter doesn’t implement what the section tests, and it isn’t necessary for compatibility. For instance, concurrency or a fingerprint.
- END
- Like BAD, but worse. The interpreter terminated, either as a result of Mycology realizing that the interpreter doesn’t support something required in a future test, or as a result of the interpreter crashing.
- DEAD
- The interpreter has hit an END earlier and didn’t reach this section.
If something is consistently wrong, a BAD is given only at the first occurrence.
In the last section of a file, END is reserved only for unexpected terminations.
Each section links to a text document containing the expected output. If an interpreter’s output differs from the expected, or the expected involves any number of UNDEF fields, the corresponding table cell contains a link to its output for that section. The table cell also has a title attribute with a short summary; this information is duplicated at the bottom of the text document.
In addition, the text files, at the bottom, list the manual GOOD/BAD/UNDEF/END corrections to the total (most are parsed from the output but in some cases an UNDEF can be BAD, for instance if the current date is wrong in the DATE or TIME fingerprints), as well as the total for that section, surrounded by a few asterisks.
For example:
*****
GOOD 1
UNDEF -1
*****
Totals:
GOOD 3
UNDEF 0
*****
In that case, the automatic parser I wrote found 2 GOOD and 1 UNDEF but I manually changed one UNDEF to a GOOD.
| Program | CCBI 2.0 | cfunge r828 | Language::Befunge 4.12 | PyFunge 0.5-rc2 | Rc/Funge–98 1.27 | Rc/Funge–98 2.02.00 | Stinkhorn r4 |
|---|---|---|---|---|---|---|---|
| Command line | ccbi -wds | cfunge -WE | jqbef98 | pyfunge -v98 --statistics | funge -w -Y | funge -w | stinkhorn -w |
| GOODs | 502 | 442 | 237 | 421 | 163 | 173 | 214 |
| BADs | 0 | 0 | 9 | 1 | 2 | 2 | 8 |
| UNDEFs | 120 | 103 | 77 | 102 | 36 | 37 | 46 |
| N/As | 0 | 5 | 18 | 4 | 1 | 0 | 26 |
| Sections passed | 48 | 48 | 48 | 48 | 7 | 7 | 48 |
| Sanity (sanity.bf) | |||||||
Sanity
| GOOD | GOOD | GOOD | GOOD | GOOD | GOOD | GOOD |
| Initial (mycology.b98) | |||||||
Befunge–93 instructions
| GOOD | GOOD | GOOD | GOOD | GOOD | GOOD | GOOD |
Befunge–98 instructions
| GOOD | GOOD | GOOD | GOOD | GOOD | GOOD | GOOD |
Stack stack
| GOOD | GOOD | GOOD | GOOD | GOOD | GOOD | GOOD |
System information retrieval
| GOOD | GOOD | GOOD | GOOD | BAD | BAD | GOOD |
Input/output and random
| GOOD | GOOD | GOOD | GOOD | GOOD | GOOD | GOOD |
Concurrent Befunge–98
| GOOD | GOOD | GOOD | GOOD | GOOD | GOOD | BAD |
More Befunge–98 instructions
| GOOD | GOOD | BAD | GOOD | END | END | BAD |
| Fingerprints (mycology.b98) | |||||||
| NULL | GOOD | GOOD | GOOD | GOOD | DEAD | DEAD | GOOD |
| HRTI | GOOD | GOOD | GOOD | GOOD | DEAD | DEAD | GOOD |
| MODE | GOOD | N/A | N/A | GOOD | DEAD | DEAD | N/A |
| MODU | GOOD | GOOD | GOOD | GOOD | DEAD | DEAD | GOOD |
| ORTH | GOOD | GOOD | GOOD | GOOD | DEAD | DEAD | GOOD |
| PERL | GOOD | GOOD | GOOD | GOOD | DEAD | DEAD | N/A |
| REFC | GOOD | GOOD | GOOD | GOOD | DEAD | DEAD | GOOD |
| ROMA | GOOD | GOOD | GOOD | GOOD | DEAD | DEAD | GOOD |
| TOYS | GOOD | GOOD | N/A | GOOD | DEAD | DEAD | GOOD |
| TURT | GOOD | GOOD | N/A | N/A | DEAD | DEAD | N/A |
| BASE | GOOD | GOOD | GOOD | GOOD | DEAD | DEAD | N/A |
| CPLI | GOOD | GOOD | GOOD | GOOD | DEAD | DEAD | N/A |
| DATE | GOOD | GOOD | N/A | GOOD | DEAD | DEAD | N/A |
| DIRF | GOOD | GOOD | GOOD | GOOD | DEAD | DEAD | N/A |
| EVAR | GOOD | N/A | GOOD | GOOD | DEAD | DEAD | N/A |
| FILE | GOOD | GOOD | GOOD | GOOD | DEAD | DEAD | N/A |
| FING | GOOD | GOOD | N/A | N/A | DEAD | DEAD | N/A |
| FIXP | GOOD | GOOD | GOOD | GOOD | DEAD | DEAD | N/A |
| FPSP | GOOD | GOOD | N/A | GOOD | DEAD | DEAD | N/A |
| FPDP | GOOD | GOOD | N/A | GOOD | DEAD | DEAD | N/A |
| 3DSP | GOOD | GOOD | N/A | GOOD | DEAD | DEAD | N/A |
| FRTH | GOOD | GOOD | N/A | GOOD | DEAD | DEAD | N/A |
| IIPC | GOOD | N/A | N/A | GOOD | DEAD | DEAD | N/A |
| IMAP | GOOD | N/A | N/A | GOOD | DEAD | DEAD | N/A |
| INDV | GOOD | GOOD | N/A | BAD | DEAD | DEAD | N/A |
| REXP | GOOD | GOOD | N/A | N/A | DEAD | DEAD | N/A |
| SOCK and SCKE | GOOD | GOOD | N/A | GOOD | DEAD | DEAD | GOOD |
| STRN | GOOD | GOOD | GOOD | GOOD | DEAD | DEAD | GOOD |
| SUBR | GOOD | GOOD | GOOD | GOOD | DEAD | DEAD | N/A |
| TIME | GOOD | GOOD | BAD | GOOD | DEAD | DEAD | N/A |
| JSTR | GOOD | GOOD | N/A | GOOD | DEAD | DEAD | N/A |
Fingerprint overlapping
| GOOD | GOOD | GOOD | GOOD | DEAD | DEAD | GOOD |
Concurrency
| UNDEF | UNDEF | UNDEF | UNDEF | DEAD | DEAD | UNDEF |
| Final (mycology.b98) | |||||||
Quitting
| GOOD | GOOD | GOOD | GOOD | DEAD | DEAD | GOOD |
| Input (mycouser.b98) | |||||||
Division and Befunge–98 input
| GOOD | GOOD | GOOD | GOOD | GOOD | GOOD | GOOD |
| BASE fingerprint | GOOD | GOOD | BAD | GOOD | GOOD | GOOD | N/A |
| STRN fingerprint | GOOD | GOOD | BAD | GOOD | GOOD | GOOD | GOOD |
| Terminal control fingerprints (mycoterm.b98) | |||||||
| TERM | GOOD | GOOD | N/A | GOOD | GOOD | GOOD | N/A |
| NCRS | GOOD | GOOD | N/A | GOOD | N/A | GOOD | N/A |
| Time travel fingerprint (mycotrds.b98) | |||||||
| TRDS | GOOD | N/A | N/A | N/A | GOOD | GOOD | N/A |
That’s all, folks!