क्या यह सच है कि सी कंपाइलरों के पहले संस्करण दर्जनों मिनट तक चले और चरणों के बीच फ्लॉपी डिस्क की अदला-बदली की आवश्यकता थी?


15

इस सवाल से प्रेरित ।

मैंने सुना है कि व्यक्तिगत कंप्यूटरों के लिए सी कंपाइलरों के कुछ बहुत ही शुरुआती संस्करण (मुझे लगता है कि यह 1980 के आसपास है) दो या तीन फ्लॉपी डिस्क पर रहते थे और इसलिए एक प्रोग्राम को संकलित करने के लिए किसी को पहले "पहले पास" के साथ डिस्क सम्मिलित करना था, चलाएं "पहला पास", फिर "दूसरी पास" के साथ डिस्क में बदलें, उसे चलाएं, फिर "तीसरे पास" के लिए भी ऐसा ही करें। प्रत्येक पास दर्जनों मिनट तक चला, इसलिए डेवलपर को टाइपो के मामले में बहुत समय गंवाना पड़ा।

वह दावा कितना यथार्थवादी है? वास्तविक आंकड़े और विवरण क्या थे?


2
ऐसा लगता है कि यह सच हो सकता है। 60 के दशक में, जब प्रोग्राम पंच कार्ड या पेपर टेप पर होते थे, तो एक प्रोग्रामर को टाइपो के बारे में जानने के लिए एक दिन से अधिक इंतजार करना पड़ सकता था।
क्रिस कार्ड

3
दिलचस्प सवाल। अगर यह सच था, मुझे खुशी है कि मैं अभी और नहीं जी रहा हूँ;)
Anto

2
मुझे याद है कि Amstrad पर्सनल कंप्यूटर पर पास्कल संकलित करने के लिए कई बार स्वैप करना पड़ता है ।
मार्टिन यॉर्क

खैर एक दिन इंतजार करने की बात इतनी नहीं थी कि नौकरी का समय हो, सामने सामान की कतार थी। ऐसे स्थान हुआ करते थे, जहाँ आप अपने कार्ड का डेक जमा करने के लिए जाते थे और एक सफेद कोट में कुछ नाज़ी इसे ले जाते थे और कार्ड्स को हॉपर में रख देते थे। रन समय केवल कुछ मिनट या सेकंड हो सकता है। मानव प्रसंस्करण समय अक्सर घंटों में था।
जल्दी_बस

4
मैंने आधुनिक दिन C ++ प्रोजेक्ट्स को देखा है कि एक पूर्ण स्वच्छ और पुनर्निर्माण में दर्जनों मिनट लगते हैं, और डिस्क स्वैप के बजाय यह ओएस के माध्यम से स्वचालित रूप से वर्चुअल मेमोरी पेज कर रहा है। हर कोई क्यों कहता है कि कंप्यूटर इन दिनों इतने उन्नत हैं? =)
पैट्रिक ह्यूजेस

जवाबों:


29

पूर्ण रूप से। मेरे पास 80 के दशक के शुरुआती दिनों में एक जेनिथ Z100 कंप्यूटर के लिए Microsoft C (संस्करण 1.0, मुझे लगता है) था जो कई 5.25 "360K फ्लॉपी डिस्क पर दिया गया था। Z100 में एक हार्ड डिस्क नहीं थी इसलिए मुझे स्विच करते समय अक्सर फ्लॉप होना पड़ता था। संपादक, संकलक और लिंकर के बीच। कई मिनटों का संकलन और लिंक समय असामान्य नहीं था। यह इतना परेशान करने वाला था कि मैंने 2 एमबी (हाँ, मेगाबाइट) मेमोरी विस्तार बोर्ड के लिए $ 500 का भुगतान किया ताकि मैं सभी फाइलों को लोड कर सकूं। रैम डिस्क। उस समय को लगभग 30 सेकंड तक काट दिया। मजेदार ... मुझे वास्तव में उन दिनों में वापस प्रोग्रामिंग का आनंद मिला क्योंकि यह मजेदार था। आज यह काम कर रहा है।


