Why Sponsor Oils? | blog | oilshell.org
I just got back from a two-week vacation, and the last blog post is over three weeks old. It explained the strategy for building OVM by rewriting Python's build system from scratch.
What's happened since then?
I completed most of that work, and started a few new things, all leading up to an initial OSH release. The work led to ideas for blog posts which I don't have time to write. So in this post, I'll summarize the main ideas (in "Twitter mode").
I've packaged OSH as a single file with both native code and bytecode, as described in the last post.
However, it's too big and too slow. The bash man page acknowledges that bash is too big and too slow, and right now OSH is even worse:
import
, and this all happens before main()
.It's not worse than a normal Python program, but I'm (rightly) using the standard of a C program when making these judgements.
This annoys me, but I'm constantly reminding myself that the right strategy is to prioritize completeness and correctness over performance.
In particular, I don't want to block the initial OSH release on performance optimizations. I believe it will have (some) value even if it's bigger and slower than bash, and it's important to release early and often.
After it's released, someone might have better ideas for optimization than I do. That would be nice because a more important goal is to make progress on the Oil language.
I wrote a Makefile to build both the release tarball and the
osh
binary. If I were to write a GNU Make experience report, it would
elaborate on these issues:
%.o : %.c
) in three different
Makefiles now, and they're useful. They can probably be generalized.make -j
will be the default.)gcc -M
uses the preprocessor to discover dependencies in C source code,
then generates GNU Make fragments, which are often massaged with sed.
This interface is poorly designed.$^
, $<
, $@
, and $*
mean in Make. It's
unfortunate that these special variables collide so badly with shell's
special variables..DELETE_ON_ERROR
and .SECONDARY
should be the default..PHONY
and .ONESHELL
are bolted-on hacks.This work also led to observations about build systems in general:
setup.py
script uses distutils to build
the standard library.make -j
, but the standard library must be built serially with
setup.py
. This is bad because the larger task is done in a slower
fashion.gcc -M
.$(eval)
.yacc
so the end user doesn't need to install
it.configure
script is to discover parameters for the second
evaluation.I completed most the work described in the last post, but the result still needs to be optimized.
Rewriting Python's build system produced specific observations about Makefiles, as well as general observations about build systems. I wrote about them while they're fresh in my mind, so I can use them when designing Boil.
In the next post, I'll give an update on project metrics.