Ninja Learn | نینجا لرن
1.27K subscribers
95 photos
36 videos
11 files
306 links
یادگیری برنامه نویسی به سبک نینجا 🥷
اینجا چیزایی یاد میگیری که فقط نینجاهای وب‌ بلدن 🤫

📄 Send me post: https://t.iss.one/NoronChat_bot?start=sec-fdggghgebe

👥 ɢʀᴏᴜᴘ: https://t.iss.one/+td1EcO_YfSphNTlk
Download Telegram
Ninja Learn | نینجا لرن
Megara Template.zip
سلام رفقا 👋

برای توسعه این قالب بیشتر از 1 ماه زمان گذاشته شده و قرار بود توی سایت راستچین به فروش گذاشته بشه

ولی تصمیم گرفتم به صورت رایگان در اختیارتون بذارم ❤️


ممنون میشم با فالو کردن پیج و لایک کردن پست های اینستامون و فوروارد کردن از ما و زحماتمون حمایت کنید 🌹

آدرس پیج اینستامون:

https://www.instagram.com/ninjalearn_/
👍105
👍83🤣3🥰1
💎 پروتکل HTTPS 💎

امروز میخوایم در مورد یه موضوع خیلی مهم و کاربردی تو دنیای وب حرف بزنیم: HTTPS. حتما شما هم موقع وارد شدن به سایت‌های مختلف، اون علامت قفل سبز رنگ کوچولو رو کنار آدرس سایت دیدید. این قفل همون چیزیه که بهمون اطمینان میده که اطلاعاتمون تو اون سایت امنه.

حالا HTTPS چیه؟ 🤔

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

حالا HTTPS چطور اطلاعات رو امن می‌کنه؟

پرتکل HTTPS از یه سیستم رمزنگاری قوی به اسم SSL یا TLS استفاده می‌کنه. این سیستم به این شکل کار می‌کنه:

1⃣ تبادل کلید عمومی:
سرور دوتا کلید داره کلید خصوصی و کلید عمومی اول از همه، سرور کلید عمومی خودشو به مرورگر شما میده. هر پیامی که با کلید عمومی رمزگذاری بشه فقط باکلید خصوصی میتونه رمزگشایی بشه.
2⃣ ایجاد کلید متقارن:
مرورگر یک کلید متقارن تصادفی تولید میکنه. این کلید همون کلیدی هست که برای رمزگذاری و رمزگشایی اطلاعاتی که بین سرور و کلاینت ردو بدل میشه استفاده میشه.
3⃣ رمزگذاری اطلاعات:
مرورگر کلید متقارن تولید شده رو با استفاده از کلید عمومی سرور رمزگذاری میکنه و برای سرور ارسال میکنه.
4⃣ رمزگشایی اطلاعات:
سرور با استفاده از کلید خصوصی که داره، کلید متقارن رمزگذاری شده رو رمزگشایی میکنه و به کلید متقارن اصلی دسترسی پیدا میکنه.


از این مرحله به بعد، تمام داده‌هایی که بین مرورگر و سرور رد و بدل میشه، با استفاده از کلید متقارن رمزگذاری میشن.
و هم مرورگر و هم سرور با استفاده از کلید متقارن مشترک، داده‌های رمزگذاری شده رو رمزگشایی می‌کنند.
چرا HTTPS مهمه؟

1⃣ امنیت اطلاعات: مهم‌ترین دلیل استفاده از HTTPS، امنیت اطلاعاتیه. با استفاده از HTTPS، اطلاعات شما مثل رمز عبور، اطلاعات کارت بانکی و... به صورت امن منتقل میشه و هکرها نمی‌تونن به راحتی به اونها دسترسی پیدا کنن.

2⃣ جلوگیری از حملات Man-in-the-Middl HTTPS از شما در برابر حملات Man-in-the-Middle محافظت می‌کنه. در این نوع حملات، هکرها خودشون رو بین شما و سرور قرار میدن و اطلاعاتی که بین شما و سرور رد و بدل میشه رو می‌دزدن.

3⃣ اعتماد کاربران: وقتی کاربری ببینه که یه سایت از HTTPS استفاده می‌کنه، به اون سایت اعتماد بیشتری می‌کنه و خیالش راحت‌تره که اطلاعات شخصی‌ش امنه.

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

امید وارم مفید واقع شده باشه :)

ممنون میشم با ریکشن زدن و شیر کردن از ما حمایت کنید❤️


