प्रोग्रामिंग भाषा जहां प्रत्येक फ़ंक्शन कॉल / ब्लॉक एक अलग थ्रेड में किया जाता है? [बन्द है]


26

मैं वर्तमान में मज़े के लिए एक प्रोग्रामिंग भाषा बना रहा हूँ जहाँ यह विचार है कि प्रत्येक फ़ंक्शन कॉल / नया ब्लॉक (यदि क्लॉज़, लूप आदि) एक अलग थ्रेड में काम करेगा। नए थ्रेड्स बनाने के बजाय मानक यह होना चाहिए कि यह स्वचालित रूप से ऐसा करता है, और यदि आप चाहते हैं कि यह मुख्य धागे में चले तो आपको इसे निर्दिष्ट करना होगा।

मुझे मल्टी-थ्रेडेड, समानांतर प्रोग्रामिंग पर सूचित नहीं किया गया है लेकिन मुझे मूल बातें (फ्यूचर्स, थ्रेड सेफ ऑब्जेक्ट्स) पता है। इसलिए मैं सोच रहा हूँ कि इस तरह की भाषा वाक्यविन्यास कैसे समझ सकती है और अगर इसके साथ शुरू करना संभव है? लक्ष्य इसे "उपयोगी" बनाना नहीं है, यह इसके मज़े और सीखने के अनुभव के लिए अधिक है।

(मुझे खेद है कि अगर यह पोस्ट करने के लिए गलत जगह है। यदि आप मुझे सही जगह पर इंगित करते हैं, तो मैं खुशी से सराहना करूंगा जहां मेरा प्रश्न पसंद है।)


17
धागे बनाना सरल है। मल्टी-थ्रेडिंग के साथ चाल तब होती है जब उन्हें एक-दूसरे से बात करने या समान संसाधनों के साथ काम करने की आवश्यकता होती है। दूसरे शब्दों में, यह मुश्किल नहीं है, यह जोड़ है। मुख्य समस्या जिसे आपको हल करने की आवश्यकता है वह यह है कि आप इसे कैसे नियंत्रित करते हैं।
जिमीजैम

20
IMO, आप "फ़ंक्शन" या "थ्रेड" शब्द की सामान्य परिभाषा को गंभीरता से खींचे बिना ऐसा नहीं कर सकते। यदि आप पहले से ही उनसे परिचित नहीं हैं, तो आप अभिनेताओं के बारे में पढ़ना चाहते हैं: en.wikipedia.org/wiki/Actor_model
सोलोमन स्लो

9
पर्याप्त अनाज प्राप्त करें, और आप पाएंगे कि सॉफ्टवेयर डेवलपर पर कोई अतिरिक्त बोझ डाले बिना सीपीयू पहले से ही निर्देशों को स्वचालित रूप से समानांतर कर देता है। देखें बाहर का आदेश निष्पादन और Superscalar प्रोसेसर
8bittree

8
यह वास्तव में भयावह लगता है। मैं क्यों समझा रहा था, लेकिन कार्ल बेवेलफेल्ट पहले से ही था।
मेसन व्हीलर

1
आप अपनी भाषा में किस तरह के प्रतिमान का समर्थन करना चाहते हैं? क्या यह अनिवार्य या कार्यात्मक होना चाहिए? क्या आप यह कह रहे हैं कि सभी बयानों को एक ही समय में निष्पादित किया जाएगा - तत्कालीन / और-ब्लॉक एक साथ उनके बाद क्या आता है?
बेरी

जवाबों:


39

प्रत्येक फ़ंक्शन कॉल / नया ब्लॉक (यदि क्लॉस, लूप आदि) एक अलग थ्रेड में काम करेगा।

निरंतरता और निरंतरता-गुजरने की शैली (और उनके धागे या कोराउटाइन के संबंध में) के बारे में बहुत कुछ पढ़ें। मैं छोटे टुकड़ों में SICP और लिस्प पढ़ने का सुझाव देता हूं । इसके अलावा, प्रोग्रामिंग लैंग्वेज प्रैग्मेटिक्स कई भाषाओं का एक उपयोगी अवलोकन देता है, और आपको अपना स्वयं का डिज़ाइन बनाने में मदद करेगा।

इसलिए मैं सोच रहा हूँ कि इस तरह की भाषा कैसे वाक्यविन्यास समझ सकती है

विचारों की खोज के लिए सिंटैक्स ज्यादा मायने नहीं रखता है । शब्दार्थ अधिक मायने रखता है। मैं कुछ को अपनाने के लिए सुझाव है कि एस-expr वाक्य रचना की तरह (ताकि आप योजना और इसके का उपयोग कर प्रोटोटाइप सकता कॉल / सीसी पहली बार में)।

