क्या ब्राउजर में क्लाइंट-साइड उपयोग के लिए अजगर बहुत धीमा होगा?


17

मैंने बयान सुना है कि पायथन ब्राउज़रों में किसी भी उपयोग के लिए बहुत धीमा होगा।

मैं जावास्क्रिप्ट को इस पहलू से बेहतर मानता हूं क्योंकि Google जैसी कंपनियों को इसकी आवश्यकता है (और इसे तेजी से बनाया गया है) क्योंकि उन्हें जीवित रहने के लिए इसकी आवश्यकता है, लेकिन मैं गलत हो सकता हूं।

क्या कोई अंतर है कि पायथन और जावास्क्रिप्ट को कैसे डिज़ाइन किया गया है, जो ब्राउज़रों में कैसे (वे) प्रदर्शन करते हैं, इस पर प्रभाव पड़ता है?

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


2
ब्राउज़र में अजगर? वह कब हुआ?
यानिस

6
यह नहीं था नोटिस would?
प्रोफैट्स

16
अगर ऐसा नहीं हुआ है, तो मैं नहीं देखता कि सवाल क्या है। जब हम प्रदर्शन की बात कर रहे होते हैं, तो हम भाषाओं के बारे में बात नहीं कर रहे होते हैं, लेकिन भाषाओं के कार्यान्वयन के बारे में (और कई कार्यान्वयन मौजूद हैं जैसे कि जावास्क्रिप्ट के लिए करते हैं)। यदि कोई ग्राहक पक्ष पायथन कार्यान्वयन नहीं है, तो इसके बारे में बात करने के लिए क्या है?
यानिस

1
सैद्धांतिक विज्ञान! : D मेरा प्रश्न किसी के द्वारा दिए गए कथन से आता है, इसलिए शायद इसका भाषाओं के साथ कुछ करना है (हालांकि मुझे विश्वास नहीं है कि)।
प्रोफैट्स

1
COM इंटरफ़ेस के माध्यम से एक बार इंटरनेट एक्सप्लोरर के लिए पायथन एकीकरण कार्यान्वयन था, जिसने DOM को स्क्रिप्ट करने के लिए एक VBScript विकल्प भी सक्षम किया था। मुझे लगता है कि एमएस ने 5 या 6 संस्करण में COM एकीकरण का उपयोग करने का विकल्प बंद कर दिया, याद नहीं कर सकता।
मार्टिज़न पीटरर्स

जवाबों:


23

शुरू करने के लिए, हमें भाषाओं और कार्यान्वयन के बीच स्पष्ट अंतर करना चाहिए । एक भाषा एक अमूर्त चीज है, कार्यान्वयन एक ठोस चीज है जिसे प्रदर्शन को मापा जा सकता है। उदाहरण के लिए, लिस्प को कभी-कभी व्यावहारिक उपयोग के लिए बहुत अक्षम माना जाता था, लेकिन संकलक परिपक्व होते रहे और अंततः, इसके लिए समर्पित हार्डवेयर विकसित किया गया; 1980 के दशक में एक बिंदु पर यह उच्च प्रदर्शन कार्य केंद्र विकास के लिए पसंद का विकास मंच था।

उस ने कहा, इसका सबसे सरल उत्तर यह है कि Google का V8 जैसा तेज़ जावास्क्रिप्ट कार्यान्वयन पानी से बाहर अजगर (CPython) के मानक कार्यान्वयन को उड़ा देता है । V8 एक JITer के साथ एक उच्च अनुकूलित आभासी मशीन है जो आश्चर्यजनक रूप से तेज़ है जबकि CPython तुलना में काफी सरल VM है। एक जेआईटी के साथ पायथन का कार्यान्वयन है, लेकिन यह अभी भी केवल 5-6x तेज है।

पांच साल पहले यह एक अलग कहानी होती। ब्राउज़रों के पास सरल जावास्क्रिप्ट कार्यान्वयन था क्योंकि गति कोई चिंता का विषय नहीं था क्योंकि किसी ने भी इसके साथ 'वास्तविक' सॉफ़्टवेयर नहीं बनाया था और यदि तेजी से नहीं होता तो पायथन बराबर होता।


यह अभी तक का सबसे व्यावहारिक जवाब है। इसलिए यह समय और पैसा नहीं है।
प्रोपासैच