#رمزنگاری #https #امنیت_اطلاعات #webdevelopment #امنیت_اینترنتی

@ninja_learn_ir
7🔥4
دوستان پست بعدی چی باشه بنظرتون ؟🤔

@ninja_learn_ir
🤔42
Ninja Learn | نینجا لرن
دوستان پست بعدی چی باشه بنظرتون ؟🤔 @ninja_learn_ir
نظرتون چیه چندتا Tip درمورد مصاحبه های استخدامی بهتون بدم؟🤓

@ninja_learn_ir
👍163👎1
💎 چندتا راهنمایی درمورد مصاحبه های استخدامی 💎

هممون میدونیم مصاحبه کاری یکی از مهم‌ترین مراحل برای رسیدن به شغل مورد نظرمونه. اما نگران نباش، با این راهنمای کامل، تو هم می‌تونی مثل یک پروفسور از پسش بربیای!

چرا اینقدر مصاحبه مهمه؟

مصاحبه، تنها فرصتیه که کارفرما می‌تونه تو رو از نزدیک ببینه و با شخصیت و توانایی‌هایت آشنا بشه. پس باید از این فرصت نهایت استفاده رو ببری.

چند تا نکته طلایی که باید قبل از مصاحبه بهشون توجه کنی:

1⃣ تحقیق کن:
در مورد شرکت، شغل مورد نظر و صنعت مربوطه حسابی سرچ کن. این نشون میده که تو واقعا به این فرصت علاقه‌مندی.

2⃣ تمرین کن:
انگار قراره بری روی استیج! با خودت تمرین کن، سوال‌های احتمالی رو مرور کن و سعی کن بهشون جواب‌های قوی بدی.

3⃣ حفظ نکن:
سعی کن به جای اینکه مطالب رو حفظ کنی درک کنی و یاد بگیری

منابع خوب برای تمرین مصاحبه قبل مصاحبه

1⃣ سایت‌ها و اپلیکیشن‌های تمرین مصاحبه: مثل InterviewBit، Pramp و Glassdoor
یوتیوب: ویدیوهای آموزشی زیادی در مورد مصاحبه کاری وجود داره.

2⃣ دوست و آشنا:
از دوستات یا آشناهایی که قبلا مصاحبه رفتن، بخواه که باهات تمرین کنن.

چند تا نکته طلایی که باید توی مصاحبه بهشون توجه کنی:

1⃣ به موقع حاضر شو:
حتی چند دقیقه زودتر رسیدن نشون دهنده‌ی تعهد توئه.

2⃣ لباس مناسب بپوش:
لباس رسمی یا نیمه رسمی بپوش که با فرهنگ شرکت سازگار باشه.

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

4⃣ گوش کن و با دقت جواب بده:
به سوالات با دقت گوش کن و سعی کن جواب‌های واضح و مختصر بدی.

5⃣ از سوال پرسیدن نترس:
سوال پرسیدن نشون می‌ده که تو به این فرصت علاقه‌مندی و می‌خوای بیشتر در موردش بدونی.

چه سوال‌هایی ممکنه ازت بپرسن؟

1⃣ سوالات شخصیتی:
در مورد تجربیات گذشته‌ت و چگونگی برخوردت با چالش‌ها

2⃣ سوالات فنی:
در مورد مهارت‌های تخصصی که برای شغل مورد نظره لازمه

3⃣ سوالات انگیزشی:
چرا این شغل رو انتخاب کردی؟ چه اهدافی در آینده داری؟

🟩 بعد از مصاحبه

1⃣ پیگیری کن:
چند روز بعد از مصاحبه، یه ایمیل تشکر به مصاحبه کننده بفرست.

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

نظرتون در مورد این نکات چیه؟ اگه تجربه جالبی از مصاحبه کاری دارید، حتما برامون تعریف کنید.

#مصاحبه_کاری #اشتغال #موفقیت #کار #شغل
👍74
Forwarded from Sadra Codes
🚩 پایتون ۳.۱۳؛ فیچرهای جدید و دپریکیشن‌ها!


🔥 گیل (GIL) آپشنال: امکان بیلد گرفتن از CPython و غیرفعال کردن GIL. (در حالت عادی شما از GIL استفاده می‌کنید)

