D Language Foundation June Monthly Meeting Summary
Mike Parker
aldacron at gmail.com
Thu Dec 5 10:35:38 UTC 2024
The D Language Foundation's monthly meeting for June 2024 was
held on Friday the 13th. It lasted about an hour and 25 minutes.
This was the first time Rikki Cattermole joined us.
## The Attendees
The following people attended:
* Walter Bright
* Rikki Cattermole
* Timon Gehr
* Martin Kinkelin
* Dennis Korpel
* Mathias Lang
* Razvan Nitu
* Mike Parker
* Robert Schadek
* Steven Schveighoffer
* Adam Wilson
## The Summary
### The DMD ARM backend
Razvan asked Walter about his plans for the DMD ARM backend and
wondered if he'd considered alternatives, like merging the DMD
frontend with the LDC backend.
Walter said people had written him telling him they liked using
DMD because it was small and fast. He'd received a lot of
pressure over the years to implement an ARM backend. Other people
had shown an interest in writing one but then given up because it
was too difficult or time-consuming. So he'd just decided to get
it done.
He didn't plan on doing any optimizations initially. The ARM
instruction set was ridiculously complicated, but there was a
simple path through. He would stick with the simple path and not
generate optimized code beyond what the global optimizer and the
register allocator already did. Once the simple path was
implemented and working, the micro-optimizations could be done on
a per-instruction basis. So far, he'd made more progress than
he'd expected to. Simple functions could be compiled and the
generated code was correct.
He'd already written a disassembler for it because that made it
easy to check the generated code. A big issue was the lack of an
inline assembler. He didn't think it could compile all of the
runtime without one. Brad Roberts had already written an ARM
disassembler and had expressed interest in adapting it to ARM64.
That was independent of writing an ARM backend, so it would be
great if he got it done.
Razvan felt that anyone doing serious work with D would use LDC
for ARM. The only people he'd seen interested in an ARM backend
for DMD wanted it for toy projects. Though it might be
interesting for D's general direction, he wasn't sure if it was
the best way for Walter to allocate his time.
Walter said that was a great point, but he'd been surprised by
the amount of interest it had generated. Also, he thought it was
good to have control over the whole process from beginning to end
in the compiler. He had no idea how the LDC and GDC backends
worked, so adding a new feature could be a problem.
Martin asked Walter not to implement another inline assembler
syntax. We already had standardized, architecture-independent
inline Assembly expressions in LDC and GDC that were 100%
compatible with the GCC style. The code to parse it was already
in the frontend but only enabled for GDC and LDC. We already had
the special case for the DMD inline assembly syntax. That was
fine for legacy code. For the ARM stuff, DMD could reuse the
existing parser and we wouldn't need version statements all over
the place.
Walter said the Intel x86 inline assembler in DMD wasn't some
kludgy thing he'd made up. It matched Intel's spec so that there
was a one-to-one correspondence. The ARM dissaembler, and what he
intended for the assembler, matched the spec. He had no idea
about the syntax used by LDC and GDC.
Martin said that for x86 there were two dialects, Intel and AT&T.
Both LDC and GDC had gone with the AT&T dialect, which happened
to be less commonly used. But for ARM, they happened to have the
same dialect everywhere. The important thing was that it was
string-based so it could be architecture-independent.
He said the inline assembler was a minor point. Regarding
Razvan's point about Walter's use of time, Martin said that was
up to Walter. If he thought there was value in it, he should do
it. Years ago, when this discussion had come up before, Martin
had believed that Walter's time was better spent fixing bugs. But
he had a lot of industry experience now. Even Symmetry used DMD
for debug builds simply because of its speed. He agreed with
Walter on that. It was nice having everything in a single code
base, not depending on huge code bases with huge backends. We had
it all in DMD and it was fast. That was the main thing. So he
felt if Walter wanted to do this, he should be free to.
Regarding Razvan's speculation about merging the LDC backend with
DMD, Martin said that was never going to happen. The DMD frontend
was in LDC, so anyone who wanted to work on stuff with the LLVM
backend was free to do it in the LDC repository. Anything else,
if it were about merging stuff from the LDC repository into core
DMD, was just not viable. Anyone implementing a new feature that
required backend changes would need to be able to implement it in
C++ for LLVM. He said Walter would never have finished the
bitfield stuff if he'd needed to do it for LDC as well.
Walter said he didn't want to program in C++ anymore, and he was
sorry Martin had to.
Rikki said that DMD was dead on OSX without ARM support. He noted
that Atila wanted unit testing in a daemon. If you were writing
object files, you'd already failed. DMD's backend would be great
for a JIT.
Walter said there was another small point. Most people found it
nearly impossible to understand how the DMD backend worked and
how to improve or modify it. He could agree with them. He hadn't
looked at much of that code in years, and in trying to implement
the ARM backend he'd had to get back into it and try to figure
out how it worked. He could see how it was difficult to
understand. The structure of it was fairly simple, but all the
massive kludge instruction set of x86, all the special cases, all
the weird instruction sequences for various things... it was just
difficult to tease out their implementations. He was hoping the
ARM implementation would look a lot simpler.
So far, it was turning out a lot simpler, but it followed the
same structure as the x86 implementation. He thought it would be
more tractable for people who wanted to enhance the code
generator. It would also help people who wanted to modify the x86
backend. Because the structure was the same, they could look at
it to understand what a given function in the x86 version was
doing.
Walter agreed with Rikki that it could be used as a simple JIT.
He hadn't thought of that.
Steve said he hadn't used DMD on his Mac in a couple of years
because it was no longer native. He'd just been using LDC. But
the main thing was that all the frontend development happened in
DMD. So if we didn't have an ARM backend there, we wouldn't see
any problems with new features or changes until LDC had updated
to match it. He didn't know if that was a huge issue, but Mac
would probably stop supporting x86 at some point. Then we'd no
longer be able to say that DMD worked on Mac. So there were some
huge benefits to having an ARM backend in DMD, even if it wasn't
the best ARM backend in the world. As long as it worked and
generated valid code, then it was worth having.
Steve thought he agreed with Martin about the inline assembler.
He felt like it wasn't a hugely used feature. From that
perspective, it seemed like a waste of time to implement a
separate syntax. But he didn't use inline Assembly much, so he
didn't really understand the issues.
Walter said inline Assembly was needed far, far less than he'd
anticipated. But it was one of those things that when you needed
it, you needed it. Otherwise, you'd be programming in hex. And
that was unacceptable.
Timon said this was one of the cases where he would back Walter
on all points. It was important to have an ARM backend for DMD
because DMD was a very hackable compiler. It was easy to clone
and easy to build. It would be great if that kept working on ARM.
As for the inline assembler, he felt what DMD did for x86 was
much superior to what LDC and GDC did.
Walter noted that he wouldn't attempt to adapt the existing
inline assembler because it was a horrible piece of code. He
wasn't the original author, and every time there was a new Intel
instruction he had to support he was always worried he wouldn't
be able to get it to work.
Rikki thought that if anyone was using inline Assembly today,
that was a compiler bug. It indicated a lack of intrinsics.
Atomics, for example, should all be intrinsics. None of that
should be inline Assembly. So an inline assembler should be a low
priority.
### Moving Phobos v3 to the mono repo
Adam said that after a conversation with me at DConf '23, he'd
understood that there was a plan to move Phobos into the mono
repo with DMD and DRuntime. He understood that the CI
infrastructure had certain issues we'd have to work through, but
wondered if there was a philosophical reason why it couldn't be
done.
Walter said one reason was that the compiler shouldn't use Phobos
because of a bootstrapping problem. It would be too hard to debug
the compiler if he couldn't build it without Phobos. He was
concerned that adding Phobos into the mono repo would make the
temptation to use it in DMD too great. It would also be too
tempting to merge DRuntime and Phobos. To build a successful
compiler, he needed to be able to compile it and debug it without
Phobos.
Martin said that didn't have anything to do with the location of
the Phobos source code. We could still do what we did now and
ensure that no DMD code was using Phobos. From his perspective,
merging the DRuntime and DMD repositories had proven difficult
for LDC. They had their own forks of DRuntime and Phobos, along
with a repository of DMD tests extracted from the official DMD
repository. He'd had to create an entirely different scheme to
handle everything after the merge. Should Phobos be merged in,
he'd have to do the work to adapt again. And he probably wasn't
the only one depending on it.
He said the problems would mainly be downstream. He was never a
friend of the idea of moving Phobos into the DMD repository
simply because Phobos had nothing to do with DMD internals. The
compiler and the runtime were tightly coupled, so putting them
together made sense. It solved some pain points that existed when
they were in separate repos. But he didn't think he'd had to
create a Phobos branch and a DMD branch at the same time in
years. The coupling between them was very low. He saw no good
reason to move Phobos into the DMD repo.
What he found tedious was the build. For the DMD tests to
succeed, he first had to go into the DMD repo and run the
makefile to build DMD and DRuntime. Then he had to cd into the
`phobos` directory to build Phobos because the DMD tests depended
on `libphobos.a`. He said that was a pity, but he didn't know if
it justified moving Phobos into the mono repo. He thought if that
were to happen, we'd also need to move the dlang.org and
installer repos into it for completeness, which he thought was a
bad idea.
Mathias said it was never the plan to move Phobos into the mono
repo. We had always pushed back on that idea. He didn't think we
should do it. He understood we were moving away from distributing
a precompiled Phobos for editions.
Adam said he and Rikki had had a lot of discussions about this.
They felt that the coupling between DRuntime and Phobos was bound
to increase if we did anything beyond what Phobos 2 did. For
example, one thing that always came up when he discussed DRuntime
was fibers vs. stackless, i.e. stackful vs. stackless coroutines.
He'd talked with Dmitry Olshansky, and Dmitry had realized that
fibers were probably not the way that D would work in the future,
and he recognized that meant that we'd need to add stuff to
DRuntime like an event loop and some interfaces. The compiler
would need to know about it and do some rewrites, but it would be
Phobos primarily linking to it. The actual objects we'd need for
it would be in Phobos.
So in his view, coupling was going to get worse in the future,
not better, but he didn't see any way around it. Even if we were
doing fibers, we'd still be adding stuff, just less of it.
Another thing that had come up in discussions Adam had with
Walter was replacing the C file I/O with system file I/O. That,
too, would increase the amount of coupling. It might be low now,
but we shouldn't expect it to remain that way.
Walter said it was okay for Phobos to depend on the runtime, but
the runtime could never depend on Phobos. Adam agreed. His point
was that Phobos would depend on DRuntime much more in the future.
So we'd be in a situation where implementing some things would
require changes in both repositories.
Mathias noted that we were already doing that with two
repositories and it worked. If we did move toward more
integration, then we should certainly consider if we should merge
the repositories. But he would like to discuss that on its own
merits. At the moment, there was no goal or reason to do it.
Rikki said that DRuntime didn't need to be with DMD. The coupling
was a lot less than people thought. To `new` a class, you didn't
really need a GC. Any function that allocated memory, like
`malloc`, would do. He thought that extracting DRuntime out of
the DMD repository and instead having a mini-DRuntime that we
could dog food would be a better way to go.
Timon noted that OpenD had merged the most popular dub libraries
into the main repository. I said I could promise there was no
plan for that. Robert said that taking the good ideas from those
libraries and implementing them in Phobos was something he would
be after.
Steve wanted to point out the different kinds of coupling we were
talking about here. If you had a feature that had to be
implemented in both DMD and Phobos, then you couldn't implement
the compiler side of it and then later on implement the Phobos
side of it once the compiler side was solid, because you couldn't
test it without both sides being implemented. With DRuntime and
Phobos, it was a different proposition. You could add anything
you wanted to DRuntime, like a new class, that nothing else was
using, and it would be fine. Then later on you could add the
equivalent piece to Phobos. It wasn't the same kind of coupling.
Mathias noted that in the past the runtime interface was
implemented as a set of C functions. The compiler would know to
emit calls to those functions and it was great. The problem was
CTFE. You couldn't do it with the C functions. There were other
features implemented in the compiler to match what the runtime
was doing.
In recent years, we had moved to a templated interface. Instead
of calling a C function, we instantiated a template with a
certain set of arguments. That required the code to be known from
DRuntime, so the coupling had increased over the last few years.
Rikki said that in his proposal, those kinds of hooks would
always be with the compiler. They would never be in a separate
repository.
Adam said the most common complaint he'd heard so far was that
DRuntime was already too big and did too much. He thought people
hadn't read what was actually being proposed: that we trim down
the runtime to only the essentials that the compiler needed and
leave that in the compiler repository; everything else we rip out
and put somewhere else. That way people doing ports would have
just a small kernel to worry about without all this other stuff
coming with it.
Martin said he fully agreed. He cited the standard C headers as
an example. Why were they in DRuntime? He didn't know. Maybe they
were used somewhere in DRuntime and so that was why they got put
there. He emphasized that it was about more than just the
compiler hooks. It was also about binary reflection things that
were needed at runtime. It was about threading and thread-local
storage. The GC needed to know about TLS things, the static data
segments of each binary.
He said it was about exception handling, which depended on the
exception personality function used by the compiler, and which
varied on Windows. For example, DMD had its own personality
function in the runtime, but LDC used the Microsoft C++
personality function and hacked the terminate handler to
implement chained exceptions and other stuff. It was all hacky,
but we could catch C++ exceptions in D and even throw C++
exceptions from D and catch them in C++. These were all little
compiler details that just happened to be known about in DRuntime.
He said it was all about the little state and the protocol
determining into which section the compiler emitted the
`ModuleInfo` pointers so we could get ahold of all the module
inputs, all the linked object files. We needed those for the
`ModuleInfo` definition itself. There was protocol between the
runtime and the compiler that was hardcoded into the compiler.
That wasn't something you could just add to your own object file
or put in the runtime. The `TypeInfo` stuff was all hardcoded as
well.
He wanted to stress that it was about so much more than hooks.
But he was fully in favor of a small DRuntime. There'd been talk
about it for years. Something that just had `object.d` with its
hooks and public aliases that were required by the compiler, and
then some of the runtime binary stuff that he'd just mentioned,
which in some parts was only GC-specific. If we didn't have the
GC, we probably wouldn't need to know about TLS ranges.
Rikki noted that exceptions depended heavily on the runtime to
the point that you couldn't have stack unwinding working in
BetterC. That definitely needed a rewrite, because stack
unwinding should never be turned off. That was a pretty big bug
that other compilers didn't have.
I asked everyone to pause here for a poll. My takeaway was that
there was no way Phobos was going into the mono repo, so I asked
if that was the consensus.
Steve said if the question was whether Phobos should be put into
the same repository, he would say no. But it would be good to
have a better delineation in DRuntime between what the compiler
needed and what was intended for the library.
I said that was my next question. What emerged from this
discussion was that we should slim down DRuntime to the core
needed by the compiler and put the rest somewhere else. Walter
said it wouldn't necessarily have to go anywhere else. It could
be handled by placing the compiler stuff and the library stuff in
separate packages.
Adam said there was a reason he'd brought this up. We wanted
Phobos to be a source-only library, and that was great. But right
now it wasn't. Looking through the source code, there was a very,
very good reason for that. So if we really wanted to do that, we
would have to move what he called the "Phobos runtime" somewhere
else.
For example, there were `version(Windows)` statements all over
the place in Phobos right now. So that kind of thing should be
taken out and placed somewhere else. Then we could have a
source-only library. Otherwise, he didn't know what we could do
to get there.
Walter said it would be nice if Phobos could be cleared of all
the system-dependent code. Adam asked what then should be done
with the runtime. I said I would leave it with Adam to let me
know when he was ready to have a planning session about that
topic and asked if everyone was good with that. They were.
### Why vibe.d isn't winning benchmarks
Rikki said he had been inspired the previous month to review
vibe.d because it wasn't winning benchmarks. He'd looked at the
core and found it was handling events by polling 64 handles per
thread. Multiply that out and it was a huge overhead. You'd run
into the issue where you could have one CPU core busy and the
others idle when all 64 handles on that one thread had work on
them.
He said the reason it was done that way was because 12 years ago,
we understood that fibers couldn't be moved safely between
threads. One way to fix this, and maybe Walter could preapprove a
DIP for it today, would be to introduce an attribute, e.g.,
`@notls`, that banned TLS access, then add it to an optional
overload in the fiber API. Then any fiber overloading it could be
safely moved.
Walter said he didn't have any objection to that.
Martin said he thought LDC had something like that in its runtime
already. It was a little LDC extension that could be enabled to
keep track of whether a fiber had migrated to another thread, and
then throw something. There might be an implementation there that
could be upstreamed. But that was a big discussion that would be
more appropriate for a topic-specific meeting.
Walter said another solution might be making the functions pure.
Pure functions didn't allow access to mutable global data, which
was what TLS data was. Rikki said that wouldn't be workable for
VM hooks and things like that. Banning TLS and having blacklists
and whitelists would be the easiest way to handle it. And at
least it provided a migration path until we got proper coroutines.
Mathias suggested running one scheduler per thread. Rikki said
the problem came down to the IOCP event. We needed to be using
IOCP. That meant we had to support moving fibers between threads.
Otherwise, we'd be stuck with 64 handles per thread. Adam
seconded that. He said everything on Windows depended on IOCP
these days. You couldn't get performance, throughput, or low
latency without it. We had to accept this.
Mathias asked if this was a Windows-only requirement. Adam said
that iou_ring on Linux was the same. Rikki said the same for
epoll. Mathias said you could run an epoll on every core. Rikki
said you'd still get events for a handle only on one of the
threads. IOCP had been the gold standard for 25 years since
Windows 2000.
Walter said this sounded like a really important technical thing,
and he didn't think we could solve it in this discussion. He
needed to learn more about it. He suggested going into the Ideas
forum and posting about it, and then we could relax and discuss
it. He had a long list of questions about it, but it was too much
for this meeting. Rikki agreed.
### dpldocs.info
Steve noted that Adam Ruppe's dpldocs.info was unavailable
because of a funding shortage. He explained the site hosted
documentation for packages in the dub registry and a link was
inserted on each package page at code.dlang.org. So if a package
maintainer didn't build and host any documentation for a given
package, the "Reference" link to the docs on dpldocs.info would
still be there. Even in the absence of doc comments, it would
still publish APIs. He had [submitted a PR to remove that
link](https://github.com/dlang/dub-registry/pull/573) while the
site was unavailable.
He asked if it made sense for the DLF to take over funding for
the server. I thought it had been there for a long time, and
asked if that was correct. Steve said yes, it had been there for
a while. As such, I said it was something we should try to
continue maintaining, but I didn't like the idea of paying for
something separate when we already had a server that probably had
the resources to run something like this. I asked Mathias if he
thought it was feasible to run it on our existing server. He said
probably so.
Steve agreed and didn't think we should be paying for it in that
case. He added that we should set up documentation somewhere
showing how to create and host documentation on GitHub to
encourage more package maintainers to publish their docs.
Walter said he was okay with hosting it on our server if there
were no licensing restrictions. Steve said there weren't any.
(UPDATE: I have since reached out to Adam Ruppe and he agreed
with the idea of migrating the service to a DLF server.)
### The .di generator
Rikki had been looking into the .di generator and concluded it
was currently useless for DI files. He did start a PR that did a
complete overhaul of it, but he'd run into issues because of
things getting lowered and information getting lost. He wasn't
the right person to fix it. It had to be moved after semantic,
otherwise you didn't get attributes, and `scope` and `return`
were getting interpreted the wrong way around after generation.
Mangling didn't even match up. He just needed to hand it off to
someone.
I asked who he wanted to hand it off to. Rikki said he thought
Razvan should have the first crack at it since the AST was his
thing. Razvan said he could take a look at it, but the idea of
going through special cases of lowerings and doing the right
thing was something that didn't make him enthusiastic.
Martin thought it wasn't a big deal. If it hadn't been fixed by
now, then apparently no one was using it. He didn't see a good
use case for it. If you needed it for some closed-source thing,
it would only really work if you weren't using many templates. If
everything was templated, you really couldn't ship anything
closed-source. It just didn't play a role in open-source
development. The C headers were probably more interesting than
the D headers. He had no motivation to fix it, and he suspected
that would be true for others.
Adam said that if that were true, the correct thing to do would
be to remove the feature. Having a broken feature that didn't do
what it promised to do wasn't a good idea. He also could make the
counterargument to that, because he was using DI generation
heavily with ImportC. As near as he could tell, that did work,
because there wasn't a lot of semantic work needed just for C
headers. It was just dumping attributes.
He didn't have an answer for this. But he'd been planning to redo
the headers for DRuntime, like the Windows modules, using ImportC
and .di generation.
Razvan noted that parts of the DI generator were used inside DMD.
For example, if you wanted to print some AST nodes, then you'd be
using functions from the DI generator. You could probably still
do that if it were moved after semantic, but it made the
dependencies a bit weird.
Rikki said there were only three things related to lowering that
he couldn't fix, but it was doable. But it was used for error
messages, so it needed to be fixed. Razvan said he hadn't looked
at the PR recently, but if the cases were detailed there, he
could take a look and try to fix them.
Mathias thought that if Rikki handed it off, it wouldn't get
fixed. Rikki was interested in it and had a good feedback loop,
so we should do whatever we could to support him in fixing it. He
wasn't hopeful it would get fixed otherwise. And he would like to
use it in DUB. There was an issue that DI files could help with,
but he knew it wasn't working at the moment.
Rikki said it was at the point where it just needed a complete
overhaul. Walter said he didn't know what it was doing wrong
because he hadn't seen any bug reports about it. Mathias asked if
he'd tried using it. Walter said he had used it, but he was
hearing here now that it was unusable and he didn't know what the
problem was. That was why we had Bugzilla.
Rikki said that Walter should start with inference. Until it
could be moved up to semantic, it wouldn't work. Walter said he
needed concrete examples, not handwavy stuff. He needed to see an
actual generated DI file that was all wrong. Rikki explained
again that `scope` and `return` were problematic because
generation wasn't happening after semantic. Walter said his mind
didn't work without code examples. In a conversation like this,
he couldn't work out what the problem was. He needed it written
down. It was just a quirk of his and not Rikki's fault.
Rikki said he could fix most of it. It was just three lines that
stumped him. Walter said if it was just three lines, that sounded
like a perfect Bugzilla issue. Rikki said it wasn't a bug today
because it was running before semantic. It was the lowerings of
`foreach`, anonymous classes, and assign expressions and stuff.
Walter said that had come up before and he'd put a special hack
in the compiler to use the unlowered version when a `.di` was
being generated. He asked again for a Bugzilla issue, because
otherwise he'd forget about it. There were always things that
needed to be done, and if something wasn't in Bugzilla it
probably wouldn't be done.
Martin was curious about Adam's intention in generating `.di`
files for the Windows headers with ImportC. Was it intended to
replace the modules there already or was it just for debugging?
He didn't think we could go with such a solution on POSIX because
of the dynamic nature of ImportC and all the predefined macros to
deal with across platforms.
Adam said that in his experience the Windows headers and API were
incredibly stable, though he was sure we could find corner cases.
He felt that using ImportC for DI generation was better than all
the other options. It took in the post-processed version and
because the D compiler was also a C compiler, it just worked.
He'd used it on the ODBC headers and it worked brilliantly. Those
were now part of the Windows headers in DRuntime.
He thought we could start doing more Windows headers like this.
Then when there was a new Windows SDK, updating was as simple as
feeding the new SDK's path to the build system and generating the
DI files. This had come up because he'd been working on Phobos v3
and DRuntime, trying to figure out what needed to be done. Using
ImportC and DI generation for this was better than any other tool
for generating bindings from C headers.
Martin asked Adam if using ImportC directly was too slow for his
liking because it had to preprocess every time you imported a
module that used a given header. He asked if Adam had seen a big
performance benefit over using DI generation via ImportC rather
than just using ImportC directly.
Adam said the motivation had come from tooling. He used VSCode a
lot, and code-d could read the DI files where it had nothing to
hang onto when you just used the regular version. There probably
was a performance benefit by not preprocessing so often, but it
wasn't the motivation.
Steve said there was also the issue that you couldn't organize
ImportC files, but you could organize DI files. DI files were
independent modules, but ImportC files went into one big module,
so you'd have conflicts if you imported from multiple places.
Adam said he'd generated DI files from ImportC for some work he
did with zstd and it worked great.
I noted that we had strayed away from the original topic. I asked
Rikki and Razvan if they were going to link up to talk about it
further. Rikki said he thought that was the way forward. He and
Razvan could try to figure out how to fix the things he hadn't
been able to fix and then break up his PR, and he could do it
more slowly.
### Feature-focused documentation/user guide for D
Steve said a D user in Discord had been trying to get his team
into D, but every time they complained that the documentation was
hard to use. He brought it up because everyone in the meeting and
many D users were familiar enough with programming languages that
they didn't see docs in the same way. We had some tutorials and
we had Ali's book with a lot of good stuff in it, but it was all
focused on syntax and how you do things in D. He was wondering if
we couldn't have a more feature-focused set of docs.
He pointed to [the C#
documentation](https://learn.microsoft.com/en-us/dotnet/csharp/)
as an example. They had a reference that listed all the functions
and their parameters and so on, but they also had more
beginner-level, feature-focused docs. For example, if you wanted
to use classes, then here's how you use a class, here's how you
build it, here's how you use this and that, and so on. He was
trying to think how we could improve our situation to have
something similar, like maybe through a Symmetry Autumn of Code
project.
He found the D documentation really easy to use. But he couldn't
see it from the perspective of someone who wasn't using D every
day or wasn't heavily into programming languages.
I said he was basically describing a guide. He agreed. He knew we
had the D Tour, but it was pretty short and more about how things
worked in D compared to other languages.
I said that I remembered the Dart guide going into how to make
specific types of programs, like an example command-line program,
example this, example that. I noted that at DConf '23, Mike
Shah's students cited the documentation as a big negative in
their D experience. Steve said the person on Discord had pointed
to that talk and said he was happy to hear someone else had the
same issue.
I said this was something we could put on my task list. It would
be a few months down the road before I could look into it, but
this was definitely for me. Rikki suggested we needed a technical
editor to evaluate this and thought it was a perfect project for
SAOC. I didn't think this would work as a SAOC project, but I
wasn't sure.
Walter said he was very bad at writing tutorials. He never knew
what made a good tutorial and what didn't.
Dennis said the problem with documentation issues was that users
often didn't report them. They'd find the documentation hard and
then just try somewhere else. But the information about what was
so difficult was often lost. When he came across something
himself, like the docs didn't explain well enough what a function
was doing, he'd try to improve it. But that was just him
stumbling across things as a contributor. He didn't know what
other people were stumbling over. It would be nice if it were
easier for users to report that the docs were unclear about
something.
Martin said it was already quite easy. On every documentation
page there was a link that simplified creating a pull request for
a fix. Steve said that was true for the spec pages, but not for
the general documentation. And even then, that wasn't the kind of
thing he was talking about. If the docs were missing some
information or something, that was a different issue. He was
thinking of new users wanting to know, for example, how to create
a thread, how to do concurrency, and so on.
He said if we looked at the docs for other languages, we'd see
things like here's how to do this, here's how to do that, here's
how you'd do operator overloading, but none of that was the spec.
There was an operator overloading spec that was really technical,
but then there were other things that showed how to do specific
tasks, like what to do when you wanted to add two objects
together.
I told Steve I got where he was coming from, and I suggested that
everyone go and look at [the link Mathias had posted in the
chat](https://docs.divio.com/documentation-system/) that outlined
different kinds of documentation. I recalled that Paul from Ucora
had brought this same thing up before.
Walter said it seemed that writing a tutorial was a rather
daunting task, but there was another way to do it: the D Wiki. If
someone said they needed a tutorial on operator overloading, that
could become a Wiki page. Then you wouldn't have to think about
the rest of the language or have a complete set of tutorials.
Various tutorials could go into the Wiki as they were needed,
then another page could link to them all. That might be a way to
get to where we wanted to go organically without pushing someone
to write a massive, book-style tutorial.
I said that what people wanted wasn't tutorials, but a how-to
guide. There were examples on other language websites. Like Steve
said, they had a reference, and then they had a guide. They
segmented these things out. For D, we had some tutorials and we
had a reference. I'd always seen Ali's book as a kind of guide,
but apparently it wasn't seen that way by newcomers. We needed a
guide on dlang.org.
Mathias said we did not have any how-to guides. He noted the link
he shared broke documentation down into four components. The one
we were sorely lacking was the how-to guide showing how to solve
specific, self-contained problems.
Steve pointed at [the Tutorials page on the D
Wiki](https://wiki.dlang.org/Tutorials) to show Walter we were
already doing what he suggested. This had come together
organically. No one sat down and said, oh we need this and we
need that. It just came together as people thought of putting
things there. It had nowhere near the kind of coverage we needed.
Walter said he had an answer for this: ChatGPT. Some of us
laughed, and he said he wasn't joking. He'd realized that in
order to run the C preprocessor efficiently from ImportC, he
needed to learn how to use pipes. There were several functions in
the API. The documentation explained what the functions did, but
didn't show how to use them to construct pipes. So he'd gone to
ChatGPT and asked it to write a program that forked another
program and captured its output, or fed it input, and it barfed
out a working program. It saved him a lot of time.
He'd done this a couple of times when he was unsure how to
combine features to get a result. So if someone came to us
looking for "how do I do operator overloading" or something, we
could just ask ChatGPT, see what it came up with, fix the errors,
and then put it up. It could be a huge labor saver for us. And
why not? That's what it was good for.
I said we needed the guide not for people asking us how to do
things, but for people trying to figure out how to do things on
their own, finding we didn't have that information, and then
going somewhere else. Walter agreed, and we should use ChatGPT to
help us make that guide. I said I could see asking it for an
outline for a comprehensive guide as a starting point and then
going from there.
Steve thought we didn't need ChatpGPT. We could just go look at
guides from other languages and see what they covered. Walter
thought ChatGPT would be easier still. Once you had the list of
topics, you could ask it to show you examples on that topic. It
would be a big time saver.
I said I'd go ahead and take this. That didn't necessarily mean
that I'd be the one to write it, but I'd look into it and see how
to approach it, come up with an outline for it, and go from
there. Maybe once I had an outline we could find some
contributors to help fill it out. Maybe I could do it myself
using ChatGPT to help, but it wouldn't be anytime soon.
Steve said he was good with that. He suggested that once I got
around to it I should ask for feedback from the community to get
an idea of what the documentation pain points were. I agreed.
Steve said that was his main problem: the docs worked fine for
him, so he just couldn't see what problems other people had with
it. I joked that they should have seen the docs in 2003 when I
first learned D. Steve said that you had to walk uphill both ways
in the snow to read the docs back then.
### Last-minute updates
Before we logged out, Walter said he'd been posting updates on X
about his work on the ARM backend, so anyone interested in it
[should follow him there](https://x.com/WalterBright).
Then Mathias said he'd started working a little on DUB. He'd left
it on the side for a while. He'd fixed some performance bugs and
was planning on getting to work on adding support for YAML. He
asked how many of us would be angry with him for introducing
`dub.yaml`.
Steve said YAML was awful and he wouldn't be happy with that. I
said I didn't care as long as SDLang support stayed in. Steve
said that couldn't be removed because it would break stuff.
Mathias said he wasn't getting rid of anything, but he wanted
something more well-known. YAML was also user-friendly, and JSON
didn't meet the bar there.
I said I saw no pitchforks, so it seemed he was okay. Steve said
he wanted his pitchfork. He said he didn't like YAML because
there were too many ways to do the same thing and he could never
figure out what things meant. Adam said he absolutely hated it.
He had to use it on a build system and wanted to put an axe
through his computer each time he did. It might be well-known,
but that didn't mean it was good.
Steve suggested TOML or other simpler formats that might be
useful. Mathias said instead of TOML, he might as well just stay
with SDLang and call it a day.
Robert said he hated to do it, but he had to agree with Mathias.
People knew YAML. As bad as it was, it had won to a certain
degree.
Finally, Rikki informed us he had started on a proposal for owner
escape analysis.
## Conclusion
We agreed to discuss trimming down DRuntime at a planning session
on June 21. Our next major meeting was a quarterly meeting on
July 5. Our next monthly meeting took place on July 12.
More information about the Digitalmars-d-announce
mailing list