PDA

View Full Version : سوال: ساخت کامپایلر با دلفی



new delhpi coder
سه شنبه 12 دی 1391, 22:03 عصر
سلام
من برای یک پروژه دانشگاهی می خوام یک چیز جالب ارائه بدم .
خودم قصد نوشتن یک کامپایلر رو دارم.
سوالم اینه که تاحالا کسی چنین کاری کرده ؟ ارزش داره وقت بذارم ؟ با سی راحتر نیست ؟

و اگه میشه یک نمونه.

ممنون.

بهروز عباسی
سه شنبه 12 دی 1391, 22:10 عصر
درود:لبخند:

http://www.delphibasics.info/system/app/pages/search?scope=search-site&q=TortriX

موفق باشید

Felony
سه شنبه 12 دی 1391, 22:14 عصر
براي پروژه دانشگاهي موارد جالبتري هم هست كه ميشه روشون تحقيق و كار كرد ( مثل Parallel Programming ، یا بازی های مرتبط با پردازش تصویر ) ، در آخر اگر به همچين چيزي اصرار داري بهتره دنبال نوشتن مفسر باشي ، هم دردسرش از ساخت کامپایلر کمتره ، هم خودم و دوستان دیگری رو اینجا میشناسم که روی این مباحث به صورت عملی و تخصصی کار کردن و میتونن کمکت کنن .

BORHAN TEC
چهارشنبه 13 دی 1391, 12:25 عصر
سلام
ساخت کامپایلر کار آسانی نیست و در پروژه های دانشگاهی هم معمولاً انتظار نمی رود که دانشجویی یک کامپایلر تمام عیار و بدون نقص بسازد. در هر صورت در این موارد پروژه های Open Source مختلفی وجود دارد که می توانید از آنها کمک بگیرید:

1- پروژه Free Pascal که یک کامپایلر واقعی و قدرتمند است. آنقدر قدرتمند و کامل که حتی با اطمینان کامل می توان از آن برای ساخت برنامه های واقعی تجاری استفاده کرد:
http://barnamenevis.org/showthread.php?370706

2- پروژه RemObjects Pascal Script: کاملاً متن باز است. این پروژه ایده های خوبی را در ذهن شما ایجاد می کند که مهمترین آنها نحوه ایجاد Parser برای یک زبان برنامه سازی است.
http://www.remobjects.com/ps.aspx

3- پروژه های Open Source دیگری در این زمینه وجود دارند (مثلاً در سایت codeproject.com) که می توانید از آنها هم استفاده کنید:
http://www.codeproject.com/Articles/4082/A-Simple-Compiler-for-the-Common-Language-Runtime
http://www.codeproject.com/Articles/30353/Designing-a-Compiler

4- این روزها در زمینه ساخت کامپایلر، LLVM خیلی بازار داغی دارد. که تحقیق در مورد آن هم می تواند به خودی خود یک پروژه بسیار ارزشمند باشد و من به شخصه توصیه می کنم که به عنوان پروژه پایانی(اگر استادان شما آنقدر شعور داشته باشند که اهمیت موضوع را درک کنند!) بر روی همین LLVM تحقیق کنید، البته منظور من یک پروژه تحقیقاتی است و نه یک پروژه عملیاتی مثل ساخت یک کامپایلر! این روزها برای توسعه کامپایلرهای Delphi و C++‎‎‎‎‎‎‎‎ Builder از LLVM هم استفاده می شود. LLVM در کلام ساده فریم ورکی برای ساخت کامپایلر است. استفاده از LLVM خیلی ارزشمند است و ساخت کامپایلر های Cross-Platform را به نسبت گذشته خیلی آسانتر کرده است.
http://llvm.org/

موفق باشید...

new delhpi coder
چهارشنبه 13 دی 1391, 13:32 عصر
براي پروژه دانشگاهي موارد جالبتري هم هست كه ميشه روشون تحقيق و كار كرد ( مثل Parallel Programming ، یا بازی های مرتبط با پردازش تصویر ) ، در آخر اگر به همچين چيزي اصرار داري بهتره دنبال نوشتن مفسر باشي ، هم دردسرش از ساخت کامپایلر کمتره ، هم خودم و دوستان دیگری رو اینجا میشناسم که روی این مباحث به صورت عملی و تخصصی کار کردن و میتونن کمکت کنن .

سلامی دوباره
ممنون از راهنمایی
آقا ماهان پردازش تصویر در دلفی مشکل ساز نیست ؛ یعنی میشه حرفه ای هم دنبالش کرد .(قصد منحرف کردن تاپیک رو ندارم اما پیشنهاد جالبی بود .ببخشید)