🔥 کامپایلر JIT: قراره در این پچ جدید، از یک کامپایلر just in time رونمایی شه که در یک سری از سناریوهای خاص، سرعت اجرای کدتون رو افزایش میده. این رو موقع بیلد گرفتن دستی از CPython میشه تنظیم‌ کرد و بصورت پیشفرض غيرفعال هست.

🔥 تایپ هینت IsType و ReadOnly: دوتا تایپ جدید به typing اضافه شده. در مقاله مثال زدم.

🔥 ساپورت از سیستم‌عامل iOS: یک رلیز قابل نصب روی iOS قراره در این پچ قرار داده بشه. هنوز خبری از رلیز اندروید نیست ولی گویا دارن روش کار می‌کنن. (چیزی که بعنوان پایتون روی دیوایس‌های اندرویدتون نصب دارید، رلیز لینوکس پایتون هست.)

🔥 بهبود Interaction: ارورها و تریس‌بک‌ها دقیق‌تر و هوشمندتر شدن. همچنین ارورها بصورت رنگی نمایش داده میشن.

🔥 بهبود REPL: کامندهای exit، help و quit تغییر کردن.

و کلی فیچر و امکانات جدید که توی ۵ دقیقه در مقاله زیر توضیح دادم به همراه مثال‌های ساده و قابل فهم:

🔗 https://blog.imsadra.me/python-313-new-features-deprecations


For more 👉 @lnxpylnxpy
🔥52👍1
Forwarded from 𝗖𝗢𝗢𝗟𝗬 𝗖𝗢𝗗𝗘 | کولی کد (Mohammad hossein)
#javascript #trick #js_trick

سه تا از کابردی ترین متد ها برای کار با آبجکت ها ●

متد Object.keys : این متد تمام keyهای یک آبجکت رو گرفته و آن‌ها را در یک آرایه قرار می‌دهد.

➋ متد Object.values : این متد تمام valueهای یک آبجکت را گرفته و آن‌ها را در یک آرایه قرار می‌دهد.

➌ متد Object.entries : این متد keyها و valueها را به صورت key, value ترکیب می‌کند و آرایه‌هایی از این جفت‌ها ایجاد می‌کند.

مثال عملی 🚀

const obj { key1: 'value1', key2: 'value2', key3: 'value3'

};

const keysArray = Object.keys(obj);

const valuesArray = Object.values(obj);

const entriesArray = Object.entries(obj);

console.log(keysArray);
// Output: ['key', 'key2', 'key3']

console.log(valuesArray);
// Output: ['value', 'value2', 'value']

console.log(entriesArray);
// Output: [['key', 'value'], ['key2', 'value'], ['key3', 'value3']]


با حمایتاتون بهمون انرژی بدید ❤️
〰️〰️〰️〰️〰️〰️〰️〰️〰️〰️
Channel | Group | YouTube
👍54

💎 کشینگ در جنگو 💎

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

چرا کشینگ در جنگو مهمه؟
جنگو با ابزارهای قدرتمندی که در اختیارمون میذاره، به ما این امکان رو میده که بهینه سازی سطح بالایی رو در اپلیکیشن‌هامون پیاده کنیم. کشینگ یکی از این ابزارهاست که به طور مستقیم روی سرعت و عملکرد سایت تاثیر می‌گذاره.

🧾 انواع کشینگ در جنگو و کاربردهاشون:

1⃣ کش صفحه (Page Cache):
کل خروجی یک ویو رو ذخیره می‌کنه. برای صفحاتی که محتوای داینامیکی کمی دارن و تغییرشون کند هست، ایده‌آله.

2⃣ فرگمنت کش (Fragment Cache):
قسمت‌های مختلف یک صفحه رو به صورت جداگونه کش می‌کنه. این کار باعث میشه بتونیم بخش‌های پویا و ایستا رو به صورت جداگونه مدیریت کنیم.
3⃣ کش دیتابیس:
کوئری‌های پیچیده و پرکاربرد رو کش می‌کنه تا بار سرور دیتابیس کاهش پیدا کنه.


4⃣ کش سرور:
داده‌هایی که از APIهای خارجی یا سیستم‌های دیگه ای گرفته می‌شن رو کش می‌کنه تا از بارگذاری مجدد جلوگیری کنه.
ابزارهای کشینگ در جنگو:

1⃣ cache_page decorator:
ساده‌ترین روش برای کش کردن کل صفحه است.


2⃣ cache.get() and cache.set():
برای دسترسی مستقیم به کش استفاده میشه.


