Возможно, Вы каждый день используете несвободные программы на своем компьютере, даже не зная об этом - в своем веб-браузере.

В сообществе свободного программного обеспечения распространено мнение, что несвободные программы нарушают права своих пользователей. Некоторые из нас вообще отказываются устанавливать на компьютер проприетарное (несвободное) программное обеспечение (ПО), а многие другие считают несвободную лицензию аргументом против использования программы. Многие пользователи знают, что этот вопрос также касается плагинов, устанавливаемых в веб-браузер, т.к. они тоже могут быть свободными или несвободными.

Но браузеры исполняют другие несвободные программы, не спрашивая и даже не информируя Вас об этом - программы, которые содержатся в веб-страницах, или на которые те ссылаются. Эти программы чаще всего написаны на языке JavaScript, хотя другие языки также используются.

JavaScript (официально называющийся ECMAscript, но это название практически не используется) раньше использовался для создания маленьких приятностей на веб-страницах, к примеру, милые, но необязательные визуальные и навигационные дополнения. Тогда было допустимым считать их простыми расширениями разметки HTML, а не полноценными программами; они не представляли собой значительной ценности.

Многие сайты до сих пор используют JavaScript таким образом, но некоторые сайты используют его для больших программ, выполняющих большую работу. К примеру, Документы Google скачивает на Ваш компьютер программу объемом полмегабайта в компактизованной форме, которую мы называем Обфускриптом, так как она не содержит комментариев и даже почти не содержит пробелов, а названия методов преимущественно состоят из одной буквы. Наличие исходного кода программы является предпочтительным, так как это позволяет модифицировать программу; компактизованный код не является исходным кодом, а настоящий исходный код этой программы недоступен пользователю. Браузеры обычно не сообщают Вам о том, что они загрузили программу на JavaScript. Большинство браузеров могут отключить использование JavaScript совсем, но пока ни один из них не может проверить, является ли программа на JavaScript нетривиальной и несвободной. Даже если Вы знаете об этой проблеме, Вам будет стоить больших трудов идентифицировать и заблокировать такие программы. Однако, даже в сообществе свободного ПО большинство пользователей не знают об этой проблеме; поведение же браузеров помогает умолчать этот вопрос.

Вполне возможно выпустить программу на JavaScript как свободное ПО, предоставляя исходный код под свободной лицензией. Но даже если исходный код программы доступен, нет легкого пути запустить Вашу собственную модифицированную версию вместо оригинала. Современные свободные браузеры не обладают возможностью запуска модифицированной версии вместо той, что была доставлена вместе с веб-страницей. Этот эффект сравним с тивоизацией, хотя его не так трудно преодолеть.

JavaScript - не единственный язык, используемый веб-сайтами для программ, посылаемых пользователю. Flash поддерживает программирование на расширенном варианте JavaScript. Нам еще необходимо отдельно изучить проблему Flash, чтобы давать рекомендации по его поводу. Silverlight, похоже, порождает проблему, аналогичную Flash, только еще и возникают дополнительные вопросы, связанные с тем, что Microsoft использует его в качестве платформы для несвободных кодеков. Свободная замена Silverlight не удовлетворяет требованиям свободного мира, пока она не идет в комплекте со свободными кодеками на замену проприетарным. Апплеты Java также запускаются в браузере, и порождают сходные сложности; в целом, это касается любой система апплетов. Наличие свободной среды исполнения апплетов само по себе является предпосылкой к существованию этой проблемы.

Существует мощное движение в защиту использования веб-сайтами для связи только свободных форматов и протоколов (некоторые употребляют термин "открытые протоколы"); т.е. те, чья документация опубликована, и которые может реализовать кто угодно. Наличие программ в веб-страницах делает этот критерий необходимым, но не достаточным. JavaScript сам по себе как формат свободен, и его использование в веб-сайте необязательно плохо. Однако, как мы уже видели, это также необязательно хорошо. Когда сайт передает программу пользователю, недостаточно, чтобы программа была написана на документированном и необремененном с юридической точки зрения языке; эта программа сама должна также быть свободной. Таким образом,  в критерий корректного поведения веб-сайтов должен войти также пункт "Передавать пользователю только свободные программы".

