سلام
تا اونجايي كه من ميدونم فرقاشون زياده و هم اينكه شباهتاشون هم زياده
- بصورت كلي ما دو نوع فايل اجرايي داريم
يكي فايل هاي اجرايي هستند كه كامپايل شده اند
و ديگري فايل هاي كه احتياج به يك مفسر دارند
خوب فايلهاي كه به اسمبلي بر ميگردن ( بصورت كامل ) . داراي خطوط اضافي كمتري هستند و لذا سريع تر اجرا ميگردن
اما برنامه هاي مفسري چون احتياج دارن كدها و متغير ها را براي توابع موجود در مفسر آماده نماييند داراي خطوط بيشتري هستند .لذا كند تر انجام ميگردند.
----نكته منظورماز تعداد خطوط ، تعدا خطوط دي اسمبل شده برنامه اجرايي نيست منظورم تعداد خطوط پروسس شده براي انجام يك كار مشابه است
ممكنه بگيد خوب چرا خطوط زيادتري دارند ؟
توي فايل هاي مفسري توابعي كلي هستند كه چند كار شبيه به هم را ميكنه ( چون اگه بخوان براي هر كدوم يك تابع بنويسند فايل مفسر بزرگ شده و همچنين احتياج داره كه ساعات بيشتري برنامه نويسي انجام بشه و ....) لذا هميشه بايد متغير هاي مورد نياز ست بشه ( به قول معروف بره توي حافظه ) در نتيجه اين كار زبان بره
نتيجه اينكه سرعت اين برنامه ها مياد پايين
و از طرف ديگه چون اين برنامه ها دسترسي مستقيم به منابع سيستم ( مثلا توي ويندوز توابع api ) رو ندارن و اين ازتباط بايد از طريق مفسر انجام بشه . لذا باز هم سرعت مياد پايين و هم اينكه يك سري از قايليت ها برنامه مفسري كم ميشه . مثلا توي وي بي نميتونيم مستقيما حافظه برنامه رو بخونيم و يا ادرس يك متغير رو با ادرس يك پوينتر به تابع بديم .براي حل اين مشكل هم ميان از روش هاي استفاده ميكنن كه احتياج به كد نويسي داره و لذا مفسر بيشتر درگير ميشه و باز هم سرعت مياد پايين ( توي بعضي از موارد هم مشكل هنوز هست و نميشه اين كار رو كرد)
و در ضمن هموني كه بايد بشه هم در بيشتر مواقع نميشه لذا زيان مفسري ضعيف ميشه .
خوب توي وي بي كه يك برنامه مفسري است ( مفسرش همون msvb ها يا run time dl ها هستند ) ما يكسري كمبود ها مشاهده ميكنيم و همچنين ضعف هاي هم مشاهده ميكنيم
از طرف ديگر بعلت كاربر دوست شدن برنامه يكسري ضعف ها در برنامه ايجاد ميشه
مثلا همين راحتي شما (هر متغير رو بدون تعريف بتونين استفاده كنيد) باعث شده كه توابع مفسر به دو حالت تعريف شده و حالت تعريف نشده تبديل بشن . يعني اول مفسر ميايد ميبينه ايا متغير تعريف شده يا نه اگر نه بر اساس مقدار دهي انجام شده متغير رو تعريف ميكنه ( تا حالا سه مرحله كار اضافينسبت به زبان كتامپايلري انجام شده 1- مشخص كردن اينكه متغير تعريف شده است يا نه 2- اگر نه تعيين نوع مقدار داده شده 3- تعريف لوكال متغير اما در حالت تعريف شده ديگر قسمت 2 و 3 انجام نميشود و قسمت اول هم يكبار انجام ميگرد در حالي كه بدون تعريف هر دفعه اين كار انجام ميشه يعني 2 و 3 ) لذا سرعت مياد پايين . از طرف ديگر بعلت عدم دسترسي به منابع بصورت مستقيم بعضي از خواص حذف شده اند . مثلا پنجره textbox از خانواده edit box ها داراي متد paint است اما در وي بي بعلت همين مفسري و درگيري بين ادرس دهي پوينتري و مفسر و همچنين سخت شدن برنامه نويسي اين متد حذف گرديده است ( ممكن است دلايل ديگري هم داشته باشد اما من منيدونم ) نتيجه اينكه
1- زبان وي بي شي گرا كامل نيست چون همونطور كهتوي مثال ديده ميشه متد paint بصورت ارثي براي text box به ارث گذاشته نشده است
2- شما بايد براي انجام اين كار دو راه حل داريد
2-1- يكي اينكه براي اين كار به api ها متوصل بشويد ولذا چندين خط كد بايد نوشته شود ( بازم سرعت مياد پايين ) و در بعضي از موارد هم اين كد با حلقه اصلي برنامه مشكل پيدا كرده و برنامه كرش ميكند
2-2- يا اينكه متوصل به سي شويد و در نتيجه احتياج به ايمپورت يك dll يا ocx پيدا ميكنيد و
2-2-1- در نتيجه هم سرعت گرفته ميشود زيرامفسر اين كار را انجام ميدهد و يعني : صدا زدن چندين تابع جهت مهيا كردن استفاده از dll و چندين تابع براي هماهنگ كردن متغير ها با نوع متغير هاي تابع موجود در dll : در نتيجه چندين خط اضافه نسبت به برنامه مشابه در وي سي يا ++c و در نتيجه كندي برنامه
2-2-2- هم اينكه زبان برنامه نويسي نقص پيدا ميكند. چون خود نتوانسته است اين كار را انجام دهد .
براي اينكه ببني يك خط كد اضافه چه بلاي روي سرعت داره و استفاده از عدم تعريف چقدر سرعت رو ميگيره كد زير رو توي وي بي اجرا كن
هم sub1 و sub2 و sub3 يك كار رو ميكنن
sub2 يك خط اضافه توي برنامه داره .
sub هم كه متغير a و b بدون تعريف اند
کد:
Private Sub Form_Load()
Dim a As Double
a = Timer
sub1
MsgBox Timer - a
a = Timer
sub2
MsgBox Timer - a
a = Timer
sub3
MsgBox Timer - a
End Sub
Sub sub1()
Dim a As Integer
Dim b As Integer
Dim max As Integer
a = 20
b = 10
Dim i As Double
For i = 1 To 2000 Step 0.00005
max = a
If b > a Then max = b
Next
End Sub
Sub sub2()
Dim a As Integer
Dim b As Integer
Dim max As Integer
a = 20
b = 10
Dim i As Double
For i = 1 To 2000 Step 0.00005
If b > a Then
max = b
Else
max = a
End If
Next
End Sub
Sub sub3()
Dim max As Integer
a = 20
b = 10
Dim i As Double
For i = 1 To 2000 Step 0.00005
If b > a Then
max = b
Else
max = a
End If
Next
End Sub