3⃣ @cache_decorator:
برای تعریف دکورتورهای سفارشی کشینگ استفاده میشه.


4⃣ cache_framework:
فریمورک داخلی جنگو برای مدیریت کشینگ است.


نکات مهم در پیاده‌سازی کشینگ:

1⃣ زمان انقضا کش:
تعیین زمان مناسب برای انقضای کش خیلی مهمه. اگه خیلی کوتاه باشه، بار سرور زیاد میشه و اگه خیلی طولانی باشه، داده‌های قدیمی به کاربر نمایش داده میشه.

2⃣ کلید کش:
انتخاب یک کلید مناسب برای هر آیتم کش، به شما کمک می‌کنه تا به راحتی به اون آیتم دسترسی پیدا کنید.

3⃣ و Invalidation:
وقتی داده‌ای تغییر کرد، باید کش مربوط به اون داده رو باطل کرد تا داده جدید به کاربر نمایش داده بشه.

4⃣ و Backend های کش:
جنگو از بک‌اندهای کش مختلفی مثل Memcached، Redis و دیتابیس پشتیبانی می‌کنه. انتخاب بک‌اند مناسب به نیازهای اپلیکیشن بستگی داره.

حالا بریم سراغ نصب ابزار ها و کارکردن باهاشون 😁

1⃣ نصب Redis:
اول از همه باید Redis رو روی سیستم‌مون نصب کنیم. دستور نصبش بسته به اینکه ویندوز یا لینوکس یا مک دارید فرق می‌کنه. میتونید توی گوگل سرچ کنید و دستوراتش رو پیدا کنید.

2⃣ نصب پکیج django-redis در جنگو:
حالا باید یه پکیج به اسم django-redis رو نصب کنیم. این پکیج مثل یه پل بین جنگو و Redis عمل می‌کنه. برای نصبش کافیه تو ترمینال بنویسید:

pip install django-redis

تنظیمات نهایی:
حالا بریم سراغ فایل settings.py پروژه مون. اینجا باید به جنگو بگیم که از Redis استفاده کنه. یه بخش به اسم CACHES داریم که باید توش این اطلاعات رو وارد کنیم:

CACHES = {
'default': {
'BACKEND': 'django_redis.cache.RedisCache',
'LOCATION': 'redis://127.0.0.1:6379/1',
'OPTIONS': {
'CLIENT_CLASS': 'django_redis.client.DefaultClient',
}
}
}

اینجا LOCATION آدرس Redis رو مشخص می‌کنه. مثلاً 127.0.0.1 یعنی لوکال‌هاست خودمون.


حالا بریم مثال عملی بزنیم 😄

مثال پیشرفته:
from django.views.decorators.cache import cache_page
from django.core.cache import cache

@cache_page(60 * 15) # کش کردن به مدت 15 دقیقه
def my_view(request, product_id):
product = Product.objects.get(id=product_id)
related_products = cache.get(f'related_products_{product_id}')
if not related_products:
related_products = product.get_related_products()
cache.set(f'related_products_{product_id}', related_products, 60 * 15)
return render(request, 'product_detail.html', {'product': product, 'related_products': related_products})


در این مثال، ما محصولات مرتبط با یک محصول خاص رو کش می‌کنیم.
از cache.get() برای بررسی وجود محصول در کش استفاده می‌کنیم و اگه وجود نداشت، اون را محاسبه میکنیم و در کش ذخیره می‌کنیم.


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

برای مطالعه بیشتر میتونید به داکیومنت رسمی جنگو مراجعه کنید


ممنون میشم اگه خوشت اومد ریکشن بزنی و مارو فالو کنی :)

#جنگو #کشینگ #توسعه_وب #بهینه_سازی


@ninja_learn_ir
🔥12👍2🐳21
بنظرتون پست فردا چی باشه؟ 🧐 (توکامنتا بگید)
درمورد کاربرد prototype ها توی شعی گرایی توی js صحبت کنم؟
👍7👎62
💎 پروتوتایپ در JavaScript 💎

امروز میخوایم درمورد پورتوتایپ در js صحبت کنیم 😁
قبل از اینکه به اصل مطلب بپردازیم، بیایید چند مفهوم اولیه رو مرور کنیم تا درک بهتری از پروتوتایپ داشته باشیم:

🗳 شیء (Object):
در جاوا اسکریپت همه چیز یک شیء است. شیء مجموعه‌ای از ویژگی‌ها (properties) و رفتارها (methods) است.


