دام جاوااسکریپت

نوشتهٔ ریچارد استالمن

ممکن است بدون اینکه متوجه باشید هر روز برنامه‌های غیرآزاد را به واسطهٔ مرورگر وب خود بر روی کامپیوترتان اجرا کنید.

در جامعهٔ نرم‌افزار آزاد این عقیده که نرم‌افزارهای غیر آزاد با کاربران خود بد رفتاری می‌کنند کاملا شناخته شده است. تعدادی از ما ترجیح می‌دهیم که به طور کامل از نصب نرم‌افزارهای غیرآزاد بر روی کامپیوتر خود امتناع ورزیم، و تعداد بسیاری آزاد نبودن را اعتصابی بر علیه برنامه می‌دانند. بسیاری از کاربران می‌دانند که این موضوع دربارهٔ افزونه‌هایی (plugins) که مرورگر برای نصب فراهم می‌آورد نیز صدق می‌کند، چرا که آنها نیز می‌توانند آزاد یا غیرآزاد باشند.

اما مرورگرها برنامه‌های غیرآزاد دیگری را نیز اجرا می‌کنند که حتی دربارهٔ اجرا کردن آن از شما پرسش نیز نمی‌کنند یا حتی به شما دربارهٔ وجودشان چیزی نمی‌گویند—برنامه‌هایی که صفحات وب درون خود دارند و یا به آنها پیوند خورده‌اند. این برنامه‌ها معمولا با جاوااسکریپت نوشته می‌شوند، هر چند که زبان‌های دیگر نیز مورد استفاده قرار می‌گیرند.

جاوااسکریپت (که به طور رسمی ECMAscript نامیده می‌شود، اما کمتر کسی از این نام استفاده می‌کند) برای اولین بار برای تجملاتی کوچک در صفحات وب استفاده شد، همانند قابلیت‌های نمایشی و جلوه‌های زیبا اما غیر ضروریِ پیوندها و فهرست‌ها. قابل قبول بود که به جای اینکه آنها را یک نرم‌افزار به حساب آوریم، یک تعمیم بر HTML بدانیم؛ آنها موضوع چندان مهمی به حساب نمی‌آمدند.

تعدادی از سایت‌ها هنوز از جاوااسکریپت به همان صورت استفاده می‌کنند، اما بعضی‌ها از جاوااسکریپت برای برنامه‌های مهمی که کارهای بزرگ انجام می‌دهند استفاده می‌کنند. به عنوان مثال، Google Docs یک برنامهٔ جاوااسکریپت را بر روی کامپیوتر شما بارگزاری می‌کند که کمتر از نصف مگابایت حجم دارد، در قالبی که ما Obfuscript می‌نامیم چرا که هیچ توضیح و یا خط خالی‌ای درون خود ندارد، و نام مِتُدهای آن تنها یک حرف طول دارد. کد منبع یک برنامه، در قالبی است که بتوان آن را ویرایش کرد؛ این کدِ فشرده، کد منبع نیست، و کد منبع حقیقیِ این برنامه در دسترس کاربر قرار ندارد.

معمولا مرورگرها هنگام بارگزاری برنامه‌های جاوااسکریپت اطلاعی نمی‌دهند. اکثر مرورگرها روشی برای غیر فعال کردن جاوااسکریپت به طور کامل دارند، اما هیچ‌کدام از آنها برنامه‌های جاوااسکریپت که کوچک اما با اهمیت، و غیر آزاد هستند را نمی‌توانند بررسی کنند. حتی اگر شما از این موضوع با خبر باشید، پیدا کردن و جلوگیری از این برنامه‌ها پر دردسر خواهد بود. هر چند، حتی در جامعهٔ نرم‌افزار آزاد نیز اکثر کابران از این موضوع مطلع نیستند؛ سکوتِ مرورگر موضوع را پنهان نگاه می‌دارد.

می‌توان یک برنامهٔ جاوااسکریپت را با انتشار کد منبع آن مطابق اجازه‌نامهٔ نرم‌افزار آزاد، به صورت یک نرم‌افزار آزاد منتشر ساخت. اما حتی اگر کد منبع برنامه در دسترس باشد، راه ساده‌ای برای به اجرا درآوردن نسخهٔ تغییر یافته به جای نسخهٔ اصلی وجود ندارد. مرورگرهای آزاد کنونی تسهیلاتی را برای اجرای نسخهٔ تغییر یافته به جای آنچه درون صفحه وجود دارد، در اختیار قرار نمی‌دهند. تاثیر آن با tivoization قابل مقایسه است، اگر چه غلبه بر آن چندان هم مشکل نیست.