एक बार जब आपके विचार अधिक स्पष्ट हो जाते हैं (कुछ प्रयोग के बाद), तो आप उनसे लंबोदर-परम पर चर्चा कर सकते हैं, आप अधिक सेक्सी वाक्यविन्यास को परिभाषित कर सकते हैं (जो वास्तव में अगर आप चाहते हैं कि लोग आपकी भाषा को अपनाएं, और यह भी मायने रखता है कि गुणवत्ता क्या है कार्यान्वयन, एक मुफ्त सॉफ्टवेयर नमूना कार्यान्वयन, प्रलेखन, मानक पुस्तकालय, विदेशी फ़ंक्शन इंटरफ़ेस, आदि)


25
वाक्यविन्यास अप्रासंगिक क्यों है के उल्लेख के लिए +1। एक और +1 अगर मैं यह समझाने के लिए कर सकता हूं कि वाक्य रचना अत्यधिक महत्वपूर्ण क्यों है।
जोर्ग डब्ल्यू मित्तग

अच्छा सुझाव है, लेकिन LtU पर सामान पर चर्चा करने के लिए आप एक खाता चाहते हैं और यह मेरे अनुभव से एक पाने के लिए तुच्छ नहीं है।
मैएल

1
ओवरहेड को कम करने के लिए आपको थ्रेड पूल का उपयोग करना चाहिए। en.wikipedia.org/wiki/Thread_pool
shawnhcorey

37

आपको डेटा के समानांतर हास्केल में शोध के बारे में पढ़ने में रुचि हो सकती है । यदि आप यूट्यूब पर खोज करते हैं, तो साइमन पेटन जोन्स ने इस विषय से संबंधित कुछ रोचक बातें बताई हैं।

अगर मुझे शुद्ध वार्ता में, शुद्ध कार्यात्मक प्रोग्रामिंग में, सही ढंग से याद है, तो धागे बनाने के अवसर खोजने के लिए यह लगभग तुच्छ है। अपने शोध में उसकी मुख्य समस्या हो रही है भी कई वह भी कम समय तक जीवित रहे, ऐसी है कि धागे बनाने और उनके परिणामों से संवाद स्थापित करने की भूमि के ऊपर अनिवार्य रूप से समानांतरवाद के लाभों को महत्वपूर्ण साबित। उदाहरण के लिए, गणना करने के लिए 100 थ्रेड को स्पिन करने के लिए एक कंपाइलर को सिखाना आसान है sum $ fmap (+1) <100 length vector>, लेकिन क्या ओवरहेड इसे सार्थक बना देगा?

ट्रिक तब थ्रेड को लाभकारी आकार में समेकित कर रहा है, बिना प्रोग्रामर पर बोझ डाले बिना कि मैन्युअल रूप से निरूपित करने के लिए। यह एक कठिन समस्या है जिसे हजारों कोर के साथ भविष्य के पीसी का प्रभावी ढंग से उपयोग करने के लिए दरार करने की आवश्यकता है।


8
मैं पहले से ही केवल सैकड़ों कोर के साथ एक पुराने ढंग के पीसी के साथ काम करके खुश हूँ ...
Hagen von Eitzen

8
मैं इसमें एक नोट को भारी डेटा-समानांतर डिज़ाइनों के लिए फेंकूंगा, हम पहले से ही बहुत अधिक समानांतरकरण कर रहे हैं: जीपीयू अनिवार्य रूप से 200-1000 कोर मशीनें हैं (उन्हें अपनी स्मृति पदानुक्रम भी मिल गई है)।
23

4
@HagenvonEitzen: अज़ुल वेगा JCA (जावा कंप्यूट उपकरण) में कुल 864 कोर के लिए 54 कोर के साथ 16 सीपीयू थे, और यह कुछ शोध-स्तर या प्रोटोटाइप मशीन नहीं था, लेकिन एक वास्तविक उत्पाद था। यह एक पूरी इमारत या एक पूरे कमरे को भी नहीं भरता था, यह एक डेस्क-साइड आकार का उपकरण था। और यह 9 साल पहले उपलब्ध था। जीपीयू पहले से ही उल्लेख किया गया था, हालांकि, यह 864 सामान्य प्रयोजन सीपीयू कोर के साथ एक मशीन थी ।
जोर्ग डब्ल्यू मित्तग

