Byblos: Difference between revisions

From XionKB
Jump to navigationJump to search
(→‎System support: new section)
(wip)
 
(18 intermediate revisions by the same user not shown)
Line 1: Line 1:
{{stub}}'''Byblos''' is a software development kit developed for [[Sirius DOS]], [[A*]] and {{wp|Unix}}-based servers, with distinction for [[MILOTIX]] and Linux, BSD and Darwin (pan-Unix) support.
{{infobox swproj
|name=Byblos SDK
|image=Byblos.jpg
|by=Alexander Nicholi
|initialrel=<em>unreleased</em>
|langs={{wp|ANSI C}}, {{wp|Make (software)|Make}}, {{wp|Unix shell|POSIX sh}}
|systems={{wp|Darwin (operating system)|Darwin}}/{{wp|XNU}}, {{wp|Linux|GNU/Linux}}
|archs={{wp|Apple silicon}}, {{wp|x86-64}}
|lic=[[ASL|ASL 1.1]]
}}
'''Byblos''' is a software development kit developed for [[Sirius DOS]], [[A*]] and {{wp|Unix}}-based servers, with distinction for [[MILOTIX]] and Linux, BSD and Darwin (pan-Unix) support. It is divided into two versions: Byblos 1, a provisional SDK that uses existing compiler toolchains and host infrastructure of Unix-like operating systems, and Byblos 2, the proper SDK that provides [[Feeble C compiler|its own C compiler]], [[Oración|assembler]], and [[Sirius C*|the first C* compiler]].


==System support==
==Byblos 1==
Byblos SDK is multi-platform. Systems are divided into two broad groups: [[XAA initiative|XAA]] platforms and Unices, with MILOTIX being the only system counting as both. Unix-based systems are supported for the highly economical commodity-level scalability that is out of reach of A*. All XAA platforms are supported for the interests of the XAA initiative. GNU/Linux, FreeBSD and Darwin are supported for their market share, while OpenBSD is supported for the relevancy of its security features and illumos is supported as it is a Unix not based on Linux or BSD like Darwin, but is {{wp|free software}}.
Byblos 1 is the provisional Byblos SDK, running on GNU/Linux with <tt>glibc</tt>, either on x86-64 or AArch64. These two platforms are the only supported hosts, and on them Byblos can target the following platforms:
* GNU/Linux with <tt>glibc</tt> on x86-64
* GNU/Linux with <tt>glibc</tt> on AArch64
* GNU/Linux with <tt>glibc</tt> on ARMv7HF
* GNU/Linux with <tt>musl</tt> on x86-64
* GNU/Linux with <tt>musl</tt> on AArch64
* GNU/Linux with <tt>musl</tt> on ARMv7HF
* Microsoft Windows 95, 98 and Me on i386
* Microsoft Windows NT 4.0+ on i386
* Microsoft Windows NT 5.1+ on x64
* Apple macOS 10.4+ on Intel 64
* Apple macOS 11.0+ on AArch64


===Location===
All GNU/Linux targets use GCC cross-compilers, while all Windows targets use a single MinGW-W64 cross-compiler and all Apple targets use two clang compilers to generate fat binaries with <code>lipo</code>. Even though Clang is inherently a cross-compiler, two versions of it must be provided since maximal compatibility necessitates using different versions of the proprietary Apple SDK for each microarchitecture: 10.4 provides the earliest x86-64 SDK while 11.0 provides the earliest AArch64 SDK.
Spatial placement of the SDK is a more intuitive ordeal on A*, where programs and data merely have names, as opposed to Unices where a file system hierarchy must be dictated for consistency to remain with portability in force. To this end, Byblos defines the following sub-hierarchy of the Unix file system hierarchy, rooted at <code>/opt/byblos</code>:


{| class="wikitable"
Later, support ''may'' be added for the following platforms, pending integration of devkitARM and OpenWatcom 2:
|-
* Nintendo Game Boy Advance on ARMv4T
! Path
* Microsoft Windows 3.1 on i286
! Brief description
* MS-DOS 5.0+ on i286
! Notes
 
All target platforms support console-type applications as well as graphical ones with OpenGL hardware acceleration. Supported languages include ANSI C, C++14, and GNU assembler. Platforms that use OpenWatcom 2 lose C++ support, and both OpenWatcom 2 and devkitARM dependent platforms lack OpenGL support.
 
===Supported targets===
{| class="wikitable" width="900px"
|-
|-
| class="mw-code" | /opt/byblos/bin
! style="text-wrap:nowrap;width:30px" | <tt>i</tt>
| native executable binaries
! style="text-wrap:nowrap;width:60px" | Target
| each package can place native binaries whose names are registered in here
! style="text-wrap:nowrap;width:150px" | Full&nbsp;name
! style="text-wrap:nowrap;width:90px" | ISA
! style="text-wrap:nowrap;width:30px" | <small>Host</small>
! style="text-wrap:nowrap;width:30px" | <tt>ASM</tt>
! style="text-wrap:nowrap;width:30px" | C
! style="text-wrap:nowrap;width:30px" | C++
! style="text-wrap:nowrap;width:30px" | <tt>bin</tt>
! style="text-align:left" | Notes
|-
|-
| class="mw-code" | /opt/byblos/conf
| style="text-align:center" | [[File:agbhb.svg|28px]]
| configuration files
| style="text-align:center" | <tt>agbhb</tt>
| each package gets a subfolder within that it can populate at will
| style="text-align:center" | GBA homebrew
| style="text-align:center" | ARMv4T
| style="text-align:center" class="cell-red" | ✖
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-green" |
| style="text-align:center" class="cell-green" | ✔
| Scratch-building GBA ROMs.
|-
|-
| class="mw-code" | /opt/byblos/include
| style="text-align:center" | [[File:agbsp.svg|28px]]
| C, C++ and C* header files
| style="text-align:center" | <tt>agbsp</tt>
| each package gets a subfolder within that it can populate at will
| style="text-align:center" | GBA sourcepatch
| style="text-align:center" | ARMv4T
| style="text-align:center" class="cell-red" | ✖
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-green" |
| style="text-align:center" class="cell-green" | ✔
| Source-patching existing GBA ROMs.
|-
|-
| class="mw-code" | /opt/byblos/lib
| style="text-align:center" | [[File:astar.svg|28px]]
| native static libraries
| style="text-align:center" | <tt>astar</tt>
| each package can place the executable libraries whose names are registered in here; additionally, each package may place header files in the root which it has registered
| style="text-align:center" | [[A*|Anodyne A*]]
| style="text-align:center" | ''unknown''
| style="text-align:center" class="cell-red" | ✖
| style="text-align:center" class="cell-red" | ✖
| style="text-align:center" class="cell-red" | ✖
| style="text-align:center" class="cell-red" |
| style="text-align:center" class="cell-red" | ✖
| Too early to specify.
|-
|-
| class="mw-code" | /opt/byblos/libexec
| style="text-align:center" | [[File:darwin.svg|28px]]
| native non-user-facing binaries
| style="text-align:center" | <tt>darwin</tt>
| each package can place non-user-facing binaries whose names are registered in here
| style="text-align:center" | macOS
| style="text-align:center" | x86-64 v1 and ARMv8
| style="text-align:center" class="cell-red" | ✖
| style="text-align:center" class="cell-yellow" | &ndash;
| style="text-align:center" class="cell-green" |
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-yellow" | &ndash;
| &nbsp;
|-
|-
| class="mw-code" | /opt/byblos/local
| style="text-align:center" | [[File:glinuxa64.svg|28px]]
| non-distributive sub-hierarchy
| style="text-align:center" | <tt>glinuxa64</tt>
|
| style="text-align:center" | GNU/Linux + <tt>glibc</tt>
| style="text-align:center" | ARMv8.0
| style="text-align:center" class="cell-red" | ✖
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-yellow" | &ndash;
| Assumes VFPv2 hard float support.
|-
|-
| class="mw-code" | /opt/byblos/local/bin
| style="text-align:center" | [[File:glinuxx64.svg|28px]]
| native executable binaries
| style="text-align:center" | <tt>glinuxx64</tt>
| each package can place native binaries whose names it intends to register in here
| style="text-align:center" | GNU/Linux + <tt>glibc</tt>
| style="text-align:center" | x86-64 v1
| style="text-align:center" class="cell-red" | ✖
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-yellow" | &ndash;
| &nbsp;
|-
|-
| class="mw-code" | /opt/byblos/local/conf
| style="text-align:center" | [[File:mlinuxa64.svg|28px]]
| configuration files
| style="text-align:center" | <tt>mlinuxa64</tt>
| each package gets a subfolder within that it can populate at will
| style="text-align:center" | GNU/Linux + <tt>musl</tt>
| style="text-align:center" | ARMv8.0
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-yellow" | &ndash;
| Assumes VFPv2 hard float support.
|-
|-
| class="mw-code" | /opt/byblos/local/include
| style="text-align:center" | [[File:mlinuxx64.svg|28px]]
| C, C++ and C* header files
| style="text-align:center" | <tt>mlinuxx64</tt>
| each package gets a subfolder within that it can populate at will; additionally, each package may place header files in the root which it intends to register
| style="text-align:center" | GNU/Linux + <tt>musl</tt>
| style="text-align:center" | x86-64 v1
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-yellow" | &ndash;
| &nbsp;
|-
|-
| class="mw-code" | /opt/byblos/local/lib
| style="text-align:center" | [[File:pcdos.svg|28px]]
| native static libraries
| style="text-align:center" | <tt>pcdos</tt>
| each package can place the libraries whose names it intends to register in here
| style="text-align:center" | MS-DOS 5.0+
| style="text-align:center" | Intel i286
| style="text-align:center" class="cell-red" |
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-red" | ✖
| style="text-align:center" class="cell-green" | ✔
| &nbsp;
|-
|-
| class="mw-code" | /opt/byblos/local/libexec
| style="text-align:center" | [[File:win311.svg|28px]]
| native non-user-facing binaries
| style="text-align:center" | <tt>win311</tt>
| each package can place non-user-facing binaries whose names it intends to register in here
| style="text-align:center" | Windows 3.11
| style="text-align:center" | Intel i286
| style="text-align:center" class="cell-red" | ✖
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-green" |
| style="text-align:center" class="cell-red" | ✖
| style="text-align:center" class="cell-green" | ✔
| &nbsp;
|-
|-
| class="mw-code" | /opt/byblos/local/man
| style="text-align:center" | [[File:win95.svg|28px]]
| manuals and documentation
| style="text-align:center" | <tt>win95</tt>
| each package gets a subfolder within that it can populate at will
| style="text-align:center" | Windows 95, 98 &amp; Me
| style="text-align:center" | Intel i386
| style="text-align:center" class="cell-red" | ✖
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-green" |
| style="text-align:center" class="cell-yellow" | &ndash;
| &nbsp;
|-
|-
| class="mw-code" | /opt/byblos/local/sbin
| style="text-align:center" | [[File:winnt32.svg|28px]]
| "script" binaries
| style="text-align:center" | <tt>winnt32</tt>
| each package can place "script" binaries whose names it intends to register in here
| style="text-align:center" | Windows NT 4.0 32-bit
| style="text-align:center" | Intel i386
| style="text-align:center" class="cell-red" |
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-yellow" | &ndash;
| &nbsp;
|-
|-
| class="mw-code" | /opt/byblos/local/share
| style="text-align:center" | [[File:winnt64.svg|28px]]
| read-only data
| style="text-align:center" | <tt>winnt64</tt>
| each package gets a subfolder within that it can populate at will
| style="text-align:center" | Windows NT 5.1 64-bit
|-
| style="text-align:center" | x86-64 v1
| class="mw-code" | /opt/byblos/man
| style="text-align:center" class="cell-red" |
| manuals and documentation
| style="text-align:center" class="cell-green" | ✔
| each package gets a subfolder within that it can populate at will
| style="text-align:center" class="cell-green" |
|-
| style="text-align:center" class="cell-green" |
| class="mw-code" | /opt/byblos/sbin
| style="text-align:center" class="cell-yellow" | &ndash;
| "script" binaries
| &nbsp;
| each package can place "script" binaries whose names are registered in here
|-
| class="mw-code" | /opt/byblos/share
| read-only data
| each package gets a subfolder within that it can populate at will
|-
| class="mw-code" | /opt/byblos/system
| SDK internal management data
| reserved for the ''exclusive use'' of the Byblos SDK; outside applications should '''never''' assume anything about this directory's contents or even that it exists at all
|}
|}


