رفتن به مطلب
جامعه‌ی برنامه‌نویسان مُدرن ایران

سوال

فرض کنیم متدی  به نام Calculate برای یکی از کلاسها درون برنامه وجود دارد و برحسب شرایطی فرا خوانی میشود. آیا راهی وجو دارد که بتوان کد داخی آنرا تغییر داد طوری که بعد از تغییر برنامه کد تغییر یافته را اجرا کند همانند  proceger  در sql server

به اشتراک گذاری این ارسال


لینک به ارسال
به اشتراک گذاری در سایت های دیگر

پست های پیشنهاد شده

  • 0
در 3 ساعت قبل، kambiz behnia گفته است :

فرض کنیم متدی  به نام Calculate برای یکی از کلاسها درون برنامه وجود دارد و برحسب شرایطی فرا خوانی میشود. آیا راهی وجو دارد که بتوان کد داخی آنرا تغییر داد طوری که بعد از تغییر برنامه کد تغییر یافته را اجرا کند همانند  proceger  در sql server

با سلام وقت بخیر,

این دومین پیام و اولین پاسخی است که در این انجمن ارسال می کنم.

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

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

خب در این حالت نیاز به یک حافظه برای تعیین وضعیت دارد.

بطور مثال اگر وضعیت 0 بود باید عملیات های مشخص شده ای انجام دهد و اگر 1 بود دستورات خاص و مجزای دیگری...

برای نگهداری وضعیت کنونی می توانید از یک متغییر یا هر تکنیک دیگری حتی فایل استفاده کنید.

که با فراخوانی و خواندن مقدار آن در داخل تابع Calculate می توانید تکلیف خودتان را مشخص کنید تا چه نوع عملیات و دستوراتی را اجرا کنید.

نمونه مشابه در C :

int state=0;
void calculate() {
    if(state == 0) {
        // ...
    }
    else {
        // ...
    }
    // OR
    // 
    // switch(state) {
    //     case 0: break;
    //     case 1:break;
    // }
}
void changeState() {
    if(state == 0) {
        state=1;
    }
    else {
        state=0;
    }
}

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

هنگامی که به تنها به عنوان این مطلب نگاهی میکنم, بنظرم بهتر است اینگونه بگویم که :

شما در زمان اجرا نمی توانید تصمیم جدیدی برای نوشتن دستوراتی جدید برای اجرا بگیرید. (بصورت منطقی)

چون کد ها از قبل باید کامپایل شده باشند و موتور کامپایلر در زمان اجرا در کنار شما نخواهد بود. (در حالت کلی)

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

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

مکس بیس / Max Base

به اشتراک گذاری این ارسال


لینک به ارسال
به اشتراک گذاری در سایت های دیگر
  • 0
در 13 ساعت قبل، kambiz behnia گفته است :

فرض کنیم متدی  به نام Calculate برای یکی از کلاسها درون برنامه وجود دارد و برحسب شرایطی فرا خوانی میشود. آیا راهی وجو دارد که بتوان کد داخی آنرا تغییر داد طوری که بعد از تغییر برنامه کد تغییر یافته را اجرا کند همانند  proceger  در sql server

خوب اگر منظورتون رفتار های متفاوت یک تابع در زمان اجراست که اغلب تکنیک های شی گرایی و الگوهای طراحی دقیقا برای این قبیل چالش ها ایجاد شده اند.

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

البته روشهایی هم هست که تکنیک های تزریق سورس کدهای پویا و استاتیک مشهور هستند که بیشتر برای کرک کردن استفاده میشود البته نه در سورس برنامه بلکه در خروجی اسمبلی برنامه!

و اگرهم اهداف دیگه ای دارید که پیشنهاد میکنم منابعی درباره کامپایلر زمان اجر دات نت JIT ویا منابعی درباره ماشین مجازی جاوا JVM ویا Dalvik مطالعه داشته باشید البته کامپایلرهای زبانهای مفسری مثل پایتون و پی اچ پی هم خیلی کمک میکنه!

به اشتراک گذاری این ارسال


لینک به ارسال
به اشتراک گذاری در سایت های دیگر
  • 0
در 11 ساعت قبل، Max Base گفته است :

با سلام وقت بخیر,

این دومین پیام و اولین پاسخی است که در این انجمن ارسال می کنم.

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

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

مکس بیس / Max Base

کمی گنگ بودن سوال را قبول دارم. 

فرض کنید دربرنامه به Sq Server  وصل شده و اقدام به صدا کردن پروسیجرهایی که از قبل نوشته و در دیتابیس ذخیره شده است مکنیم. هر وقت ما اقدام به تغییر یک پروسیجر بکنیم از آن به بعد آن کد جدید هنگام صدا کردن پروسیجر اجرا خواهد شد. میخواستم مشابه این را داشته باشم.

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

مثلا در windows میتوانیم بخشی را کد را داخل فایل dll قرار دهیم و هرگاه کد dll را عوض کرده و دوباره کمپایل کنیم و فایل dll را جایگزین فایل قبلی کنیم تغییرات جدید اعمال خواهد شد. تقریبا میخواهم مشابه این کار را انجام دهم بطوریکه لازم به کمپایل مجدد چیزی نباشد و تغییرات در حد عوض کردن یک فایل text باشد.

شاید اینطوری بهتر باشد چگونه یک فایل script  که حاوی کدهای است که در امکان تغییر داده های اصلی را میدهد را اجرا کنیم.   

