Interpreter در برنامه نویسی انیمیشن و VFX . آقای سجاد ربیعی که مدرس دوره هودینی cmiVFX هستند با بخش ششم از مطلب تفاوت زبان های اسکریپت نویسی و برنامه نویسی در کنار ماست . مدتی است مباحث تخصصی سجاد ربیعی را در ImanVFX داریم. در این مطلب آقای سجاد ربیعی در مورد مزیت ها و معایب برنامه نویسی و اسکریپت نویسی و همچنین محدودیت های اسکریپت نویسی صحبت خواهند کرد.
آشنایی با مفاهیم اولیه زبان های برنامه نویسی و اسکریپت نویسی
قسمت 6 :
-
تفاوت زبان های اسکریپت نویسی و برنامه نویسی
(Programming Languages vs Scripting Languages)
-
تفاوت پلاگین و اسکریپت ابزار ها
(Plug-ins vs Scripting Tools)
-
کاربرد زبان های برنامه نویسی و اسکریپت نویسی در صنعت انیمیشن و VFX
کانال مقالات استاد سجاد ربیعی در ImanVFX
آشنایی با مفاهیم زبان های برنامه نویسی و اسکریپت نویسی در انیمیشن و VFX قسمت 1
آشنایی با مفاهیم اولیه زبان های برنامه نویسی و اسکریپت نویسی در انیمیشن و VFX قسمت 2
آشنایی با مفاهیم اولیه زبان های برنامه نویسی و اسکریپت نویسی در انیمیشن و VFX قسمت 3
آشنایی با مفاهیم اولیه زبان های برنامه نویسی و اسکریپت نویسی در انیمیشن و VFX قسمت 4
آشنایی با مفهوم Physically Based Rendering در موتورهای رندر
تفاوت زبان های اسکریپت نویسی و برنامه نویسی,قسمت 5 معرفی اسکریپت نویسی
تفاوت زبان های اسکریپت نویسی و برنامه نویسی,سجاد ربیعی قسمت 6
تفاوت زبان های اسکریپت نویسی و برنامه نویسی,سجاد ربیعی قسمت 7
تفاوت زبان های اسکریپت نویسی و برنامه نویسی,آشنایی با PyMEL – Python – API – PyQt
مروری بر مقاله قبلی
در مقاله قبلی با زبان های اسکریپت نویسی کمی آشنا شدید ، گفتیم که زبان های اسکریپت نویسی عموما روی یک نرم افزار که با زبان برنامه نویسی مانند C نوشته شده اند سوار میشوند و به کاربر این قابلیت را میدهند که بدون نیاز به تغییر در سورس اصلی برنامه که با زبان C نوشته شده است ، در درون خود نرم افزار با زبان های اسکریپت نویسی برنامه بنویسند. همچنین گفته شد که عموما با زبان های اسکریپت نویسی تنها میتوان از قابلیت هایی استفاده کرد که آن قابلیت ها در کد های اصلی برنامه که به زبان C نوشته شده اند وجود داشته باشند. بنابراین از زبان های اسکریپت نویسی معمولا برای اتوماتیک کردن کارها به وسیله امکانات و قابلیت های از پیش تعریف شده نرم افزار ها استفاده میکنند و نمیتوان قابلیت های منحصر به فردی که در سورس اصلی نرم افزار تعریف نشده اند را ساخت. مثالی که زدیم در نرم افزار Maya بود که اگر بخواهیم یک نور جدید با عملکرد متفاوت برای مایا بنویسیم ، باید حتما با زبان های برنامه نویسی آن را ساخت ، ولی اگر بخواهیم یکسری کارهای اتوماتیک را با نورهای استاندارد Maya انجام دهیم ، میتوانیم از زبان های اسکریپت نویسی مثل MEL استفاده کنیم.
به علاوه گفته شد که تنها زمانی میتوانیم از مفهموم پلاگین یا Plug-In استفاده کنیم که آن برنامه را با API مایا نوشته باشیم ، بنابراین ابزاری را با زبان اسکریپت نویسی مینویسیم ، به آن اسکریپت ابزار میگوییم .این اشتباهی است که برخی از دوستان عمدا یا سهوا مرتکب میشوند و زمانی که ابزاری را با زبان اسکریپت نویسی مینویسند میگویند که یک پلاگین نوشتیم.
ادامه مقاله
در ادامه مقاله قصد دارم در مورد مزیت ها و معایب برنامه نویسی و اسکریپت نویسی و همچنین محدودیت های اسکریپت نویسی بیشتر صحبت کنم.
تعریف Interpreter یا مفسر
در برنامه نویسی ما چیزی داشتیم به اسم کامپایلر با مترجم که وظیفه داشت برنامه و کدهای نوشته شده توسط ما را به زبان ماشین تبدیل کند.
در زبان اسکریپت نویسی مفسر یا Interpreter تقریبا همچین کاری میکند ولی با کمی تفاوت !
اجازه بدید یک مثال بزنم تا بهتر متوجه بشوید :
گفتیم عموما زبان های اسکریپت نویسی روی برنامه ای که با زبان های برنامه نویسی مثل C نوشته شده سوار میشوند (Embedded) و با اسکریپت نویسی ما میتوانیم توابع داخلی این برنامه که با C نوشته شده است را صدا بزنیم و از آنها استفاده بکنیم.
خوب در حقیقت داستان اینطور میشه که ما ابتدا با اسکریپت یک برنامه مینویسیم ، بعد باید این کد ما یه جوری به سورس اصلی نرم افزار منتقل بشه و کاری را انجام بده ، مفسر یا Interpreter این وظیفه را بر عهده دارد ، در حقیقت مفسر وظیفه داره تا اسکریپت های نوشته شده توسط ما را خط به خط بخونه و سپس آن را تفسیر کنه که قراره چه اتفاقی بیوفته و ما میخواهیم چی کار بکنیم و بعد از تفسیر کردن آن کارها را با اجرا کردن توابع داخلی نرم افزار که با زبان C نوشته شده انجام بده ، در این عملیات حتما متوجه شدید که چیزی به زبان ماشین تبدیل نمیشه و دستورات مستقیما بعد از تفسیر اجرا میشه ، کمی گیج شدید ؟ خوب اجازه بدید کمی واضحتر صحبت کنم .
فرض کنید میخواهیم یک Script در Maya بنویسیم که قراره بعد از اجرا کردن این اسکریپت ، 10 عدد کره در محیط مایا به صورت اتوماتیک برای ما ساخته بشود. در زبان MEL باید همچین چیزی بنویسیم :
int $i = 0;
for ($i = 0 ; $i < 10 ; $i++)
{
polySphere ;
}
خوب ، جناب آقای مفسر با خواندن این اسکریپت متوجه میشه که ما یک حلقه یا Loop لازم داریم که قراره یک کار خاص را 10 مرتبه انجام بده ، حالا اون کار خاص چیه ؟
چون از تابع polySphere در زبان MEL استفاده کردیم یعنی اون کار خاص ، ساخت یک کره می باشد ، جناب مفسر با مطالعه این کد متوجه میشه که ما چی میخواهیم و ابتدا شروع میکنه برای ما یک حلقه می سازه ، سپس به توابع داخلی Maya که با زبان ++C نوشته شده رجوع میکنه و از بین آنها تابع مربوط به ساخت کره را اجرا میکنه و نهایتا این میشه که ما در Maya ده تا کره با اسکریپت نویسی میسازیم.
خوب در این مثال متوجه شدید که هیچ چیز به زبان ماشین تبدیل یا ترجمه نشد و همه زحمت ها افتاد گردن آقای مفسر یا Interpreter ، در حقیقت میتونیم اینجور بگیم که Interpreter اسکریپت ما را مستقیما اجرا میکند.
مزیت های برنامه نویسی
در بسیاری از مواقع ما میتوانیم یک ابزار را با هر دو مورد یعنی برنامه نویسی و یا اسکریپت نویسی بسازیم ، ولی جالبه بدانید که ابزارهایی که به صورت پلاگین نوشته شده باشند معمولا بیشتر از 10 برابر سریعتر از همان ابزار با اسکریپت نویسی است ! ، بنابراین در زمانهایی که برای ما سرعت بسیار مهم است مثل نوشتن یک Deformer که قراره روی مدل های بسیار سنگین با میلیونها vertex کار بکنه ، مسلما انتخاب روش اسکریپت نویسی کمی احمقانه می باشد !
با نوشتم پلاگین ما میتوانیم از پایه ، ابزارها و امکانات منحصر به فردی را به نرم افزار اضافه بکنیم که از قبل در آن وجود نداشته است ، مثل نوشتن یک سیستم نور جدید ، ولی با اسکریپت نویسی ما تنها میتوانیم از امکاناتی که از قبل در نرم افزار وجود داشته است استفاده کنیم و اگر هم ابزاری جدید بسازیم ، آن ابزار با استفاده از ابزار های استاندارد نرم افزار ساخته میشود ، مثل نوشتن یک ابزار برای اینکه به صورت اتوماتیک رنگ مدل ها را تغییر دهد.
با کمک برنامه نویسی و پلاگین ما میتوانیم دیگر API ها ی مختلف را به عنوان قابلیتی جدید به نرم افزار خودمان اضافه بکنیم. مثلا میتوانیم API مربوط به موتور فیزیک Havok را دانلود کنیم و با برنامه نویسی از آن API استفاده کنیم و این موتور فیزیک را به صورت پلاگین به Maya اضافه بکنیم.
امکانات برنامه نویسی برای مدیریت RAM و CPU و غیره در زبان های برنامه نویسی مثل ++C بسیار کاملتر از زبان های اسکریپت نویسی است ، این باعث میشود که بتوانیم برنامه ای کاملا optimize و بهینه تری بنویسیم. در زبان های اسکریپت نویسی معمولا این مدیریت به صورت اتوماتیک انجام میشود و کنترل دقیق آن از دست برنامه نویس خارج است.
مزیت اسکریپت نویسی
یادگیری و نوشتن ابزار با زبان های اسکریپت نویسی بسیار بسیار ساده تر و سریعتر از زبان های برنامه نویسی است ، به همین دلیل عموما میبینیم که بسیاری از آرتیست ها مثل انیماتور ها و یا رندرمن ها با زبان های اسکریپت نویسی آشنایی دارند ، ولی تنها افراد کاملا technical با زبان های برنامه نویسی میتوانند پلاگین بنویسند ، به همین دلیل معمولا افراد برنامه نویس در تیم جدا و فیلد کاری جدا از آرتیست ها کار میکنند .
برای اسکریپت نویسی ما نیاز به کامپایلر یا نرم افزار جدا مثل Visual Studio نداریم و مستقیما میتوانیم در نرم افزار خودمان مثل Maya و یا Max برنامه بنویسیم که این ، کار ما را خیلی راحتتر میکند.
ساخت محیط های کاربری یا GUI برای ابزارهایی که نوشتیم در زبان های اسکریپت نویسی بسیار ساده تر از زبان های برنامه نویسی میباشد. اگر دقت کرده باشید بیشتر پلاگین های بزرگی که روی نرم افزار Maya نصب میکنیم ، تعدادی اسکریپت هم کنار خود دارند ، وقتی آن پلاگین را در مایا فعال میکنیم ، این اسکریپت ها برای پلاگین مورد نظر محیط کاربری میسازند.
چه مواقعی باید با زبان برنامه نویسی Plug-in نوشت ؟
خوب با توجه به توضیحات بالا فکر نکنم که جواب دادن به این سوال برای شما خیلی سخت باشد ! مثلا در Maya اگر میخواهید یک Node جدید به آن اضافه کنید باید از برنامه نویسی و API مایا استفاده کنید ، مثلا ساخت یک Node برای پیاده سازی هوش مصنوعی یا AI در Maya !!! همچنین اگر سرعت اجرای دستورات برای شما خیلی مهم است باید حتما از API استفاده بکنید.
چه مواقعی باید با اسکریپت نویسی کار کرد ؟
اگر در بسیاری از پروژه ها نیاز باشه که برخی کارها را اتوماتیک انجام بدید ، بهتره از اسکریپت نویسی استفاده بکنید ، مثلا فرض کنید که چند تا Texture مختلف برای برگ ساختید ، حالا میخواهید به صورت اتوماتیک کاری کنید که این Texture ها هر یک به صورت Random به هزاران مدل برگ درخت اعمال بشه ، در این مثال شما خیلی راحت میتوانید از Script استفاده بکنید.
همچنین در بسیاری از پروژه ها ما نیاز داریم تا یک فرمول با منطق برای ابزار خودمون پیدا کنیم ، مثلا فرض کنید که میخواهید یک deformer بسازید که قراره مدل ها را روی یک curve یا منحنی deform بکنه (Path Deformer) ، در این مثال ها شما میتوانید ابتدا منطق و فرمول خود را با اسکریپت نویسی پیدا کنید و مطمئن بشوید که این فرمول درست کار میکنه ، بعد آن را با زبان برنامه نویسی پیاده سازی کنید و یک Plug-in بسازید ، به دلیل اینکه اسکریپت نویسی بسیار ساده تر است و نتیجه برنامه خود را میتوانیم مستقیما و خیلی سریع در نرم افزار ببینیم و نیازی به کامپایل و load کردن پلاگین نداریم. این کاری است که بسیاری از برنامه نویسان حرفه ای انجام میدهند.
مثلا اگر اطلاع داشته باشید ، موتور رندر RenderMan یک الگوریتم جدید رندر داره که به آن RIS میگویند، قبلا RenderMan تنها با سیستم Reyes کار میکرد و با سیستم Reyes ما میتونستیم با زبان RSL که در حقیقت یک نوع زبان اسکریپت نویسی است برای RenderMan متریال های انحصاری بنویسیم ، اما سیستم جدید RIS تنها زبان ++C را ساپورت میکنه و یک جورایی ما مجبوریم برای ساخت متریال جدید ، پلاگین بنویسیم ، خوب کار جالبی که برنامه نویسان حرفه ای میکنند اینه که چون نوشتن متریال با زبان ++C کمی مشکله ، ابتدا فرمول های ریاضی متریال را با زبان RSL که خیلی ساده تره برای سیستم REYES مینویسند ، بعد اگر این فرمول ها درست بود ، آنها را در زبان ++C پیاده سازی میکنند و یک متریال برای سیستم رندر RIS مینویسند !
توجه !
اگر چه برنامه نویسی توانایی های نا محدود به شما میدهد و شما میتوانید به کمک آن کارهای منحصر به فردی انجام دهید ، ولی فراموش نکنید که هر کسی برای کاری ساخته شده و معمولا افراد حرفه ای تنها در چند بخش محدود تخصص خیلی بالایی دارند ، به همین دلیل همه قرار نیست همه چیز را یاد بگیرند چون در این صورت نمیشه ادعا کرد که به همه چیز تسلط کامل دارند ، بنابراین در بخش بعدی من مشخص کرده ام که معمولا چه کسایی باید اسکریپت نویسی و برنامه نویسی یاد بگیرند.
چه کسانی نیاز دارند که برنامه نویسی و API یاد بگیرند ؟
معمولا نوشتن پلاگین و برنامه نویسی و کار با API مربوط به تیم Software Development میباشد و حتی افراد این گروه شاید اطلاعات بسیار کمی راجب انیمیشن ، مدلینگ و غیره داشته باشند (نسبت به متخصصین در این زمینه ها ) ، ولی در مقابل تجربه چندین ساله در برنامه نویسی دارند ، اگر شما دوست دارید 100% کار Technical انجام بدهید ، بهتره برنامه نویسی را یاد بگیرید ، ولی چون برنامه نویسی خود یک تخصص است و حتی از بخش های دیگر مثل رندر و داینامیک میتونه سخت تر باشه ، اگر شما صرفا کار VFX، رندر ، کامپوزیت و غیره انجام میدهید ، بهتره وقت خود را روی تخصص اصلی خود بگذارید و تنها برای علاقه کمی برنامه نویسی یاد بگیرید.
چه کسانی نیاز دارند تا اسکریپت نویسی یاد بگیرند
در مورد اسکریپت نویسی کمی اوضاع فرق میکنه و کسایی که حتی کارهای هنری مثل نورپردازی انجام میدهند بهتره اسکریپت نویسی را یاد بگیرند ، چون هم سرعت کارشون را بالا میبرد و هم تا حدی میتوانند ابزار های مخصوصی برای خود بسازند ، البته کسانی که در حوزه VFX و داینامیک فعالیت میکنند ، بیشتر از سایرین نیازمند یادگیری اسکریپت نویسی هستند.
انشالا در مقاله بعدی در ارتباط با چندتا از زبان های اسکریپت نویسی معروف صحبت میکنیم و همچنین با زبان Python آشنا میشوید ، زبان اسکریپت نویسی ای که در نرم افزار Maya توانسته بسیار سریعتر از زبان اسکریپت نویسی اصلی مایا یعنی MEL عمل کند و حتی فراتر از آن ، میتواند همانند زبان های برنامه نویسی ++C و #C با استفاده از API نرم افزار Maya ، پلاگین تولید کند.
با تشکر
سجاد ربیعی
14 دیدگاه
danial
دستتون درد نکنه
عالی بود
دانیا
واقعا نمیدونم چطوری تشکر کنم خیلی خیلی عالی بود.
حسین تاجیک
ممنون از شما آقای ربیعی . کار تون فوق العادست.
ایمان . ب
آقای ربیعی از وقتی که گذاشتین و مطلب مفید شما بینهایت ممنونم . این مطلب رو در گروههای تلگرام و- لاین و فیسبوک به اشتراک گذاشتم امیدوارم بازخورد خوبی براتون داشته باشه
ممنون
سجاد ربیعی
ممنونم ، انشالا که همینطوره .
nima
فوق العاده عالی بود.
فقط چند تا سوال داشتم در مورد python اگر فرصت کردید همینجا، اگر نشد توی مقاله ی بعدیتون پاسخشو بدین:
1_فرق بین maya.cmds و pymel و pyqt چیه؟(اخه تو بعضی از آموزش ها اینا رو در محیط اسکریپت نویسی مایا وارد میکنن ولی درست توضیح نمیدن فرقشون چی هست)
2_از کجا میشه به این پی برد که python سریع تر از MEL هست؟ چون اگر واقعا python از MEL سریعتره پس چرا هنوز که هنوزه خیلی از اسکریپت های بزرگ و کوچک رو همچنان با MEL مینویسن ؟ بالاخره باید MEL یک مزیتی نسبت با python داشته باشه که هنوز استفاده میشه؟
ممنون و فوق العاده سپاس گزارم.
سجاد ربیعی
سلام ، درمورد بخش اول سوالتون ، اجازه بدید در مقالات بعدی کامل پاسخ بدم ، فقط در حد کوتاه اینو بگم که در Python ما چندین کتابخانه داریم که هر یک برای کاری ساخت ساخته شده اند ، به این کتابخانه ها در Python میگیم ماژول یا Module.
همانطور که در مقالات قبلی گفتم در هر کتابخانه تعداد زیادی تابع وجود داره که برای کاری خاص کاربرد دارند ،مثلا اگر بخواهیم با زبان Python به توابع داخلی مایا که در زبان MEL موجود هستند (مثل دستور selectAll ) دسترسی داشته باشیم باید ابتدا کتابخانه مربوط به دستورات مایا را وارد زبان Python بکنیم تا بتونیم از دستورات داخلی آن استفاده بکنیم ، حالا این کتابخانه اسمش هست maya.cmds که در داخل آن تمامی توابعی که در زبان MEL داریم وجود دارند !
در مورد تست سرعت در رابط با Python و MEL شما اول باید یک دستور سنگین و پیچیده را بنویسید ، مثلا با کد کاری کنید که vertex های یک مدل خیلی سنگین به صورت random جا به جا بشوند ، اینطوری میتونید اختلاف سرع را ببینید ، ولی در کارهای سبک به چشم نمیاد ، اگر وقت کنم در مقاله بعدی یک مثال با کد میزنم .
در مورد بخش آخر سوالتون باید بگم که همانطور که در مقاله گفتم ، برای پلاگین ها معمولا از اسکریپت برای ساخت GUI یا ارتباط با Maya استفاده میکنند و بنابراین سرعت اصلا مهم نیست ، چون کار اصلی رو که خیلی سنگینه خود پلاگین انجام میده و اسکریپت کاری نمیکنه ، حالا چون سرعت برای ساخت GUI یا ارتباط با Maya مهم نیست ، بنابراین فرقی نمیکنه که از چه زبان اسکریپتی استفاده میکنند ، چون زبان MEL برای ارتباط با Maya کمی ساده تر و عمومی تر است ، بنابراین بیشتر از زبان MEL استفاده میکنند ، همچنین نکته مهم دیگر اینه که زبان Python از نسخه 2010 Maya به بعد اضافه شد ، بسیاری از پلاگین هایی که داریم از خیلی وقت پیش وجود داشتند ، مثل خود RenderMan که روی Maya 5 هم نصب میشد ، خوب اون موقع همه مجبور بودند از MEL استفاده بکنند ، بعد که Python به Maya اضافه شد ، شرکت ها نیازی نداشتند که وقت بزارند و زحمت دوباره بکشند تا کد ها MEL خود را به Python تبدیل کنند (و دلیلی هم نداشت) و به همین دلیل از همون کدهای MEL قدیمی استفاده میکنند.
amir
واقعن دمتون گرم خیلی فوقلعاده هست این مبحث واین نوع بیان.
تشکر
رضا رفیعی
ممنون آقای ربیعی از مطالب خوبتون. شاید چیزی که توی گفته های این مدت توی مطالبتون جا موند این بود ک اصولا الگوریتم چیه که این خودش یه اصل اساسی برای نوشتن هر کد در هر زبان برنامه نویسی هست. البته شاید در ادامه به این مبحث بپردازید. ک خود الگوریتمیک کار کردن یکی از تخصصهای دوستان متخصص در زمینه برنامه نویسیه.
سجاد ربیعی
بله ، ممکنه خیلی از چیزهایی که گفته باشم ، خودشون جای توضیح دادن زیاد داشته باشند و شاید برخی از آنها را باید در مقالاتی خاص کامل توضیح داد، اما همانطور که در شماره 1 این مقالات گفتم ، هدف از این مقالات آموزش برنامه نویسی و اسکریپت نویسی نیست ، هدف آشنایی دوستان با مفاهیم اولیه این زبان هاست که در فیلم های آموزشی زیاد توضیح نمیدهند ، بنابراین بیشتر راجب مفاهیم کلی صحبت میکنم و وارد بحث های جزی تر در این مقاله نمیشوم ، البته اگر موردی خاص باشد که دوستان خیلی علاقه داشته باشند که حتما در این مقاله بدونند ،اگر من مناسب بدونم سعی میکنم توضیحات اضافه در پیرامون این مطالب بدهم.
مرتضی گشتی
سلام بر برادرم سجاد عزیز
واقعا خیییلی خوشحالم که چنین مقاله ای رو به رشته تحریر درآوردی. خدا شاهده شاید اکثر اوقات که میام به سایت سر میزنم به طمع خوندن نسخه جدید مقاله باشه. فوق العاده ست!
منم دارم بخشی از یک کتاب آموزش مایا رو ترجمه می کنم که انشاالله آماده بشه حتما در اختیار سایت قرار میدم. لطف کنید راهنمایی کنید چطور می تونم مطالبم رو در سایت آپلود کنم؟
با تشکر
ایمان . ب
ممنون میشم
بیصبرانه منتظرم
بالای سایت در بخش ارتباط با ما گزینه ارسال آثار رو کلیک کنید
لینک
https://www.imanvfx.com/?page_id=279
سجاد ربیعی
سلام.
ممنونم مرتضی جان ، از اینکه از این مقالات راضی هستید بسیار خوشحالم.
من هم آرزومندم تا ترجمه کتاب شما به زودی تمام بشه و سایر دوستان بتوانند از آن بهره ببرند.
موفق و پیروز باشید
PARSA sxw
سلام
بسیار عالی و دقیق و گویا…