3
बेशक, वहाँ एक कारण है कि हम है है उन बड़े पैमाने पर डेटा समानांतर GPU के आज उन बड़े पैमाने पर मल्टी कोर सीपीयू डेस्कटॉप के लिए है है, लेकिन नहीं रह गया है। पूर्व व्यावसायिक रूप से व्यवहार्य हैं, बाद वाले नहीं हैं, और ऐसा इसलिए है क्योंकि आप कुशलता से उन्हें प्रोग्राम नहीं कर सकते हैं।
MSalters

@ स्तनधारियों को शायद हमें अनंत संख्या में बंदरों की आवश्यकता है? या, क्वांटम प्रोग्राम जो बस प्रत्येक चरण पर हर संभव ऑपरेशन चलाते हैं?

15

यह वही है जो एर्लैंग करता है। यह ज्यादातर कतारों का उपयोग करके धागे को फिर से जोड़ने का काम करता है। यह शानदार अवधारणा है लेकिन शुरू में अपने सिर को चारों ओर लपेटने के लिए थोड़ा मुश्किल है अगर आपकी पृष्ठभूमि अधिक प्रक्रियात्मक प्रकार की भाषाएं हैं। मैं अत्यधिक इसे देखने की सलाह देता हूं।


4

सबसे पहले मैं आपको PROMELA को देखने की सलाह दूंगा , जो एक समवर्ती एल्गोरिथ्म का वर्णन करने के लिए उपयोग की जाने वाली भाषा है ताकि एक मॉडल चेकर यह सुनिश्चित करने के लिए सभी संभावित निष्पादन को मजबूर कर सके कि यह गलत व्यवहार के लिए अक्षम है। (समवर्ती प्रोग्रामिंग कुख्यात है कठिन सही पाने के लिए है, जिसके कारण इस तरह के सत्यापन तकनीक महत्वपूर्ण हैं।) यह अलग धागे में सभी निर्माणों नहीं चलता है, लेकिन क्योंकि अपना ध्यान केंद्रित है यह नहीं बल्कि अजीब वाक्य रचना और शब्दों है nondeterminism समवर्ती कार्यक्रमों की।

और अधिक सार, calcul-पथरी समानांतर संगणना मॉडलिंग के लिए एक सुंदर दृष्टिकोण है। जब तक आपको रॉबिन मिलनर द्वारा बुक कम्यूनिकेटिंग और मोबाइल सिस्टम: द पाई कैलकुलस नहीं मिल जाता, तब तक अपना सिर पकड़ना मुश्किल है । इसने मुझे और अधिक व्यापक अर्थों में समानांतर गणना के बारे में सोचने में मदद की कि "एक साझा स्मृति तक पहुँचने वाले कई सूत्र"। यह काफी दिलचस्प है कि कैसे सशर्त बयान, "गोटो" और इसके बाद सरल, स्वाभाविक रूप से समानांतर आदिम से बनाया जा सकता है।

सिंटैक्स के संबंध में ... इसे बाहर काम करने का सबसे अच्छा तरीका कुछ नमूना कार्यक्रम लिखना है। एक सरणी को सॉर्ट करने के लिए एक प्रोग्राम लिखें, या समवर्ती पिंग कई सर्वर और रिपोर्ट करें कि कौन सबसे तेज प्रतिक्रिया करता है, या समानांतर में एक भूलभुलैया को हल करने का प्रयास करें, या क्या नहीं। जब आप ऐसा कर रहे हैं, तो आपके सिंटैक्स से गायब होने वाली चीजें स्पष्ट हो जाएंगी, और आप उन्हें जोड़ सकते हैं। आपके द्वारा कई चीजों को शामिल करने के बाद, अपने आप से पूछें कि क्या उनके पास कुछ सामान्य है, और यदि ऐसा है तो आप एक सरल दृष्टिकोण पा सकते हैं जो कई उद्देश्यों की पूर्ति कर सकता है।


4