جاوااسکریپت تنها زبانی نیست که وب‌سایت‌ها برای ارسال برنامه برای کاربران استفاده می‌کنند. Flash قابلیت برنامه‌نویسی را به وسیلهٔ نوعی جاوااسکریپتِ توسعه‌یافته فراهم می‌آورد. برای ارائهٔ توصیه‌هایی مناسب در این زمینه احتیاج به بررسی Flash داریم. به نظر می‌رسد که Silverlight نیز مشکلی همانند Flash ایجاد می‌کند، حتی بدتر، چرا که مایکروسافت از آن به عنوان سکویی برای codecهای غیرآزاد خود استفاده می‌کند. یک جایگزین آزاد برای Silverlight موضوع را برای جهان آزاد حل نمی‌کند مگر اینکه جایگزینی آزاد برای این codecها داشته باشد.

جاوااپلت نیز درون مرورگر اجرا می‌شود و مورد مشابهی را مطرح می‌کند. به طور کلی، هر نوع سیستمِ اپلت چنین مشکلی را دارا است. داشتن یک محیط آزاد برای اجرای اپلت، ما را تنها تا جایی پیش می‌برد که بتوانیم با این مشکل روبرو شویم.

جنبشی قدرتمند به راه افتاده است که از وب‌سایت‌ها تقاضا می‌کند تنها از طریق فرمت‌ها و پروتکل‌های آزاد (بعضی‌ها می‌گویند "باز") ارتباط بر قرار کنند؛ فرمت‌ها و پروتکل‌هایی که مستندات خود را منتشر ساخته‌اند و هر شخصی برای پیاده‌سازی آنها آزاد است. با حضور برنامه‌ها در صفحات وب، چنین ضوابطی ضروری، اما ناکافی است. خود جاوااسکریپت، به عنوان یک فرمت، آزاد است، و استفاده از جاوااسکریپت در وب‌سایت‌ها لزوما بد نیست. هر چند، همانطور که پیش از این دیدیم، لزوما خوب هم نیست. هنگامی که یک سایت برنامه‌ای را برای کاربر ارسال می‌کند، نوشته شدن برنامه با یک زبان واضح و مستندسازی شده به تنهایی کافی نیست، خود برنامه نیز باید آزاد باشد. ”تنها برنامه‌های آزاد که برای کاربران ارسال می‌شوند“ باید بخشی از ضابطهٔ رفتار صحیح برای وب‌سایت‌ها شوند.

بارگزاری و اجرای برنامه‌های غیر آزاد در سکوت یکی از چند موضوعی است که توسط "برنامه‌های وب" مطرح شده است. واژهٔ "برنامه‌های وب" به منظور حذف تفاوت‌های اساسی میان برنامه‌هایی که برای کاربر ارسال می‌شود و برنامه‌هایی که بر روی سرور در حال اجرا هستند، پدید آمده است. این واژه می‌تواند به یک برنامهٔ اختصاصی که بر روی مرورگر کاربر اجرا می‌شود اشاره کند؛ می‌تواند به نرم‌افزار اختصاصی سرور اشاره کند؛ می‌تواند به برنامهٔ اختصاصی سمت کاربر و برنامهٔ اختصاصی سمت سرور که با یکدیگر همکاری می‌کنند اشاره کند. برنامه‌های سمت کاربر و سمت سرور موضوعات اخلاقی مختلفی را مطرح می‌کنند، حتی اگر آنها کاملا ترکیب شده و بتوان گفت که برنامه‌ای واحد را تشکیل داده‌اند. این مقاله تنها بر روی نرم‌افزارهای سمت کاربر بحث می‌کند. موضوع سرور به صورت جداگانه‌ای مورد بحث قرار خواهد گرفت.

در عمل، چگونه می‌توان با مشکلِ برنامه‌های جاوااسکریپتِ غیر آزاد بر روی وب‌سایت‌ها بر خورد کرد؟ یکی از روش‌ها بدین قرار است.

