پرسش و پاسخهای علمی و درسی کاربران

تب‌های اولیه

18 پستها / 0 جدید
آخرین ارسال
پرسش و پاسخهای علمی و درسی کاربران

[h=2]question about compiler and interpreter[/h]

به نام خدا

بچه ها من یه مطلبی رو توضیح میدم درباره کارکرد interpreter و compiler شما اصلاحش کنید و اگه برداشت اشتباهی ازش داشتم بهم بگید



با توجه به تصویر زیر


به زبان های java , visual basic در شکل بالا نگاه کنید که چه اتفاقی در موقع run می افتد : اینها interpreter pl هستند که دو موقع run ،
سی پی یو jvm را اجرا می کند . این jvm شامل jit , interpreter هست که وقتی سی پی یو ، jvm را اجرا میکند. jit می اید bytecode سیو شده در فایل را دستور به دستور به machine code تبدیل می کند و بعد interpreter همزمان دستور به دستور اینها را اجرا میکند .

حالا به c, c++ که زبان های کامپایلی هستند و interpreter ندارند وقتی برنامه run میشه cpu میات machine code سیو شده در فایل رو می خونه و اجرا می کنه

حالا دو مرحله بالا رو مقایسه کنید
ببینید کاری که توی زبان های کامپایلی انجام میشه در موقع run کردن برنامه خیلی کمتره چون مستقیما machine code اجرا میشه ولی در زبان های interpret هر بار bytecode به machine code تبدیل میشه و بعد دوباره میره سراغ دستور بعدی پس میشه گفت زمان run در برنامه های کامپایلی خیلی کمتر از زبان های interpret هست یعنی سریعتر انجام میگیرد .


حالا شما عیب یابی کنید

تشکر


سلام ...
کامپایلر در زبان های برنامه نویسی مانند C و ++C و ... مفهوم پیچیده ای ندارند ... برنامه نوشته شده کاربر رو میگرفتند و اون رو تبدیل به زبان ماشین میکردند ... و CPU با هر با Fetch کردن ... یک Instruction Code رو از حافظه میخونه و اجرا میکنه ... کامپایلر زبان C هم که Interpreter نداره ... چون نیازی نداره ... داده به زبان ماشین ترجمه شده و کار تمام است ...

اما برخی از زبان ها هستند مثله Java که مستقل از ماشین هستند ... یعنی برنامه ای که شما با این زبون برنامه نویسی مینویسی رو هر ماشینی قابل اجرا هست ... رو IBM روی Apple روی Supper Compute ها و ... این دستگاهها که سی پیو شون با هم فرق داره ... و مطمینا Instruction Code های متفاوتی دارند ... پس چطور یه برنامه نوشته شده این قابلیت رو داره که رو هر ماشینی اجرا بشه ؟؟؟

به خاطر این هست که کامپایلر Java اون برنامه رو به زبان ماشین ترجمه نمیکنه و به قوله شما به Byte Code ترجمه میکنه و این Byte Code قابله خوندن و اجرا شدن توسط CPU کامپایلر نیست ... بایت کد یه کد خاصی با استانداردی خاص هست ... وقتی شما داری این کار رو میکنی Virtual Machine جاوا رو هم مطمینا نصب میکنی ... Virtual Machine جاوا هست که باعث میشه اینترپرتر بفهمه که Byte Code رو چگونه به زبان ماشین ترجمه کنه ... حالا این یعنی چی ...

فرض کن من یه برنامه به زبان Java مینویسم ... اگر این رو روی کامپیوتر خودم که IBM Compatible هست اجرا کنم ... ابتدا کامپایلر میاد و دستورات رو به یه کد فی مابین به نام Byte Code تبدیل میکنه ... و چون Virtual Machine جاوایی که روی کامپیوتر من نصب شده مرتبط با IBM Compatible هست ... اون کدها رو به کدهایی خاص که CPU کامپیوتر من میفهمه بدل میکنه ....

حال اگر همین برنامه رو من ببرم و رویه یه کامپیوتر Apple اجرا کنم ... باز هم این کدها قابلیت اجرا دارن ... چون رو اون کامپیوتر Virtual Machine جاوا مرتبط با Apple نصب شده و این بار Virtual Machine جاوا کدهای من رو به ماشین کدی قابل فهم برای CPU اپل تبدیل میکنه ...