+1 हालांकि मेरे पास विपरीत भावना है। अपने awser प्रोग्रामिंग को पढ़ने के बाद आज अचानक मजेदार लगता है।
साइमन बर्गोट

Microsoft C 1.0 वास्तव में Lattice C. AFIK का एक रीपैकेज किया गया संस्करण था, Lattice C पहला MS-DOS C कंपाइलर था। इसके लिए दो अलग-अलग रन कंपाइलर पास की आवश्यकता थी।
ओल्डफार्ट

1
ओह! 2 एमबी! उस समय के लिए यह बहुत बड़ा था ।
सिस्टम डाउन

मैंने आईबीएम पीसी पर टर्बो सी 1.0 का उपयोग किया (ठीक है, वास्तव में एटी अगर मुझे सही याद है) और यह उतना बुरा नहीं था। हालांकि वे तेज़ मशीनें थीं।
को रोबोट

9

यह शायद सच है।

होम कंप्यूटिंग के शुरुआती दिनों में (बच्चों / अभिभावकों के लिए हॉबीस्ट नहीं) मशीनों में हार्ड ड्राइव भी नहीं थे।

मेरे माता-पिता के पास एक Amstrad था OS 1 फ्लॉपी पर था और इसने आपको एप्लिकेशन को चलाने के लिए चयन करने की अनुमति दी थी जिसमें फ्लॉपी डिस्क स्विच करना आवश्यक हो सकता है (यानी वर्ड प्रोसेसर एक अन्य डिस्क पर था) यदि ओएस डिस्क पर मैन्युअल स्विच बैक की आवश्यकता होती है तो आवेदन कुछ विशेष OS सेवा की आवश्यकता है।

मेरे पास अमस्त्र के लिए पास्कल की एक प्रति थी। मुझे याद है कि संपादक 1 डिस्क पर है, लेकिन संकलन के दौरान उसे डिस्क 1 और डिस्क 2 के बीच आगे और पीछे स्विच करने की आवश्यकता होती है क्योंकि संकलन प्रक्रिया जारी रहती है (इसे कुछ प्रक्रियाओं में ओएस डिस्क पर स्विच की आवश्यकता हो सकती है, लेकिन यह नहीं है कि मैं नहीं हूं इतना यकीन है कि बंद)।

एक अच्छा पुराना दिन जब पूरा ओएस एक ही 3.5 फ्लॉपी डिस्क पर फिट होता है (लेकिन बहुत ज्यादा नहीं)।


4
एकदम सच। जब "लाइटस्पेड सी" कंपाइलर मैकिंटोश के लिए निकला और एमएस-डॉस पीसी के लिए "टर्बो सी" हम एक्स्टेटिक थे क्योंकि यह एक ही पास में चलता था।
एस.लॉट

3.5? मेरे परिवार के Amstrad में 2.5 "फ्लॉपी ड्राइव था। और हाँ, CP | M 4 के सेट के डिस्क 1 पर था, और लोगो 4 डिस्क पर था। मुझे याद नहीं है कि वहां और क्या था।
पीटर टेलर

@ पेटर टेलर: आपके सही होने की संभावना अधिक है। यह बहुत समय पहले की बात है (मुझे पुराना लगता है)।
मार्टिन यॉर्क

1
मेरे लिए कोई समस्या नहीं थी। जब मैंने C सीखा, तो मेरे पास एक अच्छा बड़ा 21 MB हार्ड ड्राइव था :-)
dan04

1
@ dan04 - हमारे सामूहिक लॉन से बाहर निकलें। धिक्कार है व्हिपर स्नैपर और उनके फैंसी शम्सी हार्ड ड्राइव .....;)
सिस्टम डाउन

6

