<div dir="ltr"><div dir="ltr"><div dir="ltr"><div><br></div><div>It is worth mentioning a few nice features of Oleg's system.</div><div><br></div><div>Ofront+ is based on ofront (by Josef Templ) and uses "C" as an intermediate language for code generation.</div><div><br></div><div>1) Portability. Using a C compiler as the back-end allows code to be compiled for a huge range of CPU architectures. Obviously Oberon easily works on modern 32/64 bit machines such as x86 or ARM. Ofront+ also supports 8-bit architectures (eg. Z80, 6502) found in vintage computers and embedded systems. This design also makes it easy to cross-compile from one architecture to another.</div><div><br></div><div>2) Optimisation. The C compiler back-end automatically gives you a huge range of standard optimisations - efficient register allocation, constant folding, code hoisting, common subexpression elimination, loop unrolling, function inlining. If you need your Oberon code to be fast, there is no better solution.</div><div><br></div><div>3) Foreign Code Interface. Most Oberon "Systems" tend to be self-contained, but if you are interested in writing stand-alone programs for conventional operating systems it is important to be able to use external software libraries. To call code written C or some other language, you need a way to declare foreign functions and data structures. In particular, the run-time needs to know which pointers are to be traced and managed by the garbage collector, and which pointers are unmanaged. This is done using system flags which apply to records, pointers, and arrays. For function declaration, Ofront+ includes the "code procedure" method from the original ofront implementation, but also adds a more general "external procedure" method, as found in Blackbox/Component Pascal.</div><div><br></div><div>To be honest, I was skeptical of the "code procedure" idea, which essentially declares a typed macro that is expanded when the call is compiled. These can be cumbersome to write, and in some cases must include explicit type casts. Then I realised that this allows *blazingly fast* maths operations using math.h/libm. In Ofront+ you can write the following, which causes the math.h sin() function to be called when Math.sin is invoked.</div><div><br></div><div>MODULE Math;    (* OMAKE LINK "m" *)</div><div>IMPORT C;</div><div>PROCEDURE -includeMath* "#include <math.h>";</div><div>PROCEDURE -sin*(x : C.double) : C.double "sin(x)";</div><div>PROCEDURE -cos*(x : C.double) : C.double "cos(x)";</div><div>..etc<br></div><div><br></div><div>There are rare cases where Math.sin might generate an external function call, but usually this call is aggressively optimised by the back end, even reducing to a single FSIN instruction. This is because the C compiler has deep knowledge about "builtin" functions declared in math.h. For example, if you need both Math.sin(x) and Math.cos(x) it will use the FSINCOS instruction to compute them both simultaneously.</div><div><br></div><div>4) Multi Language. In the past I used both Oberon-2 and Component Pascal. Returning to the Oberon world after some time, I was somewhat dismayed to find yet more incompatible dialects have arisen. While I accept that there are valid reasons for changing the language design, this is actually terrible for the community. It fragments users and their software into islands that cannot easily share code and experience, a modern Tower of Babel. Ofront+ partially solves this problem by allowing a single project to mix code from different Oberon dialects. This helps with code re-use, but also takes some of the risk out of choosing a particular dialect.</div><div><br></div><div>Cheers,</div><div>  Stewart</div><div><br></div><div><br></div></div></div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Fri, 30 Oct 2020 at 11:36, Oleg N. Cher <<a href="mailto:allot@bk.ru">allot@bk.ru</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-style:solid;border-left-color:rgb(204,204,204);padding-left:1ex">Dear Oberoners,<br>
<br>
I'm really surprised that many people here are hearing about Online <br>
Oberon for the first time. I've known about it for a long time.<br>
<br>
In order to inform the public, I want to tell you about my own fork of <br>
Josef Templ's project Ofront: <a href="https://github.com/jtempl/ofront/" rel="noreferrer" target="_blank">https://github.com/jtempl/ofront/</a><br>
<br>
Ofront+ is a direct continuation of the ideas embedded in the Ofront <br>
project. But it expands number of supported Oberon dialects:<br>
<br>
   Oberon/Oberon-2<br>
<br>
   Oberon-07/16 (support is still in-work,<br>
                 but users need to encourage this direction)<br>
<br>
   Component Pascal (almost everything is supported<br>
                     except 2-byte CHAR type, even some GPCP extensions)<br>
<br>
   Oberon-3 (experimental dialect with constant arrays and "proper FOR")<br>
<br>
We can also use multiple dialects in a single project.<br>
<br>
Ofront+ also increases the number of available target architectures:<br>
<br>
   BlackBox Component Builder<br>
   FreeBSD amd64<br>
   Linux amd64<br>
   Linux armv7<br>
   Linux i386<br>
   OpenBSD amd64<br>
   OpenBSD armv7<br>
   OpenBSD i386<br>
   macOS X<br>
   MS Windows 32 bits<br>
   MS Windows 64 bits<br>
<br>
Ofront+ was tested and used with C compilers:<br>
<br>
   GCC/MinGW, 32/64 bits<br>
   Clang<br>
   SDCC (Small Device C Compiler)<br>
   Tiny C (tcc)<br>
   cc65 (for CPU 6502)<br>
<br>
The latest build of Ofront+ you can get here:<br>
<br>
   <a href="https://github.com/Oleg-N-Cher/OfrontPlus" rel="noreferrer" target="_blank">https://github.com/Oleg-N-Cher/OfrontPlus</a><br>
<br>
I have been working on this for many years and try to keep the project <br>
afloat all the time. It's not very documented and it's not covered by a <br>
huge set of tests, but I do what I can based on my modest strength.<br>
<br>
I didn't plan to go that far, I just needed to make a few changes. Then <br>
I wanted to make support for Windows. Now we have the result of this <br>
work. I still want to do a lot before the release of version 1.0, but <br>
this is already quite stable.<br>
<br>
I won't tell you very much about the differences, but users say that I <br>
went too far. ;-)<br>
<br>
Ofront+ comes as a subsystem for BlackBox and as command line tool <br>
(Oberon-like GUI not implemented).<br>
<br>
So welcome, please use, write reviews and suggestions. Also I provide <br>
support for free.<br>
<br>
I want to thank Josef Templ, who actively supported me and helped me <br>
solve many problems.<br>
<br>
I also want to thank Stewart Greenhill, who made useful improvements and <br>
helped fix problems, and developed his own tools for Ofront+.<br>
<br>
List of differences and improvements:<br>
<br>
   <a href="https://github.com/Oleg-N-Cher/OfrontPlus/blob/master/Readme.txt" rel="noreferrer" target="_blank">https://github.com/Oleg-N-Cher/OfrontPlus/blob/master/Readme.txt</a><br>
<br>
--<br>
  Oleg N. Cher<br>
--<br>
<a href="mailto:Oberon@lists.inf.ethz.ch" target="_blank">Oberon@lists.inf.ethz.ch</a> mailing list for ETH Oberon and related systems<br>
<a href="https://lists.inf.ethz.ch/mailman/listinfo/oberon" rel="noreferrer" target="_blank">https://lists.inf.ethz.ch/mailman/listinfo/oberon</a><br>
</blockquote></div>