به اشتراک گذاری این ارسال


لینک به ارسال
به اشتراک گذاری در سایت های دیگر
  • 0
در 26 دقیقه قبل، فرهاد شیری گفته است :

خوب اگر منظورتون رفتار های متفاوت یک تابع در زمان اجراست که اغلب تکنیک های شی گرایی و الگوهای طراحی دقیقا برای این قبیل چالش ها ایجاد شده اند.

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

البته روشهایی هم هست که تکنیک های تزریق سورس کدهای پویا و استاتیک مشهور هستند که بیشتر برای کرک کردن استفاده میشود البته نه در سورس برنامه بلکه در خروجی اسمبلی برنامه!

و اگرهم اهداف دیگه ای دارید که پیشنهاد میکنم منابعی درباره کامپایلر زمان اجر دات نت JIT ویا منابعی درباره ماشین مجازی جاوا JVM ویا Dalvik مطالعه داشته باشید البته کامپایلرهای زبانهای مفسری مثل پایتون و پی اچ پی هم خیلی کمک میکنه!

منظور رفتار متفاوت در زمان اجرا هست ولی چون از قبل نوع عملکرد مشخص نیست و تغییرات زیاد است میخواستم به روشی بخش کمپایل مجدد کد را به شکلی حذف کنم.

فکر نمیکنم مبحث تزیق کد کاربردی برایم داشته باشد.

 اگر درست متوجه شده باشم دات نت و جاوا برای اجرا سورس کد را به یک واسطه تبدیل و کدهای داخل آنرا اجرا میکنند حال در این حالت اگر سورس کد اصلی تغییر کند آیا دوبراره بطورخدکار آنرا کمپایل خواهند کرد

در باره Dalvik چیزی نمیدانم شاید جوابم را بدهد اگر تا حدودی نزیک پاسخم بود مزاحم خواهم شد.

اگر بتوان از داخل برنامه c++ از زبان پایتون استفاده کرد و دادهایی را تبادل نمود و ایتون قابلیت کمپایل (منظور همان تفسیر دوباره است ) زمان اجرا را داشته باشد احتمالا کارساز خواهد بود

متشکرم

به اشتراک گذاری این ارسال


لینک به ارسال
به اشتراک گذاری در سایت های دیگر
  • 0
ارسال شده در (ویرایش شده)
در 9 ساعت قبل، kambiz behnia گفته است :

شاید اینطوری بهتر باشد چگونه یک فایل script  که حاوی کدهای است که در امکان تغییر داده های اصلی را میدهد را اجرا کنیم.   

منظور رفتار متفاوت در زمان اجرا هست ولی چون از قبل نوع عملکرد مشخص نیست و تغییرات زیاد است میخواستم به روشی بخش کمپایل مجدد کد را به شکلی حذف کنم.

یکی از پارادایم های برنامه نویسی همین موضوع کنترل رفتارهای برنامه در شرایط و ورودی های مختلف هست.

یکی از راه های پرکاربرد که در سیستم عامل لینوکس هم خیلی شایع هست استفاده از متا دیتا فایلهاست یعنی شما نوع رفتاری که برنامه باید ازخودش نشون بده را داخل یک فایل تکست می نویسید مثل فایل زیر....

[TEST_CYCLE]=15;
[AXLE_ELEMENT_ID]=4;
[NET]=0,[CPU]=0
#Byte-1 
#If you put in this byte true can be receive data from this NET and CPU. Otherwise put false can't receive data.                                                #
[RECEIVE]=true; 
#NOTHING, RESET, NEVER_SENT, MISMATCH                                                                                                                           #
[IO_STATUS]=NOTHING;
#OD_NORMAL, RX_TIMEOUT, TX_TIMEOUT, CD_CUT                                                                                                                      #
[OD_COMM]=OD_NORMAL;
#Just submit the errors you want                                                                                                                                #
#(FL_NORMAL_MASK,FL_FPGA_LIVE) - (SH_NORMAL_MASK,SH_SECOND_HALF) - (FH_NORMAL_MASK,FH_FIRST_HALF)                                                               #
[ERROR_FL_SH_FH]=FL_FPGA_LIVE | SH_SECOND_HALF | FH_FIRST_HALF |;
#Byte-1 
#Just submit the faulty you want
#(PG_ERREONOUS,PG_NO_ERREONOUS_MASK ) - (PULS_ERREONOUS,PULS_NO_ERREONOUS_MASK) - (PILOT1_ERREONOUS, PILOT1_NO_ERREONOUS_MASK)                                  #
#(PILOT2_ERREONOUS,PILOT2_NO_ERREONOUS_MASK) - (RESET_ACK 0, NORMALLY_MASK 1)-(MiCRO_ERREONOUS 0, MiCRO_NO_ERREONOUS_MASK 1)                                    #
[FAULTY_ERROR]=PG_ERREONOUS | PULS_NO_ERREONOUS_MASK | PILOT1_NO_ERREONOUS_MASK | PILOT2_NO_ERREONOUS_MASK | NORMALLY_MASK | MiCRO_NO_ERREONOUS_MASK |;
#If you put in this 3 bytes ($), then the original byte will be used. Otherwise, enter a number.                                                                #
#Byte-1
[AXLE_COUNTER_VALUE]=$;
#Byte-1
[CYCLE_COUNTER_VALUE]=$;
#Byte-1
[CRC_VALUE]=$;

