CppCast - Physical Units and a System of Quantities
Episode Date: October 20, 2023Mateusz Pusz joins Phil and new guest co-host, Anastasia Kazakova. Mateusz talks to us about his physical units (and quantities) library, mp-units, why v2 is a complete redesign compared to the previo...us version, and how incorporating a system of quantities is so central to this new design. News clang 17 released Conference videos released in October AMA with Abbas Sabra (automatic/ static analysis) Is it too hard for junior developers to get on the C++ career ladder (Reddit) Links mp-units on GitHub mp-units - Documentation C++ on Sea 2023 video The Mars Climate Orbiter crash p1935 - "A C++ Approach to Physical Units" p2980 - "A motivation, scope, and plan for a physical quantities and units library" p2981 - "Improving our safety with a physical quantities and units library" p2982 - "std::quantity as a numeric type" p3003 - "The design of a library of number concepts"
Transcript
Discussion (0)
Episode 370 of CppCast, with guest Matthias Pusch, recorded 19th of October 2023.
This episode is sponsored by Sonar, the home of CleanCode.
In this episode, we talk about Claim 17,
more conference videos,
and whether C++ is just too hard to get into.
Then we're joined by Batej P.
Batej talks to us about version 2 of his Unix library and the follow-on standardization
method.
Welcome to episode 370 of CppCast, the first podcast for C++ developers by C++ developers.
I'm your host, Phil Nash, joined by another guest co-host, Anastasia Kazakova.
Hello.
Anastasia, how are you doing today?
Doing good. Good to see you again. Haven't seen you for a couple of weeks after CppCon.
That's right. We saw each other at CppCon. Now, it has been a while since we did the last episode.
Well, Timur has been away for a bit longer than expected. I had another three
weeks of travel in the meantime, and a lot of extra work on top of that, so I didn't have much
headspace. We may talk about some of that in the future, but yeah, sorry about the delay there.
Funny enough, I did actually take my audio recorder to CppCon, so I could try and do some
ad hoc interviews while I was there, but my SD card broke at too short notice to get a replacement.
And I made the cardinal sin of not taking a second card with me.
So I missed the opportunity, unfortunately.
But we are back now.
Timo is probably going to be away for one more episode after this.
But it's, well, we've got Anastasia here today.
It's appropriate that we have her because not only have all three of us worked together at JetBrains, and Anastasia is still there, of course, but we hosted another show together, No Diagnostic Required. going to be that Timo was going to join us as a third co-host which never happened because some things came up for him as well at the time that delayed things by the time we were ready we're
already talking about taking over CppCast so it just feels like now we've sort of got some closure
on that whole thing so finally yeah yeah finally we did that so maybe we meant that that day so who
knows what we had in mind yeah but good to be here back and good to co-host with you, Phil, again.
So yeah, we did lots of episodes of NDR.
And actually good to be back to CBPcast now as a co-host.
That's something new to me.
Well, thanks for stepping in.
Now, at the top of every episode, we do like to read a piece of feedback.
So this one is from Robert.
We had him come in by email.
And he says, I love your show.
Since I found out about CPPcast a couple of months ago,
I've steadily been working my way through present and past episodes.
And in every episode, I find some link that I want to explore further.
As Francis Bontempo said, now I have even more tabs open in my browser.
One thing I wonder about is that, seemingly, has not covered Qt-related topics in a long time.
I'd be interested to know more about their plans to make use of C++20 and C++23 going forward, especially modules support.
That is an interesting question.
I don't think we have had, certainly not in my time with Timo or anyone talking about Qt. So probably it's about time that we get some coverage of that again. And I know
there's lots of interesting discussion about awesome modern C++. So that could make for a
good episode. We will consider that for the future. Thank you, Robert. So we would like to hear your
thoughts about the show. You can always reach out to us on X, formerly Twitter, Mastodon,
LinkedIn, or you can email us at feedback at cppcast.com. Joining us today is Mateusz Puszcz.
Matt's a software architect, principal engineer, and security champion with more than 15 years of experience in designing, writing, and maintaining C++ code for fun and for a living. A trainer with
10 years of C++ teaching experience,
consultant, conference speaker, and evangelist.
His main areas of interest and expertise are modern C++,
performance, low latency, safety, and maintainability.
Mateusz is the head of the C++ Competency Center at EPAM Systems
and is also the founder of TrainIT, providing
dedicated C++ training and consultancy services to corporations around the world.
Matt is an active voting member of the ISO C++ Committee, and he mainly contributes to
LEWG, that's the Library Evolution Working Group.
So Matt, welcome to the show.
Yeah.
Hello.
I'm happy to be here again. Thank you for inviting me. Yeah, welcome to the show. Yeah. Hello. I'm happy to be here again.
Thank you for inviting me.
Yeah.
Welcome, Matt.
It's great to have you here.
And actually, I have a question regarding your training experience, because you're a
very experienced trainer, working many years and training C++.
So as an adapt of the modern C++ standards.
So quick question, which C++ standard do you usually use in your trainings?
And if there's something coming from you or requested by your clients,
if the latest, what they do request usually?
Well, that's a tricky question, right?
I typically try to teach so-called modern C++.
And I always say that modern C++ started with move semantics
and C++ 11 additions I always say that modern C++ started with move semantics and
C++ 11 additions
that we got.
Right? So we cannot talk about move
semantics, modern
C++ without move semantics at all.
And I try to teach
people how to write correct code,
code that's correct by construction,
easy to inspect
and easy to maintain after that.
For this, we don't need new features like C++ 20, 23, and so on.
Of course, those are really interesting ones.
But in most cases, people, projects are not there yet.
And the amount of subjects that are needed for such a training
typically ends up with a training for five days for a corporation.
Because corporations say that they want to learn often
from starting with move semantics up to, I don't know,
multi-threading or C++20.
It is impossible to actually teach both C++20
when you know that move semantics is not there.
Right?
So in five days, you have just limited scope
and you have to start with something.
And this is my advanced model C++ course
that we are talking about C++11, 14, 17,
but mostly scoping on the language
to understand how it works.
And this takes entire five days.
I have another five days training
only for C++20
because this is huge material to cover, right?
I could try to merge those,
but then I will never fit like in one week
with everything, right?
So I'm providing like an example.
By the way, this is how it will look in C++20,
but I'm not teaching C++20 on my primary course
just because lack of time. if the production will catch up and I will not have to talk about move semantics anymore
I will have some time to introduce C++20 to my let's say basic training okay yeah good to know
yeah I think Jason Turner has a similar story people ask ask him to come in and do training in advance C++,
but by the time he's had them answer a few survey questions, they really need the grounding and the
fundamentals first. And so that's what they focus on. So it seems to be a common thing.
Yeah, yeah, indeed.
Okay, so we'll get more into what you've been up to in the next few minutes. But first,
we've just got a couple of news articles to talk about so feel free to comment on any of these okay so first up this is not actually new news but since we've had a bit of a break
since we last recorded clang 17 has been released and i believe it's actually now to 17.0.4
is the one that i uh i downloaded yesterday and obviously this is this is quite big news
in general,
but it's particularly interesting to me because as a hint to that,
last time I've started work on Catch-23
and I'm using C++ 20 and 23 features.
And one of the problems I had,
and I'm sure you can relate to this, Matt,
is half of the code base compiles with Clang
and half of it compiled with GCC
and neither of them did both.
But now, at least for Catch-23, what I've done so far, compiles with Clang and half of it compiled with GCC and neither of them did both but now
at least for Catch-23 what I've done so far it all compiles with with Clang 17.
So are you finding the same thing Matt? Yeah it's similar but you forgot about the third one
on the market here none of my none of my code actually compiles with MSVC. Right yes I was
going to say I think most of mine does but but I don't actually have an installation of that
because I'm not running on Windows.
Right, but Clang 17 actually was a deal-changer here
because with Clang 17,
I could get rid of all of my workarounds and hacks
in order to make Clang work.
So with Clang 17,
it's just working with pure entire interfaces
that I intend in my library for C++ 20.
And also, according to my
knowledge, most of the module stuff
that we still have on the branch work also
fine with Clang 17.
Right. That's good to know. I haven't got into the module
side of it yet, but I did say there was some
big news on that side.
Yeah, I think Clang 17 is
quite a nice step forward
as we work towards
some level of conformance across compilers
for C++20. It's nearly 2024 now, so it's about time. Okay, so the next one is more conference
videos. So we talked a little bit about this last time, the C++1C videos were starting to come
online. In the meantime, we've had CppCon, and even the videos from there are starting to come online in the meantime we've had cpp con and even the videos from there are starting to come out now so we've got the the keynotes most of them are up uh one or two others
as well but also there's a whole stream of videos coming from cpp north c++ now accu more c++ on c
videos and just as a little teaser one of the c++ on c videos that got released i think just last weekend already has
over 110 000 views so somehow got picked up by the the youtube algorithm i'm not going to say
which one it is it's your job now to go find that out i have a guess i haven't checked but i have a
guess it shouldn't be too hard to find but there is a page on reddit that i'll put on the show notes
so all of the videos for all of these conferences
are being released this month.
So if you're keeping up, that'll be the place to go to.
Okay, next up, also on Reddit,
I'm only going to mention this briefly
because by the time this episode is released,
it's already going to be over,
but there's an AMA,
if you can ask me anything, with Abbas Sabra,
my colleague who was on a couple of
episodes back, who was going to talk about automatic
analysis, static analysis in general.
So that's going to be going on
not long after we finish recording this.
So it'll be done by then, but I'll put
a link into the archive of that
for anyone that's interested in following up.
And then the final thing, it's not
really news, it's again
another Reddit page. i did a lot of
spent a lot of time on reddit this week this one caught my interest because somebody was talking
about how hard it is to to get into c++ as a junior developer not so much the language although
that does put a lot of people off we're just getting into the career ladder because so many
roles seem to require a lot of experience or domain knowledge or both but at the same time one of the things came out in the comments
still a lot of people trying to hire for C++ roles finding it very difficult to to find
competent people so it seems to be a bit of a mismatch between these two things.
This is a subject that does come up from time to time seems it's still true and I think part of it
is just different perspectives on things.
But what do you two think?
Is this really a problem for C++?
Are we going to die because we're not getting enough people
coming in at the bottom?
I don't think we're going to die.
I mean, I think we have this problem for ages.
We're lacking people and also the people who hire are lacking people,
but also the people who study C++ lack the proper positions.
But I would maybe redirect that to Matt,
because as a trainer, you might see a picture in death
and understand what's going on there.
Yeah, actually, both perspectives here are valid for me.
So as a trainer and actually as a C++ Competency Center head,
where I try to actually hire good people to our company.
And yeah, so there is a problem because a lot of companies struggle to find good,
experienced engineers.
On the other hand, there's plenty of engineers that are looking for work and cannot find
any, as you said, right?
And there are two possibilities.
Either we have to lower our requirements for the job
or change our interviews, the style of how we do interviews,
because typically I see also this is an issue for many corporations.
They, for example, love to ask those problem-solving tasks
or brain teasers, right?
That actually I do not help much in C++ domain often.
Or ask about Gang of Four book
with all of the polymorphism stuff being there.
I'm not trying to say that the design is not important.
It is, but it should be done
how it's being provided in the latest books
by Klaus Igelberger, for example.
Not how Gang of Four described this in their books.
The fact that they use C++ was only because this was the only,
let's say, object-oriented language at this time the book was written,
besides Smalltalk, right?
But this book is more appropriate for languages like Java
or probably C Sharp than C++ by itself.
If you want to learn how to do design properly,
go to the Klaus book
and you will find how the design
should be done in C++ properly, even using
the same patterns.
Right? But
asking about that on
the interviews actually
do not provide you good employees
and also
does not allow you to hire good employees
because good people will tell you that basically this is not important,
that polymorphism is bad,
and if people are fixed on those design patterns from this book,
they will just not hire this person
because he doesn't know how to do polymorphism, right?
But this is not how you should write modern C++ code.
And on the interviews, we barely check for C++ skills
that allows you to write safe to use, easy to maintain code.
For example, I often ask someone to write simple wrapper,
like RIAI, right?
Resource Acquisition Insatiation Wrapper.
Something like a simple unique pointer, whatever.
You have one member and make it easy to use
and hard to abuse.
Most of the people
coming from the interview
don't know how to do it properly.
They forget about
special member functions.
They forget about destructors.
They forget about checks
in assignment operators.
And such people cannot be allowed
to write the code by themselves, let's say, without any supervision, because this code will leak and will be allowed to write the code by themselves,
let's say, without any supervision,
because this code will leak and will be unsafe to use.
And I would encourage everyone to actually improve their skills
in this domain and also on the interviews to ask for those skills,
because first of all, the code has to be safe to use,
easy to maintain, and after that, it has to be fast.
Right.
Right? And we should change the ways how we think about interviews and also invest in the education of people. If we cannot find good
experts, maybe we can hire graduates and invest in the trainings for them. In the end, it may be
cheaper for the company because you are not paying graduates as much as experts.
So just invest some money to do upskilling of them.
I spent like two weeks in London last year
upskilling graduates for one of the HFT companies there.
And it has a lot of sense as well.
Yeah, and I think we have to match,
like that's a very nice word about matching the
expectations and the goals because we know that which standards are used the most so if the
company is say on c++ 11 no need to dive on the interview into the modern things if you're not
going to be great there what's the sense like what are you checking for so if you are going to like
migrate to c++ 70 or C++20 or whatever,
then yeah, there's like, you need someone who knows how to do that,
who knows like the new things and why they're there
so that they're able to migrate.
Because maybe they will work in on say C++14
as the majority of the people for many, many years
and they just like can't adapt.
And that will be a very painful migration then.
I remember I was working in
the company where we used to you know to remove all the people's c++ code when they were leaving
the team because it was cheaper than to maintain it so uh like when the person was leaving it was
like okay we'll just remove that because we can't maintain that it's too complex so it's like much easier just to write this part to update it
and that's not uh that's not right i don't want to do that yeah exactly yeah another point here
is that uh in in case you are planning to change a work change job uh and you are stuck in the c++
11 or c++ 98 project, you have to spend
some time by yourself to learn
modern C++ because you will not find
work on the market
because plenty of projects
moved on and plenty
of interviews require later
skills, right? I always say
if you depend on an employer
or a university to teach
you C++ and you don't have to do anything by yourself,
you are wrong.
Find a pet project or contribute to open source,
do anything that allows you to stay current
and even if you don't need it at the current work.
Yeah, I think that came out in the thread on Reddit
that you need to keep your skills current
with extra work outside of your working hours. Yes, in a anyway to to stay relevant and it shouldn't be that way but i think it is in
certainly in the c++ community so that's uh that's one tip for people looking for work and just to
summarize what you say i think there's a there's onus on us when we're in the hiring role to look
for the right skills and not just look for the thing that
we think is cool or follows our own personal preference but the actual getting the fundamentals
right so yeah i think this is going to be a topic that comes up every year but uh
we'll we'll leave it for now we've got some uh some more meaty topics to get into today, so we'll move on to our main topic.
So, Matt, you've been on CPPcast before, back in 2020,
and back then you were talking about your physical units library,
MPUnits.
It's now 2023, and you're on to talk about your physical units library,
MPUnits.
So what's changed in the meantime?
Well, actually, through last year,
I was working first on the branch
and then on the mainline
on so-called version 2 framework.
Version 2 framework is a huge change
comparing to whatever you've seen before
in this library.
So that would have been v1, wouldn't it?
Yeah, it even wasn't v1.
Actually, it was 080 before.
We skipped v1 in our version scheme.
I didn't want to release v1
because it will provide impression
that this is an evolutionary change
of the stable interface of what we had before.
But it's a totally different project
written from scratch,
both code and the documentation.
I could start Ranges v3 from scratch in GitHub as a totally different project written from scratch, both code and the documentation. I could start like ranges v3 from scratch in GitHub
as a totally separate repository with mpunits v2.
But I decided to be on the same repo.
I just make the major change in the naming of our versions
to make sure that everyone understands
that this is a huge breaking change
because it breaks every single user's code that we had before.
And I'm really sorry for our users because of it,
but hopefully for better.
So, I mean, just very high level then,
what sort of things have changed?
We'll get into the details in a bit, I think.
So, first of all, we removed so-called the downcasting facility that I was talking a
lot about on different conferences.
I still believe it is a really interesting and nice feature, but not useful for the physical
use library.
We introduced systems of quantities that is a unique feature in our library that none
of the other libraries have it. We have really been based right now on class types and non-type type parameters,
which is the C++20 feature. It improves interfaces a lot.
So everything composes now nicely with arithmetics, operators,
multiply, division and so on.
We improved the quantity construction helpers,
improved readability of generated types.
We provided many additions,
like a feature that we called faster-than-light-speed constants,
which actually improved compile times comparing to DABU.
I mean run times, not compile times.
And improved safety of interfaces,
so interfaces are even safer than before,
safer than Stute Chrono provides, or typically other libraries do.
And many other changes, smaller ones.
Well, that is quite a lot. Some big breaking changes there, I can tell, but it sounds like all for the right reasons.
But before we do get into the details, could you just give us a quick overview again of what a Unix library, what problem that's actually trying to solve?
Sure, of course.
So, I don't
like to talk about this only about Unix library
because it's not about Unix.
If there are libraries
on GitHub or on open source
in general, if they scope only on Unix,
typically they fail to be able to
model things that they want to achieve.
That's why I always say that the
libraries that we provide right now is
quantities and units library, because quantities and units are
better models.
And we are going to talk later about systems of quantities,
as you said.
But this allows us to provide additional type safety and conversion
rules and possible to express ourselves in a better way.
Unilever libraries are about compile-time safety in all of the possible stages. We have strong typing
that prevents reordering of arguments. We allow restricting correct operations on typical types. And by this, I mean that, for example,
we can model things like affine space,
where you have quantities and quantity points,
and those have different set of operations.
Like, for example, you are not able to add two quantity points.
Quantity point is similar to time point in Chrono, right?
Adding two time points doesn't have sense,
so the same comes from quantity points.
We are having support
for vector and tensor quantities.
They have also
specific operations like dot product
and cross product and other
things, and we want to make sure that all of the
conversions are done correctly.
We prevent accidental truncations
of the quantity value in such libraries.
So you have to be explicit in conversions.
For example, like you have duration cast in chrono
to say that I want to enforce some unsafe conversion.
Otherwise, the code will not compile
if the value can be truncated accidentally.
And also there are strict and automated conversion rules
between different entities.
For example,
kilometers convert to meters,
not the other ways around
because this is
truncating operation.
And while you are doing
this conversion,
the value will be
automatically scaled
by the ratio,
by the magnitude of the unit.
Right?
But also it's not only
about units.
Talking about quantities,
we have things like radius
and the length.
Every radius is a length,
but not vice versa.
So you should not be also
allowing the conversion
in other way
because,
as I said,
not every length is a radius.
Right?
And those libraries, of course,
are about performance.
As I said,
they should be as fast
or even faster than double.
And it's possible to be faster, for example, thanks
to those optimizations we can do
for constants I mentioned.
And those
are also important for the market because
they are so-called vocabulary types.
So they allow different
companies to talk
to each other through standardized
interfaces.
Imagine a world without string or
a vector. If one would have
their own versions in their companies,
typically we would not be able to
communicate between different products from different vendors.
And this is exactly the same
case, right?
Yeah, I maybe have some very
basic question here, but just I'm trying to
understand. So to me, the whole library
looks, I mean, the principle,
the goals it has created looks very similar to Stuttgart, right?
So all these safety arguments, all these conversion arguments
are still valid, like both of them.
So is there something different for this library?
I mean, like in the approach and the goals compared to Stuttgart,
or is it like just following the same trend
and just like continue this kind of tradition?
Yeah, that's a really good question.
We started as being compatible with Stuttgrona as much as possible
because this is the best probably part of the standard library.
It is my favorite one.
I would say if you want to learn more about C++,
go and learn how Cronos is being done because
Howard Hinnant and also Walter Brown
contributing to this
did it really, really great.
Right?
But time has passed. We learned
how to do some things better. We got
also better abstractions in the language.
For example, through entity piece being
able to be passed to the templates, right?
Yeah.
So the more time passes, the less
consistent with Stude
Chrono interface as I am.
I'm providing better safety than
Stude Chrono. I, of course, support more
dimensions and quantities than
because Chrono is only about time.
Right?
But
also plenty of practices that were new and great in C++11,
like UDLs, for example,
right now are not the valid choice for physical units library.
So you should not use user-defined literals for units in general.
Interesting.
Yeah, okay, thank you.
That kind of explains the ego for me.
And the other question I had was about the system of quantities.
Maybe you can just explain on the basic level again what it is
and how you use that, what's the main point for that.
Right, yeah, so system of quantities is quite an important thing
that no one before thought about,
which might be interesting, as you said, right?
Most of the libraries
support so-called dimensions.
And dimensions
are physical dimensions. We have
seven of them in,
let's say, typical physics.
And each of them is having
SI-based unit
assigned to be
basically used to measure this dimension in specific units in this system
that is international. However, it turns out that in many cases dimension is not enough.
For example, consider quantities like frequency, activity, or bitrate, all of them are measured in the dimension
of one per time or time minus one power.
So in theory, you could be able to add them
or compare them, which probably is wrong.
You don't want to be able to compare radioactivity
with bitrate, right?
Not usually.
Or for example, if you are
measuring the fuel rate of your
fuel consumption of your
car, you have, let's say,
dimension and unit like liters per 100
kilometers, typically.
So this is volume per
length, so an area.
Would you like to be
able to assign to fuel consumption
the area of the football field?
In some cases, that might be useful.
So if you're talking only about dimensions, it is not enough.
Right?
So it turns out that there's a standard.
The standard called ISO 80000.
So the same institution that the C++ standard is being done.
And this standard provides hundreds of different quantities that are standardized and
actually are claimed by both this standard and the SI to be the base of the SI system for units.
So SI is known to be based on so-called ISQ,
International System of Quantities.
And this is what we're trying to model in this library.
So we may have many quantities of the same kind,
like frequency, activity, bitrate, or fuel consumption,
and area being totally different things.
Or we may have also many quantities of the same kind.
But because, for example, as I said, radius and length
and altitude and displacement are totally different lengths
and you don't want to mix them as well.
And also when you want to create direct quantities from them,
you don't want to say that I'm creating
some radial-based derived quantity from length.
You probably want to use radius
directly in the equation for it.
And you may say,
I want this direct quantity to be created
only in case I'm dealing with radius,
not with any length.
Because it doesn't have sense
to create a radial quantity from width.
So all of this gives additional safety,
but it was quite hard to figure out.
The design part of it took me most of the time,
not the implementation.
Because no one ever did it.
This was a new problem to be solved.
And we have to find out how to do it correctly,
how to make conversions
work how to make the comparisons addition subtraction work correctly so it is both safe
but also easy to use because it's easy to be like strict saying everything has to be always the same
type everywhere but then you end up with plenty of explicit casts everywhere and the library starts to be barely usable.
Okay.
And you mentioned it took you quite a while
to move from version 1 to version 2,
or how is it, 0.9, right, to version 2.
So is there still a big roadmap ahead of you?
I mean, do you have other big, maybe significant changes planned?
Will it take another how many years?
Yeah, sure. We are still far from being done.
There are plenty of discussions being done on our GitHub.
So if you're interested, I welcome everyone to go
and see our issues that we are discussing there.
Right now, we are trying to find out if you can do something
that will be type safe, but still easy to use for non-negative quantities.
Because the ISQ specified some of the quantities as being non-negative.
Like, for example, width.
That shouldn't be negative, right?
And magnitudes of vectors probably will also not be negatives
because those are magnitudes.
And maybe you can optimize based on this. Of course, those will be checked probably negatives because those are magnitudes. And maybe you can optimize
based on this. Of course, those will be checked
probably at runtime, maybe with contracts
if we get them. But still,
it adds some additional safety
to the operations.
But everything is tricky
because you may say, for example,
height, I like a person height,
probably should not be negative, right? It's how to
imagine a person that has negative height. But on the other hand, if you will have like a set of heights,
and you would like to compare if the second person is taller or lower than the previous one,
you may end up with quantity of height being negative because someone is two centimeters
lower than the previous one. So when the negative quantity
has sense and when it doesn't have sense, right? And how to work with that.
This is an interesting, again, design discussion to
find out how to make it correctly, because probably implementation will be quite
tricky and easy.
I meant not tricky. Tricky is the design.
Another issue that we are working on is
the improved algebra for vector
and tercent quantities.
For example, most of the
libraries assume that
in case they are working with
linear algebra,
the quantity they provide is being
put into the linear algebra
type by itself.
So if you want to create a vector of lengths,
you put three quantities of length inside.
So you have like three quantities of meter,
meter, meter, and this is your vector.
But this is
one of the ways to do it. The other way is to put
linear algebra type, assuming
we'll get one in the standard at some point.
Right now we have
to have non-standard solutions,
into quantity type or a duration type
you have in chrono
as a representation type.
And then immediately
everything breaks.
And none of the libraries
in C++ domain
covers this correctly.
Right?
Consider that
some quantities are created
by operations like dot products
or cross products.
And this is fine,
but those libraries model
that as multiplication. And this is fine, but those libraries model that as multiplication.
And then immediately if you do multiplication
of displacement and possibly some velocity,
both being vector quantities,
and this tries to do the multiplication
on the representation types under the hood,
it will just not compile
because any algebra will not provide
you multiplication operator for vectors
because there's no such operation
in LinearGebra
operations.
So what actually should be provided
are the
functions, probably named functions, like
dot product, cross product,
because you don't want to mix them.
This is the same like mixing multiplication division
in terms of scholars.
The same is dot and cross product in terms of vectors.
You can do both on displacement and velocity,
but you will end up with different quantity type
and different value.
Right?
So as we expect every physical
use library to
protect us from
accidentally doing
multiplication instead
of the division, we
should also expect
this in vector
domain for dot
product, cross
product.
But the only
library that actually
models that is
pinned in Python.
None of C++
actually does it.
And you're trying to
find out how to make
it properly right now.
So it's, again, easy to use, but safe.
So you have to find some compromise.
That's interesting because Python is a language where you can multiply strings.
Yeah, exactly.
But they have NumPy.
If you had NumPy in C++,
or some physical or some linear algebra library in the language,
I'm sure that people will start to care more about quantities of those types.
But as we don't have anything in the standard for now,
probably people don't think about it too much.
Are you contributing to the effort to standardize linear algebra?
I work closely with Bob and Guy on their proposal.
I mean, I'm also the contributor,
but provided a lot of feedback for them.
Hopefully they will progress at some point,
but right now we are having a new proposal
based on BLAS that was accepted by the Evolution Group
and hopefully will be the part of the C++26.
However, this is a library
that will probably not help me too much
because this library is more scoped on data crunching.
Like you have huge matrices of spans,
so non-owning things.
And this is not what we need.
We need a simple owning,
like three-dimensional vectors, for example, right?
And this is not provided by this library.
So we need to provide
some wrappers, owning wrappers, by ourselves
maybe. And which
standard does the library
currently target? Because you mentioned many things
which are not in the standard, which are interesting
to you, like the contracts and the linear algebra
and what's the current standard for the
library? Well, this is tricky.
You were not expecting me asking easy questions, right?
Yeah, this is tricky because there's plenty of work ahead of us.
We're still working on number concepts and C++ modules and plenty of things.
So we are still also not ready with the design.
There are plenty of dependencies and plenty of quantity-specific logic
that has to be described in the papers.
We'll be talking about papers later, probably, but those are huge already,
and there will be even more to come in the future.
All right?
So it would be great to be able to be in C++ 26,
but realistically thinking, we don't have a chance to get
there.
But on the other
hand, I was told that
if you will not be
targeting C++ 26,
no one will be eager
to listen to us in
the next two years.
Because they want to
finish C++ 26, they
don't want to talk
about C++ 29
features now.
So we are
officially probably
talking that we
target C++ 26,
but we'll hope for C++ 29
you'll stay
quite safe with us
don't worry
we won't tell anyone
yeah
just
don't tell
don't tell anyone
so we've
been keeping it
mostly to high level
concepts
about units
and algebra
and so on
but
it's very difficult
to talk about
the concrete code
in an audio podcast.
But one thing I did want to touch on,
so I did watch most of your C++ on C talk,
which I'll put a link to in the show notes.
I think you did the same one at CppCon or something similar.
What I really liked was the way you combine this feature
where you name your types the same as a value of that type,
and then you can refer to that in non-template type parameters
to give you a really nice sort of algebra of effectively types,
but you're actually using values.
Do you want to talk a little bit about that, how that cleans things up?
Well, this feature is controversial, probably.
I'm not sure how the committee will react on this one, right?
Because this is an old legacy from the C language
that we can name a struct
and we can provide the identifier for them
with the same name and do it in one line even.
So this actually helps me a lot
because I can say every entity in the library
can be created with one line and that's it.
So this is really easy to build new systems,
extend current systems, and so on.
However, it doesn't extend to templates, for example.
You cannot have a template and a variable with the same name.
For example, you cannot name a variable of vector of int as a vector.
Even though for structs it works.
So in some cases, there are limitations
and they will need more than one line for entities.
And this is some inconsistency.
But we can do it in one line as well.
But at least for most of the things it works.
And the rationale to do it actually is that the library by itself provides those objects to the users.
And the user always, in the code written by the user,
always deals with only values.
So the user never has to actually refer to a type.
But the types are what is being visible in compile-time errors
or in a debugger.
And we want to be able for the user to easily be able to match the code they write with the error code message they see.
If I use the same identifier, they even don't have to know that actually there is a trick
that compile-time error provides a type and the code has value.
It is named the same, like length or meter.
And then it just looks really easy and nice.
Yeah.
But I'm not sure if it will fly in the committee.
If not, we'll see compiler error messages with something like meter underscore T
and length underscore T everywhere, right?
This is what we do in the standard.
Yeah.
Well, I'm hopeful because I think it works really nicely
when you do things like meters divided by seconds
and you're dividing two values
and you're passing that as a parameter to a template
and you get the right type as a result of that.
That's a really nice way to do it.
Exactly.
And you observe exactly the same identifiers in the type
that you use for a value.
Okay. Well, we're going to get back to talking about units in a moment,
but I'm going to take a brief break to thank our sponsor.
This episode is once again sponsored by Sonar, the home of clean code.
Now, Sonar Lint is a free plugin for your IDE and helps you to find and fix bugs and security issues
from the moment you start writing code.
But you can also add SonarCube or SonarCloud to extend your CICD pipeline and enable your
whole team to deliver clean code consistently and efficiently on every check-in or pull
request.
SonarCloud is completely free for open source projects and integrates with all of the main
cloud DevOps platforms.
So back to talking about Units.
Now, you mentioned that, I think you even mentioned this the last time you were on the
show, that you wanted to standardize some sort of Units library or Units handling.
What was the current status of that?
Are you still working on that?
Yes, right.
So I written the first paper in 2019. It was the paper number 1935.
And this paper was mostly to do the homework, to prove that I did the homework to the committee,
to describe what is the status of the libraries, how the domain looks like, what are the challenges,
what are the issues, what are the possible fixes for them. But I never mentioned actually my interfaces that I would like to
standardize. And talking about the standardization, the standardization by itself is not like my
ultimate goal. I'm not writing this library to be in the standard. I'm doing this library to
solve the issue, to solve the problems we have in the production.
If it were to be standardized,
by the way, it would be nice,
but it is not my ultimate goal.
And also, this is why
the library right now
uses probably some names
or practices that may be
a bit controversial in the committee
and we'll have to refactor
if the committee agrees
to actually have it in the standard.
And I didn't come back
to the committee of new papers
for a while, for like the last four years, because I was not happy with the current design.
The v1 version was not ready to be part of the standard. It was not only my opinion,
but also others. And I had plenty of issues that I couldn't address with v1
on my GitHub repository and was looking for a better solution. And now we have version 2 and I think
we are finally ready
to standardize this in the standard.
I'm talking we because it turns out
that when v2 appeared on the
market, I was able
to contact
the authors of all of the major
libraries on the market
to work together on a unified
proposal for the committee based on my
repository. So we have on board a Nick Holt House that has probably the most successful library ever
that is actually maintained. I'm not talking about the Boost units because this is quite an old one
and it's not actively maintained anymore. But talking about the actively maintained ones,
Nick Holt House has the most probably successful ones. Also, we have Dominik Berner
from SI Units.
And we have Chip Hawk
from Aurora Units Library on board.
So you're having four authors,
including me.
And when I counted last time,
we have like 90% of all of the stars
on GitHub for C++ in this domain.
Okay. So this makes us quite great GitHub for C++ in this domain. Okay.
So this makes us quite a great power force to work on this one.
And also we have contributors and advanced users in the group
and physicists and computer scientists that help us
to actually craft those papers.
And for upcoming meeting in Kona,
which will happen in November this year,
we prepared three papers.
One of them is the paper about the scope,
motivation, and
some plan for solidization, and it's
targeted to LEWG, so
Labor Revolution Working Group.
And we also have two other papers that target
safety and numerics groups.
And each of the papers
is longer and longer, so the numerics one is a monster.
You can check by yourself.
It's like, it's the number, it's 2982.
And how do you measure the length of a standards paper?
Yeah, it is huge and it's still not complete.
There are some chapters missing there.
We just don't have enough time to finish everything.
And maybe also we don't want to scurry everyone right away
because this subject is
deeper than many of people think when they say that we actually want to target c++ 29 to lewg
people they say well we still have like five minutes for five meetings for c++ 26 just do it
there's plenty of time i say well that's a huge subject you don't even realize how huge it is
yeah and this big group like from different libraries working on well, that's a huge subject. You don't even realize how huge it is. Yeah, and this big group, like from different libraries
working on these proposals,
does that mean that you managed to agree on some common design
and eliminate any inconsistencies or differences
between the library and these common papers?
Yeah, this is mostly based on the MPUnits v2.
They say that they like the interfaces.
Of course, we are not claiming that what we have in the library right now
is the final thing we are going to provide.
There may be some polishing being done,
some minor changes to be discussed.
But we plan to provide first API papers in Tokyo in March next year.
And hopefully until this time,
we'll be able to polish those things
and provide the final interface
for at least the most basic things in the framework.
I see, yeah.
And I just, I'm sorry.
Like, I wanted just to ask about
the goal of decentralization,
because you said that that's not your primary goal,
like with the library,
but still, why do you think it's important
to get the MP units in the standard?
Why it's important to standardize?
Why we can't just live with just library?
Right, so the first paper, 2980,
actually describes the motivation in detail,
why we actually think it's important for this to be standardized.
But to be brief, I will maybe mention a few things.
First of all, it is about bringing safety to C++, right?
There are plenty of possible issues that are possible right now to be done in the code,
and probably right now even more than ever.
We are living in the world right now
that we start to depend more and more
on autonomous vehicles, machines with our lives.
With this, more and more C++ developers
are exposed to writing safety-critical,
life-critical software.
And typically, either they like experience
or actually,
anyway, it's really hard to do it
even if you are an expert.
So having additional safety
in your hands
that will prevent simple errors
or sometimes even more complicated errors
at compile time would be great.
Right?
Second of all is about
having vocabulary types, right?
C++ standard
is to provide standard
interfaces to be able to
communicate between different libraries, between
different vendors in a standardized way.
If vocabulary types
are not the thing, then what should be
standardized? And
I mentioned that this library
is mostly about being vocabulary types. Those are
the things you want to put in the interfaces to say
I expect a quantity of length in kilometers
or miles or whatever, right?
And if you have software written,
like, let's say, by NASA and Lockheed Martin,
no pun intended, right?
They want to be able to be successful
in their next space mission that we'll provide.
Right?
Yeah, that's true.
Actually, I've read these nice critical examples mentioned in the paper,
I guess, in the very, very beginning, which just mentions this.
Quite catastrophic situations, which happened because of several inconsistencies
in the measurements.
So I was just wondering, I I guess that the goal of the standardization
is just to push more people to use that,
so that they definitely with it.
But are there other ways, I guess, to help the adoption?
I mean, is the library in like Conan VC package?
So if I want to start using it like right now,
what should I do?
Well, it is in both.
And actually, it's also in Compile Explorer.
So you can get it easily from Conan.
You can get it from VC package,
although I'm not sure if they have version 2.0 or not
because I'm not that current with the VC package status right now.
But you can always try to hack in Compile Explorer
and find out if you like it or not.
Try it out.
Make maybe some simple proof of concept.
And then if you are satisfied with the results,
try to get it to the production or some proof of concept code you have on your laptops or servers, right?
A couple more questions.
First of all, I presume you have unit tests for your library.
Are they unit tests for your library. So are they units, unit tests?
Yes.
Exactly.
And most of them actually are done with static asserts. So sorry, I'm not using
most of the frameworks
there. But for the rest,
like for the formatting things that still
is not concept in the standard,
I'm using catch.
That's good to know as well um uh no i just um
i just wanted to continue with this thing of adoption because i'm thinking like what is more
important to get the library into the standard or to get it like uh for all this package because i
think this is super important to get the latest version of the library in the package management
because that's what usually stops people from you know proper usage like the standard yeah it's like good to direct people and
i think it's great that we have chrono we have fmt and i think these are fantastic examples so
and would be good to have your library there as well but i mean like all these practical things
of how to start using the library is uh also very important because if you take a look
like we at their brains and foundation like we always ask people every year how do you use the
libraries like how do you compile your uh third-party libraries in your project and so many people say
that like yeah they're still taking the as a code and just compile with the whole project and that's
the major point pain point in the language for them.
So I think that's much more important to have it
in all these package management systems
and in all these easy ways to get it installed.
And Compile Explorer is also like a great way
so you have this kind of playground.
So I think this is the same importance
or maybe even more important than getting it to the standard.
So because if I can start using it right now,
I will probably do that,
not waiting for C++ 29
or whatever standard you target, actually.
Yeah, that would be nice.
Yeah, I totally agree.
That's why we care about providing our library
in the package managers.
I'm mostly familiar with the Conan.
That's why I'm making sure it's there.
But VC package, I know that it also works.
However,
it's not the case for everyone that they can
use just package managers and open source
software, right? We are having some
domains, especially for those life
critical, safety critical missions that I said
that they cannot actually
take anything from the open source
and just use in the production.
Having non-certified libraries is not an option for them.
Okay.
And for those customers, actually having this in the standard
would help them to actually be able to use them in foreseeable future.
Yeah, that makes sense.
Then you have a bit of a chicken and egg problem
because for standardizing,
one of the prerequisites is usually that we're standardizing existing practice.
So you need sufficient amounts of existing usage
outside the standard.
Look, I figured out a way.
So you put to the package management,
you force people to start using that,
then you push to the standard,
and then those who can't use the open source software
just start using it.
It should be working, right? Yeah, but actually actually i think we are starting to take existing practice right
now right now maybe the library uses some novel c++ interfaces using the latest features
but we are having these libraries for ages in the c++ language right on the market we know how to
handle this we know how to use it and And as I said, we are having right now
90% of all of the stars on GitHub in our team.
So we have plenty of experience in our team
to find out how to do it correctly.
Yeah, but it all sounds good.
And I'm glad that you're going to great lengths
to push this through.
So thank you for that.
I do encourage people to go and watch one of the videos of your talks about
this,
because obviously you're going to a lot more of the code and some of the
specific techniques we haven't had to get into here.
So I'll definitely put some links in the show notes for that.
Yeah.
And also great docs for the project.
Yeah.
Don't forget the docs.
So just, just before we wrap up,
what else in the world of C++ outside of Unix
do you find interesting these days?
Oh, well, we are living in really interesting times lately, right?
All of those successful languages,
all of those discussions about safety,
about error in use behavior
are really interesting to see and observe.
I'm really interested to see how it will move on,
when we are going to end up in like two years from now.
Are we going to work in some TypeScript languages
that are built on top of C++,
or maybe C++ will actually try to be more agile,
do maybe some more brave and maybe
breaking changes. By breaking, I mean
breaking APIs, maybe.
Right?
In order to improve safety
and performance in the future.
Otherwise, we may end up in doing
Rust, which is also
a solution at some point.
Yes.
I think the whole question of do we have, do we have the ABI break, as well as breaking
some more backward compatibility at source level as well, well, we don't need to do that
enough, I think, that could still be back on the cards, despite what's happened in recent
years.
Yeah, I would love to get epochs in the language.
Or something very similar to it.
Yeah.
We definitely need some way to diversion sem get epochs in the language. Or something very similar to it. Yeah, yeah.
We definitely need some way to version semantics or syntax of the language in some way, I think.
We just haven't figured out what that looks like yet.
But we'll work in C++ because epochs hit a hurdle that it couldn't get over.
But maybe something else will get past it.
So I'm very interested in that space as well.
Okay, we should wrap up.
Before we let you go, anything else you want to tell us or any ways to reach you?
People want to find out more.
If people want to reach me directly,
you can find me easily on LinkedIn or on the Discord,
like inclusive++, right?
But in case you have any questions or feedback
regarding the project, please feel free
to go to our GitHub repo and provide
some new issue or discussion
thread there. We are going to
answer and provide some feedback for
you or help if you need to
get one to get you started
with the project.
Great. We'll put all those links in the show
notes as usual.
So with that,
thank you very much
for coming on the show
for us today,
Mateusz,
and telling us all about
the latest in MP units.
Thank you very much.
It was a pleasure.
And thank you, Anastasia,
for the co-hosting.
Okay, guys.
Thanks so much for listening in
as we chat about C++.
We'd love to hear
what you think of the
podcast please let us know if we're discussing the stuff you're interested in or if you have
a suggestion for a guest or topic we'd love to hear about that too you can email all your thoughts
to feedback at cppcast.com we'd also appreciate it if you can follow cppcast on twitter all those
links as well as the show notes can be found on the podcast website at cpp