زندگی هر انسانی یک دفترچه خاطرات است که میخواهد در آن داستان خاص خودش را بنویسد، اما در نهایت داستانی دیگر مینویسد. و تحقیرآمیزترین لحظات زندگی زمانی است که او نسخه نوشته شده را با آنچه قسم خورده بود بسازد، مقایسه میکند. جِی. ام. باری
قبلا هم نوشته بودم که عاشق نوشتنام و به خصوص سابقهای قدیمی در روزانهنویسی دارم. به تاریخنگاری و ثبت وقایع هم علاقهمندم. به همین خاطر در این دوره دیجیتال و Paperless بسیار به وردپرس علاقهمند شدم. غیر از تواناییاش در قدرت بخشیدن به بیش از نیمی از صفحات وب، به نوعی همه نیازهای نوشتن روزانه را برآورده میکند.
هشدار: متن طولانی منبع: این متن ترجمهای است از این مقاله سایت The Verge با کمی مخلفات اضافه.
از کتابهای مقدماتی کاربردی تا داستانهای کوتاه علمی-تخیلی
سایت دوستداشتنی The Verge (البته بعد از Ars Technicaی عزیزترین) پرونده ویژهای را در زمینه هوش مصنوعی کار کرده است که همینجا توصیه میکنم حداقل نگاهی به عنوان مقالههای آن بیاندازید. قطعا خواندنیهای جالبی را میتوانید آنجا بیابید. از میان همه آنها به نظرم این مطلب (که به معرفی برترین کتابهای هوش مصنوعی میپرداخت) هم به لحاظ محتوایی و هم به لحاظ فرصتی که داشتم، گزینه خوبی برای بازنشر بود. تنها کاری که علاوه بر ترجمه مقاله انجام دادهام این است که کتابها را هم از اینطرف و آنطرف اینترنت پیدا کرده و لیک دانلودشان را هم اضافه کردهام. امیدوارم به کارتان بیایند.
من عاشق برنامهنویسی و لینوکس و منبعباز هستم. و خب وقتی به همه اینها علاقهمند باشی و هکری بزرگ مثل «اریک ریموند» از چیزی تعریف کرده باشد، نمیتوانی در برابرش مقاومت کنی. توی گوگل پلاس دیدم که لینکی در مورد برنامهنویسی را به اشتراک گذاشته و تصمیم گرفتم ترجمهاش کنم.
اصل مطلب را میتوانید اینجا بخوانید و این هم ترجمهاش:
کد نوشتن درست شبیه جادوگری است. کلمات درست را به کار ببرید و وقایعی هیجانانگیز رخ خواهند داد، یا اتفاقاتی هولناک به وقوع خواهند پیوست.
تبدیل شدن به یک برنامهنویس بزرگ کار سادهای نیست، به زمان احتیاج دارد. من در اینجا ده توصیه برای برنامهنویسان تازهکار دارم که می تواند در طی کردن این مسیر به آنها کمک کند.
۱- وقت بگذارید
تبدیل شدن به یک برنامهنویس خوب به سالها زمان نیاز دارد، پس صبر داشته باشید. هر چقدر هم که باهوش باشید، نخستین پروژههای شما به یقین ضعیف خواهند بود. اگر هر روز کد مینویسید، ظرف پنج سال برنامهنویس قابل قبولی میشوید و پس از ده سال یک برنامهنویس خوب خواهید بود. و در نهایت پس از بیست سال ممکن است به شهرت و بزرگی برسید!
برنامهای نوشتم که میتونه تعدادی فایل تصویری رو بگیره (در واقع عکسهاتون رو انتخاب کنید و بکشید روی آیکن این برنامه) و همه اونها رو به فرمت jpg تبدیل کنه، ابعادشون رو به حداکثر ۸۰۰ پیکسل کاهش بده، کیفیت شون رو برای آپلود در وب تا حدود ۸۰ درصد پایین بیاره و بعد با اسمی که شما تعیین میکنید از نو نامگذاریشون کنه. این برنامه احتیاجی به نصب شدن نداره و میتونید از اینجا دانلودش کنید.
به نظرم رسید که این ابزار میتونه برای خیلی از بلاگرها به دردبخور باشه. به همین دلیل گفتم اینجا منتشرش کنم و در موردش بنویسم تا شاید هم به درد کسی بخوره و هم ایراد و اشکالهایی که خودم ندیدم، بهم نشون داده بشه.
گرچه خود ترجمه میلاد عزیز هم بسیار خوب بود، اما برای یک دست شدن این مطلب با سایر قسمتهایی که قبلا نوشته بودم، متن رو دوباره ترجمه کردم. ترجمه من از این کوان جدید را میتوانید در این آدرس پیدا کنید.
همه این کوانها هم مثل همیشه از منوی بالای صفحه در دسترس هستند. خواندن مقدمه این مجموعه مطالب هم بیفایده نخواهد بود. البته اگر حوصله و تم گیکی بیشتری دارید پیشنهاد میکنم به پادکست شماره ۳۲ رادیو گیک که جادی تهیه کرده و در آن ۱۰ کوان اول (که تا آن موقع ترجمه شده بودند) را خوانده گوش کنید.
در قسمت قبلی در مورد تجربههای برنامهنویسیام و سروکله زدن با گرافیکهای کمودور صحبت کردم. در این قسمت پایانی میخواهم در مورد زبان ماشین صحبت کنم و همچنین کتاب و ابزاری جانبی که کمک کردند تا درک بهتر و بیشتری از ماشینام داشته باشم. و در آخر از هکی صحبت خواهم کرد که آن را بیش از همه دوست دارم.
برنامهنویسی پیشرفته با Commodore 64 Programmers Reference Guide
در کلاسهای مدرسه و زمانی که با دوستان در مورد کامپیوترهایمان و بازیها و غیره حرف میزدیم، یکی از دوستان به کتاب «پیشرفتهای» اشاره کرده که به تازگی به دستش رسیده بود و دانش برنامهنویسی او را چندین پله ارتقا داده بود. با هزار خواهش و التماس توانستم آن را برای یکی دو روز امانت بگیرم. کتابی واقعی در کار نبود. کتاب واقعی را با فناوری فتوکپی (هنوز دستگاه به اصطلاح زیراکس که کیفیت بالاتری داشت همهگیر نشده بود و هزینه یک برگ زیراکس بیش از دو برابر فتوکپی بود!) تکثیر کرده بودند و در نبود صحافیهای سیمی و فنری، آن را با منگنه کتاب دوخته بودند. شما فقط باید تصور کنید که از جلدی که در تصویر زیر میبینید، چه اثر سیاه و سفیدی بر روی یک مقوای کرم رنگ نقش میبندد!
اما برخلاف ظاهر بدترکیب و مدت کوتاهی (کمتر از یک هفته) که آن را در اختیار داشتم، این کتاب تاثیر بسیار شدیدی روی دانش من از کامپیوتر (در مقیاس آن دوران) گذاشت. Commodore 64 Programmers Reference Guide در واقع کتاب مقدس برنامهنویسان کمودور بود:
مرجعی کامل برای درک کامل یک کامپیوتر.
چیزی که بعید میدانم در دنیای کنونی ما برای یک گوشی کوچک موبایل هم وجود داشته باشد. با این کتاب تازه فهمیدم که چیزی به اسم زبان ماشین هم وجود دارد. مفهوم IRQ و عملکردهای بیتی AND و OR را فهمیدم و مفاهیم پوینتر و ذخیره آدرس دو بایتی و بسیاری چیزهای دیگر را درک کردم. بارهای اولی که بازیهای کمودور را LOAD میکردم با تصور اینکه با خواندن کد برنامه میتوانم آن را درک کنم و تغییر دهم، دستور LIST را اجرا میکردم تا برنامه بازی را ببینم و غالبا تنها با یک خط روبرو میشدم:
10 SYS 2061
بعد از خواندن کتاب تازه فهمیدم کل برنامه بازی به زبان ماشین در حافظه سیستم بار شده و این دستور تنها کنترل اجرا را به روالی در آدرس 2061 منتقل میکند. اما چرا 2061؟
صرفهجویی در حافظه، برنامهای که خودش را تغییر میداد
در همین کتاب خواندم که کمودور باز هم برای صرفهجویی در حافظه، هیچگاه مانند کامپیوترهای دیگر سورس برنامه را به صورت متن نگهداری نمیکند. بلکه هر یک از کلمات کلیدی و عملگرها و غیره را با یک کد عددی یک بایتی جایگزین میکند. فکر میکنم شروع این اطلاعات از آدرس ۲۰۴۹ حافظه بود. به این ترتیب هر خط دستور مانند
10 FOR I=1 TO 100
به جای اینکه با احتساب فضاهای خالی ۱۷ کاراکتر جا بگیرد، تبدیل میشد به ۹ بایت کد. دو بایت برای شماره خط، دو بایت برای آدرس شروع خط بعدی، یک بایت کد FOR، یک بایت I، یک بایت علامت مساوی، یک بایت عدد ۱، یک بایت کد TO و یک بایت هم ۱۰۰. وقتی این را فهمیدم به این فکر افتادم که احتمالا میشود با چند دستور POKE و عوض کردن خانههای مناسب حافظه، خود کدهای برنامه در حال اجرا را عوض کرد به گونهای که در هر بار اجرا عملکردی متفاوت داشته باشد.
برنامهای برای این کار نوشتم و آنقدر با شماره خطها و علامتهای «:» اضافی (جدا کردن دستورات در یک خط) بازی کردم تا بالاخره تغییر محتویات آدرسها Syntax برنامه را خراب نمیکرد. حالا برنامهای داشتم که در یک بار اجرا عدد ۱ را چاپ میکرد و بار دوم عدد ۲ را و این کار را با متغیرها انجام نمیداد. سورس برنامه عوض میشد و اگر از آن LIST میگرفتم، هر بار لیستی جدید را به نمایش میگذاشت! البته هیچ کاربردی برای این برنامه متصور نبودم، اما همین الان با خواندن مطلب ویکیپدیا در مورد self-modifying code فهمیدم که چنین برنامههایی میتوانند کاربردهای جالبی داشته باشند!
احتمالا الان میتوانید حدس بزنید که ۲۰۶۱ از کجا آمده است. برنامه بیسیک تنها برای این نوشته شده بود که برنامه اصلی بازی به زبان ماشین را صدا بزند. برنامهنویسان هم برای حداکثر استفاده از حافظه، روالهای زبان ماشین را درست از اولین آدرس خالی بعد از کدهای بیسیک ذخیره کرده بودند.
به هر حال این کتاب و آشنایی با زبان اسمبلی و کدهای ماشین و خانههای حافظه باعث شد که به دنبال برنامه اسمبلر بگردم که البته پیشاپیش بگویم همانند بازیها و برنامههای خودتغییر، هیچگاه چیز خاصی از آن حاصل نشد! نخستین برنامههای اسمبلر را باید مثل همه برنامهها از روی کاست میخواندم، اما مشکل طولانی بودن بارگذاری و محدودیت امکانات باعث شد به سراغ ابزاری سریعتر و با قابلیتهای بیشتر بروم.
کارتریج ACTION-VI : دنیای جدید
در جستوجوی یک کارتریج اسمبلر به کارتریج اکشن ۶ برخورد کردم (که باز هم مطابق دید عموم مردم از کمودور ۶۴ به عنوان یک کنسول بازی) برای «نسوز کردن بازیها» مشهور شده بود. اما ابزاری بسیار قدرتمند بود و تواناییهایی بسیار بیشتر از اجرا کردن کدهای تقلب بازیها داشت.
این کارتریج یک برنامه اسمبلر سریع با خودش داشت. امکاناتی برای فرمت کردن و آمادهسازی دیسکتها، گرفتن نسخههای پشتیبان، دستکاری تنظیمات حافظه و نصب یک Fast Loader فراهم میکرد و از همه مهمتر سیستمی داشت که میتوانست محتوای حافظه RAM کمودور را به اصطلاح فریز کرده و بعد از ویرایش خانههای دلخواه دوباره کمودور را وادار به ادامه کارش کند. یکی از کلیدهایی که بالای کارتریج میبینید (معمولا سمت راستی) دکمه ریست است و دیگری دکمه فریز کردن حافظه. تصویر زیر صفحه آغازین کمودور را هنگام زدن کلید ریست این کارتریج نشان میدهد.
در این صفحه من هیچگاه از گزینه CONFIGURE MEMORY سر درنیاوردم و از آن استفاده نکردم. اما در قسمت UTILITIES یک اسمبلر سریع و راحت وجود داشت که با آن اسمبلی را هم کمی تجربه کردم.
بالن هوای گرم، با سرعت نور
اولین برنامه کاملی که با دستورهای اسمبلی نوشتم، اسپرایت بالن مشهور کمودور را در بالا سمت چپ صفحه نمایش میداد و سپس در یک حلقه هر بار یک واحد به x و y آن اضافه میکرد تا به سمت پایین سمت راست صفحه حرکت کند. البته اول اسپرایت را با برنامه اسپرایت ادیتوری که خودم نوشته بودم، ساختم و در خانههای حافظه گذاشتم و بعد با اسمبلر کارتریج مختصاتدهی آغازین و روال حلقه را پیاده کردم. بار اول با این که برنامه کامل و بیاشکال بود هیچ چیزی روی صفحه ظاهر نشد. بعد از چندین بار آزمایش و خطا فهمیدم که سرعت این برنامه به حدی زیاد است که بالن حرکت را انجام میدهد، اما من آن را نمیبینم.
برای کند کردن سرعت برنامه دو حلقه تو در توی ۲۵۶ تایی خالی را برای تلف کردن وقت داخل حلقه اصلی بازی گذاشتم تا موفق شدم بالن را ببینم. اما باز هم بالن با سرعت نور قطر صفحه را طی میکرد و برنامه تمام میشد. به این فکر افتادم که برنامه ۸ وزیر را برای سرعت بالا با اسمبلی بنویسم ولی سواد واقعی من در اسمبلی به چند دستور JMP و CMP و ADD محدود میشد که برای برنامهای پر از شرط و محاسبات مانند ۸ وزیر بسیار کم بود.
مالتی تسکینگ واقعی با IRQ
احتمالا میدانید که وقفهها یا IRQ (سرنام Interrupt ReQuest) روالهایی هستند که به صورت منظم و در فواصل زمانی مشخص توسط پردازنده کامپیوتر اجرا میشوند. دلیل این که وقفه نامیده میشوند این است که پردازنده در این فواصل زمانی برنامه در حال اجرا را متوقف کرده و روالهای IRQ را اجرا میکند و دوباره به سراغ برنامه اصلی باز میگردد. استفاده از وقفهها بیشتر به دردبرنامهنویسهای سیستم میخورد که توسط آنها تمام مدت ابزارهای جانبی را برای دریافت یا ارسال اطلاعات کنترل کنند یا در بازیها و برنامههای بیدرنگ (Real Time) شرطهای حیاتی را به صورت مداوم چک کنند. مثلا سیستم پیشفرض کمودور از یکی ازهمین وقفهها برای نمایش مکاننمای چشمکزن استفاده میکرد.
برای امتحان کردن این قابلیت عجیب هم تنها هنری که توانستم به خرج دهم این بود که روالی را به اسمبلی نوشتم که دایما بیتهای کنترلی کلیدهای SHIFT و CONTROL را تست میکرد و در صورت فشرده شدن این کلیدها به ترتیب رنگ زمینه متن و رنگ حاشیه آن را عوض میکرد. این چیزی بود که در جمع دوستان هم کسی به سراغش نرفته بود و برای همهمان جذاب بود که سیستم در عین حالی که وظایف معمولش را انجام میدهد، بدون هیچ کد مریی کار دیگری را هم به صورت همزمان در دست اجرا دارد.
هک آخر، بازی دوستداشتنی
و اما آخرین و از دید خودم جذابترین هکی که انجام دادم، به قابلیت فریز کردن حافظه کمودور توسط کارتریج اکشن ۶ مربوط بود و بازی Arkanoid که در قسمت اول از آن صحبت کردم. اندکی پس از شروع بازی، کلید فریز را میزدم و وارد منوهای اکشن ۶ میشدم. آنجا گزینهای برای نسوز کردن بازی وجود داشت. سیستم کار به این شکل بود که یک بار محتویات حافظه را بررسی (یا ذخیره) میکرد. بعد از شما میخواست به بازی برگردید و عمدا یک بار ببازید و دوباره حافظه را فریز کنید. وقتی این کار را میکردید دوباره حافظه را چک میکرد تا ببیند محتویات کدام خانهها عوض شده است. معمولا با همان یک بار و گهگاه با دوبار تکرار این فرآیند خانهای که اعداد مربوط به «جان» کاراکتر بازی در آن ذخیره شده بود پیدا میشد و کارتریج از آن به بعد محتویات آن خانه را ثابت نگه میداشت. یعنی بازی شما دیگر نسوز شده بود!
اما باز هم بازی کردن ۳۲ مرحله Arkanoid با احتساب هر مرحله ۲ یا ۳ دقیقه، آن هم بدون SAVE کلی زمان میبرد. هک اصلی این بود که من بعد از نسوز کردن بازی به سراغ محتویات حافظه تصویر میرفتم و آنها را پاک میکردم. اگر خاطرتان مانده باشد در قسمت قبلی گفتم که پسزمینهها و برخی اجزای بازیها با فونتها ساخته میشدند. من چیزی مانند دستور cls را اجرا میکردم و خلاص! همه آجرها از بین رفته بودند. فقط کافی بود در هر مرحله یک بار فریز کنم، حافظه تصویر را پاک کنم و بعد از برگشت به بازی عمدا بسوزم.
غول مرحله آخر
جانهایم که تمام نمیشد، اما بعد از سوختن و شروع مجدد مرحله، کامپیوتر متوجه میشد که تمام آجرها پاک شده و من به مرحله بعد میرفتم! تنها در برخی مراحل که حریفهای متحرک هم وجود داشتند، مجبور بودم نهایتا ۵ یا ۶ ضربه موفق (به آن اسپرایتها) بزنم تا آن مرحله هم تمام شود. فقط مرحله آخر بود که در ساخت غول آن از اسپرایت و آجر و غیره خبری نبود و این مرحله را باید حتما به صورت عادی رد میکردم. به این ترتیب من تقریبا در ۹۰ درصد اوقات بازی را تا آخر تمام میکردم و بلند میشدم! باید اعتراف کنم این کار به خصوص در جمعهای فامیلی، باعث میشد حس یک گیک تمام عیار را داشته باشم!
پایان داستان
شاید شما هم کنجکاو باشید که بر سر این ابزار عزیز چه آمد! واقعیت چندان هم جذاب نیست! حدود سال ۸۱ بود، ده سال از خرید کمودور میگذشت و در دوران پادشاهی پنتیوم ۲ و ۳ مدتها بود سراغش نرفته بودم. آن زمان هم هیچگاه فکر نمیکردم چنین حس نوستالژیکی نسبت به این اولین کامپیوترم پیدا کنم. به همین دلیل آن را با همه کارتریجها و نوارها و دستههای بازی در اصفهان به قیمت ۱۰۰۰۰ تومان فروختم. کاری که اکنون حس میکنم از انجامش به شدت پشیمانم!
بعید می دانم کسی از خوانندگان علاقهای به آزمودن سیستمی به این قدمت داشته باشد، اما اگر دوست داشتید کمی با پیرمردهای عصر کامپیوتر و نیای بزرگ پیسیها سروکله بزنید میتوانید یک امولاتور خوب را در این آدرس بیابید. بازیهای بسیاری در این آدرس موجود است و برنامهها را هم با کمی جستوجو در سایتهای طرفداران کمودور (مثل این) پیدا خواهید کرد.
به هر حال در این چهار پست، با پررنگترین خاطرات من از آن دوران خوش همراه بودید. حداقل در لحظهای که این مطالب را مینویسم فکر نمیکنم هیچ ابزار، سرگرمی، کامپیوتر یا چیز دیگری تا این اندازه برایم خاطرهانگیز بوده باشد یا از این به بعد هم بتواند باشد. اما از کجا معلوم، شاید ۲۰ سال دیگر خاطره نوشتن همین پست هم داستانی نوستالژیک باشد که برای نسلی کوچکتر تعریف میشود.
تا آن زمان، با ماشینهایتان خوش باشید و لذت ببرید!
بعد از دو بخشی که اشارهای داشتند به سختافزار و نرمافزار در آن دوران خوش گذشته، میخواهم از عمیقترین لذتها و یادگیریهای آن دوره حرف بزنم. از لذت برنامهنویسی و سر و کله زدن با ماشینها، چیزهایی که احتمالا بسیاری از گیکها موافق خواهند بود که تجربههای ناب هک به معنای واقعی (و نه مفهوم عام و هالیوودی آن) هستند. (اگر هنوز هم فکر میکنید هک یعنی به دست آوردن دسترسی غیرمجاز روی یک سیستم، بهتر است این مطلب را به صورت کامل بخوانید و اگر فرصت کردید به این پادکست هم گوش بدهید.)
بد نیست همین ابتدای کار هم بگویم که این دو مقاله طولانی آخر پر است از جزییات فنی و توضیحات یک سیستم کامپیوتری که الان دیگر باید در موزهها به دنبالش بگردید و اگر شما نمیدانید IRQ چیست، اسمبلی به چه دردی میخورد و یا اصلا برنامهنویسی را دوست ندارید، مطالب بسیار جذابتری را میتوانید روی اینترنت برای خواندن پیدا کنید.
پیش از همه باید اعتراف کنم که من هم مثل تمام هم سن و سالهایم در آن دوران، بیشتر از هر کار دیگری با کمودورم بازی کردهام. تجربههایی که قصد دارم اینجا شرحشان دهم، بیشتر مدیون کلاسهای کامپیوتری هستند که مدرسه ما از سوم راهنمایی به اجبار برای دانشآموزان برگزار میکرد و همینطور مدیون جمع کوچکی از دوستان که همهشان مثل من از سروکله زدن با سیستمهای کامپیوتری لذت میبردند.
به هر صورت اینها به یادماندنیترین تجربههایی هستند که من ۲۰ سال پیش با ابزار محاسباتی آن دوره داشتهام.
حلقههای تو در تو: هشت وزیر در یک بعدازظهر تابستانی
پیش از خریدن کمودور برنامهنویسی بیسیک را کموبیش بلد بودم. همانطور هم که پیشتر گفتم اولین برنامهای که روی کمودور نوشتم چاپ اعداد یک تا ده بود. اما نخستین تجربه جدی برنامهنویسیام به مساله ۸ وزیر شطرنج برمیگردد. این مساله را در یکی از روزهای تابستان از زبان یکی از آشنایان که در خارج از کشور کامپیوتر میخواند شنیدم.
همان روز دست به کار شدم و الگویتم حل مساله را به سادهترین و البته ابلهانهترین شکل ممکن نوشتم. ۸ حلقه تودرتوی FOR که به ترتیب موقعیت وزیرها را در هر سطر مشخص میکرد. در نهایت در دل داخلیترین حلقه کنترل میکردم که آیا این وزیرها یکدیگر را تهدید میکنند یا نه. با توجه به این که امتحان کردن این ۱۶ و خوردهای میلیون حالت برای کمودور با پردازنده ۴ مگاهرتزی و زبان BASIC V2 مدت مدیدی طول میکشید، برنامه را طوری نوشته بودم که با پیدا شدن اولین جواب تمام شود. به نتیجه رسیدن این برنامه یک ظهر تا شب تمام وقت گرفت و من بیش از هر چیز دیگری باید شکایتهای سایر اعضای خانواده از اشغال بودن تلویزیون را تحمل میکردم! البته جواب هم چیزی گرافیکی مانند تصویر بالایی نبود، بلکه ۸ عدد (نشانگر موقعیت وزیرها در ۸ ردیف افقی) بود که در ۸ سطر روی صفحه تلویزیون چاپ شد. آنها را روی کاغذ یادداشت کردم و روی صفحه شطرنج واقعی مهرهها را چیدم.
هوش مصنوعی برای کمودور ۶۴؛ واقعا؟
هوش مصنوعی و کمودور ۶۴؟ این یکی دیگر برای خودم هم باور کردنی نبود. در آن سالها مرکز آموزش انفورماتیک شرکت داده پردازی ایران سری کتابهایی را در حوزه انفورماتیک منتشر میکرد. سه کتاب اول «انفورماتیک چیست؟»، «انفورماتیک در جهان» و «انفورماتیک از دیدگاه توسعه» نام داشتند. کتاب چهارم اما چیزی بسیار متفاوت بود.
کتاب «مبانی هوش مصنوعی برای کمودور ۶۴» ابتدا به تعریف هوش مصنوعی و صحبت از تورینگ و . . . میپرداخت و بعد به تدریج با جهتگیری به سمت بازیها، رفتارها و خودگردانها، پردازش زبان طبیعی، تشخیص الگوها و سیستمهای مکاشفهای برنامههای هوشمندتری را به نمایش در میآورد که همه با همان بیسیک بدوی کمودور ۶۴ نوشته شده بودند. معماهای کلاسیکی چون برجهای هانوی، گشت زدن اسب روی صفحه شطرنج و چیزی شبیه برنامه مشهور الیزا (که قبلا هم در مورد آن نوشتهام) از جمله نمونههایی هستند که خط به خط روی کمودور تایپ و اجرا کردم. هرچند از شیوه کار آن برنامه شبه الیزا نه آن زمان و نه حتی الان به درستی سر در نیاوردم. یکی از برنامههای دیگری که خاطره شفافی از آن دارم، برنامهای بود که مشخصات یک لابیرنت را به صورت پر و خالی بودن خانههای یک صفحه شطرنجی میگرفت و با وارونه کردن راهحل (حذف خانههای بنست به جای امتحان کردن راههای باز) در نهایت مسیر درست را پیدا میکرد.
گرافیک: اشباح و کاراکترها
کمی بعد و البته در حین کار با برنامههایی که فقط منطق برنامهنویسیشان مهم بود، به گرافیک و رنگها هم علاقهمند شده بودم. دوست داشتم حالا که منطق کار این سیستم را میفهمم، بتوانم برنامههایم را با ظاهری جذابتر و با رنگ و لعاب بیشتر همراه کنم. به همین دلیل تصمیم گرفتم به سراغ نوشتن یک بازی بروم. در کمودور ۶۴ و البته در غالب سیستمهای کامپیوتری (حتی نمونههای مدرن امروزی مانند گوشیهای هوشمند) وقتی بخواهید به سراغ بازی دوبعدی بروید، به دو چیز مختلف نیاز دارید. تصاویر متحرک (کاراکترها، گلولهها و . . . ) و تصویرهای ثابت یا همان پسزمینهها.
در کمودور ۶۴ مساله اول به کمک اسپرایتها حل میشد. نقشهایی گرافیکی شبیه یک آیکن که میتوانستند هر کجای صفحه ظاهر شوند و با تغییر مختصاتشان حرکت کنند. البته خود کامپیوتر هم برخورد آنها با یکدیگر یا با قسمتهای مختلف پسزمینه را کنترل میکرد.
اسپرایتها که هنوز در سیستمعامل مدرنی مانند آخرین نسخه Mac OSX Mavericks هم حضور دارند، در کمودور ۶۴ مستطیلهایی با ابعاد ۲۴ در ۲۱ خانه بودند. ۳ بایت در هر ردیف که باید نقاط پر و خالی آن را با ۱ و ۰ جایگزین میکردیم و بعد عدد را به مبنای ۱۰ میبردیم و آن را با دستور POKE در خانه حافظه متناظر با آن مینشاندیم. یادم هست که هنوز هیچ داستانی برای بازی در ذهن نداشتم و حتی نمیدانستم چند اسپرایت و به چه شکلهایی لازم دارم، اما فکر اینکه هر بار این مستطیل شطرنجی را بکشم و خانهها را پر کنم و تبدیل مبنا و . . . اذیتم میکرد. اکنون برنامههای طراحی اسپرایت زیادی وجود دارند که این کار را به سادگی انجام میدهند اما همه به تازگی با زبانهای جدید و صرفا برای کنجکاوی و یادآوری خاطرات نوشته شدهاند.
اما من آن زمان با 180 خط برنامه بیسیک، ادیتور اسپرایت خودم را نوشتم. این برنامه با جویاستیک کار میکرد و در سمت راست صفحه منویی برای انتخاب ابزار (نوشتن یا پاک کردن) و انتخاب رنگ داشت. البته به لحاظ گرافیکی از تصویر بالایی بسیار ضعیفتر بود! با حرکت جویاستیک نشانگر آن روی صفحه حرکت میکرد و با فشرده شدن تنها کلید جویاستیک خانه پر (یا خالی) میشد. بعد میتوانستم اطلاعات این اسپرایت را ذخیره کرده و در بازیام استفاده کنم. البته حتما باید اشاره کنم که بعد از تمام این کارها، هیچوقت به نوشتن بازی یا حتی داستان آن نرسیدم!
اما مساله دوم پسزمینهها بودند که به علت محدودیتهای حافظه و امکانات پردازشی کمودور نمیتوانستند تصاویر معمولی باشند. کمودور حالت گرافیکی و به اصطلاح بیتمپ هم داشت اما گرافیک بیشتر بازیها از طریق دستکاری فونتها و نوشتن متن روی صفحه نمایش بوجود میآمدند. چیزی شبیه به ASCII ART اما به شدت قدرتمندتر. برای درک بهتر، بد نیست اول نگاهی به PETSCII ها بیاندازید که معادل کدهای ASCII در کمودور بودند، بعد به این تصویر که کلیدهای کمودور را از نزدیک نشان میدهد دقت کنید.
با نشانههایی که کمودور به عنوان فونت و متن میشناخت، کافی بود اگر میخواهید دایرهای ترسیم کنید کلید کمودور را نگه دارید و در سطر اول U و I و در سطر دوم هم J و K را تایپ کنید تا با ترکیب چهار ربع دایره شکل شما کامل شود. حال اگر در نظر بگیرید که در کمودور ۶۴ میشد به سادگی علامتهای کلیدها را تغییر داد و جایگزین کرد به تصویر کلی دست پیدا میکنید. هر بازی در ابتدا مجموعهای فونت طراحی کرده و با آنها صحنه بازی را میساخت. مثلا یک کاراکتر را طوری تغییر میداد که با تکرار آن روی صفحه نمایش ظاهری شبیه آجر دیده شود و از آن برای ساخت یک دیوار استفاده میکرد. حال اگر قرار بود دیوار خراب شود کافی بود کاراکترها از روی صفحه نمایش پاک شوند! و البته اگر تا اینجای مطلب را خواندهاید میدانید که کار با متنها و کاراکترها برای کامپیوتر هزاران بار سادهتر از گرافیک است. کمی بعدتر میگویم که از این موضوع چطور برای تقلب در بازی Arkanoid استفاده میکردم.
ابتدا قصد داشتم تمام داستانهای برنامهنویسی و . . . را در قالب یک پست بیاورم. اما به دلیل طولانی شدن مطلب، آن را به دو قسمت تقسیم کردهام. در قسمت بعدی از کارتریج اکشن ۶، زبان اسمبلی، برنامههایی که خودشان را تغییر میدادند و چیزهایی مشابه حرف خواهم زد.
فناوری میتواند و باید زندگی را برای انسان سادهتر کند. بیشک این حداقل چیزی است که غالب ما از فناوری انتظار داریم. اما فناوری (یا بهتر بگوییم فناوران) گاه نیز برای برداشتن گامی کوچک در راستای این هدف به عمد یا از روی اشتباه، اصل اساسی زندگی انسانی یعنی آزادی را نقض میکند، حق انتخاب و تجربه را از بین برده و خلاقیت را میکشد و سعی میکند فکر و ذهن ما را شکل دهد. فناوری گاه قفسهایی خواستنی میسازد و به بند میکشد.
همانگونه که رسم هر ساله ماهنامه شبکه و البته سایر نشریات حوزه فناوری (+) است، با نزدیک شدن سال نوی میلادی، در پروندهای مفصل به استقبال فناوریهای آینده رفتهایم و از رویاهایمان سخن گفتهایم. اما به نظرم در کنار همه آنها باید به بررسی رویداهای گذشته نیز پرداخت و با دقت ابعاد و آثار آنها را در زندگی روزمره انسانها بررسی کرد. من از این یادداشت به عنوان فرصتی استفاده خواهم کرد تا به جای صحبت از آینده، از گذشته صحبت کنم. از میان تمام رویدادهای حساس سال ۲۰۱۳ (که عجب سالی بود!) سه مورد از مهمترینهایی را انتخاب کردهام که به نظرم بیشترین تاثیر را در رهایی از آن زندانهای فناورانه داشتهاند.
موضوع این نیست که مهمترین رقبای IE به رایگان و به سادگی از طریق اینترنت قابل دانلود و نصب هستند. مهم این است که حتی در زمینهای ساده مانند مرورگری که استفاده میکنیم، حق انتخاب باید وجود داشته باشد. البته از آن مهمتر این که حق انتخاب باید «واضح و آشکار» باشد. چه بخواهیم و چه نخواهیم فناوری به جزیی جداییناپذیر از زندگی روزمره همه انسانها تبدیل شده است. این جاست که باید به گروهی که در این زمینه تبحر کافی ندارد نیز یادآوری شود: حق انتخاب تو محفوظ است، حتی اگر ندانی چیزی که انتخاب میکنی چیست و گزینههایت چه قوت و ضعفهایی دارد.
به عبارت دیگر این سرویسدهندهها اجازه اعمال هیچ تغییری در ترافیک کاربران را نخواهند داشت. از بلوکه کردن دامنهها و سایتها خبری نخواهد بود و سرعت در هنگام استفاده از پروتکلهای بیتتورنت تغییری نخواهد کرد. شکلدهی ترافیک یا Traffic Shaping هم از میان خواهد رفت یعنی فرقی نمیکند که کاربر ویدیویی را از سایتی در یک جای دیگر دنیا تماشا کند، بیتتورنت دانلود کند، متن بخواند یا از سایتی متعلق به خود سرویسدهنده استفاده کند. در همه حالتها سرعت و کیفیت اتصال کاربران به شبکه باید یکسان مانده و حفظ شود. افراد نباید در استفاده از فناوری به شیوهای خاص یا به استفاده از محصولات گروهی خاص محدود باشند. کاربران باید آزاد باشند به هر شکلی که میخواهد از ابزارهای فناورانه استفاده کنند و این قانون به یقین آزادی بزرگی است که نصیب کاربران اروپایی شده است.
فکر کنم غالب شما هم از شنیدن دعاوی مربوط به پتنت و کپیرایت خسته شده باشید. ناکارآمدی هر دوی این موارد کموبیش اثبات شده است و با توجه به چالشها و پیچیدگیهای فناوری کنونی، هر دو به بازنگریهای جدی احتیاج دارند. البته این ناکارآمدی در مورد پتنتها بسیار شدیدتر و آزاردهندهتر است. مشکل اینجا است که هر کس میتواند با پول کافی و حتی بدون داشتن نمونه یا محصول فیزیکی یا حتی مجازی، ایده یا ابزاری را پتنت کند. توسعهدهندهای را تصور کنید که بعد از کاری سنگین و فشرده نرمافزاری را تهیه میکند و پس از اتمام کار متوجه میشود پتنتهای چیزی که او ساخته است را کسی پیشتر ثبت کرده و اکنون در بهترین حالت میخواهد در سود ناشی از آن شریک شود. چنین موردی بدترین شیوه نابود کردن خلاقیت و تولید است و انگیزه را از بین میبرد. اما این اتفاق حداقل در نیوزیلند دیگر تکرار نخواهد شد. دولت نیوزیلند ابتدا اعلام کرد که دیگر پتنت نرمافزاری جدیدی را ثبت نخواهد کرد و البته کمی بعدتر با گستردهتر کردن دامنه اثر این قانون، کل پتنتهای نرمافزاری را باطل کرد تا به این ترتیب اندیشههای خلاق و تولیدکنندگان محصولات جدید در راستای تحقق اهدافشان موانع کمتری پیش رو داشته باشند.
به هر حال هدفم این بود که یادآوری کنم در عین بهره بردن از نعمات و مزیات فناوریهای جدید باید با دیدی کلیتر و جامعتر مواظب باشیم که در ازای آسایش کسب شده چه چیزهایی را قربانی میکنیم. نمیدانم چرا اینجا نیز مانند برخی دیگر از یادداشتهایم به یاد آسیموف فقید و سه گانه روباتهایش میافتم. آنجا که آر. جیسکارد رونتلوف در لحظههای آخر «حیات»اش قانون صفر را به آر. دنیل اولیواو میآموزد. قانونی که آموختنش برای رونتلوف به قیمت «جان»اش تمام شده است. قانونی که میتوان آن را در جنبههای مختلف زندگی تعمیم داد:
«همیشه حفظ بشریت [حق آزادی، انتخاب، اشتباه]، از حفظ جان [مال، آسایش، سود] یک انسان مهمتر است.»
حتی اگر از خورههای اپل هم نباشید احتمالا رویدادهای مهم و اصلی مربوط به این شرکت را دنبال میکنید. آخرین موردی هم که به احتمال زیاد به آن توجه کردهاید، عرضه نسخه جدید سیستمعامل مکینتاش (OS X) با نام ماوریکس است. به هر حال بررسی و نقد بسیار مفصل جان سیراکوزا که به رسم همیشگی همزمان با عرضه این سیستمعامل در آرستکنیکا منتشر شد، یکی از آن مطالبی است که حتی اگر به اپل علاقهمند نیستید بواسطه تحلیلها و توصیفهای فناورانهاش، نباید آن را از دست بدهید.
فارغ از تمام ویژگیهای فنی و اصلاحات زیباییشناسی، نکتهای که برای من جالب و جذاب بود معرفی فریمورک جدیدی به نام SpriteKit بود که به برنامهنویسان کمک میکند اشیاء متحرکی را روی صفحه به نمایش درآورده و موقعیت هریک و برخوردهای آنها را با هم کنترل کنند. گرچه برخی از امکانات این فریمورک پیش از این در Core Animation سیستمعامل OS X وجود داشت، اما کاربرد اصلی این اسپرایتها یا اشباح در حوزه بازیسازی خواهد بود که وابسته به اشیایی (از شخصیتها تا گلولهها و . . .) است که دایما در حال حرکت هستند. گرچه تجهیزات موبایل اپل اکنون تقریبا به یکی از پرکاربردترین پلتفرمهای بازیهای دیجیتال تبدیل شدهاند، اما سیستمهای دسکتاپ اپل هنوز در این زمینه حرف چندانی برای گفتن ندارند و هنوز غالب عناوین سنگین و حرفهای سکوهای ویندوزی را هدف میگیرند. عرضه این فریمورک شاید قدم اول در راه حل این مشکل باشد. البته نباید به این زودی منتظر تحول شدیدی در این زمینه باشیم.
به هر حال خواندن این ویژگی جدید، ابتدا من را به یاد کمودور ۶۴ و دوران ابتدایی آشنایی من با کامپیوترها انداخت. آنجا اسپرایتها مستطیلهایی به ابعاد ۲۴ در ۲۱ پیکسل بودند که باید روشن و خاموش بودن هر گروه هشتتایی از این 504 پیکسل را با دستور POKE در یک بایت حافظه متناظر با اسپرایت ذخیره میکردیم. برای کنترل برخورد آنها هم با استفاده از یک IRQ به صورت دایم مقدار یک خانه از حافظه را میخواندیم و با صفر و یک شدن بیتها، میفهمیدیم کدام یک از اسپرایتها با هم یا با بخشی از تصویر در پسزمینه برخورد کردهاند. ابزاری که به کمک آن تصویری ساده از یک بالن را در پسزمینه ابیرنگ سیستم به حرکت در میآوردم.
دومین چیزی که ذهن من را به خود مشغول کرد این بود که احساس کردم بسیاری از فناوریها و تکنیکهای قدیمی در حال بازگشت به دنیای مدرن محاسبات هستند. آن چه در این عرصه در حال رخ دادن است، به نظر میرسد بازگشت به گذشته با فناوریهای جدیدتر است. مثلا در طلوع عصر محاسبات با ترمینالهای گنگ به مینفریمها متصل میشدیم و دستورالعمل محاسباتمان را به کامپیوتری قدرتمند (براساس مقیاسهای آن دوره) میسپردیم و نتیجه را دریافت میکردیم. در آن زمان هر سختافزاری اگر نگوییم با سیستمعامل، اما با نرمافزار اختصاصی خودش عرضه میشد. انقلاب کامپیوترهای شخصی در کنار همه چیزهای دیگر، این دو وضعیت را تغییر داد. نخست این که ماشینمان را خودمان انتخاب و سرهم کرده و بعد نرمافزار واحدی به نام سیستمعامل را روی آن نصب میکردیم و پس از آن همه ما صرفنظر از «کارایی سختافزاری سیستم» با تجربه کاربری یکسانی روبرو میشدیم. پس از آن محاسباتمان را هم از مینفریمها پس گرفته و به دستگاههای شخصیمان بازگرداندیم. این روند تا مدت زیادی جریان غالب دنیای محاسبات بود.
اما مدتی است که دوباره با اتکا به فناوریهای جدید در حال بازگشت به همان پارادایمها هستیم. با رواج تجهیزات دیجیتال همراه که اکنون به واسطه توان نسبتا کمتر سختافزاری نقش همان ترمینالهای گنک را بازی میکنند (بماند که شاید به لحاظ سختافزار از مینفریمهای پیشین هم قویتر باشند)، محاسباتمان را دوباره به مینفریمهایی این بار در ابرها سپردهایم. حتی غالب دادههایمان هم در همان فضای ابری ذخیره میشوند. دوباره ایده نرمافزار اختصاصی برای هر سختافزار جان گرفته است و این بار حتی مدیران شرکتی که روش اصلی کسب درآمدش فروش مجوز سیستمعامل برای سختافزارهای گوناگون بود، پرچم «هماهنگی سختافزار و نرمافزار» را دوباره علم کرده است.
این موضوع حتی به اینترفیس و ظاهر نرمافزارها هم نفوذ کرده است. کسانی که با نرمافزاری مثل Turbo C از زمان داس و ویندوز ۳.۱ یا نمونههای مشابه کار کرده باشند، احتمالا شباهت بینظیری را بین منوهای آن نرمافزار و نوار منوی کنونی Visual Studio (که همه با حروف بزرگ و پسزمینهای تخت دیده میشوند) احساس خواهند کرد.
در نهایت، با توجه به این که جای بررسی کامل سیستمعامل جدید اپل در این شماره خالی است، مطلب اصلی را در آرستکنیکا مطالعه کنید. جزییات فنی نحوه افزایش طول عمر باتری بسیار جذاب است، به سیستم جدید پشتیبانی از چند نمایشگر توجه کنید و تغییرات پوسته ظاهری سیستمعامل را ببینید و در عین حال به این فکر کنید که در آینده کدام پارادایمهای قدیمی را ممکن است در قالب نامی جدید و با فناوریای تازه دوباره به عنوان هایپ و کمی بعد استاندارد دنیای محاسبات ببینیم.
هنگامی که سه روز بگذرد و برنامهای نوشته نشود، زندگی معنای خود را از دست خواهد داد.
این بخشی از کتاب تائوی برنامهنویسی است که در سال 1987 توسط جفری جیمز به رشته تحریر درآمده است. این کتاب نیمه طنز، مجموعهای از حکمتها و گفتههای کوتاه است که در قالب نه بخش یا «نه کتاب» طبقهبندی شدهاند. این داستانها و حکمتها به بیان ایدهآلهای هکری در دنیای برنامهنویسی میپردازند. ترجمه فارسی این کتاب را میتوانید از کلبه آیدین دریافت کنید. در آینده درباره بخشهای دیگری از این کتاب خواهم نوشت.