حالا وقتی برنامه را با متادیتا های فوق بنویسید یعنی رفتار برنامه را در زمان اجرا می توانید تغییر بدید!

البته بحث استفاده از متادیتا ها خیلی گسترده است با چند خط نمیشه توضیح داد ولی جان مطلب همین بود که عرض کردم فکر کنم کار شما را راه بندازه!

در 9 ساعت قبل، kambiz behnia گفته است :

اگر بتوان از داخل برنامه c++ از زبان پایتون استفاده کرد و دادهایی را تبادل نمود و ایتون قابلیت کمپایل (منظور همان تفسیر دوباره است ) زمان اجرا را داشته باشد احتمالا کارساز خواهد بود

اصولا چه نیازی هست که شما بخواهید از داخل برنامه سی پلاس پلاس کدهای پایتون را اجرا کنید من فکر میکنم که مطلبی که عرض کردم مشکل شما را رفع میکنه البته لازم هست که کمی هم مطالعه کنید راجع به Meta Data 

ویرایش شده در توسط فرهاد شیری

به اشتراک گذاری این ارسال


لینک به ارسال
به اشتراک گذاری در سایت های دیگر
  • 0
در 11 ساعت قبل، kambiz behnia گفته است :

منظور رفتار متفاوت در زمان اجرا هست ولی چون از قبل نوع عملکرد مشخص نیست و تغییرات زیاد است میخواستم به روشی بخش کمپایل مجدد کد را به شکلی حذف کنم.

فکر نمیکنم مبحث تزیق کد کاربردی برایم داشته باشد.

 اگر درست متوجه شده باشم دات نت و جاوا برای اجرا سورس کد را به یک واسطه تبدیل و کدهای داخل آنرا اجرا میکنند حال در این حالت اگر سورس کد اصلی تغییر کند آیا دوبراره بطورخدکار آنرا کمپایل خواهند کرد

در باره Dalvik چیزی نمیدانم شاید جوابم را بدهد اگر تا حدودی نزیک پاسخم بود مزاحم خواهم شد.

اگر بتوان از داخل برنامه c++ از زبان پایتون استفاده کرد و دادهایی را تبادل نمود و ایتون قابلیت کمپایل (منظور همان تفسیر دوباره است ) زمان اجرا را داشته باشد احتمالا کارساز خواهد بود

متشکرم

بنظرم مشکل شما با یک زبان اسکریپتی حل میشه. کافیه تا توابع و قابلیت هایی که میخواین رو از ++C به یکی از زبان های اسکریپتی مثل Lua بایند کنید و بعد از اون میتونید قابلیت هایی که بایند شده رو در قالب یک فایل تکست یا حتی یک string اجرا کنید.

به اشتراک گذاری این ارسال


لینک به ارسال
به اشتراک گذاری در سایت های دیگر
  • 0
در 2 ساعت قبل، quark گفته است :

بنظرم مشکل شما با یک زبان اسکریپتی حل میشه. کافیه تا توابع و قابلیت هایی که میخواین رو از ++C به یکی از زبان های اسکریپتی مثل Lua بایند کنید و بعد از اون میتونید قابلیت هایی که بایند شده رو در قالب یک فایل تکست یا حتی یک string اجرا کنید.

میتونند از http://chaiscript.com هم استفاده کنند که به شما اجاره میده توابع از پیش تعریف شده سی پلاس پلاس رو در ران تایم صدا بزنید

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


 

#include <chaiscript/chaiscript.hpp>

std::string helloWorld(const std::string &t_name) {

return "Hello " + t_name + "!";

}

int main() {

chaiscript::ChaiScript chai;

chai.add(chaiscript::fun(&helloWorld), "helloWorld");

chai.eval(R"(

puts(helloWorld("Bob"));

)");

}

این چیزی رو که مد نظرتون هست پیاده میکنه ؟

@kambiz behnia 

به اشتراک گذاری این ارسال


لینک به ارسال
به اشتراک گذاری در سایت های دیگر
  • 0
در 9 ساعت قبل، بهنام صباغی گفته است :

میتونند توی ران تایم کد بنویسند و اجرا کنند.

یعنی الان این تابع...

std::string helloWorld(const std::string &t_name) {

return "Hello " + t_name + "!";

}

کامپایل شده ویا در زمان اجر کامپایل میشود.یعنی میشه این تابع را داخل یک فایل تکست نوشت ودر زمان اجرا بدون کامپایل این برنامه تابع فوق را evaluate میکنه!

ویا فقط با استفاده از دستورات خود همین مفسر اسکریپتی مثل همین تابع puts , print را می توان به عنوان ورودی رفتار تابع helloWorld را evaluate کرد.

به نظر من قطعا باید از قبل رفتار تابع کامپایل شده باشه ولی ورودی های این تابع که با استفاده از تابع puts ارسال میشن چون به صورت رشته هستند قطعا می تونن در زمان اجرا متفاوت باشن! بنابراین حوزه عملکرد این مفسر محدود به توابع سرویس دهنده ای هست که تدارک دیده.!

به اشتراک گذاری این ارسال


لینک به ارسال
به اشتراک گذاری در سایت های دیگر
  • 0
در در 23 تیر 1398 در 19:14، فرهاد شیری گفته است :

یکی از پارادایم های برنامه نویسی همین موضوع کنترل رفتارهای برنامه در شرایط و ورودی های مختلف هست.