Felony
چهارشنبه 13 دی 1391, 13:44 عصر
سلامی دوباره
ممنون از راهنمایی
آقا ماهان پردازش تصویر در دلفی مشکل ساز نیست ؛ یعنی میشه حرفه ای هم دنبالش کرد .(قصد منحرف کردن تاپیک رو ندارم اما پیشنهاد جالبی بود .ببخشید)
در کل مشکل خیلی حادی از لحاظ فنی نیست ولی ++C به دلیل کتابخانه های غنی که داره ( مثلا OpenCV ) و Reference های زیاد در این موارد ترجیح داده میشه .

مصطفی ساتکی
جمعه 15 دی 1391, 20:58 عصر
در کل مشکل خیلی حادی از لحاظ فنی نیست .
همچین چیزی نیست مشکل دلفی خیلی هم حاده.
مواردی که در optimization در بعضی از کامپایلر های C++‎‎‎‎ مثل کامپایلر intel و gcc و MSC++‎‎‎‎ وجود داره قابل قیاس نیست.


ولی ++C به دلیل کتابخانه های غنی که داره ( مثلا OpenCV ) .

معمولاً برای پیاده سازی در سطح engine کمتر از opencv استفاده میشه مثلاً فیلتری که برای smooth کردن در engine نوشته شده بسیار customize شده برای کار خاص و کد تقریباً از حالت قابل خواندن خارج شده و در نهایت با رعایت کردن این روش های optimize کارایی کلی engine رو افزایش میده.

نکته : من همه این موارد را تست کردم و در نهایت زبان برنامه نویسی خودمو از دلفی تغییر دادم.

بهروز عباسی
شنبه 16 دی 1391, 17:19 عصر
درود به همه:لبخند:
من هنوز درس کامپایلر رو نخوندم ، پس چیزی هم نمی دونم.:ناراحت:
اما دیشب یک مقاله دیدم در مورد کامپایلر که نمونه کد هم داشت (به زبان VB.NET) من اون کد ها رو به دلفی تبدیل کردم برای دوستان
امید وارم مفید باشه.
این کلاس شامل توابع زیره :
با این تابع چک می کنیم که آیا کرکتری که بهش پاس داده شده عدده یا یک کلمه.
Function is_Digit_or_Alphabet(const SrcCH: Char): Boolean;

با این تابع چک می کنیم که آیا کرکتری که بهش پاس داده کرکتر مخصوص پایان دستور هست یا نه (مثل دلفی که باید به ";" ختم بشه).
Function is_End_Of_Statement(const SrcCH: String): Boolean;

با این تابع چک می کنیم که آیا کلمه ای که بهش پاس داده شده یک کلمه کلیدی (مثلاً : "iostream.h"در ++c )هست یا نه.
Function is_keyword(const SrcWord: String): Boolean;

با این تابع چک می کنیم که آیا کرکتری که بهش پاس داده یک عملگر ریاضی هست یا نه (مثل : "+" و "-").
Function Is_Mathematical_Operator(const SrcWord: String;
Describe: PString): Boolean;

با این تابع چک می کنیم که آیا کامه ای که بهش پاس داده شده دارای شرایط لازم برای نام متغییرها و.. هست یا نه.
Function Is_Name_valid(const SrcWord: String): Boolean;

با این تابع چک می کنیم که آیا کرکتری که بهش پاس داده شده یک پرانتز است یا نه ؛ اگر هست ،باز است یا بسته.
Function is_Parenthesis(const SrcWord: String; Describe: PString): Boolean;

با این تابع چک می کنیم که آیا کرکتری که بهش پاس داده شده یکی از عملگرهای مورد استفاده در شرط ها (مثل : "<="یا "=") هست یا نه.
Function Is_Relational_Operator(const SrcWord: String;
Describe: PString): Boolean;

همین.

اینم سورسش :
unit unt_Compiler;

interface

uses
System.StrUtils,
System.Types;

type
PString = ^string;

type
TCompiler = class
private
function IsNumeric(const AString: string): Boolean;
function CaseOfString(s: string; a: array of string): Integer;
public
Function is_Digit_or_Alphabet(const SrcCH: Char): Boolean;
Function is_End_Of_Statement(const SrcCH: String): Boolean;
Function is_keyword(const SrcWord: String): Boolean;

Function Is_Mathematical_Operator(const SrcWord: String;
Describe: PString): Boolean;
Function Is_Name_valid(const SrcWord: String): Boolean;

Function is_Parenthesis(const SrcWord: String; Describe: PString): Boolean;
Function Is_Relational_Operator(const SrcWord: String;
Describe: PString): Boolean;
constructor Create;
end;

implementation

const
KeyWordTable =
'#include <conio.h> <stdio.h> <iostream.h> conio.h stdio.h iostream.h void int float main begin end end. char while do';

{ TCompiler }

function TCompiler.CaseOfString(s: string; a: array of string): Integer;
begin
Result := 0;
while (Result <= Length(a)) and (a[Result] <= s) do
Inc(Result);
if a[Result] <= s then
Result := -1;
end;