7
"पाँच साल पहले यह एक अलग कहानी होती" ... और अब से पाँच साल बाद यह फिर से अलग हो सकती है।
ब्रायन ओकली

1
>> एक भाषा एक अमूर्त चीज है, कार्यान्वयन एक ठोस चीज है जिसे प्रदर्शन मापा जा सकता है। << हां, एक प्रोग्रामिंग भाषा कार्यान्वयन एक ठोस चीज है। नहीं, एक प्रोग्रामिंग भाषा कार्यान्वयन में एक औसत दर्जे का संपत्ति प्रदर्शन नहीं है। प्रदर्शन विशेष कार्यक्रमों की एक संपत्ति है जो एक विशेष संदर्भ में एक भाषा कार्यान्वयन का उपयोग करते हैं।
इगौई

2
@igouy तो अगर मैं दो कार्यात्मक समान कार्यक्रम, सी में एक, और पायथन में एक लिखने के लिए थे, तो आप प्रदर्शन अंतर को आवेदन की संपत्ति मानेंगे, न कि भाषा कार्यान्वयन?
सशर्त

1
@ कोंडिशनरेज़र: एक ही प्रोग्राम को लिखने के कई अलग-अलग तरीके हैं, इसलिए भले ही प्रोग्राम के एक अजगर संस्करण में सी संस्करण से अलग प्रदर्शन विशेषताएं हों, यह साबित नहीं होगा कि कोई भी अजगर संस्करण सी संस्करण के बराबर नहीं हो सकता है। Asm.js जैसी चीजें देखें ... किसी भी भाषा में आप अपने सभी प्रोग्राम की स्थिति को संग्रहीत करने के लिए एक विशाल सरणी का उपयोग कर सकते हैं, और भाषा के आदिम संचालन के एक छोटे से आसानी से अनुकूलन योग्य उपसमुच्चय का उपयोग कर सकते हैं। (जैसा कि वे कहते हैं "आप किसी भी भाषा में सी लिख सकते हैं"।)
मकरसे जुले

5

वेब के पुराने समय में, जब जावा एप्लेट्स, जहां क्लाइंट साइड इंटरेक्टिव कंटेंट लोगों का मुख्य एकमात्र रूप था, ने महसूस किया कि वेब पेज पर एपलेट्स के साथ बातचीत करने में सक्षम होने के लिए वेब पेज पर फॉर्म प्राप्त करने का एक तरीका होना चाहिए।

इससे जावा एप्लेट को वेब पेज से लिंक करने के लिए एक स्क्रिप्टिंग लैंग्वेज नाम ... जावास्क्रिप्ट के साथ बनाई गई थी।

एसओ सवालों के साथ इस विरासत की प्रतिष्ठा को देख सकते हैं जैसे कि [ 1 ], [ 2 ], [ 3 ] - और दो आधिकारिक दस्तावेज: जावास्क्रिप्ट कोड को एक एप्लेट से लागू करना और जावास्क्रिप्ट कोड से एप्लेट के तरीकों को लागू करना।

इस तरह की भाषा के साथ उस समय के ब्राउज़र उपलब्ध थे (नेटस्केप प्रमुख है) ने जावास्क्रिप्ट को एक प्रतियोगी लाभ के रूप में उपलब्ध कराया ( नेटस्केप पर डिज़ाइन की गई जावास्क्रिप्ट) - नेटस्केप पहला सर्वर साइड जावास्क्रिप्ट था जो '94 में वापस 'के साथ - लगभग दो दशक पहले नोड था। .js)। अन्य ब्राउज़रों ने सूट किया। लोग उन पृष्ठों को लिख रहे थे जो जावास्क्रिप्ट का उपयोग करते थे, क्लाइंट साइड स्क्रिप्टिंग के अन्य प्रयास का मतलब उन चीजों के बीच पूरी तरह से असंगत पेज होंगे जो काम करते हैं और कोड का दोहराव नहीं करते हैं (यहां {इनसाइड लैंग्वेज} ब्लॉक करें) जो गैर-जावास्क्रिप्ट के लिए ऐसा करता है ब्राउज़र और यहाँ जावास्क्रिप्ट ब्लॉक सभी के लिए है)।

