С тех пор, как была написана эта статья, компания Sun перевыпустила почти всю свою эталонную реализацию платформы Java под Стандартной общественной лицензией GNU, и свободная среда разработки для Java теперь есть. Таким образом, язык Java как таковой больше не западня.
Однако вы должны быть осторожны, поскольку не всякая платформа Java свободна. Sun продолжает распространять в исполняемом виде платформу Java, которая не свободна, и другие компании тоже так поступают.
Свободная среда для Java называется IcedTea; она включает в себя исходный текст, освобожденный компанией Sun. Так что это та реализация, которой вам следует пользоваться. Многие дистрибутивы GNU/Linux поставляются с IcedTea, но некоторые включают в себя несвободные платформы Java.
Чтобы надежно гарантировать, что ваши программы на Java будут прекрасно выполняться в свободной среде, вам нужно разрабатывать их с помощью IcedTea. Теоретически платформы Java должны быть совместимы, но они совместимы не на сто процентов.
Кроме того, есть несвободные программы, в названии которых есть слово “Java”, такие, как JavaFX, и есть несвободные пакеты Java, которые вы, возможно, сочли бы заманчивыми, но должны отвергать. Так что проверяйте лицензии всех пакетов, какими только вы планируете воспользоваться. Если вы пользуетесь Swing, убедитесь, вы пользуетесь свободной версией — той, что входит в состав IcedTea.
Не считая этих деталей, связанных с Java, общая проблема, описанная здесь, остается важной, потому что несвободная библиотека или платформа программирования может создать подобную же проблему. Из истории Java мы должны извлечь урок, чтобы в будущем избежать других ловушек.
См. также Западня JavaScript.
12 апреля 2004 года
Если ваша программа свободна, она в основном этична — но есть западня, которой вы должны остерегаться. Ваша программа, даже если она сама по себе свободна, может быть ограничена несвободными программами, от которых она зависит. Поскольку наиболее ярко эта проблема выражена сегодня для программ на Java, мы называем это западней Java.
Программа свободна, если у ее пользователей есть определенные жизненно важные свободы. Грубо говоря, это свобода выполнять программу, свобода изучать и править исходный текст, свобода перераспространять исходный текст и двоичные файлы, а также свобода публиковать улучшенные версии. (См. http://www.gnu.org/philosophy/free-sw.html.) Является ли данная программа в виде исходного текста свободной, полностью определяется смыслом ее лицензии.
Может ли программа применяться в мире свободы — применяться людьми, которые намерены жить свободно,— более сложный вопрос. Это определяется не только собственной лицензией программы, потому что никакая программа не работает изолированно. Всякая программа зависит от других программ. Например, программу нужно скомпилировать или интерпретировать, так что она зависит от компилятора или интерпретатора. Если она компилируется в промежуточный псевдокод, то она зависит от интерпретатора псевдокода. Более того, чтобы выполняться, ей нужны библиотеки, и она может вызывать другие самостоятельные программы, которые выполняются в других процессах. Все эти программы — зависимости. Зависимости могут быть необходимы для того, чтобы программа могла хоть как-то выполняться, или только для доступа к определенным возможностям. Как бы то ни было, вся программа или ее часть не может функционировать без зависимостей.
Если какая-то из зависимостей программы несвободна, это значит, что вся или часть программы не сможет выполняться в полностью свободной системе — ее нельзя использовать в мире свободы. Разумеется, мы могли бы перераспространять эту программу и копировать ее на свои машины, но пользы от этого не много, потому что она не станет работать. Эта программа свободна, но фактически она скована несвободными зависимостями.
Эта проблема может возникнуть в программах любого рода, на любом языке. Например, свободная программа, которая выполняется только под Microsoft Windows, явно бесполезна для мира свободы. Но программа, которая выполняется под GNU/Linux, тоже может быть бесполезна, если она зависит от других несвободных программ. В прошлом Motif (до того, как у нас появился Lesstif) и Qt (до того, как его разработчики сделали его свободным) были серьезными источниками этой проблемы. Большинство видеоплат с трехмерной графикой в полном объеме работают только с несвободными драйверами, что тоже создает эту проблему. Но сегодня серьезнейший источник этой проблемы — Java, потому что люди, которые пишут свободные программы, часто испытывают влечение к Java. Ослепленные притягательностью языка, они закрывают глаза на проблему зависимостей и попадают в западню Java.
Реализация Java компании Sun несвободна. Стандартные библиотеки Java тоже несвободны. Свободные реализации Java у нас есть — такие, как компилятор GNU языка Java (GCJ) и GNU Classpath,— но они поддерживают еще не все возможности. Мы пока только догоняем.
Если вы разрабатываете программу на Java с помощью платформы Java компании Sun, вы, скорее всего, будете пользоваться возможностями, доступными только для платформы Sun, даже не замечая этого. К тому времени, как вы обнаружите это, вы, возможно, будете пользоваться ими уже многие месяцы, и на переделку тоже уйдут месяцы. Может оказаться, что вы скажете: “Это слишком большая работа, чтобы начинать ее заново”. Тогда ваша программа провалится в западню Java; ею нельзя будет пользоваться в мире свободы.
Надежный способ избежать западни Java — устанавливать в своей системе только свободную реализацию Java. Тогда, если вы воспользуетесь особенностью языка или библиотеки, которую свободные программы пока не поддерживают, вы сразу же это обнаружите, и вы сможете немедленно переписать эту часть программы.
Sun продолжает разрабатывать дополнительные “стандартные” библиотеки Java, и почти все они несвободны; во многих случаях даже спецификации библиотеки являются коммерческой тайной, и последняя лицензия Sun на эти спецификации запрещает выпуск чего бы то ни было, кроме полной реализации спецификаций. (См., например, http://jcp.org/aboutJava/communityprocess/JSPA2.pdf и http://jcp.org/aboutJava/communityprocess/final/jsr129/j2me_pb-1_0-fr-spec-license.html.)
К счастью, эта лицензия на спецификации все-таки позволяет выпускать реализацию в качестве пакета свободных программ; другим, тем, кто получит библиотеку, можно позволить изменять ее, и от них не требуется следовать спецификации. Но это требование фактически запрещает применять схемы сотрудничества для выработки свободной реализации. Применение такой схемы подразумевало бы публикацию неполных версий, а это не позволено тем, кто прочел спецификации.
На заре движения за свободное программное обеспечение было невозможно избежать зависимости от несвободных программ. До того, как у нас появился компилятор Си GNU, каждая программа на Си (свободная или нет) зависела от несвободного компилятора Си. До того, как у нас появилась библиотека Си GNU, каждая программа зависела от несвободной библиотеки Си. До появления у нас Linux, первого свободного ядра, каждая программа зависела от несвободного ядра. До того, как у нас появился BASH, каждую программу для командного интерпретатора приходилось выполнять в несвободном командном интерпретаторе. Наши первые программы изначально были опутаны этими зависимостями, это было неизбежно; но мы пошли на это, потому что в наши планы входило последующее избавление наших программ. Наша высшая цель — самодостаточная операционная система GNU — содержала свободные замены всех этих зависимостей; если бы мы достигли цели, все наши программы были бы спасены. Так и случилось: благодаря системе GNU/Linux сейчас мы можем выполнять эти программы на свободных платформах.
Сегодня ситуация другая. Теперь у нас есть мощные свободные операционные системы и большое количество свободных средств разработки. Какую бы работу вы ни хотели выполнить, вы можете делать это на свободной платформе; нет необходимости соглашаться даже на временную несвободную зависимость. Главная причина, по которой люди попадают сегодня в западню — то, что они не думают об этом. Проще всего эту проблему решить, приучая людей ее распознавать и не попадать в нее.
Чтобы предохранить ваши программы на Java от этой западни, установите свободную среду разработки Java и пользуйтесь ею. Вообще, каким бы языком вы ни пользовались, смотрите в оба и проверяйте, свободны ли пакеты, от которых зависят ваши программы. Самый простой способ проверить, является ли программа свободной — поискать ее в Каталоге свободных программ (http://www.fsf.org/directory). Если программы в каталоге нет, можно проверить, перечислены ли ее лицензии в списке лицензий свободных программ ( http://www.gnu.org/licenses/license-list.html).
Мы пытаемся спасти завязнувшие программы на Java, так что если вам нравится этот язык, мы приглашаем вас помочь в разработке GNU Classpath. Если вы испытаете свои программы с компилятором GCJ и GNU Classpath и расскажете о любых проблемах, с которыми вы столкнетесь в уже реализованных классах, это тоже будет полезно. Однако до конца разработки GNU Classpath пройдет какое-то время; если несвободные библиотеки будут по-прежнему добавляться, у нас, может быть, никогда не будет самых последних из них. Так что не сажайте, пожалуйста, свои свободные программы в кандалы. Когда сегодня вы будете писать прикладную программу, пишите ее так, чтобы она с самого начала выполнялась на свободных средствах.
Забавный инцидент с солнцем в ночную пору