Otava
Otava is an experimental C++ compiler whose lexical analyzers and parsers are generated using Soul
. It generates x64 assembly code and uses msbuild
to compile the assembly files to object code, to archive object files in libraries, to compile main C++ files of programs and to link programs.
Before we can compile C++ programs with Otava, its standard library std
must be compiled for each configuration used:
-
Please complete the
installation
steps if you have not done so yet.
-
Start a terminal in the C:\soul-5.1.0\tools\otava\std
directory and enter command oc std.project
:
Microsoft Windows [Version 10.0.26200.8246]
(c) Microsoft Corporation. All rights reserved.
C:\soul-5.1.0\tools\otava\std>oc std.project
****************************************
* Otava C++ Compiler version 5.1.0
****************************************
> building project 'std'...
> C:/soul-5.1.0/tools/otava/std/std.type.fundamental.cppm
> C:/soul-5.1.0/tools/otava/std/std.atexit.cppm
> C:/soul-5.1.0/tools/otava/std/std.thread.mutex.cppm
> C:/soul-5.1.0/tools/otava/std/std.init.cppm
> C:/soul-5.1.0/tools/otava/std/std.type_traits.cppm
> C:/soul-5.1.0/tools/otava/std/std.trace.cppm
> C:/soul-5.1.0/tools/otava/std/std.rt.cppm
> C:/soul-5.1.0/tools/otava/std/std.utilities.utility.cppm
> C:/soul-5.1.0/tools/otava/std/std.utilities.pair.cppm
> C:/soul-5.1.0/tools/otava/std/std.iterator.cppm
> C:/soul-5.1.0/tools/otava/std/std.algorithm.cppm
> C:/soul-5.1.0/tools/otava/std/std.atomic.cppm
> C:/soul-5.1.0/tools/otava/std/std.new_delete.cppm
> C:/soul-5.1.0/tools/otava/std/std.eh.cppm
> C:/soul-5.1.0/tools/otava/std/std.basic_string.cppm
> C:/soul-5.1.0/tools/otava/std/std.utilities.ratio.cppm
> C:/soul-5.1.0/tools/otava/std/std.chrono.duration.cppm
> C:/soul-5.1.0/tools/otava/std/std.chrono.cppm
> C:/soul-5.1.0/tools/otava/std/std.chrono.time_point.cppm
> C:/soul-5.1.0/tools/otava/std/std.chrono.clock.cppm
> C:/soul-5.1.0/tools/otava/std/std.functional.cppm
> C:/soul-5.1.0/tools/otava/std/std.container.vector.cppm
> C:/soul-5.1.0/tools/otava/std/std.container.hash_table.cppm
> C:/soul-5.1.0/tools/otava/std/std.container.list.cppm
> C:/soul-5.1.0/tools/otava/std/std.utilities.unique_ptr.cppm
> C:/soul-5.1.0/tools/otava/std/std.container.rb_tree.cppm
> C:/soul-5.1.0/tools/otava/std/std.container.map.cppm
> C:/soul-5.1.0/tools/otava/std/std.container.set.cppm
> C:/soul-5.1.0/tools/otava/std/std.container.stack.cppm
> C:/soul-5.1.0/tools/otava/std/std.container.unordered_map.cppm
> C:/soul-5.1.0/tools/otava/std/std.container.unordered_set.cppm
> C:/soul-5.1.0/tools/otava/std/std.utilities.shared_ptr.cppm
> C:/soul-5.1.0/tools/otava/std/std.cow_string.cppm
> C:/soul-5.1.0/tools/otava/std/std.error.cppm
> C:/soul-5.1.0/tools/otava/std/std.exception.cppm
> C:/soul-5.1.0/tools/otava/std/std.expected.cppm
> C:/soul-5.1.0/tools/otava/std/std.hash.cppm
> C:/soul-5.1.0/tools/otava/std/std.limits.cppm
> C:/soul-5.1.0/tools/otava/std/std.utf.cppm
> C:/soul-5.1.0/tools/otava/std/std.stream.cppm
> C:/soul-5.1.0/tools/otava/std/std.stringstream.cppm
> C:/soul-5.1.0/tools/otava/std/std.time.cppm
> C:/soul-5.1.0/tools/otava/std/std.thread.cppm
> C:/soul-5.1.0/tools/otava/std/std.thread.condition_variable.cppm
> C:/soul-5.1.0/tools/otava/std/std.core.cppm
> C:/soul-5.1.0/tools/otava/std/std.filesystem.cppm
> C:/soul-5.1.0/tools/otava/std/std.cppm
> C:/soul-5.1.0/tools/otava/std/std.atexit.cpp
> C:/soul-5.1.0/tools/otava/std/std.init.cpp
> C:/soul-5.1.0/tools/otava/std/std.atomic.cpp
> C:/soul-5.1.0/tools/otava/std/std.basic_string.cpp
> C:/soul-5.1.0/tools/otava/std/std.cow_string.cpp
> C:/soul-5.1.0/tools/otava/std/std.rt.cpp
> C:/soul-5.1.0/tools/otava/std/std.container.hash_table.cpp
> C:/soul-5.1.0/tools/otava/std/std.error.cpp
> C:/soul-5.1.0/tools/otava/std/std.exception.cpp
> C:/soul-5.1.0/tools/otava/std/std.filesystem.cpp
> C:/soul-5.1.0/tools/otava/std/std.hash.cpp
> C:/soul-5.1.0/tools/otava/std/std.new_delete.cpp
> C:/soul-5.1.0/tools/otava/std/std.container.rb_tree.cpp
> C:/soul-5.1.0/tools/otava/std/std.stream.cpp
> C:/soul-5.1.0/tools/otava/std/std.thread.mutex.cpp
> C:/soul-5.1.0/tools/otava/std/std.trace.cpp
> C:/soul-5.1.0/tools/otava/std/std.utf.cpp
> C:/soul-5.1.0/tools/otava/std/std.utilities.shared_ptr.cpp
> C:/soul-5.1.0/tools/otava/std/std.utilities.utility.cpp
**********************************************************************
** Visual Studio 2022 Developer Command Prompt v17.14.30
** Copyright (c) 2025 Microsoft Corporation
**********************************************************************
[vcvarsall.bat] Environment initialized for: 'x64'
MSBuild version 17.14.40+3e7442088 for .NET Framework
Assembling std.type.fundamental.cppm.asm...
Assembling std.atexit.cppm.asm...
Assembling std.thread.mutex.cppm.asm...
Assembling std.init.cppm.asm...
Assembling std.type_traits.cppm.asm...
Assembling std.trace.cppm.asm...
Assembling std.rt.cppm.asm...
Assembling std.utilities.utility.cppm.asm...
Assembling std.utilities.pair.cppm.asm...
Assembling std.iterator.cppm.asm...
Assembling std.algorithm.cppm.asm...
Assembling std.atomic.cppm.asm...
Assembling std.new_delete.cppm.asm...
Assembling std.eh.cppm.asm...
Assembling std.basic_string.cppm.asm...
Assembling std.utilities.ratio.cppm.asm...
Assembling std.chrono.duration.cppm.asm...
Assembling std.chrono.cppm.asm...
Assembling std.chrono.time_point.cppm.asm...
Assembling std.chrono.clock.cppm.asm...
Assembling std.functional.cppm.asm...
Assembling std.container.vector.cppm.asm...
Assembling std.container.hash_table.cppm.asm...
Assembling std.container.list.cppm.asm...
Assembling std.utilities.unique_ptr.cppm.asm...
Assembling std.container.rb_tree.cppm.asm...
Assembling std.container.map.cppm.asm...
Assembling std.container.set.cppm.asm...
Assembling std.container.stack.cppm.asm...
Assembling std.container.unordered_map.cppm.asm...
Assembling std.container.unordered_set.cppm.asm...
Assembling std.utilities.shared_ptr.cppm.asm...
Assembling std.cow_string.cppm.asm...
Assembling std.error.cppm.asm...
Assembling std.exception.cppm.asm...
Assembling std.expected.cppm.asm...
Assembling std.hash.cppm.asm...
Assembling std.limits.cppm.asm...
Assembling std.utf.cppm.asm...
Assembling std.stream.cppm.asm...
Assembling std.stringstream.cppm.asm...
Assembling std.time.cppm.asm...
Assembling std.thread.cppm.asm...
Assembling std.thread.condition_variable.cppm.asm...
Assembling std.core.cppm.asm...
Assembling std.filesystem.cppm.asm...
Assembling std.cppm.asm...
Assembling std.atexit.cpp.asm...
Assembling std.init.cpp.asm...
Assembling std.atomic.cpp.asm...
Assembling std.basic_string.cpp.asm...
Assembling std.cow_string.cpp.asm...
Assembling std.rt.cpp.asm...
Assembling std.container.hash_table.cpp.asm...
Assembling std.error.cpp.asm...
Assembling std.exception.cpp.asm...
Assembling std.filesystem.cpp.asm...
Assembling std.hash.cpp.asm...
Assembling std.new_delete.cpp.asm...
Assembling std.container.rb_tree.cpp.asm...
Assembling std.stream.cpp.asm...
Assembling std.thread.mutex.cpp.asm...
Assembling std.trace.cpp.asm...
Assembling std.utf.cpp.asm...
Assembling std.utilities.shared_ptr.cpp.asm...
Assembling std.utilities.utility.cpp.asm...
std.vcxproj -> C:\soul-5.1.0\tools\otava\std\bin\debug\std.lib
project 'std' built successfully
C:\soul-5.1.0\tools\otava\std>
This command builds the standard library for the debug
configuration.
-
Then enter the same oc
command with the release
configuration and -O=1
arguments:
C:\soul-5.1.0\tools\otava\std>oc -c=release -O=1 std.project
The release/1
configuration does some optimizations but does not do function inlining.
-
And finally build for the release/2
configuration:
C:\soul-5.1.0\tools\otava\std>oc -c=release -O=2 std.project
The release/2
configuration does all optimizations including function inlining.
After the stadard library is built we can compile for example the hello world
application:
Testing: