Note G
نوٹ جی ایک کمپیوٹر الگورتھم تھا جسے اڈا لویلس نے لکھا تھا، اور اسے فرضی تجزیاتی انجن کا استعمال کرتے ہوئے برنولی نمبروں کا حساب لگانے کے لیے ڈیزائن کیا گیا تھا۔ نوٹ جی کو عام طور پر خاص طور پر کمپیوٹر کے لیے پہلا الگورتھم سمجھا جاتا ہے، اور اس کے نتیجے میں لویلس کو پہلا کمپیوٹر پروگرامر سمجھا جاتا ہے۔ الگورتھم A سے G کے نام سے ایک سیریز کا آخری نوٹ تھا، جسے اس نے لوئیگی مینابریا کے 1842 کے فرانسیسی نقل کے انگریزی ترجمہ کے ساتھ ساتھ ٹیورن یونیورسٹی میں تجزیاتی انجن پر چارلس بیبیج کے لیکچر، "نوشنز سر لا مشین اینالیٹک ڈی چارلس بیبیج" ("چارلس بیبیج کی تجزیاتی مشین کے عناصر") کے ساتھ بصری معاون کے طور پر استعمال کیا۔ لویلس کے نوٹ جی کا کبھی تجربہ نہیں کیا گیا، کیونکہ انجن کبھی نہیں بنایا گیا تھا۔ اس کے نوٹ، اس کے ترجمے کے ساتھ، 1843 میں شائع ہوئے۔ جدید دور میں، زیادہ آسانی سے دستیاب کمپیوٹنگ آلات اور پروگرامنگ وسائل کی بدولت، لویلس کے الگورتھم کا جدید پروگرامنگ زبانوں میں "ترجمہ" ہونے کے بعد تجربہ کیا گیا ہے۔ ان ٹیسٹوں نے آزادانہ طور پر یہ نتیجہ اخذ کیا ہے کہ اسکرپٹ میں ایک بگ تھا، ایک معمولی ٹائپگرافیکل غلطی کی وجہ سے، الگورتھم کو اس کی اصل حالت میں ناقابل استعمال بنا دیتا ہے۔ 1840 میں، چارلس بیبیج کو ٹورین میں اپنے تجزیاتی انجن پر ایک سیمینار دینے کے لیے مدعو کیا گیا، یہ واحد عوامی وضاحت تھی جو انہوں نے انجن پر دی تھی۔ بیبیج کے لیکچر کے دوران، ریاضی دان لوئیگی مینابریا نے فرانسیسی زبان میں انجن کا ایک بیان لکھا۔ بیبیج کے ایک دوست، چارلس وہیٹ اسٹون نے مشورہ دیا کہ تعاون کرنے کے لیے، لویلس کو مینابریا کے بیان کا ترجمہ کرنا چاہیے۔ بیبیج نے مشورہ دیا کہ وہ ضمیمہ کے ساتھ اکاؤنٹ میں اضافہ کریں، جسے انہوں نے اپنے ترجمہ کے آخر میں اے-جی لیبل والے سات "نوٹوں" کی سیریز کے طور پر مرتب کیا۔ اس کا ترجمہ اگست 1843 میں ٹیلر کی سائنسی یادداشتوں میں شائع ہوا، جس میں لویلس کے نام پر "اے اے ایل" کے دستخط کیے گئے تھے۔ ان نوٹوں میں، لولیس نے بیبیج کے تجزیاتی انجن کی صلاحیتوں کو بیان کیا اگر اسے کمپیوٹنگ کے لیے استعمال کیا جائے، اور انجن کے لیے خود بیبیج سے بھی زیادہ مہتواکانکشی منصوبہ تیار کیا۔ مضمون کے لیے لویلس کے نوٹ مضمون سے تین گنا زیادہ لمبے تھے۔ پہلے نوٹوں میں، وہ ان عددی عزائم سے آگے کی کھوج کرتی ہے جو بیبیج کے مشین کے لیے تھے، اور تجویز کرتی ہے کہ مشین موسیقی، گرافکس اور زبان کے شعبوں سے نمٹنے کے لیے کمپیوٹیشن سے فائدہ اٹھا سکتی ہے۔ وہ قارئین کو بتاتی ہیں کہ کس طرح تجزیاتی انجن بیبیج کے پہلے کے فرق والے انجن سے الگ تھا، اور اس کے فنکشن کو جیکورڈ مشین سے تشبیہ دیتی ہے، جس میں اس نے مشین کی زبان کو ظاہر کرنے کے لیے بائنری پنچ کارڈ استعمال کیے تھے۔ نوٹ سی میں، اس نکتے کو اس حقیقت سے آگے بڑھایا گیا ہے کہ مشین کے ذریعے بیک وقت اور بار بار کیے جانے والے اقدامات کیے جا سکتے ہیں، اس بات کو یقینی بناتے ہوئے کہ کسی بھی کارڈ یا کارڈ کے مجموعے کو کسی ایک مسئلے کے حل میں کئی بار استعمال کیا جا سکتا ہے، بنیادی طور پر کنٹرول فلو اور لوپنگ کے جدید طریقوں کی توقع کرتے ہوئے۔ ان خیالات کو حتمی نوٹ، جی میں سر پر لایا گیا، جہاں لویلس نے حساب کی ایک مثال کا مظاہرہ کرنے کی کوشش کی۔ نوٹ جی نے صرف چار ریاضیاتی کارروائیوں کا استعمال کیا: اضافہ، گھٹاؤ، ضرب اور تقسیم، بیبیج کے وژن کا نفاذ: یہ بیبیج کے ڈسک کے کالموں میں معلومات کو محفوظ کرنے کے خیال کو بھی استعمال کرتا ہے، ہر ایک کو (متغیر کے لیے) اور ایک سبسکرپٹ نمبر سے ظاہر کیا جاتا ہے جس سے یہ ظاہر ہوتا ہے کہ کس کالم کا حوالہ دیا جا رہا ہے۔ فنکشن لویلس نے برنولی نمبروں کا حساب لگانے کے لیے ایک تکراری مساوات کا استعمال کیا، جس میں اس نے اگلے کو پیدا کرنے کے لیے مساوات میں پچھلی اقدار کا استعمال کیا۔ اس کا طریقہ اس طرح چلا: جہاں ایک بائنومیل گتانک ہے،۔ برنولی نمبروں کا حساب کئی طریقوں سے لگایا جا سکتا ہے، لیکن لویلس نے انجن کی طاقت کا مظاہرہ کرنے کے لیے جان بوجھ کر ایک وسیع طریقہ منتخب کیا۔ نوٹ جی میں، وہ کہتی ہیں: "ہم ان نوٹوں کو ان مراحل کی تفصیل سے پیروی کرتے ہوئے ختم کر دیں گے جن کے ذریعے انجن برنولی کی تعداد کا حساب لگا سکتا ہے، یہ اس کی طاقتوں کی ایک پیچیدہ مثال ہے۔" نوٹ جی میں لویلس کے ذریعہ استعمال کیا گیا مخصوص الگورتھم آٹھواں برنولی نمبر تیار کرتا ہے (جیسا کہ اس نے شروع کیا تھا)۔ نوٹیشن الگورتھم کی میز ہر کمانڈ کو ترتیب میں منظم کرتی ہے۔ ہر کمانڈ دو اصطلاحات پر کیے جانے والے ایک آپریشن کی نشاندہی کرتی ہے۔ دوسرے کالم میں کہا گیا ہے کہ صرف آپریٹر استعمال کیا جا رہا ہے۔ متغیرات کو "" کے طور پر نشان زد کیا جاتا ہے، جہاں اس سے پہلے کا سپر اسکرپٹ متغیر کو تفویض کی گئی مختلف اقدار کی مقدار کی نمائندگی کرتا ہے، اور اس کے بعد کا سبسکرپٹ متغیر کی آرڈینل اسائنمنٹ کی نمائندگی کرتا ہے، یعنی یہ کون سا متغیر ہے۔ (مثال کے طور پر، متغیر نمبر 4 کی دوسری تفویض سے مراد ہے۔ اب تک غیر متعین کسی بھی متغیر میں 0 کا سپر اسکرپٹ ہوتا ہے۔) متغیرات کو نمبر سے شروع کیا جاتا ہے۔ تیسرا کالم کمپیوٹر کو بتاتا ہے کہ بالکل کیا کمانڈ ہو رہی ہے، (مثال کے طور پر، لائن 1 پر، انجام دی گئی کمانڈ "" ہے-متغیر 2 کی پہلی تکرار متغیر 3 کی پہلی تکرار سے ضرب دی جاتی ہے۔) اور فی لائن دو اصطلاحات کے درمیان صرف ایک آپریشن شامل کرتا ہے۔ کالم 4-"نتائج حاصل کرنے والے متغیرات" نوٹ کرتا ہے کہ کالم 3 میں آپریشن کا نتیجہ کہاں محفوظ کیا جانا چاہیے۔ اس طرح، اس کالم میں موجود کسی بھی متغیر کے سپر اسکرپٹ نمبر میں ہر بار ایک اضافہ ہوتا ہے۔ (مثلا۔ لائن 1 پر، کا نتیجہ متغیرات کو تفویض کیا گیا ہے، اور۔) کالم 5 میں بتایا گیا ہے کہ آیا کمانڈ کے عمل میں استعمال ہونے والے متغیرات میں سے کسی ایک کو تبدیل کر دیا گیا ہے۔ گھوبگھرالی منحنی خطوط میں بند، فی کمانڈ دو قطاریں اصل متغیر کو مساوی نشان کے بائیں طرف رکھتی ہیں، اور نئے متغیر کو دوسری طرف-یعنی، اگر متغیر کو تبدیل کر دیا گیا ہے، تو اس کی سپر اسکرپٹ میں ایک اضافہ کیا جاتا ہے، اور اگر نہیں، تو یہ وہی رہتا ہے۔ (مثلا۔ لائن تین متغیر کے دوسرے تکرار کا نتیجہ تفویض کرتی ہے، اور پانچواں کالم نوٹ کرکے اس کی عکاسی کرتا ہے ؛ بدل گیا ہے، لیکن نہیں۔ کالم 6، "نتائج کا بیان" میں، کالم 4 میں متغیر کو تفویض کردہ نتیجہ پہلے سے تفویض کردہ دو اصطلاحات کی اقدار کی بنیاد پر اس کی صحیح قیمت میں دکھایا گیا ہے۔ (مثلا۔ لائن 1 پر-- شروع میں مقرر کیا گیا تھا، اور متغیر ہونے کے لیے مقرر کیا گیا تھا۔ لہذا، ریاضیاتی اشارے میں۔) یہ کالم بظاہر انجن کے ذریعہ شمار نہیں کیا گیا ہے، اور ایسا لگتا ہے کہ وضاحت اور پروگرام کے مراحل پر عمل کرنے کی قاری کی صلاحیت میں مدد کرنے کے لیے زیادہ ہے۔ (مثال کے طور پر، لائن 5 میں ایک حصہ ہے جسے دو سے تقسیم کیا جا رہا ہے، جسے نصف سے ضرب دیتے ہوئے نشان زد کیا جاتا ہے، شاید ہم آہنگی اور گھڑے ہوئے حصے کی ٹائپگرافیکل پیچیدگی کے لیے۔) یہ پروگرام، اور متغیرات سے باہر علیحدہ متغیر اشارے کا بھی استعمال کرتا ہے، جنہیں حتمی قدر تلاش کرنے کے لیے لگاتار ضرب دی جاتی ہے، اس طرح: اس کے علاوہ، ہر مسلسل کالم وقت کے ساتھ دیئے گئے متغیر کی اقدار کو ظاہر کرتا ہے۔ ہر بار جب کوئی متغیر یا تو تبدیل ہوتا ہے، یا اس کی قیمت موجودہ کمانڈ میں ایک اصطلاح کے طور پر اس کی موجودگی کے نشان سے متعلقہ ہو جاتی ہے، تو اس کی قیمت اس کے متعلقہ کالم میں بیان یا دوبارہ بیان کی جاتی ہے۔ بصورت دیگر، اس کی غیر مطابقت کو ظاہر کرنے کے لیے اسے ایلیپسس کے ساتھ نشان زد کیا جاتا ہے۔ یہ ممکنہ طور پر کمپیوٹر کی صرف متعلقہ معلومات کی ضرورت کی نقل کرتا ہے، اس طرح پروگرام کے تجزیہ کے طور پر متغیر کی قدر کا سراغ لگاتا ہے۔ طریقہ کار اس پروگرام کا حساب لگانے کی کوشش کی گئی جسے جدید کنونشن آٹھویں برنولی نمبر کے طور پر جانا جاتا ہے، جیسا کہ درج کیا گیا ہے، جیسا کہ لویلس گنتی شروع کرتا ہے۔ آپریشن 4 میں غلطی، جس تقسیم کے بارے میں خیال کیا جاتا ہے وہ ""، متغیر میں ذخیرہ کیا جانا ہے۔ تاہم، "نتائج کا بیان" کہتا ہے کہ تقسیم یہ ہونی چاہیے: درحقیقت، تقسیم غلط طریقہ ہے ؛ اس کی دوسری تکرار ہے، جیسا کہ آپریشن 2 میں دیکھا جا سکتا ہے۔ اسی طرح، کی دوسری تکرار ہے، جیسا کہ آپریشن 3 میں دیکھا جا سکتا ہے۔ اس طرح آپریشن 4 نہیں بلکہ ہونا چاہیے۔ اس بگ کا مطلب یہ ہے کہ اگر انجن کبھی اس حالت میں اس الگورتھم کو چلاتا ہے، تو یہ برنولی نمبروں کو صحیح طریقے سے تیار کرنے میں ناکام ہو جائے گا، اور اس کی حتمی ہدف قیمت معلوم ہوگی۔ جدید نفاذ لویلس کے پروگرام کو جدید پروگرامنگ زبان میں نافذ کیا جا سکتا ہے، حالانکہ مذکورہ بالا غلطی کی وجہ سے، اگر بالکل نقل کیا جائے تو یہ اس کے لیے غلط حتمی قدر واپس کرے گا۔ سڈوکوڈ میں عام کردہ اصل پروگرام اس طرح ہے: V [1] = 1 V [2] = 2 V [3] = n (لویلس کے پروگرام میں n = 4۔) V [4] = V [4]-V [1] V [5] = V [5] + V [1] V [11] = V [5]/V [2] V [13] = V [13]-V [11] V [10] = V [3]-V [1] V [7] = V [2] + V [7] V [11] = V [6]/V [7] اس کے علاوہ، لویلس کے پروگرام نے متغیرات کو صرف دو اصطلاحات پر اضافہ، گھٹاؤ، ضرب یا تقسیم انجام دے کر بیان کرنے کی اجازت دی جو پہلے سے متعین متغیرات تھے۔ جدید نحو ہر حساب کو زیادہ مختصر طور پر انجام دینے کے قابل ہوگی۔ یہ پابندی چند جگہوں پر واضح ہو جاتی ہے، مثال کے طور پر کمانڈ 6 () پر۔ یہاں لویلس خود ہی ایک غیر متعین متغیر () کی وضاحت کرتا ہے، اس طرح یہ فرض کرتے ہوئے کہ تمام غیر متعین متغیرات خود بخود 0 کے برابر ہیں، جہاں زیادہ تر جدید پروگرامنگ زبانیں غلطی کا جواب دیں گی یا متغیر کو صفر کے طور پر درج کریں گی۔ اس کا ارادہ "" تھا، لیکن اس نے خود کو صرف متغیرات کو اصطلاحات کے طور پر استعمال کرنے تک محدود کر لیا تھا۔ اسی طرح، کمانڈ 8 () میں، دو مدتی ریاضی کا سخت اشارہ پیچیدہ ہو جاتا ہے، جیسا کہ 2 کے طور پر بیان کرنے کے لیے، لویلس اپنی قدر (0) خود جمع (2) کو تفویض کرتا ہے۔ یہ اس پابندی والے اشارے کی وجہ سے ہے جس کی وضاحت اس طرح کی گئی ہے۔ نوٹ حوالہ جات ذرائع 1843 تعارف الگورتھم اڈا لویلس