D Language Foundation December 2023 Monthly Meeting Summary
Mike Parker
aldacron at gmail.com
Wed Mar 27 20:32:16 UTC 2024
The D Language Foundation's monthly meeting for December 2023
took place on Friday the 8th at 16:00 UTC. It lasted two hours.
## The Attendees
The following people attended the meeting:
* Andrei Alexandrescu
* Paul Backus
* Walter Bright
* Iain Buclaw
* Martin Kinkelin
* Razvan Nitu
* Mike Parker
* Adam D. Ruppe
* Steven Schveighoffer
* Timon Gehr
* Adam Wilson
## The Summary
### Me
I opened the meeting by detailing my plans for how we run our
monthlies going forward. The approach we'd been using from the
beginning was to give each person a turn, allowing them to bring
up multiple topics before moving on to the next person. Sometimes
someone had nothing to report, sometimes one or two issues,
sometimes a progress report on their work, and sometimes one or
more issues that got us into long discussions. Given that our
invite list had grown quite a bit in the preceding months, this
had become cumbersome, leading to overly long meetings or
discussions being abruptly tabled in the interest of moving on.
So, I informed everyone that starting with our January monthly
meeting, I would send out the invitations earlier than usual and
ask everyone to email me a prioritized list of agenda items. Then
at the meeting, I would only call on the people who sent me a
list, going round robin in the order I received them, starting
with the first item from each list, then the second, and so on,
until either there were no more items or we hit the
hour-and-a-half mark. If we did hit the time limit, we could
decide whether to go on to two hours or not.
I introduced and welcomed Paul Backus. This was his first time
with us. I'd had a call with him a couple of weeks before and
invited him to join us. He'd said, "Sure, I can come in for a
meeting." I told him I wasn't asking him to come to one meeting
but to join us as a regular member. I thought his contributions
would be valuable. Happily, he accepted.
__UPDATE__: We did start the new approach in January.
### Adam W.
Adam W. opened by telling us he'd received an email from someone
using the crypto library he'd written a few years ago. The person
reported some bugs and made the case that D needed crypto in the
standard library. Without that, it was hard to know which library
to trust. Adam W. said he was going to fix the bugs and, since he
had now started working on Phobos v3 (which the person who
emailed him had no way of knowing), wanted to talk later about
getting crypto in.
Regarding Phobos v3, Adam W. said he and Walter had discussed it
at the Seattle meetup in November. He'd sent Walter a document
and Walter had suggested he put it up on GitHub for feedback and
discussion. At the moment, he and Walter were having a debate
over how to version the standard library, and he expected that
would continue at the next Seattle meetup the following week.
__UPDATE__: You can view [the Phobos v3 Design
document](https://github.com/LightBender/PhobosV3-Design) in Adam
W.'s repo, and participate [in the ongoing
discussion](https://github.com/LightBender/PhobosV3-Design/discussions). The repo was initially private, but he made it public during this meeting.
### Timon
Timon said he had some type system and language issues but didn't
think they were at the forefront right now. He suggested we could
discuss them in a different meeting. I asked if he wanted to get
in on our planning sessions. He said he did.
### Adam R.
Adam R. said that the PR for the `@standalone` attribute opened
in August and the string interpolation thing that had been open
for a while were both stalled out. He then said he was very
interested in the Phobos v3 stuff and would love to see the
document. Adam W. said made the repo public and posted the link
in the chat.
I said I'd thought Walter had approved `@standalone` in a
previous meeting, then asked if Razvan or Dennis had looked at
the PR. Dennis said there had been a weird test failure on it,
but it was passing now. He thought the bug might still be there,
but just wasn't triggering. Even so, since it was green, it was
going to be merged. Paul said he'd dug into it and found that the
problem was a timeout on the CI test runner, so it shouldn't be a
blocker.
Walter said there had been disagreement over whether the feature
should be an attribute or a pragma, and that had been his main
objection to it. He thought it just didn't look good as an
attribute, especially given how it was an extremely specific use
case. He thought pragma was more suitable for it.
Adam R. noted that pragmas weren't backward compatible. Walter
said unrecognized pragmas were supposed to be ignored. That was
their intended purpose. Dennis said that's not how the compiler
currently worked. There was a switch to ignore pragmas. Walter
hadn't been aware that had been added. He told Adam he'd take a
look at the PR again.
Timon commented that although pragmas are supposed to be benign,
pragma mangle could break safety guarantees. Walter said he
certainly hadn't thought about that. He asked Timon to post a
Bugzilla issue, and [that's now Issue
#24275](https://issues.dlang.org/show_bug.cgi?id=24275).
__UPDATE__: Walter approved the PR, and `@standalone` [was
included in
2.107.0](https://dlang.org/changelog/2.107.0.html#dmd.standalone-attribute). With the same release, [unrecognized pragmas are no longer an error](https://dlang.org/changelog/2.107.0.html#dmd.pragma) and are instead ignored.
I next reminded everyone that Átila had volunteered to write the
spec for the string interpolation implementation. He'd gone on
vacation for a couple of weeks, and when he came back he'd told
Adam he was too busy catching up with Symmetry stuff and would
get back to it later. Adam said a problem with D in general was
that everything moved at such a slow, slow pace. I told him I
dreamed that we'd be in a position to make things go faster at
some point.
### Paul
__Questions__
Paul said he didn't have any specific issues to bring up, just a
couple of questions. First, he asked about the status of DIP 1000
and scope, and what the plans were for moving forward. Who was
responsible for it and where were they writing things down about
it?
Walter said he and Dennis had been the ones working on it, and
they'd only been writing things down in terms of bug reports and
pull request comments. I said that my understanding was that we'd
decided to defer the full implementation to an edition, and I
wasn't sure if the documentation was up to date. Dennis said the
spec should be mostly up to date, though it may not be complete
on every detail. The main issue was that we'd halted making it
default because of breakage, so we'd decided to wait until
editions were fleshed out. There had been some alternative
proposals at DConf, so he was unsure how to continue when we were
not going for DIP 1000 by default yet. We could continue fixing
bugs in the meantime, though.
Paul said he was just wondering where to go to know that these
kinds of decisions had been made, and how things were
progressing. Was it just here in these meetings and the
summaries, or was there another written record? I told him there
were no other records.
Paul's next question was whether anyone was working on extending
attribute inference to all functions, and no one knew of any such
effort. Walter said a big issue with that was that it would
dramatically slow down the compiler. After a bit of discussion,
Paul clarified that the reason he was asking these questions was
because he was concerned there might be work or planning going on
that interested parties would miss, and that could lead to
duplicated effort.
Walter said we didn't know what people were doing outside of what
we talked about in our meetings. People tended to self-select.
The way to find out was to post in the newsgroups and ask if
anyone was working on anything. I reminded everyone that we [had
a project tracker](https://github.com/orgs/dlang/projects) that
we all should be using so that anyone could see what we were
working on as we were doing it. I was the only one using it
regularly. It would be great if all of us could incorporate it
into our workflows.
__Speaking of attribute inference...__
Adam R. asked Walter if he'd approve global attribute inference
if someone showed him an implementation that didn't significantly
increase compile times. Or did he have other concerns? Walter
said that was the main concern because it required the compiler
to do semantic analysis of the function's body. You could also
run into chicken and egg problems when you needed to know the
attributes, so you needed to compile some other function, then
that function required something else to be compiled first, and
that could cause all these circular reference issues. But compile
speed was the primary issue. For performance reasons, the D
compiler tried to compile only what it had to.
Walter's main fear was that it would change the order of semantic
analysis, which was a very fragile part of DMD. He was afraid
that existing code would break in really weird ways. He suggested
we could do it gradually, like turn it on for constructors or
member functions, and see how that goes before enabling it
generally.
Razvan said he expected we'd have more occurrences of an issue
that currently happened with attribute inference on templates. If
you had two templates cyclically calling each other, then the
compiler just inferred them as being `@system`. It was more
conservative in this aspect, not smart. Because templates were
often used like normal functions, that problem didn't appear very
often. But if you turned on attribute inference for all
functions, it was going to hit more frequently. We'd need to fix
this issue first.
Timon thought that recursion in template functions was actually
quite common. He said in general, the issue with attribute
inference was that it wasn't decideable with all the
introspection capabilities D had. What should probably be done
was not to compute the smallest fixed point, which was done now,
but to compute the largest fixed point.
Walter agreed, saying that now if the compiler failed to infer
attributes it took the most conservative approach and decided
there were no attributes. We could flip it around and make it
more aggressive when it hit the circular conundrum. He wasn't
sure how it would work out. Timon said it should only do that if
there was no reason not to do it. If something caused a safety
error, then the compiler shouldn't infer safe, but otherwise it
should. Right now, it just didn't.
Walter said the problem was that if you did that, you'd have to
go back and all the functions that you'd already marked as being
safe would have to be unmarked. He wasn't saying it wasn't
implementable, but it just wouldn't work the same way. Timon said
it was probably tricky. This was why it hadn't been done yet, but
we could work on it. Razvan agreed, but he just wanted to point
out that he thought this was going to bite us.
Adam said he just wanted a commitment that if we could solve the
problems, the speed problem, etc., that it would get in. In that
case, it would be worth trying, but wouldn't be otherwise. Walter
said if the problems could be solved, then it was worth merging.
Walter noted his own experience with this. He kept trying to add
`const` and other attributes to the DMD source code and found
that D was completely recursive. Everything eventually wound up
depending on everything else, making it hard to use `const`
anywhere in it. It was frustrating, and he expected other
attributes would have the same problem.
### Steve
Steve said he'd done his new class teaching D to homeschool
students, and it had gone very well. He was in the process of
building a website that he could reuse for it later. He was
scheduled to teach a follow-on class in January.
### Iain
Iain said he'd pushed out 2.106.0 at the beginning of the month.
On the infrastructure side, he said that tour and
run.dlang.io/.org had gone offline for about half a month. So
he'd set up a copy inside a container on one of the build CI
machines that he owned. It was a permanent place for it until we
were ready to move it to a DLF server. He asked if there was
anyone looking into making that happen. I told him I'd had an
update from Petar Kirov. He wanted to get the Tour set up so that
it was just a one-click, automatic deployment. That's what we
were waiting on, but I had no idea when he would get it done. He
did have access to our VPS account, though, so whenever it was
ready he could get it set up without blocking on anyone else.
Then any of us who had access to the account could spin it up
when needed. Ideally, I thought that should generally be Iain,
Mathias, Robert, and whoever else was suited for it.
Next, Iain said GDC was still tracking mainline. He was in the
process of bootstrapping and regression testing the merge commit
for 2.106. Once he got the results back from that, he'd push it.
He'd gotten sidetracked on that a bit because the refactoring
Razvan had been doing had triggered an old template regression.
It didn't affect the newer releases, but some targets depended on
an older version of GDC to bootstrap the latest compiler. He'd
worked out that it was just the first version of GDC that got
merged into GCC that was affected, but he wasn't quite ready to
bump the baseline. So long as we kept GDC 9 working with the DMD
mainline, he was happy.
### Martin
__Sucess stories__
Martin said he would start with some little success stories.
First, 2.106 was looking pretty good. He'd tested it on the
Symmetry code base and had encountered no unit test regressions
so far. Nor had he noticed any performance regressions. He hadn't
checked very deeply, but it was looking good. Ditto for LDC 1.36:
no unit test regressions anywhere.
He said he'd undertaken his first ImportC experiments over the
past few weeks and it was looking good. He'd done it on
production code, using three libraries, including Postgres. The
preprocessed C file on Windows was over 200,000 lines, over
400,000 when using the Microsoft preprocessor, and ImportC was
able to swallow all of it. The general bindings seemed to be
sufficient.
He said the C libraries they used didn't make use of a lot of
macros, so that was one reason why it worked so well. He'd also
tried it on python.h, which was a monster of macros, and nothing
worked there. They still needed to use DPP for that. But
comparing ImportC and DPP, ImportC was easier once he figured out
that he shouldn't compile the C file, just import it. That got
him around the issues regarding inline assembly and missing GCC
macros he'd brought up at the last meeting.
So, Martin could confirm that ImportC was usable, at least for
some scenarios. He thought that was pretty great. It worked on
Windows and Linux. He hadn't tested it on Mac but thought it was
cool that it worked on Windows. It was also faster than DPP. For
example, one DPP invocation that took 10 minutes on Windows was
done in something like a second with ImportC. Very cool.
Walter thanked Martin for the highlight of this meeting. He said
he loved hearing about when things worked.
Martin said one thing that did come up was missing attributes.
He'd seen a Bugzilla issue about it. The C functions defined in C
headers got no attributes at all. No `nothrow`, no `@nogc`, etc.
The only concern in that issue was a theoretical problem that the
C function might take a callback, a function pointer, which might
be a D function, which might be using the GC or throwing
exceptions. He thought that was such a rare case, we just
shouldn't worry about it. If you wanted to do that, you could
just declare that specific C function in D yourself with the
attributes that you needed, because you couldn't insert those
attributes in the C file.
__Regression in 2.103__
Martin said there was a regression about missing struct
`TypeInfo` symbols in 2.103. He gave his analysis of the problem,
saying it was related to making decisions about codegen based on
the scope of a template instance, and how the compiler decided
not to do codegen in speculative contexts. He thought he had a
temporary fix for it, but he needed to dustmite the problematic
use case.
He said he'd been thinking of automating the dustmite process. He
was tired of trimming down because it took so much time.
Symmetry's compiler invocations had huge command lines, and
getting all of the dependencies, all of the imports, and
dustmiting was a huge PITA. But in this case, once he got it
minimized, he'd submit a proper fix for it.
__Makefiles__
Next, Martin reported he'd just started getting rid of the DMD
makefiles that had been deprecated for years. The DMD release
process still needed them, but he had a PR for that.
As part of this, he'd taken the original posix.mak file and
switched it to a generic makefile to also work on Windows. There
were some constraints, of course. We needed GNU make instead of
Digital Mars make on Windows, and all the GNU tools needed to be
in the path. That comes with Git for Windows nowadays. To really
clean up and make the top-level generic makefile really work, he
proposed getting rid of the Digital Mars makefiles, the win32.mak
and win64.mak files. We had the POSIX makefile which worked
everywhere except Windows, and on Windows we had win32.mak which
was just for the OMF stuff, and win64.mak which was for both
32-bit and 64-bit MSCOFF builds. We could just merge that into
one makefile as long as there were no objections to relying on
the GNU tools on Windows. He asked if Walter was okay with that.
This took us into a long discussion about duplicated code in the
makefiles, what GNU tools we'd need, whether it would be
difficult to merge all three makefiles into one, runtime
integration tests, and a mini-rant by Walter asking why we had
makefiles in the first place. He said that compiling DMD should
be simple, and these makefiles we had that used every feature of
GNU make were not simple.
In the end, Walter said he could not argue that we should keep
maintaining different makefiles for Digital Mars make and GNU
make. Three different makefiles with build.d thrown in was an
abomination anyway you looked at it. I suggested we discuss the
details of this in our next planning session, and everyone agreed.
During this discussion, Dennis and Adam R. had brought up `dmd
-i` in the text chat, and Dennis had given a command line that
worked right now. Martin noted that was only for the compiler. We
didn't have anything similar for DRutime or Phobos. Those were
fully makefile.
Andrei said that we'd had this kind of discussion for a long
time. He thought we should just let Matin run roughshod over
whatever we have now and make it into something different.
Because at this point, anything different was almost certain to
be better. He said we were in that space now. Everyone in the
room hated what was there now. So why not just make it different?
Maybe at least a few of us would hate it less.
And as for depending on GNU make, we should just get over
ourselves, bite the bullet, and just use that tool. He thought
Walter had said very well his point that using different build
systems for different OSes was an untenable position. He added
that he'd been at a conference talk not long ago where he'd
learned that apparently everybody and their blind dog was using
CMake now. He knew we'd be groaning over our muted mics about his
mentioning CMake, but maybe we should just look into getting with
the program and using CMake.
__UPDATE__: The deprecated makefiles were removed in [the 2.107.0
release](https://dlang.org/changelog/2.107.0.html#dmd.makefiles).
Additionally, the top-level posix.mak was renamed to Makefile and
now includes the functionality of both win32.mak and win64.mak,
both of which were removed. The release also included makefile
cleanup for DRuntime and Phobos.
### Dennis
__ImportC__
Dennis said he'd not had much success with ImportC yet. He'd been
sending Walter bug reports about struct initializers. Walter
apologized and said that was his (Walter's) fault. He found the C
initializer syntax to be the most incomprehensible, awful thing,
which was why D didn't use that syntax at all. He said he was
continually tripped up by that. He sometimes despaired of ever
making a working implementation that does the C initializer
syntax. He'd seen Dennis's regressions and was going to try to
fix them.
Dennis thanked him and said he did see the light at the end of
the tunnel. His project was closer and closer to being compiled
with ImportC. Walter thanked him for being diligent about filing
the bugs in Bugzilla.
__Restructuring DRuntime__
Dennis said there was a proposal, in the form of some PRs, to
restructure DRuntime. He'd emailed Walter and Iain, and he
thought Iain had already seen it. Walter said he hadn't seen it
yet, but he would look at it.
Dennis just wanted to know, without looking at the details, if
Walter was open to the idea of restructuring DRuntime with
separate folders for each OS, or if his initial instinct was that
it was a bad idea. Walter said that had proposed the same back
before Razvan and Dennis joined us, there had been a huge fight
about it, and his proposal had been shot down. He'd thought
things would be easier if each OS had its own tree of
implementations, but other people didn't like it. He was a little
surprised to see it had resurfaced.
Dennis asked if Walter remembered who those people were. Walter
said the thought Iain had been one of them. Iain said that, from
memory, Walter had picked a very trivial module to convert, and
as the cherry on top, that looked fine. But then Iain had picked
a substantially more complex module and it had all fallen apart
relatively easily. He said he hadn't liked the idea of taking
something that's encapsulated into a thousand-line module, and
then splitting that into five potential thousand-line modules.
Razvan said he'd taken a look at those PRs and it seemed that
they followed that pattern. He didn't understand the benefit and
said it seemed like a matter of taste. Walter said the benefit,
in his experience, was that whenever you tried to support
multiple operating systems with one file, you'd wind up with an
incomprehensible tangle, and then when you added something, not
all the OSes would be checked to see if they still worked with
that file. Then you'd end up having incorrect declarations for a
particular OS. This was especially bad when you had bit flags,
and the bit flags hand magic numbers varied from compiler to
compiler. Ending up with the wrong magic number for an OS could
lead to really, really strange problems. By separating them, when
you updated the Windows file, you wouldn't accidentally break the
Mac implementation.
There was also a reading comprehension problem with reading a
file that was full of conditional compilation. It becomes
difficult to see which OS a piece of code is for. Splitting them
up means more lines of code, sure, but the compiler isn't
compiling more lines of code. It just picks the path through and
compiles the one for the current OS. So he didn't think the old
"don't repeat yourself" mantra was useful to apply here. When you
split it out and you're figuring out how it works, you've only
got one OS to deal with at a time and not a rat's nest of
versioning to deal with.
Iain said that then you'd just move the rat's nest of versioning
in with it. For Linux in particular, you couldn't just say
`version(linux)` and you'd be fine. You had to ask if you're
working with the GNU C runtime, the MUSL runtime, etc. Walter
said he was right, but with Linux and the Unix thing, you had
POSIX. That took care of a lot of that. You couldn't get rid of
versions completely.
There was some more discussion along these lines. Finally, Walter
said that with the proposed change, he'd need input from Iain and
Martin on whether it was acceptable. Iain said that his first
impression of it was that he didn't like having a generic
fallback. Walter agreed. He said he'd leave it up to Iain on
whether to accept the proposal. He didn't want to repeat the long
argument they'd had over it last time. Iain said he would need to
reread the old thread from back then to see if he still agreed
with everything he'd written back then.
Iain then pondered if we did go forward with dicing things by OS,
would we then dice by runtime? By architecture? Where would it
stop? Walter thought if we restricted it to Windows, POSIX, OSX,
Linux, and FreeBSD, we should be fine.
Martin said he didn't like this idea at all. He totally got
Walter's first point about breaking one implementation when
modifying another, but he hoped in the future we'd be able to
have some little CI checks running on these systems. So then
maybe we could use ImportC to check our declarations against the
ImportC declarations. But he disagreed completely with Walter's
second point about legibility. He detailed some examples of how
and why he found that having everything in the same module
improved legibility. He conceded that in some cases, splitting
things up would be an improvement, but felt that most of the time
it would be the opposite.
Walter said that Martin was really saying was that we shouldn't
make a hard and fast rule. We should use our best judgment on
when to split things up. But one thing he did really want is that
whenever there were versions for operating systems in the code,
there had to be an else clause that had a `static assert(0)` in
it. That way, when a new OS was added, you'd instantly find all
the cases in the runtime that you needed to check for OS-specific
dependencies. He didn't like having a generic version in this
case because it would always lead to someone forgetting to update
an else clause in there, causing some kind of mismatch that would
be hell to debug.
Andrei said that this whole little debate was about where to draw
the line between "I don't want to duplicate code" and "I want to
specialize code for each OS". An untested generic version was not
great to have, so the `static assert(0)` thing was great to have.
But that's not to say that someone would figure out once it fires
that one implementation works for both this and that OS, and then
would simply copy and paste one implementation in place of the
static assert. He would say that everyone present was a good
engineer and was able to look at the code and decide if it was
good engineering or bad engineering.
### Andrei
Andrei said he'd been looking over the Phobos v3 document that
Adam W. had linked, and he had a few comments. He understood that
this was not a finished document and just a list of thoughts. He
thought there were some great thoughts here. The point that the
existing Phobos should continue to be supported was a great
decision. And the discussions about it on GitHub involving other
people were great.
However, though the document was aspirationally in the right
place, he thought there was a need for a careful study of
language and features and library organization as to how that's
to be implemented without duplicating the entire body of Phobos.
So one question would be, what steps could we take to avoid
duplicating the 700,000 lines of Phobos that we already had in
their entire 90%, 80%, or even 40% if we were to reuse parts of
Phobos core? He thought the document should say that we wanted to
support the existing Phobos, but we should also include in the
document a versioning mechanism that structured multiple versions.
Then he said that from a bird's eye view, the document should not
be about what should not be in Phobos v3, only what *should* be
there. It was good to put in writing what shouldn't be there, but
Phobos v3 shouldn't be defined by saying it was Phobos without X,
Y, and Z. It should be more that Phobos 3 was Phobos with this
great overarching awesomeness, X, Y, and Z. It should have some
positive things as opposed to saying "it's not going to have that
crap".
At a lower level, "no memory allocation" was a nice aspirational
thought, but it was completely unfeasible. It completely locked
out things like "we want to have a hash table in Phobos". You
couldn't have a hash table in Phobos if you didn't allocate
memory. He thought it would be good to instead say we wanted to
build hash tables and we wanted to build containers and see how
far we could go by deferring memory allocation.
Regarding exceptions, Andrei thought that designing without
exceptions was a difficult endeavor. There should be more
discussion about whether or not we want to use exceptions or
optional, or that kind of stuff. C++ had this new thing,
std::expected, which was either a value or it wasn't, and you
could make decisions based on that. That was a possibility.
Paul noted he'd been doing some exploratory work to see what it
would take to implement a safe allocator interface and containers
that use it by using DIP 1000 and system variables. He said
anyone interested in that should get in touch with him. Andrei
said that was great, but that seemed like a separate body of work
than what was in the document. The document said Phobos would do
no memory allocations, but if it's calling into allocators and
saying that, then that's just dishonest.
Walter said that the stuff in the document about not allocating
was just aspirational. He thought several functions in Phobos
allocated when they didn't have to, and they threw exceptions
when they didn't have to. He'd been able to rewrite `std.path` so
that it didn't do any memory allocation. No one else had done
that or thought about it. He hadn't thought it was possible until
it suddenly came to him how to do it. But he also realized that
it wasn't going to work everywhere. The idea was, could we figure
out a way to do error returns that don't require exceptions, or
solving these other problems without redefining the problem? When
we could make it work, there were various ways of approaching it
and maybe one would fit.
Walter agreed with Andrei that you couldn't have hashtables
without allocations. He noted that when Andrei wrote
`std.algorithm`, only one function in it allocated. Andrei said
it was the Levenshtein Distance implementation, and that
shouldn't even need memory. Anyway, Andrei just wanted to say
that the document should be modified to say "no unnecessary
memory allocations" rather than "no allocations".
Andrei noted that in the text chat, there was mention that
returning error values had problems that motivated exceptions in
the first place. He agreed. He said that in C++ there seemed to
be a federation of ways to address error handling and people
preferred one single way. So we should standardize on just
exceptions, or just expected, or just error codes. That would
seem to be better than "let's do a variety of these".
### Razvan
Razvan started by saying he had two students working on using
dmd-as-a-library to replace other external dependencies.
__dfmt__
One of Razvan's students was a SAOC student who was making
consistent progress on replacing libdparse with dmd-as-a-library
in dfmt. He was at the point where it seemed he was going to be
able to finish the project. So by the end of SAOC, he would have
replaced libdparse entirely. So the problem that had arisen was,
how could we integrate this work?
Razvan had initially thought it could just be integrated upstream
into dfmt, but the dfmt maintainer, Jan Jurzitza (Webfreak), had
pointed out that dfmt didn't necessarily need to parse the code.
It was just using a lexer and only parsed a little bit in some
cases when it needed to extract some information. In that case,
if there was a breaking change in DMD, dfmt was still able to
format your code. But with dmd-as-a-library, because the lexer
was kind of a monolith, it wasn't breaking down into a lot of
functions that you could overwrite. So what they were doing was
creating an AST and then traversing it to output the formatted
code. It was more work, but on the flip side, you were able to do
more complicated passes and more complicated formatting than dfmt
was currently able to do. But if there was a breaking change in
DMD, then dfmt might crash with a compilation error in old code.
So Jan had suggested they start a separate project, dmd-fmt, and
then use that. Razvan didn't like that approach, because if dfmt
still had a small frontend that could be modified, then you'd
always have to backport things. It was doable and wasn't
complicated, but he felt it missed the point. People would just
use dfmt and he didn't know if anyone would even use dmd-fmt. He
felt the best approach was to integrate dmd-as-a-library upstream
into dfmt and then specify a version with the build system. Or
maybe editions could help solve it.
Martin said he'd thought along similar lines and thought we
should bundle dfmt with the compiler. That way, the version of
dfmt that ships with a compiler is compatible with and on the
path with that compiler. Razvan said he thought the same and
asked if anyone had any other opinions or if we should move
forward with shipping dfmt with the compiler. No one had any
objections.
__dscanner__
Razvan's second student was doing his Bachelor's degree on
finishing the work of getting dmd-as-a-library into dscanner. The
project was around 70% complete, and Razvan expected they'd get
it finished by the end of the university year.
The problem here was the dscanner had a larger frontend than
dfmt, and by "frontend" he meant code that is common for both the
dmd-as-a-library and libdparse implementations. So two or three
months before, Jan, who also maintained dscanner, had done some
upstream refactoring where he modified the constructor of a base
class which is inherited by everyone. So then trying to rebase
with the upstream had resulted in hundreds of conflicts that took
a couple of days to resolve. They were trivial fixes, but they
had to be done by hand, one by one.
The question was, should they continue on the path they'd been
on, making all the changes with the ultimate goal of pushing the
final result upstream, or should they go ahead and get what's
done upstream now, and keep pushing changes up incrementally? He
felt the latter was the best approach, as then they'd no longer
suffer from breaking changes and if the student disappeared, the
work that was done would still be there. It would mean in
upstream dfmt, some of the work would be done by
dmd-as-a-library, and some by libdparse, but the ultimate goal
was to replace libdparse, so he didn't see that as a problem.
No one had any opinions on this, so Razvan said he'd discuss it
further with Jan.
__AST refactoring__
For his final issue, Razvan said he'd been working on pulling all
of the semantic routines out of the AST nodes, and that had been
annoying Iain very much. He'd made consistent progress. One issue
that he didn't know how to solve was that some AST nodes had to
store their backend symbols. He imagined this was probably
annoying for GDC and LDC because he didn't think they were using
those fields for anything. He wanted to pull them out somehow,
but he didn't know of an efficient way to do it. He said the
standard way would be to use a hash table, but he worried that
would have an impact on performance.
Walter said this had come up before, and he knew that Iain
objected to having DMD backend symbols in the AST nodes. Walter
thought GDC and LDC could just ignore them. Martin said that's
what LDC does. He didn't care about those symbols and provided
some details about what the implementation does. He had no
objections and said from his side, Razvan was free to do what he
needed to with this.
Razvan said the main reason he was doing this was to break the
dependency between the AST nodes and the backend. Otherwise, this
refactoring of the semantic routines would be impossible. Since
this stored data was typically a pointer, one solution would be
to just use a void pointer there and whenever it is used in the
front end, cast it to the appropriate type, and then the back end
can take it.
Walter said that sounded like a workable solution. Razvan said
that Iain had objected to it a month before by saying he didn't
think it was as small a change for the C++ code bases, so Razvan
should hold fire.
Iain said he still hadn't had the time to look into it. Martin
said that from his perspective, there were no issues. He actually
utilized `void*` in D files for certain internal C++ structures
in LDC for which he lacked the definitions on the D side.
Iain said that on his side, this DMD backend symbol is actually
an alias to a GCC anonymous union. They do use this symbol as a
cache pointer. He said he should probably be using a hash table
instead. And GCC's hash table was probably more efficient than
DRuntime's. He didn't have the time to determine how much of a
pain it would be to insert casts everywhere on the C++ side.
Razvan linked [proof-of-concept
PR](https://github.com/dlang/dmd/pull/15786). He said that if we
could agree this was a workable path forward, then he would need
to do this for other symbols as well. It was a small change for
this particular symbol for DMD, but for other symbols, he would
have to insert probably thousands of casts.
There was more discussion about GDC and LDC internals, and
finally, it was agreed to just make it `void*`.
### Walter
Walter said someone had published a forum post about how they'd
used D to glue C++ and Rust together. Walter [had posted that to
Hacker News](https://news.ycombinator.com/item?id=38564260), and
no one had come over to help out.
One of the complaints Walter often heard about D was that nobody
was using it. So what would help was when he or anyone shared
things like this somewhere was for people from the D community to
come by, leave a comment, do some upvoting, do some downloading,
and just stamp their feet and let people outside of the forums
know they existed. He thought it would greatly help D.
He'd hoped to get enough upvotes on that to make it on the front
page of HN but had failed miserably. But that's what other
language communities did. Rust had a constant stream of people
going around looking for any place they could interject some
comment about Rust. And the Zig people and the Nim people had
done it. The D people just didn't do it. It wasn't a good thing
for us to be modest and reticent talking about D.
Walter would just ask people to drop into places like that to be
heard and be seen. That kind of thing was important to build
social proof for D that there *is* a community, we *are* active,
and all of that. He encouraged everyone to create a Hacker News
account and just drop by once in a while to see if there's
anything worthwhile to respond to.
## The next meeting
Our next meeting was a quarterly meeting with industry reps on
January 5, 2024. Our next monthly meeting was held the following
Friday, January 12.
If you have anything you'd like to bring up for discussion at one
of our monthly meetings, please reach out to me
(social at dlang.org), and I'll discuss with you how best to go
about it.
More information about the Digitalmars-d-announce
mailing list