وبسایت شخصی حسن هاشمی

برنامه نویس. ایران. قم :))

چرا جاوا اسکریپت زبان ضعیفیه و باید جایگزین بشه؟ چاره چیه؟

قصد ندارم اون بحث سنتی همیشگی بین برنامه نویسا که هر کدوم خیلی متعصبانه از یه زبان تعریف می کنن رو دوباره انجام بدم چون خیلی رفتار غیر حرفه ایی هست.

الان که این مطلب رو مینویسم شاید تعداد پروژه های وبی که انجام دادم تقریباً اندازه موهای سرم باشه :) و  فکر کنم این صلاحیت اظهار نظر در مورد جاوا اسکریپت رو بهم  میده. ;)

جاوا اسکریپت همیشه برای من زبان آزار دهنده ای بوده که بخاطر ضعف طراحیی که داره اغلب توی کارای تیمی باعث دردسر میشه. تصمیم گرفتم که این حس بدی که به جاوا اسکریپت دارم رو واقعاً از لحاظ تکنیکی بررسی کنم.

1- الگوریتم های ضعیف و سطحی در پیاده سازی اپراتورها، مخصوصاً ==:

از اونجایی که هممون میدونیم، جاوا اسکریپت طبق استاندارد ecmascript پیاده سازی شده و 6 نوع دیتاتایپی هم که داره کاملاً از ecma scipt بهش رسیده حالا مشکل اینجاست که ecma script از الگوریتمی بنام  Abstract Equality Comparison Algorithm هنگام اجرای عملگر == استفاده می کنه، حالا کافیه مستندات این الگوریتم رو اینجا بخونید، باور کنید من اون موقعی که میخواستم جاواسکریپت رو یادم بگیرم و طبق روال رسیدم به اینجا تنها کاری که ازم براومد رد شدن ازش بود. یه خلاصه شو من کپی پیست می کنم همین جا:


11.9.3 The Abstract Equality Comparison Algorithm
The comparison x == y, where x and y are values, produces true or false. Such a comparison is performed as follows:
If Type(x) is the same as Type(y), then
If Type(x) is Undefined, return true.
If Type(x) is Null, return true.
If Type(x) is Number, then
If x is NaN, return false.
If y is NaN, return false.
If x is the same Number value as y, return true.
If x is +0 and y is −0, return true.
If x is −0 and y is +0, return true.
Return false.
If Type(x) is String, then return true if x and y are exactly the same sequence of characters (same length and same characters in corresponding positions). Otherwise, return false.
If Type(x) is Boolean, return true if x and y are both true or both false. Otherwise, return false.
Return true if x and y refer to the same object. Otherwise, return false.
If x is null and y is undefined, return true.
If x is undefined and y is null, return true.
If Type(x) is Number and Type(y) is String,
return the result of the comparison x == ToNumber(y).
If Type(x) is String and Type(y) is Number,
return the result of the comparison ToNumber(x) == y.
If Type(x) is Boolean, return the result of the comparison ToNumber(x) == y.
If Type(y) is Boolean, return the result of the comparison x == ToNumber(y).
If Type(x) is either String or Number and Type(y) is Object,
return the result of the comparison x == ToPrimitive(y).
If Type(x) is Object and Type(y) is either String or Number,
return the result of the comparison ToPrimitive(x) == y.
Return false.

مطمئناً هیچکدومتون حال ندارید این الگوریتم رو بخونید:) در نتیجه چندتا مثال میذارم تا خودتون به عمق فاجعه پی ببرید:


'' == '0'           // false
0 == ''             // true
0 == '0'            // true
false == 'false'    // false
false == '0'        // true
false == undefined  // false
false == null       // false
null == undefined   // true
' \t\r\n ' == 0     // true

در بدترین حالت حتی اگه شما خودتون هم این رو حفظ کنید، سخت میشه همه اعضای تیم باهاش کنار بیان.

این تازه یکی از اپراتورهای جاوا اسکریپت بود، شاید بتونیم درباره +و-و/و... همین قدر سوتی دربیاریم.

2- عدم وجود یک مفسر استاندارد:

شاید بعضیا بگن خب، اینکه تقصیر طراحای زبان نبوده. در حالیکه اشتباهه. شما نمیتونید یه زبان برنامه نویسی رو پیاده سازی بکنید اونم در این سطح و با این معماری، ولی بخش اصلیش رو بندازید گردن یکی دیگه.. ؟!؟؟

بعضی وقتا شده کدی که نوشتم روی tracemonkey و یا v8 یه خروجی میده از اونطرف روی انجین ie اصلاً هنگ می کنه :)