"Script" binaries are programs that are, by themselves, architecture independent, usually because they are interpreted or compiled just-in-time on loading. These are separated from native binaries which are, as files, specific to the architecture in use. Byblos does not support any architectures other than the one in use on a given system (more exactly, whichever µarch the running kernel is compiled for). For instance, if a user is running a "multilib" system such as on <tt>amd64</tt> with i386 as <code>lib32/</code>, it will only support <tt>amd64</tt>.
====Notes====
* '''<tt>bin</tt>packing''' is a highly portable method of compiling assets statically into binaries
* For assembly, uncertainty exists about toolchain support on macOS
* For <tt>bin</tt>packing, it may eventually work but needs further research


The Byblos SDK operates on the premise that the working development directory can be anywhere, while all tools and support files are either provided within the hierarchy above, or assumed present on the system-level. System-level utilities and libraries should be provisioned using system package managers and treated in full mutual exclusion to Byblos-specific tooling; Byblos stuff is not compiled into <code>/usr/local</code>, and system stuff is never compiled into <code>/opt/byblos</code>. Even if one must manually compile a package from source, it should '''NEVER''' be installed with its <code>--sysroot</code> set to <code>/opt/byblos</code>! (Use <code>/usr/local</code> instead.)
===Programs list===
 
{| class="wikitable" width="600px"
When developing software in a source tree somewhere, it should be built and installed into <code>/opt/byblos/local/*</code> for testing and personal use. Packaged Byblos software downloaded or installed from elsewhere will be configured to be installed into <code>/opt/byblos/*</code>, where it is versioned and stripped and so on.
 
===Name registration===
Byblos maintains a registration system to prevent name collisions inside its root hierarchy. Every project or package has a "master name" by which it is known, and a set of "servile names" inside the <code>bin/</code>, <code>include/</code>, <code>lib/</code>, <code>libexec/</code>, and <code>sbin/</code> subfolders each. Ordinarily, servile names inside <code>include/</code> are not provided to third parties. The details of this registry and its governance are ''to be determined''.
 
==Components==
Yellow 〜 boxes indicate eventual support will be given, just not in the initial phases of development (usually due to bootstrapping concerns).
 
{| class="wikitable" style="text-align:center"
|-
|-
! Module
! style="text-wrap:nowrap;width:30px" | <tt>i</tt>
! Sirius DOS
! Utility
! style="padding-left:1rem;padding-right:1rem" | A*
! style="text-wrap:nowrap;width:30px" | <span title="agbhb">[[File:agbhb.svg|28px]]</span>
! MILOTIX
! style="text-wrap:nowrap;width:30px" | <span title="agbsp">[[File:agbsp.svg|28px]]</span>
! GNU/Linux
! style="text-wrap:nowrap;width:30px" | <span title="darwin">[[File:darwin.svg|28px]]</span>
! FreeBSD
! style="text-wrap:nowrap;width:30px" | <span title="glinuxa64">[[File:glinuxa64.svg|28px]]</span>
! OpenBSD
! style="text-wrap:nowrap;width:30px" | <span title="glinuxx64">[[File:glinuxx64.svg|28px]]</span>
! Darwin
! style="text-wrap:nowrap;width:30px" | <span title="mlinuxa64">[[File:mlinuxa64.svg|28px]]</span>
! illumos
! style="text-wrap:nowrap;width:30px" | <span title="mlinuxx64">[[File:mlinuxx64.svg|28px]]</span>
! style="text-wrap:nowrap;width:30px" | <span title="pcdos">[[File:pcdos.svg|28px]]</span>
! style="text-wrap:nowrap;width:30px" | <span title="win311">[[File:win311.svg|28px]]</span>
! style="text-wrap:nowrap;width:30px" | <span title="win95">[[File:win95.svg|28px]]</span>
! style="text-wrap:nowrap;width:30px" | <span title="winnt32">[[File:winnt32.svg|28px]]</span>
! style="text-wrap:nowrap;width:30px" | <span title="winnt64">[[File:winnt64.svg|28px]]</span>
|-
|-
| [[Hinterlib]]
| style="text-align:center" | [[File:hinterlib.svg|28px]]
| class="cell-green" | ✔
| style="text-align:center" | [[Hinterlib]]
| class="cell-green" | ✔
| style="text-align:center" class="cell-green" | ✔
| class="cell-green" | ✔
| style="text-align:center" class="cell-red" | ✖
| class="cell-green" | ✔
| style="text-align:center" class="cell-green" | ✔
| class="cell-green" | ✔
| style="text-align:center" class="cell-green" | ✔
| class="cell-green" | ✔
| style="text-align:center" class="cell-green" | ✔
| class="cell-green" | ✔
| style="text-align:center" class="cell-green" | ✔
| class="cell-green" | ✔
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-green" | ✔
|-
|-
| [[Inbound]]
| style="text-align:center" | [[File:inbound.svg|28px]]
| class="cell-green" | ✔
| style="text-align:center" | [[Inbound]]
| class="cell-green" | ✔
| style="text-align:center" class="cell-red" | ✖
| class="cell-green" | ✔
| style="text-align:center" class="cell-red" | ✖
| class="cell-green" | ✔
| style="text-align:center" class="cell-green" | ✔
| class="cell-green" | ✔
| style="text-align:center" class="cell-green" | ✔
| class="cell-green" | ✔
| style="text-align:center" class="cell-green" | ✔
| class="cell-green" | ✔
| style="text-align:center" class="cell-green" | ✔
| class="cell-green" | ✔
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-green" | ✔
|-
|-
| [[Outbound]]
| style="text-align:center" | [[File:outbound.svg|28px]]
| class="cell-green" | ✔
| style="text-align:center" | [[Outbound]]
| class="cell-green" | ✔
| style="text-align:center" class="cell-red" | ✖
| class="cell-green" | ✔
| style="text-align:center" class="cell-red" | ✖
| class="cell-green" | ✔
| style="text-align:center" class="cell-red" | ✖
| class="cell-green" |
| style="text-align:center" class="cell-green" | ✔
| class="cell-green" |
| style="text-align:center" class="cell-green" | ✔
| class="cell-green" |
| style="text-align:center" class="cell-green" | ✔
| class="cell-green" |
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-red" | ✖
| style="text-align:center" class="cell-red" |
| style="text-align:center" class="cell-red" |
| style="text-align:center" class="cell-red" |
| style="text-align:center" class="cell-red" |
|-
|-
| [[Rebound]]
| style="text-align:center" | [[File:rebound.svg|28px]]
| class="cell-green" | ✔
| style="text-align:center" | [[Rebound]]
| class="cell-green" | ✔
| style="text-align:center" class="cell-red" | ✖
| class="cell-green" | ✔
| style="text-align:center" class="cell-red" | ✖
| class="cell-green" | ✔
| style="text-align:center" class="cell-red" | ✖
| class="cell-green" |
| style="text-align:center" class="cell-green" | ✔
| class="cell-green" |
| style="text-align:center" class="cell-green" | ✔
| class="cell-green" |
| style="text-align:center" class="cell-green" | ✔
| class="cell-green" |
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-red" | ✖
| style="text-align:center" class="cell-red" |
| style="text-align:center" class="cell-red" |
| style="text-align:center" class="cell-red" |
| style="text-align:center" class="cell-red" |
|-
|-
| [[Earthbound]]
| style="text-align:center" | [[File:earthbound.svg|28px]]
| class="cell-green" | ✔
| style="text-align:center" | [[Earthbound]]
| class="cell-green" | ✔
| style="text-align:center" class="cell-red" | ✖
| class="cell-green" | ✔
| style="text-align:center" class="cell-red" | ✖
| class="cell-green" | ✔
| style="text-align:center" class="cell-green" | ✔
| class="cell-green" | ✔
| style="text-align:center" class="cell-green" | ✔
| class="cell-green" | ✔
| style="text-align:center" class="cell-green" | ✔
| class="cell-green" | ✔
| style="text-align:center" class="cell-green" | ✔
| class="cell-green" | ✔
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-green" | ✔
|-
|-
| [[Forerunner]]
| style="text-align:center" | [[File:forerunner.svg|28px]]
| class="cell-green" | ✔
| style="text-align:center" | [[Forerunner]]
| class="cell-green" | ✔
| style="text-align:center" class="cell-red" | ✖
| class="cell-green" | ✔
| style="text-align:center" class="cell-red" | ✖
| class="cell-green" | ✔
| style="text-align:center" class="cell-red" | ✖
| class="cell-green" |
| style="text-align:center" class="cell-green" | ✔
| class="cell-green" |
| style="text-align:center" class="cell-green" | ✔
| class="cell-green" |
| style="text-align:center" class="cell-green" | ✔
| class="cell-green" |
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-red" | ✖
| style="text-align:center" class="cell-red" |
| style="text-align:center" class="cell-red" |
| style="text-align:center" class="cell-red" |
| style="text-align:center" class="cell-red" |
|-
|-
| [[Precursor]]
| style="text-align:center" | [[File:precursor.svg|28px]]
| class="cell-green" | ✔
| style="text-align:center" | [[Precursor]]
| class="cell-green" | ✔
| style="text-align:center" class="cell-red" | ✖
| class="cell-green" | ✔
| style="text-align:center" class="cell-red" | ✖
| class="cell-green" | ✔
| style="text-align:center" class="cell-green" | ✔
| class="cell-green" | ✔
| style="text-align:center" class="cell-green" | ✔
| class="cell-green" | ✔
| style="text-align:center" class="cell-green" | ✔
| class="cell-green" | ✔
| style="text-align:center" class="cell-green" | ✔
| class="cell-green" | ✔
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-green" | ✔
|-
|-
| [[Simbel]]
| style="text-align:center" | [[File:simbel.svg|28px]]
| class="cell-green" | ✔
| style="text-align:center" | [[Simbel]]
| class="cell-green" | ✔
| style="text-align:center" class="cell-red" | ✖
| class="cell-green" | ✔
| style="text-align:center" class="cell-red" | ✖
| class="cell-green" | ✔
| style="text-align:center" class="cell-red" | ✖
| class="cell-green" |
| style="text-align:center" class="cell-green" | ✔
| class="cell-green" |
| style="text-align:center" class="cell-green" | ✔
| class="cell-green" |
| style="text-align:center" class="cell-green" | ✔
| class="cell-green" |
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-red" | ✖
| style="text-align:center" class="cell-red" |
| style="text-align:center" class="cell-red" |
| style="text-align:center" class="cell-red" |
| style="text-align:center" class="cell-red" |
|-
|-
| [[VR6]]
| style="text-align:center" | [[File:oracion.svg|28px]]
| class="cell-green" | ✔
| style="text-align:center" | [[Oración]]
| class="cell-green" | ✔
| style="text-align:center" class="cell-red" | ✖
| class="cell-yellow" |
| style="text-align:center" class="cell-red" | ✖
| class="cell-yellow" |
| style="text-align:center" class="cell-green" | ✔
| class="cell-yellow" |
| style="text-align:center" class="cell-green" | ✔
| class="cell-yellow" |
| style="text-align:center" class="cell-green" |
| class="cell-yellow" |
| style="text-align:center" class="cell-green" | ✔
| class="cell-yellow" |
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-green" |
| style="text-align:center" class="cell-green" |
| style="text-align:center" class="cell-green" |
| style="text-align:center" class="cell-green" |
| style="text-align:center" class="cell-green" |
|-
|-
| [[Sirius C*]]
| style="text-align:center" | [[File:fcc.svg|28px]]
| class="cell-green" | ✔
| style="text-align:center" | [[Feeble C compiler|FCC]]
| class="cell-green" | ✔
| style="text-align:center" class="cell-red" | ✖
| class="cell-yellow" |
| style="text-align:center" class="cell-red" | ✖
| class="cell-yellow" |
| style="text-align:center" class="cell-green" | ✔
| class="cell-yellow" |
| style="text-align:center" class="cell-green" | ✔
| class="cell-yellow" |
| style="text-align:center" class="cell-green" | ✔
| class="cell-yellow" |
| style="text-align:center" class="cell-green" |
| class="cell-yellow" |
| style="text-align:center" class="cell-green" |
| style="text-align:center" class="cell-green" |
| style="text-align:center" class="cell-green" |
| style="text-align:center" class="cell-green" |
| style="text-align:center" class="cell-green" |
| style="text-align:center" class="cell-green" | ✔
|-
|-
| [[Oración]]
| style="text-align:center" | [[File:quindle.svg|28px]]
| class="cell-green" | ✔
| style="text-align:center" | [[Quindle]]
| class="cell-green" | ✔
| style="text-align:center" class="cell-red" | ✖
| class="cell-yellow" |
| style="text-align:center" class="cell-red" | ✖
| class="cell-yellow" |
| style="text-align:center" class="cell-green" | ✔
| class="cell-yellow" |
| style="text-align:center" class="cell-green" | ✔
| class="cell-yellow" |
| style="text-align:center" class="cell-green" |
| class="cell-yellow" |
| style="text-align:center" class="cell-green" | ✔
| class="cell-yellow" |
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-green" |
| style="text-align:center" class="cell-green" |
| style="text-align:center" class="cell-green" |
| style="text-align:center" class="cell-green" |
| style="text-align:center" class="cell-green" |
|-
|-
| [[Feeble C compiler]]
| style="text-align:center" | [[File:gauntlet.svg|28px]]
| class="cell-green" | ✔
| style="text-align:center" | [[Gauntlet]]
| class="cell-green" | ✔
| style="text-align:center" class="cell-red" | ✖
| class="cell-yellow" |
| style="text-align:center" class="cell-red" | ✖
| class="cell-yellow" |
| style="text-align:center" class="cell-green" | ✔
| class="cell-yellow" |
| style="text-align:center" class="cell-green" | ✔
| class="cell-yellow" |
| style="text-align:center" class="cell-green" |
| class="cell-yellow" |
| style="text-align:center" class="cell-green" | ✔
| class="cell-yellow" |
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-green" |
| style="text-align:center" class="cell-green" |
| style="text-align:center" class="cell-green" |
| style="text-align:center" class="cell-green" |
| style="text-align:center" class="cell-green" |
|-
|-
| [[Quindle]]
| style="text-align:center" | [[File:senusrets.svg|28px]]
| class="cell-green" | ✔
| style="text-align:center" | [[Senusret's browser|Senusret's]]
| class="cell-green" | ✔
| style="text-align:center" class="cell-red" | ✖
| class="cell-red" |
| style="text-align:center" class="cell-red" | ✖
| class="cell-red" |
| style="text-align:center" class="cell-green" | ✔
| class="cell-red" |
| style="text-align:center" class="cell-green" | ✔
| class="cell-red" |
| style="text-align:center" class="cell-green" | ✔
| class="cell-red" |
| style="text-align:center" class="cell-green" | ✔
| class="cell-red" |
| style="text-align:center" class="cell-green" |
| style="text-align:center" class="cell-green" |
| style="text-align:center" class="cell-green" |
| style="text-align:center" class="cell-green" |
| style="text-align:center" class="cell-green" |
| style="text-align:center" class="cell-green" |
|-
|-
| [[Gauntlet]]
| style="text-align:center" | [[File:sirius.svg|28px]]
| class="cell-green" | ✔
| style="text-align:center" | [[Sirius C*]]
| class="cell-green" | ✔
| style="text-align:center" class="cell-red" | ✖
| class="cell-yellow" |
| style="text-align:center" class="cell-red" | ✖
| class="cell-yellow" |
| style="text-align:center" class="cell-green" | ✔
| class="cell-yellow" |
| style="text-align:center" class="cell-green" | ✔
| class="cell-yellow" |
| style="text-align:center" class="cell-green" |
| class="cell-yellow" |
| style="text-align:center" class="cell-green" | ✔
| class="cell-yellow" |
| style="text-align:center" class="cell-green" | ✔
| style="text-align:center" class="cell-green" |
| style="text-align:center" class="cell-green" |
| style="text-align:center" class="cell-green" |
| style="text-align:center" class="cell-green" |
| style="text-align:center" class="cell-green" |
|-
|-
| [[Pegasus]]
| style="text-align:center" | [[File:natpython.svg|28px]]
| class="cell-green" |
| style="text-align:center" | [[NatPython]]
| class="cell-green" |
| style="text-align:center" class="cell-red" |
| class="cell-yellow" | 〜
| style="text-align:center" class="cell-red" |
| class="cell-yellow" |
| style="text-align:center" class="cell-green" |
| class="cell-yellow" | 〜
| style="text-align:center" class="cell-green" |
| class="cell-yellow" |
| style="text-align:center" class="cell-green" |
| class="cell-yellow" | 〜
| style="text-align:center" class="cell-green" | ✔
| class="cell-yellow" |
| style="text-align:center" class="cell-green" | ✔
|-
| style="text-align:center" class="cell-green" | ✔
| [[Cigarbochs]]
| style="text-align:center" class="cell-green" | ✔
| class="cell-red" |
| style="text-align:center" class="cell-green" | ✔
| class="cell-green" | ✔
| style="text-align:center" class="cell-green" | ✔
| class="cell-green" | ✔
| style="text-align:center" class="cell-green" | ✔
| class="cell-green" | ✔
| class="cell-green" | ✔
| class="cell-green" | ✔
| class="cell-green" | ✔
| class="cell-green" | ✔
|}
|}


===Petit utilities===
===Installing the SDK===
* <code>chkenc</code> &ndash; inspect and validate text encodings of files
Byblos 1 can only be run on a <tt>musl</tt> based installation of GNU/Linux, either on the x86-64 or AArch64 microarchitectures. Use of a VM is recommended when this is not directly available on a machine.
* <code>liner</code> &ndash; inspect and validate line lengths
 
The <code>/opt/byblos</code> root has the following hierarchy:
 
: <tt>/opt/byblos/</tt> &ndash; SDK root
:: <tt>/opt/byblos/conf/</tt> &ndash; configuration settings
:: <tt>/opt/byblos/include/</tt> &ndash; header files (<tt>.h</tt>) and assembly headers (<tt>.inc</tt>)
:: <tt>/opt/byblos/man/</tt> &ndash; manuals
:: <tt>/opt/byblos/sbin/</tt> &ndash; script binaries (architecture independent)
:: <tt>/opt/byblos/share/</tt> &ndash; shared resources and miscellanea
:: <tt>/opt/byblos/slib/</tt> &ndash; script dependencies/libraries (architecture independent)
:: <tt>/opt/byblos/system/</tt> &ndash; private folder for internal SDK business
:: <tt>/opt/byblos/target/<u>$t</u>/</tt> &ndash; parent folder for target-specific sub-hierarchies (<tt><u>$t</u></tt> is the target ident)
::: <tt>/opt/byblos/target/<u>$t</u>/bin/</tt> &ndash; runnable binaries
::: <tt>/opt/byblos/target/<u>$t</u>/lib/</tt> &ndash; static libraries
::: <tt>/opt/byblos/target/<u>$t</u>/share/</tt> &ndash; target-specific miscellanea (e.g. associated production materials, emulator settings, etc.)
:: <tt>/opt/byblos/tc/<u>$tc</u>/</tt> &ndash; toolchain sysroots
 
Byblos 1 entirely avoids pre-compiling native programs, instead leaning on the externally-provided toolchains to run C code and Vala code in utilities as necessary. So, it lacks a host <code>bin/</code> folder or associated <code>lib/</code> folder, which are replaced by <code>sbin/</code> and <code>slib/</code> respectively. Hashbangs are used to achieve program invocation.
 
Xion Megatrends offers an installation shell script that initialises the above directories, downloads the toolchains and downloads additional SDK files as necessary.
 
====About the toolchains====
Byblos 1 depends on specially compiled versions of GCC to compile code for the various targets it supports. In total, there are 9 compilers for each host, for a total of 18:
* GCC <tt>aarch64-linux-musl</tt>
* GCC <tt>arm-linux-musl</tt>
* GCC <tt>x86_64-linux-musl</tt>
* GCC <tt>aarch64-linux-gnu</tt>
* GCC <tt>arm-linux-gnu</tt>
* GCC <tt>x86_64-linux-gnu</tt>
* Clang for macOS SDK 10.4
* Clang for macOS SDK 11.0
* MinGW-W64
 
Xion Megatrends offers pre-built binaries of all of these, compiled to run from <code>/opt/byblos/tc/&lt;ident&gt;</code>, where <code>&lt;ident&gt;</code> is the Byblos target platform identifier, <code>$TP</code>. An exception to this naming rule is for <code>darwin</code>, where instead <code>darwinx64</code> is used for x86-64 code and the 10.4 SDK and <code>darwina64</code> is used for AArch64 code and the 11.0 SDK. Another exception is for <code>win95</code>, <code>winnt32</code> and <code>winnt64</code>, which all use a single MinGW install available at <code>/opt/byblos/tc/mingw64</code>. <!--
 
XXX: OpenWatcom 2 and devkitARM not available
====Getting OpenWatcom====
Unfortunately the OpenWatcom 2 project does not provide distro packages or macOS binaries, so it must be built from source. Arch Linux users have the benefit of [//aur.archlinux.org/packages/openwatcom-v2 an AUR package] that mostly automates this, and the pathing dictated by our step-by-step process here should be consistent with that script so there are no quirks in usage.
 
# Run <code>xcode-select --install</code>
# Follow [//brew.sh/#install brew.sh#install]
# Run <code>brew install dosbox-x</code>
# Manually choose the latest release from [//github.com/open-watcom/open-watcom-v2/releases the repository]
#* Select the source code <tt>.tar.gz</tt> in particular
# <tt>un</tt><code>tar</code> the source into a <code>$dir</code> of your choice
# Set environment variable <code>OWTOOLS=CLANG</code>
# Set environment variable <code>OWDOSBOX=dosbox-x</code>
# Run <code>export OWTOOLS OWDOSBOX</code>
# Run <code>cd $dir</code>
# Run <code>./build.sh</code>
# Run <code>./build.sh rel</code>
# Run <code>sudo mkdir /opt/watcom</code>
# Run <code>sudo cp -a rel/. /opt/watcom/</code>
# Append the following lines to your <tt>.profile</tt> (or your equivalent to <tt>.profile</tt>):
#* <code>WATCOM=/opt/watcom</code>
#* <code>EDDAT=$WATCOM/eddat</code>
#* <code>PATH="$PATH:$WATCOM/armo64"</code>
#* <code>export WATCOM EDDAT PATH</code>
# Run <code>source .profile</code> (or your equivalent to <tt>.profile</tt>)
# Verify this all worked by running <code>wcl386 -h</code> --><!--
 
XXX: pending rewrite about Byblos 2
===Removable media and RAM drives on DOS===
What <code>$BYBLOS</code> resolves to and its underlying media are distinguished intelligently on Unices, where the canonical resolution of <code>/opt/byblos</code> and its contents can be mount points or symbolic links to just about anything. This is not the case on DOSes, since drive letters come into play. Fortunately, the variance that we wish to accommodate is limited to those drive letters.
 
It is important to be able to use Byblos from a floppy diskette, or to have an arbitrary portion of its files on a RAM drive to speed up performance. Byblos could also be located on a network-mapped drive. To support all of this, the <code>$BYBLOS</code> variable is instead defined as an absolute path without its drive letter, and another environment variable, <code>$BYBDRV</code>, contains a comma-separated ordered list of which drives its files may be available on. When Byblos tools look for a program, library or other file, they will search each drive in the list in order, and use whichever path comes up valid first. Here is an example:
 
Say that Alice has a computer with a 3½" floppy diskette drive <code>A:</code>, a 5¼" floppy disk drive <code>B:</code>, a main hard disk <code>C:</code>, a CD-ROM drive <code>D:</code>, a 2MiB RAM drive <code>E:</code>, and a network-attached storage drive <code>Z:</code>. Her main Byblos installation is at <code>C:/BYBLOS</code>, but she also has a newer minor-version release on a 3½" diskette that contains an updated [[Oración]] assembler providing a feature she needs to use no matter what. She also has some extra support libraries she authored on a loaded 5¼" disk, and a huge third-party SDK integrated with Byblos on a CD-ROM. Finally, her workplace provides company-specific headers and project tooling on the network drive. She has Batch scripts that she manually runs at startup to place her most important files onto the RAM drive. She will probably want to have a setup like this:
 
* <code>$BYBLOS</code> = <tt>/BYBLOS</tt>
* <code>$BYBDRV</code> = <tt>E,A,B,D,C,Z</tt>
 
The SDK, along with any and all programs that use its support library, will have file I/O subroutines that stitch together the base path with the drive letters to try when resolving paths. Byblos will also provide dynamic, hands-free integration with the <code>$PATH</code> executable resolution approach and will know where to look for <code>#include</code>s, libraries and other data automatically, using support library subroutines.
-->
==Byblos 2==
Byblos 2 is a purpose-built SDK that includes dedicated stand-alone tools for compiling code and assets for all supported targets. Initially it will run on the same hosts supported by Byblos 1, with wider support to coincide with the porting of Vala to liberate it from conventional host support structures. Its core is comprised of the following programs:
* [[Oración]], an assembler and desymboliser
** Intel 8086, i286, i486, i686, x86-64 v1-v4, ARMv4T, ARMv5TE, ARMv6, ARMv7, ARMv8, SPARC64 V9, Motorola 68000, MOS 6502, MOS 65816, and Itanium/IA-64 are the supported architectures
* [[Feeble C compiler|FCC]], an expressly non-optimising ANSI C compiler
** Uses Oración as its backend
* [[Sirius C*]], a provisional [[C*]] compiler
** Derived from FCC, also uses Oración as its backend
* [[Inbound]], a software build system
** Derived from Make, uses a cut-down in-house derivative
* [[Outbound]], a software packaging system
* [[NatPython]], a scripting interpreter
** Hard fork of Python 3.3
* [[Simbel]], a documentation authoring and generation toolset
* [[Precursor]], a hub-and-spoke version control system
* [[Forerunner]], a source code management system built on top of Precursor
* [[Gauntlet]], a public key cryptosystem for signing and verifying code
* [[Quindle]], a graphical editor program for authoring code
* [[Cigarbochs]], an emulator for debugging and testing code
* Various helper utilities for sanitising and analysing code
 
===Language classes===
The Byblos compiler suite has a rigidly-dictated list of "first-class programming languages", chosen holistically for their combination of ubiquity, expressive power and heritage. Currently, they are as follows:
* ANSI C
* [[C*]]
* FORTRAN, revision 1977 (F77)
* Verilog, revision 2005 (V05)


[[Category:Applications of mechanicalism]][[Category:Unix developments]]
[[Category:Applications of mechanicalism]][[Category:Unix developments]]

Latest revision as of 14:32, 11 December 2024

Byblos SDK
Created by Alexander Nicholi
Initial release unreleased
Written in ANSI C, Make, POSIX sh
OSes Darwin/XNU, GNU/Linux
ISAs Apple silicon, x86-64
Licence ASL 1.1

Byblos is a software development kit developed for Sirius DOS, A* and Unix-based servers, with distinction for MILOTIX and Linux, BSD and Darwin (pan-Unix) support. It is divided into two versions: Byblos 1, a provisional SDK that uses existing compiler toolchains and host infrastructure of Unix-like operating systems, and Byblos 2, the proper SDK that provides its own C compiler, assembler, and the first C* compiler.

Byblos 1

Byblos 1 is the provisional Byblos SDK, running on GNU/Linux with glibc, either on x86-64 or AArch64. These two platforms are the only supported hosts, and on them Byblos can target the following platforms:

  • GNU/Linux with glibc on x86-64
  • GNU/Linux with glibc on AArch64
  • GNU/Linux with glibc on ARMv7HF
  • GNU/Linux with musl on x86-64
  • GNU/Linux with musl on AArch64
  • GNU/Linux with musl on ARMv7HF
  • Microsoft Windows 95, 98 and Me on i386
  • Microsoft Windows NT 4.0+ on i386
  • Microsoft Windows NT 5.1+ on x64
  • Apple macOS 10.4+ on Intel 64
  • Apple macOS 11.0+ on AArch64

All GNU/Linux targets use GCC cross-compilers, while all Windows targets use a single MinGW-W64 cross-compiler and all Apple targets use two clang compilers to generate fat binaries with lipo. Even though Clang is inherently a cross-compiler, two versions of it must be provided since maximal compatibility necessitates using different versions of the proprietary Apple SDK for each microarchitecture: 10.4 provides the earliest x86-64 SDK while 11.0 provides the earliest AArch64 SDK.

Later, support may be added for the following platforms, pending integration of devkitARM and OpenWatcom 2:

  • Nintendo Game Boy Advance on ARMv4T
  • Microsoft Windows 3.1 on i286
  • MS-DOS 5.0+ on i286

All target platforms support console-type applications as well as graphical ones with OpenGL hardware acceleration. Supported languages include ANSI C, C++14, and GNU assembler. Platforms that use OpenWatcom 2 lose C++ support, and both OpenWatcom 2 and devkitARM dependent platforms lack OpenGL support.

Supported targets

i Target Full name ISA Host ASM C C++ bin Notes
agbhb GBA homebrew ARMv4T Scratch-building GBA ROMs.
agbsp GBA sourcepatch ARMv4T Source-patching existing GBA ROMs.
astar Anodyne A* unknown Too early to specify.
darwin macOS x86-64 v1 and ARMv8  
glinuxa64 GNU/Linux + glibc ARMv8.0 Assumes VFPv2 hard float support.
glinuxx64 GNU/Linux + glibc x86-64 v1  
mlinuxa64 GNU/Linux + musl ARMv8.0 Assumes VFPv2 hard float support.
mlinuxx64 GNU/Linux + musl x86-64 v1  
pcdos MS-DOS 5.0+ Intel i286  
win311 Windows 3.11 Intel i286  
win95 Windows 95, 98 & Me Intel i386  
winnt32 Windows NT 4.0 32-bit Intel i386  
winnt64 Windows NT 5.1 64-bit x86-64 v1  

Notes

  • binpacking is a highly portable method of compiling assets statically into binaries
  • For assembly, uncertainty exists about toolchain support on macOS
  • For binpacking, it may eventually work but needs further research

Programs list

i Utility
Hinterlib
Inbound
Outbound
Rebound
Earthbound
Forerunner
Precursor
Simbel
Oración
FCC
Quindle
Gauntlet
Senusret's
Sirius C*
NatPython

Installing the SDK

Byblos 1 can only be run on a musl based installation of GNU/Linux, either on the x86-64 or AArch64 microarchitectures. Use of a VM is recommended when this is not directly available on a machine.

The /opt/byblos root has the following hierarchy:

/opt/byblos/ – SDK root
/opt/byblos/conf/ – configuration settings
/opt/byblos/include/ – header files (.h) and assembly headers (.inc)
/opt/byblos/man/ – manuals
/opt/byblos/sbin/ – script binaries (architecture independent)
/opt/byblos/share/ – shared resources and miscellanea
/opt/byblos/slib/ – script dependencies/libraries (architecture independent)
/opt/byblos/system/ – private folder for internal SDK business
/opt/byblos/target/$t/ – parent folder for target-specific sub-hierarchies ($t is the target ident)
/opt/byblos/target/$t/bin/ – runnable binaries
/opt/byblos/target/$t/lib/ – static libraries
/opt/byblos/target/$t/share/ – target-specific miscellanea (e.g. associated production materials, emulator settings, etc.)
/opt/byblos/tc/$tc/ – toolchain sysroots

Byblos 1 entirely avoids pre-compiling native programs, instead leaning on the externally-provided toolchains to run C code and Vala code in utilities as necessary. So, it lacks a host bin/ folder or associated lib/ folder, which are replaced by sbin/ and slib/ respectively. Hashbangs are used to achieve program invocation.

Xion Megatrends offers an installation shell script that initialises the above directories, downloads the toolchains and downloads additional SDK files as necessary.

About the toolchains

Byblos 1 depends on specially compiled versions of GCC to compile code for the various targets it supports. In total, there are 9 compilers for each host, for a total of 18:

  • GCC aarch64-linux-musl
  • GCC arm-linux-musl
  • GCC x86_64-linux-musl
  • GCC aarch64-linux-gnu
  • GCC arm-linux-gnu
  • GCC x86_64-linux-gnu
  • Clang for macOS SDK 10.4
  • Clang for macOS SDK 11.0
  • MinGW-W64

Xion Megatrends offers pre-built binaries of all of these, compiled to run from /opt/byblos/tc/<ident>, where <ident> is the Byblos target platform identifier, $TP. An exception to this naming rule is for darwin, where instead darwinx64 is used for x86-64 code and the 10.4 SDK and darwina64 is used for AArch64 code and the 11.0 SDK. Another exception is for win95, winnt32 and winnt64, which all use a single MinGW install available at /opt/byblos/tc/mingw64.

Byblos 2

Byblos 2 is a purpose-built SDK that includes dedicated stand-alone tools for compiling code and assets for all supported targets. Initially it will run on the same hosts supported by Byblos 1, with wider support to coincide with the porting of Vala to liberate it from conventional host support structures. Its core is comprised of the following programs:

  • Oración, an assembler and desymboliser
    • Intel 8086, i286, i486, i686, x86-64 v1-v4, ARMv4T, ARMv5TE, ARMv6, ARMv7, ARMv8, SPARC64 V9, Motorola 68000, MOS 6502, MOS 65816, and Itanium/IA-64 are the supported architectures
  • FCC, an expressly non-optimising ANSI C compiler
    • Uses Oración as its backend
  • Sirius C*, a provisional C* compiler
    • Derived from FCC, also uses Oración as its backend
  • Inbound, a software build system
    • Derived from Make, uses a cut-down in-house derivative
  • Outbound, a software packaging system
  • NatPython, a scripting interpreter
    • Hard fork of Python 3.3
  • Simbel, a documentation authoring and generation toolset
  • Precursor, a hub-and-spoke version control system
  • Forerunner, a source code management system built on top of Precursor
  • Gauntlet, a public key cryptosystem for signing and verifying code
  • Quindle, a graphical editor program for authoring code
  • Cigarbochs, an emulator for debugging and testing code
  • Various helper utilities for sanitising and analysing code

Language classes

The Byblos compiler suite has a rigidly-dictated list of "first-class programming languages", chosen holistically for their combination of ubiquity, expressive power and heritage. Currently, they are as follows:

  • ANSI C
  • C*
  • FORTRAN, revision 1977 (F77)
  • Verilog, revision 2005 (V05)