ساختن یک شبه کامپایلر

bimO

Member
منم يه سوال داشتم كه خيلي وقته دنبالشم ولي جواب نگرفتم، ممنون مي شم اگه جواب بديد:
چه طوري مي شه در زمان اجرا شدن (بعد از كامپايل شدن) دستورات رو از يه فايل خوند؟(مثل دستورات if و for و ...)
اميد وارم منظورم رو خوب رسونده باشم.
 

saalek110

Well-Known Member
سلام.

با الهام گرفتن از طرز کار cpu شما می توانید برنامه خود را بنویسید. یعنی متغیرهایی را به عنوان فلگ ها و رجیسترها در برنامه اولیه تعریف کنید و بعد با کدهای داخل فایل(مثلا فایل تکست) دستورات را به برنامه exe اولیه تفهیم کنید.
 
آخرین ویرایش:

bimO

Member
ممنون از راهنمايي تون ولي اينو آزمايش كرده بودم و به درد كاري كه مي خواستم نخورد (البته نه تا اين حدي كه شما گفته بودي!)
دليل خوب نبودن اين نوع هم اينه كه فقط ifها و forها نيستند و من اونا رو فقط به عنوان مثال گفتم مشكل اصلي من روي توابعه هست كه بشه مثلاً در فايل نوشت:
(y=a(2*x)+b(c(x+2)-3​
و به ازاء هر x اي كه بديم بتونيم تابعي مثل تابع بالا رو از روي فايل بخونيم و مقدار y رو بدست بياريم.
 

saalek110

Well-Known Member
به نظر من برنامه شما دقیقا یک کامپایلر است و باید برایش کد مجاز تعریف شود. یعنی همان عباراتی که از فایل خوانده می شود.

برای سادگی می توانید جلوی عبارت :

کد:
y=a(2*x)+b(c(x+2)-3)

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

الگوریتم قسمت پردازش فانکشن:
عبارت سمت راست علامت مساوی را بگیر.
با توجه به پرانتزها آنها را بخش بخش کن.
هر بخش را به توابع_محاسباتی مربوطه بفرست.و مقدار بازگشتی را دریافت کن.
نتیجه را با توجه به مقدار x چاپ کن.
---------------------------------------
فکر کنم نوشتن برنامه بالا عملی باشد.
بعدا میشه فرهنگ لغات این کامپایلر را افزایش داد تا فقط به کلمه فانکشن حساس نباشد.

البته این راه ساده ای بود که به ذهن من رسید و ممکنه با ابزارهای حرفه ای این کارها بسیار سریع و ساده تر باشد.

============
گام بعدی: می توان اصطلاحات بعدی را علاوه بر ((فانکشن)) تعریف نمود.
مثلا :
حلقه باز. open_loop
حلقه بسته. close_loop
پرینت. print

وقتی کامپایلر ( منظور برنامه شماست) به دستور open_loop می رسد به اندازه شرط حلقه دستورات بعدی مثل فانکشن ها و پرینت ها را تا رسیدن به close_loop اجرا می کند.
مثلا در فایل داریم:

کد:
open_loop   x<10
function     x=x+1
print       x
print       "hello"
close_loop

که مراحل احتمالا می تواند به شکل منظمی انجام شود.

جنبه عملی کار:
احتمالا کامپایلر ساخته شده باید به تعداد خطوط فایل ابتدا متغیر ایجاد کند برای نگه داری دستورات.
و برای هر کاری(مثل پروسس فانکشنها یا دیگر دستورات) زیربرنامه های مناسب داشته باشیم.
-----------------
پس از نوشتن مطالب بالا سعی کردم با سرچ سورسی پیدا کنم ولی کلمات سرچ مناسب فعلا پیدا نکردم. لینک زیر شاید حاوی این کلمات باشد که بقیه سرچ را به بعد موکول می کنم.
http://ubuntuforums.org/showthread.php?t=489215
 
آخرین ویرایش:

bimO

Member
از راهنماييت خيلي ممنونم ولي اينجوري برنامه خيلي سنگين ميشه و خيلي هم طول مي كشه كه اين عمليات ها رو انجام بده،
نمي شه از يه برنامه جدا ( كامپايلر) استفاده كرد؟ چون اينجوري كار خيلي ساده تر و سريع تر ميشه!
مثلاً چه طوري ميشه از كامپايلر خود ++c استفاده كرد؟
 

saalek110

Well-Known Member
من برنامه بالا را نساختم ولی فکر کنم قسمت (( خواندن از فایل و فرستادن به توابع مربوطه برای پروسس)) اصلا وقتی صرف نکند. چون سرعت سی پلاس خیلی بالا است.

در مورد کامپایلرها زیاد من اطلاعات ندارم. فقط می دونم که یک سری دستور ما بهش می دهیم و قبلا هم این دستورات برایش تعریف شده که کامپایلر می آد کدها را به مشابه ماشین-کد خود تبدیل می کند.
یعنی به نظر من کامپایلر یک برنامه ای است که از این طرف دستورات شناخته شده می گیرد از آن طرف کد ماشین بیرون می دهد.
و چون یک برنامه است باید یکی اجراش کند.( و این کار را شما می توانید بکنید.که در زیر توضیح می دهم).

-----------------------------
شما یک برنامه می نویسید با مثلا ده خط برنامه.
بعد برنامه شما می رود فایل تکستی را می خواند و متوجه می شود درونش دستور 11 ام هست که باید به خودش اضافه کند. فرض می کنیم برنامه سورس 10 خط خودش را دارد و می داند خط 11 ام را کجا اضافه کند.
خوب برنامه می آید به سورس 10 خطی قبلی خط 11 ام را اضافه می کند و بعد...

بعد کامپایلر را صدا می زند می گوید این 11 خط را کامپایل کن.
و همه اینها پشت صحنه انجام می شود.

--------------------
راه دیگر: اگر نخواهید از کامپایلر (مثلا توربو سی) استفاده کنید باید خودتان کامپایلر بنویسید که کار خیلی وقت گیری است.
راه دیگر : همان راه بالا . برنامه همان 10 خط (n خط ) حجمش باقی بماند و از فایل دستورات بعدی را بخواند. به نظر من این راه جالبی است. و راهی که کامپایلر را فرابخوانیم تا برنامه جدید را کامپایل کند هم البته راه جالبی است.(که در این راه خوب سرعت حفظ می شود.) ولی در راه ((خواندن از فایل)) هم فقط یک مرحله (( خواندن فایل و فراخوانی توابع مربوطه)) اضافه می شود. میشه مثل همان دات نت فریم ورک میکروسافت. در برنامه نویسی دات نت دستورات نیمه کامپایل شما توسط clr (همان برنامه 10 خطی شما) با نگاه به کلاسهای دات نت(مشابه همان دستورات function و print در پست قبلی من ) به cpu تحویل داده می شود. خوب وقتی میکروسافت این کار را کرده پس حتما راه خوبی بوده(یا راه های بهتری پیش رو نداشته یا مغرض بوده(ایجاد وابستگی-فروش محصولات) .). البته من در یک مقاله خواندم 30 درصد سرعت را از دست داده (البته نمی دانم منبع موثق بوده یا نه). ولی به نظر من با توجه به سرعت بالای پردازشگرها میکروسافت سنجیده این کار را کرده.
 
آخرین ویرایش:

langar_64

New Member
سلام مهندسین من یه کامپایلربه زبان c یا #c میخوام که بتونه یه عبارت ساده ی ریاضی رو محاسبه کنه خیلی لازم دارم هرکس بلده کمکم کنه
 

bimO

Member
ببخشيد كه خيلي دير جواب مي دم، راهي كه شما گفتي خيلي راه خوب و مناسبي هست ولي چه طوري ميشه اين كارو كرد؟ مسأله مهم همينه كه چه طور خط 11ام رو اضافه كنيم و كامپايل كنيم؟
 

majid.tash

New Member
یک برنامه واسه درس اصول کامپایلر ی خوام
موضوع اینه که دو تا عدد روبا هم جمع کنه ولی من حتی اسم نرم افزارشو نمی دونم اگه کسیمیدنه کمک کنه ممنون می
 

جدیدترین ارسال ها

بالا