फ्लॉपी डिस्क को 1971 में पेश किया गया था - (8 इंच की फ्लॉपी डिस्क, जो है), लेकिन 70 के दशक के मध्य तक (5.25 इंच के डिस्क के साथ) लोकप्रिय नहीं थे। सी 1973 से है, इसलिए मुझे लगता है कि उत्तर काफी हद तक इस बात पर निर्भर करता है कि आप "पहले संस्करण" को क्या कहते हैं और संकलन संदर्भ क्या था। इन चरों के बारे में सोचें:

  • पुस्तकालयों का इस्तेमाल किया । जब एक लाइब्रेरी संकलित करना जो वर्तमान डिस्क पर नहीं है, तो आपको बीच में फ्लॉपी डिस्क को बदलना होगा।
  • कार्यक्रम की जटिलता ("हैलो वर्ल्ड" "नॉर्टन कमांडर" के समान नहीं है)
  • हार्डवेयर (व्यक्तिगत रूप से, मुझे लगता है कि गंभीर संकलन लगभग हमेशा मेनफ्रेम या मिनीकंप्यूटर पर किया गया था)

आखिरकार - इन दिनों, संकलन में अभी भी कई मिनट लगते हैं - बस अपने हार्डवेयर और प्रोग्राम की जटिलता के बीच ट्रेडऑफ़ को समायोजित करें। केवल फ्लॉपी डिस्क भाग :-) नहीं है।

यह भी ध्यान में रखें कि 70 के दशक में बहुत अधिक कंप्यूटिंग अभी भी एक टर्मिनल-मेनफ्रेम निर्माण पर की गई थी, इसलिए फ्लॉपी डिस्क को बदलना कुछ हद तक असंभव है (कम से कम व्यावसायिक उत्पादन के संदर्भ में। मुझे नहीं पता कि सी का उपयोग "घर" के रूप में किया गया था। " भाषा: हिन्दी)।


5
"पहला" संस्करण फ्लॉपी पर नहीं चला। यह AT & T पर हार्ड-डिस्क आधारित पीडीपी -11 प्रणाली थी। हालाँकि, फ्लॉपी (यानी CP / M, MS-DOS, इत्यादि) वाले कंप्यूटर के लिए पहला संस्करण प्रबंधित करना काफी मुश्किल था।
S.Lott

मुझे याद है कि 60 के दशक से एक फ्लॉपी (हटाने योग्य डिस्क) देखना। यह 4 फीट के पार था। उन्हें प्लाईवुड पर रखा गया था ताकि उन्हें लैब के चारों ओर घुमाया जा सके। जैसा कि मुझे याद है 5K के बारे में।
मार्टिन यॉर्क

आप प्रत्येक संकलक चलाने के लिए एक को बदलना नहीं चाहते हैं! उस एक चित्र को देखना पसंद करेंगे :-)।
15

6

C सीखने में मेरी पहली भूमिका एक कमोडोर 64 पर थी (हाँ, इसके लिए एक संकलक था), 80 के दशक के उत्तरार्ध में। यदि मुझे सही ढंग से याद है, संकलक / संपादक / लिंकर एक डिस्क पर था और आपका स्रोत दूसरे पर था और आपको संकलन चरण के दौरान कम से कम एक बार स्वैप करना था। बेशक, सी -64 पर, आप हमेशा स्वैपिंग करते हैं।

इसके लायक क्या है, मेरे पास अभी भी उस कंपाइलर के लिए बॉक्स और डॉक्स हैं। हर दो साल में कुछ उदासीन पढ़ने के लिए बनाता है।


2
मैंने 1984 में कमोडोर 64 पर भी सी सीखा। मुझे याद है कि स्पष्ट रूप से संकलन के दौरान फ्लॉपी की अदला-बदली हुई थी। मैं यह कहना चाहता हूं कि मैं अबेकस द्वारा एक कंपाइलर का उपयोग कर रहा था, लेकिन मुझे शायद यह याद नहीं है।
क्लिंट मिलर

@ क्लिंट, मुझे यकीन है कि आप सही हैं। यह बॉक्स पर नाम है।
देवसोलो

