Software transactional memory
کمپیوٹر سائنس میں، سافٹ ویئر ٹرانزیکشنل میموری (ایس ٹی ایم) ایک ہم آہنگی کنٹرول میکانزم ہے جو ہم آہنگی کمپیوٹنگ میں مشترکہ میموری تک رسائی کو کنٹرول کرنے کے لیے ڈیٹا بیس ٹرانزیکشنز سے ملتا جلتا ہے۔ یہ لاک پر مبنی ہم آہنگی کا ایک متبادل ہے۔ ایس ٹی ایم ایک حکمت عملی ہے جسے ہارڈ ویئر جزو کے بجائے سافٹ ویئر میں نافذ کیا جاتا ہے۔ اس تناظر میں ٹرانزیکشن اس وقت ہوتا ہے جب کوڈ کا ایک ٹکڑا مشترکہ میموری میں پڑھنے اور لکھنے کے سلسلے کو انجام دیتا ہے۔ یہ پڑھنا اور لکھنا منطقی طور پر ایک ہی لمحے میں ہوتا ہے ؛ درمیانی ریاستیں دوسرے (کامیاب) لین دین کو نظر نہیں آتی ہیں۔ لین دین کے لیے ہارڈ ویئر سپورٹ فراہم کرنے کا خیال ٹام نائٹ کے 1986 کے ایک مقالے میں شروع ہوا۔ اس خیال کو موریس ہرلی اور جے ایلیوٹ بی موس نے مقبول کیا۔ 1995 میں نر شویت اور ڈین ٹوئیٹو نے اس خیال کو صرف سافٹ ویئر ٹرانزیکشنل میموری (ایس ٹی ایم) تک بڑھایا۔ 2005 سے ایس ٹی ایم شدید تحقیق کا مرکز رہا ہے اور عملی نفاذ کے لیے تعاون بڑھ رہا ہے۔ زیادہ تر جدید ملٹی تھریڈ ایپلی کیشنز میں استعمال ہونے والی لاکنگ تکنیکوں کے برعکس، ایس ٹی ایم اکثر بہت پر امید ہوتا ہے: ایک تھریڈ شیئرڈ میموری میں ترمیم کو مکمل کرتا ہے اس بات کی پرواہ کیے بغیر کہ دوسرے تھریڈز کیا کر رہے ہیں، ہر پڑھنے اور لکھنے کو ریکارڈ کرتا ہے کہ وہ لاگ میں کارکردگی کا مظاہرہ کر رہا ہے۔ مصنف پر یہ یقینی بنانے کی ذمہ داری ڈالنے کے بجائے کہ اس سے جاری دیگر کارروائیوں پر منفی اثر نہ پڑے، اسے قاری پر ڈال دیا جاتا ہے، جو ایک مکمل لین دین مکمل کرنے کے بعد اس بات کی تصدیق کرتا ہے کہ دوسرے دھاگوں نے بیک وقت میموری میں تبدیلیاں نہیں کی ہیں جس تک اس نے ماضی میں رسائی حاصل کی تھی۔ یہ حتمی عمل، جس میں لین دین کی تبدیلیوں کی توثیق کی جاتی ہے اور اگر توثیق کامیاب ہوتی ہے تو اسے مستقل بنایا جاتا ہے، اسے کمٹ کہا جاتا ہے۔ ٹرانزیکشن کسی بھی وقت اسقاط بھی ہو سکتا ہے، جس کی وجہ سے اس کی تمام سابقہ تبدیلیاں واپس لے لی جائیں یا کالعدم کر دی جائیں۔ اگر متضاد تبدیلیوں کی وجہ سے کوئی لین دین نہیں کیا جا سکتا ہے، تو اسے عام طور پر ختم کر دیا جاتا ہے اور شروع سے ہی دوبارہ نافذ کیا جاتا ہے جب تک کہ یہ کامیاب نہ ہو جائے۔ اس پر امید نقطہ نظر کا فائدہ ہم آہنگی میں اضافہ ہے: کسی تھریڈ کو کسی وسائل تک رسائی کے لیے انتظار کرنے کی ضرورت نہیں ہے، اور مختلف تھریڈز ڈیٹا ڈھانچے کے جداگانہ حصوں میں محفوظ طریقے سے اور بیک وقت ترمیم کر سکتے ہیں جو عام طور پر ایک ہی لاک کے تحت محفوظ ہوتے ہیں۔ تاہم، عملی طور پر، ایس ٹی ایم سسٹمز کو بھی کم تعداد میں پروسیسرز (1 سے 4 تک ایپلی کیشن پر منحصر) پر باریک دانے والے لاک پر مبنی سسٹمز کے مقابلے میں کارکردگی میں کمی کا سامنا کرنا پڑتا ہے۔ یہ بنیادی طور پر لاگ کو برقرار رکھنے سے وابستہ اوور ہیڈ اور لین دین کرنے میں گزارے گئے وقت کی وجہ سے ہے۔ یہاں تک کہ اس صورت میں بھی کارکردگی عام طور پر دوگنا سست سے بدتر نہیں ہوتی ہے۔ ایس ٹی ایم کے وکلاء کا خیال ہے کہ یہ سزا ایس ٹی ایم کے تصوراتی فوائد سے جائز ہے۔ نظریاتی طور پر، n سمورتی لین دین کی سب سے خراب صورت جگہ اور وقت کی پیچیدگی O (n) ہے۔ اصل ضروریات کا انحصار عمل درآمد کی تفصیلات پر ہوتا ہے (کوئی بھی اوور ہیڈ سے بچنے کے لیے لین دین کو جلد ناکام بنا سکتا ہے)، لیکن ایسے معاملات بھی ہوں گے، اگرچہ نایاب ہوں، جہاں لاک پر مبنی الگورتھم میں سافٹ ویئر ٹرانزیکشنل میموری سے بہتر وقت کی پیچیدگی ہوتی ہے۔ تصوراتی فوائد اور نقصانات ان کی کارکردگی کے فوائد کے علاوہ، ایس ٹی ایم ملٹی تھریڈڈ پروگراموں کی تصوراتی تفہیم کو بہت آسان بناتا ہے اور موجودہ اعلی سطحی تجریدوں جیسے اشیاء اور ماڈیولز کے ساتھ ہم آہنگی میں کام کرکے پروگراموں کو زیادہ برقرار رکھنے میں مدد کرتا ہے۔ لاک پر مبنی پروگرامنگ میں متعدد معروف مسائل ہوتے ہیں جو عملی طور پر اکثر پیدا ہوتے ہیں: لاکنگ کے لیے کوڈ کے دور سے الگ اور بظاہر غیر متعلقہ حصوں میں اوور لیپنگ آپریشنز اور جزوی آپریشنز کے بارے میں سوچنے کی ضرورت ہوتی ہے، یہ ایک ایسا کام ہے جو بہت مشکل اور غلطی کا شکار ہے۔ لاکنگ کے لیے پروگرامرز کو لاکنگ پالیسی اپنانے کی ضرورت ہوتی ہے تاکہ ڈیڈ لاک، لائیو لاک، اور پیش رفت کرنے میں دیگر ناکامیوں کو روکا جا سکے۔ اس طرح کی پالیسیاں اکثر غیر رسمی طور پر نافذ کی جاتی ہیں اور غلط ثابت ہوتی ہیں، اور جب یہ مسائل پیدا ہوتے ہیں تو انہیں دوبارہ پیش کرنا اور ڈیبگ کرنا انتہائی مشکل ہوتا ہے۔ لاکنگ ترجیحی الٹ کا باعث بن سکتی ہے، ایک ایسا رجحان جہاں ایک اعلی ترجیحی دھاگے کو کم ترجیحی دھاگے کا انتظار کرنے پر مجبور کیا جاتا ہے جس میں کسی وسائل تک خصوصی رسائی ہوتی ہے جس کی اسے ضرورت ہوتی ہے۔ اس کے برعکس، میموری ٹرانزیکشن کا تصور بہت آسان ہے، کیونکہ ہر ٹرانزیکشن کو الگ تھلگ ایک تھریڈ کمپیوٹیشن کے طور پر دیکھا جا سکتا ہے۔ ڈیڈ لاک اور لیو لاک کو یا تو مکمل طور پر روکا جاتا ہے یا بیرونی ٹرانزیکشن مینیجر کے ذریعے سنبھالا جاتا ہے ؛ پروگرامر کو شاید ہی اس کے بارے میں فکر کرنے کی ضرورت ہے۔ ترجیحی الٹ اب بھی ایک مسئلہ ہو سکتا ہے، لیکن اعلی ترجیحی لین دین متضاد کم ترجیحی لین دین کو ختم کر سکتے ہیں جو پہلے سے نہیں کیے گئے ہیں۔ دوسری طرف، ناکام ٹرانزیکشنز کو ختم کرنے کی ضرورت ٹرانزیکشنز کے رویے پر بھی حدود رکھتی ہے: وہ کوئی بھی ایسا عمل انجام نہیں دے سکتے جسے کالعدم نہیں کیا جا سکتا، بشمول زیادہ تر آئی/او۔ اس طرح کی حدود کو عام طور پر عملی طور پر بفر بنا کر دور کیا جاتا ہے جو ناقابل واپسی کارروائیوں کو قطار میں کھڑا کرتے ہیں اور انہیں بعد میں کسی بھی لین دین سے باہر انجام دیتے ہیں۔ ہاسکل میں، یہ حد ٹائپ سسٹم کے ذریعے مرتب کرنے کے وقت نافذ کی جاتی ہے۔ 2005 میں، ٹم ہیرس، سائمن مارلو، سائمن پیٹن جونز، اور مورس ہرلیہی نے کنکرنٹ ہاسکل پر بنایا گیا ایک ایس ٹی ایم سسٹم بیان کیا جو صوابدیدی جوہری کارروائیوں کو بڑے جوہری کارروائیوں میں تشکیل دینے کے قابل بناتا ہے، ایک مفید تصور جو لاک پر مبنی پروگرامنگ کے ساتھ ناممکن ہے۔ مصنفین کا حوالہ دیتے ہوئے: شاید سب سے بنیادی اعتراض [.] یہ ہے کہ لاک پر مبنی پروگرام کمپوز نہیں ہوتے ہیں: صحیح ٹکڑے ٹکڑے کرنے پر ناکام ہو سکتے ہیں۔ مثال کے طور پر، تھریڈ سیف انسٹر اور ڈیلیٹ آپریشن کے ساتھ ہیش ٹیبل پر غور کریں۔ اب فرض کریں کہ ہم ٹیبل ٹی 1 سے ایک آئٹم اے کو حذف کرنا چاہتے ہیں، اور اسے ٹیبل ٹی 2 میں داخل کرنا چاہتے ہیں ؛ لیکن درمیانی حالت (جس میں کسی بھی ٹیبل میں آئٹم نہیں ہے) دوسرے دھاگوں کو نظر نہیں آنا چاہیے۔ جب تک کہ ہیش ٹیبل کا عمل درآمد کرنے والا اس ضرورت کی پیش گوئی نہ کرے، اس ضرورت کو پورا کرنے کا کوئی طریقہ نہیں ہے۔ [.] مختصرا، وہ کارروائیاں جو انفرادی طور پر درست ہوں (داخل کریں، حذف کریں) بڑی درست کارروائیوں میں مرتب نہیں کی جا سکتی ہیں۔ - ٹم ہیرس اور دیگر، "کمپوزیبل میموری ٹرانزیکشنز"، سیکشن 2: پس منظر، صفحہ 2 ایس ٹی ایم کے ساتھ، اس مسئلے کو حل کرنا آسان ہے: صرف ایک ٹرانزیکشن میں دو کارروائیوں کو لپیٹنا مشترکہ آپریشن کو جوہری بناتا ہے۔ چپکنے والی واحد بات یہ ہے کہ کال کرنے والے کے لیے یہ واضح نہیں ہے، جو جزو کے طریقوں کے نفاذ کی تفصیلات سے بے خبر ہے، اگر وہ ناکام ہو جائے تو اسے لین دین کو دوبارہ انجام دینے کی کوشش کرنی چاہیے۔ جواب میں، مصنفین نے ایک ری ٹرائی کمانڈ کی تجویز پیش کی جو ناکام ٹرانزیکشن سے پیدا ہونے والے ٹرانزیکشن لاگ کا استعمال کرتا ہے تاکہ اس بات کا تعین کیا جا سکے کہ یہ کون سے میموری سیل کو پڑھتا ہے، اور جب ان میں سے کسی ایک سیل میں ترمیم کی جاتی ہے تو خود بخود ٹرانزیکشن کو دوبارہ آزماتا ہے، اس منطق کی بنیاد پر کہ ٹرانزیکشن اس وقت تک مختلف انداز سے نہیں چلے گا جب تک کہ کم از کم ایک ایسی قیمت تبدیل نہ ہو جائے۔ مصنفین نے متبادلات کی تشکیل کے لیے ایک طریقہ کار، یا ایلس فنکشن کی تجویز بھی پیش کی۔ یہ ایک ٹرانزیکشن چلاتا ہے اور، اگر وہ ٹرانزیکشن دوبارہ کوشش کرتا ہے، تو دوسرا ٹرانزیکشن چلاتا ہے۔ اگر دونوں دوبارہ کوشش کرتے ہیں، تو متعلقہ تبدیلی ہوتے ہی یہ ان دونوں کو دوبارہ آزماتا ہے۔ یہ سہولت، پوزیکس نیٹ ورکنگ سلیکٹ () کال جیسی خصوصیات کے مقابلے میں، کال کرنے والے کو بیک وقت متعدد واقعات میں سے کسی ایک پر انتظار کرنے کی اجازت دیتی ہے۔ یہ پروگرامنگ انٹرفیس کو بھی آسان بناتا ہے، مثال کے طور پر بلاکنگ اور نان بلاکنگ آپریشنز کے درمیان تبدیل کرنے کے لیے ایک آسان طریقہ کار فراہم کر کے۔ یہ اسکیم گلاسگو ہاسکل مرتب میں نافذ کی گئی ہے۔ مجوزہ زبان کی حمایت ایس ٹی ایم کی تصوراتی سادگی انہیں نسبتا سادہ زبان کے نحو کا استعمال کرتے ہوئے پروگرامر کے سامنے آنے کے قابل بناتی ہے۔ ٹم ہیرس اور کیر فریزر کی "لائٹ ویٹ ٹرانزیکشنز کے لیے لینگویج سپورٹ" نے ٹرانزیکشنز کی نمائندگی کے لیے کلاسیکی کنڈیشنل کریٹیکل ریجن (سی سی آر) کو استعمال کرنے کا خیال پیش کیا۔ اس کی آسان ترین شکل میں، یہ صرف ایک "ایٹمک بلاک" ہے، کوڈ کا ایک بلاک جو منطقی طور پر ایک ہی لمحے میں ہوتا ہے:// ایک نوڈ کو ڈبل لنکڈ لسٹ میں ایٹمک طور پر داخل کریں {نیا نوڈ-> پریو = نوڈ ؛ نیا نوڈ-> اگلا = نوڈ-> اگلا ؛ نوڈ-> اگلا-> پریو = نیا نوڈ ؛ نوڈ-> اگلا = نیا نوڈ ؛} جب بلاک کے اختتام تک پہنچ جاتا ہے، تو اگر ممکن ہو تو لین دین کا ارتکاب کیا جاتا ہے، یا پھر اسے روک کر دوبارہ آزمایا جاتا ہے۔ (یہ محض ایک تصوراتی مثال ہے، درست کوڈ نہیں۔ مثال کے طور پر، اگر لین دین کے دوران نوڈ کو فہرست سے حذف کر دیا جائے تو یہ غلط سلوک کرتا ہے۔) سی سی آر ایک گارڈ کنڈیشن کی بھی اجازت دیتا ہے، جو لین دین کو اس وقت تک انتظار کرنے کے قابل بناتا ہے جب تک کہ اس کے پاس کام نہ ہو: ایٹمک (کیو سائز> 0) [قطار سے آئٹم کو ہٹا دیں اور اسے استعمال کریں] اگر شرط مطمئن نہیں ہے تو، لین دین مینیجر اس وقت تک انتظار کرے گا جب تک کہ کسی دوسرے لین دین نے کوئی عزم نہ کیا ہو جو دوبارہ کوشش کرنے سے پہلے شرط کو متاثر کرتا ہے۔ پروڈیوسروں اور صارفین کے درمیان یہ ڈھیلا جوڑا دھاگوں کے درمیان واضح سگنلنگ کے مقابلے میں ماڈیولرٹی کو بڑھاتا ہے۔ "کمپوز ایبل میموری ٹرانزیکشنز" نے اپنے ری ٹرائی کمانڈ (اوپر زیر بحث) کے ساتھ ایک قدم اور آگے بڑھایا، جو کسی بھی وقت ٹرانزیکشن کو اسقاط کر سکتا ہے اور اس وقت تک انتظار کر سکتا ہے جب تک کہ ٹرانزیکشن کے ذریعے پہلے پڑھی گئی کچھ قیمت میں دوبارہ کوشش کرنے سے پہلے ترمیم نہ ہو جائے۔ مثال کے طور پر: ایٹمک {اگر (کیو سائز> 0) {آئٹم کو قطار سے ہٹا دیں اور اسے استعمال کریں} بصورت دیگر {دوبارہ کوشش کریں} ٹرانزیکشن میں دیر سے متحرک طور پر دوبارہ کوشش کرنے کی یہ صلاحیت پروگرامنگ ماڈل کو آسان بناتی ہے اور نئے امکانات کھولتی ہے۔ ایک مسئلہ یہ ہے کہ جب مستثنیات لین دین سے باہر تبلیغ کرتے ہیں تو وہ کیسے برتاؤ کرتے ہیں۔ "کمپوزیبل میموری ٹرانزیکشنز" میں، مصنفین نے فیصلہ کیا کہ اس سے لین دین کو روکنا چاہیے، کیونکہ مستثنیات عام طور پر کنکرنٹ ہاسکل میں غیر متوقع غلطیوں کی نشاندہی کرتے ہیں، لیکن یہ کہ استثناء تشخیصی مقاصد کے لیے لین دین کے دوران مختص کردہ معلومات کو برقرار رکھ سکتا ہے اور پڑھ سکتا ہے۔ وہ اس بات پر زور دیتے ہیں کہ دیگر ترتیبات میں ڈیزائن کے دیگر فیصلے معقول ہو سکتے ہیں۔ ٹرانزیکشنل لاکنگ ایس ٹی ایم کو لاک فری الگورتھم کے طور پر لاگو کیا جا سکتا ہے یا یہ لاکنگ کا استعمال کر سکتا ہے۔ لاکنگ اسکیموں کی دو قسمیں ہیں: انکاؤنٹر ٹائم لاکنگ (اینلز، ساہا، اور ہیرس) میں، میموری رائٹ پہلے کسی دی گئی جگہ کے لیے عارضی طور پر لاک حاصل کر کے، براہ راست ویلیو لکھ کر، اور اسے انڈو لاگ میں لاگ ان کر کے کیا جاتا ہے۔ کمٹ ٹائم لاکنگ صرف کمٹ مرحلے کے دوران میموری کے مقامات کو لاک کرتا ہے۔ ڈائس، شیلیو اور شویت کے ذریعہ نافذ کردہ "ٹرانزیکشنل لاکنگ II" نامی ایک کمٹ ٹائم اسکیم ایک عالمی ورژن گھڑی کا استعمال کرتی ہے۔ ہر لین دین گھڑی کی موجودہ قیمت کو پڑھنے اور اسے پڑھنے کے ورژن کے طور پر محفوظ کرنے سے شروع ہوتا ہے۔ پھر، ہر پڑھنے یا لکھنے پر، مخصوص میموری لوکیشن کے ورژن کا موازنہ ریڈ ورژن سے کیا جاتا ہے ؛ اور، اگر یہ زیادہ ہے، تو لین دین کو ختم کر دیا جاتا ہے۔ یہ اس بات کی ضمانت دیتا ہے کہ کوڈ میموری کے مستقل سنیپ شاٹ پر انجام دیا جاتا ہے۔ کمٹ کے دوران، لکھنے کے تمام مقامات کو لاک کر دیا جاتا ہے، اور پڑھنے اور لکھنے کے تمام مقامات کے ورژن نمبر دوبارہ چیک کیے جاتے ہیں۔ آخر میں، عالمی ورژن گھڑی میں اضافہ کیا جاتا ہے، لاگ سے نئی تحریری اقدار کو میموری میں واپس لکھا جاتا ہے اور گھڑی کے نئے ورژن پر مہر لگائی جاتی ہے۔ ٹرانزیکشنل میموری میں ٹرانزیکشنل تنازعات کو سنبھالنے کے لیے، اور خاص طور پر ایس ٹی ایم میں، ایک تیزی سے استعمال ہونے والا طریقہ عزم آرڈرنگ ہے (جسے عزم آرڈرنگ بھی کہا جاتا ہے ؛ سی او)۔ اس کا استعمال "کمٹ آرڈر" (مثال کے طور پر رمضان وغیرہ) کے ذریعے مثبت انداز میں (یعنی تنازعات کو روکنے کے بغیر، اور صرف ارتکاب کے لیے لاکنگ) سیریلائزیشن کے حصول کے لیے کیا جاتا ہے۔ 2009، اور ژانگ اور دیگر۔ 2006)۔ سیریلائزیشن (بیک وقت لین دین اور) ٹرانزیکشنل میموری کی درستگی کی بنیاد ہے۔ "کمٹ آرڈر" پر دسیوں ایس ٹی ایم مضامین پہلے ہی شائع ہو چکے ہیں، اور یہ تکنیک متعدد پیٹنٹ سے بھری ہوئی ہے۔ سی او کے ساتھ مطلوبہ سیریلائزیشن پراپرٹی صرف تاریخی ترتیب میں لین دین کا ارتکاب کرکے حاصل کی جاتی ہے جو متعلقہ لین دین کے ترجیحی ترتیب (جیسا کہ تنازعات میں کارروائیوں کے تاریخی احکامات سے طے ہوتا ہے) کے ساتھ مطابقت رکھتا ہے۔ سی او کو نافذ کرنے کے لیے عام مقامی سی او الگورتھم کے کچھ نفاذ کو استعمال کرنے کی ضرورت ہے۔ اوپر حوالہ دیا گیا پیٹنٹ خلاصہ پہلے سے طے شدہ عزم آرڈر کے ساتھ الگورتھم کے عمومی نفاذ کو بیان کرتا ہے (یہ "حقیقی وقت کی رکاوٹوں کے ساتھ CO عام الگورتھم" کے زمرے میں آتا ہے)۔ عمل درآمد کے مسائل سافٹ ویئر ٹرانزیکشنل میموری کو پر امید پڑھنے کے ساتھ نافذ کرنے میں ایک مسئلہ یہ ہے کہ ایک نامکمل ٹرانزیکشن کے لیے متضاد حالت کو پڑھنا ممکن ہے (یعنی کسی دوسرے ٹرانزیکشن کے ذریعے لکھی گئی پرانی اور نئی اقدار کے مرکب کو پڑھنا)۔ اگر اس طرح کا لین دین کبھی انجام دینے کی کوشش کرتا ہے تو اسے منسوخ کر دیا جائے گا، لہذا یہ لین دین کے نظام کے ذریعہ نافذ کردہ مستقل مزاجی کی شرط کی خلاف ورزی نہیں کرتا ہے، لیکن اس "عارضی" متضاد حالت کے لیے یہ ممکن ہے کہ لین دین ایک مہلک غیر معمولی حالت جیسے کہ تقسیم کی غلطی کو متحرک کرے یا یہاں تک کہ ایک لامتناہی لوپ میں داخل ہو جائے، جیسا کہ "لائٹ ویٹ لین دین کے لیے زبان کی حمایت" کی شکل 4 سے درج ذیل من گھڑت مثال میں دیا گیا ہے: بشرطیکہ x = y ابتدائی طور پر، اس سے اوپر کا کوئی بھی لین دین اس غیر متغیر کو تبدیل نہیں کرتا ہے، لیکن یہ ممکن ہے کہ لین دین A لین دین B کے بعد اسے اپ ڈیٹ کرنے کے بعد x پڑھے گا لیکن لین دین B کو اپ ڈیٹ کرنے سے پہلے y پڑھے گا، جس کی وجہ سے وہ ایک لامحدود لوپ میں داخل ہو جائے گا۔ اس سے نمٹنے کے لیے معمول کی حکمت عملی کسی بھی مہلک مستثنیات کو روکنا اور کسی بھی ایسے لین دین کو روکنا ہے جو درست نہیں ہے۔ ان مسائل سے نمٹنے کا ایک طریقہ یہ ہے کہ ایسے لین دین کا پتہ لگایا جائے جو غیر قانونی کارروائیوں کو انجام دیتے ہیں یا انہیں ختم کرنے اور صاف طور پر ختم کرنے میں ناکام رہتے ہیں۔ دوسرا طریقہ ٹرانزیکشنل لاکنگ اسکیم ہے۔ عملی نفاذ ہاسکل جی ایچ سی سی + + سی پی پی _ ایس ٹی ایم _ فری کلوجر ریفز، نوڈ-ایس ٹی ایم گو کشمیر رسٹ اسنک-ایس ٹی ایم اسکالا زی او سی اے ایم ایل حوالہ جات ہم آہنگی پروگرامنگ زبان کے موضوعات پروگرامنگ زبان کا نفاذ ٹرانزیکشن پروسیسنگ ٹرانزیکشنل میموری ڈی: ٹرانزیکشنلر سپیچر