یکی از راه های پرکاربرد که در سیستم عامل لینوکس هم خیلی شایع هست استفاده از متا دیتا فایلهاست یعنی شما نوع رفتاری که برنامه باید ازخودش نشون بده را داخل یک فایل تکست می نویسید مثل فایل زیر....

حالا وقتی برنامه را با متادیتا های فوق بنویسید یعنی رفتار برنامه را در زمان اجرا می توانید تغییر بدید!

البته بحث استفاده از متادیتا ها خیلی گسترده است با چند خط نمیشه توضیح داد ولی جان مطلب همین بود که عرض کردم فکر کنم کار شما را راه بندازه!

اصولا چه نیازی هست که شما بخواهید از داخل برنامه سی پلاس پلاس کدهای پایتون را اجرا کنید من فکر میکنم که مطلبی که عرض کردم مشکل شما را رفع میکنه البته لازم هست که کمی هم مطالعه کنید راجع به Meta Data 

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

به اشتراک گذاری این ارسال


لینک به ارسال
به اشتراک گذاری در سایت های دیگر
  • 0
در در 23 تیر 1398 در 21:09، quark گفته است :

بنظرم مشکل شما با یک زبان اسکریپتی حل میشه. کافیه تا توابع و قابلیت هایی که میخواین رو از ++C به یکی از زبان های اسکریپتی مثل Lua بایند کنید و بعد از اون میتونید قابلیت هایی که بایند شده رو در قالب یک فایل تکست یا حتی یک string اجرا کنید.

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

به اشتراک گذاری این ارسال


لینک به ارسال
به اشتراک گذاری در سایت های دیگر
  • 0

اگر امکان این وجو داشته باشد تا کد helloWorld را تغییر داده و بدون نیاز به کمپایل مجدد برنامه اصلی بتوان از کد جدید استفاده کرد احتمالا پاسخگوی کارم خواهد بود.

 

به اشتراک گذاری این ارسال


لینک به ارسال
به اشتراک گذاری در سایت های دیگر
  • 0
در 2 ساعت قبل، kambiz behnia گفته است :

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

زبان های اسکریپتی زیادی الان وجود دارن که هرکدوم یکسری مزیت و یکسری معایب دارن که با توجه به کارتون باید یکیو انتخاب کنید. من پیشنهادم همین Lua هست که صرفا بخاطر اینکه قبلا باهاش کار کردم و از نظر سرعت و سادگی خوب بوده میگم. شاید زبان اسکریپت بهتری برای کار شما وجود داشته باشه که من ازش مطلع نیستم. بهتره یک جستجو بکنید.

توجه داشته باشید که شما تو زبان اسکریپتی مثل Lua نمیتونید دقیقا بایت به بایت یک فانکشن رو تغییر بدید. تغییراتی که میتونید بدید در حده

1- صدا زدن فانکشنهای از قبل بایند شده

2- تغییر/مقدار دهی متغییرهای از قبل بایند شده

3- ساخت فانکشن های جدید (ترکیبی از فانکشنهای بایند شده ++C و کدهای Lua)

هست و بییشتر از این انتظاری از یک زبان اسکریپتی نیست. که البته همین هم فوق العاده کاربردیه.

به اشتراک گذاری این ارسال


لینک به ارسال
به اشتراک گذاری در سایت های دیگر
  • 0
در در 24 تیر 1398 در 08:54، فرهاد شیری گفته است :

یعنی الان این تابع...


std::string helloWorld(const std::string &t_name) {

return "Hello " + t_name + "!";

}

کامپایل شده ویا در زمان اجر کامپایل میشود.یعنی میشه این تابع را داخل یک فایل تکست نوشت ودر زمان اجرا بدون کامپایل این برنامه تابع فوق را evaluate میکنه!

ویا فقط با استفاده از دستورات خود همین مفسر اسکریپتی مثل همین تابع puts , print را می توان به عنوان ورودی رفتار تابع helloWorld را evaluate کرد.

به نظر من قطعا باید از قبل رفتار تابع کامپایل شده باشه ولی ورودی های این تابع که با استفاده از تابع puts ارسال میشن چون به صورت رشته هستند قطعا می تونن در زمان اجرا متفاوت باشن! بنابراین حوزه عملکرد این مفسر محدود به توابع سرویس دهنده ای هست که تدارک دیده.!

خیر توبع توی سی پلاس پلاس نوشته میشند و توی کد ریجستر میشند یعنی کد همون کد کامپایل شده سی پلاس پلاس هست ولی میتونید توی ران تایم صداشون کنید مثلا ما برای کار روی تصویر ازش استفاده کردیم میتونستیم تصاویر رو الگوریتم های مختلف روشون اعمال کنیم فرض کنید خروجی یه تابع تصویر بود و بعد میشد فیلتر های مختلف و عملیات مختلف رو که توابعشون رو ریجستر کرده بودیم رو روش اعمال کنیم و تابع Save هم داشتیم که تصویر رو بعد عملیات ذخیره می‌کردیم خوبیش این بود که برای کارهای دم دستی و ساده روی تصویر میتونست کاربر خودش کارهایی که میخواست رو روی تصویر انجام بده و بعد از رسیدن به یک کد نسبتا خوب این کد میومد توی سی پلاس پلاس میشد یک ابزار برای نرم‌افزار یعنی تیم علمی یه ابزار راحت داشت که سرعت سی پلاس پلاس رو داشت و میتونست کارهایی که میخواست رو انجام بده بدون این که توی کد سی پلاس پلاس دست ببره و سرعت سی پلاس پلاس رو هم داشت.