@ क्लिंट: मेरे पास एक ही कंपाइलर था। कमोडोर 64 पर प्रोग्रामिंग सीखने के लिए एक भयानक कंप्यूटर था। यह वास्तव में कुछ शांत सामान करने के लिए पर्याप्त उन्नत था लेकिन इतना सरल है कि आप उन सभी हार्डवेयर को समझ सकते हैं जिनके साथ आपको बातचीत करने की आवश्यकता है, जो कि आवश्यक था क्योंकि उनके पास उच्च स्तर की अमूर्त परतें नहीं थीं जो तब उनके पास थीं।
डंक

6

मेरा पहला C कंपाइलर TRS-80 मॉडल 4 पर चल रहा था जो CP / M (पहला मॉडल जो ठीक से करेगा, कम मेमोरी वाले स्थानों को स्थायी रूप से ROM में मैप नहीं किया जाएगा)। यह पहली ड्राइव में डिस्क की आवश्यकता है उस पर CP / M है।

एक बार जब मैं जो भी संपादक का उपयोग कर रहा था, उसके साथ मुझे इसे चलाने से पहले कार्यक्रम को संकलित करना, इकट्ठा करना और लिंक करना था। प्रत्येक की अपनी प्रक्रिया थी, कमांड लाइन पर लात मारी। संकलक, कोडांतरक और लिंकर सभी एक फ्लॉपी पर फिट नहीं होंगे। (IIRC, कोडांतरक और लिंकर एक साथ फिट हो सकते हैं।)

इसलिए, मेरे पास CP / M सिस्टम डिस्क पर प्रोग्राम और संपादक होगा, और कंपाइलर और कोडांतरक / लिंकर डिस्क में स्वैप करना होगा।

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

मैंने उस प्रणाली का उपयोग करने की कोशिश करने के बाद सी पर बहुत अधिक छोड़ दिया, और कई वर्षों तक पास्कल में वापस चला गया।


शायद यूसीएसडी पी-सिस्टम पास्कल?
जल्दी_बस

2
@quickly_now: कुछ ऐसा है जो पी-कोड के लिए संकलित है, लेकिन इसे यूसीएसडी के रूप में बिल नहीं किया गया था। स्वाभाविक रूप से, मुझे इससे दशकों पहले छुटकारा मिल गया था, और इसके बारे में बहुत कम याद है। जब मुझे टर्बो पास्कल मिला, तो मैं इसके बारे में बहुत कुछ भूल गया।
डेविड थॉर्नले

5

जब मैं हाई स्कूल में था (1989-1990) हम एक सेब द्वितीय पर पास्कल कर रहे थे और यह धीमी थी । आप 100 लाइनों का कार्यक्रम लिख सकते हैं या जब आप संकलित करते हैं तो कुछ मिनट लगते हैं। मुझे याद है कि आपके पास मेन्स के कमरे में जाने का समय था, जबकि यह कार्यक्रम चलने से पहले संकलन कर रहा था।

लगभग आधे रास्ते ने उस शब्द को फेंक दिया मुझे मैक एसई मिला जो इतना तेज था! सोचो पास्कल कितना बेहतर था।


2
मैक एसई का उल्लेख करने के लिए +1। मुझे याद है कि मेरे मैक एसई के लिए 20MB बाहरी हार्ड ड्राइव मिल रहा है। यह इतना बड़ा था कि पूरा मैक उसके ऊपर बैठ गया।
फिलोसोडैड

मेरे पास एक आंतरिक था, लेकिन मैं उनमें से एक भी हो सकता था। वास्तव में बहुत अच्छा डिजाइन।
ज़ाचरी के

5

मेरे एक दोस्त के पिता दिन में एक हाई प्रोफाइल प्रोग्रामर थे। वह अपने संकलन, दिनों, कभी-कभी सप्ताह के परिणामों की प्रतीक्षा करने के लिए थक गया। ज्यादातर घर से काम किया जाता है, कार्यक्रम लिखते हैं, कार्ड पंच करते हैं, ड्राइव करते हैं, ऑपरेटर को बॉक्स देते हैं और थोड़ी देर के लिए तर्क देते हैं कि उनका कोड अधिक महत्वपूर्ण था कि सभी अन्य और प्रतीक्षा करें।