🔨تابع سازنده (Constructor):
یک تابع خاص است که برای ایجاد اشیاء جدید استفاده میشه.


🗂پروتوتایپ (Prototype):
یک شیء است که به عنوان الگو برای ایجاد اشیاء دیگه عمل میکنه. هر شیء در جاوا اسکریپت یک پروتوتایپ داره که میتونه به اون ارث برسد.
پروتوتایپ چیه و چه کاربردی داره؟
پروتوتایپ در واقع یک شیء هست که پراپرتی و اکشن مشترک بین چندین شیء رو تعریف میکنه. وقتی یک شیء جدید ایجاد می‌کنیم، این شیء به طور خودکار به پروتوتایپ دیگه ای متصل میشه و میتونه از پراپرتی ها و اکشن های اون استفاده کنه.

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

1⃣ کاهش کد تکراری:
با تعریف پراپرتی ها و اکشنا در پروتوتایپ، نیازی نیست اون هارو در هر شیء به صورت جداگونه تعریف کنیم.


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


3⃣ درک بهتر مفهوم وراثت:
پروتوتایپ‌ها مفهوم وراثت را در جاوا اسکریپت پیاده‌سازی می‌کنند.



⚫️ مثال 1: ایجاد یک شیء Person
function Person(name, age) {
  this.name = name;
  this.age = age;
}

Person.prototype.sayHello = function() {
  console.log(`Hello, my name is ${this.name}`);  

};

const person1 = new Person('علی',  
30);
person1.sayHello(); // خروجی: Hello, my name is علی

توی این مثال، ما یک تابع سازنده به نام Person تعریف کردیم که برای ایجاد اشیاء از تایپ شخص استفاده میشه. بعد، یک متد به نام sayHello به پروتوتایپ این تابع اضافه کردیم. هر شیئی که با استفاده از این تابع سازنده ایجاد شه، میتونه از متد sayHello استفاده کند.

⚫️ مثال 2: ایجاد یک شیء Student که از Person ارث بری می‌کند
function Student(name, age, grade) {
  Person.call(this, name, age); // فراخوانی سازنده والد
  this.grade = grade;
}

Student.prototype = Object.create(Person.prototype);
Student.prototype.constructor = Student;

const student1 = new Student('حسن', 20, 'A');
student1.sayHello(); // خروجی: Hello, my name is حسن
console.log(student1.grade); // خروجی: A

توی این مثال، ما یک تابع سازنده جدید به نام Student تعریف کردیم که از Person ارث بری میکنه. با استفاده از Object.create، پروتوتایپ Student رو به پروتوتایپ Person متصل کردیم.
به این ترتیب، اشیاء از نوع Student میتونند از همه ویژگی‌ها و رفتارهای Person استفاده کنند.

🔗 زنجیره پروتوتایپ
هر شیء در جاوا اسکریپت یک زنجیره پروتوتایپ داره. وقتی به یک پراپرتی یا متد در یک شیء دسترسی پیدا می‌کنیم، جاوااسکریپت اول اون رو توی خود شیء جستجو میکنه. اگه پیدا نشد، به پروتوتایپ اون شیء مراجعه میکنه و این روند تا زمانی ادامه پیدا میکنه که پراپرتی یا متد پیدا شه یا به اخر زنجیره برسیم.

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

ممنون میشم اگه خوشت اومد ریکشن بزنی و فالو کنی :)

#جاوا_اسکریپت #پروتوتایپ #شیء_گرایی #برنامه_نویسی


@ninja_learn_ir
👍6🔥52
دوستان تو اینستا کوسشن باکس گذاشتیم هر سوالی که دارید میتونید بپرسید 😁

لینک استوری 👇
https://www.instagram.com/stories/ninjalearn_/3437329649504437805?utm_source=ig_story_item_share&igsh=Z25ibG1wM2p6dXc2


@ninja_learn_ir
🔥21👍1😍1
سلام رفقا 👋

یه ترفند خیلی خفن پایتونی توی آخرین پست اینستامون بهتون یاد دادیم که هیچ جا پیدا نمیکنید

https://www.instagram.com/reel/C-0LIyGScSL/?igsh=Ynl4Y25ub2dldGZv
👍31😁1
Ninja Learn | نینجا لرن pinned «سلام رفقا 👋 یه ترفند خیلی خفن پایتونی توی آخرین پست اینستامون بهتون یاد دادیم که هیچ جا پیدا نمیکنید https://www.instagram.com/reel/C-0LIyGScSL/?igsh=Ynl4Y25ub2dldGZv»
دوستان ممنون میشم با لایک و فالو کردن از ما حمایت کنید :) ❤️

