Loris comments
This commit is contained in:
parent
15130d60f1
commit
ac96c45b1a
@ -9,11 +9,11 @@ Disclaimer: I work at Uber and am partially responsible for bringing `zig cc`
|
|||||||
to serious internal use. Opinions are mine, this blog post is not affiliated
|
to serious internal use. Opinions are mine, this blog post is not affiliated
|
||||||
with Uber.
|
with Uber.
|
||||||
|
|
||||||
I talked at [Zig Milan][zig-milan] meetup about "Onboarding Zig at Uber".
|
I talked at the [Zig Milan][zig-milan] meetup about "Onboarding Zig at Uber".
|
||||||
This post is a little about "how Uber uses Zig", and more about "my experience
|
This post is a little about "how Uber uses Zig", and more about "my experience
|
||||||
of bringing Zig to Uber", from both technical and social aspects.
|
of bringing Zig to Uber", from both technical and social aspects.
|
||||||
|
|
||||||
The video is [here][milan-youtube]. The rest of the post is a loose
|
<big>The video is [here][milan-youtube]</big>. The rest of the post is a loose
|
||||||
transcript, with some commentary and errata.
|
transcript, with some commentary and errata.
|
||||||
|
|
||||||
{{<img src="_/2022/uber-zig-frank-tweet.jpg"
|
{{<img src="_/2022/uber-zig-frank-tweet.jpg"
|
||||||
@ -26,10 +26,12 @@ transcript, with some commentary and errata.
|
|||||||
|
|
||||||
TLDR:
|
TLDR:
|
||||||
|
|
||||||
* Uber uses zig to compile its C/C++ code. Now only in the [Go
|
* Uber uses Zig to compile its C/C++ code. Now only in the [Go
|
||||||
Monorepo][go-monorepo] via [bazel-zig-cc][bazel-zig-cc], with plans to
|
Monorepo][go-monorepo] via [bazel-zig-cc][bazel-zig-cc], with plans to
|
||||||
possibly expand use of `zig cc` to other languages that need a C/C++
|
possibly expand use of `zig cc` to other languages that need a C/C++
|
||||||
toolchain.
|
toolchain.
|
||||||
|
* Main selling points of C/C++ toolchain on top of zig-cc over the
|
||||||
|
alternatives: configurable versions of glibc and macOS cross-compilation.
|
||||||
* Uber does not have any plans to use zig-the-language yet.
|
* Uber does not have any plans to use zig-the-language yet.
|
||||||
* Uber signed a support agreement with Zig Software Foundation (ZSF) to
|
* Uber signed a support agreement with Zig Software Foundation (ZSF) to
|
||||||
prioritize bug fixes. The contract value is disclosed in the ZSF financial
|
prioritize bug fixes. The contract value is disclosed in the ZSF financial
|
||||||
@ -61,11 +63,11 @@ thousand engineers. In short, it's big.
|
|||||||
hint="graph"
|
hint="graph"
|
||||||
>}}
|
>}}
|
||||||
|
|
||||||
I can't tell this better than my colleague [Abhinav Gupta][abg] from the Go
|
I can't say this better than my colleague [Abhinav Gupta][abg] from the Go
|
||||||
Platform team (the transcript is available in the "alt" attribute):
|
Platform team (a transcript is available in the "alt" attribute):
|
||||||
|
|
||||||
At this point of the presentation, since I explained (thanks abg!) how Uber
|
At this point of the presentation, since I explained (thanks abg!) how Uber
|
||||||
uses zig, I could end the talk. But you all came in for the process, so after
|
uses Zig, I could end the talk. But you all came in for the process, so after
|
||||||
an uncomfortable pause, I decided to tell more about it.
|
an uncomfortable pause, I decided to tell more about it.
|
||||||
|
|
||||||
{{<div-clear>}}
|
{{<div-clear>}}
|
||||||
@ -102,7 +104,7 @@ it also was not painful *enough* to be picked up.
|
|||||||
At this point it is important to understand the limitations of a non-hermetic
|
At this point it is important to understand the limitations of a non-hermetic
|
||||||
C++ toolchain:
|
C++ toolchain:
|
||||||
- Cannot cross-compile. So we can't compile Linux executables on a Mac if they
|
- Cannot cross-compile. So we can't compile Linux executables on a Mac if they
|
||||||
have CGo (which many of our services do). This was worked around by... not
|
require CGo (which many of our services do). This was worked around by... not
|
||||||
cross-compiling.
|
cross-compiling.
|
||||||
- CGo executables would link to a glibc version that was found on the system.
|
- CGo executables would link to a glibc version that was found on the system.
|
||||||
That means: when upgrading the OS (multi-month effort), the build fleet must
|
That means: when upgrading the OS (multi-month effort), the build fleet must
|
||||||
@ -131,7 +133,7 @@ Bazel's toolchain documentation, and I didn't find a good example to rely on.
|
|||||||
In January of 2021 I found Andrew Kelley's blog post [`zig cc`: a Powerful
|
In January of 2021 I found Andrew Kelley's blog post [`zig cc`: a Powerful
|
||||||
Drop-In Replacement for GCC/Clang][zig-cc-andrewrk]. I recommend reading the
|
Drop-In Replacement for GCC/Clang][zig-cc-andrewrk]. I recommend reading the
|
||||||
article; it changed how I think about compilers (and it will help you
|
article; it changed how I think about compilers (and it will help you
|
||||||
understand the remaining article better, because I gave the talk to the Zig
|
understand the remaining article better, because I gave the talk to a Zig
|
||||||
audience). To sum up the Andrew's article, `zig cc` has the following
|
audience). To sum up the Andrew's article, `zig cc` has the following
|
||||||
advantages:
|
advantages:
|
||||||
|
|
||||||
@ -151,8 +153,8 @@ of `zig ar`, which Bazel relies on.
|
|||||||
|
|
||||||
### 2021 Feb: asking for attention
|
### 2021 Feb: asking for attention
|
||||||
|
|
||||||
I [reported bugs][zig-motiejus-issues] to zig. Nothing happened for a
|
I [reported bugs][zig-motiejus-issues] to Zig. Nothing happened for a
|
||||||
week. I donated $50/month, expecting "the zig folks" to prioritize what I've
|
week. I donated $50/month, expecting "the Zig folks" to prioritize what I've
|
||||||
reported. A week of silence again. And then I dropped the bomb in
|
reported. A week of silence again. And then I dropped the bomb in
|
||||||
`#zig:libera.chat`:
|
`#zig:libera.chat`:
|
||||||
|
|
||||||
@ -162,7 +164,7 @@ reported. A week of silence again. And then I dropped the bomb in
|
|||||||
<andrewrk> did you get a different impression somewhere?
|
<andrewrk> did you get a different impression somewhere?
|
||||||
```
|
```
|
||||||
|
|
||||||
Oops. At the time I hoped that whoever notice the conversation will immediately
|
Oops. At the time I hoped that whoever notice the conversation would immediately
|
||||||
forget it. Well, here it is again, more than a year later, over here, for your
|
forget it. Well, here it is again, more than a year later, over here, for your
|
||||||
enjoyment.
|
enjoyment.
|
||||||
|
|
||||||
@ -190,35 +192,36 @@ CI. It failed almost all tests.
|
|||||||
Most of the failures were caused by dependencies on system libraries. At this
|
Most of the failures were caused by dependencies on system libraries. At this
|
||||||
point it was clear that, to truly onboard bazel-zig-cc and compile **all** it's
|
point it was clear that, to truly onboard bazel-zig-cc and compile **all** it's
|
||||||
C/C++ code, there needs to be quite a lot of investment to remove the
|
C/C++ code, there needs to be quite a lot of investment to remove the
|
||||||
dependency on system libraries and undoing of a lot of tech debt.
|
dependency on system libraries and undoing of a lot of technical debt.
|
||||||
|
|
||||||
### 2021 End: recap
|
### 2021 End: recap
|
||||||
|
|
||||||
- Various places at Uber would benefit from a hermetic C++ cross-compiler, but
|
- Various places at Uber would benefit from a hermetic C++ cross-compiler, but
|
||||||
it's not funded due to a large investment and not enough justification.
|
it's not funded due to requiring a large investment and not naving enough
|
||||||
|
justification.
|
||||||
- bazel-zig-cc kinda works, but both bazel-zig-cc and zig cc have known bugs.
|
- bazel-zig-cc kinda works, but both bazel-zig-cc and zig cc have known bugs.
|
||||||
- I can't realistically implement the necessary changes or bug fixes. I tried
|
- I can't realistically implement the necessary changes or bug fixes. I tried
|
||||||
implementing `zig ar`, a trivial front-end for llvm's `ar`, and failed.
|
implementing `zig ar`, a trivial front-end for llvm's `ar`, and failed.
|
||||||
- Once an issue had been identified as a Zig issue, getting attention from Zig
|
- Once an issue had been identified as a Zig issue, getting attention from Zig
|
||||||
developers was unpredictable. Some issues got resolved within days, some took
|
developers was unpredictable. Some issues got resolved within days, some took
|
||||||
more than 6 months. Donations don't change `zig cc` priorities.
|
more than 6 months, and donations din't change `zig cc` priorities.
|
||||||
- The monorepo-onboarding diff was simmering and waiting for it's time.
|
- The monorepo-onboarding diff was simmering and waiting for it's time.
|
||||||
|
|
||||||
### 2021 End: Uber needs a cross-compiler
|
### 2021 End: Uber needs a cross-compiler
|
||||||
|
|
||||||
I was tasked to evaluate arm64 for Uber. Evaluation details aside, I needed to
|
I was tasked to evaluate arm64 for Uber. Evaluation details aside, I needed to
|
||||||
compile software for linux-arm64. Lots of it! Since most of our low-level infra
|
compile software for linux-arm64. Lots of it! Since most of our low-level infra
|
||||||
is in Go monorepo, I needed a cross-compiler there first.
|
is in the Go monorepo, I needed a cross-compiler there first.
|
||||||
|
|
||||||
A business reason for a cross-compiler landed on my lap. Now now both time and
|
A business reason for a cross-compiler landed on my lap. Now now both time and
|
||||||
money can be invested there. Having a "WIP diff" with `zig cc` was a good
|
money can be invested there. Having a "WIP diff" with `zig cc` was a good
|
||||||
start, but was still very far from over: teams were not convinced it's the
|
start, but was still very far from over: teams were not convinced it was the
|
||||||
right thing to do, the diff was too much of a prototype, and both zig-cc and
|
right thing to do, the diff was too much of a prototype, and both zig-cc and
|
||||||
bazel-zig-cc needed lots of work before they could be used at any capacity at
|
bazel-zig-cc needed lots of work before they could be used at any capacity at
|
||||||
Uber.
|
Uber.
|
||||||
|
|
||||||
When onboarding such a technology in a large corporation, the most important
|
When onboarding such a technology in a large corporation, the most important
|
||||||
thing to manage is risk. As zig is a novel technology (not even 1.0!), it was
|
thing to manage is risk. As Zig is a novel technology (not even 1.0!), it was
|
||||||
truly unusual to suggest compiling all of our C and C++ code with it. We should
|
truly unusual to suggest compiling all of our C and C++ code with it. We should
|
||||||
be planning to stick with it for at least a decade. Questions were raised and
|
be planning to stick with it for at least a decade. Questions were raised and
|
||||||
evaluated with great care and scrutiny. For that I am truly grateful to the Go
|
evaluated with great care and scrutiny. For that I am truly grateful to the Go
|
||||||
@ -235,26 +238,26 @@ Given that we now needed a cross-compiler, we had two candidates:
|
|||||||
uncertain, used-by-nobody, but quite a tempting solution.
|
uncertain, used-by-nobody, but quite a tempting solution.
|
||||||
|
|
||||||
`zig cc` provides a few extra features on top of `bazel-toolchain`:
|
`zig cc` provides a few extra features on top of `bazel-toolchain`:
|
||||||
- configurable glibc version. In grailbio case you would need a sysroot
|
- configurable glibc version. With `grailbio` you would need a sysroot
|
||||||
(basically, a chroot with the system libraries, so the programs can be linked
|
(basically, a chroot with the system libraries, so the programs can be linked
|
||||||
against them), which needs to be maintained.
|
against them), which would need to be maintained.
|
||||||
- a working, albeit still buggy, hermetic (cross-)compiler for macOS.
|
- a working, albeit still buggy, hermetic (cross-)compiler for macOS.
|
||||||
|
|
||||||
Glibc we can handle in either case. However, `bazel-toolchain` will unlikely
|
We would be able to handle glibc with either, however, `grailbio` is unlikely
|
||||||
ever have a way to compile to macOS, let alone cross-compile. Relying on the
|
to ever have a way to compile to macOS, let alone cross-compile. Relying on the
|
||||||
system compiler is undesirable on developer laptops, and Go Platform feels that
|
system compiler is undesirable on developer laptops, and the Go Platform feels
|
||||||
first-hand, especially during macOS upgrades.
|
that first-hand, especially during macOS upgrades.
|
||||||
|
|
||||||
The prospect of a hermetic toolchain for macOS targets tripped the scales
|
The prospect of a hermetic toolchain for macOS targets tipped the scales
|
||||||
towards `zig cc`, with all its warts, risks and instability.
|
towards `zig cc`, with all its warts, risks and instability.
|
||||||
|
|
||||||
There was another, attention problem: if we were considering the use of Zig in
|
There was still another problem, one of attention: if we were considering the
|
||||||
a serious capacity, we knew we will hit problems, but would be unlikely to have
|
use of Zig in a serious capacity, we knew we will hit problems, but would be
|
||||||
the expertise to solve them. How can we, as a BigCorp, de-risk the engagement
|
unlikely to have the expertise to solve them. How can we, as a BigCorp, de-risk
|
||||||
question, making sure that bugs important to us are handled timely? We were
|
the engagement question, making sure that bugs important to us are handled
|
||||||
sure of good intentions of ZSF: it was obvious that, if we find and report a
|
timely? We were sure of good intentions of ZSF: it was obvious that, if we find
|
||||||
legitimate bug, it would get fixed. But how can we put an upper bound on
|
and report a legitimate bug, it would get fixed. But how can we put an upper
|
||||||
latency?
|
bound on latency?
|
||||||
|
|
||||||
### Money
|
### Money
|
||||||
|
|
||||||
@ -269,11 +272,11 @@ Contract terms were roughly as follows:
|
|||||||
- Hack hack hack hack hack.
|
- Hack hack hack hack hack.
|
||||||
- When done, Loris enters the number of hours worked on the issue.
|
- When done, Loris enters the number of hours worked on the issue.
|
||||||
|
|
||||||
Uber has the right to *time* of ZSF members. We have no decision or voting
|
Uber has a right to ZSF members' *time*. We have no decision or voting power
|
||||||
power whatsoever with regards to Zig. We have right to offer suggestions, but
|
whatsoever with regards to Zig. We have right to offer suggestions, but they
|
||||||
they have been and will be treated just like from any other third-party
|
have been and will be treated just like from any other third-party bystander.
|
||||||
bystander. We did not ask for special rights, it's explicit in the contract,
|
We did not ask for special rights, it's explicit in the contract, and we don't
|
||||||
and we don't want that.
|
want that.
|
||||||
|
|
||||||
The contract was signed, the wire transfer completed, and in 2022 January we
|
The contract was signed, the wire transfer completed, and in 2022 January we
|
||||||
had:
|
had:
|
||||||
@ -284,7 +287,7 @@ had:
|
|||||||
and hermetic.
|
and hermetic.
|
||||||
|
|
||||||
{{<img src="_/2022/uber-zig-deposit.png"
|
{{<img src="_/2022/uber-zig-deposit.png"
|
||||||
alt="Wire transfer of $52800 from Uber to Zig Software Foundation"
|
alt="Wire of $52800 from Uber to Zig Software Foundation"
|
||||||
caption="The amount of money that changed hands is public, because ZSF is a nonprofit."
|
caption="The amount of money that changed hands is public, because ZSF is a nonprofit."
|
||||||
hint="graph"
|
hint="graph"
|
||||||
>}}
|
>}}
|
||||||
@ -341,7 +344,7 @@ sister teams in Seattle and Bay Area are hiring too. Ping me.
|
|||||||
Credits
|
Credits
|
||||||
-------
|
-------
|
||||||
|
|
||||||
Many thanks Abhinav Gupta for reading drafts of this.
|
Many thanks Abhinav Gupta and Loris Cro for reading drafts of this.
|
||||||
|
|
||||||
[^1]: Errata: I incorrectly said "by an order of magnitude". The order of
|
[^1]: Errata: I incorrectly said "by an order of magnitude". The order of
|
||||||
magnitude is the same.
|
magnitude is the same.
|
||||||
|
Loading…
Reference in New Issue
Block a user