Розробники з Google запропонували розробити свою libc для LLVM
Один із розробників з компанії Google підняв у списку розсилки LLVM тему розробки багатоплатформної стандартної Бібліотеки (Libc) в рамках проекту LLVM. Через ряд причин Google не влаштовують поточні libc (glibc, musl) і компанія на шляху до розробки нової реалізації, яку пропонується розвивати як частину LLVM.
Напрацювання LLVM останнім часом використовуються як основа для побудови складального інструментарію Google. Основною ідеєю є те, що якщо Google вже почав розвивати свою libc, то чому б йому відразу не розвивати свою систему у складі LLVM, який вже пропонує свою стандартну бібліотеку для С++ (Libc++), але не має аналогічної стандартної бібліотеки для Сі ( Libc).
Розробку планується вести поетапно, поступово збільшуючи функціональність. Перші варіанти пропонується оформити у вигляді прошарку між програмою та системною Libc, з якої будуть запозичуватися ще не реалізовані можливості. Після досягнення певного рівня у функціональності нова Libc зможе застосовуватися як повна заміна системної Libc. Почати планується з підтримки архітектури x86-64, Linux та статичного зв'язування (динамічна завантаження, компонування та додаткові архітектури будуть реалізовані у другу чергу).
Проект поки що на початковій стадії розвитку, але вже визначено базові цілі:
Модульність та розвиток відповідно до філософії постачання гранульованої бібліотеки, а не монолітного набору;
Підтримка статичного зв'язування у режимах з PIE (Position-independent executables) і без PIE. Надання CRT (C runtime) та завантажувача PIE для статично зв'язуваних виконуваних файлів;
Підтримка більшої частини функцій стандартної Сі-бібліотеки з доповненнями POSIX та деякими специфічними для систем розширеннями, потрібними в існуючих додатках;
Обережне ставлення до специфічних для виробників розширень та їх додавання лише за необхідності. Щодо підтримки сторонніх розширень пропонується застосовувати підхід проектів Clang та libc++;
Використання зразкових практик у розробці з використанням інструментарію LLVM, таких як застосування sanitizer та fuzzing-тестування із самого початку.
Один із активних розробників LLVM вказав, Що постачання libc у складі інструментарію LLVM не позбавлене сенсу, але зазвичай при подібній необхідності використовують бібліотеку musl, яка якісно написана, підтримує різні архітектури та надає необхідну функціональність, у тому числі підтримує динамічне зв'язування. Виправданим може бути вбудовування musl у LLVM та розвиток його як синхронізованого з основним проектом форка.
Своя думка також висловив автор проекту Musl, який спробував аргументувати чому пропозиція Google та включення Libc у постачання LLVM є дуже поганими ідеями:
Розробка та супровід коректної, сумісної та високоякісної Libc є дуже важким завданням. Проблема над обсягом коду, а забезпеченні коректного поведінки і труднощі з реалізацією інтерфейсів з урахуванням величезного пласта коли-небудь написаних додатків на С/C++, і навіть додатків іншими мовами, runtime яких використовує Libc. Підхід у лоб без урахування нюансів лише призведе до того, що багато існуючих програм не зможуть працювати з Libc, але тоді такий проект не буде цікавий споживачам.
Корпоративна технологія може зіпсувати Libc, але проштовхнути для широкого використання, результатом чого стане необхідність додавання хаків для забезпечення сумісності додатків. Розробка під егідою корпоративного відкритого проекту тягтиме ковдру у бік потреб та рішень компанії, на шкоду інтересам спільноти. Наприклад, у разі виявлення проблеми, яка викликана помилкою в іншій своїй програмі, у підконтрольній розробці простіше забезпечити сумісність Libc із цією помилкою, ніж виправити саму помилку. Apple використовує для цього форк BSD libc, а Google застосовує в Fuchsia форк musl. Досвід розробника musl говорить про те, що з ним пов'язувалися здебільшого юристи для уточнення питань ліцензування, але ніколи не зверталися для уточнення технічних деталей перед внесенням до своїх відгалужень змін, що марних і порушують роботу.
Відсутність монокультури при розробці libc і орієнтація на стандарти, що розвиваються на основі досягнення консенсусу, замість одноосібного управління, що мотивує розробників прикладних додатків використовувати стандарти, а не прив'язуватися до конкретних реалізацій. Саме тому автор musl проти включення його бібліотеки до складу LLVM, як і проти розробки libc у рамках LLVM, тому що в цьому випадку втрачається незалежний характер libc і певна реалізація стає рішенням першого класу для LLVM, а решта — другого.