जैसा कि नेटस्केप एक अवधि के लिए प्रमुख ब्राउज़र था, जावास्क्रिप्ट ने पकड़ लिया। जबकि नेटस्केप की विरासत मोज़िला के स्रोत फ़ाइलों के फ़ुटनोट्स के लिए खो गई है, जावास्क्रिप्ट पर रहता है और कुछ भी नहीं फेंकने में सक्षम है यह जगह है।

समस्या किसी अन्य क्लाइंट स्लाइड स्क्रिप्टिंग भाषा के लिए बनी रहती है। जावास्क्रिप्ट हर ब्राउज़र पर समर्थित है। यदि कोई ऐसा ब्राउज़र बनाना था जो जावास्क्रिप्ट के बजाय अजगर (उदाहरण के लिए) का समर्थन करता था, तो यह वेब साइटों के विशाल बहुमत का उपयोग करने में सक्षम नहीं होगा। इसके अलावा, जब तक कि ब्राउज़र ब्राउज़र ट्रैफ़िक का एक महत्वपूर्ण हिस्सा प्राप्त करने में सक्षम नहीं था, तब तक वेब डिज़ाइनर एक ही पेज के लिए अलग-अलग स्क्रिप्टिंग भाषाओं के साथ दो सेट पेज बनाना नहीं चाहते हैं।

कोई कुछ ब्राउज़र के लिए एक पायथन स्क्रिप्टिंग प्लगइन बनाने की कोशिश कर सकता है जो पेज पर एक पायथन स्क्रिप्ट को सक्षम करता है ... आज कैसे vrml काम करता है। लेकिन जब तक आपने vrml का उपयोग करने वाले वेब पेज के बारे में नहीं सुना और देखा है, तब तक किसी अन्य स्क्रिप्टिंग भाषा के लिए किसी अन्य वेब पेज के लिए उपयोग करने की संभावना है।


1
यह "यह कैसे पास हुआ ..." का एक बहुत अच्छा अवलोकन है और जितना मैं इसे सही उत्तर के रूप में चिह्नित करना चाहता हूं, यह सवाल का जवाब देता है "आज ग्राहक द्वारा इस्तेमाल की जाने वाली जावास्क्रिप्ट क्यों है?", नहीं " क्या कोई डिज़ाइन समस्या है जो ग्राहक-पक्ष के उपयोग के लिए पायथन को बहुत धीमा कर देगी? ”
प्रोफैट्स

वीआरएमएल ... वाह जो मुझे वापस ले जाता है!
FrustratedWithFormsDesigner

1
@Profpatsch जावास्क्रिप्ट के साथ कोई तकनीकी डिज़ाइन मुद्दा नहीं है जो इसे ग्राहक पक्ष की भाषा के लिए अनुपयुक्त बनाता है - इसके अलावा कुछ भी इसका उपयोग नहीं करता है और जब तक कि यह कुछ महत्वपूर्ण लाभ (संभावना जावा एप्लेट के साथ सहभागिता सहित) प्रदान करता है, तब तक कुछ भी नहीं होगा। समस्याएँ तकनीकी नहीं हैं और जब तक कोई "क्यों जावास्क्रिप्ट" के इतिहास को नहीं समझता है, तो कोई इसका जवाब नहीं दे सकता है "अजगर क्यों नहीं।"

2
@MichaelT: आपने लिखा है "जावास्क्रिप्ट के साथ कोई तकनीकी डिज़ाइन समस्या नहीं है जो क्लाइंट साइड भाषा होने के लिए अनुपयुक्त है"। आपका मतलब है कि अजगर जेएस नहीं है ??
कार्ल स्मिथ

@ कर्लस्मिथ आह हाँ। मेरी गलती ... और मैं एक निश्चित समय से परे टिप्पणियों को संपादित नहीं कर सकता। सुधार के लिए धन्यवाद।

4

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

अद्यतन: कृपया नीचे दिए गए टिप्पणियों पर चर्चा करें कि जेएस को पायथन को संकलित करना यहां निहित की तुलना में अधिक महंगा क्यों होगा।

