Пролог

Мне очень не нравится Microsoft Visual Studio. Я считаю, что это слишком сложно и больше вредит, чем помогает, особенно для команд, которым необходимо работать в нескольких операционных системах. Несмотря на это, есть некоторые вещи, для которых это абсолютно необходимо, когда дело доходит до разработки Windows (например, если вы хотите настоящую отладку), и бывают случаи, когда сама разработка Windows абсолютно необходима (например, когда начальник или профессор говорит вам вы должны).

Моя основная машина — MacBook Pro, а это значит, что я в основном использую macOS. В основном я занимаюсь веб-разработкой с полным стеком, и я считаю, что это лучше на машине Unix. Linux был бы идеальным, так как на нем работает большинство серверов, но у него есть свои проблемы, если вы хотите делать больше, чем просто программирование.

Настройка компилятора должна быть простой, верно?

Некоторое время назад, когда я был в классе C++ по структурам данных в своем университете, мне нужно было отправить исполняемый файл Windows как часть каждого задания. Ничего страшного, у меня есть виртуальная машина Windows на моем ноутбуке и ПК с Windows дома, так что я могу что-то придумать.

Очевидный ответ (и то, что рекомендовал мой учитель) заключался в том, чтобы использовать Visual Studio внутри моей виртуальной машины. Хотя на самом деле я не хотел этого делать, потому что Visual Studio невероятно тяжелая для работы, сильно разряжает батарею (особенно когда к ней добавляются накладные расходы на виртуальную машину) и работа внутри нее — это то, о чем мне снятся кошмары. Он огромный, раздутый, и заставить его делать то, что я хочу, похоже на вырывание зубов. У меня было всего несколько целей для моего решения: простое и кроссплатформенное.

Поэтому я сначала посмотрел на свои варианты. Существует два основных варианта кроссплатформенных компиляторов C++: Clang и GCC. Clang поставляется с инструментами командной строки Xcode на macOS и имеет установщик Windows, доступный непосредственно от разработчиков. GCC доступен через Homebrew на macOS, но, поскольку Homebrew требует Xcode (и, таким образом, у нас уже есть Clang), а GCC на Windows требует Cygwin (что объективно непросто), Clang был очевидным выбором. Значит, я просто запускаю установщик Windows, и все готово?

Неа.

Вот особенность C++: стандартная библиотека и компиляторы обычно поставляются как два отдельных компонента. Clang — это просто компилятор без каких-либо определений времени выполнения или функций. У них есть libc++, их реализация стандартной библиотеки, но нет предварительно скомпилированной версии для Windows, а у меня не было работающего компилятора. Никакой помощи там.

Я потратил больше времени, чем хотел бы признать, пытаясь найти способ обойти это без установки Visual Studio. Мне нужно было простое решение, и установка IDE на несколько гигабайт только для заголовков стандартной библиотеки казалась невероятно сложной. Я все равно нехотя это сделал.

Все сложно.

Подумав об этом, я понял, что macOS заставляет меня делать то же самое, только с другой IDE. У меня был установлен Xcode, и я практически никогда его не трогал. Это тоже не маленький пакет, сам весит более дюжины гигабайт. Все это только для того, чтобы я мог получить доступ к clang из своей командной строки. Хотя это имеет смысл. C++ появился из того времени, когда такое разделение было необходимо. Целевые платформы не были такими однородными, как сейчас, и промежуточные представления были мерцанием в глазах инженера где-то, желавшего, чтобы у машин было достаточно оперативной памяти для их поддержки.

Это разъединение создает очень запутанный опыт для тех, кто только пытается научиться программировать на C++. Есть так много вариантов, и многие из них скрывают то, что на самом деле делает компьютер, за слоями абстракций. Самостоятельная работа с компилятором становится утомительным процессом, потому что никто больше не говорит о том, как это сделать. Они говорят только об абстракциях. Когда люди говорят только об абстракциях, вещи нижнего уровня теряются внутри них или остаются позади. Вот почему теперь нам приходится устанавливать гигантские IDE только для компиляции небольших и простых двоичных файлов x86. Хотя так быть не должно!

Настройка компилятора должна быть простой.

Node.js хоть и не является компилятором, но я часто с ним работаю, и, возможно, он меня немного избаловал. У них есть установщики для всех платформ, и единственное, что вам нужно для запуска: исполняемый файл, который запускает ваш код. Он также включает npm, но вам не нужно его устанавливать, если вы этого не хотите. Дело в том, что Node.js проделывает большую работу, чтобы сделать работу из коробки максимально удобной.

Некоторые новые скомпилированные языки, даже низкоуровневые, такие как Rust, дают вам такую ​​же обработку одного пакета. Если вы хотите программировать на Rust, вам нужно установить небольшой инструмент под названием rustup. Это менеджер версий, который объединяет в себе несколько других инструментов, например, груз. Но если вы просто хотите использовать rustc напрямую, это не заставит вас платить кучу лишних денег. Все это мелко, не мешается, а главное полезно. Cargo (менеджер пакетов) работает на достаточно низком уровне, чтобы чувствовать, что вы все контролируете и знаете, что происходит, даже если он абстрагирует много дополнительной работы. Вы запускаете его прямо из командной строки, и вам не нужно копаться в меню, меню и других меню, чтобы настроить его так, как вам нужно.

Было бы неплохо увидеть крупного игрока в мире C++ и предложить что-то вроде этого: Универсальный установщик для Windows и *nix, который дает вам только полезные утилиты командной строки, предварительно скомпилированную стандартную библиотеку и ничего из другой пух. Я знаю, что это принятие желаемого за действительное, но девушка может мечтать.