ابتدا، به ضابطه‌ای عملی برای برنامه‌های جاوااسکریپتِ کوچک اما نه بی‌اهمیت، نیاز داریم. موضوع مهم آن است که ضابطه‌ای طراحی کنیم که نتایج خوبی به دست دهد، نه اینکه جواب صحیحی فراهم آورد.

پیشنهاد ما این است که برنامهٔ جاوااسکریپتی را با اهمیت بنامیم که اسکریپتِ دیگری را بارگزاری کند و یا یک درخواست AJAX را مطرح کند.

در پایان مقاله قراردادی را پیشنهاد می‌کنیم که مطابق آن یک برنامهٔ جاوااسکریپت در یک صفحهٔ وب بتواند شامل یک URL باشد که به مکان کد منبع برنامه اشاره کند، و بتواند شامل اجازه‌نامه‌ای نیز باشد که با استفاده از توضیحات درون کد مشخص شود.

در پایان، لازم است که مرورگرهای وب به گونه‌ای تغییر پیدا کنند که از آزادی کاربران در مقابل صفحاتی با جاوااسکریپت حمایت کنند. پیش از هر چیز، مرورگرها باید قادر باشند که در عوض اجرا کردن برنامه‌های جاوااسکریپتِ غیر آزاد و نه بی‌اهمیت، به کاربران در موردشان اخطار دهند. شاید بتوان NoScript را برای این منظور تغییر داد.

همچنین کاربران مرورگر به روشی ساده نیاز دارند تا بتوانند کد جاوااسکریپت جایگزینی را مشخص کنند تا به جای کد موجود در صفحه اجرا شود. (کد مشخص شده باید یک جایگزین کامل، و یا نسخه‌ای تغییر یافته و آزاد از کد جاوااسکریپتِ موجود در آن صفحه باشد.) Greasemonkey تقریبا قادر به انجام این کار است، اما نه کاملا، چرا که نمی‌تواند تضمین کند پیش از اجرا شدن کد جاوااسکریپتِ درون صفحه، نسخهٔ تغییر یافته جایگزین شود. استفاده از یک پروکسیِ محلی این امکان را می‌دهد، اما بیش از حد دردسر ساز است که به عنوان راه حل حقیقی ارائه شود. باید راه حلی پدید آورد که قابل اعتماد و راحت باشد، همین‌طور سایت‌هایی که بتوانند این تغییرات را به اشتراک بگذارند. پروژهٔ گنو تمایل دارد سایت‌هایی را معرفی کند که تنها به تغییرات آزاد توجه دارند.

این قابلیت‌ها باعث می‌شود که بتوان برنامه‌های جاوااسکریپت موجود در صفحات وب را به صورت آزاد، و با روشی عملی و حقیقی منتشر کرد. جاوااسکریپت دیگر یک مانع در برابر آزادی ما نخواهد بود.—نه بیش از آنچه امروزه جاوا و C هستند. ما می‌توانیم برنامه‌های غیر آزاد و نه بی‌اهمیت جاوااسکریپت را نپذیریم و یا حتی آنها را جایگزین سازیم، درست همانطور که بسته‌های نرم‌افزاری غیر آزاد را که موجود هستند جایگزین می‌سازیم. سپس مبارزهٔ ما برای اینکه وب‌سایت‌ها کد جاوااسکریپت خود را آزاد سازند، آغاز خواهد شد.

از Matt Lee و John Resig به خاطر کمک در تعریف ضابطهٔ پیشنهادی ما تشکر می‌کنم.

پیوست: قراردادی برای توزیع برنامه‌های جاوااسکریپت به صورت آزاد

برای ارجاع به کد منبع، پیشنهاد می‌کنیم


    // @source:

و پس از آن URL مربوط به کد منبع آورده شود.

برای نمایش دادن اجازه‌نامهٔ مربوط به کد جاوااسکریپت که در صفحه آمده است، پیشنهاد می‌کنیم از اعلانی، میان دو یادداشت، همانند این فرم استفاده شود:



    @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 طولانی‌تر از آن است که بتوان آن را بدون مشکل در یک صفحهٔ وب به همراه کد جاوااسکریپت قرار داد. با استفاده از یک اعلان همانند آنچه در زیر می‌آید به همراه کد خود، می‌توانید این الزام را برآورده کنید:


    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.