باید کاربرد دقیق تعریف بشه تا بشه توی این پیادش کرد مثلا کار ما با تصویر بود میشد گرفت و ذخیرش کرد یا حتی تابع خوندن تصویر داشتیم توش.

درکل توابع از قبل کامپایل شده و ریجستر شده رو میتونه ران کنه یعنی یه جورایی میتونید مفسر خودتون رو طوری که دوست دارید و کاربردتون هست تعریف کنید مثل کاری که ما کردیم.

به اشتراک گذاری این ارسال


لینک به ارسال
به اشتراک گذاری در سایت های دیگر
  • 0
در 10 ساعت قبل، بهنام صباغی گفته است :

درکل توابع از قبل کامپایل شده و ریجستر شده رو میتونه ران کنه یعنی یه جورایی میتونید مفسر خودتون رو طوری که دوست دارید و کاربردتون هست تعریف کنید مثل کاری که ما کردیم.

اگر یک نمونه مثال هم برای توضیحاتی که دادید ارسال کنید فکر کنم تاثیر بهتری داشته باشه!

به اشتراک گذاری این ارسال


لینک به ارسال
به اشتراک گذاری در سایت های دیگر
  • 0
در 14 ساعت قبل، kambiz behnia گفته است :

اگر امکان این وجو داشته باشد تا کد helloWorld را تغییر داده و بدون نیاز به کمپایل مجدد برنامه اصلی بتوان از کد جدید استفاده کرد احتمالا پاسخگوی کارم خواهد بود.

 

اگر منظورتون از تغییر کد helloWorld این هست که در در زمان اجرا کلا logic تابع که الان دستور return هست را تغییر بدید ویا logic جدیدی اضافه کنید که همانطور که توضیح داده شد خیر نه این زبان اسکریپتی ونه هیچ زبان اسکریپتی دیگری چنین کاری انجام نخواهد داد!

فلسفه مفسرهای اسکریپتی اینچنینی این هست که شما در صورتی که توابع مورد نظر خودتون را از قبل کامپایل کرده باشید، می توانید در زمان اجرا با استفاده از دستوراتی که مفسر اسکریپتی در اختیار قرار میده توابع خود را با ورودی های مختلف که می توانند در یک تکست فایل هم قالب بندی شده باشند اجرا کنید.

فقط همین...

به اشتراک گذاری این ارسال


لینک به ارسال
به اشتراک گذاری در سایت های دیگر
  • 0

 

در 11 ساعت قبل، بهنام صباغی گفته است :

درکل توابع از قبل کامپایل شده و ریجستر شده رو میتونه ران کنه یعنی یه جورایی میتونید مفسر خودتون رو طوری که دوست دارید و کاربردتون هست تعریف کنید مثل کاری که ما کردیم.

همانطور که جناب آقای شیری فرمودن ارائه مثال میتواند تاثیر بهتری داشته باشد. چون با توجه به توضیحات شما ذهن من رفت طرف فانکشن پونتر و استفاده از آنها. 

به اشتراک گذاری این ارسال


لینک به ارسال
به اشتراک گذاری در سایت های دیگر
  • 0
در 6 دقیقه قبل، فرهاد شیری گفته است :

اگر منظورتون از تغییر کد helloWorld این هست که در در زمان اجرا کلا logic تابع که الان دستور return هست را تغییر بدید ویا logic جدیدی اضافه کنید که همانطور که توضیح داده شد خیر نه این زبان اسکریپتی ونه هیچ زبان اسکریپتی دیگری چنین کاری انجام نخواهد داد!

فلسفه مفسرهای اسکریپتی اینچنینی این هست که شما در صورتی که توابع مورد نظر خودتون را از قبل کامپایل کرده باشید، می توانید در زمان اجرا با استفاده از دستوراتی که مفسر اسکریپتی در اختیار قرار میده توابع خود را با ورودی های مختلف که می توانند در یک تکست فایل هم قالب بندی شده باشند اجرا کنید.

فقط همین...

اتفاقا منظورم همان تغییر logic تابع هست. یعنی امیدی نیست. 

نظرتان در باره پاسخ کاربر quark چیست؟

در 12 ساعت قبل، quark گفته است :

زبان های اسکریپتی زیادی الان وجود دارن که هرکدوم یکسری مزیت و یکسری معایب دارن که با توجه به کارتون باید یکیو انتخاب کنید. من پیشنهادم همین Lua هست که صرفا بخاطر اینکه قبلا باهاش کار کردم و از نظر سرعت و سادگی خوب بوده میگم. شاید زبان اسکریپت بهتری برای کار شما وجود داشته باشه که من ازش مطلع نیستم. بهتره یک جستجو بکنید.

توجه داشته باشید که شما تو زبان اسکریپتی مثل Lua نمیتونید دقیقا بایت به بایت یک فانکشن رو تغییر بدید. تغییراتی که میتونید بدید در حده

1- صدا زدن فانکشنهای از قبل بایند شده

2- تغییر/مقدار دهی متغییرهای از قبل بایند شده

3- ساخت فانکشن های جدید (ترکیبی از فانکشنهای بایند شده ++C و کدهای Lua)