و اما بر میگردیم به سوال شما ... زمان های سابق اینگونه بود که سرعت برنامه های Java پایین تر بود اما این مشگل هم حل شد ... در حقیقت کامپایلر های درست و به موقع (Just In Time) بوجود اومدن که این نقیصه رو حل کردند ... یعنی پس از کامپایل کردن عمل اینترپرتر نیز انجام میشه و کد به زبان ماشین آماده هست و تنها کافی هست CPU اون رو از حافظه Fetch کنه و اجرا کنه ...

عنکبوت سرخ;405514 نوشت:
سلام ...
کامپایلر در زبان های برنامه نویسی مانند C و ++C و ... مفهوم پیچیده ای ندارند ... برنامه نوشته شده کاربر رو میگرفتند و اون رو تبدیل به زبان ماشین میکردند ... و CPU با هر با Fetch کردن ... یک Instruction Code رو از حافظه میخونه و اجرا میکنه ... کامپایلر زبان C هم که Interpreter نداره ... چون نیازی نداره ... داده به زبان ماشین ترجمه شده و کار تمام است ...

اما برخی از زبان ها هستند مثله Java که مستقل از ماشین هستند ... یعنی برنامه ای که شما با این زبون برنامه نویسی مینویسی رو هر ماشینی قابل اجرا هست ... رو IBM روی Apple روی Supper Compute ها و ... این دستگاهها که سی پیو شون با هم فرق داره ... و مطمینا Instruction Code های متفاوتی دارند ... پس چطور یه برنامه نوشته شده این قابلیت رو داره که رو هر ماشینی اجرا بشه ؟؟؟

به خاطر این هست که کامپایلر Java اون برنامه رو به زبان ماشین ترجمه نمیکنه و به قوله شما به Byte Code ترجمه میکنه و این Byte Code قابله خوندن و اجرا شدن توسط CPU کامپایلر نیست ... بایت کد یه کد خاصی با استانداردی خاص هست ... وقتی شما داری این کار رو میکنی Virtual Machine جاوا رو هم مطمینا نصب میکنی ... Virtual Machine جاوا هست که باعث میشه اینترپرتر بفهمه که Byte Code رو چگونه به زبان ماشین ترجمه کنه ... حالا این یعنی چی ...

فرض کن من یه برنامه به زبان Java مینویسم ... اگر این رو روی کامپیوتر خودم که IBM Compatible هست اجرا کنم ... ابتدا کامپایلر میاد و دستورات رو به یه کد فی مابین به نام Byte Code تبدیل میکنه ... و چون Virtual Machine جاوایی که روی کامپیوتر من نصب شده مرتبط با IBM Compatible هست ... اون کدها رو به کدهایی خاص که CPU کامپیوتر من میفهمه بدل میکنه ....

حال اگر همین برنامه رو من ببرم و رویه یه کامپیوتر Apple اجرا کنم ... باز هم این کدها قابلیت اجرا دارن ... چون رو اون کامپیوتر Virtual Machine جاوا مرتبط با Apple نصب شده و این بار Virtual Machine جاوا کدهای من رو به ماشین کدی قابل فهم برای CPU اپل تبدیل میکنه ...

و اما بر میگردیم به سوال شما ... زمان های سابق اینگونه بود که سرعت برنامه های Java پایین تر بود اما این مشگل هم حل شد ... در حقیقت کامپایلر های درست و به موقع (Just In Time) بوجود اومدن که این نقیصه رو حل کردند ... یعنی پس از کامپایل کردن عمل اینترپرتر نیز انجام میشه و کد به زبان ماشین آماده هست و تنها کافی هست CPU اون رو از حافظه Fetch کنه و اجرا کنه ...

ممنوم از شما

پس یعنی تمام چیزایی که من نوشتم درست بود و هیچ مشکلی درش نبود ؟(تمام توضیحاتم )

نه هیچ مشگلی نداشت ... کاملا هم درست بودن ...
کلمات کلیدی Just In Time و Java رو با Google ...سرچ کن ... مطالب مفیدی در موردش پیدا میکنی ...

