To quote some of the debaters over this issue: David Gibson:
But most important of all:
[X.400 is] Defined using an object oriented, recursive language designed for telecommunications - ASN.1.
Builtin support for multiple high performance transfer syntaxes.
Marshall Rose:
combining ASN.1 and high-performance is oxymornonic.David Gibson:ASN.1 is probably the greatest failure of the OSI effort, it led hundreds of engineers, including myself, to devise data structures that were far too complicated for their own good.
All the object oriented extensions (true object orientation - not OBJECT-TYPE Macros) of '94 ASN.1 make it a very powerful modelling language. Generating a high performance transfer syntax is a problem for the compiler author - the application designer is focused on other issues.Carl M. Ellison <cme@tis.com>:
ASN.1 might be an interesting exercise for people who believe LISP is the only real language or who really like to play with abstract syntax or who like to write specs while ignoring implementations (ie., write standards). It's *really* easy to write structure declarations in ASN.1 -- as long as you don't try to implement from them.Throwing some reality out with the bathwater, when reading the above, consider:However, as one who wants computer programs to be written efficiently and legibly (with small, easy to handle names, allowing complete statements to be expressed in a small space) and to have these programs communicate between machines with different byte ordering -- and almost nothing else -- I find ASN.1 is the *wrong* tool.
In a text oriented structure like ABNF, you can usually skip to the end of the word, line or token and resynchronize.
From: John Q. Public <jqp@somewhere.com>This is illegal according to RFC 822; a dot in a freeform name must be quoted, because a dot is a "special character". But it has become so common that most useful mail software accepts such headers, even though they are not standards-conformant.
But still, this error is a bit easier to spot than the encoding error in the hexdump 01 02 08 00 (an empty bitstring value should be encoded in one octet with zero unused bits in the last byte, not two octets with eight unused bits in the last byte. This, too, comes from real life....).