पूर्व में भी इसी तरह की परियोजनाओं का प्रयास किया गया है। मेरा सुझाव है कि विचारों को लूटने के लिए क्लासिक्स पर पढ़ना। (सभी लिंक विकिपीडिया पर जाएं)

  • एकता यह भाषा समानांतर प्रोग्रामिंग सिखाने के लिए उपयोग की जाती है। मुझे नहीं लगता कि यह वास्तव में लागू किया गया था। सिंटैक्स कुछ हद तक गूढ़ है, लेकिन मूल रूप से आपके पास ऐसे बयानों का एक संग्रह है जो अज्ञात क्रम में और बार-बार निष्पादित होते हैं जब तक कि कुछ भी नहीं किया जाना है। यह आपके द्वारा मांगे जाने के निकटतम है।

  • ओकाम इस भाषा को वास्तव में उपयोग करने के लिए डिज़ाइन किया गया था, लेकिन यह वास्तव में कभी भी पकड़ा नहीं गया था। यहां एक कीवर्ड PAR है जिसका अर्थ है कि बयानों की एक सूची को समानांतर में निष्पादित किया जाना चाहिए।

  • Erlang एक और वास्तविक दुनिया की भाषा। यह एक टेलीकॉम कंपनी एरिक्सन द्वारा उपयोग किया जाता है और इसमें काफी निम्नलिखित है। उन्होंने समानता को व्यावहारिक और प्रयोग करने योग्य बनाने में बहुत काम किया है।

  • Google GO यह गुच्छा का मेरा पसंदीदा है। वैचारिक रूप से एर्लैंग के समान ही, लेकिन बेहतर सिंटैक्स और इसके पीछे Google के वजन के साथ। संभवतः क्या गलत हो सकता है?

मैं एक चेतावनी के साथ बंद करना चाहूंगा: समानांतरवाद सही होने के लिए बहुत कठिन है। आधुनिक कार्यक्रमों में अधिकांश कीड़े इसे गलत होने का परिणाम है । क्या आप वाकई वहां जाना चाहते हैं?


मेरी सूची में किसी भी भाषा के लिए कोई अपराध नहीं। यह सिर्फ इतना है कि मेरा ज्ञान सीमित है।
स्टिग हेमर

3

यह संभव है लेकिन यह सभी विचारशील अनुप्रयोगों के 99 +% के लिए उपयोगी नहीं होगा। लॉजिक टाइप-सीक्वेंस-बाउंड है, यह एक प्रवाह है। चरण दर चरण आप किसी समस्या के समाधान तक पहुँचते हैं और चरणों का क्रम मायने रखता है, ज्यादातर क्योंकि एक कदम का आउटपुट अगले के लिए इनपुट होगा।

कुछ मामलों में आपके पास बहुत सारे कार्य हैं जो एक दूसरे से स्वतंत्र रूप से किए जा सकते हैं, उन्हें समानांतर में चलने देने से पहले उन्हें क्रमिक रूप से सेट करना सस्ता है।

इसलिए, मुझे लगता है कि आपका समय सीखने में बेहतर होगा कि आप अपनी पसंदीदा प्रोग्रामिंग भाषा में मल्टी-थ्रेडिंग सुविधाओं का उपयोग कैसे करें।


5
यह एक अलग प्रश्न का एक उत्कृष्ट उत्तर है; ओपी इस तरह की योजना के बारे में नहीं पूछ रहा है, लेकिन केवल यह किया जा सकता है और "सिंटैक्स" कैसा दिखेगा।
डिप्रैडडैनियल

9
जो लोग इसके लिए नहीं पूछते, उन्हें मेरी समझदारी की सबसे ज्यादा जरूरत है। अगर कोई पूछता है कि क्या एक शॉपिंग कार्ट में पहाड़ी पर उतरना संभव है, तो सबसे अच्छा जवाब यह नहीं होगा "आप शर्त लगा लें! उन्हें पहियों को चिकना करना सुनिश्चित करें!"। यह अधिक "वेल, हां, लेकिन ..." जैसा होगा।
मार्टिन माट

मुझे पुराने EIAO विधानसभा भाषा निर्देश की याद दिलाता है - किसी भी क्रम में निष्पादित करें । (और वह भी किसी भी कुंजी कहाँ है?)

@MartinMaat मौज
user253751

2

क्लोजर कुछ विचारों के लिए देखने लायक हो सकता है।

http://clojure-doc.org/articles/language/concurrency_and_parallelism.html

यहाँ कुछ विचार दिए गए हैं: यदि हम गणना की एक इकाई कहते हैं जिसे स्वतंत्र रूप से कार्य किया जा सकता है: 1. कार्य स्वतंत्र हैं इसलिए समवर्ती रूप से चलाया जा सकता है। विभिन्न कार्यों के लिए अलग-अलग संसाधनों की आवश्यकता होती है और चलाने के लिए अलग-अलग समय की आवश्यकता होती है। इसलिए कार्यों को निर्धारित किया जाना चाहिए। अधिकतम थ्रूपुट के लिए 4. एक अनुसूचक के रूप में कार्य करने की स्थिति में एकमात्र कार्यक्रम ऑपरेटिंग सिस्टम है

सेब भव्य केंद्रीय प्रेषण जैसी चीजें इस तरह के एक अनुसूचक को प्रदान करने का एक प्रयास है।

उपरोक्त का अर्थ है कि कार्यों को निष्पादित करने की जिम्मेदारी जरूरी नहीं है कि प्रोग्रामिंग भाषा।