مطمئناً قابل حله اما این رو می طلبه که ما کار اصلی رو بذاریم کنار. بشینیم ببینیم چجوری یه چیزی بنویسیم که با همه اینا سازگار باشه که خودش یه مصیبتیه و زمان بره. تازه بدتر هم میشه اگه کد رو یکی دیگه نوشته باشه :))))) این طوری یه هزینه ای رو به شرکت شما تحمیل می کنه.

در نتیجه مجبور میشید برای بعضی کارای ساده مثل رجیستر کردن یه رویداد داینامیک برید سراغ jquery.

رفتار regular expression helper رو در نظر بگیرید:

/[A-z]/.test("A"); // true]
/[A-z]/.test("a"); // true]
/[A-z]/.test("z"); // true]
/[A-z]/.test("Z"); // true]
/[A-z]/.test("m"); // true]
??A-z]/.test("\\"); // true WTF]
/[A-z]/.test("D"); // true]

رفتار عملگر دسترسی به کاراکتر در یک رشته رو ببینید:

'hello'[-1] // undefined
?----> ''// ('hello'.charAt(-1

از این قبیل عجایب خیلی خیلی خیلی خیلی زیاد گزارش شده از api های جدید html5 گرفته تا قدیمی هاش.

واقعاً هیچ توضیحی توی نحوه پیاده سازی بعضی از این توابع وجود نداره.


4- سیستم دیتا تایپ داینامیک و در نتیجه lagnuage service ضعیف

این مورد نظر شخصیمه و راستش اصراری هم در موردش ندارم.

اینکه جاوا اسکریپت یه زبان داینامیکه خیلی در برخی موارد به برنامه نویس کمک می کنه. دوستانی که در زمینه طراحی زبان های برنامه نویسی کار کردن حتماً میدونن که تقریباً بعضی مواقع غیر ممکنه که یه language service درست و حسابی برای یه زبان برنامه نویسی که کلاً weaked type هست نوشت.

وقتی هم که language service باشه، ide مناسب تولید نمیشه. نتیجه اینه که بهترین ide ها هم راضی کننده نیستن در مورد جاوا اسکریپت.

و وقتی که حجم کد جاوا اسکریپت به چند هزار خط برسه اونموقع اصلاً اوضاع قمر در عقرب میشه.


5- مدل شی گرایی فانتزی:

مدل شی گرایی جاوا اسکریپت منو یاد پچ هایی میندازه که برای بعضی از نرم افزارهای بزرگی که سورس کدشون قبلاً نوشته شده میدیم. :) چون نمی خویم برنامه رو از اول بنویسیم یه جوری ماست مالیش می کنیم.

واقعاً من تعجب می کنم که بعضیا جاوا اسکریپت رو یه زبان شی گرا می دونن، اونم در حالیکه خود مستندات جاوا اسکریپت پر از تناقضه. 

چجوری میتونید یه زبان رو شی گرا بدونید اونم وقتی که حتی مفهویم کلاس رو به صورت واضح اصلاً پشتیبانی نمی کنه.

یه تکه متن رو از ویکی پدیا براتون کپی پیست می کنم:

JavaScript is almost entirely object-based. JavaScript objects areassociative arrays, augmented with prototypes (see below). Object property names are string keys-


بگذریم که همون prototype که پشتیبانی می کنه هم کلی مشکل طراحی داره و خدایی اگه شما به سورس v8 یه نگاه در اینجا بندازید متوجه میشید که وقتی یه instance از یه به اصطلاح کلاس در جاوا اسکریپت می سازیم اصلا همچین اتفاقی نمی فته. :)


نتیجه گیری:

جاوا اسکریپت اصلاً زبان مناسبی برای پروژه های بزرگ نیست و مطئمناً شما برای چنین پروژه هایی باید برید سراغ بعضی از کتابخانه های رایگان که تازه باهاش بتونید یه کم شی گرا تر کدتون رو بنویسید ( dojo kit رو توصیه می کنم) یا اینکه هزینه استفاده از جاوا اسکریپت خالص رو بپریدازید.

راه حل بهتر:

راستش مشکلات جاوا اسکریپت مانع از فراگیر شدنش نشده و در نتیجه راه حل ها هم با توجه به فراگیری جاوا اسکریپت ارائه شده. خوشبختانه یه زبان برنامه نویس خیلی ساده ارائه شده که این مشکل رو حل میکنه و من تا اینجای که که ازش استفاده می کنم. واقعاً راضی هستم. و اونم اسمش هست type script .

type script واقعاً ارزش چند ساعت مطالعه و یادگیریش رو داره ضمن اینکه به راحتی با کتابخانه ها و کدهای جاری جاوا اسکریپت همخوانی داره.

نظرات (1) -

Loading