PDA

View Full Version : سوال: زبان php کامپایلریست یا تفسیری



محمد شهرکی
چهارشنبه 26 مهر 1391, 19:43 عصر
سلام دوستان .

میشه در رابطه با نحوه ترجمه دستورات php توضیح بدید . و اینکه از لحاظ ترجمه دستورات با asp.net چه فرقی داره .

چون یکی از دوستان می گفت چون زبان php یک زبان تفسیریست و خط به خط تفسیر میشه , اگر در خطی مشکلی وجود داشته باشه , فقط همون خط پیغام خطا میده و دستورات زیر اجرا و تفسیر میشن ولی زبان asp چون کامپایل شدست و از یکسری فایل ها dll تشکیل شده , اگر در نقطه ای خطا صورت بگیره , بقیه هم اجرا نمی شن .

میشه در این رابطه توضیح کامل بدید .
ممنون

2undercover
چهارشنبه 26 مهر 1391, 20:42 عصر
فک کنم برعکس گفتین چون تو php اگر مثلا یک سمیکالن ; نزاری خطا میده و بقیش اجرا نمیشه!:لبخند:

MMSHFE
چهارشنبه 26 مهر 1391, 21:10 عصر
بحث تفسیری و کامپایلی و تفاوتشون ارتباطی به وجود خطا نداره چون در هر دو حالت، درصورت وجود خطا، برنامه اجرا نمیشه. البته از این نظر که گفتین در PHP اگه خطایی در یک خط وجود داشته باشه، تا اون قسمت از برنامه اجرا میشه، درست گفتین ولی در کل تفاوت اصلی تفسیری و کامپایلی بودن زبانها در این نیست. فرق اصلیشون در اینه که توی PHP با هربار اجرای یک اسکریپت، تمام خطوط اون اسکریپت خط به خط خونده و اجرا میشن اما در ASP.NET یکبار خونده و کامپایل میشن و از اون به بعد بصورت کدهای باینری اجرا میشن. درنتیجه با ایجاد کوچکترین تغییر در برنامه، کل برنامه باید مجدداً کامپایل بشه. درحقیقت سرعت اجرای برنامه های کامپایلی بیشتر از تفسیریها هست اما در مورد ASP.NET تفاوت خاصی در اجرای اون نسبت به PHP نیست و حتی در برخی موارد PHP سریعتر اجرا میشه چون کدهای ASP.NET و کلاً تمام زبانهای تحت NET Framework. موقع کامپایل به زبان MSIL (یعنی MicroSoft Intermediate Language یا زبان واسط مایکروسافت) تبدیل میشن نه زبان بومی (Native) ماشین. در مرحله بعد، موقع اجرا Just In Time Compiler (یا بطور خلاصه JIT Compiler) یک کامپایل مجدد انجام میده که کدها از زبان MSIL به Native Code تبدیل بشن. علت وجود این زبان واسط، امکان ایجاد هماهنگی بین کدهایی هست که با زبانهای مختلف تحت NET. نوشته میشن که بخاطر همین ویژگی میشه توی کارهای تیمی، افراد از زبانهای مختلف تحت NET. استفاده کنن. مثلاً یک نفر با #C و یکی دیگه با VB.NET کد بنویسه و این کدها در کنار هم کار کنن. بگذریم خیلی نمیخوام وارد جزئیات معماری NET. بشم، فقط خواستم فرق کامپایلی و تفسیری بودن رو توضیح بدم که امیدوارم خوب بیان کرده باشم. موفق باشید.

محمد شهرکی
پنج شنبه 27 مهر 1391, 02:23 صبح
ممنون , توضیح مختصر و مفیدی بود .

اما اگر از بحث MSIL بگذریم , اونجا که فرمودید به دلیل هر بار خونده شدن تمام خطوط یک صفحه php , سرعت اجرایه اون از Asp.Net که تنها یک بار کامپایل میشه و از اون به بعد کد های باینریش اجرا میشن , کمتره , آیا راهکاری و یا تکنیکی وجود نداره که این اتفاق برای صفحات php رخ بده و یک بار این کدها در جایی تفسیر بشن و در درخواست های بعدی کدهای بومی اون اجرا بشن ؟

eshpilen
پنج شنبه 27 مهر 1391, 13:03 عصر
بحث تفسیری و کامپایلی و تفاوتشون ارتباطی به وجود خطا نداره چون در هر دو حالت، درصورت وجود خطا، برنامه اجرا نمیشه.
الان این کد:

<?php

$c=1;

if($c==2) { dmX; ohsppwss(); msllaasssdd;""; 'xx'; }
else echo 'ok';

?>
خطا نمیده.
چون شرط اجرا نمیشه.
ولی در یک زبان کامپایل شوند مثل سی++ اینطوری نیست و تمام خطاهای سینتاکس موقع کامپایل مشخص میشن. حتی فکر میکنم یکسری خطاهای پیچیده تر هم که خود برنامه نویس هم با نگاه کردن متوجه نمیشه مشخص میشن (دقیقا حضور ذهن ندارم الان برای آوردن جزییات و مثال هاش).
ولی درمورد ‎.NET دیگه نمیدونم دقیقا چطوریه داستانش. این مورد خطای سینتاکس رو میتونید تست کنید خب.

eshpilen
پنج شنبه 27 مهر 1391, 13:08 عصر
ممنون , توضیح مختصر و مفیدی بود .

