home *** CD-ROM | disk | FTP | other *** search
/ High Voltage Shareware / high1.zip / high1 / DIR9 / A9X_0610.ZIP / 9X-GUIDE.HLP next >
Text File  |  1993-06-10  |  37KB  |  635 lines

  1. Form G104-1092a
  2. 9X-GUIDE.HLP
  3.  
  4. Ada Information Clearinghouse, 1-800-AdaIC-11, 1-703/685-1477
  5.  
  6. (This has been later published in the November/December 1992 issue of ACM 
  7. SIGAda's Ada Letters.)
  8.  
  9.                     HOW TO PROGRAM IN Ada 9X, USING Ada 83
  10.  
  11.                            Erhard Ploedereder, Ph.D.
  12.                                  Tartan, Inc.
  13.                                300 Oxford Drive
  14.                             Monroeville, PA, 15146
  15.                               ploedere@tartan.com
  16.  
  17.                                    Abstract
  18.  
  19. Existing software will have to be transitioned from Ada 83 to Ada 9X.  This 
  20. paper explains presently known incompatibilities between the existing Ada 
  21. standard and its proposed revision.  It provides guidelines to users, which 
  22. will make their Ada 83 code upward compatible with Ada 9X.
  23.  
  24.                                 1. Introduction
  25.  
  26. Ada 9X is approaching rapidly.  Initiation of the formal ANSI and ISO 
  27. standardization processes is expected in late 1993.  Although attracted by the 
  28. added functionality of Ada 9X, many users are concerned about the eventual 
  29. cost of upgrading their Ada applications to the revised standard.  Of 
  30. particular interest are any incompatibilities that might exist between Ada 83 
  31. and Ada 9X.  The detection and analysis of such incompatibilities, and the 
  32. resulting program changes, add risk and cost to the transition to Ada 9X.
  33.  
  34. Avoiding such incompatibilities has been a central design goal of the Ada 9X 
  35. revision effort.  However, in some cases, they are a necessary consequence of 
  36. changes to the semantics of existing language features, in order to correct 
  37. problems in Ada 83.  In early 1992, the Ada 9X Mapping Team compiled a list of 
  38. incompatibilities [1] for the then existing Mapping Specification [2,3].  
  39. Since that time, refinements of the Mapping Specification have steadily 
  40. reduced the number of incompatibilities.  Still, some incompatibilities will 
  41. remain.
  42.  
  43. In this article, we provide practical guidelines to Ada 83 programmers, so 
  44. that their Ada 83 code will be upward compatible with the Ada 9X standard.  
  45. The information presented in this paper is based on the current state (July 
  46. '92) of the revision proposal, which is widely regarded as fairly stable.  
  47. Nevertheless, it is work in progress, subject to change and all it implies for 
  48. the accuracy of the presented information.
  49.  
  50. While it is conceivable that additional incompatibilities will still be 
  51. discovered, it is reassuring to know that, since the time the cited list was 
  52. established, review of the Mapping has not revealed previously unknown 
  53. incompatibilities.  Hence, adherence to the presented guidelines will help 
  54. significantly to reduce the effort of migrating to Ada 9X.
  55.  
  56. Moreover, we believe that these guidelines do not seriously constrain the use 
  57. of Ada 83; some of them could be regarded as good style guidelines in any 
  58. case.  Even if continued work on Ada 9X eliminates some of the 
  59. incompatibilities, these guidelines will not have a detrimental effect on the 
  60. produced Ada code.
  61.  
  62. For ease of reference, we first enumerate the guidelines and then explain them 
  63. in more detail.  We do not attempt to provide any comprehensive rationale for 
  64. the underlying language changes; for such information, we refer the reader to 
  65. [1] and its future revisions or replacements.
  66.  
  67.                         2.  The Guidelines at a Glance
  68.  
  69. Most of the upward incompatibilities imply that some legal Ada 83 programs are 
  70. no longer legal in Ada 9X.  Any Ada 9X compiler is guaranteed to identify and 
  71. reject all such incompatible situations, safeguarding users against 
  72. unrecognized changes in program behavior.  However, there is also a very small 
  73. number of language changes that alter the meaning of Ada 83 programs while 
  74. retaining their legality when compiled with an Ada 9X compiler.  Unless the 
  75. compiler issues friendly informational messages about such situations, these 
  76. changes could go unnoticed.  They deserve special attention by the users.  
  77. Guidelines 2, 5, 9, and 12 address these particular situations.
  78.  
  79. The incompatibilities likely to be encountered with some frequency are 
  80. addressed by Guidelines 8, 10, and possibly 1.
  81.  
  82. For some of the guidelines, we have consciously preferred a simpler, more 
  83. memorable rule to a more precise, but also more complicated one.  Guidelines 3 
  84. and 7 are examples, where a less encompassing rule would also suffice.
  85.  
  86. The guidelines for Ada 83 programs are:
  87.  
  88.       1.    Do not use the following Ada 9X keywords as Ada 83 identifiers in 
  89.             your program: aliased, protected, requeue, tagged, until.
  90.  
  91.       2.    Do not declare the identifiers WIDE_STRING and WIDE_CHARACTER in 
  92.             package specifications.
  93.  
  94.       3.    Do not apply use-clauses to package SYSTEM.
  95.  
  96.       4.    Do not declare the identifier APPEND_FILE in a package 
  97.             specification.  Alternatively, do not apply use-clauses to package 
  98.             TEXT_IO and instantiations of SEQUENTIAL_IO.
  99.  
  100.       5.    For type CHARACTER, be prepared that the enumeration will comprise 
  101.             256, rather than 128, literals.  Similarly, for type FILE_MODE, be 
  102.             prepared for the added literal APPEND_FILE.
  103.  
  104.       6.    Do not use accuracy constraints in subtype declarations.
  105.  
  106.       7.    Put representation clauses for real types immediately after the 
  107.             type declaration.
  108.  
  109.       8.    All library unit packages must have bodies, even if such bodies 
  110.             are empty.
  111.  
  112.       9.    Do not derive from a type declared in the same package.  Or, if 
  113.             you do, derive the new types before redefining any predefined 
  114.             operations on the parent type.
  115.  
  116.       10.   Add a distinctive comment to all generic formal private types that 
  117.             can be legally instantiated with unconstrained types.
  118.  
  119.       11.   Do not assume "too much" about the state of the computation when 
  120.             exceptions are implicitly raised.  Do not cause implicit 
  121.             exceptions knowingly.  Be prepared for the elimination of the 
  122.             exception NUMERIC_ERROR.
  123.  
  124.       12.   Be prepared for attribute values of real types to more closely 
  125.             reflect the actual hardware.  Be aware that accuracy requirements 
  126.             for operations combining fixed-point types with differently based 
  127.             'SMALL may be lessened.
  128.  
  129.                          3.  The Guidelines in Detail
  130.  
  131. Guideline 1:
  132. Do not use the following Ada 9X keywords as Ada 83 identifiers in your 
  133. program: aliased, protected, requeue, tagged, until.
  134.  
  135. These reserved keywords have been added to Ada 9X.  Clearly, programs 
  136. containing such identifiers will be rejected as syntactically illegal by any 
  137. Ada 9X compiler.  See declaration (1) in Figure 1 for an example.
  138.  
  139. For existing programs, editor scripts can be easily written to check for the 
  140. absence of such identifiers.  If they are present, consistent replacement with 
  141. a different identifier makes the code upward compatible.  Note, however, that 
  142. the choice of a replacement identifier must not coincide with another name 
  143. already visible in any of the contexts, in which the conflicting identifier 
  144. occurs.  A cross-reference listing of the program may greatly assist in 
  145. finding unique replacement identifiers.
  146.  
  147. ------------------------------------------------------------------------------
  148. |                                                                            |
  149. |                                                                            |
  150. |    package PKG is                                                          |
  151. |        type WIDE_STRING is ....;                                           |
  152. |        APPEND_FILE: INTEGER;                                               |
  153. |    end PKG;                                                                |
  154. |                                                                            |
  155. |    with PKG; use PKG;                                                      |
  156. |    with TEXT_IO; use TEXT_IO;                                              |
  157. |    package NAME_CONFLICTS is                                               |
  158. |                                                                            |
  159. |        PROTECTED: BOOLEAN := true;  -- (1)  -- illegal in Ada 9X           |
  160. |                                             -- 'protected' is now a keyword|
  161. |                                                                            |
  162. |        STR: WIDE_STRING;  -- (2) -- in Ada 83, denotes PKG.WIDE_STRING     |
  163. |                                  -- in Ada 9X, denotes STANDARD.WIDE_STRING|
  164. |                                                                            |
  165. |        X: INTEGER := APPEND_FILE;  -- (3)                                  |
  166. |                   -- illegal in Ada 9X. Due to new presence                |
  167. |                   -- of name APPEND_FILE in TEXT_IO, the                   |
  168. |                   -- name is no longer directly visible                    |
  169. |                                                                            |
  170. |                                                                            |
  171. |    end NAME_CONFLICTS;                                                     |
  172. |                                                                            |
  173. |                                                                            |
  174. |   Figure 1:  Incompatibilities Caused by New Predefined Names and Keywords |
  175. |                                                                            |
  176. ------------------------------------------------------------------------------
  177.  
  178. Guideline 2:
  179. Do not declare the identifiers WIDE_STRING and WIDE_CHARACTER in package 
  180. specifications.
  181.  
  182. These identifiers have been added to package STANDARD of Ada 9X.  As a 
  183. consequence, user-defined names with the same identifier, when made directly 
  184. visible via use-clauses, will no longer denote the imported definitions but 
  185. those in package STANDARD.  The rules of Ada give precedence to directly 
  186. visible names over names made directly visible by use-clauses.  Theoretically, 
  187. the program will still be legal, but behave differently in execution.  In 
  188. practice, however, it is likely that program illegalities will occur as a 
  189. consequence of the altered binding.  See declaration (2) in Figure 1 for an 
  190. example.
  191.  
  192. For existing programs, the analysis and correction described for guideline 1 
  193. applies.
  194.  
  195. A secondary consequence of the appearance of the new types WIDE_CHARACTER and 
  196. WIDE_STRING for the support of international character sets is that operations 
  197. involving only character or string literals may become ambiguous, since the 
  198. operation could be for either the Ada 83 types or the new Ada 9X types.  For 
  199. example, the equalities in
  200.  
  201.             if 'a' = 'b' then ...
  202.             if "abc" = "def" then ...
  203.  
  204. are now ambiguous.  The same applies, if the operands are overloaded function 
  205. calls that cannot be disambiguated by their parameters.  Given that no 
  206. competent programmer would compare two string or character literals, this 
  207. situation is not worth a guideline.  However, preprocessors might generate 
  208. such code.  The solution is to type-qualify one of the arguments of the 
  209. expression.  The appearance of a variable anywhere in the expression avoids 
  210. the ambiguity.
  211.  
  212. Guideline 3:
  213. Do not apply use-clauses to package SYSTEM.
  214.  
  215. This is generally a good Ada 83 guideline, since implementors are free to add 
  216. additional declarations to package SYSTEM.  Consequently, a new release of a 
  217. compiler may declare new names in the package, causing visibility conflicts or 
  218. ambiguities in code that already makes equally named declarations from other 
  219. packages directly visible via use-clauses.  Ada 9X adds additional predefined 
  220. names in package SYSTEM and, hence, can cause this problem.  Unlike the 
  221. situation discussed in Guideline 2, encountering this incompatibility will 
  222. make the Ada 83 program illegal in Ada 9X, since the Ada visibility rules will 
  223. then make the conflicting, non-overloadable declarations from neither package 
  224. directly visible.  See Guideline 4 for an analogous problem and example.
  225.  
  226. Guideline 4:
  227. Do not declare the identifier APPEND_FILE in a package specification.  
  228. Alternatively, do not apply use-clauses to package TEXT_IO and instantiations 
  229. of SEQUENTIAL_IO.
  230.  
  231. Ada 9X adds the enumeration literal APPEND_FILE to the FILE_MODE type in these 
  232. packages.  As an additional name in a predefined package, this can create the 
  233. problems already described under Guideline 3.  See declaration (3) in Figure 1 
  234. for an example.
  235.  
  236. For existing code, the remedies given under Guideline 1 apply.
  237.  
  238. Guideline 5:
  239. For type CHARACTER, be prepared that the enumeration will comprise 256, rather 
  240. than 128, literals.  Similarly, for type FILE_MODE, be prepared for the added 
  241. literal APPEND_FILE.
  242.  
  243. ------------------------------------------------------------------------------
  244. |                                                                            |
  245. |                                                                            |
  246. |   if ASCII.DEL = CHARACTER'LAST then               -- (1)                  |
  247. |                -- always true in Ada 83 (until recently -- see explanation)|
  248. |                -- always false in Ada 9X                                   |
  249. |                                                                            |
  250. |   case CHAR is                                     -- (2)                  |
  251. |                -- illegal in Ada 9X, since not all choices are covered     |
  252. |      when CHARACTER'VAL(0) .. CHARACTER'VAL(63) => ...;                    |
  253. |      when CHARACTER'VAL(64) .. CHARACTER'VAL(127) => ...;                  |
  254. |   end case;                                                                |
  255. |                                                                            |
  256. |   subtype ASCII_CHARACTER is CHARACTER                                     |
  257. |           range ASCII.NUL ... ASCII.DEL;           -- (3)                  |
  258. |                                                                            |
  259. |   case ASCII_CHARACTER'(CHAR) is                   -- (4)                  |
  260. |                -- legal in both Ada 83 and Ada 9X                          |
  261. |      when CHARACTER'VAL(0) .. CHARACTER'VAL(63) => ...;                    |
  262. |      when CHARACTER'VAL(64) .. CHARACTER'VAL(127) => ...;                  |
  263. |   end case;                                                                |
  264. |                                                                            |
  265. |   case CHAR is                                     -- (5)                  |
  266. |                -- legal in both Ada 83 and Ada 9X                          |
  267. |      when CHARACTER'VAL(0) .. CHARACTER'VAL(63) => ...;                    |
  268. |      when CHARACTER'VAL(64) .. CHARACTER'VAL(127) => ...;                  |
  269. |      when others => ... ;  -- Ada 9X alternative                           |
  270. |   end case;                                                                |
  271. |                                                                            |
  272. |   type GOOD_CHAR_TABLE is array(CHARACTER) of INTEGER;                     |
  273. |   type BAD_CHAR_TABLE is array(0..127) of INTEGER;                         |
  274. |   GOOD_TT: GOOD_CHAR_TABLE;                                                |
  275. |   BAD_TT: BAD_CHAR_TABLE;                                                  |
  276. |                                                                            |
  277. |   for CHR in GOOD_TT'RANGE loop                                            |
  278. |       GOOD_TT(CHR) := ....;                        -- (6)                  |
  279. |   end loop;                                                                |
  280. |                                                                            |
  281. |   for CHR in CHARACTER'FIRST .. CHARACTER'LAST loop                        |
  282. |       BAD_TT(CHARACTER'POS(CHR)) := ....;          -- (7)                  |
  283. |   end loop;                                                                |
  284. |                                                                            |
  285. |                                                                            |
  286. |           Figure 2:  Examples of Character Set (In)compatibilities         |
  287. |                                                                            |
  288. ------------------------------------------------------------------------------
  289.  
  290. These changes have two major consequences:
  291.  
  292.       -     The 'LAST attribute applied to type CHARACTER (or any of its 
  293.             derived types) will yield a value with an encoding of 255 rather 
  294.             than 127.  See the example (1) in Figure 2.  Similarly, 
  295.             FILE_MODE'LAST will now yield APPEND_FILE.  Whether this impacts 
  296.             an algorithm, depends entirely on the programmer's assumptions.  
  297.             If the assumption was to obtain truly the last character in the 
  298.             enumeration, regardless of its encoding, the code will still 
  299.             operate as intended.  If the specific value is important, the 
  300.             explicit literal (or a declared constant) should be used in lieu 
  301.             of the attribute.  An analogous reasoning applies to the 'RANGE 
  302.             attribute applied to arrays with such index types or to any 
  303.             implicit assumptions about the magnitude of the enumeration.  
  304.             Examples (6) and (7) in Figure 2 show how Ada 83 code will (not) 
  305.             be upward compatible.  The loop (7) will result in a 
  306.             CONSTRAINT_ERROR in Ada 9X, besides being poor style in Ada 83.
  307.  
  308.       -     Case statements over expressions of such types need to account for 
  309.             the possible choices added by Ada 9X.  Otherwise the statements 
  310.             will be illegal in Ada 9X.  Since a superfluous others or an empty 
  311.             range choice is legal in Ada, case statements, whose choices do 
  312.             not already cover all values permitted by Ada 9X should be written 
  313.             with such an added choice.  Alternatively, one can also qualify 
  314.             the case expression with a static subtype, reflecting the Ada 83 
  315.             range of types CHARACTER and FILE_MODE, respectively.  Examples 
  316.             (2) through (5) in Figure 2 illustrate the situation.  The choice 
  317.             of solution will depend on the circumstances.  If the algorithm is 
  318.             guaranteed to be applied only to the first 128 characters, 
  319.             qualified expressions should be used, as shown by example (4).  
  320.             Otherwise, the modification of example (5) should be applied after 
  321.             giving thought to programming the Ada 9X branch of the case 
  322.             statement.  An addition of the form
  323.  
  324.                         when others => null;
  325.  
  326.             is almost certainly the wrong solution.
  327.  
  328. ISO/IEC JTC1/SC22 WG9, the group chartered to issue interpretations of the 
  329. existing Ada standard, has recently voted to permit this definitional change 
  330. of type CHARACTER in Ada 83 implementations.  Consequently, this problem could 
  331. already arise with the next release of an Ada 83 compiler, rather than with an 
  332. Ada 9X compiler, when the change becomes mandatory.
  333.  
  334. For existing programs, the necessary changes are somewhat problematic, since 
  335. they are not easily found by syntactic searches, nor is it easy to determine 
  336. whether or not the intent of the algorithms is affected by the language 
  337. change.
  338.  
  339. Fortunately, for the large class of programs that are intended and guaranteed 
  340. to deal only with the ASCII character set even after Ada 9X has been adopted, 
  341. there is a very simple guideline that prevents the incompatibility.  Rather 
  342. than using the type CHARACTER, such programs should define a subtype of 
  343. CHARACTER, as shown in example (3) of figure 2, and consistently use this 
  344. subtype in lieu of type CHARACTER.  In Ada 83, this subtype encompasses all 
  345. values of type CHARACTER; in Ada 9X, it will ensure the constraint to the 
  346. ASCII characters.  None of the above compatibility problems arise.  Similarly, 
  347. for existing such programs, a global substitution of CHARACTER by the subtype 
  348. name and the addition of suitable context-clauses to make the subtype name 
  349. visible renders the programs upward compatible with Ada 9X.
  350.  
  351. For type FILE_MODE, an analogous approach is complicated by the fact that 
  352. multiple instantiations of SEQUENTIAL_IO yield different such types.  It is 
  353. probably easier to correct the few places in the code, where the expansion of 
  354. the enumeration type makes any difference.
  355.  
  356. Guideline 6:
  357. Do not use accuracy constraints in subtype declarations.
  358.  
  359. Accuracy constraints in subtype declarations will be removed from the 
  360. language.  It is surmised that all existing Ada implementations simply ignore 
  361. such subtype constraints, computing and storing results in the accuracy of the 
  362. respective type, anyhow.
  363.  
  364. In existing programs, such accuracy constraints should be removed.  They can 
  365. be found via editor scripts or syntactic searches.  In an example adapted from 
  366. the Ada Reference Manual [4],
  367.  
  368.             type VOLT is delta 0.125 range 0.0 .. 255.0;
  369.             subtype ROUGH_VOLTAGE is VOLT delta 1.0 range 0.0 .. 100.0;
  370.  
  371. should be replaced with
  372.  
  373.             type VOLT is delta 0.125 range 0.0 .. 255.0;
  374.             subtype ROUGH_VOLTAGE is VOLT range 0.0 .. 100.0;
  375.  
  376. Guideline 7:
  377. Put representation clauses for real types immediately after the type 
  378. declaration.
  379.  
  380. Ada 9X solves an obscure problem in Ada 83 by mandating that such 
  381. representation clauses be given before any subtypes or derived types of the 
  382. given type are declared.
  383.  
  384. In existing programs, once the situation is identified, the correction is very 
  385. simple: merely move the representation clause to precede the subtype or 
  386. derived type declarations.
  387.  
  388. Guideline 8:
  389. All library unit packages must have bodies, even if such bodies are empty.
  390.  
  391. Ada 83 allows the omission of packages bodies if none is needed to complete 
  392. the specification.  A usage problem results, since library unit bodies that 
  393. are semantically optional, but vital to the functioning of the program, are 
  394. omitted from executables, when they happen to be obsolete.  Ada 9X mandates 
  395. the existence of previously optional bodies for library units to eliminate 
  396. this usage problem.  Users should therefore add such empty bodies, e.g.,
  397.  
  398.             package body <name> is end <name>;
  399.  
  400. in the source files after the package specification.
  401.  
  402. For existing programs, simple Ada library queries provide the necessary 
  403. information to produce these bodies.
  404.  
  405. Guideline 9:
  406. Do not derive from a type declared in the same package.  Or, if you do, derive 
  407. the new types before redefining any predefined operations on the parent type.
  408.  
  409. ------------------------------------------------------------------------------
  410. |                                                                            |
  411. |                                                                            |
  412. |    package DERIVATIONS is                                                  |
  413. |                                                                            |
  414. |        type BYTE is array (0..7) of BOOLEAN;                               |
  415. |        function "and"(L,R: BYTE) return BYTE;                              |
  416. |              -- redefine "and" for whatever reason                         |
  417. |                                                                            |
  418. |        type CHAR is new BYTE;                                              |
  419. |              -- in Ada 83, this type inherits the predefined "and"         |
  420. |              -- in Ada 9X, this type inherits the redefined "and" of Byte  |
  421. |                                                                            |
  422. |    end DERIVATIONS;                                                        |
  423. |                                                                            |
  424. |                                                                            |
  425. |            Figure 3:  Inheritance of Operations for Derived Types          |
  426. |                                                                            |
  427. |                                                                            |
  428. ------------------------------------------------------------------------------
  429.  
  430. In Ada 83, subprograms become derivable only at the end of the visible part of 
  431. the package in which the type is declared.  In Ada 9X, they are immediately 
  432. derivable.  As shown in Figure 3, a sequence of declarations, interspersing 
  433. redefinitions of pre-defined operations with derived type declarations yields 
  434. different definitions of these operations for the derived type.  The guideline 
  435. avoids this situation, which has surprised many first-time Ada users.  (Note 
  436. that deriving from a derived type in the same package is already illegal in 
  437. Ada 83.  The situation therefore arises only if the parent type is declared by 
  438. means of a type definition.)
  439.  
  440. In existing programs, these situations can best be identified by searching for 
  441. redefinitions of pre-defined operations, which should be relatively rare, and 
  442. inspecting the context of these redefinitions for subsequent derived type 
  443. declarations.  If such situations are found, a simple reordering of the 
  444. declarations makes the programs upward compatible.
  445.  
  446. Guideline 10:
  447. Add a distinctive comment to all generic formal private types that can be 
  448. legally instantiated with unconstrained types.
  449.  
  450. In Ada 83, the instantiation of a generic with an unconstrained type can be 
  451. illegal, depending on the use of the type in the generic unit, e.g., in an 
  452. object declaration.  In Ada 9X, this instantiation will always be illegal, 
  453. unless the formal type is identified as one that can be instantiated with an 
  454. unconstrained type (in which case, the instantiation will always be legal, and 
  455. the generic must not contain conflicting uses of the type).  Ada 9X uses the 
  456. box notation for this purpose.  See Figure 4 for an example.  The legality of 
  457. the instantiation (1) will depend on the use of type X in the body of 
  458. 'Ada_83'.
  459.  
  460. This is the single instance, where Ada 83 code cannot be written to be upward 
  461. compatible with Ada 9X.  Consequently, we recommend the use of a distinctive 
  462. comment convention, as shown at the beginning of the example, so that, upon 
  463. transition to Ada 9X, the necessary source changes are easily located and 
  464. made.
  465.  
  466. ------------------------------------------------------------------------------
  467. |                                                                            |
  468. |                                                                            |
  469. |    generic                                                                 |
  470. |       type X is private;        --Ada 9X: add (<>)                         |
  471. |    procedure Ada_83;                                                       |
  472. |                                                                            |
  473. |    type SHORT_STRING is new STRING(1..8);                                  |
  474. |                                                                            |
  475. |    procedure GOOD_ONE is new Ada_83(SHORT_STRING);                         |
  476. |                                                                            |
  477. |    procedure DUBIOUS_ONE is new Ada_83(STRING);                            |
  478. |           -- may be illegal in Ada 83, depending on generic body in Ada_83 |
  479. |           -- will always be illegal in Ada 9X                              |
  480. |                                                                            |
  481. |    generic                                                                 |
  482. |       type X(<>) is private;         -- Ada 9X notation; illegal in Ada 83 |
  483. |    procedure Ada_9X;                                                       |
  484. |                                                                            |
  485. |    procedure BETTER_ONE is new Ada_9X(STRING);        -- always legal      |
  486. |                                                                            |
  487. |                                                                            |
  488. |              Figure 4:  Instantiations with Unconstrained Types            |
  489. |                                                                            |
  490. |                                                                            |
  491. ------------------------------------------------------------------------------
  492.  
  493. For existing programs, there is a mechanical method of establishing whether or 
  494. not such a comment should be added: Identify all generic units with formal 
  495. private types and instantiate them with unconstrained types.  All such 
  496. instantiations not rejected by the Ada 83 compilation system (possibly at link 
  497. time) are candidates to be commented as indicated.
  498.  
  499. Guideline 11:
  500. Do not assume "too much" about the state of the computation when exceptions 
  501. are implicitly raised.  Do not cause implicit exceptions knowingly.  Be 
  502. prepared for the elimination of the exception NUMERIC_ERROR.
  503.  
  504. Software engineers generally agree that knowingly utilizing implicitly raised 
  505. exceptions as a control flow mechanism is a highly dubious practice.  The 
  506. interpretation of Ada 83 regarding the execution order in the presence of 
  507. implicitly raised exceptions is far from clear.  Efficient support of RISC, 
  508. pipe-lined, super-scalar, and massively parallel architectures makes it 
  509. necessary to deviate from a purely sequential execution model.  Ada 9X is 
  510. likely to better codify permission for such support by compilers.
  511.  
  512. Consequently, users should not rely in their algorithms on the specific point 
  513. in the sequential execution order where an implicit exception may get raised.  
  514. A good, although over-conservative, guideline is to assume that, in any 
  515. exception frame, the raising of implicit exceptions may occur as early as the 
  516. beginning of the frame or as late as the end of the frame, regardless of where 
  517. the exception occurs in the sequential execution order.
  518.  
  519. This guideline applies already to Ada 83 code, regardless of Ada 9X.  Yet, it 
  520. will avoid additional surprises when upgrading the code to Ada 9X.
  521.  
  522. In some situations, where Ada 83 mandates the raising of CONSTRAINT_ERROR, the 
  523. semantics of Ada 9X will cause the "expected" result, rather than an 
  524. exception.  Since all these (three) cases are at the fringes of the language 
  525. usage, and since programmers should not cause CONSTRAINT_ERROR intentionally, 
  526. they are not worth a guideline.
  527.  
  528. Ada 9X is very likely to eliminate the exception NUMERIC_ERROR from the 
  529. language definition.  An official Ada 83 interpretation advises non-bindingly 
  530. that Ada 83 implementations should use CONSTRAINT_ERROR instead of 
  531. NUMERIC_ERROR.  Users whose compilers already adhere to this interpretation, 
  532. should cease to reference NUMERIC_ERROR.  In existing programs, the name 
  533. should be deleted from exception choices or replaced by CONSTRAINT_ERROR, as 
  534. appropriate.  For users, whose Ada 83 compilers do not adhere to this 
  535. non-binding interpretation, the situation is more difficult.  It would be best 
  536. to apply the above source modification at the time of transition to Ada 9X.  
  537. (There is an upward compatible alternative described in [1], involving the 
  538. introduction of a superfluous user-defined NUMERIC_ERROR exception in a 
  539. separate package to be imported into all contexts that reference 
  540. NUMERIC_ERROR.  However, we hesitate to recommend this approach, since it 
  541. certainly is confusing to the reader of the program.)
  542.  
  543. Guideline 12 (Numerics):
  544. Be prepared for attribute values of real types to more closely reflect the 
  545. actual type representation.  Be aware that accuracy requirements for 
  546. operations combining fixed-point types with differently based 'SMALL may be 
  547. lessened.
  548.  
  549. For the casual user of real types, these language changes are most unlikely to 
  550. have any impact.  In particular, users of the predefined floating-point types 
  551. should have no problems in upgrading to Ada 9X.  For numeric applications that 
  552. parameterize algorithms by means of real type attributes, however, the changes 
  553. to attribute values may have some effect, albeit a positive one, since such 
  554. applications are presumably interested in more accurate attribute values.  
  555. (For example, it is proposed that the attribute 'SMALL return the actual 
  556. smallest representation increment, rather than the increment between model 
  557. numbers.)  Such code is typically written by numerical analysts, who as a 
  558. group have requested these changes to be made to Ada 83.  The reduced accuracy 
  559. requirements for operations combining fixed-point types with differently based 
  560. scales is unlikely to have any significant impact, because such operations are 
  561. exceedingly rare.  Also, many Ada 83 compilers support only binary and decimal 
  562. 'SMALLs, thereby making it rather unlikely that existing code applies such 
  563. operations and rely on the accuracy required in Ada 83.
  564.  
  565.                                   4.  Summary
  566.  
  567. Most of the incompatibilities and guidelines arise from language changes 
  568. proposed to correct Ada 83 problems.  Some of the incompatibilities are so 
  569. specialized that the probability of encountering them is minimal.  To many 
  570. users, the primary practical incompatibility will be the mandatory presence of 
  571. library unit bodies.
  572.  
  573. The given guidelines address virtually all of the known incompatibilities, 
  574. thus providing for Ada 9X compatible Ada 83 code.  Only the incompatibility 
  575. discussed by Guideline 10 (generics instantiated with unconstrained types) 
  576. and, depending on the Ada 83 compiler implementation, the disappearance of the 
  577. exception NUMERIC_ERROR cannot be addressed in today's Ada 83 code.
  578.  
  579. For most incompatibilities, locating their occurrence can be largely automated 
  580. and the corrections needed are straightforward.  Only the incompatibility 
  581. avoided by Guideline 5 does not fit this description; yet it is a necessary 
  582. consequence of allowing for 8-bit character representations and the capability 
  583. to append to files.  Still, there is a simple guideline to ensure 
  584. compatibility for all those programs that will be exposed only to ASCII 
  585. character input.
  586.  
  587. Finally we advice that users intending to upgrade to Ada 9X should obtain 
  588. early releases of Ada 9X compilers (e.g., the freely available GNU-Ada 
  589. implementation, to be released in late 1993) to check their Ada 83 code for 
  590. upward compatibility problems.
  591.  
  592.                                Acknowledgements
  593.  
  594. The incompatibilities addressed by the presented guidelines were originally 
  595. identified and documented by the Ada 9X Mapping Team at Intermetrics.  Many of 
  596. the guidelines are but an update and repackaging of information contained in 
  597. the original publication [1].  I appreciate the comments from several 
  598. reviewers of an earlier draft of this paper, in particular Bryce Bardin, Bob 
  599. Duff, Art Evans, and Philippe Kruchten, who helped to improve the guidelines 
  600. and the presentation.
  601.  
  602.                                  Bibliography
  603.  
  604. [1] Ada 9X Mapping Document, Volume I, Mapping Rationale, Version 4.1., Office 
  605. of the Under Secretary of Defense for Acquisition, US Department of Defense, 
  606. March 1992.
  607.  
  608. [2] Ada 9X Mapping Document, Volume II, Mapping Specification, Version 4.0., 
  609. Office of the Under Secretary of Defense for Acquisition, US Department of 
  610. Defense, December 1991.
  611.  
  612. [3] Ada 9X Mapping Document, Volume II, Mapping Specification, Annexes, 
  613. Version 4.0., Office of the Under Secretary of Defense for Acquisition, US 
  614. Department of Defense, March 1992.
  615.  
  616. [4] Reference Manual for the Ada Programming Language, 
  617. ANSI/MIL-STD-1815A-1983, US Department of Defense, February 17, 1983.
  618.  
  619.                             **********************
  620.  
  621.                           Reprinted with permission.
  622.  
  623.                      Ada Information Clearinghouse (AdaIC)
  624.                                 P.O. Box 46593
  625.                           Washington, DC  20050-6593
  626.                  703/685-1477, 800/AdaIC-11, FAX 703/685-7019
  627.                 adainfo@ajpo.sei.cmu.edu; CompuServe 70312,3303
  628.  
  629. The AdaIC is sponsored by the Ada Joint Program Office and operated by IIT 
  630. Research Institute.
  631.  
  632.  
  633.  
  634.  
  635.