D Language Foundation October 2025 Quarterly Meeting Summary
Mike Parker
aldacron at gmail.com
Fri Mar 13 12:43:23 UTC 2026
The D Language Foundation’s quarterly meeting for October 2025
took place on Friday the 3rd. It lasted about fifty minutes.
Our quarterly meetings are where representatives from businesses
big and small can bring us their most pressing D issues, status
reports on their use of D, and so on.
## The Attendees
The following people attended the meeting:
* Walter Bright (DLF)
* Luís Ferreira (Weka)
* Martin Kinkelin (LDC/Symmetry)
* Dennis Korpel (DLF/SARC)
* Mathias Lang (DLF/Symmetry)
* Mike Parker (DLF)
* Carsten Rasmussen (Decard)
* Bastiaan Veelo (SARC)
## The Summary
### Bastiaan
Bastiaan said SARC had no major news to report. They were looking
forward to a new release, and there had been no major setbacks. I
joked that this might be the first time he had shown up with
nothing for us. He agreed that maybe it was.
### Luís
Luís said that at DConf, people had suggested Weka try the new
GC. They still had not had a chance to upgrade the compiler far
enough to test it, but it was something they very much wanted to
do.
The main issue for them was on the LDC side. Some of Weka's
binaries, especially their unit test binaries, were so large that
they exceeded four gigabytes. At that point, the linker started
complaining about overflowing relocation address space. As he
understood it, the relocation addresses were signed 32-bit
values, so once the binary got past that size, the relocations
overflowed.
Walter asked how they were managing to get a multi-gigabyte
amount of code in the first place. Luís said part of it was that
they kept a lot of static data in the binary. Some of it was
configuration-related, and some of it was for arrays where they
liked to have precomputed values. They also used a great many
templates. In the unit tests especially, those symbols took up a
lot of space. One workaround they had already used was converting
some of the static data into runtime-initialized variables, since
performance did not matter much for unit tests.
Walter said that if the arrays were that large, then the program
could just load them after startup rather than baking them into
the binary, and he suggested they also look into why they were
using so many templates. Luís replied that a lot of those
templates came from their upgrade and downgrade infrastructure,
which they had presented at DConf. He agreed there were things
they could improve on their side and stressed that not all of
this was the compiler’s fault.
Walter asked whether this was happening in a 32-bit or 64-bit
compile. Luís said it was 64-bit, but the relocations were still
signed 32-bit. He had tried moving to 64-bit relocations in LDC
but had not managed it.
Luís then brought up a second issue. Weka wanted to move away
from statically linking everything and start using dynamic
linkage instead, but they had run into a lot of problems there as
well. He expected that once they got further into that
transition, they would start filing bug reports. One example he
had already seen was that export did not work properly together
with `-fvisibility=hidden`. He thought this was probably
LDC-specific, though he wasn't sure whether there was an
equivalent DMD-side mechanism for the same thing. He had noticed
cases where compiler-generated symbols, such as postblits,
weren't being marked for export, which meant they weren't
exported from the shared library.
I asked whether he already had a bug report for that second
issue. He said yes, there were two bug reports related to export
not working properly, but he didn't have them handy. I told him
to send them to me and I would forward them on to Dennis and
Nick. He added that Ilya might also have some other issues to
raise, as he was working on a new build system. Weka were
integrating Bazel and had run into some issues there, though Luís
was not sure of the details.
### Carsten
Carsten said Decard were building and testing a larger network
and trying to push throughput higher. The issues they were
dealing with were not really anything for us to solve. They were
just having some problems they didn't fully understand yet, and
as part of that they were writing a new network in D. They wanted
communication across several hundred nodes, and what they
currently had was not enough for that.
I asked whether there was anything blocking them or any issue to
report. Carsten said no. They were happy with D and had no
problems with it at the moment.
### Dennis
When I asked Dennis whether he had anything work-related to
report from SARC or the DLF side, he had nothing from work.
On the DLF side, he said that he had finally managed to build the
2.112 beta and upload it, so the files were now present on the
pre-releases download page. What still remained was updating the
changelog, the website, and the announcement.
He said there had also been a tagging issue that Bastiaan had
spotted involving dub. The tag still appeared to come from May,
and Dennis wasn't sure whether the tag was wrong, the build was
wrong, or both. He needed to look into that.
Bastiaan said that from what he could see, the build appeared to
be shipping the latest commit from dub, but when the version was
printed it still showed the old tag from May. In practical terms,
that probably didn't matter much, because the latest stable
version was what should be shipping anyway. Dennis said that on
the one hand that was good news, but on the other hand it meant
something weird was going on in the build process, because in his
mental model the build should have been built from the tag.
Eventually, he planned to move away from the current janky local
workflow and transition the build process to GitHub workflows.
His goal was to get GitHub Actions building the release artifacts
and gradually smooth out the process, since at the moment the
most annoying part was simply getting things built at all.
That led into a discussion about code signing. I asked whether,
since he was moving things over to GitHub Actions, he would want
to get the build process settled first before looking into code
signing. Dennis said probably yes. He also still needed to
investigate macOS code signing, which Luna had offered to help
with, and was not even sure yet whether that could be done on
GitHub or if it would still require a local VirtualBox setup.
Walter said it was a terrible look for us when people clicked the
download link and got a warning that the file was unsigned and
should be used at their own risk. He understood that the release
process was complicated, but asked whether we could at least fix
the certification problem. He asked what it would cost us to get
a certificate.
Dennis said he had briefly looked at SSL.com. A one-year license
there appeared to cost about $120, and if you bought more years
up front, the annual price dropped. Walter asked if that was per
executable, and Dennis said no, he thought it was per license and
could be used on as many things as needed.
Walter asked if Dennis could just buy the license and be
reimbursed. He told him to get the ten-year option. He said he
had been afraid it might cost thousands of dollars, but at only a
few hundred dollars, it was a no-brainer and something we should
obviously do.
I noted we'd had one that Iain had signed us up for, but then the
price had become much too expensive. I was sure he'd looked into
other options, but ultimately didn't choose one because none of
them were easy to integrate into the current release process.
Bastiaan said they had implemented code signing at work a few
years ago and that it had been non-trivial and quite a pain. Part
of the trouble was that the company selling them the service had
not been allowed to explain how to automate it. The apparent
intention was that signing should remain a manual step, almost
like a physical signature. He said that in practice it was now
integrated into their build infrastructure, but it involved a
physical dongle that had to be plugged in somewhere. Because of
that, he wasn't sure how well it would fit with GitLab- or
GitHub-hosted workflows. He suggested Dennis could ask someone at
SARC about what they had ended up using.
Martin said that, as far as integration with the release process
was concerned, the short of it was that we'd have to install the
GitHub Actions runner on a separate machine with a dongle, create
a registration token to freely register the runner with the
repository, and then we could have a CI job that would download
the generated artifacts, sign those on our runner on the machine
with our dongle, and then upload them.
I said this wasn't going to get solved in a weekend. I repeated
my suggestion that we let Dennis get the refactored release
process in place first instead of adding additional complications
to the existing one. Walter said okay, but he was worried that
this was a very bad look for us.
(__UPDATE__: We've since had discussions about signing. After the
most recent email thread, Adam Wilson is looking into getting us
set up to sign via Azure.)
### Mathias
Mathias said that if we could make `-checkaction=context` work,
and ideally make it the default at least in unit test mode, that
would make everyone’s life easier.
When Carsten said he didn't understand what that was, Mathias
explained that it was the thing that told you what expression had
actually failed in an assert. Instead of only getting an
assertion failure, it could tell you that this value had been
compared against that value and the comparison had failed. The
last time he'd checked, there had still been linker errors. They
were hard to solve because they appeared at a different stage,
but he still thought making it the default, at least in unit test
mode, would be a very good move for D because it would provide a
much better user experience when running unit tests.
Carsten said it wasn't a good idea to run threaded tests in unit
tests. It didn't seem to isolate correctly, which was why they
did not run threaded tests that way at Decard.
Dennis thought there had been a move to make
`-checkaction=context` the default, but that had been blocked
because there were still bugs in the lowering. In some cases it
caused errors that didn't exist without it. He had run into one
related to scope slices some time ago. He wasn't sure what the
current state of that was, but said it still needed some work.
Martin came into the meeting then. Mathias said Martin would
agree with him about making `-checkaction=context` the default in
unit test mode.
Martin said he did agree, but that came with the existing problem
around template instantiations, so he'd have to think about it.
He mentioned the workaround currently used for BetterC to enforce
template emission and said maybe something like that could help,
but he was worried because it still didn't work in quite a few
cases. If it only failed in one case out of a million, that might
be acceptable, but as things stood he was cautious.
### Martin
Regarding work, Martin said he unfortunately was not using much D
for Symmetry at the moment because priorities for him had shifted
toward Python. Still, he did have one important thing to report,
and that was the status of the new GC.
He explained that the GC, originally Amaury's work for SDC and
then taken on by Steven to port to the symgc dub package, had
been integrated directly into Symmetry’s LDC fork. In their case,
using the symgc package as a separate dependency wasn't
attractive because they had many executables, dozens of test
runners, shared libraries, and so on. Pulling the package into
each one explicitly would have been ugly, so they had baked it
directly into the runtime and made it register automatically.
With the latest symgc 0.9.6 release, it now even defaulted to the
new collector rather than requiring an explicit opt-in. Their
main Symmetry product had already been switched over to use it by
default after several months of testing with people opting in
first. They hadn't seen any real issues during those months, and
the results had been very strong. Peak Resident Set Size (RSS)
was down by at least half, and in some cases by as much as
two-thirds. He said that in their environment it was now
production-ready, and they were shipping it.
At the moment they supported Linux and Windows on x86_64 only. He
thought AArch64 support had also gone into the latest
incarnation, perhaps Linux-only for now, but macOS was still
missing and that was a bigger piece of work. The long-term plan
was to get it working more broadly on AArch64 across platforms,
hopefully including Windows.
Beyond that, Martin said he hadn't had much time lately to work
deeply on LDC-related things, but there was one improvement he
wanted to get out in the not-too-distant future. He wasn't yet
sure what the exact plan was for 2.112 or whether the stable
branch would remain as it was or master would be merged back into
stable again, but he said one recent development was that LDC now
had a new contributor who had been helping with a major
refactoring of the configuration system.
He couldn't recall the person’s name off the top of his head, but
said he was Romanian and had been helping primarily with
configuration work, especially making separate builds of the
runtime and compiler easier, including cross-compilation of the
compiler itself. The old single ldc2.conf file in the etc
directory was being replaced in spirit by a configuration
directory model, similar to the old SysV style on Linux with
numbered files. The old single-file setup would still be
supported, but the new design would make it easier to inject new
configuration fragments or override specific settings without
touching the original file.
The main goal was better support for multiple targets. LDC had
long had implicit cross-compilation capability, and they wanted
to make that more accessible to users. Rather than editing the
full config file by hand, future tooling should let someone do
something like call a command for a target such as Windows x64
and have the appropriate prebuilt DRuntime and Phobos downloaded,
installed, and configured automatically. Then cross-compilation
could be done directly with the compiler or with dub using the
appropriate target option. He said that was the main recent area
of work on LDC.
Luís asked what kind of RSS reduction they had actually seen with
the new GC. Martin said that as a general rule of thumb, it was
around 50%, and in their tests they had seen fairly consistent
reductions in the 50-60% range. In some cases, projects that had
once peaked at more than 130 GB of RSS had dropped by about 60%.
In a few workloads they had also seen runtime improvements, but
he noted that performance varied more than memory usage did.
Luís said that although Weka mostly used fibers rather than many
threads, the memory reduction alone would be extremely valuable
to them. Some customers ran thousands of nodes, so lowering RSS
per node was really important. They had management nodes that
used gRPC and JSONValue, where some calls created a lot of GC
allocations. The memory was probably very fragmented. He thought
they could probably benefit quite a lot from the new collector.
He brought up another issue he'd forgotten about earlier,
connected to Weka’s new build system. They generated header-only
output from D files as a way of tracking dependencies, but
`-deps` was crashing, so they could only use `-makedeps`. They
needed a way to generate headers without also forcing code
generation. Right now, even for header-only output, the compiler
still had to go through code generation, and he thought there
should be a simple flag to say "only generate headers". He
believed Ilya had a proposal to implement that.
Martin said that at Symmetry they used Reggae for their builds,
wrapping a very large collection of dub packages and projects.
They relied on `-makedeps` automatically during normal
compilation and fed that into Ninja, which then updated its own
dependency database. He thought that was the preferable general
direction because it gave them the dependency graph for free as
part of normal code generation.
From his point of view, `-makedeps` should already be complete in
terms of imports. Whatever file was imported as part of
compilation should show up there, including DRuntime, Phobos, and
imported C files. So he didn't really see a need to move from
`-makedeps` to `-deps` in order to get a more complete graph. If
`-deps` gave some additional information, that was fine, but
`-makedeps` should at least already be complete.
Luís clarified that they did use `-makedeps` now, but had wanted
`-deps` because it provided more information. What they were
really after was the extra semantic information. The problem was
that when they tried to use `-deps`, the compiler got into a loop
and crashed.
He said they had also run into issues with generated headers
mixing up public and private visibility, so things that were
supposed to be public sometimes showed up as private in the
generated header. He wasn't sure whether the right direction was
to improve header generation or just avoid it and rely on
`-makedeps`. He needed to understand the system better.
Carsten said that when they had used `-deps` or `-makedeps` at
work, it had missed some imports. In particular, if there was a
local import inside a function, it hadn't always picked that up.
Martin said that if the compiler actually used that import during
code generation, then it should show up. If it didn't, then the
compiler had apparently decided it wasn't needed. Carsten said
that sometimes they simply stopped using it and ended up making
manual dependencies instead.
Luís said that one of the things Weka were doing wrong was how
they compiled unit tests. Their unit test binaries were very
large in part because when they compiled unit tests, they
compiled the unit tests of all dependencies as well. That meant
they were dragging in many unit tests that were never actually
used. Part of the reason for that was that they used
`version(unittest)` in ordinary code, which changed the ABI
between unit test and non-unit test builds. He called that a
really bad practice, but said getting people to stop doing it was
a challenge.
### Walter
Walter said that signing the releases had been his main concern.
His other big topic was AArch64, which was a long sequence of
taking a few steps forward only to trip over the next thing. He
said he had hoped he could get away without building a `memcpy`
into the compiler, but it turned out he really did need one. So
he had looked up the most efficient instructions on Godbolt and
was in the middle of building that into the code generator. That
was what he had been working on the night before until he got too
tired and went to bed. His immediate plan was to finish that and
then move on to whatever the next problem turned out to be.
Still, nothing insurmountable had appeared so far. The worst
problem had been around fixups, because every memory model and
every platform seemed to invent its own magical, undocumented
scheme for fixups and thread-local storage. He was baffled by how
completely different all of them were. Since there was no real
documentation, what he ended up doing was writing code, compiling
it, disassembling it, seeing which fixups were being used for
which storage classes, and wiring support in by hand.
He said some TLS references went through three indirections, some
through two, some through one, and there was no rhyme or reason
to any of it. He grumbled in particular about macOS and AArch64
inventing their own completely different and undocumented schemes
instead of following existing standards. He said varargs were
also implemented differently on every platform, CPU, and memory
model, and complained that macOS had even decided not to follow
the standard for varargs, while also adding a large warning
saying you could not just write standard C code and use their
scheme.
In the end, he said it was a grinding process. There was really
nothing anyone could do to help, and he just had to keep his head
down and push through all the undocumented details one by one.
### Conclusion
Our next meeting was the monthly meeting the following week. The
next quarterly meeting took place on January 9th, 2026.
If you are running or working for a business using D, large or
small, and would like to join our quarterly meetings periodically
or regularly to share your problems or experiences, please let me
know.
More information about the Digitalmars-d-announce
mailing list