اما اگر از بحث MSIL بگذریم , اونجا که فرمودید به دلیل هر بار خونده شدن تمام خطوط یک صفحه php , سرعت اجرایه اون از Asp.Net که تنها یک بار کامپایل میشه و از اون به بعد کد های باینریش اجرا میشن , کمتره , آیا راهکاری و یا تکنیکی وجود نداره که این اتفاق برای صفحات php رخ بده و یک بار این کدها در جایی تفسیر بشن و در درخواست های بعدی کدهای بومی اون اجرا بشن ؟
چرا PHP هم یه چیزایی داره و من شنیدم میتونه سرعت رو تا 10 برابر افزایش بده.
البته کامپایل به کد ماشین (همون بومی) نیست و فکر میکنم از نوع Bytecode باشه. فکر میکنم این Bytecode بعد در هر بار اجرا توسط انجین PHP اجرا میشه؛ منتها مرحلهء خوندن سورس و تبدیل اون به فرمت Bytecode داخلی برای اجرا حذف شده به این شکل. این Bytecode بهرحال خیلی بهینه تر از سورس کد Plain text هست و سرعت اجرای خوبی داره.

مثلا: http://en.wikipedia.org/wiki/PHP_accelerator

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

اینه: http://en.wikipedia.org/wiki/HipHop_for_PHP

eshpilen
پنج شنبه 27 مهر 1391, 13:21 عصر
تمام زبانهای تحت NET Framework. موقع کامپایل به زبان MSIL (یعنی MicroSoft Intermediate Language یا زبان واسط مایکروسافت) تبدیل میشن.
مگه سایتهای ‎.NET رو بصورت همون سورس کد Plain text روی هاست نمیذارن؟
این کامپایل به MSIL کجا و کی صورت میگیره؟ خروجیش کجا ذخیره میشه که در دفعات بعد نیازی به انجام مجددش نباشه؟


در مرحله بعد، موقع اجرا Just In Time Compiler (یا بطور خلاصه JIT Compiler) یک کامپایل مجدد انجام میده که کدها از زبان MSIL به Native Code تبدیل بشن.
اونوقت این Native Code جایی کش میشه که در دفعات بعد نیازی به این مرحله نباشه؟
اگر کش میشه، کجا؟ چون من قبلا دنبالشون گشتم ولی پیدا نکردم! هرچی هم سرچ و سوال کردم به نتیجه ای نرسیدم.

MMSHFE
جمعه 28 مهر 1391, 15:58 عصر
مگه سایتهای ‎.NET رو بصورت همون سورس کد Plain text روی هاست نمیذارن؟
این کامپایل به MSIL کجا و کی صورت میگیره؟ خروجیش کجا ذخیره میشه که در دفعات بعد نیازی به انجام مجددش نباشه؟

روی همون هاست شما، کدها در اولین بار اجرا، کامپایل میشن و بعد از اون، کد کامپایل شده اجرا میشه. حتی میتونید خودتون هم کد کامپایل شده رو آپلود کنید و اجباری به آپلود کدها بصورت Plain Text نیست. البته حقیقتش درمورد جزئیاتش که چطور اینکار رو انجام بدیم مطمئن نیستم ولی فکر میکنم با گزینه Publish خود Visual Studio میشه این کار رو انجام داد.


اونوقت این Native Code جایی کش میشه که در دفعات بعد نیازی به این مرحله نباشه؟
اگر کش میشه، کجا؟ چون من قبلا دنبالشون گشتم ولی پیدا نکردم! هرچی هم سرچ و سوال کردم به نتیجه ای نرسیدم.
حقیقتش در این مورد هم خیلی مطمئن نیستم ولی فکر میکنم توی ریشه سایتتون پوشه ای تحت عنوان debug یا release ساخته بشه (باز هم تأکید میکنم مطمئن نیستم). میگردم و اگه به نتیجه رسیدم براتون میگذارم.

eshpilen
شنبه 29 مهر 1391, 09:35 صبح
روی همون هاست شما، کدها در اولین بار اجرا، کامپایل میشن و بعد از اون، کد کامپایل شده اجرا میشه. حتی میتونید خودتون هم کد کامپایل شده رو آپلود کنید و اجباری به آپلود کدها بصورت Plain Text نیست. البته حقیقتش درمورد جزئیاتش که چطور اینکار رو انجام بدیم مطمئن نیستم ولی فکر میکنم با گزینه Publish خود Visual Studio میشه این کار رو انجام داد.فکر کنم یک بار یجا خوندم که باید از تولید فایلهای dll دات نت استفاده کنیم. چون محتویات dll های دات نت MSIL هست.
ولی فکر میکنم همهء کدها رو که نمیشه یا مناسب نیست داخل dll گذاشت بصورت کلاس و تابع و اینها.


حقیقتش در این مورد هم خیلی مطمئن نیستم ولی فکر میکنم توی ریشه سایتتون پوشه ای تحت عنوان debug یا release ساخته بشه (باز هم تأکید میکنم مطمئن نیستم). میگردم و اگه به نتیجه رسیدم براتون میگذارم.
بعید میدونم. چنین چیزی ندیدم تاحالا با اینکه دات نت هم برنامهء وب رو مطالعه و کمی کار کردم و هم برنامه های دسکتاپ.
قبلا هم این سوال رو پرسیده بودم که کسی جواب خاصی نداد.
جالبه توی اینترنت هم انگار نیست. همش همون حرفهای کلی راجع به ساختار و روش اجرای دات نت رو فقط زدن که هرجایی پیدا میشه.