कभी-कभी कोड कभी भी कंप्यूटर तक नहीं पहुंचता था, मेरे दोस्त ने मुझे उस समय की कहानी बताई जो उसके पिता ने सच में बताई थी। वह वास्तव में कभी नहीं समझ पाया कि जीवन में बहुत बाद तक लेकिन कठोर कागजात से भरा यह लड़का कितना मजेदार लग रहा था ... अरे उनका पूरा छेद भी !!!

एक दिन उन्होंने प्रबंधन को तर्क दिया और मुझे लगता है कि उन्होंने एक अच्छा मामला बना दिया क्योंकि उन्होंने अपने घर में एक मिनी-कंप्यूटर दिया। मुझे यह उल्लेख करना चाहिए कि तब तक, कंप्यूटर ने अधिकांश लिविंग रूम को ले लिया था, जो निश्चित रूप से बंद सीमाएं बन गईं।

तो हां, एक संकलन में चरणों के बीच स्वैपिंग डिस्क एक निश्चित संभावना है और मुझे विश्वास है कि जब मैं कहता हूं कि इससे पहले जो उपलब्ध था उससे यह एक बड़ा सुधार था !!!

बस 20 साल या तो इंतजार करें, मैं कल्पना कर सकता हूं कि कोई व्यक्ति कुछ सवाल पूछ रहा है जैसे:

क्या यह सच है कि इससे पहले, उन्हें अपने कोड लेटर को टाइप करने के लिए कीबोर्ड का इस्तेमाल करना पड़ता था?


3

मैं C के बारे में नहीं जानता, लेकिन उस समय सीमा में मेरे पास एक microsoft Fortran संकलक था जिसने दो पास लिए। इतना ही नहीं, लेकिन मेरे पास एक पेज लंबा कार्यक्रम था जो गलत तरीके से चला (मुझे यकीन है कि सोर्सकोड सही था), इसलिए यह वही था, मैंने पीसी के लिए पूरी तरह से संकलन करने पर छोड़ दिया। यह पूर्व-इंटरनेट के दिन थे, और पीसी मेरे नियोक्ता के थे। पीसी होना अभी भी बहुत अच्छा था, मैं एक फ्लॉपी पर काम कर सकता था और इसे घर ले जाकर संपादित कर सकता था। इसलिए जब मुझे अगले दिन काम करना पड़ा, तो मेरे पास पहले से ही एक संपादित कार्यक्रम था, बल्कि फिर हस्तलिखित नोट्स।

यहां तक ​​कि पहले के दिनों में, (मैं 70 के वसंत प्रोग्रामिंग शुरू कर रहा था), संकलक एक बैच JCL कमांड मेनफ्रेम ओएस प्रसंस्करण था। यह ऊपर वर्णित की तरह है। आपने कीपंच के लिए कतार में इंतजार किया, और अपने होलरिथ कार्ड को मुक्का मारा। फिर आपने उन्हें एक खिड़की के माध्यम से एक ऑपरेटर को सौंप दिया। आपके पीएनसी के रंग (मूल रूप से अकाउंट नंबर / पासवर्ड वाला एक छिद्रित कार्ड) के आधार पर, आप अपने परिणाम 1 से 24 घंटे बाद प्राप्त कर सकते हैं। निम्न स्तर के छात्रों में बाद में बदलाव आया। यह वास्तव में एक चुनौती थी कि "हैलो वर्ल्ड" असाइनमेंट को दो सप्ताह में समाप्त कर दिया जाए! कुछ साल बाद मुझे एक पार्ट टाइम प्रोग्रामिंग की नौकरी मिली, और रात में कंप्यूटर सेंटर में घूम सकते थे। हममें से कुछ लोग कार्डधारी को खुद भी खिला सकते थे। इसके बाद केवल कुछ मिनटों के लिए वाईआरएस उलटफेर कर सकता है।

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


2

जी हां निश्चित तौर पर। मैंने उन पुरानी CP / M मशीनों पर C का उपयोग नहीं किया, मैंने CB-80 का उपयोग किया। संकलित बुनियादी। (और हाँ यह बहुत भयानक था)। हीथ / जेनिथ Z-89 पर 2 फ्लॉपी ड्राइव के साथ प्रत्येक को 89K आयोजित किया गया।

