Пожалуйста, сэр, могу ли я получить компоновщик?

From The Joel on Software Translation Project

Jump to: navigation, search

Автор: Джоэл Сполски
Переводчик: Анар Мустафаев
В оригинале статья называется Please Sir May I Have a Linker? и была написана 28 января 2004

По неизвестной причине, превосходная и суперсовременная среда разработки .NET компании Microsoft не содержит одного из ключевых инструментов: инструмента, который был обычным делом в средах разработки программ с, ну, примерно 1950 года, и настолько очевидным, что кажется невероятно странным, что никто не обратил внимание на тот факт, что в .NET, на самом деле, его нет.

О каком инструменте идет речь? О компоновщике (linker). Вот что он делает: собирает откомпилированную версию вашей программы с откомпилированными версиями библиотечных функций, которые ваша программа использует. Затем он удаляет те библиотечные функции, которые ваша программа не использует. И в конце концов, компоновщик создает один бинарный выполняемый файл, который люди могут запустить на своих компьютерах.

Вместо этого в .NET реализована идея «среды исполнения» ... большая, 22-мегабайтная дымящаяся куча кода, которая динамически компонуется и которую каждый обязан иметь на своём компьютере, перед тем как использовать .NET-приложения.

Среды исполнения — это проблема, очень похожая на проблему с DLL, потому что если приложение 1 было разработано для среды исполнения 1, и выходит среда выполнения версии 2, то внезапно, по какой-то непредсказуемой причине приложение 1 перестает правильно работать. Например, сейчас, после обновления среды выполнения с версии 1.0 до 1.1, наша внутренняя корпоративная панель управления округляет количество продаж до четвертого десятичного знака. А обычно несовместимости бывают еще хуже.

На самом деле .NET включает в себя обширную технологическую систему, называемую «объявления» (manifests), которые явно сложны и задуманы для того, чтобы каким-то образом только правильная среда выполнения могла быть использована с данным приложением, но я не знаю никого, кто может разгадать, как их использовать.

Все это требует рассказать одну историю. На вечеринке в Fog Creek, в канун Нового Года, мы хотели чтобы в главной комнате несколько компьютеров показывали обратный отсчет времени до полуночи. Майкл написал приложение на C# с WinForms за 60 секунд. Это отличная среда разработки.

Моя работа заключалось в том, чтобы запустить программу countdown.exe на трёх компьютерах. Кажется всё просто.

Как бы ни так. Двойной щелчок на EXE и я получаю нелепое недружелюбное сообщение об ошибке с mscoree.dll или что-то такое, с неуместным дампом моего пути. Никакого упоминания о том, проблема заключается в том, что среда исполнения .NET просто не была установлена. К счастью я программист, и сразу определил, в чем проблема.

Как мне установить среду исполнения? «Простейший» путь — через Windows Update. Но Windows Update сначала заставляет меня установить все критические обновления, а только потом среду исполнения. Это, разумно, да? Два из «критических» обновлений — это Windows service pack и новая версия Internet Explorer, и оба требуют перезагрузить компьютер.

Как я уже говорил, для запуска этого маленького .NET-приложения мне нужно загрузить 70 или 80 мегабайт (хорошо, что у нас скоростной доступ в Интернет) и перезагрузиться три или четыре раза. И это в софтверной компании! Я знаю, сколько это занимает, потому что когда загрузка началась в первый раз, я включил "Office Space" (прим. пер.: примерно полуторачасовой фильм) на большом экране, и к тому времени, когда фильм закончился, инсталляция почти завершилась. Каждые десять минут во время просмотра фильма я должен был вскакивать, бежать к компьютеру, чтобы нажать ОК в каком-нибудь дурацком диалоговом окне.

Весьма неприятно для запуска доморощенных программ. Но подумайте о нашем продукте CityDesk. Практически все наши пользователи загружают бесплатную пробную версию, перед тем как купить этот продукт. Им надо загрузить около 9 Мб и не предъявляется никаких дополнительных требований. И, практически, пока никто их этих пользователей не имеет среды исполнения .NET.

А если мы попросим пользователей, обычно из небольших организаций и домашних пользователей, сначала пройти через весь ад установки среды исполнения длительностью с целый фильм, просто чтобы попробовать наше приложение, то, думаю, мы потеряем 95% из них. Они пока ещё не клиенты, они потенциальные клиенты, и я не могу позволить себе отказаться от 95% моих потенциальных клиентов только ради использования более удобной среды разработки.

«Но, Джоэль», — могут мне сказать, — «это же ясно, что скоро у достаточного количества пользователей будет эта среда исполнения, и тогда проблема исчезнет».

Я тоже так думал, а потом обнаружил что Microsoft выпускает новую версию среды выполнения каждые шесть или двенадцать месяцев. Понемногу увеличивающееся количество людей, имеющих ее, опять падает до нуля. И будь я проклят, если я буду тестировать мое приложение на трех различных версиях среды выполнения только для того, чтобы получить прирост клиентов на 1,2%, имеющих одну из трех версий.

Я просто хочу все скомпоновать в один статический EXE файл, который для установки не предъявляет никаких особых требований. И мне не важно, что он несколько больше. Все что мне было бы необходимо — это функции, которые я действительно использую, интерпретатор байт-кода и немного от среды выполнения. Мне не нужен целый компилятор C#, который является частью среды выполнения. Я уверяю, что код CityDesk не нуждается в компиляции какого-то ни было программного кода на C#. Мне не нужны целых 22 МБайт. Мне нужно где-то 5 или 6 МБайт, максимум.

Я знаю компании, которые обладают технологией для этого, но им нужно разрешение от Microsoft на распространение частей среды исполнения — таких как интерпретатор байт-кода. Эй, Microsoft, проснись, дай нам замечательный кусочек технологий 1950-х годов, и позволь мне сделать один EXE файл, который запускается на любом компьютере с ОС Win 98 или более поздней без всяких дополнительных требований. Но нет, .NET фатально недружелюбна к пользователю, который скачивает софт.

---

Personal tools