एक दूसरा विचार यह है कि प्रोग्रामिंग समानांतर प्रणालियों के बोझ को जितना संभव हो कम किया जाए। ऐसा करने का एकमात्र तरीका किसी भी विनिर्देश को दूर करना है कि कार्यक्रम से कुछ कैसे किया जाए। एक प्रोग्राम में केवल वही होना चाहिए जो किया जाना चाहिए और बाकी चीजें अपने आप हो जाएं।

ऊपर शायद इसका मतलब है कि गतिशील भाषाओं और बस समय संकलन में जाने का रास्ता है।


2

आप जिस चीज़ की तलाश कर रहे हैं उसे अंतर्निहित समानतावाद कहा जाता है, और ऐसी भाषाएँ हैं जिन्होंने इस अवधारणा का पता लगाया है, जैसे कि Sun / Oracle का किला । अन्य बातों के अलावा, यह (संभावित) समानता में छोरों को चलाता है।

दुर्भाग्य से, इसे बंद कर दिया गया है और वहां बहुत सारे मृत लिंक हैं, लेकिन आप अभी भी कुछ पीडीएफ वहां पा सकते हैं, अगर आप बहुत मुश्किल से गूगल करते हैं:

https://www.eecis.udel.edu/~cavazos/cisc879-spring2008/papers/fortress.pdf (भाषा कल्पना)

http://stephane.ducasse.free.fr/Teaching/CoursAnnecy/0506-Master/ForPresentations/Fortress-PLDITutorialSlides9Jun2006.pdf

http://www.oracle.com/technetwork/systems/ts-5206-159453.pdf

http://dl.acm.org/citation.cfm?id=1122972 (भुगतान किया गया)

ध्यान देने योग्य बात यह है कि आप आम तौर पर हर कथन / अभिव्यक्ति के लिए एक वास्तविक धागा शुरू नहीं करना चाहेंगे, क्योंकि धागे बनाना और शुरू करना महंगा हो जाता है - इसके बजाय, आपके पास थ्रेड्स का पूल होगा, जिसमें आपको काम करने की आवश्यकता होती है। । लेकिन यह एक कार्यान्वयन विवरण है।


1
मंटियोनिंग किले के लिए +1 ... मुझे भाषा का विचार बहुत पसंद आया। मैं वास्तव में दुखी था जब उन्होंने घोषणा की कि विकास बंद कर दिया गया ...
रोलाण्ड टीप

2

जबकि प्रोग्रामिंग भाषा नहीं है, इसलिए आपको वीएचडीएल पर एक नज़र रखना चाहिए । इसका उपयोग डिजिटल सर्किटरी का वर्णन करने के लिए किया जाता है, जो स्वाभाविक रूप से समानांतर में सब कुछ करता है जब तक कि आप विशेष रूप से इसे धारावाहिक रूप से करने के लिए नहीं कहते हैं। यह आपको कुछ विचार दे सकता है कि आपकी भाषा को कैसे डिज़ाइन किया जाए और यह किस प्रकार का तर्क हो सकता है।


0

इसे C ++ में काफी आसानी से सिम्युलेट किया जा सकता है। बस यह सुनिश्चित करें कि "हर" * फ़ंक्शन कॉल एक द्वारा कार्यान्वित किया जाता है std::future। रिटर्न वैल्यू को हैंडल .get()करना भविष्य में कॉल करके किया जाता है ।

इसलिए, आप C ++ को संकलित करके अपनी भाषा को प्रोटोटाइप कर सकते हैं। यह हमें यह भी बताता है कि वाक्यविन्यास कैसा दिखेगा: मुख्य अंतर यह है कि आप कॉल प्वाइंट (जहां इनपुट तर्क प्रदान किए जाते हैं) को रिटर्न प्वाइंट (जहां फ़ंक्शन आउटपुट का उपयोग किया जाता है) से अलग करते हैं।

(*) मैं कहता हूँ "हर फंक्शन" लेकिन यह आप पर निर्भर करता है कि फंक्शन के रूप में क्या मायने रखता है। है memsetएक आंतरिक या एक समारोह? क्या पूर्णांक का असाइनमेंट, या उपयोगकर्ता द्वारा परिभाषित प्रकारों का असाइनमेंट एक फ़ंक्शन कॉल है?


और, यदि आप किसी प्रश्न का उत्तर काफी पहले दे देते हैं, तो आमतौर पर उत्तर की आवश्यकता समाप्त हो जाती है। मुझे लगता है कि यह "आलसी मौजूदा" कहा जाता है।
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.