دوستان چرا مقدار حافظه درخواستی interpreter کمتر از compiler هست ؟

بچه ها من یه جریانی برای نشون دادن runtime errors ها تو ذهنم برای compiler و interpreter

توضیح می دم کمک کنید بگید درسته یا نه یا کامش کنید و عیب یانی کنید .

از اونجایی که errors زمان runtime فقط شامل dynamic semantic errors میشه ( به مراحل کار زبان جاوا در شکل بالا دقت کنید ) قبل از run کامپایلر برنامه شروع به کار میکند یکی از مراحل کار کامپایلر پیدا کردن خطاهای semantic هست این خطاها را پیدا می کند و در یک فایل سیو می کند انگاه در موقه run کردن برنامه (از انجا که خطاهای dynamic semantic در زمان run نشان داده می شود ) با توجه به این که interpreter کدام دستور را اجرا می کند خطای semantic مربوط به همان را نشان می دهد و بعد دوباره که interpreter شروع به اجرا کردن دستور بعدی کرد خطاهای semantic ان را در صورت وجود نمایش خواهد داد.و همین طور تا پایان کد ادامه دارد.

حالا این برداشت درسته؟

reyhaneh.a;406217 نوشت:
دوستان چرا مقدار حافظه درخواستی interpreter کمتر از compiler هست ؟

سلام ریحانه جان ...
امیدوارم که خوب و سلامت باشی ...
من نمیدونم شما چجوری حجم حافظه رو اندازه گرفتی ... چون ...
وظیفه کامپایلر ساخته Byte Code هست و وظیفه Interpreter ساخته بزنامه به زبان ماشین بر اساس بایت کد ...

وقتی کامپایلر داره Byte Code رو میسازه ... اون رو به ریز دستورات قابل فهم پردازنده تبدیل نمیکنه ... مثلا فرض کن شما یه دستوره For رو نوشته ...
تو بایت کد ... اعلان میشه ... دستور For - تعداد دفعات تکرار - نام Counter ... شاید حجم این دستور در Byte Code نهایتا 3 بایت بشه ...
ولی اگر همین دستور بخواد به زبان ماشین ترجمه بشه ... میتونه شامل دستوراتی جهت تخصیص رجیستر ... مقدار دهی رجیستر ها - مقایسه رجیستر با مقداری پیش فرض ... درستور پرش ... و خیلی چیزهای دیگه بشه ...

نمیدونم SQL کار کردی یا نه ... شما تو SQL میتونی فانکشن تعریف کنی ... فرض کن شما رو سرورت یه فانکشن SORT کردن Database تعریف کردی که وظیفه اون Sort کردن محتوای Table هست ... این تابع میتونه 1K بایت کد و 100 بایت رم نیاز داشته باشه ...
ولی وقتی شما داری فانکشن SORT رو از درون Client صدا میزنی ... فقط میگی سورت کن ... شاید حجم اجرایی این دستور 10 بایت هم نشه ... چون فقط فراخوانی یه تابع هست ...

در حقیقت علت اینکه کامپایلر حجم کد کوتاه تری تولید میکنه و تقاضای حافظه کمتری میکنه این هستش که میخواد دستوراته ما رو به یه زبان سطح بالا ترجمه کنه و علته اینکه Interpreter حجم کد بالاتر و Ram بالاتری نیاز داره بخاطره این هست که میخواد دستوراته ما رو به زبان ماشین ترجمه کنه ...

پس در نهایت Interpretter حجم کد بالاتر و Ram بالاتری رو مطالبه میکنه ...

دوستان سلام
در ضرب اعداد بزرگ در درس طراحی الگوریتم همه چیش آسونه به جز خطر آخرش که نوشته t(n)=4t(n/2)+cn خوب الان سوال اینجاست این 4 پشت t از کجا اومده؟
بعدش نوشته a=4 و b=2 و k=1 و در آخر نتیجه گرفته : n و در توان: لگاریتم چهار بر پایه دو
این وسط cn هم نمی دونم چیه؟ دوستان اگر کسی بلده کمکی بکنه.
ممنون

سلام

من خیلی یادم نیست ولی تا اونجا که در خاطرم هست جواب میدم

اینی که شما دادید اصولا صورت مسئله هست، البته با چند خط حل کردن هم می تونید بهش برسید