समस्या ब्राउज़र विक्रेताओं और W3C को समझाने की कोशिश कर रही है कि पहले रूबी या किसी अन्य अच्छी स्क्रिप्टिंग भाषा पर पायथन का चयन करें, फिर एक मानकीकृत सबसेट को परिभाषित करें, क्योंकि वे सिस्टम कॉल और इतने पर अनुमति नहीं दे सकते हैं, और फिर इसे अच्छी तरह से लागू कर सकते हैं, जबकि सभी अभी भी जावास्क्रिप्ट का समर्थन। ऐसा होने वाला नहीं है, लेकिन अगर ऐसा हुआ, तो मुझे संदेह है कि गति एक गंभीर मुद्दा बन जाएगी।


7
आपका पहला बिंदु अनुसरण नहीं करता है। सब कुछ लगभग सब कुछ (मशीन कोड सहित) के लिए संकलित किया जा सकता है, लेकिन इसका मतलब यह नहीं है कि कुछ भाषा एल में लिखे गए प्रोग्राम और कुछ भाषा सी के लिए संकलित भाषा सी में लिखे गए समकक्ष प्रोग्राम के समान तेज़ है

1
खैर, कॉफीस्क्रिप्ट अनिवार्य रूप से जावास्क्रिप्ट के समान मूल अवधारणाओं के लिए एक अलग वाक्यविन्यास है, और सी अनिवार्य रूप से एक पोर्टेबल विधानसभा भाषा है। दूसरी ओर, पायथन और जावास्क्रिप्ट, काफी भिन्न होते हैं। पायथन को सही तरीके से लागू करने के लिए, आपको क्लास मॉडल, ऑपरेटर ओवरलोडिंग, मेटाक्लास आदि का समर्थन (अरबों अन्य चीजों के बीच) करना होगा और इनमें से अधिकांश जावास्क्रिप्ट को आसानी से और कुशलता से मैप नहीं करते हैं। उनमें से किसी एक को C या मशीन कोड में सम्‍मिलित करने में समस्‍या। एक विशेषज्ञ JIT आपकी एकमात्र उम्मीद हो सकती है, लेकिन JS को लक्षित करने वाले JIT संकलक अभी तक व्यावहारिक साबित नहीं हुए हैं।

3
एक मुद्दा यह होने वाला है कि आप जेएस की तरह अजगर को संकुचित नहीं कर सकते हैं - उन सभी स्थानों और न्यूलाइन्स को खत्म कर सकते हैं और वहां डांट पड़ती है! तो आप अजगर के किसी भी महत्वपूर्ण भाग के लिए लंबे समय तक लोड समय के साथ हवा जा रहे हैं।
TMN

1
@TMN दिलचस्प बिंदु, हालांकि एक को उम्मीद होगी कि पायथन की अभिव्यक्तता उस (और हाँ, कि गिनती की लाइनें हैं, वर्णों को नहीं, लेकिन फिर भी, पायथन की एक काफी अभिव्यंजक भाषा को कम करने के लिए) लंबा रास्ता तय करेगी।
डैनियल बी

2
@TMN डैनियल बी ने क्या कहा, और गज़िप को भी अंतर कम करना चाहिए। ओह, और पायथन को उन नई लाइनों और स्थानों की सबसे अधिक आवश्यकता नहीं है। पायथन में कई (हालांकि सभी नहीं) लाइनों को एक साथ जोड़ा जा सकता है, उदाहरण के लिए a = something(); frobincate(a); return quuxऔर if condition: react()सिंगल लाइन प्रत्येक। और n इंडेंटेशन स्तरों को केवल n रिक्त स्थान की आवश्यकता है, n * 4 रिक्त स्थान की नहीं।

2

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

कुछ यादृच्छिक विचार:

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

(२) कोई पायथन-टू-जावास्क्रिप्ट "कंपाइलर" / कन्वर्टर का निर्माण कर सकता है। यह बहुत काम आएगा।


5
Someone could build a Python-to-JavaScript "compiler"/converterखैर, किसी ने पहले ही कर दिया
यानिस


मुझे खुद ऐसा कभी नहीं करना पड़ा, लेकिन मुझे लोगों को पता है कि उन्होंने Jython का उपयोग करके जावा एप्लेट लिखे हैं। यह वही बात नहीं है, हालांकि पायथन के साथ ब्राउज़र में जावास्क्रिप्ट की जगह।
मार्टिजन पीटरर्स

