Comparison of Mycology results

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

2010–04–01

Interpreters tested

Listing of 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 1.27

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:

  • First implemented Befunge–98.
  • Therefore first implemented Concurrent Funge.
  • First supported a form of Mini-Funge (libraries written in Funge).
  • Supports all the Cat’s-Eye fingerprints and defines a wallop of its own.

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.

Mycology results for all interpreters tested.
ProgramCCBI 2.0cfunge r828Language::Befunge 4.12PyFunge 0.5-rc2Rc/Funge–98 1.27Rc/Funge–98 2.02.00Stinkhorn r4
Command lineccbi -wdscfunge -WEjqbef98pyfunge -v98 --statisticsfunge -w -Yfunge -wstinkhorn -w
GOODs502442237421163173214
BADs0091228
UNDEFs12010377102363746
N/As051841026
Sections passed484848487748
Sanity (sanity.bf)
Sanity
  • # .0123456789@
  • reflection
GOODGOODGOODGOODGOODGOODGOOD
Initial (mycology.b98)
Befunge–93 instructions
  • >v<^$"_+,:-|!*\`pg
  • empty stack popping
  • # jumping over space
  • wraparound
GOODGOODGOODGOODGOODGOODGOOD
Befunge–98 instructions
  • abcdef[];k/%nrw'szjx
  • # across file/line end
  • negative Funge-Space
  • Funge–98 spaces
GOODGOODGOODGOODGOODGOODGOOD
Stack stack
  • {}u
GOODGOODGOODGOODGOODGOODGOOD
System information retrieval
  • y
GOODGOODGOODGOODBADBADGOOD
Input/output and random
  • i?o
GOODGOODGOODGOODGOODGOODGOOD
Concurrent Befunge–98
  • t
GOODGOODGOODGOODGOODGOODBAD
More Befunge–98 instructions
  • ()
  • more y]:\k
  • null and non-ASCII bytes
  • form feed
GOODGOODBADGOODENDENDBAD
Fingerprints (mycology.b98)
NULLGOODGOODGOODGOODDEADDEADGOOD
HRTIGOODGOODGOODGOODDEADDEADGOOD
MODEGOODN/AN/AGOODDEADDEADN/A
MODUGOODGOODGOODGOODDEADDEADGOOD
ORTHGOODGOODGOODGOODDEADDEADGOOD
PERLGOODGOODGOODGOODDEADDEADN/A
REFCGOODGOODGOODGOODDEADDEADGOOD
ROMAGOODGOODGOODGOODDEADDEADGOOD
TOYSGOODGOODN/AGOODDEADDEADGOOD
TURTGOODGOODN/AN/ADEADDEADN/A
BASEGOODGOODGOODGOODDEADDEADN/A
CPLIGOODGOODGOODGOODDEADDEADN/A
DATEGOODGOODN/AGOODDEADDEADN/A
DIRFGOODGOODGOODGOODDEADDEADN/A
EVARGOODN/AGOODGOODDEADDEADN/A
FILEGOODGOODGOODGOODDEADDEADN/A
FINGGOODGOODN/AN/ADEADDEADN/A
FIXPGOODGOODGOODGOODDEADDEADN/A
FPSPGOODGOODN/AGOODDEADDEADN/A
FPDPGOODGOODN/AGOODDEADDEADN/A
3DSPGOODGOODN/AGOODDEADDEADN/A
FRTHGOODGOODN/AGOODDEADDEADN/A
IIPCGOODN/AN/AGOODDEADDEADN/A
IMAPGOODN/AN/AGOODDEADDEADN/A
INDVGOODGOODN/ABADDEADDEADN/A
REXPGOODGOODN/AN/ADEADDEADN/A
SOCK and SCKEGOODGOODN/AGOODDEADDEADGOOD
STRNGOODGOODGOODGOODDEADDEADGOOD
SUBRGOODGOODGOODGOODDEADDEADN/A
TIMEGOODGOODBADGOODDEADDEADN/A
JSTRGOODGOODN/AGOODDEADDEADN/A
Fingerprint overlapping
  • more ()
GOODGOODGOODGOODDEADDEADGOOD
Concurrency
  • whether t copies parent IP’s fingerprints to child
UNDEFUNDEFUNDEFUNDEFDEADDEADUNDEF
Final (mycology.b98)
Quitting
  • q
GOODGOODGOODGOODDEADDEADGOOD
Input (mycouser.b98)
Division and Befunge–98 input
  • /%&~
GOODGOODGOODGOODGOODGOODGOOD
BASE fingerprintGOODGOODBADGOODGOODGOODN/A
STRN fingerprintGOODGOODBADGOODGOODGOODGOOD
Terminal control fingerprints (mycoterm.b98)
TERMGOODGOODN/AGOODGOODGOODN/A
NCRSGOODGOODN/AGOODN/AGOODN/A
Time travel fingerprint (mycotrds.b98)
TRDSGOODN/AN/AN/AGOODGOODN/A

That’s all, folks!

Navigation:

Please use this permalink when linking to this page.

This page is part of the personal web site of Matti Niemenmaa (contact).