ولی اون 4 یعنی هربار مسئله رو به 4 تا زیر مسئله به اندازه نصف (n/2) می شکنید

اون Cn هم یعنی زیر مسئله ها رو با زمان cn با هم ترکیب می کنید مثلا با زمان 5n

Ṃᾄʀẓἷἔ;620990 نوشت:
سلام

من خیلی یادم نیست ولی تا اونجا که در خاطرم هست جواب میدم

اینی که شما دادید اصولا صورت مسئله هست، البته با چند خط حل کردن هم می تونید بهش برسید

ولی اون 4 یعنی هربار مسئله رو به 4 تا زیر مسئله به اندازه نصف (n/2) می شکنید

اون Cn هم یعنی زیر مسئله ها رو با زمان cn با هم ترکیب می کنید مثلا با زمان 5n

میشه این قسمتو بیشتر توضیح بدی؟
"ولی اون 4 یعنی هربار مسئله رو به 4 تا زیر مسئله به اندازه نصف (n/2) می شکنید"
چرا اینکارو می کنیم مگه ضرب نیست؟
و بعد اینکه :
یعنی صورت مسئله هست و ما نباید به دستش بیاریم؟
ممنون

yaHosseinDS;621132 نوشت:
چرا اینکارو می کنیم مگه ضرب نیست؟

ببینید خب روش تقسیم و حل یعنی همین که مسئله رو به زیر مسئله های کوچیک تر تقسیم می کنن

بعد اگه حجم زیر مسئله ها به اندازه کافی کوچیک بود اونو مستقیم حل می کنن، اگرم نه از طریق بازگشتی حل میشه

بعدم با ادغام جوابای زیر مسئله ها، مسئله اصلی حل میشه

اگرم بخواید فرمولی که ازش اون قسمت log رو بدست آوردن براتون می زارم

yaHosseinDS;621132 نوشت:
یعنی صورت مسئله هست و ما نباید به دستش بیاریم؟

من سوال اصلی شما رو نمی دونم آخه گفتید همش آسونه به جز خط آخرش که اینه...

ولی اونی که شما دادید اصولا صورت سوال هست و می گن بگید از چه مرتبه ایه

اگه حل بخوان که خب باید بشکنیدش و چند خط حل میشه تا می رسید به اینکه مثلا از چه تتا یا بیگ او یا امگایی هست، اگرم حل اصلی رو نخوان که خب راحتتر هم می تونه حل بشه

برای اینکه بیشتر متوجه اون زیر مسئله ها بشید:

ببیند این مسئله رو شما یه درخت فرض کنید که راسش (t(n هست بعد به 4 تا زیر شاخه تقسیم میشه هر کدوم t(n/2) بعد دوباره هر کدوم از این زیر شاخه ها به 4 تا زیر شاخه تقسیم میشن (یعنی تا الان 16 تا برگ) هرکدوم t(n/4) دوباره همینجور تا t(n/n)

اینا چیزایی که من کم و بیش یادمه ولی برای اینکه مطمئن بشید درست می گم حتما از استادتون هم سوال کنید

Ṃᾄʀẓἷἔ;621380 نوشت:
ببینید خب روش تقسیم و حل یعنی همین که مسئله رو به زیر مسئله های کوچیک تر تقسیم می کنن

بعد اگه حجم زیر مسئله ها به اندازه کافی کوچیک بود اونو مستقیم حل می کنن، اگرم نه از طریق بازگشتی حل میشه

بعدم با ادغام جوابای زیر مسئله ها، مسئله اصلی حل میشه

اگرم بخواید فرمولی که ازش اون قسمت log رو بدست آوردن براتون می زارم

من سوال اصلی شما رو نمی دونم آخه گفتید همش آسونه به جز خط آخرش که اینه...

ولی اونی که شما دادید اصولا صورت سوال هست و می گن بگید از چه مرتبه ایه

اگه حل بخوان که خب باید بشکنیدش و چند خط حل میشه تا می رسید به اینکه مثلا از چه تتا یا بیگ او یا امگایی هست، اگرم حل اصلی رو نخوان که خب راحتتر هم می تونه حل بشه

برای اینکه بیشتر متوجه اون زیر مسئله ها بشید:

ببیند این مسئله رو شما یه درخت فرض کنید که راسش (t(n هست بعد به 4 تا زیر شاخه تقسیم میشه هر کدوم t(n/2) بعد دوباره هر کدوم از این زیر شاخه ها به 4 تا زیر شاخه تقسیم میشن (یعنی تا الان 16 تا برگ) هرکدوم t(n/4) دوباره همینجور تا t(n/n)

اینا چیزایی که من کم و بیش یادمه ولی برای اینکه مطمئن بشید درست می گم حتما از استادتون هم سوال کنید

ممنون Smile یه چیزایی دارم متوجه می شم میشه لگاریتمشم بنویس Smile

اینم بلدی ؟
حل روابط بازگشتی به صورت درختی هست:
t(n)=t(n/10)+t(9n/10)+n
t(1)=1
ممنون

yahosseinds;620984 نوشت:
دوستان سلام
در ضرب اعداد بزرگ در درس طراحی الگوریتم همه چیش آسونه به جز خطر آخرش که نوشته t(n)=4t(n/2)+cn خوب الان سوال اینجاست این 4 پشت t از کجا اومده؟
بعدش نوشته a=4 و b=2 و k=1 و در آخر نتیجه گرفته : N و در توان: لگاریتم چهار بر پایه دو
این وسط cn هم نمی دونم چیه؟ دوستان اگر کسی بلده کمکی بکنه.
ممنون

اون 4 تعداد عمل غالب یعنی ضرب هست ، cn هم اعمالی مثل شیفت به چپ یا راست و اعمال جمع هست

خداییش طراحی الگوریتم چه درس مزخرفیه Sad اه اه اه
اون بالاییشم بلدی؟

http://www.cs.cornell.edu/Courses/cs3110/2011sp/lectures/lec19-master/master.htm
این سایت رو چک کنید یه مثال تقریبا شبیهش رو حل کرده

yaHosseinDS;621519 نوشت:
اینم بلدی ؟
حل روابط بازگشتی به صورت درختی هست:
t(n)=t(n/10)+t(9n/10)+n
t(1)=1
ممنون

من درست یادم نیست ولی وقتی به این شکل هست باید درخت بکشید

راسش t(n) بعد دو تا شاخه t(n/10) و t(9n/10)

بعد t(n/10) تبدیل میشه به t(n/100) و t(9n/100)

و t(9n/10) تبدیل میشه به t(9n/100) و t(81n/100)

یعنی مجموع هر زیر شاخه میشه n

سمت راست ترین شاخه از همه دیرتر اجرا میشه پس باید اونو حساب کنید یعنی : t(9^k n/10^k)

چون باید به t(1) برسیم پس:
(9/10) ^ k ضربدر n = یک

بعد طرفین وسطین که بکنید می رسید به اینکه n= (10/9) ^ k

k= log n تو پایه هم 10/9

چون k تا سطر داریم پس t(n) کوچیکتر مساویه nk=nlogn پایه 10/9

پس t(n) عضو بیگ او nlogn

البته امیدوارم درست باشه:khandeh!:

Ṃᾄʀẓἷἔ;621622 نوشت:
من درست یادم نیست ولی وقتی به این شکل هست باید درخت بکشید

راسش t(n) بعد دو تا شاخه t(n/10) و t(9n/10)

بعد t(n/10) تبدیل میشه به t(n/100) و t(9n/100)

و t(9n/10) تبدیل میشه به t(9n/100) و t(81n/100)

یعنی مجموع هر زیر شاخه میشه n

سمت راست ترین شاخه از همه دیرتر اجرا میشه پس باید اونو حساب کنید یعنی : t(9^k n/10^k)

چون باید به t(1) برسیم پس:
(9/10) ^ k ضربدر n = یک

بعد طرفین وسطین که بکنید می رسید به اینکه n= (10/9) ^ k

k= log n تو پایه هم 10/9

چون k تا سطر داریم پس t(n) کوچیکتر مساویه nk=nlogn پایه 10/9

پس t(n) عضو بیگ او nlogn

البته امیدوارم درست باشه:khandeh!:

نه اختیار دارید. این همه زحمت کشیدید. Smile ممنون
امضاتونم زیباست Smile