• PL/I machine independence

    From Peter Flass@21:1/5 to All on Sat Nov 7 11:45:12 2020
    (Sorry, I lost the context on this post)

    PL/I put a great deal more effort into making data declarations
    universal, by specifying exact precisions, >blocking machine-dependent mappings (such as character string over binary integer) and the like. Of course, >this is largely a dead issue today, since two's-complement
    integers of size 2^n bits, IEEE floating point, and >Unicode have largely eaten the world. Compare that to the madness in IBM’s eight pre-360
    product families >alone.

    Of course there were problems with this, also. It was vey simple to shoot yourself in the foot and code something the machine didn’t support. I think multicians.org has a story about how a misaligned structure caused
    horrendous inefficiency. Something as simple as reorganizing the fields
    (forgot the details) solved the problem.

    --
    Pete

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)
  • From David W Noon@21:1/5 to All on Sat Nov 7 20:22:01 2020
    -----BEGIN PGP SIGNED MESSAGE-----
    Hash: SHA1

    On Sat, 7 Nov 2020 11:45:12 -0700, Peter Flass <peter_flass@yahoo.com>
    wrote about PL/I machine independence:

    (Sorry, I lost the context on this post)

    It was posted by John W. Kennedy, with whom I used to exchange
    messages on the old IBM PC Co. BBS in Atlanta, more than 25 years ago.

    PL/I put a great deal more effort into making data declarations
    universal, by specifying exact precisions, >blocking
    machine-dependent mappings (such as character string over binary
    integer) and the like. Of course, >this is largely a dead issue
    today, since two's-complement integers of size 2^n bits, IEEE
    floating point, and >Unicode have largely eaten the world.
    Compare that to the madness in IBM’s eight pre-360 product
    families >alone.

    Of course there were problems with this, also. It was vey simple to
    shoot yourself in the foot and code something the machine didn’t
    support. I think multicians.org has a story about how a misaligned
    structure caused horrendous inefficiency. Something as simple as
    reorganizing the fields (forgot the details) solved the problem.

    MULTICS ran on the GE-645 and its descendants. These were 36-bit word addressable machines that distinguished between bytes and characters.
    Accessing bytes and characters within words required either tally
    driver words or Extended Instruction Set (EIS) instructions. These
    suffered some serious performance issues -- tally driver words were excruciatingly slow. Consequently, aligning data items within
    structures was of paramount importance.

    [For the curious: a byte was a 9-bit field that held an ASCII or
    EBCDIC character with a visible parity bit (if wanted), while a
    character was a 6-bit field holding a GBCD or HBCD character.]

    Misaligned data items were a bane to both PL/I and COBOL programmers
    on the GE-600 series hardware architecture.
    - --
    Regards,

    Dave [RLU #314465] *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-* dwnoon@spamtrap.ntlworld.com (David W Noon)
    Remove spam trap to reply by e-mail. *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-* -----BEGIN PGP SIGNATURE-----

    iF0EARECAB0WIQQoGlOWdIo5yd+vdBb0yppQlDDYyQUCX6cB3QAKCRD0yppQlDDY yT8IAJ94WPlWvgO/LbZDOIepu9hp8wG7KgCgkmPlv7AwQttIMVx0odaig5Ph96s=
    =Ib4V
    -----END PGP SIGNATURE-----

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)
  • From John W Kennedy@21:1/5 to Peter Flass on Sat Nov 7 20:15:39 2020
    On 11/7/20 1:45 PM, Peter Flass wrote:
    (Sorry, I lost the context on this post)

    PL/I put a great deal more effort into making data declarations
    universal, by specifying exact precisions, >blocking machine-dependent
    mappings (such as character string over binary integer) and the like. Of
    course, >this is largely a dead issue today, since two's-complement
    integers of size 2^n bits, IEEE floating point, and >Unicode have largely
    eaten the world. Compare that to the madness in IBM’s eight pre-360
    product families >alone.

    Of course there were problems with this, also. It was vey simple to shoot yourself in the foot and code something the machine didn’t support. I think multicians.org has a story about how a misaligned structure caused
    horrendous inefficiency. Something as simple as reorganizing the fields (forgot the details) solved the problem.


    COBOL had the same problem; it really follows logically in any language
    that has structures, though newer languages, from C to Swift, seem
    simply to ignore it—I suppose it’s just assumed that everything gets aligned willy-nilly. (And, of course, PL/I is the only language that has bitstrings, which are where the effects of unalighment are most hideous.

    --
    John W. Kennedy
    "The blind rulers of Logres
    Nourished the land on a fallacy of rational virtue."
    -- Charles Williams. "Taliessin through Logres: Prelude"

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)
  • From Robin Vowels@21:1/5 to John W. Kennedy on Sat Nov 7 19:09:33 2020
    On Sunday, November 8, 2020 at 12:15:45 PM UTC+11, John W. Kennedy wrote:
    On 11/7/20 1:45 PM, Peter Flass wrote:
    (Sorry, I lost the context on this post)

    PL/I put a great deal more effort into making data declarations
    universal, by specifying exact precisions, >blocking machine-dependent
    mappings (such as character string over binary integer) and the like. Of >> course, >this is largely a dead issue today, since two's-complement
    integers of size 2^n bits, IEEE floating point, and >Unicode have largely >> eaten the world. Compare that to the madness in IBM’s eight pre-360
    product families >alone.

    Of course there were problems with this, also. It was vey simple to shoot yourself in the foot and code something the machine didn’t support. I think
    multicians.org has a story about how a misaligned structure caused horrendous inefficiency. Something as simple as reorganizing the fields (forgot the details) solved the problem.

    COBOL had the same problem; it really follows logically in any language
    that has structures, though newer languages, from C to Swift, seem
    simply to ignore it—I suppose it’s just assumed that everything gets aligned willy-nilly. (And, of course, PL/I is the only language that has bitstrings, which are where the effects of unalighment are most hideous.
    .
    XPL has bit strings.

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)
  • From Robin Vowels@21:1/5 to John W. Kennedy on Sat Nov 7 18:49:31 2020
    On Sunday, November 8, 2020 at 12:15:45 PM UTC+11, John W. Kennedy wrote:
    On 11/7/20 1:45 PM, Peter Flass wrote:
    (Sorry, I lost the context on this post)

    PL/I put a great deal more effort into making data declarations
    universal, by specifying exact precisions, >blocking machine-dependent
    mappings (such as character string over binary integer) and the like. Of >> course, >this is largely a dead issue today, since two's-complement
    integers of size 2^n bits, IEEE floating point, and >Unicode have largely >> eaten the world. Compare that to the madness in IBM’s eight pre-360
    product families >alone.

    Of course there were problems with this, also. It was vey simple to shoot yourself in the foot and code something the machine didn’t support. I think
    multicians.org has a story about how a misaligned structure caused horrendous inefficiency. Something as simple as reorganizing the fields (forgot the details) solved the problem.

    COBOL had the same problem; it really follows logically in any language
    that has structures, though newer languages, from C to Swift, seem
    simply to ignore it—I suppose it’s just assumed that everything gets aligned willy-nilly. (And, of course, PL/I is the only language that has bitstrings, which are where the effects of unalighment are most hideous.

    In PL/I, bit strings may be ALIGNED and UNALIGNED.
    For performance on machines that do not have bit addressability,
    ALIGNED should be specified.

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)
  • From Robin Vowels@21:1/5 to David W Noon on Sat Nov 7 20:42:16 2020
    On Sunday, November 8, 2020 at 7:22:02 AM UTC+11, David W Noon wrote:

    On Sat, 7 Nov 2020 11:45:12 -0700, Peter Flass <p......@yahoo.com>
    wrote about PL/I machine independence:
    (Sorry, I lost the context on this post)
    It was posted by John W. Kennedy, with whom I used to exchange
    messages on the old IBM PC Co. BBS in Atlanta, more than 25 years ago.
    PL/I put a great deal more effort into making data declarations
    universal, by specifying exact precisions, >blocking
    machine-dependent mappings (such as character string over binary
    integer) and the like. Of course, >this is largely a dead issue
    today, since two's-complement integers of size 2^n bits, IEEE
    floating point, and >Unicode have largely eaten the world.
    Compare that to the madness in IBM’s eight pre-360 product
    families >alone.

    Of course there were problems with this, also. It was vey simple to
    shoot yourself in the foot and code something the machine didn’t support. I think multicians.org has a story about how a misaligned structure caused horrendous inefficiency. Something as simple as reorganizing the fields (forgot the details) solved the problem.
    .
    MULTICS ran on the GE-645 and its descendants. These were 36-bit word addressable machines that distinguished between bytes and characters. Accessing bytes and characters within words required either tally
    driver words or Extended Instruction Set (EIS) instructions.
    .
    There was nothing unusual about this for word machines. Burroughs
    had 4-bit, 6-bit, and 8-bit fields [I think] in their 6000 series.
    .
    On one early word machine on which I worked, we had 4-bit BCD,
    5-bit alphabetic characters, and 6-bit characters.
    On the CDC Cyber 70 series, characters were 6 bits. The lower models
    had a character unit fitted, that could address at character level.
    The top model(s) could not have the character unit fitted. (so much
    for upwards compatibility). When our machine was "upgraded" by
    replacing it with a CDC 7600 it did not have a character unit, so all the character-handling in my optimising PL/I compiler had to be re-written
    to do the usual shifting and masking to move & compare character strings,
    etc.
    .
    These
    suffered some serious performance issues -- tally driver words were excruciatingly slow. Consequently, aligning data items within
    structures was of paramount importance.

    [For the curious: a byte was a 9-bit field that held an ASCII or
    EBCDIC character with a visible parity bit (if wanted), while a
    character was a 6-bit field holding a GBCD or HBCD character.]

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)
  • From Richard L. Hamilton@21:1/5 to John W Kennedy on Sun Dec 6 04:27:29 2020
    In article <R9SdnWtaNL0m2zrCnZ2dnUU7-L3NnZ2d@giganews.com>,
    John W Kennedy <john.w.kennedy@gmail.com> writes:
    On 11/7/20 1:45 PM, Peter Flass wrote:
    (Sorry, I lost the context on this post)

    PL/I put a great deal more effort into making data declarations
    universal, by specifying exact precisions, >blocking machine-dependent
    mappings (such as character string over binary integer) and the like. Of >>> course, >this is largely a dead issue today, since two's-complement
    integers of size 2^n bits, IEEE floating point, and >Unicode have largely >>> eaten the world. Compare that to the madness in IBM’s eight pre-360
    product families >alone.

    Of course there were problems with this, also. It was vey simple to shoot
    yourself in the foot and code something the machine didn’t support. I think
    multicians.org has a story about how a misaligned structure caused
    horrendous inefficiency. Something as simple as reorganizing the fields
    (forgot the details) solved the problem.


    COBOL had the same problem; it really follows logically in any language
    that has structures, though newer languages, from C to Swift, seem
    simply to ignore it—I suppose it’s just assumed that everything gets aligned willy-nilly. (And, of course, PL/I is the only language that has bitstrings, which are where the effects of unalighment are most hideous.

    C (and compatibles) can have padding in a structure for alignment.
    The actual size of a structure includes sufficient padding so that
    each of an array of structures would be aligned. You can order your
    fields with the most stringent alignment requirements first, and
    probably minimize interior padding, but odds are there will be some
    padding at the end. Some compilers may provide additional magic for
    unaligned where that's supported (if with some performance hit), but
    they don't have to, and magic isn't portable without lots of conditional preprocessor directives. If you really want a portable external form, you
    end up using some library that will convert to a standardized
    serialized form. Java definitely includes such capabilities; but
    libraries like XDR (part of ONC/RPC aka SunRPC) can perform a similar
    function for C, etc.

    But the whole point of a low-level language is that it's up to you to NOT
    shoot yourself in the foot. If you want both performance and a portable external representation, except for Java you're going to have to work at it
    a little. And in C (and C++ etc) in particular, most types don't necessarily have a portable size, except that char is pretty much always an 8-bit byte nowadays, and sizeof(long long) >= sizeof(long) >= sizeof(int) >= sizeof(short).
    ILP32 (ints, longs, and pointers all 32-bit) is common on 32-bit systems, and LP64 (longs and pointers 64-bit) is common on 64-bit systems, but other arrangements are possible.

    Unfortunately, C does not natively support BCD (which can be better when you want to avoid rounding errors in the decimal representation), although it
    can be done with an appropriate library...which makes every operation a function call. C++ can at least provide the syntactic sugar to hide such details.

    --
    get |fortune
    377 I/O error: smart remark generator failed

    Bogonics: the primary language inside the Beltway

    Lasik/PRK theme music:
    "In the Hall of the Mountain King", from "Peer Gynt"
    (read act 2, scene 6 of the play if that doesn't make sense)

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)
  • From Robin Vowels@21:1/5 to Richard L. Hamilton on Sun Dec 6 02:11:14 2020
    On Sunday, December 6, 2020 at 3:27:31 PM UTC+11, Richard L. Hamilton wrote:
    In article <R.....@giganews.com>,
    John W Kennedy <j.....@gmail.com> writes:
    On 11/7/20 1:45 PM, Peter Flass wrote:
    (Sorry, I lost the context on this post)

    PL/I put a great deal more effort into making data declarations
    universal, by specifying exact precisions, >blocking machine-dependent >>> mappings (such as character string over binary integer) and the like. Of >>> course, >this is largely a dead issue today, since two's-complement
    integers of size 2^n bits, IEEE floating point, and >Unicode have largely
    eaten the world. Compare that to the madness in IBM’s eight pre-360 >>> product families >alone.

    Of course there were problems with this, also. It was vey simple to shoot >> yourself in the foot and code something the machine didn’t support. I think
    multicians.org has a story about how a misaligned structure caused
    horrendous inefficiency. Something as simple as reorganizing the fields >> (forgot the details) solved the problem.


    COBOL had the same problem; it really follows logically in any language that has structures, though newer languages, from C to Swift, seem
    simply to ignore it—I suppose it’s just assumed that everything gets aligned willy-nilly. (And, of course, PL/I is the only language that has bitstrings, which are where the effects of unalighment are most hideous.
    .
    C (and compatibles) can have padding in a structure for alignment.
    .
    So can PL/I.
    .
    The actual size of a structure includes sufficient padding so that
    each of an array of structures would be aligned. You can order your
    fields with the most stringent alignment requirements first, and
    probably minimize interior padding, but odds are there will be some
    padding at the end. Some compilers may provide additional magic for unaligned where that's supported (if with some performance hit), but
    they don't have to, and magic isn't portable without lots of conditional preprocessor directives. If you really want a portable external form, you end up using some library that will convert to a standardized
    serialized form. Java definitely includes such capabilities; but
    libraries like XDR (part of ONC/RPC aka SunRPC) can perform a similar function for C, etc.

    But the whole point of a low-level language is that it's up to you to NOT shoot yourself in the foot.
    .
    As it is with any language, high or low.
    .
    If you want both performance and a portable.
    external representation, except for Java you're going to have to work at it a little. And in C (and C++ etc) in particular, most types don't necessarily have a portable size, except that char is pretty much always an 8-bit byte nowadays, and sizeof(long long) >= sizeof(long) >= sizeof(int) >= sizeof(short).
    ILP32 (ints, longs, and pointers all 32-bit) is common on 32-bit systems, and
    LP64 (longs and pointers 64-bit) is common on 64-bit systems, but other arrangements are possible.

    Unfortunately, C does not natively support BCD (which can be better when you want to avoid rounding errors in the decimal representation), although it can be done with an appropriate library...

    Why bother? PL/I has BCD.
    .
    which makes every operation a
    function call. C++ can at least provide the syntactic sugar to hide such details.

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)
  • From Richard L. Hamilton@21:1/5 to Robin Vowels on Tue Dec 15 02:20:01 2020
    In article <c350a8ba-7489-465d-891e-9c73cf6214aen@googlegroups.com>,
    Robin Vowels <robin.vowels@gmail.com> writes:
    On Sunday, December 6, 2020 at 3:27:31 PM UTC+11, Richard L. Hamilton wrote=
    :
    In article <R.....@giganews.com>,
    John W Kennedy <j.....@gmail.com> writes:=20
    On 11/7/20 1:45 PM, Peter Flass wrote:=20
    (Sorry, I lost the context on this post)=20
    =20
    PL/I put a great deal more effort into making data declarations=20
    universal, by specifying exact precisions, >blocking machine-dependen=
    t=20
    mappings (such as character string over binary integer) and the like.=
    Of=20
    course, >this is largely a dead issue today, since two's-complement=
    =20
    integers of size 2^n bits, IEEE floating point, and >Unicode have lar=
    gely=20
    eaten the world. Compare that to the madness in IBM=E2=80=99s eight p=
    re-360=20
    product families >alone.=20
    =20
    Of course there were problems with this, also. It was vey simple to sh=
    oot=20
    yourself in the foot and code something the machine didn=E2=80=99t sup=
    port. I think=20
    multicians.org has a story about how a misaligned structure caused=20
    horrendous inefficiency. Something as simple as reorganizing the field=
    s=20
    (forgot the details) solved the problem.=20
    =20
    =20
    COBOL had the same problem; it really follows logically in any language=
    =20
    that has structures, though newer languages, from C to Swift, seem=20
    simply to ignore it=E2=80=94I suppose it=E2=80=99s just assumed that ev=
    erything gets=20
    aligned willy-nilly. (And, of course, PL/I is the only language that ha=
    s=20
    bitstrings, which are where the effects of unalighment are most hideous=
    .
    .
    C (and compatibles) can have padding in a structure for alignment.=20
    .
    So can PL/I.
    .
    The actual size of a structure includes sufficient padding so that=20
    each of an array of structures would be aligned. You can order your=20
    fields with the most stringent alignment requirements first, and=20
    probably minimize interior padding, but odds are there will be some=20
    padding at the end. Some compilers may provide additional magic for=20
    unaligned where that's supported (if with some performance hit), but=20
    they don't have to, and magic isn't portable without lots of conditional=
    =20
    preprocessor directives. If you really want a portable external form, you=
    =20
    end up using some library that will convert to a standardized=20
    serialized form. Java definitely includes such capabilities; but=20
    libraries like XDR (part of ONC/RPC aka SunRPC) can perform a similar=20
    function for C, etc.=20
    =20
    But the whole point of a low-level language is that it's up to you to NOT=
    =20
    shoot yourself in the foot.
    .
    As it is with any language, high or low.
    .
    If you want both performance and a portable.
    external representation, except for Java you're going to have to work at =
    it=20
    a little. And in C (and C++ etc) in particular, most types don't necessar=
    ily=20
    have a portable size, except that char is pretty much always an 8-bit byt=
    e=20
    nowadays, and sizeof(long long) >=3D sizeof(long) >=3D sizeof(int) >=3D s=
    izeof(short).=20
    ILP32 (ints, longs, and pointers all 32-bit) is common on 32-bit systems,=
    and=20
    LP64 (longs and pointers 64-bit) is common on 64-bit systems, but other=
    =20
    arrangements are possible.=20
    =20
    Unfortunately, C does not natively support BCD (which can be better when =
    you=20
    want to avoid rounding errors in the decimal representation), although it=
    =20
    can be done with an appropriate library...

    Why bother? PL/I has BCD.

    Not every system has a PL/I compiler. Too bad. Some things, like area variables,
    seem kind of cool to me. (one could create similar functionality in other languages, but I have yet to find a good implementation of what amounts to sub-allocation within a larger space)

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)
  • From Robert Prins@21:1/5 to Richard L. Hamilton on Tue Dec 15 13:05:02 2020
    On 2020-12-15 02:20, Richard L. Hamilton wrote:

    Not every system has a PL/I compiler. Too bad. Some things, like area variables,
    seem kind of cool to me. (one could create similar functionality in other languages, but I have yet to find a good implementation of what amounts to sub-allocation within a larger space)

    AREA variables are extremely useful, and in the last few years they've become even more useful thanks to two RFE's filled by yours truly,

    <https://www.ibm.com/developerworks/rfe/execute?use_case=viewRfe&CR_ID=31632> and <https://www.ibm.com/developerworks/rfe/execute?use_case=viewRfe&CR_ID=100073>

    which are especially effective when working with XML or JSON generated list and tree structures, instead of having to free these item by item, a simple "area = empty();" statement, which translates to just a single MVC removes the entire list/tree.

    And for what it's worth, it should be relatively easy to implement the equivalent of AREA variables in other languages, especially if you restrict yourself to only allocating consecutive chunks, which is what the "ALLOCNEXT" builtin does.

    AREA variables are preceded by a 16-byte area containing the start of a linked list that keeps track of the free chunks and a bit more:

    dcl 1 * union,
    2 my_area area (1000), /* Actual area */
    2 ar_ea, /* Internal structure */
    3 use_list bit (1), /* Free list in use */
    3 filler char (3),
    3 nab fixed bin (31), /* Next available byte */
    3 ffree fixed bin (31), /* Offset of first free byte */
    3 eol fixed bin (31), /* Always 0, end of free list */
    3 contents char (1000); /* Contents */

    "nab" and "ffree" are relative to the start of "contents". I'll see if I can find the small program I used the above in.

    Sadly, "ALLOCNEXT" returns "sysnull" is there is no space in the area, rather than signalling the "AREA" condition. If it would have done the latter, which I simulated in my code, the process of building lists/trees in "CONTROLLED" AREA variables could have been made even easier.

    Robert
    --
    Robert AH Prins
    robert(a)prino(d)org
    The hitchhiking grandfather - https://prino.neocities.org/indez.html
    Some REXX code for use on z/OS - https://prino.neocities.org/zOS/zOS-Tools.html

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)
  • From Peter Flass@21:1/5 to Robert Prins on Tue Dec 15 11:24:16 2020
    Robert Prins <robert@prino.org> wrote:
    On 2020-12-15 02:20, Richard L. Hamilton wrote:

    Not every system has a PL/I compiler. Too bad. Some things, like area variables,
    seem kind of cool to me. (one could create similar functionality in other
    languages, but I have yet to find a good implementation of what amounts to >> sub-allocation within a larger space)

    AREA variables are extremely useful, and in the last few years they've become even more useful thanks to two RFE's filled by yours truly,

    <https://www.ibm.com/developerworks/rfe/execute?use_case=viewRfe&CR_ID=31632> and <https://www.ibm.com/developerworks/rfe/execute?use_case=viewRfe&CR_ID=100073>

    which are especially effective when working with XML or JSON generated list and
    tree structures, instead of having to free these item by item, a simple "area =
    empty();" statement, which translates to just a single MVC removes the entire list/tree.

    And for what it's worth, it should be relatively easy to implement the equivalent of AREA variables in other languages, especially if you restrict yourself to only allocating consecutive chunks, which is what the "ALLOCNEXT" builtin does.

    AREA variables are preceded by a 16-byte area containing the start of a linked
    list that keeps track of the free chunks and a bit more:

    dcl 1 * union,
    2 my_area area (1000), /* Actual area */
    2 ar_ea, /* Internal structure */
    3 use_list bit (1), /* Free list in use */
    3 filler char (3),
    3 nab fixed bin (31), /* Next available byte */
    3 ffree fixed bin (31), /* Offset of first free byte */
    3 eol fixed bin (31), /* Always 0, end of free list */
    3 contents char (1000); /* Contents */

    "nab" and "ffree" are relative to the start of "contents". I'll see if I can find the small program I used the above in.

    Sadly, "ALLOCNEXT" returns "sysnull" is there is no space in the area, rather than signalling the "AREA" condition. If it would have done the latter, which I
    simulated in my code, the process of building lists/trees in "CONTROLLED" AREA
    variables could have been made even easier.


    Since Iron Spring PL/I doesn’t yet support AREA variables I rolled my own implementation for the compiler. It wasn’t actually difficult. The memory management code I ported for the Linux implementation supports
    suballocations in the original, although I haven’t implemented that yet.

    --
    Pete

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)