ध्यान दें कि मैं वास्तविक दुनिया के उपयोग के मामलों पर अपने सभी तर्क दे रहा हूं। वास्तविक, पूर्ण, रोचक, उपयोगी अनुप्रयोगों में उपयोग के उदाहरण के साथ काउंटर-तर्क को अमान्य नहीं किया जा सकता। मैंने छोटी "भाषा के डेमो" को देखा है, जो हर किसी के पास है, मैंने ब्लॉग पोस्टों को विस्तार से देखा है कि कैसे प्रोटोटाइप और डायनामिक टाइपिंग कुछ तुच्छ छोटे उदाहरण बनाते हैं, जो कि C # से कम की कुछ पंक्तियाँ होंगी, लेकिन वे बस प्रासंगिक नहीं हैं समस्याओं को आप
माइक्रो-डेमो और खिलौने के बजाय वास्तविक कोड लिखने में चलाते हैं । यहाँ जेएस के साथ मेरी पकड़ है:
a) मैजिक 'this ’। यह यह है, सिवाय इसके कि जब यह है। जावास्क्रिप्ट आपको सभी जगहों पर अनाम कार्यों का उपयोग करने के लिए धक्का देती है, सिवाय इसके कि वे हमेशा 'इस' चर के लिए उचित संदर्भ खो देते हैं, इसलिए आप अंत में जगह पर "var _this = this" जैसे नासमझ कोड रखते हैं और फिर उसका उपयोग करते हैं आपके कॉलबैक या अन्य कार्यों के अंदर। कुछ दिन मैं यह शपथ लेता हूं कि मैं जिन कार्यों को लिखने का प्रबंधन करता हूं, वे नाम का उपयोग नहीं करते हैं, यह वास्तव में उस संख्या से छोटा होता है जो करते हैं।
b) 1 + "1" - 1 = 10. इसके अलावा, "1" + 0 = "10"। हां, इससे वास्तव में हमारे अनुप्रयोगों के लिए बग पैदा हो गए हैं, जहां एक संख्या के होने की उम्मीद करने वाला डेटा एक अन्य एप्लिकेशन में बग के कारण स्ट्रिंग के रूप में JSON फ़ाइल से लोड किया गया था, और परिणाम अच्छा नहीं था। हमारे सभी लोडिंग कोड को एक स्थान पर सभी प्रकार के रूपांतरणों को जोड़ने के लिए अपडेट किया जाना था। जब मुझे एक नंबर की आवश्यकता होती है, तो मैं वास्तव में पूरी तरह से पागल हो जाना चाहता हूं कि यह एक नंबर होना चाहिए, न कि एक स्ट्रिंग या एक वस्तु या अशक्त या कुछ और। लुआ, जो कि ज्यादातर मामलों में जावास्क्रिप्ट के समान है, ने इस समस्या को ठीक कर दिया है कि इसके अलावा और स्ट्रिंग संयोजन के लिए एक ही ऑपरेटर का उपयोग करने के लिए पर्याप्त मंद नहीं है।
ग) डिफ़ॉल्ट चर द्वारा वैश्विक। तो भले ही आप यह तर्क लेते हैं कि डायनामिक टाइपिंग सिर्फ "आसान" है क्योंकि आपको चर घोषणाओं के बारे में सोचने की ज़रूरत नहीं है, जावास्क्रिप्ट उस तर्क को खिड़की से बाहर फेंक देता है जिससे आप सभी जगह नए पहचानकर्ताओं के सामने 'संस्करण' डाल सकते हैं। । और फिर यह चुपचाप आप पर शिकंजा कसता है अगर आप भूल जाते हैं।
d) कक्षाओं के बजाय प्रोटोटाइप। अस्तित्व में बहुत कम बड़े पैमाने पर वास्तविक विश्व जावास्क्रिप्ट अनुप्रयोग हैं जो बड़े अनुप्रयोग आर्किटेक्चर में प्रोटोटाइप की अंतर्निहित बेकारता के आसपास काम करने के लिए अपने स्वयं के वर्ग प्रणाली में प्लग नहीं करते हैं। उन्हीं ऐप्स को जावास्क्रिप्ट प्रकारों का विस्तार करने के लिए प्रोटोटाइप का कम से कम उपयोग किया जाता है, और केवल इसलिए कि जेएस को इतनी खराब तरीके से डिज़ाइन किया गया था कि यहां तक कि दो दिलचस्प निर्मित प्रकार जो इसके साथ आते हैं, उनमें उन आधी विशेषताओं का अभाव है जिनकी आप उनसे अपेक्षा करते हैं।
ई) पास-दर-मूल्य प्रकार बनाने में असमर्थता। यह वास्तव में C ++ / D से अलग हर भाषा के बारे में एक वास्तविक समस्या है। वेबलॉग एप्लिकेशन लिखने के लिए जावास्क्रिप्ट का उपयोग करने वालों के लिए, जावास्क्रिप्ट के लिए सभी रैखिक बीजगणित पुस्तकालयों पर एक नज़र डालें। 3D एप्लिकेशन में, आप लगभग स्केलर का उपयोग करने की तुलना में अधिक बार वैक्टर का उपयोग करते हैं। कल्पना करें कि क्या आपके ऐप का प्रत्येक पूर्णांक संदर्भ द्वारा पारित किया गया था, ताकि "a = 1; b = a; b ++" दोनों एक और b दोनों के बराबर बने। प्रत्येक तीन छोटे घटक वेक्टर पूर्ण पूर्ण वस्तु है। वे संदर्भ द्वारा पारित किए जाते हैं (हमारे WebGL गेम में अब तक, वास्तव में लगभग आधे कीड़े का स्रोत)। वे बड़ी मात्रा में मौजूद हैं, ढेर-आवंटित हैं, और कचरा-एकत्र किया जाता है, जो जीसी पर एक तीव्र मात्रा में दबाव डालता है जो कि सरल वेबगेल गेम में भी जीसी ठहराव का परिणाम दे सकता है, और जब तक डेवलपर सभी स्थानों पर नए वैक्टर बनाने से बचने के लिए हास्यास्पद रूप से जटिल हुप्स से नहीं कूदता है, जहां नए वैक्टर बनाने के लिए तर्कसंगत है। आपके पास ऑपरेटर ओवरलोडिंग नहीं हो सकता है, इसलिए आपके पास बुनियादी संचालन करने के लिए बहुत बड़े और बदसूरत अभिव्यक्ति हैं। व्यक्तिगत घटकों तक पहुँच धीमी है। ऑब्जेक्ट्स को मूल रूप से पैक नहीं किया जाता है और इसलिए वे वर्टेक्स बफर में पुश करने के लिए अविश्वसनीय रूप से धीमा होते हैं, जब तक कि आप उन्हें फ्लोट 32 एरे इंस्टेंस के रूप में लागू नहीं करते हैं, जो वर्तमान में वी 8 और स्पाइडरमोंकी दोनों के ऑप्टिमाइज़र्स से बकवास को भ्रमित करता है। क्या मैंने उल्लेख किया कि वे संदर्भ से गुज़रे हैं? व्यक्तिगत घटकों तक पहुँच धीमी है। ऑब्जेक्ट्स को मूल रूप से पैक नहीं किया जाता है और इसलिए वे वर्टेक्स बफर में पुश करने के लिए अविश्वसनीय रूप से धीमा होते हैं, जब तक कि आप उन्हें फ्लोट 32 एरे इंस्टेंस के रूप में लागू नहीं करते हैं, जो वर्तमान में वी 8 और स्पाइडरमोंकी दोनों के ऑप्टिमाइज़र्स से बकवास को भ्रमित करता है। क्या मैंने उल्लेख किया कि वे संदर्भ से गुज़रे हैं? व्यक्तिगत घटकों तक पहुँच धीमी है। ऑब्जेक्ट्स को मूल रूप से पैक नहीं किया जाता है और इसलिए वे वर्टेक्स बफर में पुश करने के लिए अविश्वसनीय रूप से धीमा होते हैं, जब तक कि आप उन्हें फ्लोट 32 एरे इंस्टेंस के रूप में लागू नहीं करते हैं, जो वर्तमान में वी 8 और स्पाइडरमोंकी दोनों के ऑप्टिमाइज़र्स से बकवास को भ्रमित करता है। क्या मैंने उल्लेख किया कि वे संदर्भ से गुज़रे हैं?
च) कोई अंतर्निहित शामिल नहीं है या कार्यक्षमता की आवश्यकता है। गंभीरता से, अभी भी। थर्ड-पार्टी लाइब्रेरी मौजूद हैं, लेकिन उनमें से लगभग सभी में किसी न किसी तरह का बग या कोई अन्य है, जिनमें से कम से कम क्रोम में एक भ्रामक कैशिंग समस्या है जो वास्तविक विकास को बट में दर्द कर रही है।
छ) गतिशील टाइपिंग। हां, मैं वह तर्क शुरू करने को तैयार हूं। आप इसे सबसे अधिक नोटिस करना शुरू कर देते हैं दूसरा आप छोटे वेब ऐप या वेब पेज लिखना बंद कर देते हैं और बड़े ऐप लिखना शुरू कर देते हैं जहां आपके पास वास्तव में डेटा होता है जो एक माउस क्लिक या रिक्वेस्ट / रिस्पॉन्स साइकल से अधिक समय तक बना रहता है: गलत प्रकार की ऑब्जेक्ट को एक में जोड़ें सरणी को बाद में संसाधित करना और एक लापता विधि से बाद में एक दुर्घटना प्राप्त करना या वास्तविक गलती थी जहां की तुलना में पूरी तरह से अलग कोड में सदस्य। मनोरंजन समय। हां, जावा स्थैतिक टाइपिंग को बुरा लगता है। नहीं, Java / C # / C ++ स्थिर टाइपिंग करने का एकमात्र और एकमात्र तरीका नहीं है। सभी बग के बिना डायनेमिक टाइपिंग के फायदों के प्रकार, इनफैक्शन इंटरफ़ेस बाइंडिंग, इत्यादि आपको "सभी से निपटने के लिए आसान और बहुत सारे कीस्ट्रोक्स से नहीं" लाभ देते हैं। दूसरी सबसे लोकप्रिय वेब भाषा - एक्शनस्क्रिप्ट 3 - वास्तव में जेएस / ईसीएमएस्क्रिप्ट के समान होने के बावजूद, सांख्यिकीय रूप से टाइप की गई है। एक तरफ के रूप में, मैं अपने फेडोरा डेस्कटॉप पर पायथन ऐप्स से अधिक क्रैश प्राप्त करता हूं, जैसा कि मैं सी / सी ++ ऐप से करता हूं (वास्तव में, मेरे डेस्कटॉप क्रैश पर सी / सी ++ ऐप में से कोई भी नहीं है, अब मैं इसके बारे में सोचता हूं)। अनुपलब्ध सदस्य अपवाद == एप्लिकेशन विकसित करने और बनाए रखने के लिए इतना आसान है, है ना?
ज) गति। हां, बड़ी संख्या में सुपर बैड-गधे डेवलपर्स द्वारा कुछ हास्यास्पद तरीके से बहुत अधिक मात्रा में प्रयास किए गए हैं, जो जेएस को आधे दर्जे के सी कंपाइलर के रूप में तेज़ करने के लिए भाषा रनटाइम में डालते हैं जो कि एक सिंगल कॉलेज जूनियर कुछ में लिख सकता है महीने। और LuaJIT मौलिक भाषा सीमाओं के संदर्भ में JS के समान नाव में है, लेकिन वैसे भी हर जावास्क्रिप्ट कार्यान्वयन से बेहतर करने का प्रबंधन करता है। जो लोग समझ नहीं पाते हैं कि V8 में जेएस के सभी अनुकूलन या वास्तव में ऐसा क्या हैजेएस दावा करना पसंद करता है कि आश्चर्यजनक चीजें गति-वार कर सकती हैं, लेकिन वास्तविकता यह है कि वे सभी अनुकूलन मूल रूप से सिर्फ "बहुत ही कठिन प्रयास करते हैं ताकि कोड को चर के प्रकारों का पता लगाने के लिए विश्लेषण करें और फिर इसे थोड़ा मंदबुद्धि की तरह संकलित करें। भाषा के संकलक ऐसा करेंगे। ” ओह, और वहाँ अनुरेखण है, लेकिन फिर अनुरेखण भी सांख्यिकीय रूप से टाइप की गई भाषाओं पर काम करता है (और उत्पन्न मशीन कोड में टाइप गार्ड की आवश्यकता की कमी के कारण बेहतर काम करता है)। वास्तव में जेएस द्वारा या इसके लिए उन व्हिज़बैंग ऑप्टिमाइज़ेशन का एक भी आविष्कार नहीं किया गया था; अधिकांश शोध जेवीएम (जावा बुराई है!) या शास्त्रीय ओओपी भाषाओं (प्रोटोटाइप भयानक हैं!) से लिए गए थे।
i) कोई IntelliSense भी संभव नहीं है। यह देखना चाहते हैं कि आपके पाठ संपादक में foo.js की लाइन 187 पर आपको वहां पर कौन-सी विधियाँ मौजूद हैं? बहुत बुरा। कोड के माध्यम से ट्रेस करें जब तक आप यह पता नहीं लगाते हैं कि यह कहां से आरंभ किया गया था, तब कोड के माध्यम से ट्रेस करें ताकि यह पता चल सके कि इसका प्रोटोटाइप इस पर क्या है। और फिर उम्मीद है कि आपकी पीठ के पीछे प्रोटोटाइप को बदलते हुए कोई कोड नहीं है। वास्तव में, बस इसे एक ब्राउज़र में चलाएं और ब्रेकप्वाइंट सेट करें, क्योंकि मूल्य के बारे में किसी भी तरह से उपयोगी कुछ भी पता लगाना मूल रूप से Toy_web_app.html साइटों की तुलना में किसी भी कोडबेस के लिए असंभव है जो जावास्क्रिप्ट एपोलॉजिस्ट जावास्क्रिप्ट की सहजता और सरलता को महिमा देने के लिए उपयोग करते हैं। कुछ कोड संपादक बेहतर करने के लिए वास्तव में कठिन प्रयास करते हैं, और वास्तव में सरल मामलों के लिए लगभग थोड़े थोड़े सफल होते हैं, कभी-कभी, एक बार।
j) कोई फायदा नहीं हुआ। अन्य गतिशील भाषा की तुलना में जावास्क्रिप्ट भी विशेष नहीं है। यह सब कुछ दिलचस्प करने में सक्षम नहीं है, जो लुआ, पायथन, रूबी, आदि द्वारा भी नहीं किया जा सकता है। जेएस कार्यान्वयन में से कोई भी LuaJIT या PyPy या अन्य गतिशील की JIT-ing कार्यान्वयन से तेज नहीं है भाषाओं। अन्य सामान्य रूप से उपलब्ध भाषाओं की तुलना में JS का कोई प्लस पक्ष नहीं है। ओह, सिवाय यह एक प्लगइन के बिना वेब ब्राउज़र में मूल रूप से चलता है। जो दुनिया में एकमात्र कारण है कि यह इतना लोकप्रिय क्यों है। वास्तव में, यह एकमात्र कारण है कि यह घटना मौजूद है। अगर 10 साल पहले किसी ने सोचा था, "बिल्ली, चलो एक अच्छी तरह से डिज़ाइन की गई और अच्छी तरह से स्थापित भाषा को अपने ब्राउज़र में छोड़ दें और दूसरे लोगों को ऐसा करने के बजाय सभी को इस नासमझ छोटे हैकजॉब का उपयोग करने दें, जो नेटस्केप के साथ आया था। , "वेब आज बहुत अलग (बेहतर) दिखेगा। यदि क्रोम एक समर्थित भाषा के रूप में क्रोम में क्रोम को गिरा देता है, तो बस भविष्य की कल्पना करें। या वास्तव में, यह कल्पना करें: Google एक समर्थित भाषा (http://code.google.com/p/nativeclient/) के रूप में क्रोम में C / C ++ गिराता है।