هست و بییشتر از این انتظاری از یک زبان اسکریپتی نیست. که البته همین هم فوق العاده کاربردیه.

 

به اشتراک گذاری این ارسال


لینک به ارسال
به اشتراک گذاری در سایت های دیگر
  • 0
در 2 ساعت قبل، kambiz behnia گفته است :

نظرتان در باره پاسخ کاربر quark چیست؟

قطعا مفسر اسکریپتی Lua خیلی معروفتر و تکمیلتر از اسکریپتور معرفی شده در پست های قبلی اشاره شد، ولی روش کار همون هست.

نقل قول

اتفاقا منظورم همان تغییر logic تابع هست. یعنی امیدی نیست. 

خیر تغییر logic میسر نخواهد بود! بهتر بود یکم سناریوی خودتون را واضحتر بیان کنید تا روشهای بهتری بشه پیشنهاد داد!

به اشتراک گذاری این ارسال


لینک به ارسال
به اشتراک گذاری در سایت های دیگر
  • 0
در 3 ساعت قبل، فرهاد شیری گفته است :

قطعا مفسر اسکریپتی Lua خیلی معروفتر و تکمیلتر از اسکریپتور معرفی شده در پست های قبلی اشاره شد، ولی روش کار همون هست.

خیر تغییر logic میسر نخواهد بود! بهتر بود یکم سنا

 

ریوی خودتون را واضحتر بیان کنید تا روشهای بهتری بشه پیشنهاد داد!

فرض را براین بگذاریم که یک Object داده وجود دارد (که میتواند یک کلاس از کلاسهایی باشد که خودمان ایجاد کرده ایم و یا یک آرایه از کاراکتر و یا هر دیتا تایپ داخلی ++C "فرض کنیم حتی امکان سریالایز کرده داده وجود داشته باشد") حال میخواهیم برحسب شرایط تغیراتی روی این داده انجام گیرد. در حالت نرمال در داخل کد برنامه این کار را بکمک نوشتن متد ها انجام میدهیم. واضح است که با تغییر logic هرکدام از این متد ها مجددا باید کل برنامه کمپایل گردد.

حال با توجه به اینکه logic مورد استفاده از قبل مشخص نیست و تقریبا هر چند وقت یکبار تغییر میکند و حتی گاهی تصمیم براین قرار میگیرد که از ساعت 9 تا 12 ظهر یک منطق و از 12 ظهر تا 2 منطق دیگر و دوبار منطق قبلی برای logic آن تابع در نظر گرفته شود. (چیزی شبیه تصمیم گیری بعضی از مدیران 🙂

فرض کنیم قراراست مشخص کنیم چه وسایل نقلیه ای می تواند از یک محور خاص عبور کند در حالت نرمال میگوئیم همه در شرایط خاص بعضی حال باید این بعضی را مشخص کنیم.

تصمیم بر اسال شماره پلاک باشد؟ کدام شماره ها

بر اسال مدل و سال ساخت باشد و یا رنگ هم در نظر گرفته شود؟

راننده هم مهم است؟

مبدا و مقصد چطور؟

آیا باید به وسیله نقلیه چیزی اضافه و یا کم شود؟

آیا باید وسیله خاصی داخل خودرو باشد باشد؟

همه این موارد میتواند موجب تصمیم گیری  جهت اعلام محدودیت های ترافیکی شود.

شاید عجیب بنظر برسد ولی محدودیتهای ترافیکی اعلام شده در موارد خاص تابع هیچ قانون کلی نیست و با توجه به شرایط محیط، زمانی و مکانی اعلام و اعمال میشود.

 

یک مثال

وقتی ما مثلا در Sql Server اقدام به ایجاد Stored Procedures میکنیم دیگر برنامه ها اقدام به صدا کردن این Stored Procedures خواهند کرد و این کار کد داخل ان خواهد شود حا هرگاه من اقدام به تغییر logic این Stored Procedures کنم بعد از ذخیره درصورت صدا کردن این Stored Procedures توسط هر برنامه دیگری کدهای جدید اعمال خواهند شد.

 

آیا امکان داشتن چنین قابلیتی در کنار برنامه های ++C وجود دارد؟ (برای دیگر زبانها چطور؟)

به اشتراک گذاری این ارسال


لینک به ارسال
به اشتراک گذاری در سایت های دیگر
  • 0
در 2 ساعت قبل، kambiz behnia گفته است :

وقتی ما مثلا در Sql Server اقدام به ایجاد Stored Procedures میکنیم دیگر برنامه ها اقدام به صدا کردن این Stored Procedures خواهند کرد و این کار کد داخل ان خواهد شود حا هرگاه من اقدام به تغییر logic این Stored Procedures کنم بعد از ذخیره درصورت صدا کردن این Stored Procedures توسط هر برنامه دیگری کدهای جدید اعمال خواهند شد.

اول از سوال دوم شروع کنم !

فلسفه SP ها در SQLServer به علت اینکه دستوری به نام Alter وجود دارد این امکان را به برنامه نویس میده که هر وقت خواست کل منطق SP را مجددا بنویسه و SP جدید را Execute کنه که خوب البته که این امکان فوق العاده ست ولی باعث از بین رفتن یکپارچگی داده هم میشه! و البته که این مهم به علت وجود دستور Alter هست و الباقی ماجرا...

در 2 ساعت قبل، kambiz behnia گفته است :

حال با توجه به اینکه logic مورد استفاده از قبل مشخص نیست و تقریبا هر چند وقت یکبار تغییر میکند و حتی گاهی تصمیم براین قرار میگیرد که از ساعت 9 تا 12 ظهر یک منطق و از 12 ظهر تا 2 منطق دیگر و دوبار منطق قبلی برای logic آن تابع در نظر گرفته شود. (چیزی شبیه تصمیم گیری بعضی از مدیران 🙂

فرض کنیم قراراست مشخص کنیم چه وسایل نقلیه ای می تواند از یک محور خاص عبور کند در حالت نرمال میگوئیم همه در شرایط خاص بعضی حال باید این بعضی را مشخص کنیم.

تصمیم بر اسال شماره پلاک باشد؟ کدام شماره ها

...

فکر کنم در پست های بالایی هم اشاره کردم که برای این کار باید از Meta Data ها استفاده کنید یعنی تمامی این شرایط که می فرمایید اگر از قبل روشن هست که خوب بهتر اگرهم نیست کافی امکانی تدارک ببنید که کاربر سیستم بتونه این متادیتاها را ایجاد کنه و حالا تمام مقادیری که برای اجرا شدن منطق های مختلف نیاز دارید را کافی در این متا دیتا ها کپسوله کنید و در سمت برنامه هم parser هایی بنویسید که این مقادیر را از متا دیتاها Map کنن داخل کلاسهای Model که دارید و در کلاسهای Logic از این مدل ها استفاده کنید و لایه Viewهم براساس تصمیمات Logic خروجی مناسب را نمایش بده!

این مثال که عرض میکنم کاملا واقعی هست و همین الان در حوزه صنعت ریلی کشور در حال استفاده است، یعنی ما برای اینکه بتوانیم رفتارهای سنسورها و تمامی المانهایی که به صورت سخت افزاری برای نرم افزارهای کنترلی که نوشته ایم  دیتا ارسال کنند وبرای اینکه هر ایستگاه قطارهای برون شهری با هم کاملا متفاوت هستند و حتی این تفاوت در ایستگاه های متروها هم کاملا متفاوت هست بنابراین با رفتارهای متفاوت سخت افزارهای متفاوتی روبه رو هستیم بنابراین قطعا متادیتاهایی داریم که به صورت مجزا هر ایستگاه را کاملا جداگانه با نوع داده ها و رفتارهای متفاوت تعریف میکنیم داخل نرم افزارهای اصلی هم تعریف کردیم که فقط از این متادیتا ها برای منطق کنترل سیگنالینگ خطوط استفاده کنند.در پست های قبلی هم براتون یک نمونه قرار دادم.

پس نه به مفسر اسکریپتوری نیاز دارید ونه به هیچ ابزار دیگه ای!

البته یا باید خودتون Parser ها را بنویسید ویا اگر از فرمت های استاندارد برای متادیتا ها استفاده میکنید، مثلا JSON,GSON,XML می توانید از کلاس های Parser که برای این فرمت داده ها وجود دارد هم استفاده کنید. قطعا هم سیستمی به مراتب Scalability بهتر وهم Responsibility بسیار بهتری خواهد داشت، وهم  Configurable خواهد بود.

بنابراین کافی که این شرایط که مثلا باید خودرو ها داشته باشند ویا منطق های تصمیم گیری که ذکر کردید را در یک متادیتا فایل استاندارد تعریف کنید و در زمان مناسب اونها را parse کنید.

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

نقل قول

فرض را براین بگذاریم که یک Object داده وجود دارد (که میتواند یک کلاس از کلاسهایی باشد که خودمان ایجاد کرده ایم و یا یک آرایه از کاراکتر و یا هر دیتا تایپ داخلی ++C "فرض کنیم حتی امکان سریالایز کرده داده وجود داشته باشد") حال میخواهیم برحسب شرایط تغیراتی روی این داده انجام گیرد. در حالت نرمال در داخل کد برنامه این کار را بکمک نوشتن متد ها انجام میدهیم. واضح است که با تغییر logic هرکدام از این متد ها مجددا باید کل برنامه کمپایل گردد.

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

امیدوارم توضیحاتم مفید فایده باشه!

 

به اشتراک گذاری این ارسال


لینک به ارسال
به اشتراک گذاری در سایت های دیگر
  • 0
در 10 ساعت قبل، فرهاد شیری گفته است :

اگر یک نمونه مثال هم برای توضیحاتی که دادید ارسال کنید فکر کنم تاثیر بهتری داشته باشه!

مثال رو که در پست اول فرستادم دقت نکردید ؟

به اشتراک گذاری این ارسال


لینک به ارسال
به اشتراک گذاری در سایت های دیگر
  • 0
در در 26 تیر 1398 در 19:07، بهنام صباغی گفته است :

مثال رو که در پست اول فرستادم دقت نکردید ؟

قطعا دقت کردم😁

ظاهرا شما دقت نکردید😂😂

 که اون مثال مربوط به پست شما نیست !

نقل قول

مثلا ما برای کار روی تصویر ازش استفاده کردیم میتونستیم تصاویر رو الگوریتم های مختلف روشون اعمال کنیم فرض کنید خروجی یه تابع تصویر بود و بعد میشد فیلتر های مختلف و عملیات مختلف رو که توابعشون رو ریجستر کرده بودیم رو روش اعمال کنیم و تابع Save هم داشتیم که تصویر رو بعد عملیات ذخیره می‌کردیم

انشاالله اگر بی دقت نباشیم!! منظورمون از مثال برای این پست بود...

به اشتراک گذاری این ارسال


لینک به ارسال
به اشتراک گذاری در سایت های دیگر
  • 0
در 22 ساعت قبل، فرهاد شیری گفته است :

قطعا دقت کردم😁

ظاهرا شما دقت نکردید😂😂

 که اون مثال مربوط به پست شما نیست !

انشاالله اگر بی دقت نباشیم!! منظورمون از مثال برای این پست بود...

😄 سریع بهتون بر میخوره‌ها

نه دیگه در مورد خود chaiscript مثال فرستادم ولی کاربردش رو که گفتم خدمتتون برای هرکس کاربردش جدا تعریف میشه کاری که ما کردیم برای کار خودمون بود و توی کد‌های شرکت هست با همین منطقی که گفتم و همین مثالی که فرستادم میشه کارهایی که میخواید رو پیاده کنید دیگه تعریف تابع و استفادش رو که مثالش رو فرستادم این که یک تابع save و load داشته باشی هم که سادست توی کار روی دیتا بقیشم که عملیاتی که میخوای رو تعریف میکنی حالا جمع یا ضرب یا تقسیم و ...

در این مورد توضیحات روشنه نیاز به مثال نیست یا میتونم بگم حال مثال نوشتن ندارم 😅

بازم معذرت میخوام اگر شما یا دوستان رو ناراحت کردم.

به اشتراک گذاری این ارسال


لینک به ارسال
به اشتراک گذاری در سایت های دیگر
  • 0
در 20 ساعت قبل، بهنام صباغی گفته است :

سریع بهتون بر میخوره‌ها

نه آقا چه حرفی! برخوردن دیگه چی!(من نمیدونم این بدعت کی گذاشته که ماهرچی بگیم منتج به این حرف میشه!🤔

شما فرمودید که توجه نکردید، منهم عرض کردم که متوجه اون مثال شدم. این کجاش برخوردنه میخواهید یک قالب درست کنید توسایت که طبق همون جواب سوالها را بدیم😂

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

 

در 20 ساعت قبل، بهنام صباغی گفته است :

نه دیگه در مورد خود chaiscript مثال فرستادم ولی کاربردش رو که گفتم خدمتتون برای هرکس کاربردش جدا تعریف میشه کاری که ما کردیم برای کار خودمون بود و توی کد‌های شرکت هست با همین منطقی که گفتم و همین مثالی که فرستادم میشه کارهایی که میخواید رو پیاده کنید دیگه تعریف تابع و استفادش رو که مثالش رو فرستادم این که یک تابع save و load داشته باشی هم که سادست توی کار روی دیتا بقیشم که عملیاتی که میخوای رو تعریف میکنی حالا جمع یا ضرب یا تقسیم و ...

تشکر بابت توضیحی که دادید. قطعا من اگر میخواستم استفاده کنم همین مثالی که مربوط به خود مفسر اسکریپت بود، معرفی کردید ازش استفاده میکردم، ولی من گفتم مثال برای کسانی که شاید نتونن به خوبی ازش استفاده کنن کمی قابل درکتر و راحت بشه!

در 20 ساعت قبل، بهنام صباغی گفته است :

بازم معذرت میخوام اگر شما یا دوستان رو ناراحت کردم.

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

به اشتراک گذاری این ارسال


لینک به ارسال
به اشتراک گذاری در سایت های دیگر
  • 0
در در 26 تیر 1398 در 18:05، فرهاد شیری گفته است :

اول از سوال دوم شروع کنم !

فلسفه SP ها در SQLServer به علت اینکه دستوری به نام Alter وجود دارد این امکان را به برنامه نویس میده که هر وقت خواست کل منطق SP را مجددا بنویسه و SP جدید را Execute کنه که خوب البته که این امکان فوق العاده ست ولی باعث از بین رفتن یکپارچگی داده هم میشه! و البته که این مهم به علت وجود دستور Alter هست و الباقی ماجرا...

....

 

 با این حساب باید تمرکزم رو روی Meta Data قرار بدم اگر چه با توجه به استفاده از SP در برنامه های دیگر کارفرما به استفاده از آن و یا مواردی مشابه آن تمایل بیشتری دارد. آخه عمری با روش SP کارکردن و به آن عادت کرده اند. از وقتی که گذاشتید متشکرم. اگر در ادامه در مورد استفاده از Meta Data به مشکل و یا سوالی برخوردم مزاحم شما خواهم شد.

به اشتراک گذاری این ارسال


لینک به ارسال
به اشتراک گذاری در سایت های دیگر

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

مهمان
پاسخ به این سوال ...

×   شما در حال چسباندن محتوایی با قالب بندی هستید.   حذف قالب بندی

  تنها استفاده از ۷۵ اموجی مجاز می باشد.

×   لینک شما به صورت اتوماتیک جای گذاری شد.   نمایش به عنوان یک لینک به جای

×   محتوای قبلی شما بازگردانی شد.   پاک کردن محتوای ویرایشگر

×   شما مستقیما نمی توانید تصویر خود را قرار دهید. یا آن را اینجا بارگذاری کنید یا از یک URL قرار دهید.


  • کاربران آنلاین در این صفحه   0 کاربر

    هیچ کاربر عضوی،در حال مشاهده این صفحه نیست.

×
×
  • جدید...