میں ایرلنگ میں پروگرام کیوں کرتا ہوں۔

ایرلنگ ایک پچیس سالہ پروگرامنگ لینگویج ہے جس نے ابھی تک مقبولیت کا مقابلہ نہیں جیتا ہے ، اور تقریبا certainly یقینی طور پر رفتار کے لیے کوئی تمغہ نہیں جیتے گی ، نحوی خوبصورتی کے لیے کسی بھی ٹائر کو چھوڑ دیں۔ زبان دھیمی ، عجیب اور بدصورت ہے۔ ایرلنگ کوڈ کو ریفیکٹر کرنا درد ہے۔

پھر بھی تقریبا almost پانچ سالوں سے ، میں نے اپنے فارغ وقت کا ایک بڑا حصہ ایرلنگ میں گزارا ہے۔ اس مقام پر میں نے زبان کے ساتھ ایک ہزار سے زیادہ گھنٹے گزارے ہیں۔ میں نے لکھنے کے لیے زبان کا استعمال کیا ہے ، کسی نہ کسی تاریخی ترتیب میں ، ایک CSV تجزیہ کار (ہنس مت زبان پری پروسیسر ، ایک ویب فریم ورک ، اور ایک تقسیم شدہ پیغام کی قطار۔ مندرجہ ذیل زبان کے میرے تاثرات دوسری زبانوں کے مقابلے میں ہیں جو میں نے پیشہ ورانہ طور پر استعمال کی ہیں (C ، Java ، Perl ، PHP ، Ruby ، ​​Objective-C ، اور JavaScript)۔

ایرلنگ کے بارے میں اچھی خبر کا خلاصہ اس پر کیا جا سکتا ہے: ایرلنگ زبان اور پلیٹ فارم میں پچیس سال کے درست ڈیزائن فیصلوں کی انتہا ہے۔ جب بھی میں نے سوچا کہ ایرلنگ میں کچھ کیسے کام کرتا ہے ، میں جواب میں کبھی مایوس نہیں ہوا۔ میں تقریبا ہمیشہ یہ تاثر چھوڑتا ہوں کہ ڈیزائنرز نے “صحیح کام” کیا۔ میں سمجھتا ہوں کہ یہ جاوا کے برعکس ہے ، جو پیڈنٹک کام کرتا ہے ، پرل ، جو کہ گھٹیا کام کرتا ہے ، روبی ، جس میں غلط چیز کے دو آزاد نفاذ ہیں ، اور سی ، جو کچھ نہیں کرتا ہے۔

کچرا اکٹھا کریں۔ جب دوسری زبانوں میں کچرا اکٹھا کرنے کا وقت آتا ہے تو سارا نظام رکنا پڑتا ہے جبکہ کچرا جمع کرنے والا چلتا ہے۔ یہ نقطہ نظر بالکل ٹھیک ہے اگر آپ کے کمپیوٹر پروگرام کو ایک بار چلنا چاہیے ، کچھ آؤٹ پٹ لکھیں ، اور پھر چھوڑ دیں۔ لیکن طویل عرصے سے چلنے والی ایپلی کیشنز ، جیسے ڈیسک ٹاپ ، موبائل ، یا سرور پروگراموں میں ، اس حکمت عملی کے نتیجے میں کبھی کبھار منجمد UIs اور سست ردعمل کے اوقات ہوتے ہیں۔ دوسری طرف ایرلنگ پروگراموں میں ہزاروں آزاد ڈھیر ہوسکتے ہیں جو الگ الگ کچرا اکٹھا کرتے ہیں۔ اس طرح ، ردی کی ٹوکری جمع کرنے کی کارکردگی کا جرمانہ وقت کے ساتھ پھیلایا جاتا ہے ، اور اس طرح ایک طویل عرصے سے چلنے والی درخواست پراسرار طور پر وقتا فوقتا جواب دینا بند نہیں کرے گی جبکہ کچرا جمع کرنے والا چلتا ہے۔

یا سٹرنگ کنیکٹیشن لیں۔ اگر آپ پرل ، روبی ، یا جاوا اسکرپٹ میں سٹرنگ کنیکٹینیشن کے نفاذ کو کھولتے ہیں ، تو آپ کو ایک ifبیان ، a realloc، اور a ملنا یقینی ہےmemcpy. یعنی ، جب آپ دو ڈوروں کو جوڑتے ہیں تو ، پہلے ڈور کو دوسرے کے لیے جگہ بنانے کے لیے بڑھایا جاتا ہے ، اور پھر دوسرے کو پہلے میں کاپی کیا جاتا ہے۔ اس نقطہ نظر نے کئی دہائیوں سے کام کیا ہے اور یہ “واضح” کام ہے۔ ایرلنگ کا نقطہ نظر غیر واضح ہے ، اور ، مجھے یقین ہے ، درست ہے۔ معمول کے معاملے میں ، ایرلنگ بائٹس کی ترتیب کی نمائندگی کے لیے میموری کا ایک متوازی حصہ استعمال نہیں کرتا ہے۔ اس کے بجائے ، اسے “I/O فہرست” کہا جاتا ہے-میموری کے غیر متضاد حصوں کی گھریلو فہرست۔ نتیجہ یہ ہے کہ دو ڈور (I/O فہرستوں) کو جوڑنا O (1) ایرلنگ میں وقت لیتا ہے ، دوسری زبانوں میں O (N) وقت کے مقابلے میں۔ یہی وجہ ہے کہ روبی ، ازگر وغیرہ میں ٹیمپلیٹ رینڈرنگ سست ہے ، لیکن ایرلنگ میں بہت تیز ہے۔

اس سے کوئی فرق نہیں پڑتا ہے کہ آپ کی درخواست کی منطق کتنی ہی مسدود اور ہم آہنگ کیوں نہ ہو ، ایرلنگ میں بلاکنگ نیٹ ورک کال کرنا ، یا کئی OS کے عمل کو آگے بڑھانا ناممکن ہے۔ ڈیزائن کا یہ فیصلہ ایسا بناتا ہے کہ ایرلنگ سرور کبھی بھی آپریٹنگ سسٹم کو کریش نہیں کرے گا۔ پچھلی نوکری میں اوورلوڈ آپریٹنگ سسٹم سے کئی راتوں کی نیند ضائع ہونے کے بعد ، مجھے یقین ہے کہ ایرلنگ کا ہم آہنگی کا ڈیزائن درست ہے۔

میں نے ذکر کیا کہ ایرلنگ کوڈ کو ریفیکٹر کرنا درد ہے۔ خوش قسمتی سے ، میرے تجربے میں ایرلنگ کوڈ کو ریفیکٹر کرنا بہت کم ضروری ہے اسی طرح آبجیکٹ پر مبنی کوڈ کو وقتا فوقتا ریفیکٹرنگ کی ضرورت ہوتی ہے۔ ایرلنگ میں ، ہر فنکشن کو وہ تمام معلومات دی جاتی ہیں جن کی اسے ضرورت ہوتی ہے ، اور آپ کو ایک مرتب انتباہ ملتا ہے اگر اسے کوئی ایسی معلومات منظور کی جاتی ہے جس کی اسے ضرورت نہیں ہوتی۔ کچھ معنوں میں ، ریفیکٹرنگ ترقی میں مربوط ہے۔ یہ کوئی خاص سرگرمی نہیں ہے جس میں کافی ٹیسٹ کوریج اور کافی کے کئی برتنوں کی ضرورت ہوتی ہے۔ جاوا یا آبجیکٹیو سی کوڈ کو ریفیکٹر کرنا عام طور پر ضروری ہو جاتا ہے کیونکہ ایک کلاس میں بہت سارے مثال کے طریقے شامل کیے گئے ہیں ، اور ڈویلپر کو یہ معلوم کرنے میں وقت گزارنا ہوگا کہ کون سے طریقوں کی ضرورت ہے کہ مثال کے متغیرات اور کیریج کو آدھے حصے میں کیسے کاٹا جائے۔ یہ صرف فنکشنل پروگرامنگ میں کوئی تشویش نہیں ہے کسی فنکشن کو ایک مختلف ماڈیول میں منتقل کرنے کے لیے بہت کم ہاتھوں سے رگڑنے کی ضرورت ہوتی ہے اور عملی طور پر کوئی کوشش نہیں۔ “ریفیکٹرنگ” ایرلنگ عام طور پر بڑے افعال کو چھوٹے افعال میں توڑنے پر مشتمل ہوتا ہے۔ زیادہ ذہنی کوشش شامل نہیں ہے تاہم ، ایرلنگ کی نحوی خصوصیات کی وجہ سے ، یہ گمنام افعال کو نامزد افعال میں تبدیل کرنا تکلیف دہ ہوسکتا ہے۔ شاید ایک ہوشیار IDE ایک دن اس ٹیڈیم کو ختم کردے گا۔

ایرلنگ میں تمام ڈیٹا ڈھانچے مکمل طور پر شفاف ہیں۔ آپ جو لائبریری استعمال کر رہے ہیں اس کے بارے میں کچھ نہیں جانتے ، آپ ہمیشہ رن ٹائم پر ڈیٹا ڈھانچے کے مندرجات کا معائنہ کر سکتے ہیں۔ یہ فیچر ڈیبگنگ میں بہت مدد کرتا ہے ، اور پرانے زمانے کی ہیکنگ کے لیے ایک نعمت ہے۔ لائبریری کے اصل مصنف کا ارادہ نہ رکھنے والی فعالیت کو نافذ کرنے کے لیے غیر دستاویزی ڈیٹا ڈھانچے میں ہیرا پھیری کرنا آسان ہے۔ آبجیکٹ پر مبنی پروگرامنگ کے برعکس ، آپ کو کبھی بھی اصل مصنف کے بارے میں فکر کرنے کی ضرورت نہیں ہے کہ متغیرات کا نام تبدیل کریں اور اپنے ذیلی کلاس کوڈ کو توڑیں۔ جب تک ڈیٹا کا بنیادی ڈھانچہ ایک جیسا رہے گا ، آپ کی ترمیم ایرلنگ میں کام کرتی رہے گی۔

مجھے معلوم ہوا کہ ایرلنگ میں ڈیٹا ڈھانچے کی شفافیت پروگرامنگ کو بہت آسان بنا دیتی ہے۔ آبجیکٹ پر مبنی پروگرامنگ میں ، میں ہمیشہ پریشان رہتا ہوں کہ چیزوں کو کیا نام دیا جائے۔ ایرلنگ میں ، عام طور پر اس سے کوئی فرق نہیں پڑتا ، کیونکہ ڈیٹا کا ڈھانچہ آدھا انٹرفیس ہے۔ اگر آپ نے ایرلنگ میں کبھی پروگرام نہیں کیا ہے تو آپ کو شاید اندازہ نہیں ہوگا کہ میں کس کے بارے میں بات کر رہا ہوں۔

اور اسی طرح ہم ایرلنگ کے بارے میں بری خبر پر آتے ہیں: زبان کے فوائد بیک لوڈ ہیں۔ یعنی ، زبان کے بیشتر فوائد کو صرف دوسری زبانوں کے ساتھ کئی سالوں کے بعد سراہا جا سکتا ہے اور اس کے بعد ایرلنگ کے ساتھ کئی سال۔ یہ یقینی طور پر ابتدائیوں کے لیے زبان نہیں ہے۔ نحو سی پروگرامروں کے لیے عجیب ہے جو سی ڈایسپورا سے تعلق رکھتے ہیں۔ فنکشنل پروگرامنگ سخت ہے ، اور ایرلنگ گولی پر کوئی چینی نہیں ڈالتی ہے۔ گرافکس ٹول کٹس قدیم ہیں ، اور کوئی کوڈ کمپیوٹر گیم نہیں ہے جیسا کہ تعارفی جاوا کورسز میں پایا جاتا ہے۔ کسی بھی غیر معمولی ایرلنگ کوڈ کو پڑھنے کے لیے تکرار کی ایک مضبوط تفہیم درکار ہوتی ہے ، ایک طرح کی تجریدی سوچ جو بہت سے لوگوں کو مشکل محسوس ہوتی ہے۔

ایرلنگ میں دیگر زبانوں کے مقابلے میں لائبریریوں کی بھی کمی ہے۔ میرے تجربے میں ، کسی بھی کام کے لیے ، نوکری کے لیے صفر ، ایک ، یا زیادہ سے زیادہ دو ایرلنگ لائبریریاں دستیاب ہیں۔ جب میں یہ کہتا ہوں تو میں شاید اکیلا ہوں ، لیکن مجھے حقیقت میں یہ حقیقت پسند ہے کہ یہاں ایرلنگ لائبریریاں دستیاب نہیں ہیں۔ اگر مجھے کسی کام کی ضرورت ہوتی ہے تو میرے پاس اسے کرنے کا بہانہ ہوتا ہے ، اور میں اکثر ایسی دریافتیں کرتا ہوں جو میں دوسری صورت میں نہ کرتا۔ یہ گونگا لگتا ہے لیکن یہ سچ ہے۔ میں نتیجہ خیز محسوس کر سکتا ہوں کیونکہ میں ایسا کچھ کر رہا ہوں جو کسی نے ابھی تک نہیں کیا ہے ، اور راستے میں مجھے نئے طریقے اپنانے اور حقیقی اختراعات کرنے کی آزادی ہے۔ میں نے ایرلنگ لائبریریوں کی نشوونما کے دوران اس سے زیادہ سیکھا ہے جتنا میں نے دوسرے لوگوں کے روبی یا سی کوڈ کے ساتھ سلائی کرنا سیکھا ہے۔

میرے جیسے تجربہ کار پروگرامر کے لیے ، ایرلنگ کے بارے میں صرف ایک بری خبر یہ ہے کہ یہ سست ہے۔ سرور ایپلی کیشنز کے لیے میں نے لکھا ہے ، زبان کی رفتار کوئی مسئلہ نہیں ہے۔ سی پی یو میں اضافی لاگت ایرلنگ کے کوڑے کو جمع کرنے ، نیٹ ورک I/O ، اور ہم آہنگ ماحول میں سٹرنگ کنیکٹیشن کی درست ہینڈلنگ سے زیادہ تھی۔ پیچیدگی کے تجزیے کی زبان میں ، ایرلنگ پروگراموں کا ایک بڑا کنسٹنٹ آؤٹ فرنٹ ہوتا ہے لیکن عمدہ اسیمپٹوٹک خصوصیات۔

پروگرامر جو ارلنگ کا استعمال کرتے ہوئے تیز پروگرام لکھنا چاہتا ہے – پروگراموں کی ایک قسم جو شروع ہوتی ہے ، چلتی ہے ، کچھ آؤٹ پٹ لکھتی ہے اور باہر نکلتی ہے – کئی محاذوں پر امید ہے۔ ایک مقامی کوڈ مرتب کرنے والا دستیاب ہے ، اور عددی معیارات کے مطابق ، یہ ایرلنگ پروگراموں کو روبی ، پرل اور پی ایچ پی سے تیز تر بناتا ہے ، حالانکہ جاوا اور جاوا اسکرپٹ سے سست ہے۔ نہیں ہے بات ایک بس میں وقت مقامی کوڈ سنکلک، کوڈ پر عملدرآمد سے ہی معلومات gleaning اور مناسب اصلاحات بنا کر پھانسی کے وقت کے لئے مزید بہتری فراہم کر سکتے ہیں جن میں سے. آخر میں ، بہادر روحیں NIF کے ذریعے C میں کمپیوٹیشنل طور پر انتہائی کوڈ لکھ سکتی ہیں۔، اہم انتباہات کے ساتھ کہ سی کوڈ ایرلنگ شیڈولر کو روک دے گا (ممکنہ طور پر ایرلنگ کی ہم آہنگی کی صلاحیتوں کی نفی کرے گا) ، اور یہ متوازی سی کوڈ لکھنا مشہور ہے۔

ایرلنگ میں تیز پروگرام لکھنے کے لیے میری اپنی پسند ایک متبادل ٹیکنالوجی ہے جو ایرلنگ رن ٹائم کی سالمیت پر سمجھوتہ کیے بغیر سی کوڈ کے تمام فوائد فراہم کرتی ہے۔ یہ اوپن سی ایل ہے ، سی جیسی زبان جو ایپل نے 2008 میں متعارف کروائی تھی۔ ایرلنگ کی طرح ، اوپن سی ایل کسی دی گئی مشین پر تمام پروسیسر کور کا آسانی سے فائدہ اٹھاتا ہے۔ ایرلنگ کے برعکس ، اوپن سی ایل پروگرام بہت تیز ہیں۔ در حقیقت ، اوپن سی ایل پروگرام عام طور پر سی پروگراموں کے مقابلے میں تیز ہوتے ہیں ، کیونکہ اوپن سی ایل پروگرام پروسیسر کی ویکٹر صلاحیتوں سے اس طرح فائدہ اٹھا سکتے ہیں جس کے لیے عام طور پر ہینڈ ٹیونڈ اسمبلر کوڈ کی ضرورت ہوتی ہے۔ اوپن سی ایل پروگراموں کو ایرلنگ کوڈ سے براہ راست مرتب اور عمل میں لایا جا سکتا ہے۔؛ میرے خیال میں ، یہ ایک بڑے ایرلنگ پروگرام کے اندر کمپیوٹیشنل طور پر انتہائی کاموں (یعنی ان اندرونی لوپس کو چلانے) کے لیے ایک بہترین ٹیکنالوجی ہے۔

ڈس کلیمر کے ذریعے ، میں نے اصل میں ایرلنگ پروگرام کے اندر اوپن سی ایل استعمال نہیں کیا ہے۔ جیسا کہ میں نے کہا ، ایرلنگ پروگراموں میں جو میں نے لکھا ہے اس میں رفتار کوئی مسئلہ نہیں ہے۔ میرے پاس اوپن سی ایل کے ساتھ پہلے ہاتھ کا تجربہ ہے اور میں بہت خوش ہوں۔ میں نے اوپن سی ایل میں ایک نقشہ پروجیکشن لائبریری لکھی جو کہ جدید ترین پروج 4 لائبریری (سی میں لکھی گئی) سے 5 گنا تیز ہے۔ میں نے ملٹی ویریٹیٹ شماریات کرنے کے لیے ایک اوپن سی ایل لائبریری بھی لکھی۔ میں نے اسے موجودہ لائبریریوں کے خلاف بینچ مارک نہیں کیا ہے ، لیکن مجھے شبہ ہے کہ یہ اسی طرح کے مارجن سے تیز ہے۔ اوپن سی ایل کوڈ لکھنے کی کچھ خصوصیات ہیں ، لیکن مجھے امید ہے کہ ایک دن دنیا کے تمام سخت لوپس اوپن سی ایل میں دوبارہ لکھے جائیں گے اور ایرلنگ میں لکھے گئے بڑے پروگراموں سے طلب کیے جائیں گے۔

تبدیلیاں۔

  • 10/30/2012 – معمولی وضاحتیں اور اصلاحات