English [en]   العربية [ar]   español [es]   فارسی [fa]   français [fr]   hrvatski [hr]   italiano [it]   日本語 [ja]   polski [pl]   русский [ru]   українська [uk]  

Тридцать лет Фонд свободного программного обеспечения был светочем движения за свободные программы, сражаясь за свободу пользователей.

Помогите поддержать наш яркий огонь пожертвованием, которое продвинет нас к цели собрать 450 000$ к 31 января.

450к
314 к собрано

Это перевод страницы, написанной на английском языке.

Западня JavaScript

Ричард Столмен

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

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

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

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

Многие сайты до сих пор используют JavaScript таким же образом, но некоторые применяют его для крупных программ, которые решают серьезные задачи. Например, “Google Docs” устанавливает на вашей машине программу на JavaScript, занимающую полмегабайта, в сжатом виде, который мы называем “Obfuscript” (запутанный сценарий), потому что там нет комментариев и почти нет пробелов, а названия методов состоят из одной буквы. Исходный текст программы — это форма, предпочтительная для изменения программы; сжатый текст не является исходным текстом, и настоящий исходный текст недоступен пользователю.

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

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

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

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

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

Молчаливая загрузка и выполнение несвободных программ — один из нескольких вопросов, поднимаемых “веб-приложениями”. Термин “веб-приложение” был создан, чтобы стереть принципиальное различие между программами, которые передают пользователям, и программами, которые работают на сервере. Он может обозначать особую клиентскую программу, которую выполняет браузер; он может обозначать особую серверную программу; он может обозначать особую клиентскую программу, которая работает рука об руку с особой серверной программой. Клиентская и серверная стороны затрагивают разные этические вопросы, даже если они так тесно связаны, что можно утверждать, что они представляют собой части одной программы. Эта статья рассматривает только вопрос программ на клиентской стороне. Вопрос серверной стороны мы рассматриваем отдельно.

Как на практике мы можем решать проблему несвободных программ на языке JavaScript на сайтах? Первый шаг — избегать выполнения их.

Что мы подразумеваем под “нетривиальным”? Это понятие растяжимое, так что это вопрос создания простого критерия, дающего хорошие результаты, а не поиска единственно верного ответа.

Мы предлагаем использовать правило, согласно которому программа на JavaScript нетривиальна, если:

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

Наконец, нам нужно изменить свободные браузеры так, чтобы они обнаруживали и блокировали несвободные нетривиальные программы на языке JavaScript на страницах сайтов. Программа LibreJS обнаруживает несвободные нетривиальные программы на JavaScript на страницах, которые вы посещаете, и блокирует их. LibreJS — это дополнение к IceCat и IceWeasel (и Firefox).

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

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

А пока выполнять несвободную программу на JavaScript допустимо в одном случае: если это нужно, чтобы послать жалобу операторам сайта и сообщить им, что им следует освободить или удалить программы на JavaScript с этого сайта. Пожалуйста, смело включайте временно JavaScript, чтобы сделать это — но не забудьте выключить его после этого.

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

Приложение A: соглашение о публикации свободных программ на JavaScript

Для ссылок на исходный текст мы рекомендуем


    // @source:

с последующим URL. Это удовлетворяет требованиям GNU GPL по распространению исходного текста. Если исходный текст находится на другом сайте, вы должны позаботиться о том, чтобы принять соответствующие меры. Исходный текст необходим, чтобы программа была свободной.

Чтобы указать лицензию программ на 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, как и многие другие лицензии свободных программ, требует, чтобы копия лицензии распространялась как с исходным текстом, так и с двоичными формами программы. Однако, текст лицензии достаточно велик, чтобы помещать его на странице с программой на 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) за то, что он обратил мое внимание на этот вопрос.

Приложение B: публикация свободных программ на JavaScript разработчиками сайтов

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

Один метод объявления о лицензиях — описанный выше в Приложении A. Второй метод, лицензионные пометы о JavaScript, может быть удобнее для библиотек минимизированных программ на JavaScript, особенно когда их написали не вы.

[Эмблема ФСПО]“Наша задача — сохранение, защита и поддержка свободы использования, изучения, модификации, копирования и распространения компьютерных программ, а также защита прав пользователей свободных программ”.

Фонд свободного программного обеспечения — ведущая организация, ответственная за разработку операционной системы GNU. Поддержите GNU и ФСПО покупкой руководств и других товаров, присоединением к ФСПО в качестве члена-партнера или пожертвованиями, прямо в фонд или по Flattr.

к началу