Row- and column-major order
کمپیوٹنگ میں، قطار میجر آرڈر اور کالم میجر آرڈر لکیری اسٹوریج جیسے بے ترتیب رسائی میموری میں کثیر جہتی صفوں کو ذخیرہ کرنے کے طریقے ہیں۔ آرڈرز کے درمیان فرق یہ ہے کہ کسی صف کے عناصر میموری میں متصل ہوتے ہیں۔ صف میجر ترتیب میں، قطار کے لگاتار عناصر ایک دوسرے کے ساتھ رہتے ہیں، جبکہ کالم میجر ترتیب میں کالم کے مسلسل عناصر کے لیے بھی یہی درست ہے۔ جبکہ اصطلاحات دو جہتی صف کی قطاروں اور کالموں کی طرف اشارہ کرتی ہیں، یعنی۔ ایک میٹرکس، آرڈرز کو کسی بھی جہت کی صفوں کے لیے عام کیا جا سکتا ہے یہ نوٹ کرتے ہوئے کہ قطار میجر اور کالم میجر کی اصطلاحات بالترتیب لیکسیگرافک اور کولیکسکوگرافک آرڈرز کے مساوی ہیں۔ مختلف پروگرامنگ زبانوں میں لکھے گئے پروگراموں کے درمیان صفوں کو صحیح طریقے سے منتقل کرنے کے لیے ڈیٹا لے آؤٹ اہم ہے۔ کسی صف کو عبور کرتے وقت یہ کارکردگی کے لیے بھی اہم ہے کیونکہ جدید سی پی یو غیر ترتیب وار ڈیٹا کے مقابلے میں ترتیب وار ڈیٹا کو زیادہ موثر طریقے سے پروسیس کرتے ہیں۔ یہ بنیادی طور پر سی پی یو کیشنگ کی وجہ سے ہے جو حوالہ کے مقامی علاقے کا استحصال کرتا ہے۔ اس کے علاوہ، متصل رسائی SIMD ہدایات کا استعمال ممکن بناتی ہے جو ڈیٹا کے ویکٹر پر کام کرتی ہیں۔ مقناطیسی ٹیپ ڈیٹا اسٹوریج جیسے کچھ ذرائع ابلاغ میں، ترتیب وار رسائی غیر ترتیب وار رسائی سے زیادہ تیزی سے ہوتی ہے۔ وضاحت اور مثال صف-میجر اور کالم-میجر اصطلاحات اشیاء کو ترتیب دینے سے متعلق اصطلاحات سے نکلتی ہیں۔ بہت سے صفات کے ساتھ اشیاء کو ترتیب دینے کا ایک عام طریقہ یہ ہے کہ پہلے انہیں ایک خاصیت کے مطابق ترتیب دیا جائے، اور پھر، اس طرح کے ہر گروپ کے اندر، انہیں دوسرے خاصیت وغیرہ کے مطابق ترتیب دیا جائے۔ اگر ایک سے زیادہ صفات ترتیب دینے میں حصہ لیتی ہیں تو پہلے کو میجر اور آخری کو مائنر کہا جائے گا۔ اگر دو صفات ترتیب میں حصہ لیتی ہیں، تو یہ صرف اہم خاصیت کا نام دینے کے لیے کافی ہے۔ صفوں کے معاملے میں، صفات ہر جہت کے ساتھ اشارے ہیں۔ ریاضیاتی اشارے میں میٹرکس کے لیے، پہلا اشاریہ صف کی نشاندہی کرتا ہے، اور دوسرا کالم کی نشاندہی کرتا ہے، مثال کے طور پر، میٹرکس کو دیکھتے ہوئے، اندراج اس کی پہلی صف اور دوسرے کالم میں ہوتا ہے۔ اس روایت کو پروگرامنگ زبانوں میں نحو پر لے جایا جاتا ہے، حالانکہ اکثر انڈیکس 1 کے بجائے 0 سے شروع ہوتے ہیں۔ اگرچہ صف کو پہلے اشاریہ سے اور کالم کو دوسرے اشاریہ سے ظاہر کیا جاتا ہے، لیکن طول و عرض کے درمیان کوئی گروپنگ آرڈر اس سے ظاہر نہیں ہوتا ہے۔ اشاریہ جات کو گروپ کرنے اور ترتیب دینے کا انتخاب، یا تو قطار بڑے یا کالم بڑے طریقوں سے، اس طرح روایت کی بات ہے۔ اسی اصطلاحات کا اطلاق اعلی جہتی صفوں پر بھی کیا جا سکتا ہے۔ صف-میجر گروپنگ دائیں طرف کے انڈیکس سے بائیں طرف کے انڈیکس اور کالم-میجر سے شروع ہوتی ہے، جس کی وجہ سے بالترتیب لیکسیکگرافک اور کولیکسگرافک (یا کولیکس) آرڈر ہوتے ہیں۔ مثال کے طور پر، صف کو دو ممکنہ طریقوں سے محفوظ کیا جا سکتا ہے: پروگرامنگ زبانیں اسے مختلف طریقوں سے سنبھالتی ہیں۔ سی میں، کثیر جہتی صفوں کو صف میجر آرڈر میں محفوظ کیا جاتا ہے، اور صف انڈیکسز کو صف اول لکھا جاتا ہے (لغت تک رسائی آرڈر): دوسری طرف، فورٹرن میں، صفوں کو کالم میجر آرڈر میں محفوظ کیا جاتا ہے، جبکہ صف انڈیکسز کو اب بھی صف اول لکھا جاتا ہے (کولیکسکوگرافیکل رسائی آرڈر): نوٹ کریں کہ کس طرح A [i] [j] کا استعمال کثیر مرحلہ انڈیکسنگ کے ساتھ C میں ہوتا ہے، جیسا کہ فورٹرن میں A (i, j) جیسے غیر جانبدار اشارے کے برخلاف، تقریبا لامحالہ نحو وجوہات کی بناء پر صف میجر آرڈر کا اشارہ کرتا ہے، لہذا بولنا، کیونکہ اسے (A [i]) [j]، اور A [i] کے طور پر دوبارہ لکھا جا سکتا ہے۔ (کوئی اور مضمرات فرض نہیں کیے جانے چاہئیں، مثال کے طور پر، فورٹرن صرف اس کے اشارے کی وجہ سے کالم میجر نہیں ہے، اور یہاں تک کہ مذکورہ بالا مضمرات کو بھی جان بوجھ کر کسی نئی زبان میں روکا جا سکتا ہے۔) کالم میجر آرڈر کو قطار میجر ماحول میں استعمال کرنے کے لیے، یا اس کے برعکس، کسی بھی وجہ سے، ایک حل انڈیکس کو غیر روایتی کردار تفویض کرنا ہے (کالم کے لیے پہلا انڈیکس اور قطار کے لیے دوسرا انڈیکس استعمال کرتے ہوئے)، اور دوسرا ایک جہتی صف میں پوزیشنوں کو واضح طور پر کمپیوٹ کرکے زبان کے نحو کو بائی پاس کرنا ہے۔ یقینا، کنونشن سے انحراف کرنے میں شاید ایک ایسی لاگت آتی ہے جو روایتی زبان کی خصوصیات اور دیگر کوڈ کے ساتھ ضروری تعامل کی ڈگری کے ساتھ بڑھتی ہے، نہ صرف غلطیوں کی بڑھتی ہوئی کمزوری کی شکل میں (میٹرکس ضرب کے ترتیب کو الٹنا بھی بھول جانا، کوڈ کی دیکھ بھال کے دوران کنونشن کی طرف لوٹنا وغیرہ)۔ )، لیکن عناصر کو فعال طور پر دوبارہ ترتیب دینے کی شکل میں بھی، ان سب کو کسی بھی اصل مقصد جیسے کارکردگی میں اضافہ کے خلاف وزن کرنا پڑتا ہے۔ لوپ کو قطار کے لحاظ سے چلانے کو قطار کی بڑی زبانوں جیسے سی میں ترجیح دی جاتی ہے اور کالم کی بڑی زبانوں کے لیے اس کے برعکس۔ پروگرامنگ زبانیں اور لائبریریاں پروگرامنگ زبانیں یا ان کی معیاری لائبریریاں جو کثیر جہتی صفوں کی حمایت کرتی ہیں عام طور پر ان صفوں کے لیے مقامی صف-میجر یا کالم-میجر اسٹوریج آرڈر ہوتی ہیں۔ صف میجر آرڈر کا استعمال سی/سی + +/آبجیکٹیو-سی (سی طرز کی صفوں کے لیے)، پی ایل/آئی، پاسکل، اسپیکیسی، اور ایس اے ایس میں کیا جاتا ہے۔ کالم میجر آرڈر فورٹرن، میٹ لیب، گنو آکٹیو، جولیا، ایس، ایس-پلس، آر، اسکیلاب، یورک اور راسدمان میں استعمال ہوتا ہے۔ ڈینس ایرے اسٹوریج کے لیے ایک عام متبادل الیف ویکٹرز کا استعمال کرنا ہے، جو عام طور پر ایک ہی صف کے عناصر کے لیے پوائنٹرز کو ملحقہ طور پر (جیسے قطار میجر آرڈر) ذخیرہ کرتے ہیں، لیکن خود قطاریں نہیں۔ وہ جاوا، سی #/سی ایل آئی/. نیٹ، اسکالا، اور سوئفٹ میں استعمال ہوتے ہیں (عمر کے لحاظ سے ترتیب دیا گیا)۔ اس سے بھی کم گنجا فہرستوں کی فہرستوں کا استعمال کرنا ہے، مثال کے طور پر، ازگر میں، اور وولفرم ریاضی کی وولفرم زبان میں۔ ایک متبادل نقطہ نظر میزوں کی میزیں استعمال کرتا ہے، مثال کے طور پر، لوا میں۔ بیرونی کتب خانے کثیر جہتی صفوں کے لیے معاونت بیرونی کتب خانوں کے ذریعے بھی فراہم کی جا سکتی ہے، جو صوابدیدی ترتیبات کو بھی سپورٹ کر سکتے ہیں، جہاں ہر جہت کی ایک تیز رفتار قدر ہوتی ہے، اور صف-میجر یا کالم-میجر صرف دو ممکنہ نتیجے کی تشریحات ہیں۔ قطار میجر آرڈر نمپی (ازگر کے لیے) میں ڈیفالٹ ہے۔ کالم میجر آرڈر ایگن اور آرماڈیلو (دونوں C + + کے لیے) میں ڈیفالٹ ہے۔ گرافکس پروسیسنگ کے لیے اوپن جی ایل (اور اوپن جی ایل ای ایس) ایک خاص کیس ہوگا۔ چونکہ "لکیری الجبرا اور متعلقہ شعبوں کے حالیہ ریاضیاتی علاج ہمیشہ ویکٹرز کو کالموں کے طور پر استعمال کرتے ہیں"، ڈیزائنر مارک سیگل نے پیشرو آئی آر آئی ایس جی ایل میں اس روایت کے لیے اس کا متبادل بنانے کا فیصلہ کیا، جو ویکٹرز کو قطاروں کے طور پر لکھنا تھا۔ مطابقت کے لیے، تبدیلی میٹرکس کو اب بھی کوآرڈینیٹ-میجر (= کالم-میجر) ترتیب کے بجائے ویکٹر-میجر (= قطار-میجر) میں محفوظ کیا جائے گا، اور پھر اس نے چال کا استعمال کرتے ہوئے کہا کہ اوپن جی ایل میں میٹرکس کو کالم-میجر ترتیب میں محفوظ کیا جاتا ہے۔ یہ واقعی صرف پریزنٹیشن کے لیے متعلقہ تھا، کیونکہ میٹرکس ضرب اسٹیک پر مبنی تھی اور اب بھی پوسٹ ضرب کے طور پر اس کی تشریح کی جا سکتی ہے، لیکن اس سے بھی بدتر بات یہ ہے کہ حقیقت سی پر مبنی اے پی آئی کے ذریعے لیک ہو گئی کیونکہ انفرادی عناصر تک ایم [ویکٹر] [کوآرڈینیٹ] یا مؤثر طریقے سے ایم [کالم] [قطار] کے طور پر رسائی حاصل کی جائے گی، جس نے بدقسمتی سے اس کنونشن کو گڑبڑ کر دیا جسے ڈیزائنر نے اپنانے کی کوشش کی تھی، اور یہ اوپن جی ایل شیڈنگ زبان میں بھی محفوظ تھا جسے بعد میں شامل کیا گیا تھا (حالانکہ اس سے اس کے بجائے نام کے ذریعے کوآرڈینیٹس تک رسائی ممکن ہو جاتی ہے، مثال کے طور پر، ایم [ویکٹر]. y)۔ نتیجے کے طور پر، بہت سے ڈویلپرز اب صرف یہ اعلان کریں گے کہ کالم کو پہلے انڈیکس کے طور پر رکھنا کالم میجر کی تعریف ہے، حالانکہ یہ واضح طور پر فورٹرن جیسی حقیقی کالم میجر زبان کے معاملے میں نہیں ہے۔ مشعل (لوا کے لیے) کالم میجر سے قطار میجر ڈیفالٹ آرڈر میں تبدیل ہو گئی۔ ٹرانسپوزیشن جیسا کہ کسی صف کے اشاریہ جات کا تبادلہ صف کی منتقلی کا جوہر ہوتا ہے، ایک صف جو قطار میجر کے طور پر محفوظ ہوتی ہے لیکن کالم میجر (یا اس کے برعکس) کے طور پر پڑھی جاتی ہے وہ ٹرانسپوزڈ دکھائی دے گی (جب تک کہ میٹرکس مربع ہو)۔ چونکہ اصل میں میموری میں اس ترتیب کو انجام دینا عام طور پر ایک مہنگا عمل ہے، کچھ نظام انفرادی میٹرکس کو ذخیرہ شدہ ٹرانسپوزڈ کے طور پر متعین کرنے کے اختیارات فراہم کرتے ہیں۔ اس کے بعد پروگرامر کو یہ فیصلہ کرنا ہوگا کہ میموری میں موجود عناصر کو دوبارہ ترتیب دینا ہے یا نہیں، اصل استعمال کی بنیاد پر (بشمول اس تعداد میں کہ صف کو حساب میں دوبارہ استعمال کیا جاتا ہے)۔ مثال کے طور پر، بنیادی لکیری الجبرا سبپروگرام افعال پاسڈ فلیگ ہوتے ہیں جو اس بات کی نشاندہی کرتے ہیں کہ کون سی صفوں کو منتقل کیا گیا ہے۔ عام طور پر ایڈریس کا حساب یہ تصور دو سے زیادہ جہتوں والی صفوں کو عام کرتا ہے۔ طول و عرض Nk (k = 1. d) کے ساتھ ایک d-جہتی صف کے لیے، اس صف کا ایک دیا ہوا عنصر d (صفر پر مبنی) اشاریہ جات کے ٹپل کے ذریعے متعین کیا جاتا ہے۔ صف میجر ترتیب میں، آخری طول و عرض متصل ہے، تاکہ اس عنصر کا میموری آف سیٹ اس طرح دیا جائے: کالم میجر ترتیب میں، پہلا طول و عرض متصل ہے، تاکہ اس عنصر کا میموری آف سیٹ اس طرح دیا جائے: جہاں خالی پروڈکٹ ضرب شناخت عنصر ہے، یعنی۔ کسی دی گئی ترتیب کے لیے، طول و عرض k میں قدم اوپر دائیں طرف کے مجموعوں میں انڈیکس nk سے پہلے قوسین میں ضرب کی قیمت سے دیا جاتا ہے۔ زیادہ عام طور پر، ڈی ہیں! کسی دی گئی صف کے لیے ممکنہ آرڈر، طول و عرض کی ہر ترتیب کے لیے ایک (قطار میجر اور کالم آرڈر کے ساتھ صرف 2 خصوصی معاملات)، اگرچہ اسٹرائیڈ ویلیوز کی فہرستیں لازمی طور پر ایک دوسرے کی ترتیب نہیں ہیں، مثال کے طور پر، اوپر 2-بائی-3 مثال میں، صف میجر کے لیے (3,1) اور کالم میجر کے لیے (1,2) ہیں۔ ارے ڈیٹا اسٹرکچر میٹرکس ریپریزنٹیشن ویکٹرائزیشن (ریاضی) بھی دیکھیں، جو کہ میٹرکس کو متعلقہ کالم-میجر ویکٹر سی ایس آر فارمیٹ میں تبدیل کرنے کے مساوی ہے، میموری مورٹن آرڈر میں کم میٹرکس کو ذخیرہ کرنے کی ایک تکنیک، کثیر جہتی ڈیٹا کو ایک جہتی انڈیکس میں نقش کرنے کا ایک اور طریقہ، جو ٹری ڈیٹا ڈھانچے میں مفید ہے۔ حوالہ جات ڈونلڈ ای نوتھ، دی آرٹ آف کمپیوٹر پروگرامنگ جلد 1: بنیادی الگورتھم، تیسرا ایڈیشن، سیکشن 2.2.6 (ایڈیسن-ویسلی: نیویارک، 1997)۔ صفوں