{$HINTS OFF}

constructor TCompiler.Create;
begin

end;

function TCompiler.IsNumeric(const AString: string): Boolean;
var
LCode: Integer;
LVoid: Int64;
begin
Val(AString, LVoid, LCode);
Result := LCode = 0;
end;
{$HINTS ON}

function TCompiler.is_Digit_or_Alphabet(const SrcCH: Char): Boolean;
const
Words = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvw xyz0123456789';
begin
If PosEx(SrcCH, Words) <> 0 Then
Result := True
Else
Result := False
end;

function TCompiler.is_End_Of_Statement(const SrcCH: String): Boolean;
begin
If Length(SrcCH) = 1 Then
begin
If SrcCH = ';' Then
Result := True
Else
Result := False;
end
else
Result := False;
end;

function TCompiler.is_keyword(const SrcWord: String): Boolean;
var
i: Integer;
keyw: TStringDynArray; // array of string;
begin
SetLength(keyw, Length(KeyWordTable));
keyw := (SplitString(KeyWordTable, ' '));
For i := 0 To High(keyw) do
begin
If keyw[i] = SrcWord Then
begin
Result := True;
Break;
End
else
Result := False;
end;
end;

function TCompiler.Is_Mathematical_Operator(const SrcWord: String;
Describe: PString): Boolean;
begin
If Length(SrcWord) > 1 Then
begin
Result := False;
End;
If Length(SrcWord) = 1 Then
begin
case Self.CaseOfString(SrcWord, ['+', '-', '*', '/', '^']) of
0:
begin
Describe^ := 'Addition Operator';
Result := True;
end;
1:
begin
Describe^ := 'Minus Operator';
Result := True;
end;
2:
begin
Describe^ := 'Multiplication Operator';
Result := True;
end;
3:
begin
Describe^ := 'Division Operator';
Result := True;
end;
4:
begin
Describe^ := 'Exponentiation Operator';
Result := True;
end;
else
Result := False;
end;
end;
end;

function TCompiler.Is_Name_valid(const SrcWord: String): Boolean;

function MidStr(const AText: String; const AStart, ACount: Integer): string;
begin
Result := Copy(AText, AStart, ACount);
end;
Function StrToChar(InputString: String; CharPosition: Integer): Char;
Begin
Result := InputString[CharPosition];
End;

var
currentChar: Char;
i: Integer;
begin
If Length(SrcWord) > 4 Then
begin
Result := False;
Exit;
end;
If Length(SrcWord) <= 4 Then
begin
If IsNumeric(SrcWord) = True Then
begin
Result := False;
Exit;
end;
For i := 1 To Length(SrcWord) do
begin
currentChar := StrToChar(MidStr(SrcWord, i, 1), 1);
If is_Digit_or_Alphabet(currentChar) = False Then
begin
Result := False;
Exit;
End;
end;
Result := True;
Exit;
end;
end;

function TCompiler.is_Parenthesis(const SrcWord: String;
Describe: PString): Boolean;
begin
If Length(SrcWord) <> 1 Then
Result := False;

If Length(SrcWord) = 1 Then
case Self.CaseOfString(SrcWord, ['(', ')']) of
0:
begin
Describe^ := 'Parenthesis is Opened';
Result := True;
end;
1:
begin
Describe^ := 'Parenthesis is Closed';
Result := True;
end;
Else
Result := False
end;
end;

function TCompiler.Is_Relational_Operator(const SrcWord: String;
Describe: PString): Boolean;
begin
If Length(SrcWord) > 2 Then
begin
Result := False;
End;
If Length(SrcWord) <= 2 Then
case Self.CaseOfString(SrcWord, ['<', '<=', '>', '>=', '=']) of
0:
begin
Describe^ := 'Less than';
Result := True;
end;
1:
begin
Describe^ := 'Less than or equal to';
Result := True;
end;
2:
begin
Describe^ := 'Greater than';
Result := True;
end;
3:
begin
Describe^ := 'Greater than or equal to';
Result := True;
end;
4:
begin
Describe^ := 'Equality';
Result := True;
end;
else
Result := False;
end;
end;

end.

موفق باشید.:لبخند:

بهروز عباسی
شنبه 16 دی 1391, 17:34 عصر
این سورس کد توی کاسه کوزم بود گفتم شاید بشه ازش توی کامپایلر استفاده کرد.


موفق باشید.

mohsen24000
جمعه 22 دی 1391, 07:38 صبح
http://barnamenevis.org/showthread.php?366436-%DA%A9%D8%A7%D9%85%D9%BE%D9%88%D9%86%D9%86%D8%AA-%D9%87%D8%A7%DB%8C-%D8%BA%DB%8C%D8%B1-%D8%B1%D8%A7%DB%8C%DA%AF%D8%A7%D9%86&p=1673683&viewfull=1#post1673683