From 234b6c33913465a1d6b2c0b6832e4daa36b2dcb1 Mon Sep 17 00:00:00 2001 From: Alexis Praga Date: Mon, 4 Aug 2025 12:48:10 +0200 Subject: [PATCH] French translations - Home page - Sponsors - Community mirroir - Samples --- content/fr-FR/download.smd | 24 + content/fr-FR/download/community-mirrors.smd | 89 +++ content/fr-FR/index.smd | 63 ++ content/fr-FR/learn/build-system.smd | 470 +++++++++++++ content/fr-FR/learn/getting-started.smd | 159 +++++ content/fr-FR/learn/index.smd | 17 + content/fr-FR/learn/overview.smd | 629 ++++++++++++++++++ content/fr-FR/learn/samples.smd | 49 ++ content/fr-FR/learn/tools.smd | 38 ++ content/fr-FR/learn/why_zig_rust_d_cpp.smd | 158 +++++ .../news/announcing-community-mirrors.smd | 50 ++ content/fr-FR/news/index.smd | 16 + .../migrate-to-self-hosting/aws-breakdown.png | Bin 0 -> 24662 bytes .../migrate-to-self-hosting/aws-expenses.png | Bin 0 -> 39013 bytes .../migrate-to-self-hosting/deploy-after.png | Bin 0 -> 15043 bytes .../migrate-to-self-hosting/deploy-before.png | Bin 0 -> 28647 bytes .../news/migrate-to-self-hosting/index.smd | 82 +++ .../news/migrate-to-self-hosting/pypi.png | Bin 0 -> 16422 bytes content/fr-FR/zsf.smd | 94 +++ i18n/fr-FR.ziggy | 28 + zine.ziggy | 6 + 21 files changed, 1972 insertions(+) create mode 100644 content/fr-FR/download.smd create mode 100644 content/fr-FR/download/community-mirrors.smd create mode 100644 content/fr-FR/index.smd create mode 100644 content/fr-FR/learn/build-system.smd create mode 100644 content/fr-FR/learn/getting-started.smd create mode 100644 content/fr-FR/learn/index.smd create mode 100644 content/fr-FR/learn/overview.smd create mode 100644 content/fr-FR/learn/samples.smd create mode 100644 content/fr-FR/learn/tools.smd create mode 100644 content/fr-FR/learn/why_zig_rust_d_cpp.smd create mode 100644 content/fr-FR/news/announcing-community-mirrors.smd create mode 100644 content/fr-FR/news/index.smd create mode 100644 content/fr-FR/news/migrate-to-self-hosting/aws-breakdown.png create mode 100644 content/fr-FR/news/migrate-to-self-hosting/aws-expenses.png create mode 100644 content/fr-FR/news/migrate-to-self-hosting/deploy-after.png create mode 100644 content/fr-FR/news/migrate-to-self-hosting/deploy-before.png create mode 100644 content/fr-FR/news/migrate-to-self-hosting/index.smd create mode 100644 content/fr-FR/news/migrate-to-self-hosting/pypi.png create mode 100644 content/fr-FR/zsf.smd create mode 100644 i18n/fr-FR.ziggy diff --git a/content/fr-FR/download.smd b/content/fr-FR/download.smd new file mode 100644 index 000000000..00686773e --- /dev/null +++ b/content/fr-FR/download.smd @@ -0,0 +1,24 @@ +--- +.title = "Télécharger", +.author = "", +.date = @date("2024-08-07:00:00:00"), +.layout = "download.shtml", +.custom = { + "mobile_menu_title": "Télécharger", + "OSs": ["Windows", "macOS", "Linux", "FreeBSD", "NetBSD"], +}, +--- + +# Versions +Vous pouvez également [installer Zig depuis un gestionnaire de paquets](https://github.com/ziglang/zig/wiki/Install-Zig-from-a-Package-Manager). + +Il existe une [version JSON de cette page]($link.siteAsset('download/index.json')). + +Les fichiers sont signés avec [minisign](https://jedisct1.github.io/minisign/) en utilisant cette clé publique : + +``` +RWSGOq2NVecA2UPNdBUZykf1CCb147pkmdtYxgb3Ti+JO/wCYvhbAb/U +``` + +> # [Téléchargement automatique ?]($block) +> Si vous automatisez le téléchargement de Zig, vous pourriez vous renseigner sur les [miroirs communautaires](/download/community-mirrors) pour éviter les coupures et diminuer nos coûts de bande passante. diff --git a/content/fr-FR/download/community-mirrors.smd b/content/fr-FR/download/community-mirrors.smd new file mode 100644 index 000000000..b8a7fad20 --- /dev/null +++ b/content/fr-FR/download/community-mirrors.smd @@ -0,0 +1,89 @@ +--- +.title = "Mirroirs communautaires", +.author = "", +.date = @date("2024-08-07:00:00:00"), +.layout = "download/community-mirrors.shtml", +.alternatives = [{ + .name = "list", + .layout = "download/community-mirrors-list.shtml", + .output = "/download/community-mirrors.txt", +}], +.custom = { "mobile_menu_title": "Mirrors" }, +--- +Si vous mettez en place un téléchargement automatique de Zig, comme une intégration continue, l'utilisation de miroirs communautaires peut être plus intéréssante qu'un téléchargement depuis ziglang.org. +ziglang.org n'offre aucune garantie d'accessibilité ou de vitesse de téléchargement et peut donc conduire à des échecs ponctuels de téléchargement ou des ralentissements. +De fait, une intégration continue qui télécharge directement depuis ziglang.org contribue aux problèmes d'accessibilité et de téléchargement. +En effet, ce site est [hébergé de manière intentionnelle sur un seul ordinateur](/news/migrate-to-self-hosting). + +Il est donc souvent judicieux de récupérer Zig depuis l'un des nombreux miroirs maintenus par la communauté. +Ces miroirs ne sont pas officiellement approuvés par la Fondation Logicielle Zig, mais ils peuvent être utilisés sans risques de sécurité grâce aux signature des archives. +Aucun miroir individuel ne garantit un accessibilité ou une vitesse minimale, donc utiliser tous les miroirs disponibles pour de l'intégration continue peut significativement améliorer l'accessibilité en pratique. + +> # [Attention]($block) +> Les miroirs communautaires ne sont pas officiellement approuvés ni soutenus par la Fondation Logicielle Zig. +> Ils peuvent en théorie contenir des binaires malveillants. +> Si vous les utilisez, vous **devez** vérifier la signature minisign de chaque archive que vous téléchargez avec la clé publique de la ZSF, disponible sur [la page de téléchargement](/download). + +## Action GitHub +Si vous utilisez les Actions GitHub, vous pourriez être intéressé par l'Action [mlugg/setup-zig](https://github.com/marketplace/actions/setup-zig-compiler), +bien que ce ne soit pas un projet officiel ZSF. +Elle permet d'installer une version Zig de votre choix depuis un miroir communautaire et sauvegarde votre cache Zig entre les exécutions pour accélérer les compilations suivantes. + + +## Utilisation des Miroirs +La liste des miroirs communautaires est disponible dans un fichier texte ASCII séparé par des retours à la ligne sur https://ziglang.org/download/community-mirrors.txt. +Il est recommandé de récupérer cette liste et d'essayer les miroirs dans un ordre aléatoire (pour éviter de mettre une charge excessive sur un seul miroir et donc de ralentir l'accès pour tout le monde). +Chaque archive Zig est associée à une signature [minisign](https://jedisct1.github.io/minisign/), qui peut être téléchargée depuis les miroirs. +Pour chaque archive sur un miroir, veillez à télécharger sa signature et vérifier l'archive avec celle-ci. +Sans cela, vous êtes théoriquement vulnérable à des miroirs malveillants hébergeant des archives modifiées. +La stratégie recommandée peut être résumée comme suit: + +```python +pubkey = "(copy this from https://ziglang.org/download)" +tarball_name = "zig-x86_64-linux-0.14.1.tar.xz" +# To improve uptime, optionally cache this GET: +mirrors = http_get("https://ziglang.org/download/community-mirrors.txt") +# ASCII-encoded, one mirror per line, newlines are LF, there is a trailing newline. +shuffled = shuffle_lines(mirrors) +for mirror_url in shuffled: + tarball = http_get(f"{mirror_url}/{tarball_name}?source=my_automation_name") + if success: + # NEVER SKIP THIS STEP. The signature must be verified before the tarball is deemed safe. + signature = http_get(f"{mirror_url}/{tarball_name}.minisig?source=my_automation_name") + if success and minisign_verify(tarball, signature, pubkey): + print("Successfully fetched Zig 0.14.1!") +``` + +Comme l'accessibilité de ziglang.org n'est pas garantie, le fichier community-mirrors.txt peut parfois être inaccessible. +Il est donc possible de le mettre en cache pour éviter les interruptions quand ziglang.org est inacessible. +Il est recommandé de le re-télécharger quotidiennement. +Les miroirs peuvent être ajoutés ou supprimés une fois par mois selon l'évolution de l'écosystème. Il est donc primordial de re-récupérer périodiquement la liste des miroirs. +Voici la méthode recommandée pour télécharger les archives Zig : + +- La liste des miroirs est disponible à https://ziglang.org/download/community-mirrors.txt. + - Son accessibilité n'est pas garantie, il peut donc être utile de la mettre en cache. +- La liste des miroirs contient des URL en ASCII, séparées par des retours à la ligne (ASCII LF 0x20). La dernière ligne du fichier est un retour à la ligne. +Il n'y a pas d'autres espaces, ni de lignes vides. +- Les miroirs doivent supporter HTTPS. Chaque ligne dans le fichier commence par "https://". +- L'accessibilité des miroirs n'est pas garantie donc si un miroir est inaccessible, il est recommandé d'essayer le suivant. En général, le premier suffit mais un parcours aléatoire de la liste est conseillé. +Si aucun miroir n'est accessible, vous pouvez essayer ziglang.org en dernier recours. +- Pour télécharger une archive depuis un miroir, il faut effecture une requête GET vers "miroir/nomdefichier", où "miroir" est l'URL du miroir, +et "nomdefichier" est le nom de base de l'archive correspondante sur ziglang.org (par ex. zig-x86_64-linux-0.14.1.tar.xz). + - Il est fortement conseillé d'inclure dans la requête un paramètre nommé source contenant une chaîne indiquant l'expédititeur. + Par exemple, l'Action GitHub mlugg/setup-zig le défiint comme provenant de ?source=github-mlugg-setup-zig. + - Les archives sources, bootstrap, et binaires sont disponibles depuis tous les miroirs listés, ainsi que leurs signatures minisign. + - Les archives binaires pour les versions récentes de Zig sont de la forme zig-x86_64-linux-0.14.1.tar.xz. + - Si un miroir répond avec un code de statut HTTP autre que 200 OK : + - `503 Unavailable` peut être du à une maintenance programmée. + - `429 Too Many Requests` peut indiquer que le débit a été limité temporairement.. + - `404 Not Found` est autorisé pour les versions Zig 0.5.0 ou antérieures, ou les versions de développement antérieures à la dernière version actuelle. + - Sinon, n'hésitez pas à [signaler le problème](https://github.com/ziglang/www.ziglang.org/issues/new). + +La Fondation Logicielle Zig ne peut garantir la sécurité d'aucun miroir. Après chaque téléchargement d'une archive, il est **impératif** de télécharger sa signature minisign +(en rajoutant ".minisign" au nom de fichier) et la vérifier avec la clé publique de la ZSF, accessible depuis ziglang.org/download. **Ne jamais sauter cette étape**. + +Si un miroir renvoie `200 OK` mais que la validation de signature échoue, n'hésitez pas à [signaler le problème ](https://github.com/ziglang/www.ziglang.org/issues/new). + +## Héberger un Miroir +Si vous êtes intéressé pour héberger un miroir, veuillez consulter la [documentation dans le dépôt www.ziglang.org](https://github.com/ziglang/www.ziglang.org/blob/main/MIRRORS.md). +Merci d'aider à améliorer et décentraliser l'écosystème Zig ! diff --git a/content/fr-FR/index.smd b/content/fr-FR/index.smd new file mode 100644 index 000000000..11c663b85 --- /dev/null +++ b/content/fr-FR/index.smd @@ -0,0 +1,63 @@ +--- +.title = "Accueil", +.author = "", +.date = @date("2024-08-07:00:00:00"), +.layout = "index.shtml", +.custom = { + "mobile_menu_title": "Accueil", +}, +--- + +[]($section.id("slogan")) +Zig est un langage de programmation généraliste et un ensemble d'outils pour maintenir des logiciels **robustes**, **optimaux** et **réutilisables**. + +[]($section.id("features")) +## ⚡ Un langage simple +Concentrez-vous sur le débogage de votre application plutôt que sur le débogage du langage lui-même. + +- Pas de structure de contrôle masquée. +- Pas d'allocation mémoire cachée. +- Pas de préprocesseur, pas de macros. + +## ⚡ Comptime +Cette nouvelle approche de la métaprogrammation est basée sur l'exécution de code pendant la compilation et l'évaluation "paresseuse". + +- Toutes fonctions peuvent être appelées à la compilation. +- Pas de surcoût à l'exécution pour les types et les valeurs. +- Elle émule l'architecture cible. + +## ⚡ Maintenance avec Zig +Améliorez progressivement votre base de code C/C++/Zig. + +- Zig peut être utilité comme un compilateur C/C++ sans dépendance et prêt à l'emploi supportant la compilation croisée dès le départ. +- `zig build` offre un environnement de développement cohérent sur toutes les plateformes. +- Ajoutez Zig à vos projets C/C++ pour profiter de la riche bibliothèque standard+. + +# [Communauté]($section.id("community").attrs("section-title")) + +## [Une communauté décentralisée]($section.id("decentralized")) +Chacun est libre de créer et de maintenir son propre espace de rencontre. +Aucun n'est "officiel" mais chaque lieu de rassemblement a ses propres règles et modérateurs. + +## [Développement]($section.id("main-development")) +Le dépôt Zig se trouve à [https://github.com/ziglang/zig](https://github.com/ziglang/zig), ainsi que le suivi des problèmes et les suggestions. +L'acception du [code de conduite](https://github.com/ziglang/zig/blob/master/.github/CODE_OF_CONDUCT.md) de Zig est nécessaire pour toutes contribution. + +# [Fondation Logicielle Zig]($section.id("zsf").attrs("section-title")) + +## Une société à but non lucratif 501(c)(3). + +La Fondation Logicielle Zig (ZSF en anglais) est une société à but non lucratif fondée en 2020 par Andrew Kelley, le créateur de Zig, pour soutenir le développement du langage. +Actuellement, la ZSF est en mesure d'offrir une rémunération à des tarifs compétitifs pour un nombre restreint de contributeurs principaux. +Nous espérons pouvoir étendre cette offre à davantage de contributeurs à l'avenir. + +La Fondation Logicielle Zig est financée par des dons. + +# [Sponsors]($section.id("sponsors").attrs("section-title")) + +## [Sponsors Corporatifs]($section.id("corporate-sponsors")) +Les entreprises suivantes fournissent un soutien financier direct à la Fondation Logicielle Zig. + +## [Sponsors GitHub]($section.id("github-sponsors")) +Grâce aux personnes qui [sponsorisent Zig]($link.page('zsf')), le projet est responsable seulement devant la communauté open source et non des actionnaires. +En particulier, ces personnes fantastiques sponsorisent Zig pour 200 $/mois ou plus : diff --git a/content/fr-FR/learn/build-system.smd b/content/fr-FR/learn/build-system.smd new file mode 100644 index 000000000..0b35b559f --- /dev/null +++ b/content/fr-FR/learn/build-system.smd @@ -0,0 +1,470 @@ +--- +.title = "Zig Build System", +.author = "", +.date = @date("2024-08-07:00:00:00"), +.layout = "page.shtml", +.custom = { + "mobile_menu_title": "Zig Build System", + "toc": true, +}, +--- +# [When to bust out the Zig Build System?]($heading.id('build-system')) + +The fundamental commands `zig build-exe`, `zig build-lib`, `zig build-obj`, and +`zig test` are often sufficient. However, sometimes a project needs another +layer of abstraction to manage the complexity of building from source. + +For example, perhaps one of these situations applies: + +- The command line becomes too long and unwieldy, and you want some place to + write it down. +- You want to build many things, or the build process contains many steps. +- You want to take advantage of concurrency and caching to reduce build time. +- You want to expose configuration options for the project. +- The build process is different depending on the target system and other options. +- You have dependencies on other projects. +- You want to avoid an unnecessary dependency on cmake, make, shell, msvc, + python, etc., making the project accessible to more contributors. +- You want to provide a package to be consumed by third parties. +- You want to provide a standardized way for tools such as IDEs to semantically understand + how to build the project. + +If any of these apply, the project will benefit from using the Zig Build System. + +# [Getting Started]($heading.id('getting-started')) +## [Simple Executable]($heading.id('simple')) +This build script creates an executable from a Zig file that contains a public `main` function definition. + +[]($code.language('=html').buildAsset("build-system/1-simple-executable/hello.zig")) +[]($code.language('=html').buildAsset("build-system/1-simple-executable/build.zig")) + +## [Installing Build Artifacts]($heading.id('installing-artifacts')) + +The Zig build system, like most build systems, is based on modeling the project as a directed acyclic graph (DAG) of steps, which are independently and concurrently run. + +By default, the main step in the graph is the **Install** step, whose purpose +is to copy build artifacts into their final resting place. The Install step +starts with no dependencies, and therefore nothing will happen when `zig build` +is run. A project's build script must add to the set of things to install, which +is what the `installArtifact` function call does above. + +**Output** +``` +├── build.zig +├── hello.zig +├── .zig-cache +└── zig-out + └── bin + └── hello +``` + +There are two generated directories in this output: `.zig-cache` and `zig-out`. The first one contains files that will make subsequent builds faster, but these files are not intended to be checked into source-control and this directory can be completely deleted at any time with no consequences. + +The second one, `zig-out`, is an "installation prefix". This maps to the standard file system hierarchy concept. This directory is not chosen by the project, but by the user of `zig build` with the `--prefix` flag (`-p` for short). + +You, as the project maintainer, pick what gets put in this directory, but the user chooses where to install it in their system. The build script cannot hardcode output paths because this would break caching, concurrency, and composability, as well as annoy the final user. + +## [Adding a Convenience Step for Running the Application]($heading.id('run-step')) + +It is common to add a **Run** step to provide a way to run one's main application directly +from the build command. + +[]($code.language('=html').buildAsset("build-system/convenience-run-step/hello.zig")) +[]($code.language('=html').buildAsset("build-system/convenience-run-step/build.zig")) + +# [The Basics]($heading.id('basics')) + +## [User-Provided Options]($heading.id('user-options')) + +Use `b.option` to make the build script configurable to end users as well as +other projects that depend on the project as a package. + +[]($code.language('=html').buildAsset("build-system/2-user-provided-options/build.zig")) +[]($code.language('=html').buildAsset("build-system/2-user-provided-options/example.zig")) + +Please direct your attention to these lines: + +``` +Project-Specific Options: + -Dwindows=[bool] Target Microsoft Windows +``` + +This part of the help menu is auto-generated based on running the `build.zig` logic. Users +can discover configuration options of the build script this way. + +## [Standard Configuration Options]($heading.id('standard-options')) + +Previously, we used a boolean flag to indicate building for Windows. However, we can do +better. + +Most projects want to provide the ability to change the target and optimization settings. +In order to encourage standard naming conventions for these options, Zig provides the +helper functions, `standardTargetOptions` and `standardOptimizeOption`. + +Standard target options allows the person running `zig build` to choose what +target to build for. By default, any target is allowed, and no choice means to +target the host system. Other options for restricting supported target set are +available. + +Standard optimization options allow the person running `zig build` to select +between `Debug`, `ReleaseSafe`, `ReleaseFast`, and `ReleaseSmall`. By default +none of the release options are considered the preferable choice by the build +script, and the user must make a decision in order to create a release build. + +[]($code.language('=html').buildAsset("build-system/3-standard-config-options/hello.zig")) +[]($code.language('=html').buildAsset("build-system/3-standard-config-options/build.zig")) + +Now, our `--help` menu contains more items: + +``` +Project-Specific Options: + -Dtarget=[string] The CPU architecture, OS, and ABI to build for + -Dcpu=[string] Target CPU features to add or subtract + -Doptimize=[enum] Prioritize performance, safety, or binary size (-O flag) + Supported Values: + Debug + ReleaseSafe + ReleaseFast + ReleaseSmall +``` + +It is entirely possible to create these options via `b.option` directly, but this +API provides a commonly used naming convention for these frequently used settings. + +In our terminal output, observe that we passed `-Dtarget=x86_64-windows -Doptimize=ReleaseSmall`. +Compared to the first example, now we see different files in the installation prefix: + +``` +zig-out/ +└── bin + └── hello.exe +``` + +## [Options for Conditional Compilation]($heading.id('conditional-compilation')) + +To pass options from the build script and into the project's Zig code, use +the `Options` step. + +[]($code.language('=html').buildAsset("build-system/conditional-compilation/app.zig")) +[]($code.language('=html').buildAsset("build-system/conditional-compilation/build.zig")) + +In this example, the data provided by `@import("config")` is comptime-known, +preventing the `@compileError` from triggering. If we had passed `-Dversion=0.2.3` +or omitted the option, then we would have seen the compilation of `app.zig` fail with +the "too old" error. + +## [Static Library]($heading.id('static-library')) + +This build script creates a static library from Zig code, and then also an +executable from other Zig code that consumes it. + +[]($code.language('=html').buildAsset("build-system/simple-static-library/fizzbuzz.zig")) +[]($code.language('=html').buildAsset("build-system/simple-static-library/demo.zig")) +[]($code.language('=html').buildAsset("build-system/simple-static-library/build.zig")) + +In this case, only the static library ends up being installed: + +``` +zig-out/ +└── lib + └── libfizzbuzz.a +``` + +However, if you look closely, the build script contains an option to also install the demo. +If we additionally pass `-Denable-demo`, then we see this in the installation prefix: + +``` +zig-out/ +├── bin +│   └── demo +└── lib + └── libfizzbuzz.a +``` + +Note that despite the unconditional call to `addExecutable`, the build system in fact +does not waste any time building the `demo` executable unless it is requested +with `-Denable-demo`, because the build system is based on a Directed Acyclic +Graph with dependency edges. + +## [Dynamic Library]($heading.id('dynamic-library')) + +Here we keep all the files the same from the [Static Library](#static-library) example, except +the `build.zig` file is changed. + +[]($code.language('=html').buildAsset("build-system/dynamic-library/build.zig")) + +**Output** +``` +zig-out +└── lib + ├── libfizzbuzz.so -> libfizzbuzz.so.1 + ├── libfizzbuzz.so.1 -> libfizzbuzz.so.1.2.3 + └── libfizzbuzz.so.1.2.3 +``` + +As in the static library example, to make an executable link against it, use code like this: + +```zig +exe.linkLibrary(libfizzbuzz); +``` + +## [Testing]($heading.id('testing')) + +Individual files can be tested directly with `zig test foo.zig`, however, more +complex use cases can be solved by orchestrating testing via the build script. + +When using the build script, unit tests are broken into two different steps in +the build graph, the **Compile** step and the **Run** step. Without a call to +`addRunArtifact`, which establishes a dependency edge between these two steps, +the unit tests will not be executed. + +The *Compile* step can be configured the same as any executable, library, or +object file, for example by [linking against system libraries](#linking-to-system-libraries), +setting target options, or adding additional compilation units. + +The *Run* step can be configured the same as any Run step, for example by +skipping execution when the host is not capable of executing the binary. + +When using the build system to run unit tests, the build runner and the test +runner communicate via *stdin* and *stdout* in order to run multiple unit test +suites concurrently, and report test failures in a meaningful way without +having their output jumbled together. This is one reason why +[writing to *standard out* in unit tests is problematic](https://github.com/ziglang/zig/issues/15091) - +it will interfere with this communication channel. On the flip side, this +mechanism will enable an upcoming feature, which is is the +[ability for a unit test to expect a *panic*](https://github.com/ziglang/zig/issues/1356). + +[]($code.language('=html').buildAsset("build-system/unit-testing/main.zig")) +[]($code.language('=html').buildAsset("build-system/unit-testing/build.zig")) + +In this case it might be a nice adjustment to enable `skip_foreign_checks` for +the unit tests: + +```diff +@@ -23,6 +23,7 @@ + }); + + const run_unit_tests = b.addRunArtifact(unit_tests); ++ run_unit_tests.skip_foreign_checks = true; + test_step.dependOn(&run_unit_tests.step); + } + } +``` + +[]($code.language('=html').buildAsset("build-system/unit-testing-skip-foreign/build.zig")) + +## [Linking to System Libraries]($heading.id('linking-to-system-libraries')) + +For satisfying library dependencies, there are two choices: + +1. Provide these libraries via the Zig Build System + (see [Package Management](#) and [Static Library](#static-library)). +2. Use the files provided by the host system. + +For the use case of upstream project maintainers, obtaining these libraries via +the Zig Build System provides the least friction and puts the configuration +power in the hands of those maintainers. Everyone who builds this way will have +reproducible, consistent results as each other, and it will work on every +operating system and even support cross-compilation. Furthermore, it allows the +project to decide with perfect precision the exact versions of its entire +dependency tree it wishes to build against. This is expected to be the +generally preferred way to depend on external libraries. + +However, for the use case of packaging software into repositories such as +Debian, Homebrew, or Nix, it is mandatory to link against system libraries. So, +build scripts must +[detect the build mode](https://github.com/ziglang/zig/issues/14281) and configure accordingly. + +[]($code.language('=html').buildAsset("build-system/system-libraries/build.zig")) + +Users of `zig build` may use `--search-prefix` to provide additional +directories that are considered "system directories" for the purposes of finding +static and dynamic libraries. + +# [Generating Files]($heading.id('generating-files')) + +## [Running System Tools]($heading.id('system-tools')) +This version of hello world expects to find a `word.txt` file in the same path, +and we want to use a system tool to generate it starting from a JSON file. + +Be aware that system dependencies will make your project harder to build for your +users. This build script depends on `jq`, for example, which is not present by +default in most Linux distributions and which might be an unfamiliar tool for +Windows users. + +The next section will replace `jq` with a Zig tool included in the source tree, +which is the preferred approach. + +**`words.json`** +```json +{ + "en": "world", + "it": "mondo", + "ja": "世界" +} +``` + +[]($code.language('=html').buildAsset("build-system/10.5-system-tool/src/main.zig")) +[]($code.language('=html').buildAsset("build-system/10.5-system-tool/build.zig")) + +**Output** + +``` +zig-out +├── hello +└── word.txt +``` + +Note how `captureStdOut` creates a temporary file with the output of the `jq` invocation. + +## [Running the Project's Tools]($heading.id('project-tools')) + +This version of hello world expects to find a `word.txt` file in the same path, +and we want to produce it at build-time by invoking a Zig program on a JSON file. + +**`tools/words.json`** +```json +{ + "en": "world", + "it": "mondo", + "ja": "世界" +} +``` + +[]($code.language('=html').buildAsset("build-system/11-zig-tool/src/main.zig")) + +[]($code.language('=html').buildAsset("build-system/11-zig-tool/tools/word_select.zig")) + +[]($code.language('=html').buildAsset("build-system/11-zig-tool/build.zig")) + +**Output** + +``` +zig-out +├── hello +└── word.txt +``` + + +## [Producing Assets for `@embedFile`]($heading.id('embed-file')) + +This version of hello world wants to `@embedFile` an asset generated at build time, +which we're going to produce using a tool written in Zig. + +**`tools/words.json`** +```json +{ + "en": "world", + "it": "mondo", + "ja": "世界" +} +``` + +[]($code.language('=html').buildAsset("build-system/12-embedfile/src/main.zig")) + +[]($code.language('=html').buildAsset("build-system/12-embedfile/tools/word_select.zig")) + +[]($code.language('=html').buildAsset("build-system/12-embedfile/build.zig")) + +**Output** + +``` +zig-out/ +└── bin +    └── hello +``` + +## [Generating Zig Source Code]($heading.id('generating-zig')) +This build file uses a Zig program to generate a Zig file and then exposes it +to the main program as a module dependency. + +[]($code.language('=html').buildAsset("build-system/13-import/src/main.zig")) +[]($code.language('=html').buildAsset("build-system/13-import/tools/generate_struct.zig")) +[]($code.language('=html').buildAsset("build-system/13-import/build.zig")) + +**Output** + +``` +zig-out/ +└── bin +    └── hello +``` + +## [Dealing With One or More Generated Files]($heading.id('write-files')) + +The **WriteFiles** step provides a way to generate one or more files which +share a parent directory. The generated directory lives inside the local `.zig-cache`, +and each generated file is independently available as a `std.Build.LazyPath`. +The parent directory itself is also available as a `LazyPath`. + +This API supports writing arbitrary strings to the generated directory as well +as copying files into it. + +[]($code.language('=html').buildAsset("build-system/write-files/src/main.zig")) +[]($code.language('=html').buildAsset("build-system/write-files/build.zig")) + +**Output** + +``` +zig-out/ +└── project.tar.gz +``` + +## [Mutating Source Files in Place]($heading.id('mutating-source')) + +It is uncommon, but sometimes the case that a project commits generated files +into version control. This can be useful when the generated files are seldomly updated +and have burdensome system dependencies for the update process, but *only* during the +update process. + +For this, **WriteFiles** provides a way to accomplish this task. This is a feature that +[will be extracted from WriteFiles into its own Build Step](https://github.com/ziglang/zig/issues/14944) +in a future Zig version. + +Be careful with this functionality; it should not be used during the normal +build process, but as a utility run by a developer with intention to update +source files, which will then be committed to version control. If it is done +during the normal build process, it will cause caching and concurrency bugs. + +[]($code.language('=html').buildAsset("build-system/mutate-source-files/tools/proto_gen.zig")) +[]($code.language('=html').buildAsset("build-system/mutate-source-files/src/main.zig")) +[]($code.language('=html').buildAsset("build-system/mutate-source-files/src/protocol.zig")) +[]($code.language('=html').buildAsset("build-system/mutate-source-files/build.zig")) + +```=html +
$ zig build update-protocol --summary all
+Build Summary: 4/4 steps succeeded
+update-protocol success
+└─ WriteFile success
+   └─ run proto_gen (protocol.zig) success 401us MaxRSS:1M
+      └─ zig build-exe proto_gen Debug native success 1s MaxRSS:183M
+
+``` + +After running this command, `src/protocol.zig` is updated in place. + +# [Handy Examples]($heading.id('examples')) + +## [Build for multiple targets to make a release]($heading.id('release')) + +In this example we're going to change some defaults when creating an `InstallArtifact` step in order to put the build for each target into a separate subdirectory inside the install path. + +[]($code.language('=html').buildAsset("build-system/10-release/build.zig")) +[]($code.language('=html').buildAsset("build-system/10-release/hello.zig")) + +**Output** + +``` +zig-out +├── aarch64-linux +│   └── hello +├── aarch64-macos +│   └── hello +├── x86_64-linux-gnu +│   └── hello +├── x86_64-linux-musl +│   └── hello +└── x86_64-windows + ├── hello.exe + └── hello.pdb +``` diff --git a/content/fr-FR/learn/getting-started.smd b/content/fr-FR/learn/getting-started.smd new file mode 100644 index 000000000..c323fa0f2 --- /dev/null +++ b/content/fr-FR/learn/getting-started.smd @@ -0,0 +1,159 @@ +--- +.title = "Getting Started", +.author = "", +.date = @date("2024-08-07:00:00:00"), +.layout = "page.shtml", +.custom = { + "mobile_menu_title": "Getting Started", + "toc": true, +}, +--- + +# Tagged release or nightly build? +Zig has not yet reached v1.0 and the current release cycle is tied to new releases of LLVM, which have a ~6 months cadence. +In practical terms, **Zig releases tend to be far apart and eventually become stale given the current speed of development**. + +It's fine to evaluate Zig using a tagged version, but if you decide that you like Zig and +want to dive deeper, **we encourage you to upgrade to a nightly build**, mainly because +that way it will be easier for you to get help: most of the community and sites like +[zig.guide](https://zig.guide) track the master branch for the reasons stated above. + +The good news is that it's very easy to switch from one Zig version to another, or even have multiple versions present on the system at the same time: Zig releases are self-contained archives that can be placed anywhere in your system. + + +# Installing Zig +## [Direct download]($heading.id('direct')) +This is the most straight-forward way of obtaining Zig: grab a Zig bundle for your platform from the [Downloads](/download) page, +extract it in a directory and add it to your `PATH` to be able to call `zig` from any location. + +### Setting up PATH on Windows +To setup your path on Windows run **one** of the following snippets of code in a Powershell instance. +Choose if you want to apply this change on a system-wide level (requires running Powershell with admin privileges) +or just for your user, and **make sure to change the snippet to point at the location where your copy of Zig lies**. +The `;` before `C:` is not a typo. + +System wide (**admin** Powershell): +``` +[Environment]::SetEnvironmentVariable( + "Path", + [Environment]::GetEnvironmentVariable("Path", "Machine") + ";C:\your-path\zig-windows-x86_64-your-version", + "Machine" +) +``` + +User level (Powershell): +``` +[Environment]::SetEnvironmentVariable( + "Path", + [Environment]::GetEnvironmentVariable("Path", "User") + ";C:\your-path\zig-windows-x86_64-your-version", + "User" +) +``` +After you're done, restart your Powershell instance. + +### Setting up PATH on Linux, macOS, BSD +Add the location of your zig binary to your PATH environment variable. + +This is generally done by adding an export line to your shell startup script (`.profile`, `.zshrc`, ...) +```bash +export PATH=$PATH:~/path/to/zig +``` +After you're done, either `source` your startup file or restart your shell. + + + + +## [Package managers]($heading.id('managers')) +### Windows +**WinGet** +Zig is available on [WinGet](https://github.com/microsoft/winget-pkgs/tree/master/manifests/z/zig/zig). +``` +winget install -e --id zig.zig +``` + +**Chocolatey** +Zig is available on [Chocolatey](https://chocolatey.org/packages/zig). +``` +choco install zig +``` + +**Scoop** +Zig is available on [Scoop](https://scoop.sh/#/apps?q=zig&id=7e124d6047c32d426e4143ab395d863fc9d6d491). +``` +scoop install zig +``` +Latest [dev build](https://scoop.sh/#/apps?q=zig&id=921df07e75042de645204262e784a17c2421944c): +``` +scoop bucket add versions +scoop install versions/zig-dev +``` + +### macOS + +**Homebrew** +Latest tagged release: +``` +brew install zig +``` + +**MacPorts** +``` +sudo port install zig +``` +### Linux +Zig is also present in many package managers for Linux. [Here](https://github.com/ziglang/zig/wiki/Install-Zig-from-a-Package-Manager) +you can find an updated list but keep in mind that some packages might bundle outdated versions of Zig. + +## [Building from source]($heading.id('source')) +[Here](https://github.com/ziglang/zig/wiki/Building-Zig-From-Source) +you can find more information on how to build Zig from source for Linux, macOS and Windows. + +# Recommended tools +## Syntax Highlighters and LSP +All major text editors have syntax highlight support for Zig. +Some bundle it, some others require installing a plugin. + +If you're interested in a deeper integration between Zig and your editor, +checkout [zigtools/zls](https://github.com/zigtools/zls). + +If you're interested in what else is available, checkout the [Tools](tools) section. + + +# Run Hello World +If you completed the installation process correctly, you should now be able to invoke the Zig compiler from your shell. +Let's test this by creating your first Zig program! + +Navigate to your projects directory and run: +```bash +mkdir hello-world +cd hello-world +zig init +``` + +This should output: +``` +info: created build.zig +info: created build.zig.zon +info: created src/main.zig +info: created src/root.zig +info: see `zig build --help` for a menu of options +``` + +Running `zig build run` should then compile the executable and run it, ultimately resulting in: +``` +All your codebase are belong to us. +Run `zig build test` to run the tests. +``` + +Congratulations, you have a working Zig installation! + +# Next steps +**Check out other resources present in the [Learn](/learn) section**, make sure to find the Documentation for your version +of Zig (note: nightly builds should use `master` docs) and consider giving [zig.guide](https://zig.guide) a read. + +Zig is a young project and unfortunately we don't have yet the capacity to produce extensive documentation and learning +materials for everything, so you should consider [joining one of the existing Zig communities](https://github.com/ziglang/zig/wiki/Community) +to get help when you get stuck, as well as checking out initiatives like [Zig SHOWTIME](https://zig.show). + +Finally, if you enjoy Zig and want to help speed up the development, [consider donating to the Zig Software Foundation](/zsf) +. diff --git a/content/fr-FR/learn/index.smd b/content/fr-FR/learn/index.smd new file mode 100644 index 000000000..951920d18 --- /dev/null +++ b/content/fr-FR/learn/index.smd @@ -0,0 +1,17 @@ +--- +.title = "Documentation", +.author = "", +.date = @date("2024-08-07:00:00:00"), +.layout = "learn.shtml", +.custom = { + "mobile_menu_title": "Learn", +}, +--- + +# [Documentation]($section.id('learn')) +Cette section liste la documentation utile pour démarrer de zéro et parvenir à comprendre la philosophie de Zig. + + +## [Guides]($section.id('guides')) +Cette section sera un jour dans la documentation de la librairie standard. Pour le moment, elle est accessible ici. + diff --git a/content/fr-FR/learn/overview.smd b/content/fr-FR/learn/overview.smd new file mode 100644 index 000000000..2417b6adf --- /dev/null +++ b/content/fr-FR/learn/overview.smd @@ -0,0 +1,629 @@ +--- +.title = "Overview", +.author = "", +.date = @date("2024-08-07:00:00:00"), +.layout = "page.shtml", +.custom = { + "mobile_menu_title": "Overview", +}, +--- +# Feature Highlights +## [Small, simple language]($heading.id('small-simple-language')) + +Focus on debugging your application rather than debugging your programming language knowledge. + +Zig's entire syntax is specified with a [580-line PEG grammar file](https://ziglang.org/documentation/master/#Grammar). + +There is **no hidden control flow**, no hidden memory allocations, no preprocessor, and no macros. If Zig code doesn't look like it's jumping away to call a function, then it isn't. This means you can be sure that the following code calls only `foo()` and then `bar()`, and this is guaranteed without needing to know the types of anything: + +```zig +var a = b + c.d; +foo(); +bar(); +``` + +Examples of hidden control flow: + +- D has `@property` functions, which are methods that you call with what looks like field access, so in the above example, `c.d` might call a function. +- C++, D, and Rust have operator overloading, so the `+` operator might call a function. +- C++, D, and Go have throw/catch exceptions, so `foo()` might throw an exception, and prevent `bar()` from being called. + + Zig promotes code maintenance and readability by making all control flow managed exclusively with language keywords and function calls. + +## [Performance and Safety: Choose Two]($heading.id('performance-and-safety-choose-two')) + +Zig has four [build modes](https://ziglang.org/documentation/master/#Build-Mode), and they can all be mixed and matched all the way down to [scope granularity](https://ziglang.org/documentation/master/#setRuntimeSafety). + +| Parameter | [Debug](https://ziglang.org/documentation/master/#Debug) | [ReleaseSafe](https://ziglang.org/documentation/master/#ReleaseSafe) | [ReleaseFast](https://ziglang.org/documentation/master/#ReleaseFast) | [ReleaseSmall](https://ziglang.org/documentation/master/#ReleaseSmall) | +|-----------|-------|-------------|-------------|--------------| +Optimizations - improve speed, harm debugging, harm compile time | | On | On | On | +Runtime Safety Checks - harm speed, harm size, crash instead of undefined behavior | On | On | | | + +Here is what [Integer Overflow](https://ziglang.org/documentation/master/#Integer-Overflow) looks like at compile time, regardless of the build mode: + +[]($code.language('=html').buildAsset('features/1-integer-overflow.zig')) + +Here is what it looks like at runtime, in safety-checked builds: + +[]($code.language('=html').buildAsset('features/2-integer-overflow-runtime.zig')) + + +Those [stack traces work on all targets](#stack-traces-on-all-targets), including [freestanding](https://andrewkelley.me/post/zig-stack-traces-kernel-panic-bare-bones-os.html). + +With Zig one can rely on a safety-enabled build mode, and selectively disable safety at the performance bottlenecks. For example the previous example could be modified like this: + +[]($code.language('=html').buildAsset('features/3-undefined-behavior.zig')) + +Zig uses [undefined behavior](https://ziglang.org/documentation/master/#Undefined-Behavior) as a razor sharp tool for both bug prevention and performance enhancement. + +Speaking of performance, Zig is faster than C. + +- All Zig code lives in one compilation unit, optimized together. +- Carefully chosen illegal behavior. For example, in Zig both signed and unsigned integers have illegal behavior on overflow, contrasted to only signed integers in C. This [facilitates optimizations that are not available in C](https://godbolt.org/z/n_nLEU). +- Zig directly exposes a [SIMD vector type](https://ziglang.org/documentation/master/#Vectors), making it easy to write portable vectorized code. +- The standard library provides essential data structures such as hash maps and array lists, whereas in C it is tempting to use linked lists for simplicity. +- Advanced CPU features are enabled by default, unless [cross-compiling](#cross-compiling-is-a-first-class-use-case). + +Please note that Zig is not a fully safe language. For those interested in following Zig's safety story, subscribe to these issues: + +- [enumerate all kinds of undefined behavior, even that which cannot be safety-checked](https://github.com/ziglang/zig/issues/1966) +- [make Debug and ReleaseSafe modes fully safe](https://github.com/ziglang/zig/issues/2301) + +## Zig competes with C instead of depending on it + +The Zig Standard Library integrates with libc, but does not depend on it. Here's Hello World: + +[]($code.language('=html').buildAsset('features/4-hello.zig')) + +When compiled with `-O ReleaseSmall`, debug symbols stripped, single-threaded mode, this produces a 9.8 KiB static executable for the x86_64-linux target: +``` +$ zig build-exe hello.zig -O ReleaseSmall -fstrip -fsingle-threaded +$ wc -c hello +9944 hello +$ ldd hello + not a dynamic executable +``` + +A Windows build is even smaller, coming out to 4096 bytes: +``` +$ zig build-exe hello.zig -O ReleaseSmall -fstrip -fsingle-threaded -target x86_64-windows +$ wc -c hello.exe +4096 hello.exe +$ file hello.exe +hello.exe: PE32+ executable (console) x86-64, for MS Windows +``` + +## Order independent top level declarations + +Top level declarations such as global variables are order-independent and lazily analyzed. The initialization values of global variables are [evaluated at compile-time](#compile-time-reflection-and-compile-time-code-execution). + +[]($code.language('=html').buildAsset('features/5-global-variables.zig')) + +## Optional type instead of null pointers + +In other programming languages, null references are the source of many runtime exceptions, and even stand accused of being [the worst mistake of computer science](https://www.lucidchart.com/techblog/2015/08/31/the-worst-mistake-of-computer-science/). + +Unadorned Zig pointers cannot be null: + +[]($code.language('=html').buildAsset('features/6-null-to-ptr.zig')) + +However any type can be made into an [optional type](https://ziglang.org/documentation/master/#Optionals) by prefixing it with `?`: + +[]($code.language('=html').buildAsset('features/7-optional-syntax.zig')) + +To unwrap an optional value, one can use `orelse` to provide a default value: + +[]($code.language('=html').buildAsset('features/8-optional-orelse.zig')) + +Another option is to use if: + +[]($code.language('=html').buildAsset('features/9-optional-if.zig')) + + The same syntax works with [while](https://ziglang.org/documentation/master/#while): + +[]($code.language('=html').buildAsset('features/10-optional-while.zig')) + +## Manual memory management + +A library written in Zig is eligible to be used anywhere: + +- [Desktop applications](https://github.com/TM35-Metronome/) +- Low latency servers +- [Operating System kernels](https://github.com/AndreaOrru/zen) +- [Embedded devices](https://github.com/skyfex/zig-nrf-demo/) +- Real-time software, e.g. live performances, airplanes, pacemakers +- [In web browsers or other plugins with WebAssembly](https://shritesh.github.io/zigfmt-web/) +- By other programming languages, using the C ABI + +In order to accomplish this, Zig programmers must manage their own memory, and must handle memory allocation failure. + +This is true of the Zig Standard Library as well. Any functions that need to allocate memory accept an allocator parameter. As a result, the Zig Standard Library can be used even for the freestanding target. + +In addition to [A fresh take on error handling](#a-fresh-take-on-error-handling), Zig provides [defer](https://ziglang.org/documentation/master/#defer) and [errdefer](https://ziglang.org/documentation/master/#errdefer) to make all resource management - not only memory - simple and easily verifiable. + +For an example of `defer`, see [Integration with C libraries without FFI/bindings](#integration-with-c-libraries-without-ffibindings). Here is an example of using `errdefer`: +[]($code.language('=html').buildAsset('features/11-errdefer.zig')) + + +## [A fresh take on error handling]($heading.id('a-fresh-take-on-error-handling')) + +Errors are values, and may not be ignored: + +[]($code.language('=html').buildAsset('features/12-errors-as-values.zig')) + +Errors can be handled with [catch](https://ziglang.org/documentation/master/#catch): + +[]($code.language('=html').buildAsset('features/13-errors-catch.zig')) + +The keyword [try](https://ziglang.org/documentation/master/#try) is a shortcut for `catch |err| return err`: + +[]($code.language('=html').buildAsset('features/14-errors-try.zig')) + +Note that is an [Error Return Trace](https://ziglang.org/documentation/master/#Error-Return-Traces), not a [stack trace](#stack-traces-on-all-targets). The code did not pay the price of unwinding the stack to come up with that trace. + +The [switch](https://ziglang.org/documentation/master/#switch) keyword used on an error ensures that all possible errors are handled: + +[]($code.language('=html').buildAsset('features/15-errors-switch.zig')) + +The keyword [unreachable](https://ziglang.org/documentation/master/#unreachable) is used to assert that no errors will occur: + +[]($code.language('=html').buildAsset('features/16-unreachable.zig')) + +This invokes [undefined behavior](#performance-and-safety-choose-two) in the unsafe build modes, so be sure to use it only when success is guaranteed. + +### [Stack traces on all targets]($heading.id("stack-traces-on-all-targets")) + +The stack traces and [error return traces](https://ziglang.org/documentation/master/#Error-Return-Traces) shown on this page work on all Tier 1 Support and some Tier 2 Support targets. [Even freestanding](https://andrewkelley.me/post/zig-stack-traces-kernel-panic-bare-bones-os.html)! + +In addition, the standard library has the ability to capture a stack trace at any point and then dump it to standard error later: + +[]($code.language('=html').buildAsset('features/17-stack-traces.zig')) + +The standard library's DebugAllocator uses this technique to report leaks and double frees. + +## Generic data structures and functions + +Types are values that must be known at compile-time: + +[]($code.language('=html').buildAsset('features/18-types.zig')) + +A generic data structure is simply a function that returns a `type`: + +[]($code.language('=html').buildAsset('features/19-generics.zig')) + +## [Compile-time reflection and compile-time code execution]($heading.id('compile-time-reflection-and-compile-time-code-execution')) + +The [@typeInfo](https://ziglang.org/documentation/master/#typeInfo) builtin function provides reflection: + +[]($code.language('=html').buildAsset('features/20-reflection.zig')) + +The Zig Standard Library uses this technique to implement formatted printing. Despite being a [Small, simple language](#small-simple-language), Zig's formatted printing is implemented entirely in Zig. Meanwhile, in C, compile errors for printf are hard-coded into the compiler. Similarly, in Rust, the formatted printing macro is hard-coded into the compiler. + +Zig can also evaluate functions and blocks of code at compile-time. In some contexts, such as global variable initializations, the expression is implicitly evaluated at compile-time. Otherwise, one can explicitly evaluate code at compile-time with the [comptime](https://ziglang.org/documentation/master/#comptime) keyword. This can be especially powerful when combined with assertions: + +[]($code.language('=html').buildAsset('features/21-comptime.zig')) + +## [Integration with C libraries without FFI/bindings]($heading.id('integration-with-c-libraries-without-ffibindings')) + +[@cImport](https://ziglang.org/documentation/master/#cImport) directly imports types, variables, functions, and simple macros for use in Zig. It even translates inline functions from C into Zig. + +Here is an example of emitting a sine wave using [libsoundio](http://libsound.io/): + +sine.zig +[]($code.language('=html').buildAsset('features/22-sine-wave.zig')) + +``` +$ zig build-exe sine.zig -lsoundio -lc +$ ./sine +Output device: Built-in Audio Analog Stereo +^C +``` + +[This Zig code is significantly simpler than the equivalent C code](https://gist.github.com/andrewrk/d285c8f912169329e5e28c3d0a63c1d8), as well as having more safety protections, and all this is accomplished by directly importing the C header file - no API bindings. + +*Zig is better at using C libraries than C is at using C libraries.* + +### [Zig is also a C compiler]($heading.id('zig-is-also-a-c-compiler')) + +Here's an example of Zig building some C code: + +hello.c +```c +#include + +int main(int argc, char **argv) { + printf("Hello world\n"); + return 0; +} +``` + +``` +$ zig build-exe hello.c --library c +$ ./hello +Hello world +``` + +You can use `--verbose-cc` to see what C compiler command this executed: +``` +$ zig build-exe hello.c --library c --verbose-cc +zig cc -MD -MV -MF .zig-cache/tmp/42zL6fBH8fSo-hello.o.d -nostdinc -fno-spell-checking -isystem /home/andy/dev/zig/build/lib/zig/include -isystem /home/andy/dev/zig/build/lib/zig/libc/include/x86_64-linux-gnu -isystem /home/andy/dev/zig/build/lib/zig/libc/include/generic-glibc -isystem /home/andy/dev/zig/build/lib/zig/libc/include/x86_64-linux-any -isystem /home/andy/dev/zig/build/lib/zig/libc/include/any-linux-any -march=native -g -fstack-protector-strong --param ssp-buffer-size=4 -fno-omit-frame-pointer -o .zig-cache/tmp/42zL6fBH8fSo-hello.o -c hello.c -fPIC +``` + +Note that if you run the command again, there is no output, and it finishes instantly: +``` +$ time zig build-exe hello.c --library c --verbose-cc + +real 0m0.027s +user 0m0.018s +sys 0m0.009s +``` + +This is thanks to [Build Artifact Caching](https://ziglang.org/download/0.4.0/release-notes.html#Build-Artifact-Caching). Zig automatically parses the .d file using a robust caching system to avoid duplicating work. + +Not only can Zig compile C code, but there is a very good reason to use Zig as a C compiler: [Zig ships with libc](#zig-ships-with-libc). + +### Export functions, variables, and types for C code to depend on + +One of the primary use cases for Zig is exporting a library with the C ABI for other programming languages to call into. The `export` keyword in front of functions, variables, and types causes them to be part of the library API: + +mathtest.zig +[]($code.language('=html').buildAsset('features/23-math-test.zig')) + +To make a static library: +``` +$ zig build-lib mathtest.zig +``` + +To make a shared library: +``` +$ zig build-lib mathtest.zig -dynamic +``` + +Here is an example with the [Zig Build System](#zig-build-system): + +test.c +```c +#include "mathtest.h" +#include + +int main(int argc, char **argv) { + int32_t result = add(42, 1337); + printf("%d\n", result); + return 0; +} +``` + +build.zig +[]($code.language('=html').buildAsset('features/24-build.zig')) + +``` +$ zig build test +1379 +``` + +## [Cross-compiling is a first-class use case]($heading.id('cross-compiling-is-a-first-class-use-case')) + +Zig can build for any of the targets from the Support Table (see latest release notes) with Tier 3 Support or better. No "cross toolchain" needs to be installed or anything like that. Here's a native Hello World: + +[]($code.language('=html').buildAsset('features/4-hello.zig')) + +Now to build it for x86_64-windows, x86_64-macos, and aarch64-linux: +``` +$ zig build-exe hello.zig -target x86_64-windows +$ file hello.exe +hello.exe: PE32+ executable (console) x86-64, for MS Windows +$ zig build-exe hello.zig -target x86_64-macos +$ file hello +hello: Mach-O 64-bit x86_64 executable, flags: +$ zig build-exe hello.zig -target aarch64-linux +$ file hello +hello: ELF 64-bit LSB executable, ARM aarch64, version 1 (SYSV), statically linked, with debug_info, not stripped +``` + +This works on any Tier 3+ target, for any Tier 3+ target. + +### [Zig ships with libc]($heading.id('zig-ships-with-libc')) + +You can find the available libc targets with `zig targets`: +``` +... +.libc = .{ + "arc-linux-gnu", + "arm-freebsd-eabihf", + "arm-linux-gnueabi", + "arm-linux-gnueabihf", + "arm-linux-musleabi", + "arm-linux-musleabihf", + "arm-netbsd-eabi", + "arm-netbsd-eabihf", + "armeb-linux-gnueabi", + "armeb-linux-gnueabihf", + "armeb-linux-musleabi", + "armeb-linux-musleabihf", + "armeb-netbsd-eabi", + "armeb-netbsd-eabihf", + "thumb-linux-musleabi", + "thumb-linux-musleabihf", + "thumb-windows-gnu", + "thumbeb-linux-musleabi", + "thumbeb-linux-musleabihf", + "aarch64-freebsd-none", + "aarch64-linux-gnu", + "aarch64-linux-musl", + "aarch64-macos-none", + "aarch64-netbsd-none", + "aarch64-windows-gnu", + "aarch64_be-linux-gnu", + "aarch64_be-linux-musl", + "aarch64_be-netbsd-none", + "csky-linux-gnueabi", + "csky-linux-gnueabihf", + "hexagon-linux-musl", + "loongarch64-linux-gnu", + "loongarch64-linux-gnusf", + "loongarch64-linux-musl", + "loongarch64-linux-muslsf", + "m68k-linux-gnu", + "m68k-linux-musl", + "m68k-netbsd-none", + "mips-linux-gnueabi", + "mips-linux-gnueabihf", + "mips-linux-musleabi", + "mips-linux-musleabihf", + "mips-netbsd-eabi", + "mips-netbsd-eabihf", + "mipsel-linux-gnueabi", + "mipsel-linux-gnueabihf", + "mipsel-linux-musleabi", + "mipsel-linux-musleabihf", + "mipsel-netbsd-eabi", + "mipsel-netbsd-eabihf", + "mips64-linux-gnuabi64", + "mips64-linux-gnuabin32", + "mips64-linux-muslabi64", + "mips64-linux-muslabin32", + "mips64el-linux-gnuabi64", + "mips64el-linux-gnuabin32", + "mips64el-linux-muslabi64", + "mips64el-linux-muslabin32", + "powerpc-freebsd-eabihf", + "powerpc-linux-gnueabi", + "powerpc-linux-gnueabihf", + "powerpc-linux-musleabi", + "powerpc-linux-musleabihf", + "powerpc-netbsd-eabi", + "powerpc-netbsd-eabihf", + "powerpc64-freebsd-none", + "powerpc64-linux-gnu", + "powerpc64-linux-musl", + "powerpc64le-freebsd-none", + "powerpc64le-linux-gnu", + "powerpc64le-linux-musl", + "riscv32-linux-gnu", + "riscv32-linux-musl", + "riscv64-freebsd-none", + "riscv64-linux-gnu", + "riscv64-linux-musl", + "s390x-linux-gnu", + "s390x-linux-musl", + "sparc-linux-gnu", + "sparc-netbsd-none", + "sparc64-linux-gnu", + "sparc64-netbsd-none", + "wasm32-wasi-musl", + "x86-freebsd-none", + "x86-linux-gnu", + "x86-linux-musl", + "x86-netbsd-none", + "x86-windows-gnu", + "x86_64-freebsd-none", + "x86_64-linux-gnu", + "x86_64-linux-gnux32", + "x86_64-linux-musl", + "x86_64-linux-muslx32", + "x86_64-macos-none", + "x86_64-netbsd-none", + "x86_64-windows-gnu", +}, +... + ``` + +What this means is that `--library c` for these targets *does not depend on any system files*! + +Let's look at that [C hello world example](#zig-is-also-a-c-compiler) again: +``` +$ zig build-exe hello.c --library c +$ ./hello +Hello world +$ ldd ./hello + linux-vdso.so.1 (0x00007ffd03dc9000) + libc.so.6 => /lib/libc.so.6 (0x00007fc4b62be000) + libm.so.6 => /lib/libm.so.6 (0x00007fc4b5f29000) + libpthread.so.0 => /lib/libpthread.so.0 (0x00007fc4b5d0a000) + libdl.so.2 => /lib/libdl.so.2 (0x00007fc4b5b06000) + librt.so.1 => /lib/librt.so.1 (0x00007fc4b58fe000) + /lib/ld-linux-x86-64.so.2 => /lib64/ld-linux-x86-64.so.2 (0x00007fc4b6672000) +``` + +[glibc](https://www.gnu.org/software/libc/) does not support building statically, but [musl](https://www.musl-libc.org/) does: +``` +$ zig build-exe hello.c --library c -target x86_64-linux-musl +$ ./hello +Hello world +$ ldd hello + not a dynamic executable +``` + +In this example, Zig built musl libc from source and then linked against it. The build of musl libc for x86_64-linux remains available thanks to the [caching system](https://ziglang.org/download/0.4.0/release-notes.html#Build-Artifact-Caching), so any time this libc is needed again it will be available instantly. + +This means that this functionality is available on any platform. Windows and macOS users can build Zig and C code, and link against libc, for any of the targets listed above. Similarly code can be cross compiled for other architectures: +``` +$ zig build-exe hello.c --library c -target aarch64-linux-gnu +$ file hello +hello: ELF 64-bit LSB executable, ARM aarch64, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux-aarch64.so.1, for GNU/Linux 2.0.0, with debug_info, not stripped +``` + +In some ways, Zig is a better C compiler than C compilers! + +This functionality is more than bundling a cross-compilation toolchain along with Zig. For example, the total size of libc headers that Zig ships is 22 MiB uncompressed. Meanwhile, the headers for musl libc + linux headers on x86_64 alone are 8 MiB, and for glibc are 3.1 MiB (glibc is missing the linux headers), yet Zig currently ships with 40 libcs. With a naive bundling that would be 444 MiB. However, thanks to this [process_headers tool](https://github.com/ziglang/zig/blob/0.4.0/libc/process_headers.zig), and some [good old manual labor](https://github.com/ziglang/zig/wiki/Updating-libc), Zig binary tarballs remain roughly 30 MiB total, despite supporting libc for all these targets, as well as compiler-rt, libunwind, and libcxx, and despite being a clang-compatible C compiler. For comparison, the Windows binary build of clang 8.0.0 itself from llvm.org is 132 MiB. + +Note that only the Tier 1 Support targets have been thoroughly tested. It is planned to [add more libcs](https://github.com/ziglang/zig/issues/514) (including for Windows), and to [add test coverage for building against all the libcs](https://github.com/ziglang/zig/issues/2058). + +It's [planned to have a Zig Package Manager](https://github.com/ziglang/zig/issues/943), but it's not done yet. One of the things that will be possible is to create a package for C libraries. This will make the [Zig Build System](#zig-build-system) attractive for Zig programmers and C programmers alike. + +## [Zig Build System]($heading.id('zig-build-system')) + +Zig comes with a build system, so you don't need make, cmake, or anything like that. +``` +$ zig init +info: created build.zig +info: created build.zig.zon +info: created src/main.zig +info: created src/root.zig +info: see `zig build --help` for a menu of options +``` + +src/main.zig +[]($code.language('=html').buildAsset('features/25-all-bases.zig')) + + +build.zig +[]($code.language('=html').buildAsset('features/26-build.zig')) + + +Let's have a look at that `--help` menu. +``` +$ zig build --help +Usage: zig build [steps] [options] + +Steps: + install (default) Copy build artifacts to prefix path + uninstall Remove build artifacts from prefix path + run Run the app + test Run unit tests + +General Options: + -p, --prefix [path] Where to install files (default: zig-out) + --prefix-lib-dir [path] Where to install libraries + --prefix-exe-dir [path] Where to install executables + --prefix-include-dir [path] Where to install C header files + + --release[=mode] Request release mode, optionally specifying a + preferred optimization mode: fast, safe, small + + -fdarling, -fno-darling Integration with system-installed Darling to + execute macOS programs on Linux hosts + (default: no) + -fqemu, -fno-qemu Integration with system-installed QEMU to execute + foreign-architecture programs on Linux hosts + (default: no) + --glibc-runtimes [path] Enhances QEMU integration by providing glibc built + for multiple foreign architectures, allowing + execution of non-native programs that link with glibc. + -frosetta, -fno-rosetta Rely on Rosetta to execute x86_64 programs on + ARM64 macOS hosts. (default: no) + -fwasmtime, -fno-wasmtime Integration with system-installed wasmtime to + execute WASI binaries. (default: no) + -fwine, -fno-wine Integration with system-installed Wine to execute + Windows programs on Linux hosts. (default: no) + + -h, --help Print this help and exit + -l, --list-steps Print available steps + --verbose Print commands before executing them + --color [auto|off|on] Enable or disable colored error messages + --prominent-compile-errors Buffer compile errors and display at end + --summary [mode] Control the printing of the build summary + all Print the build summary in its entirety + new Omit cached steps + failures (Default) Only print failed steps + none Do not print the build summary + -j Limit concurrent jobs (default is to use all CPU cores) + --maxrss Limit memory usage (default is to use available memory) + --skip-oom-steps Instead of failing, skip steps that would exceed --maxrss + --fetch Exit after fetching dependency tree + --watch Continuously rebuild when source files are modified + --fuzz Continuously search for unit test failures + --debounce Delay before rebuilding after changed file detected + -fincremental Enable incremental compilation + -fno-incremental Disable incremental compilation + +Project-Specific Options: + -Dtarget=[string] The CPU architecture, OS, and ABI to build for + -Dcpu=[string] Target CPU features to add or subtract + -Dofmt=[string] Target object format + -Ddynamic-linker=[string] Path to interpreter on the target system + -Doptimize=[enum] Prioritize performance, safety, or binary size + Supported Values: + Debug + ReleaseSafe + ReleaseFast + ReleaseSmall + +System Integration Options: + --search-prefix [path] Add a path to look for binaries, libraries, headers + --sysroot [path] Set the system root directory (usually /) + --libc [file] Provide a file which specifies libc paths + + --system [pkgdir] Disable package fetching; enable all integrations + -fsys=[name] Enable a system integration + -fno-sys=[name] Disable a system integration + + Available System Integrations: Enabled: + (none) - + +Advanced Options: + -freference-trace[=num] How many lines of reference trace should be shown per compile error + -fno-reference-trace Disable reference trace + -fallow-so-scripts Allows .so files to be GNU ld scripts + -fno-allow-so-scripts (default) .so files must be ELF files + --build-file [file] Override path to build.zig + --cache-dir [path] Override path to local Zig cache directory + --global-cache-dir [path] Override path to global Zig cache directory + --zig-lib-dir [arg] Override path to Zig lib directory + --build-runner [file] Override path to build runner + --seed [integer] For shuffling dependency traversal order (default: random) + --debug-log [scope] Enable debugging the compiler + --debug-pkg-config Fail if unknown pkg-config flags encountered + --debug-rt Debug compiler runtime libraries + --verbose-link Enable compiler debug output for linking + --verbose-air Enable compiler debug output for Zig AIR + --verbose-llvm-ir[=file] Enable compiler debug output for LLVM IR + --verbose-llvm-bc=[file] Enable compiler debug output for LLVM BC + --verbose-cimport Enable compiler debug output for C imports + --verbose-cc Enable compiler debug output for C compilation + --verbose-llvm-cpu-features Enable compiler debug output for LLVM CPU features +``` + +You can see that one of the available steps is run. +``` +$ zig build run +All your codebase are belong to us. +Run `zig build test` to run the tests. +``` + +Here are some example build scripts: + +- [Build script of OpenGL Tetris game](https://github.com/andrewrk/tetris/blob/master/build.zig) +- [Build script of bare metal Raspberry Pi 3 arcade game](https://github.com/andrewrk/clashos/blob/master/build.zig) +- [Build script of self-hosted Zig compiler](https://github.com/ziglang/zig/blob/master/build.zig) + +## Wide range of targets supported + +Zig uses a "support tier" system to communicate the level of support for different targets. + +[Support Table as of Zig 0.14.0](https://ziglang.org/download/0.14.0/release-notes.html#Target-Support) + +## Friendly toward package maintainers + +The reference Zig compiler is not completely self-hosted yet, but no matter what, [it will remain exactly 3 steps](https://github.com/ziglang/zig/issues/853) to go from having a system C++ compiler to having a fully self-hosted Zig compiler for any target. As Maya Rashish notes, [porting Zig to other platforms is fun and speedy](http://coypu.sdf.org/porting-zig.html). + +Non-debug [build modes](https://ziglang.org/documentation/master/#Build-Mode) are reproducible/deterministic. + +There is a [JSON version of the download page](https://ziglang.org/download/index.json). + +Several members of the Zig team have experience maintaining packages. + +- [Daurnimator](https://github.com/daurnimator) maintains the [Arch Linux package](https://archlinux.org/packages/extra/x86_64/zig/) +- [Marc Tiehuis](https://tiehuis.github.io/) maintains the Visual Studio Code package. +- [Andrew Kelley](https://andrewkelley.me/) spent a year or so doing [Debian and Ubuntu packaging](https://qa.debian.org/developer.php?login=superjoe30%40gmail.com&comaint=yes), and casually contributes to [nixpkgs](https://github.com/NixOS/nixpkgs/). +- [Jeff Fowler](https://blog.jfo.click/) maintains the Homebrew package and started the [Sublime package](https://github.com/ziglang/sublime-zig-language) (now maintained by [emekoi](https://github.com/emekoi)). diff --git a/content/fr-FR/learn/samples.smd b/content/fr-FR/learn/samples.smd new file mode 100644 index 000000000..6d7d161bd --- /dev/null +++ b/content/fr-FR/learn/samples.smd @@ -0,0 +1,49 @@ +--- +.title = "Exemples", +.author = "", +.date = @date("2024-08-07:00:00:00"), +.layout = "page.shtml", +.custom = { + "mobile_menu_title": "Samples", + "toc": true, +}, +--- + +# [Hello world]($heading.id('hello')) +Un exemple minimal affichant "Hello world". + +[]($code.language('=html').buildAsset("samples/hello-world.zig")) + +# [Utilisation de librairies externes]($heading.id('ext')) +Toutes les fonctions dans API système peuvent être appellées de cette manière. Il n'y a pas besion d'interface spécifique. + +[]($code.language('=html').buildAsset("samples/windows-msgbox.zig")) + +# [Détection de fuites de mémoire]($heading.id('leak')) +Avec `std.heap.GeneralPurposeAllocator`, on peut suivre les libérations mémoire en double et les fuites de mémoires. + +[]($code.language('=html').buildAsset("samples/memory-leak.zig")) + + +# [Interopérabilité avec le C ]($heading.id('c-interop')) + +Voici une example d'utilisation d'un header en C et d'un linkage avec libc et raylib. + +[]($code.language('=html').buildAsset("samples/c-interop.zig")) + + +# [Zigg Zagg]($heading.id('zigg-zagg')) +Zig est *optimisé* pour les entretiens d'embauches (en fait, non). + +[]($code.language('=html').buildAsset("samples/ziggzagg.zig")) + + +# [Types génériques]($heading.id('generic')) +En Zig, les types sont des valeures "comptime" et l'on peut utiliser dese fonctions qui retournent un type pour implémenter des algorithmes génériques, mais aussi des structures de données. +Par exemple, voici une implémentation simple d'une file d'attente avec des tests. + +[]($code.language('=html').buildAsset("samples/generic-type.zig")) + +# [Utilisation de cURL depuis Zig]($heading.id('curl')) + +[]($code.language('=html').buildAsset("samples/curl.zig")) diff --git a/content/fr-FR/learn/tools.smd b/content/fr-FR/learn/tools.smd new file mode 100644 index 000000000..93ee983df --- /dev/null +++ b/content/fr-FR/learn/tools.smd @@ -0,0 +1,38 @@ +--- +.title = "Tools", +.author = "", +.date = @date("2024-08-07:00:00:00"), +.layout = "page.shtml", +.custom = { + "mobile_menu_title": "Tools", + "toc": true, +}, +--- + +# [Language Servers]($heading.id('lsp')) +Language servers are editor-agnostic tools for obtaining syntax highlighting, autocompletion, and many other features. Consider using a Language server over a syntax-highlighting extension for a richer development experience. + +- [zigtools/zls](https://github.com/zigtools/zls) + +# [Text Editors]($heading.id('editors')) +Editor-specific tools, mostly syntax highlighters. + +## VS Code +- [ziglang/vscode-zig](https://github.com/ziglang/vscode-zig) + +## Sublime Text +- [ziglang/sublime-zig-language](https://github.com/ziglang/sublime-zig-language) + +## Vim +- [ziglang/zig.vim](https://github.com/ziglang/zig.vim) + +## Emacs +- [ziglang/zig-mode](https://github.com/ziglang/zig-mode) + +## Kate +- [ziglang/kde-syntax-highlighting](https://github.com/ziglang/kde-syntax-highlighting) + +## JetBrains family (IntelliJ IDEA, Fleet) +- [ZigBrains](https://plugins.jetbrains.com/plugin/22456-zigbrains) +- [Zig Fleet Plugin](https://plugins.jetbrains.com/plugin/26070-zig) + diff --git a/content/fr-FR/learn/why_zig_rust_d_cpp.smd b/content/fr-FR/learn/why_zig_rust_d_cpp.smd new file mode 100644 index 000000000..98b9066cb --- /dev/null +++ b/content/fr-FR/learn/why_zig_rust_d_cpp.smd @@ -0,0 +1,158 @@ +--- +.title = "Why Zig When There is Already C++, D, and Rust?", +.author = "", +.date = @date("2024-08-07:00:00:00"), +.layout = "page.shtml", +.custom = { + "mobile_menu_title": "Why Zig?", +}, +--- + +# No hidden control flow + +If Zig code doesn't look like it's jumping away to call a function, then it isn't. This means you can be sure that the following code calls only `foo()` and then `bar()`, and this is guaranteed without needing to know the types of anything: + +```zig +var a = b + c.d; +foo(); +bar(); +``` + +Examples of hidden control flow: + +* D has `@property` functions, which are methods that you call with what looks like field access, so in the above example, `c.d` might call a function. +* C++, D, and Rust have operator overloading, so the `+` operator might call a function. +* C++, D, and Go have throw/catch exceptions (sometimes also called panic/recover), so `foo()` might throw an exception, and prevent `bar()` from being called. (Of course, even in Zig `foo()` could deadlock and prevent `bar()` from being called, but that can happen in any Turing-complete language.) + +The purpose of this design decision is to improve readability. + +# No hidden allocations + +Zig has a hands-off approach when it comes to heap allocation. There is no `new` keyword +or any other language feature that uses a heap allocator (e.g. string concatenation operator[1]). +The entire concept of the heap is managed by library and application code, not by the language. + +Examples of hidden allocations: + +* Go's `defer` allocates memory to a function-local stack. In addition to being an unintuitive + way for this control flow to work, it can cause out-of-memory failures if you use + `defer` inside a loop. +* C++ coroutines allocate heap memory in order to call a coroutine. +* In Go, a function call can cause heap allocation because goroutines allocate small stacks + that get resized when the call stack gets deep enough. +* The main Rust standard library APIs panic on out of memory conditions, and the alternate + APIs that accept allocator parameters are an afterthought + (see [rust-lang/rust#29802](https://github.com/rust-lang/rust/issues/29802)). + +Nearly all garbage collected languages have hidden allocations strewn about, since the +garbage collector hides the evidence on the cleanup side. + +The main problem with hidden allocations is that it prevents the *reusability* of a +piece of code, unnecessarily limiting the number of environments that code would be +appropriate to be deployed to. Simply put, there are use cases where one must be able +to rely on control flow and function calls not to have the side-effect of memory allocation, +therefore a programming language can only serve these use cases if it can realistically +provide this guarantee. + +In Zig, there are standard library features that provide and work with heap allocators, +but those are optional standard library features, not built into the language itself. +If you never initialize a heap allocator, you can be confident your program will not heap allocate. + +Every standard library feature that needs to allocate heap memory accepts an `Allocator` parameter +in order to do it. This means that the Zig standard library supports freestanding targets. For +example `std.ArrayList` and `std.AutoHashMap` can be used for bare metal programming! + +Custom allocators make manual memory management a breeze. Zig has a debug allocator that +maintains memory safety in the face of use-after-free and double-free. It automatically +detects and prints stack traces of memory leaks. There is an arena allocator so that you can +bundle any number of allocations into one and free them all at once rather than manage +each allocation independently. Special-purpose allocators can be used to improve performance +or memory usage for any particular application's needs. + +[1]: Actually there is a string concatenation operator (generally an array concatenation operator), but it only works at compile time, so it still doesn't do any runtime heap allocation. + +# First-class support for no standard library + +As hinted above, Zig has an entirely optional standard library. Each std lib API only gets compiled +into your program if you use it. Zig has equal support for either linking against libc or +not linking against it. Zig is friendly to bare-metal and high-performance development. + +It's the best of both worlds; for example in Zig, WebAssembly programs can both use +the normal features of the standard library, and still result in the tiniest binaries when +compared to other programming languages that support compiling to WebAssembly. + +# A Portable Language for Libraries + +One of the holy grails of programming is code reuse. Sadly, in practice, we find ourselves re-inventing the wheel many times over again. Often it's justified. + + * If an application has real-time requirements, then any library that uses garbage collection or any other non-deterministic behavior is disqualified as a dependency. + * If a language makes it too easy to ignore errors, and thus hard to verify that a library correctly handles and bubbles up errors, it can be tempting to ignore the library and re-implement it, knowing that one handled all the relevant errors correctly. Zig is designed such that the laziest thing a programmer can do is handle errors correctly, and thus one can be reasonably confident that a library will properly bubble errors up. + * Currently it is pragmatically true that C is the most versatile and portable language. Any language that does not have the ability to interact with C code risks obscurity. Zig is attempting to become the new portable language for libraries by simultaneously making it straightforward to conform to the C ABI for external functions, and introducing safety and language design that prevents common bugs within the implementations. + +# A Package Manager and Build System for Existing Projects + +Zig is a toolchain in addition to a programming language. It comes with a +[build system and package manager](/learn/build-system/) that are useful even +in the context of a traditional C/C++ project. + +Not only can you write Zig code instead of C or C++ code, but you can use Zig +as a replacement for autotools, cmake, make, scons, ninja, etc. And on top of +this, it provides a package manager for native dependencies. This build system +is appropriate even if the entirety of a project's codebase is in C or C++. +For example, by +[porting ffmpeg to the zig build system](https://github.com/andrewrk/ffmpeg), +it becomes possible to compile ffmpeg on any supported system for any supported +system using only a [50 MiB download of zig](/download/). For open source +projects, this streamlined ability to build from source - and even +cross-compile - can be the difference between gaining or losing valuable +contributors. + +System package managers such as apt-get, pacman, homebrew, and others are +instrumental for end user experience, but they can be insufficient for the +needs of developers. A language-specific package manager can be the difference +between having no contributors and having many. For open source projects, the +difficulty of getting the project to build at all is a huge hurdle for +potential contributors. For C/C++ projects, having dependencies can be fatal, +especially on Windows, where there is no package manager. Even when just +building Zig itself, most potential contributors have a difficult time with the +LLVM dependency. Zig offers a way for projects to depend on native libraries +directly - without depending on the users' system package manager to have the +correct version available, and in a way that is practically guaranteed to +successfully build projects on the first try regardless of what system is being +used and independent of what platform is being targeted. + +**Other languages have package managers but they do not eliminate pesky system +dependencies like Zig does.** + +Zig can replace a project's build system with a reasonable language using +a declarative API for building projects, that also provides package management, +and thus the ability to actually depend on other C libraries. The ability to +have dependencies enables higher level abstractions, and thus the proliferation +of reusable high-level code. + +# Simplicity + +C++, Rust, and D have such a large number of features that they can be distracting from the actual meaning of the application you are working on. One finds oneself debugging one's knowledge of the programming language instead of debugging the application itself. + +Zig has no macros yet is still powerful enough to express complex programs in a +clear, non-repetitive way. Even Rust has macros with special cases like +`format!`, which is implemented in the compiler itself. Meanwhile in Zig, the +equivalent function is implemented in the standard library with no special case +code in the compiler. + +# Tooling + +Zig can be downloaded from [the downloads section](/download/). Zig provides +binary archives for Linux, Windows, and macOS. The following describes what you +get with one of these archives: + +* installed by downloading and extracting a single archive, no system configuration needed +* statically compiled so there are no runtime dependencies +* supports using LLVM for optimized release builds while using Zig's custom backends for faster compilation performance +* additionally supports a backend for outputting C code +* out of the box cross-compilation to most major platforms +* ships with source code for libc that will be dynamically compiled when needed for any supported platform +* includes build system with concurrency and caching +* compiles C and C++ code with libc support +* drop-in GCC/Clang command line compatibility with `zig cc` +* Windows resource compiler diff --git a/content/fr-FR/news/announcing-community-mirrors.smd b/content/fr-FR/news/announcing-community-mirrors.smd new file mode 100644 index 000000000..6d4ccb8f5 --- /dev/null +++ b/content/fr-FR/news/announcing-community-mirrors.smd @@ -0,0 +1,50 @@ +--- +.title = "Community Mirrors: A Better Way To Download Zig", +.date = "2025-06-30", +.author = "", +.layout = "news-page.shtml", +.custom = { + "mobile_menu_title": "Community Mirrors", +} +--- + +With Zig being in active development, it's pretty common to need to download new Zig compiler releases, particularly if you track the "master" pre-releases +instead of tagged releases. There are also some situations where you might want to re-fetch the *same* Zig version, such as stateless CI runs. This brings us to +what might seem like a trivial problem: *how do you actually download Zig*? + +The obvious way to do this has always been to download the tarball from ziglang.org. However, this website is hosted on an [intentionally simple +configuration][self-hosted-website], with the intention of optimizing overall efficiency rather than expending huge amounts of resources on web hosting. So, to +avoid excessive load, we've previously publicly recommended that people use mirrors to download Zig where possible, and we [cryptographically sign our +tarballs][minisign] to make this approach more viable. The official Zig website doesn't provide any uptime or bandwidth guarantees, so download mirrors actually +*directly benefit users* by potentially improving availability and speed. + +There's just one problem: so far, there haven't really been any mirrors available to use. This began to change last year, when the [setup-zig][setup-zig] +project became the first widely-used project to actually utilize download mirrors for Zig tarballs. However, they weren't easily accessible to other projects, +who didn't want to take on the burden of maintaining their own mirror lists. + +**To solve this, we're introducing Community Mirrors.** + +The idea is simple. Instead of downloading tarballs from ziglang.org, automations should instead fetch from it a small text file, maintained by the Zig core +team, which contains URLs of community-run mirrors. This takes the burden off of others to maintain their own lists of mirrors, so makes it simpler for tools to +*efficiently* download Zig. We also have some [nifty automated testing][check-mirrors] to make sure that all of the mirrors are behaving, so there's no risk of +problems with a mirror going unnoticed. + +The Download page now contains a link to the new [Community Mirrors][mirrors] page, which explains how to use the mirrors in your code -- please check it out if +you've written code which downloads Zig. The process boils down to fetching the mirror list (which is just plaintext ASCII with one URL per line), shuffling it, +and attempting each mirror in turn before falling back to ziglang.org. **You must verify the cryptographic signature of tarballs downloaded from mirrors** -- +because they are hosted by third parties, a mirror could theoretically serve you malicious or corrupted files. + +If you have the resources and time, a great way to contribute to the Zig ecosystem is now to [host your own mirror][host-mirror]. You don't need any specific +experience or permission: just check out that link. Hosting a download mirror helps to keep Zig accessible as it grows in popularity, and shouldn't need too +much ongoing maintenance. + +That's all for today. Thanks folks! + +Matthew + +[self-hosted-website]: /news/migrate-to-self-hosting/ +[minisign]: https://jedisct1.github.io/minisign/ +[setup-zig]: https://github.com/marketplace/actions/setup-zig-compiler +[check-mirrors]: https://github.com/ziglang/www.ziglang.org/actions/runs/15976134096#summary-45058979620 +[mirrors]: /download/community-mirrors/ +[host-mirror]: https://github.com/ziglang/www.ziglang.org/blob/main/MIRRORS.md diff --git a/content/fr-FR/news/index.smd b/content/fr-FR/news/index.smd new file mode 100644 index 000000000..27b379c6c --- /dev/null +++ b/content/fr-FR/news/index.smd @@ -0,0 +1,16 @@ +--- +.title = "Actualité", +.author = "", +.date = @date("2024-08-07:00:00:00"), +.layout = "news-list.shtml", +.alternatives = [{ + .name = "rss", + .layout = "news-list.xml", + .output = "/news/index.xml", +}], +.custom = { + "mobile_menu_title": "News", +}, +--- + +Cette page est malheureusement en anglais pour le moment. Elle est disponible en [flux RSS](https://ziglang.org/news/index.xml). diff --git a/content/fr-FR/news/migrate-to-self-hosting/aws-breakdown.png b/content/fr-FR/news/migrate-to-self-hosting/aws-breakdown.png new file mode 100644 index 0000000000000000000000000000000000000000..52d094c2618c3cc72b29e074f0a120a0016b61db GIT binary patch literal 24662 zcmdSB1yohryElx2lpsoogrGE1(jX-vozmUCk&-TH=@L*sG z^qk{4`oH7e_rBjZzBLAmx#oP<)6bm0x%S>GKvr4=9TguH4h{}oOjPJ492`P89Nf)h z5lM66OrxS^}z@Zczbm`fCyb5&GmoK>gizpK>#0r zJ^m*F8t4xOKL~y>c!u6Y zb@S?ep!rYILjN6kBPoWsEtwaO_E<+5yNzTi$A|KqVc?axYv*YclfbLj zy#Usf-=k`he`ddRmWfabFb0gWAp_Sq?PVCxJT6*_SvVkWwcm7g9yDfXFa1MOZs7iT z%Wc2<_W{hk+U1THtvy(o(!^XR`g?Y?Q-UJy96K8gTYRWEm=UyQ0SO$r4|oD=-A;B5 zS6k_7PSHQ5vlLr3j_u(>0@Um_IUmKnrJwGmO}cWr#af3 zUDR)*a)0w{u8gXa{%itscT!!seBUMX1Gj$f1yb~EyY~$729FMh(XB!Im3GE#C^wDs zY7ma{c|=h0T)q9;e#PdAx0fR7sW(+YjlG-dYqT0TiCUGW)=yo^BB6-`rSe*3=ltqr zTY;%}CYpq0PL-=(g_)UC2g>7%d>yyn3>g|49`$eH;A9qsG7z%c_3sYLdGL4I3P0k9 z9e?Ta%kT8ZmR^Zd4(HQ3-sCwm#%5R`A9v`<`dtYvY&vB?n zy-d5>WToGDn{UD%{fU2|pF@GGBK1;$@@%Ja-c0C0^Ul>_AljxzcsMbQP->t;Db13AVp(Dz!BExPB>`Qxoc{}-Z562_mv%cE9Yws zU+x~S>_icI+kYeD-T3OAxO$VIt#~VvugqX%A-CQuO)LfjS`)JHNqXR|D!#{HdO+msBiM~BXT1G(=Ur1o9H0)&acMF-XH@R-5Tf;M z$~K&P(lNQTFPiB!zI;3W_GuuInHRjX21pac;pEivX9#|Xabb0ijWJbg%bpmHnB${n zV>-;kgPOjw&p55sJ(rsTyUB-S+XVCyd!Qazic6ngwe~2S|R+1m^+v< zV5ZNJKkGA+uIcCTFEa{6!tC&7f@4YunUzcTMttY)2!{DTkPWWNcerHd1%E0QrtX_8 zwRyP__AGh7cW#}T=vY5lIFf}CofeG9X@qX4E1|wj% z+UdVHShn)Q3N&_L=rcLd%?&!8$22bxk7krpiw=f>X1e8=l9E(ghYkeo-(RP3v5=6tq;ug>Bi=lBdU=sW;EsAf>| zGPK)B$?+0(+sG+pB?T>xA(Aw(xf*K_if#BHELh2his`AG`dxWNeaaqDqA4F1qtzxg zjR9=4RK&fwIYRYm-f#0-z8Yei#}&?V7nCL5 zszWS&y$o{K;W`@Z!}DS3f6_x8pccl2z=palC+Jw+IyYe=_HkymK85tPwBFq)!?-A`z3XS2= ztY}8kQ>v5`e;Yew5LAq_DP}W)7#qTbyb5Cn-`J28>J%Fcl3)i(mn&2XM+NPy($gMJ zxZb=U6>Iba5QA9i*qdNpOi~{Ev@kW$*0qNEF<4PiQQj^UFMcG&giP3zZVdkumu(l~ zK_$B3j+v1TmZ_qr#c*W^i(t{3_Z#fElr##wzK0 z9~Bn%?6rcQ>9d%RvTBXBK(?D>&H06=8o-t@fUzc+w??8-c}r=TgawVgP!m)A(CX4*rAu3X`({@v>nm~`C1|sGZQXRFd0;b> z^y%Y%bOC%pKh{sk$m^VpPlIVsa~Pk#zfXkjO~VOhRsAwXIBERt?XeuOq_VjAyWMU& zf+1w&2`bEiX0}f`M~I~ez)}lE2bGifv1I#%K5ei&g`TKP3gMOU&o8}rSAP%pKDTVD zQDyRloX)(o;p7(8rH|)rK4sa86qe9M0a-n%pflAso}FN%kms^q?s7Mc@#u|>)c9x< zUNoxQ>LOYb)Wz|CTg>Ysw1*)_rb}4{PaRjr0m32*$KT93R8pZ=dW3Cq=N1S%U{2ab zf-L5?gV&HwuqfAKa7)~)yq*n&cCzzi@LhO{fjIehX9BCe%P+dsS-1~}D);F+=_HIny?J)Z6 zex6>pg>tOKvMJmvtO&robj7hW&hx#o>YGX)1*ms`A*GVw4Gks}Uv551}UIu{ZE zJYEr-gb4|~z`SlAie5Lb;3&{kAiH-DXkLv2%|A(BMhIO2*i;_OdpKg(&2iFuSIsL> z3N+;+gsz%b<3RIor0I6IN(*}y(??-^ZB7xU7HP;`;*gt#*Tg>;!$;sLK zc_@P&^Gc1+q9j)u_Y+Zzlfd-1zSMmwkL0L@wQROpA@i13VX2Tk$JA*2_NwFCD?Ao& zietD2y1N>PN62glQt!jR=~}N|K$TWDs$)j`-k;0P*kbsv*1Db9C)XZizfyFQNI{Gj zNRjoXBZE#y4HUnK=RUa&y9fzh5&lrPlr5h>8~j0gvciS^qwzrThu7OCsSBdS?#V#>75V!}Z}$Llpa;A{eq9<)lu$Cn&Gu-;$dQY|#-(=2h`=)rBnj*|lVLWt38FvhP|~gvNO@b) zz-FY8>VIIjvK>+PrD3Gl$$WM7^Ha^L7^RDvXQ8BN$j_cwF)~4_m$PI)J7WjPI+t+m zVaxYyWN&cUUx;y}e<}!@hcJuem6M8uoqRBOu#R6an5wAWcDB^1zP%lhb|_K%o;j?C z!o`EO#$v)@Z8=l68Zkhj_9ZJT1RM2*Gd>7<5ZK&Ms#>S3e}PE63(Hk6lX=haN%G{0 zeGWD20k;S=S8C!8Q*YbOL+@#9o+j(NrgrP>ktq<`qX!17$~2PJrpoV$c$^KyA%W56 zk|(ZeyK|pNMM7GJDUjwT91i!~N4{uUCeNPV>M)T&^WtgQ zMALq|tuf=nSX*3j2C;;v6%u7h9Fz9YNsA5bl$Um^8tIN7hR?+cU)FgqFc%`n?eM>?!49joK0q>2yr&(xg1Wiu>-;TcPwNsHUGjO8cZIlPo8NXe z5KAYHFvzC7Eoo5tXoaFgSlBLS%4v5RTx;(ua8KPkS2(xw?PEPq5|4`!WZ;D?#W{%0 za=I`YLPRfQ9BJLy+T@Q>R2LtX^0ga{xIq+?-cb2{289%EBBI3Z$=>qP&WuN$cJ5N$ zf`WKw?Ng(-)KvInBXMP7tHw#FzS$xXx5-QO4dk#YUhiczxq?@|c*M|ZdWJj}Ac5^a zs+*!xNly=Ec9?GboWD-M{_1kRM^Z1h#&M_7*{pZ+md(s8Y3q9=0Ba`j7`xw@)8(?> zRX2x4=Zv)HI%!?p#0gX(02RKFXfLkS@)d}-reP*WjtL7qUj6`POgGZmbC30d--;dcvzLcaMScCa>_xgbzCic zBM*8qOFxfoljbqVHX<=7P>=6lsL<&blsfI^$WT^%kbV#MNOYP*i z8lOU}7*QyZTxufJ&2`pGAClZh!gx44LJ92X$R1>A`qQ5Sg&W~PGGG5{jzd%c)-Z76 zlr`CQ{sy@iVho!|ulLiX>l&_*Wx{Iuh8MWKnZYQmq&_st8bJSQ1T^62d2?z521DWdoKc*cAtlj|5La$IelN*7ENkZL;H#o^gb4 zcdB~5JMRt=VJ5!s99=HZQZU0!%MRO9piR(%pFe$plBLJlD$jgjTgR zFh&xGz0Y-FJ??|(5PQh7mpMWdlT(K>^rf}=xl5=SNi-sKcy=2ckRNsmI=%M08Lh2+OOgJA=n<7hv?Gg0K)qXjT=Y@QPQn`w0r1>n1Z56^|hn%~d*GQ!xA*S>G z8l^Yb&9EGSG~kIa`6NtxG4<)a5-J~1@eu)Q606G{r$?Vf5Y)xXf~yM( z<|&0ZWPAmN(~x~JyTmcI$+N#s+bmIAtqvG&aghuL#?mqnxwqB4H_0_OF^UjXih8MG z4;>@eB;tF8?zsT0ZueB9GRWk*duV(8hK9d;UwR}Bnc$Ys=5$qNzGjMS^P~<|c+arM zH`&>|XvC7%eY_&{*t`5Bp>OdU>00admKeOI1@rW(aBV_mx7^o9=)^R3Aas|X#cuc4 zyi#p0@NYzzO*gT*5#qf>!Cq~_t9{1>G;dSA)O+WLi_V|2vF6j8r&?C zd5%tz8izbWY4KPBfD5RiK0NyOC2S z3OowLu7-SC$Mm44(cY<1?#5kNo_>20EOQgVY$V%%HqbYQJr9|J zcmXMxLOzu?-Q5SZ#XL%M+F#Fud`{AyqIo#sJ{3yVnfM(UG6j9K0{tU|9zN%iQt#v{_&^jNMl`J(`ed{5e!xzNO_Ma=WH!=j;= zQT3)K(vzi@sU>+WAx2W3%n8}Wxf&&{edc0X)e5Kb(Cc|t6OBztyEyRq6KqsgNaIk* zo4ZF`PoDY7pQnh@uSNU5mPf%7ShXfa4F3$zhd%sdWkWVQo!Q4GqM8OmYnU*Y&vur^ zb)^9*pFo!W@@CNKI5JKW4jM?)yZ;{#KCJ<5!^Lh$R6+&#G&;7o_*6*6mxX3E z8dU4yem=TH;l^YkF&XpE5@&|A4^~cnrpnn5CJe{ZSx73o#x$?BMg{XIZKtouE6< zUauMTAQr3%qg)^bk%>$3SlYiK94PqQ55Ub&fi#AlI(*Dw@~J+FIAK}hg*U=Bak|v##<6^aWcQ?#V#^V)AP7W^tXV?5lUHQZyr`H* zVxreE9hgr0Ss-K{@Tg2e7;Mo#W6$knQhh~9-cg!+Na7<$biT_U$Q9WNh|0jkfOAm~ zQM2peF}kC6miC}yhknW#U)t32B^`R;+V(>VFxKsDK5FsQ7tP&0 zQmc0Q7`>(Zo>XJJfMB&sTb69rvkZ#H`)k;pW-?N7z3oO$&s@TR{l(inp*hN=54JhN9;db9H#@lW zYS4z!unZF8x&*G7w`+IUhs&mx#7rsBTHahb-s!nR5zrohMVb4_1s;Df>|7Z|*;@+O z&;WuHJ8re0!sSLWo@2A4+K1Wb+)TlLT6cPo8NP&=uo$wm8{h(pja>KGv50T~N z*3;?z33)0#x(MXY*4VTIpVN+s4>!-o0(aryt&Dat7GhZ>WE=eOTkcD+2r>7oq*2{} zPU>}#`u6Qhgj;ANp?6bFSl$ZDNj`7z;|~rr(er~Fh$j&;O(~OA*zIhcM;ZO_dD5jq zBMDd=#xCspI9*7-aaK5A{?<0hZmj4>lhZt^9)=4M#fxpTmyVKTG*fSdy^kTA;TKV*e z!F$zOIkl!pw!KeJ92mz750t*GmVL-Esc6)^%w@(9UrOuZ)LUDu7LzWuQ7(gi;B;lT zoYo+3Ly-}hbhKtguU7Fq()u%9@JEa{D*MAM5h z`8;1-3lqG|SqDVvFnh;O2%jV15K8-c;@RsSyo#XCz38o9ji^UN2EC~-)nsB>&#O9n z#k_rC-lY(tJ`LfePlVF(T2iwECJi0CKsq>@ zf`u3Lae549^k}a>oOa#IKe<^~ThtdjSvOZ{KL(rS_n=bR^7xjL7RvdU9EsT3Abx#< zPQ8@YSHG<`I#OPmOXA@TxHrgT;EhyIi-85|Gw8%q;yRC}re0GU{=wVogdUAzz&7z* z+;SH(FXMVrAH!WLQiJF+G~uwAt*H9&d_msHg4emP=CJD0@34(<)N!(WhZ?pJB@@bV zdJKwt%1;Vd&t;A9Y->(wnbkacIcv}e6{Pq8GJYp{%(1?Fy^MEstloZUYCG?hXWnHJ;4S&-L) zRd>dQa*n35QGiq|9mj&Ofgl|EO9|)%Y*0wO(n4`E+5=@{_=&Y)^V+HjtrIAxc$Ah9`KOC;36(?h-*mj{Rl5af;oH@JxT26NHpqll~+LpC!#T@hz8@9FExH@ReYUyNAE0d51x``8h>KUF5)4WK8ZqR_S*MmKY zfsM1INm#(V@tN6k!#5%=r>Z0u6^IF|`Ji7++Qvwc%<1!(&Oy*%if!2a+$X2|1mI8h zuLHVuO4o?`N}F227yAqHdtwa)P)-KoA7D_~>Z9y=Q4&C+ELbx2_Dhv;+@v#ze9 z@x4$Pcy&GX6E0fq+G_pGJZhQz_TAl7jD?bacxakK38Cf3Ry;;@Bn2{%W`O z%eb&~i>ml1Wi3E$*DEn=k_tl?H_w6LL)WBA{orBdeh{gK~-TS9yc6DhcS}soe+L1Gduf9G#$vz>c<2(M=G&gE5 zS0qtntaaHO&NuBc1HVf5!Ss~bSgcXqbfk?gxulvr+RzBbGHG~_;_2N<`GNcV^L)mu zjpPs2NsBU>2g%2wfCJxD;zF|Zxz%wHO9>(GvY79`dN{M+nPXYaY`PYnLYjns2+bZg zH&fSHKW>E1geE3mhC9`MD-auIOtKI`ERBmj%U!%pnT?Yp_A0-YjlzkcDEOVTkUem{-T&40NfoI02!lpA=u#ahI8rXsE%4fGKcn?;gvmLG*#>ZLg zYSX^TY{YKqBz32xWf6zjxJF&#=0xf+!7{yioz+3>W*To@go@Kq`;!D7o6+kv0jwxu zK5?_ z4f;7KhYK7nBOJLIakUyDgSZ@Ya>Q8gLd3iNxW1{rv4*LtHbTD32c4RciMAuG-wC?( z%d1>Tb%DXdg52M8rektEx*Pc6z8YB*G37vlPlTF@kZQqfppa*A8d<~pifSr7gcuS- z0rHP{hyBcbf1YvMF> zxgl<-y3IZS0S>NVX@Xt@Ot*jxETrMjy`;c5;NXBW%GJ6Gs?F8Gx>{5{5#q0K1wf0+ z)&Q)@u*v~D#n?8F`=AO!&=C&X46I(z3-H6Gt+Vr4+8BwCWjDS(P$dv|LM{ z1(A(+-5|b%?a(L(Gqyg^4`!rTkHTsg8M`>?^xEay(&Cwjo16mYQ{RcK(#m&sa#_+p zi&sNcQf}pU5gFa3l*q`)7+jZg#^5VhYYWo%>bYXk`hXNt2#w9blGCeNBVY@Afw ztK3)nkTCFIprnu3?Bvm2!JxJ)p6-3((1Zza7DW*+BPZUvwfv`?&v0;W)JclA2KA@7 zj#ye*i_cSyr=7Oa_KVD%aysWKO1h1Elema=?RN$shm}0)r8RM?u=%AP6~1Y=0nTfe z#Mr$~f>axdoF13W6xFP ze-$-DRmFqSR(O9V56LYCOeDLiqh2?^jrxWdh&I`sP$C#;lNnUw24BG5vAC1`{g$!I z3%E&1tC}Pt!VIsIxp5-wzpNj+g)uXaCev%VIK;N^ z<&1)YC#Vy3uBB>2mu7}sIi`zCL58W|*P4?UoSY}-r};p(&GUf57IAQ*c_y6GdG=)V z(qQ{8kktKZe;~`Q6X`0kuM_FbH8j3Tyz8#3T>Pu+=Un`6q~|q@UkLiE>t{iK%Klv) z{3ZM6I{2$JeppoBs5USeetTYs6euJW*OwAOwz>%>SK@#I_5`eb4wUf~lYd+yUw0w{ zm3&o-4HS?ok^lMfX?}BPfyM($e4t3*0CU2XGIv2<=zy?)TmokO*Bbmwp$5Odsry}( zAKL$^+27QC8b;oOUh!0#<&VKXNUtTUMyjbL06y{lL(8j)>kkVbK@bT3MSZQvwK;b| zSB3zt{p*fzWsG$pp2YXuh3d7TQ|mIrc7#aVu+MeE68+mI8h0Lv+Th`%$r}|iw-8X> zdEHJ}@Blp%&DIhAUZd=XcW43eky*ERx2^j5wRzTqOG*yDm77&h?|CLwByBr;oYzz& zpaI`&l+jOW6-q#+6llKs65~%-J1k44lEBzKZz-Y6Vb|BQL(a#G@EfMxgYVyB%?iDJ z03ykm#{8;&(;0t{gpqX}=w1CmGQ>5DxG;E)Y zMQ)2vaM9;~`9h|Z{5~%4OQ1!l5UJ{|l7nTfwt3!qJun_9sg*kW0^tAZ&akMmHkx@$YT9{LfmR?KUS$m+o!zk)5gZR zP!ruR8HYQ^%@?!&6~2Z@`fb>XXl&j+gYPpL?@=}eY(JXiZ`6@+1HS6^p`^&s)aisF zzb$kmdMjW0vY;S~oH?KBJY!GXVf=8?(e?3;Gwj<}KRP@a;}W$=RfiFPOMzlC@6oF5 zU#zUnq=&Y0xgD24w*1ykO70!2etQ9y*1)IDmbP8&9d-6+y+^w5FL>EKvQx6Yq&_)0 zJuY9ukg=_uFtqn$C&U?~6NGKSXi0Xk@?)Y@B>hlNcWtkbtlQl<=T=6#A z15US{orT?xD@qo$tN6Gv{l=gSec2ev+*T{1y9ex+Gk&8@v8$Jxb$m>0OR?Ip9qsjn z-qYu>J>b7-H_~{t6*&;?#(?9x8ZDxLMZortc3g#Ny9#P$QG?c)d_IXaOJMF!P^Tpu0csVAZpCz- z`~whTJlA?J31E@vc0D|%=v7Ap#pahskN;$Z_ivi3vfBLO;T!>2@k1%^9vxfbDOJFj zKh67v>ffpOudH(fEXJxCpt*JiS@<_kB(m_Q5TSgZD`))0_!kuWfxjd9!)N>A`PZ)c z)3JjzHJE@m`TtZc|DP=SX)EDDHo&dM$=O{4Uv*##fsEo9XP8QGa>l7Zf#f zza;q){(qT*b#2LCIRlvX4-WgCS&P5qdF@mFUut^oK9^d%$%;$@9#eS zr{G_>{hH*;L%;OkRj`4e{2BcJp4i#n+5(K+{U0*@UYh^X*~^#5_Ni5&0#Qq${_0!q6PDekvb_#aFAk4fjB zrTb&n;TQOg+QwU^A_?@V0$`>b&$TQTfH z$(+9;VD4fAZut(8d|NYOws9LRpXI;KwCD?I!^O-$!nk7riQIX8_(5wmnyU*~n;v;K z6GNvqWE5`!u+^i`NL5h$p4|40m;6O)l^OaboU{r<0X618|FMF`oSk2o&|1oi!H6;PE+*fj zmCg;g;W8a`%$U}>vHOiRFDPidrQx%p;^bxJdDx~t!F3>>pJ42CwNU+7x@;0EDk?Nx z_^Mu?sBz0+l)ksxsV!N^KbT$*(>-*Ac0^>adHaV^wBg>zop;o??V51EEZW&oJXRsC zQA>m!b8r9U@rbClxCbEX(eMX4V+4WeNa|u^m-{%SrK7-B79GS|Vz){IijwbAhE%$o zqOsN3B>m*%E<>&AWA-JbYD&7i%ofsD=MOxBDXrTgvgcV>kHCq!UCkFS<~l-J)qyKJ z`-A2hu_RuX&CU{;r8#pd2h>3QEUW%~9WRZRIwg;Y2<_cGCM>mc^7SRJ zBFNK{32h6xEJ|)FO{rf7uSW0D0@wurBiF7#j9-b?+WEUa4H?SLEm!d7u_!WzmrnzQ z^C#uMdksK6S|}J^f6Lp|e{!I3UR3D1V)2(0tyP?>902b64O4&#z}4r6SN_!EFBU7& z@^s&Me1}m#Y4%H1uT}HDHii2Nul=RQcNVG2jlWa$Pl`X>@s}chG5L)x|7Q-`uJ`_> zs@K*&5=F+m()a-=^?R89(rYF9TIK)f!vA+;{U1zeyo$;-j{dbN|1s9r*!!mS#f5#M-N941<0UBqQ_yv{}IBg{k)g>3B+A(rhe+U+Hw62)&1{p zNB)nn!~fir>)qt90cz%d;(Fze-)wS#6&wNOH*mY31{nCy`?ZAMZykQa6j(m~OAMd= zA9gv{`{aMa+8ZZ)D9TWyKjCd56n6yo=*Rhamuays$*!FoI?V^@} zW(KVmGe3R$1l>uQjp)NrtWB;X_t-ncqU^h1XHElf689g_jTtTpZvaWWvouXx8=Ogx}bBV~^UAN@B*cILV#JtRWYoc>b%#}5-rKh{P zo2YJZ7;9#CW#=lG|5$`^B#o72G!zN&+_3wCB#t!OhbXnpz5|>ghmz$k3_|fx87Y~z zosmQ7f8QS6IcVI+em`34yx{R!TeTGV6~M`P#%6CafObk+%uC0(TfR$?Ev}MZxlhi+1@mjCaY7M@3U%=gLcc-NLh0u^J`ia zS?s6`)+)SpL|aJ$c^W@Pz3?T^Z?ex?I6p4UPQKq8?0u&Hq}$W^IdNa2_JWz#=(n9y zcbC5PN*i!T9`vWDBZMG(!#_ZhfB-i#3Q|0@Gw-LpT?0iGCWgSDFxCn@7OnXc>hhMd zUzGa^Gu>gUD*W--<}QXnBf#R%>+8oj*GvMC9zXt$jsLq$0Va=Ub)q!Keju~!MUVq> ztvkOcGRl>Lci4WRDf!=5fM1IJ?v3xyw`O&UXsUi}ZFe4#5rPW;y1wQGcuX8{+@B9V z8jO_fuR-V!baSPL$WQR^yP`k#Jw85w3x6#Z@K7@VnK&Q@zhL@vn0_VpAA#!m9(w`N zx4-tEf$|*xUnt}6Vf-Gpjy&$4=jxxW{k4BI$D$qYVge}y`0H1>@LwN#OH+2lBt?ARv#CQ64}3t%I(T;Lk0|FU9_@s)5ZA(JvD$N)sr+S)`Ev zAKCJMXNLMOCzI<(*uR_@cR&AxF_7Z_H6#7IZhuULK(v1!7hvxArV0Rq0h8%} z5c`|L1}4U4@9?|-L#E$n*MHekDq_aOS(E>`wt!YmNp*0f-;OI9m>zc%{{FO~LFxSd z{ei`Pm2;DcDadoaRM zx`>0*KHa^ahF8Y8Aq&Ga`C3i~o$7+q_`4%k;Eo(+t(x7n=rX@*)@s&;Twqxw6N@B6 zioZH{G*AF%F&psJInrC|>b&sZCrBqbaM9CiS_)j)*RI6@_=G8d`lcgy*T%*wTC@o- zHf$W-BUhM zzu>Ui$@P}{6p;v|(=oqsQN{TvWz^sq{v1J9s$n#%#Y4?9`K-kY>`Lbi=i}IEb69)W zsu-@j{j8i7^tj`!w)W`j?DoM)9ZYp+t9ocH)>(YPrXs&~6TQ!Kd(_fn@nCw;nCP5m zf~%^@BO9q<1?6BPt9Bb*`(kT8dM9{zXcC|39t{U1=EF(g4DK>LnvX|*(Z%wGMv@H@ zeteSyFXLsKzAN#G3kuSNtsB_)#jQEtd>@B}%~SXsP6+-yo%W%t!|HDIY(zn}iso#? z)Lu^(IOKAV&)3c_`S`pgvOT(4==d~~a;v~0uTN3YnDCO}*j!9a7We*s-2 zEdJcTs%p(`&;U@khM4%dsE|wIFasM43t1h{>0+#q8jgfA)N#vukwyv2v4-WWq;*fE z&Y=6D+Ox<#0y8#!%J)+4X8|b>*qe#4L0KqlY8G3y7dr-vm1P`Gp>VbD8+=sAY&IWWSM*|VOCHtFDSydEi`8A+ z!=+zha%VU9%HzFPC=-9M#-my3&ygg}x)<%VBl0?WStQ0#6L#3zqdI>K`~X-qT++id zbedi2bf37nT@)+oYanHZ+vP?CZdl)2vWQLGfZW>^|4Hse9FRo^_Pv- z>d+9}bm@+i)~7i(ZmbUV6-$N5gDDV*n2(8I5_Km* zrRk^_?uR6W9Z;Io=Gc}s^xc8YwMRJJ?ljdnUs;Wxw1Z_jazsu#CrIlD1S-QW+ei0=Aee_8s9= zIWy(x`*?9I@4bgysxeh%BpU?r69M_K%Rhz*A)DT3ys%7d}8 zua4Cy62p>hnrf0CJm&?CZiad5zv@Sq&)=Qg_SmUB9PC?pF-%}KC(}hC>9#%FR^)Ej z`0hh{%Y5dmWxoA9MUP#4lygtW9r@XLPu2-yUHTMH*YTM5nhqYvj9+es9?M_ee@Nlvrg+dg0UPoSHVtla z<~}8>h`Ecm;wGcFvV$oc*EjIFt%L4F2Vf7xR6no5I5#$JzcH)Y z0bMx7>d?~ert&0edSX<~O__wJ%Estph+2AE9{fUvpQZIgcH}cqv5VGts#DcCmtN54 zZ`+-6btLdQmsSI;oo?w-*Xc~0%)aVH@H0Ta8KWeb~yecq=zIn zx71H%%|zQU9wYdEWx22TzzOP^v2ad_WPTf!?RxUcEg*Oo`k+Z~v%6!%O&XPrZMAX3 z*Xur^L4?;vH0SMhWAIDvsLy;$k~Y8x;4Uxc3p|*rDUQmXBW{;b)$4y={D>W8=~Teu zV6QZeK%&#knM;U4av-Y{P7b+yf*^UThQZX5%|x$4pHSCR&(C1W>9c!4ioNX_3W25$ zSp$&@)(az^95T&u8L;o@mstu-aa6W7qmEsj2a?69Yh(9m=^2e#=Tlp7y#4RU9G;T( zxVT-)-Q25ZYLiZg(dc+1Zs24AMlD3ErcvUTEi;|?1jmmd6OW5*lXPB)lcPold5!lW z$lT?5Own$t(VmjpY&|7X5H5($ey`{N7dya;AB+$x+@u2^T4}%l)XMAD+lzcb~^#oolOgQ(U1f z4AO9OOS(02bt{Y67z=sx@^b;V+i;xSK6`2T+tGRF0N9GnPQ67`=JJclcExcNL|L_` zwo5VQ&<_L%1PzSyq#vG+$KG$?-gVKoCr@$qJZNw^+zi@~AQOqXP0CqPG8QHPiSlp?AdIn?EdOz%aK*9mZO|Q^lj*$gZLr{^~P8DbBFj~0=;013; zx;F?fk%CSVxf`Q7hGMl7!?0>a}c7r+HX z1xF&YF}+0d>aMt`=n^bfY^^=_valG8kx~^Yk9F>-3z1psjwFyEVL)iO zpK9i1S4xm_k6J0fYhxQ%q}@!OU~n$c_TW?_4Z%giKy!wh(oD>NA~%4wGeK0Y$bb>? zS$DTSJlbu8LDlCkt91qqHCUb|O2<+PNxKV=l#301IL)AI-z*?}hOnZrf7ez1Bfn1~ zr|sw$m9ypCnv>k2`med$jNO4ZEh12v zWXi^1I+*2-*-)5k`cVPzN^GF8K)dziUANqRBc^S#-`lqas1}?PxyIU^_|}Bb#=c7u zUaVW+U(@LI{Vj~x-(S<1`u#nQa)7++;|D>*_jf{~et!|<4}vR!*T;8)9}MpOknn@x ze^mmfh|=)Tf%DGuQRBl!&hj^1u1aEubQ+pY>iO)J^c}WVH)21Xw=Qi$4)>HPHM!hg zCwbp4hhmy$p?BT6v#!Ammbbg=k<6iQpUw8zB07#wbaRhb{&tgoPxZ>tLg^M%pGSac zLY18Q>c7NE2#$ieT#+UTouX{+i=GTc-1LuXL2*6C)?KX0~*_O{GR@hF0pxw1Cdr;I7o9QmgsRSxU zN_O@sjrIoEVuEYgFJ9H$1=`%a zY1vvwlzxjU)Y3Sq_@gbpyP=hp%p*grEG)%ym&m>QwV!wI5?Xi)#8l^D&@cEuLS-%Pn4*R5+Aqfc+Dgwe7 zJo3##4om?w5~e2~3%lNeFcr{*Xz5TRG^LQ^L7pbTEqVw6^`a2r;1`gaXvE|2%Gx}Y znN^wUt4XNKLucEk2X0eaQ!X<@JQrtETpHa;JTM}T&(Oe}HN>dyXc@k#h#auoJP!QH1cRsIDdh z?gXlk{vG(9yY4yra*xvoc@m6=r;%{CreC~H73q8F`iRi@tFY)}DD&(2w2?gZzRN86 zOd=YBm&`Gs?jmd{&RF-Hp`tVk{^m6B<`4paCg_V}%FvcOF)0I2{}y zV`Ktv$>By*^l!`4hh-ocVpupnZ=49Ctmh@vQ<$>~(xRUiq`eR7J z{5v7-oSKL3w@gM-dn6cOkNGHJ^o@R+ciDN}PG6Jgi!Y?MSk4Tmb2^NEoSk|rU*2on zl?-dy2uWpvV2d>JmI(34CY{YGhkZRdj_Fz-N@Q^|qY^~A!&tU$%4}5IS@rJm8YDxL z^8cyi%A?u9y0|Jm394vni#=+oor-0I(pZ8~N)^#1sj+=2ReRAENhBh6#?sajtt~WS ztuiWzGFoI>QoGWzmeJN)Wn$WX=Q}-T{`l^HzxU34@1Fbaedpfu&if^QL;_1GnXfmz zlEQbfJ)T_M;PLS!Q2_=s{>>A+V=|TVswy{Zy*N}=L`7?@?fSTisi6pOpnk&2=G57? z>8q(5%6OBm+y2K11QiZT80{C~hM@kRpT+%E$yvhf_@?h*#d!DrE*52Qm_90*iFIZH z!Pz+RDWFtz@Jcj3KNm+<>Fh*kVJ7J7&)VaYY@KlC@debft=;&xJ8o_5mwc^2$TL`n z2PQpsXzL{Wo9UC&?Y9~yl7~6jU3`_%fZ0xz-JebDE|AKuP;tJT!+f~6oV^nH&5@q{=6w$ zXrg-OG)%<8Q0*2;4r$Y58B}T?v(}fZ$9o*A7&~DJQ`CKliV9r!km2F}C2Di!Y;4(S zx`ZA8Y(T1*mXBC{^a8oEI-#~x!{y{R-Z0~?x)a@>qS<=y)WZVIPs2x>!H}kOwtuZx;l-9TkH}Ah~gaGs>wNqV&;jZ@QvGl4Yz$6 zr%dv>od_)YW9{*y9-H#<`loTwJmdE#`F0~0=$(zZ)jZ(sG8`#;pvf(~9eb1nkT36J zFvsN`29bx4m@=cQ1Q;71K1qz(fOHeJjOkaW(IDac`!JsXLVNLJPcEDhPSU1ic1WS0 z6RDahk?F)ws%f8^Il);>>oT{cAa40;XB-Kv4hP2u?Zdx$#FPOI8;iiNzkYPelEEB< zG6@1}ly-yC7UQLLj#m`4m*qSbu;gfM{3-^1`#kRY?7R<=1=j+?v4-bZj{2r>&1@Pk zAgN`KiP6Nfomj}v8}H}xh^ZhqwoMJ?7TDl=Yyx)X2^3vHLrKG5m(9^?WJR`FgY*kg z80h*IBtPzp#6AA7Skx4xS6o5Dl}vD9fF5iF-?!fOeFb|z810}@)S zD^4#uoXJ+bDE=rs@oNsgQ^%kj9qi@W0O0Z~gW3i%C`fv$JR>_#Bv+ro+%5A^!yKwm zpi?@xm%^x5+KNH-pXuLGY3Rrkxw zOK{Hsa9*K^pTuWkT*;xmV850>?}sePhM5WzFDoe7~%qPUKkiRkxX+(EbA5VKZW?)J}2-M z7~GNnD1g}V(gn-r8{RoD`)7Z`fK@-tjM(I=eWCeyZj=iMbzT=}^kA|#HH;N zwXrS{8`Pw}N8nOR6Z~#yEzh_-*XRZ&vZzwZ{=H9jz0Ge!N`-2?3TDjN5k2WSULa?q z+25FRw39F2Exq*!0WN9;1sI8%V)ZTN>x#J2RHX2p?u&dR5>}&J`B;=c&!dEk&U4ZH zFFg2h+499c#jCT_^zGx#NE@x=Op2EU}!-UwSR!T?VzsGzq&-F zJhOk0#}C$S3LGxd8(}U`mxMayIvleiZN0pL>Nz~jz)IGMGi>pp+Vdv4vC&#Hfy|xB zh%WZc-Gn@^E?%Vtc`oAHDiNZ{fIsz6hBZV%Ks}({4s9wMQ%8i@_oAyTRyIeLmULiR zeuKhTvTNaM-|!FePK7t_>6=N6eS9b|32bnAsVk&@ z0*36T@lWhj4!@fHhYJTtXoAcl0m&qhBYjhV0^VQ zdd(^szTbaW(u!54f)0XMk;w-y0J_jFc2I-NzAeU#6y>ocyQr0htBsnK#40E1Gci~CRQOLM(agOyHH zsOv_u-<9J?N=_)Jgw7{C-|WCw?f<@r0Tt$io+$lr4qR&t=2dZ>;z!m6N4fe?xDM1u zT6WCb?~}PfwHJNfvCXo*L!o?*ea#{VNBWO|zPBge+LHel!%<&(><eO# z|F8JF0Y4h}15P73umxk*v-1B(kQ!sR9Z!CxxuJFT#v-@`+A8Lfv)}!s+i#fk6 Oxe%5P@M?>zaeo8b_hG33 literal 0 HcmV?d00001 diff --git a/content/fr-FR/news/migrate-to-self-hosting/aws-expenses.png b/content/fr-FR/news/migrate-to-self-hosting/aws-expenses.png new file mode 100644 index 0000000000000000000000000000000000000000..ef73f461ba1ee192fcdd7057a2acca188cb2b8ab GIT binary patch literal 39013 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 JR9Fx8KLCJ`otyvw literal 0 HcmV?d00001 diff --git a/content/fr-FR/news/migrate-to-self-hosting/deploy-before.png b/content/fr-FR/news/migrate-to-self-hosting/deploy-before.png new file mode 100644 index 0000000000000000000000000000000000000000..c81e747ea03af559cbe9e8b301e719d4d752d329 GIT binary patch literal 28647 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