Незаметное скачивание и запуск несвободных программ является одной из проблем "веб-приложений". Сам термин "веб-приложение" был создан для того, чтобы смазать фундаментальную разницу между ПО, работающим на сервере, и ПО, переданным пользователям. Он может обозначать специализированную клиентскую программу, работающую в браузере; он может обозначать специализированное серверное ПО; он может обозначать специализированное клиентское ПО, которое работает в унисон со специализированным серверным ПО. Программам на клиенте и сервере соответствуют разные этические нормы, даже когда они столь интегрированы, что являются по сути частями одной программы. Данная статья освещает только вопрос клиентского ПО. Мы обсудим вопросы, касающиеся серверного ПО, в отдельной статье. Как же, на практике, мы можем решить проблему несвободных JavaScript-программ в веб-сайтах? Мы предлагаем следующий план действий.

Во-первых, нам нужен практический критерий нетривиальных JavaScript-программ. Поскольку "нетривиальность" является количественным показателем, это скорее вопрос разработки простого критерия, дающего хорошие результаты, а не определения единственного верного ответа. Мы предлагаем считать JavaScript-программу нетривиальной, если она осуществляет AJAX запросы, а также если она определяет методы, и либо загружает внешний скрипт, или сама загружается таким образом.

В конце этой статьи мы предлагаем способ, с помощью которого нетривиальная JavaScript-программа на веб-странице может указать URL, где находится ее исходный код, а также указать свою лицензию, используя для этого стилизованные комментарии.

Наконец, нам нужно изменить свободные браузеры так, чтобы они поддерживали свободу пользователей страниц с JavaScript. В первую очередь, браузеры должны уметь оповещать пользователя о нетривиальных несвободных JavaScript-программах, а не незаметно запускать их. Возможно, NoScript мог бы быть адаптирован для этой цели. Пользователям браузеров также необходим удобный инструмент для указания JavaScript-кода, который нужно использовать вместо JavaScript на конкретной странице (указанный код может быть полной заменой оригинального, или модифицированной версией свободной JavaScript-программы на этой странице). Greasemonkey почти соответствует по возможностям этому требованию, но не вполне, так как он не предоставляет гарантии, что код JavaScript будет изменен до того, как программа начнет исполняться. Использование локального прокси-сервера для этой цели возможно, но на данный момент это слишком неудобно, чтобы быть полноценным решением. Нам нужно создать удобное и надежное решение, а также сайты, на которых можно распространять изменения в веб-программах. Сайты, посвященные распространению только свободных изменений, получат поддержку проекта GNU.

Эти достижения дадут возможность JavaScript-программе, включенной в веб-страницу, быть свободной в практическом смысле. JavaScript более не будет особенным препятствием на пути к нашей свободе - не более, чем C или Java сейчас. Мы сможем отвергать и даже заменять несвободные нетривиальные JavaScript-программы так же, как сейчас отвергаем и заменяем несвободные пакеты, предлагаемые к установке обычным образом. И тогда мы сможем начать кампанию пользу освобождения веб-сайтами используемых ими JavaScript-сценариев.




Большое спасибо Мэтту Ли и Джону Резигу за их помощь в определении нашего предлагаемого критерия, а также Давиду Парунакяну за помощь в доведении существования этой проблемы до моего внимания.


Приложение: договоренность по релизу свободных JavaScript-программ

Для указания ссылки на соответствующий исходный код, мы рекомендуем следующую нотацию:

// @source:

после которой указан URL.

Чтобы указать лицензию JavaScript-кода, вшитого в страницу, мы рекомендуем помещать лицензионное оповещение между двумя сообщениями следующего вида:

@licstart The following is the entire license notice for the JavaScript code in this page. ... @licend The above is the entire license notice for the JavaScript code in this page.

Разумеется, все это должно содержаться в многострочном комментарии.

GNU GPL, подобно многим другим свободным лицензиям, требует передачи копии лицензии как с исходной, так и с двоичной формой программы. Однако, в связи с длиной GNU GPL включать ее в страницу с JavaScript-программой неудобно. Это требование может быть снято (для кода, копирайт на который принадлежит Вам) с помощью лицензионного сообщения следующего вида:

Copyright (C) YYYY Developer The JavaScript code in this page is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License (GNU GPL) as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. The code is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU GPL for more details. As additional permission under GNU GPL version 3 section 7, you may distribute non-source (e.g., minimized or compacted) forms of that code without the copy of the GNU GPL normally required by section 4, provided you include this license notice and a URL through which recipients can access the Corresponding Source. Я благодарю Давида "Jaffar Rumith" Парунакяна за то, что он обратил мое внимание на эту проблему.