🧠 Π§Ρ‚ΠΎ Π·Π½Π°Ρ‡ΠΈΡ‚ Β«Π»ΡƒΡ‡ΡˆΠΈΠΉΒ» компилятор C

Π’Ρ‹Π±ΠΎΡ€ компилятора зависит ΠΎΡ‚ Ρ†Π΅Π»Π΅ΠΉ: ΠΊΡ€ΠΎΡΡβ€‘ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ΅Π½Π½ΠΎΡΡ‚ΡŒ, ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ, ΡΠΎΠ²ΠΌΠ΅ΡΡ‚ΠΈΠΌΠΎΡΡ‚ΡŒ, сборка ΠΏΠΎΠ΄ Bare Metal ΠΈΠ»ΠΈ встроСнныС систСмы. НСт ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΡƒΠ½ΠΈΠ²Π΅Ρ€ΡΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ компилятора C β€” Π΅ΡΡ‚ΡŒ Π½Π°Π±ΠΎΡ€ ΠΎΠΏΡ‚ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹Ρ… Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΉ для Ρ€Π°Π·Π½Ρ‹Ρ… Π·Π°Π΄Π°Ρ‡.

βš™οΈ ΠŸΠΎΠΏΡƒΠ»ΡΡ€Π½Ρ‹Π΅ компиляторы

GCC (GNU Compiler Collection)

ΠšΠ»Π°ΡΡΠΈΡ‡Π΅ΡΠΊΠΈΠΉ, ΡΡ‚Π°Π±ΠΈΠ»ΡŒΠ½Ρ‹ΠΉ, с ΡˆΠΈΡ€ΠΎΠΊΠΎΠΉ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΎΠΉ стандартов C89–C23 ΠΈ мноТСством Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€ (x86, ARM, MIPS, RISC-V). ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ кросс-ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡ†ΠΈΡŽ, Π»ΠΈΠ½ΠΊΠΎΠ²ΠΊΡƒ, Π²ΡΡ‚Ρ€Π°ΠΈΠ²Π°Π΅ΠΌΡƒΡŽ сборку ΠΈ плагин‑систСму.

  • Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π² Linux Kernel, GNU libc, Buildroot
  • Часто являСтся Π΄Π΅Ρ„ΠΎΠ»Ρ‚Π½Ρ‹ΠΌ Π² Unix-срСдах

Clang

Π€Ρ€ΠΎΠ½Ρ‚Π΅Π½Π΄ LLVM: быстрый, ΠΌΠΎΠ΄ΡƒΠ»ΡŒΠ½Ρ‹ΠΉ, с Ρ‡Ρ‘Ρ‚ΠΊΠΈΠΌΠΈ диагностичСскими сообщСниями ΠΈ Π»ΡƒΡ‡ΡˆΠ΅ΠΉ ΠΈΠ½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΠ΅ΠΉ с IDE (особСнно ΠΏΠΎΠ΄ macOS). ΠžΡ‚Π»ΠΈΡ‡Π½ΠΎ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΈΡ‚ для статичСского Π°Π½Π°Π»ΠΈΠ·Π° ΠΈ ΠΊΠΎΠ΄Π°, Ρ‡ΡƒΠ²ΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ ΠΊ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ.

  • Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π² Xcode, Android NDK
  • ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ стандарты Π²ΠΏΠ»ΠΎΡ‚ΡŒ Π΄ΠΎ C23

TinyCC (TCC)

БвСрхбыстрый компилятор с ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΌ Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠΌ бинаря. ΠžΡ‚Π»ΠΈΡ‡Π΅Π½ для встроСнных срСд, ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ†ΠΈΠΈ Π½Π° Π»Π΅Ρ‚Ρƒ, JIT-сцСнариСв. НС ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΊΠΎΠ΄, Π½Π΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ всС Ρ„ΠΈΡ‡ΠΈ C99/C11, Π½ΠΎ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΈΡ‚ для ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ, тСстов, скриптов ΠΈ embedded.

SDCC

НишСвой, Π½ΠΎ Π½Π΅Π·Π°ΠΌΠ΅Π½ΠΈΠΌΡ‹ΠΉ Π² ΠΌΠΈΡ€Π΅ ΠΌΠΈΠΊΡ€ΠΎΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€ΠΎΠ² β€” ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ 8051, Z80, STM8 ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ старыС Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Ρ‹. ΠŸΠΎΠ΄Ρ…ΠΎΠ΄ΠΈΡ‚ для embedded‑разработки, Π³Π΄Π΅ Π²Π°ΠΆΠ΅Π½ Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΈ ΡΠΎΠ²ΠΌΠ΅ΡΡ‚ΠΈΠΌΠΎΡΡ‚ΡŒ с ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Π½Ρ‹ΠΌ RAM/ROM.

βœ… ΠŸΡ€Π΅ΠΈΠΌΡƒΡ‰Π΅ΡΡ‚Π²Π° GCC

  • ΠŸΡ€ΠΎΠ²Π΅Ρ€Π΅Π½Π½Π°Ρ Π±Π°Π·Π°
  • ΠœΠ½ΠΎΠΆΠ΅ΡΡ‚Π²ΠΎ Ρ„Π»Π°Π³ΠΎΠ² ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ (-O0 … -Ofast)
  • ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° OpenMP, LTO, Sanitizers

βœ… ΠŸΡ€Π΅ΠΈΠΌΡƒΡ‰Π΅ΡΡ‚Π²Π° Clang

  • Быстрая сборка
  • Π‘ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΉ Π΄ΠΈΠ·Π°ΠΉΠ½
  • ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° Static Analysis ΠΈ Clang-Tidy

βœ… ΠŸΡ€Π΅ΠΈΠΌΡƒΡ‰Π΅ΡΡ‚Π²Π° TCC

  • МгновСнная компиляция
  • ΠŸΠΎΠ΄Ρ…ΠΎΠ΄ΠΈΡ‚ для JIT ΠΈΠ»ΠΈ embed
  • ΠŸΡ€ΠΎΡΡ‚Π°Ρ интСграция Π² собствСнныС ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Ρ‹

❌ НСдостатки

  • GCC ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ слишком «тяТёлым» для мини‑проСктов
  • Clang Π½Π΅ всСгда доступСн Π½Π° embedded‑платформах
  • TCC Π½Π΅ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΈΡ‚ для ΠΏΡ€ΠΎΠ΄Π°ΠΊΡˆΠ΅Π½Π°
  • SDCC ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ Π² Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π°Ρ… ΠΈ стандартах языка

πŸ”— Π’Ρ‹Π²ΠΎΠ΄

Для систСмной Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΈ сборки ядра β€” GCC.
Для Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΏΠΎΠ΄ дСсктоп/ΠΌΠΎΠ±ΠΈΠ»ΡŒΠ½Ρ‹Π΅ систСмы ΠΈ Π°Π½Π°Π»ΠΈΠ· ΠΊΠΎΠ΄Π° β€” Clang.
Для embed ΠΈ ΠΌΠΈΠ½ΠΈ-ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠ² β€” TinyCC ΠΈΠ»ΠΈ SDCC.

ИдСального компилятора Π½Π΅Ρ‚ β€” Π²Ρ‹Π±ΠΈΡ€Π°ΠΉ ΠΏΠΎΠ΄ Π·Π°Π΄Π°Ρ‡Ρƒ.