Brythonदिलचस्प रूप से तेजी से काम करता है, कम से कम पृष्ठों पर अलग-थलग भागों (कम बातचीत DOM tree) के लिए।
प्रोफैट्स

@Profpatsch पिछली बार जब मैंने इसे देखा था, तब से यह पायथन भाषा के बहुत बड़े हिस्सों को लागू नहीं करता था। अनपेक्षित रूप से लागू सुविधाओं में वे हैं, जो जावास्क्रिप्ट के कठिन कार्यान्वयन के लिए कठिन हैं। PyPy लेखकों में से किसी एक को पैराफ्रेसेज करने के लिए: पायथन के उप-निर्वाह उपवास को बनाना आसान है, पूर्ण पायथन वह है जहां यह कठिन हो जाता है।

1

यह भाषा के कार्यान्वयन पर निर्भर करता है और जरूरी नहीं कि भाषा ही हो। अधिकांश जावास्क्रिप्ट दुभाषिए पायथन के लगभग सभी कार्यान्वयनों की तुलना में बहुत तेज हैं।

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

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

EDIT: यहां जावास्क्रिप्ट पर संकलन / चलाने वाले ब्राउज़र के लिए पायथन कार्यान्वयन की एक सूची दी गई है।

https://github.com/jashkenas/coffeescript/wiki/list-of-languages-that-compile-to-js#python

और यदि आप रुचि रखते हैं, तो आप ओपल की जांच कर सकते हैं, जो मुझे वास्तव में पसंद है।

http://opalrb.org/

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


0

जब आप यह प्रश्न पूछते हैं, तब भी जावास्क्रिप्ट में पहले से ही बहुत सारे पायथन कार्यान्वयन उपलब्ध थे, जिनका उपयोग आज दूसरे पेज पर किया जा सकता है।

शुरुआत के लिए http://www.skulpt.org/ या http://www.brython.info/ पर एक नज़र डालें ।

प्रदर्शन बहुत बुरा नहीं लगता है, लेकिन आपको उन्हें खुद का परीक्षण करना चाहिए और पता लगाना चाहिए।


-4

पायथन एक "कंसोल" भाषा है, जो सर्वर पर चल रही है

जावास्क्रिप्ट एक "ब्राउज़र" भाषा है, जो क्लाइंट पर चल रही है

जैसे, वे सीधे प्रतिस्पर्धा नहीं करते

... बेशक नोड.जेएस और शायद अजगर ब्राउज़र प्लगइन्स हैं, लेकिन फिर यह एक विशेष कार्यान्वयन के बारे में प्रदर्शन के बारे में अधिक सवाल है।

इसके अलावा, अधिकांश अनुप्रयोगों के लिए अजगर सिर्फ ठीक काम करेगा, सिवाय इसके कि आपको किसी प्रकार की व्यापक गणना करनी है और सीपीयू चक्रों को निचोड़ना है।

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


2
सर्वर साइड जावास्क्रिप्ट '94 में आसपास था। jscआप जावास्क्रिप्ट के साथ एक कंसोल के रूप में काम करते हैं, बहुत कुछ एक के रूप में अगर वे pythonएक कंसोल पर टाइप किया जाएगा।


2
इसके अलावा आप पायथन में डेस्कटॉप ऐप लिख सकते हैं .... मुझे आपके द्वारा किए जा रहे भेद का कोई वास्तविक कारण नहीं दिखता।
क्रिस ट्रैवर्स

इसके अतिरिक्त, 3D मॉडलिंग टूल ब्लेंडर UI से मेष पीढ़ी तक सब कुछ के लिए पायथन का उपयोग करता है। यदि यह प्रदर्शन प्रतिस्पर्धी नहीं है, तो क्या है?
एंड्रयू ग्रे

@ क्रिस: भेद यह है कि जावास्क्रिप्ट मुख्य रूप से एक ब्राउज़र तकनीक है, जबकि अजगर मुख्य रूप से एक डेस्कटॉप / कंसोल तकनीक है। मेरा कहना था कि दोनों की तुलना करना बहुत कम मायने रखता है क्योंकि वे पूरी तरह से अलग-अलग उद्देश्यों की पूर्ति करते हैं।
डेगनेलिस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.