एकल डिस्क संकलन इतना भयानक था कि इसे भूलने का मामला था। बहुत ज्यादा डिस्क स्वैपिंग। 2 फ्लॉपी ड्राइव लक्सरी थी! एक पर स्रोत, दूसरे पर संकलक। एक संकलन चाय जा रहा है और चाय के कप के लिए दूर चलें, जबकि मशीन "क्लैंग क्लैंग क्लैंग" गई क्योंकि फ्लॉपी लगे हुए थे और अस्त-व्यस्त थे और सिर ने टक्कर मार दी।

बॉस ने एक 5 एमबी की हार्ड ड्राइव खरीदी, जो लगभग 18x18x8 इंच की थी, अलग से संचालित थी, और H89 के पीछे एक रिबन केबल के साथ लगभग 4 फीट लंबी थी।

ओह गति! और क्षमता! 5 एमबी स्टोरेज के साथ।


1

सी के बारे में नहीं जानते (मेरा पहला सी कंपाइलर हार्ड ड्राइव से चला था, और तेज़ नहीं था), लेकिन पहले मैक्रो असेंबलर का मैंने इस्तेमाल किया (C64) को फ्लॉपी-डिस्क स्विचिंग की आवश्यकता थी (एक कोडांतरक को लोड करने के लिए, दूसरा लोड करने के लिए) कोड), सिस्टम को बनाने में 20+ मिनट का समय लगा, और विकास के कुछ महीनों के बाद फ्लॉपी डिस्क ड्राइव और मदरबोर्ड दोनों ओवरहीट हो गए और उनकी मृत्यु हो गई।


1

1988 में कॉलेज = एक पीसी पर फोरट्रान, 8088 512K (कि एक के !!) राम और एक एकल फ्लॉपी ड्राइव के संकलन में 20-30mins लगे, मुझे फ्लॉपी को स्वैप नहीं करना पड़ा क्योंकि मेरे पास उन नए 720K में से एक था।

एक Sun3 (68030 1Mb RAM) और पूरे वर्ग के लिए 24 vt100 टर्मिनल।


1

मेरे समय से पहले, मुझे लगता है। मेरी पहली "वास्तविक" प्रोग्रामिंग (पीसी पर, वैसे भी) COBOL थी। उस समय हमने IBM PC का उपयोग किया था। उनके पास 2 360k फ्लॉपी ड्राइव थे; एक के पास कंपाइलर था, और दूसरे के पास आपका सोर्स कोड था।

मुझे पता है कि मेरी साधारण कॉलेज परियोजनाओं को भी उन फ्लॉपियों पर चलने के लिए संकलित करने में 15 मिनट लगते थे - मैं कॉफी के लिए कैफेटेरिया चला जाता था जबकि यह संकलन था। फिर अंतिम परियोजना के लिए मैंने अपने दोस्तों के घर पर इस पर काम किया। वह बस एक नई मशीन को इस चीज के साथ मिल जाएगा जिसे हार्ड ड्राइव कहा जाता है - 10 मेगाबाइट्स! हमारी परियोजना एक मिनट के भीतर संकलित की गई। इसने मेरे दिमाग को पूरी तरह से उड़ा दिया।


आप सबसे अधिक संभावना है कि कोई डिस्क बफ़र सेट नहीं किया है। बस कुछ चमत्कार किया।

1

मुझे विभिन्न अनुप्रयोगों के लिए अपने पुराने 128 के मैक पर फ्लॉपी नृत्य करना था, इसलिए मुझे एक मिनट के लिए भी इस पर संदेह नहीं है, हालांकि मैं कोई विवरण नहीं दे सका। मुझे आश्चर्य नहीं होगा कि यह क्यों नहीं है कि बुनियादी व्याख्याकार प्रारंभिक व्यक्तिगत कंप्यूटरों पर बहुत सर्वव्यापी थे (कई पास, प्रतीक तालिकाओं आदि की कोई आवश्यकता नहीं)।

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