{"id":159,"date":"2008-03-11T10:45:00","date_gmt":"2008-03-11T15:45:00","guid":{"rendered":"http:\/\/2d823b65bb.nxcli.io\/2008\/03\/implementation-defined-not-really.html"},"modified":"2008-03-11T10:45:00","modified_gmt":"2008-03-11T15:45:00","slug":"implementation-defined-not-really","status":"publish","type":"post","link":"https:\/\/www.robweir.com\/blog\/2008\/03\/implementation-defined-not-really.html","title":{"rendered":"Implementation-defined (Not really)"},"content":{"rendered":"<p>Here begins the lesson on Embrace, Extend and Extinguish (EEE).  Classically, this technique is used to perpetuate vendor lock-in by introducing small incompatibilities into a standard interface, in order to prevent effective interoperability, or (shudder) even substitutability of competing products based on that interface.  This EEE strategy has worked well so far for Microsoft, with the web browser, with Java, with Kerberos, etc.  It is interesting to note that this technique can work equally well with Microsoft&#8217;s own standards, like OOXML.<\/p>\n<p>An easy way to find these extension points is to search the OOXML specification for &#8220;application-defined&#8221; or &#8220;implementation-defined&#8221;.  You will find dozens of them, such as:<\/p>\n<ol>\n<li>In general, scripting<\/li>\n<li>In general, macros<\/li>\n<li>In general, DRM<\/li>\n<li>Part 1 \u2014  &#8220;Application-Defined File Properties Part&#8221; which is totally undefined,  but is referenced 13 times for specific fields in Part 4.<\/li>\n<li>Section 2.16.4.1 \u2014  implementation-defined date\/time formatting<\/li>\n<li>Section 2.16.5.34 \u2014  implementation-defined document filters<\/li>\n<li>Section 3.17.2.6 \u2014  implementation-defined string&#8211;>number conversions in a spreadsheet<\/li>\n<li>Section 2.8.2.2 \u2014  character sets supported by a font<\/li>\n<li>Section 2.9.6 \u2014  the interpretation of the mysterious hex &#8220;template code&#8221; in numbered list overrides \u2014  &#8220;The method by which this value is interpreted shall be application-defined.&#8221;<\/li>\n<li>Section 2.14.27 \u2014  application-defined storage of exclusion data for a mail merge<\/li>\n<li>Section 2.15.1.28 \u2014  application-defined cryptographic hash algorithms<\/li>\n<li>2.15.1.76 \u2014  &#8220;Specifies a string identifier which may be used to locate the XSL transform to be applied. The semantics of this attribute are not defined by this Office Open XML Standard &#8211; applications may use this information in any application-defined manner to resolve the location of the XSL transform to apply.&#8221;<\/li>\n<li>Section 5.6.2.12 \u2014  application-defined macro string reference for connection shape<\/li>\n<li>Section 5.6.2.15 \u2014  application-defined macro string reference for graphic frame<\/li>\n<li>Section 5.6.2.24 \u2014  application-defined macro string reference for a picture object<\/li>\n<li>Section 5.6.2.28 \u2014  application-defined macro string reference for a shape<\/li>\n<li>Section 5.8.2.9 \u2014  application-defined macro string reference for a connection shape<\/li>\n<li>Section 5.8.2.12 \u2014  application-defined macro string reference for a graphic frame<\/li>\n<li>Section 6.2.2.14 \u2014  &#8220;This element specifies the presence of an ink object. An ink object is a VML object which allows applications to store data for ink annotations in an application-defined format.&#8221;<\/li>\n<li>Section 7.6.2.60 \u2014  implementation-defined bibliographic citation formats<\/li>\n<li>And many, many more.<\/li>\n<\/ol>\n<p>So, one might ask, what exactly does &#8220;implementation-defined&#8221;mean?  Here is how OOXML defines it and related terms:<\/p>\n<blockquote><p>behavior, implementation-defined \u2014 Unspecified behavior where each implementation documents that behavior, thereby promoting predictability and reproducibility within any given implementation. (This term is  sometimes called \u201capplication-specific behavior\u201d.)<\/p>\n<p>behavior, locale-specific \u2014 Behavior that depends on local conventions of nationality, culture, and language.<\/p>\n<p>behavior, unspecified \u2014Behavior where this Standard imposes no requirements. [Note: To add an extension,  an implementer must use the extensibility mechanisms described by this Standard rather than trying to do so by giving meaning to otherwise unspecified behavior. end note]<\/p><\/blockquote>\n<p>Note that this is not an entirely novel definition.   Anyone who has spent time reading over the C and C++ Programming Language standards, in ANSI or in ISO, will recall a similar set of definitions.  For example, these from ISO\/IEC 9899:1999 C-Programming Language:<\/p>\n<blockquote><p>implementation-defined behavior<br \/>unspecified behavior where each implementation documents how the choice is made<\/p>\n<p>locale-specific behavior<br \/>behavior that depends on local conventions of nationality, culture, and language that each implementation documents<\/p>\n<p>unspecified behavior<br \/>behavior where this International Standard provides two or more possibilities and<br \/>imposes no further requirements on which is chosen in any instance<\/p><\/blockquote>\n<p>So, you can see that OOXML pretty much copies these definitions.   However, ISO standards like ISO\/IEC 9899:1999 go one step further and make an additional statement in their conformance clause, something that is distinctly missing from OOXML:<\/p>\n<blockquote><p>&#8220;An implementation shall be accompanied by a document that defines all implementation-defined and locale-specific characteristics and all extensions.&#8221;<\/p><\/blockquote>\n<p>If you poke around you will see that all conformant C compilers indeed do come with a document that defines how their implementation-defined features were implemented.  For example, GNU&#8217;s gcc compiler comes with <a href=\"http:\/\/gcc.gnu.org\/onlinedocs\/gcc\/C-Implementation.html\">this<\/a> document.<\/p>\n<p>So, by failing to include this in their conformance clause, OOXML&#8217;s use of the term &#8220;implementation-defined&#8221; is toothless.  It just means &#8220;We don&#8217;t want to tell you this information&#8221; or &#8220;We don&#8217;t want to interoperate&#8221;.  Conformant applications are not required to actually document how they extend the standard.  You can look at Microsoft Office 2007 as a prime example.  Where is this documentation that explains how Office 2007 implements these &#8220;implementation-defined&#8221; features?  How is interoperability promoted without this?<\/p>\n<p>(This item not discussed at the BRM for lack of time.)<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Here begins the lesson on Embrace, Extend and Extinguish (EEE). Classically, this technique is used to perpetuate vendor lock-in by introducing small incompatibilities into a standard interface, in order to prevent effective interoperability, or (shudder) even substitutability of competing products based on that interface. This EEE strategy has worked well so far for Microsoft, with [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_genesis_hide_title":false,"_genesis_hide_breadcrumbs":false,"_genesis_hide_singular_image":false,"_genesis_hide_footer_widgets":false,"_genesis_custom_body_class":"","_genesis_custom_post_class":"","_genesis_layout":"","footnotes":""},"categories":[6],"tags":[],"class_list":{"0":"post-159","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-ooxml","7":"entry"},"_links":{"self":[{"href":"https:\/\/www.robweir.com\/blog\/wp-json\/wp\/v2\/posts\/159","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.robweir.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.robweir.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.robweir.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.robweir.com\/blog\/wp-json\/wp\/v2\/comments?post=159"}],"version-history":[{"count":0,"href":"https:\/\/www.robweir.com\/blog\/wp-json\/wp\/v2\/posts\/159\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.robweir.com\/blog\/wp-json\/wp\/v2\/media?parent=159"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.robweir.com\/blog\/wp-json\/wp\/v2\/categories?post=159"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.robweir.com\/blog\/wp-json\/wp\/v2\/tags?post=159"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}