@ninja_learn_ir
41
Forwarded from Python BackendHub (Mani)
بحث خوبی شد تو گروه, یکی پرسید که JIT چیه و چی کار میکنه دقیقا. ‌سعی میکنم خیلی ساده توضیح بدم که قابل درک باشه برای همه.

وقتی یه اسکریپت پایتونی رو ران می‌کنی، یه سری فایل با پسوند .pyc تو پوشه‌ی pycache ساخته میشه. اینا بایت کد هستن. بایت کد چیه؟ یه low level representation از کدی که نوشتی. بایت کد platform independent هست یعنی مهم نیست رو چی داری رانش میکنی. اما این بایت کد برای CPU قابل فهم نیست. CPU فقط ماشین کد رو می‌فهمه، یعنی همون باینری صفر و یک. پس وقتی بایت کد تولید میشه، PVM (Python Virtual Machine) میاد و بایت کد رو به ماشین کد تفسیر می‌کنه تا CPU بتونه اجراش کنه.

حالا JIT چیه؟ تبدیل بایت کد به ماشین کد زمان و منابع مصرف می‌کنه. JIT توی ران‌تایم این تبدیل رو انجام میده و ماشین کد رو توی حافظه نگه می‌داره تا دفعات بعدی که همون کد اجرا میشه، دوباره نیاز به تبدیل نباشه. اینکار رو فقط برای بخش‌هایی از کد که زیاد اجرا میشن (بهشون میگن hot loop) انجام میده. چرا؟ چون خوده ذخیره کردن این دیتا پرهزینست و مموری اشغال میکنه پس کل کد رو نمیاد اینکارو کنه. یعنی JIT Engine نگاه می‌کنه ببینه این بخش از کد اونقدری داره اجرا میشه که ارزش داشته باشه ماشین کدش رو نگه داره یا نه.

چرا کد پایتون مستقیم کد ماشین نمیشه؟ دلیلش اینه که PVM و Python runtime environment داره تو پایتون کارای دیگه‌ای هم میکنه تو ران تایم مثل مدیریت حافظه، لود کردن ماژول‌ها و پکیج‌ها و... این باعث میشه که پایتون انعطاف‌پذیر و راحت باشه، ولی خب به قیمت افت عملکرد در مقایسه با زبان های کامپایلری مثل C.


@PyBackendHub
👍6😍31
Forwarded from Python BackendHub (Mani)
۳ خط اخر رو یکم باز میکنم حس میکنم کافی توضیح ندادم (این پست دیگه خیلی ربطی به JIT نداره). راجب اینکه چرا پایتون نمیتونه به راحتی از قبل تبدیل به ماشین کد شه.

یک مثال خیلی ساده بزنم شما تو پایتون میتونید یک سورس پایتونی از اینترنت دانلود کنید, و بعد از تابع eval() استفاده کنید که درجا رانش کنه! چطور این کد میتونه تبدیل به کد ماشینی بشه با یک کامپایل مستقیما؟ موقع کامپایل هنوز مشخص نیست چی قراره دانلود شه و ران شه! این اولین خاصیت پایتونه تو انعطاف پذیریش.

دومین خاصیش داینامیک تایپ بودنشه. شما یک فانکشن دارین foo(a,b,c). اگه شما تایپ ورودی این فانکشن رو نمیدونید, نمیتونید کامپایلش کنید. ولی اگه بدونید ممکنه چه تایپ هایی باشن, میتونید برای هر combination یک نسخه متفاوت کمپایل کنید. برای همینه که زبونای statically typed راحت کمپایل میشن به کد ماشین.

این دو خصوصیت باعث میشه پایتون نتونه به راحتی مستقیم تبدیل به ماشین کد بشه. پروژه هایی هستش که اینکارو میکنن ولی با static analysis و تکنیک های دیگه با لیمیتشن های خیلی زیاد. کلا زبون های داینامیک تایپ خیلی سخت از قبل میتونن تبدیل به ماشین کد بشن‌(اگه نگم غیر ممکن) ولی زبونای استتیک تایپ خیلی راحت تر اینکارو انجام میدن.

@PyBackendHub
👍4😍31