Menu
flag Ar iconالعربيةdown icon

TypeScript مقابل Python: الأنواع والسرعة ومجالات الاستخدام

TypeScript وPython لغتان عاليتا المستوى وتعتمدان على جمع المهملات، لكن TypeScript تفحص أنواعها قبل تشغيل الكود، بينما تلميحات الأنواع في Python اختيارية ومتجاهلة وقت التشغيل. مقارنة جنبًا إلى جنب للأنواع وبيئة التشغيل والسرعة والنظم البيئية ومجالات الاستخدام، مع البرنامج نفسه باللغتين.

تحتوي هذه الصفحة على محررات قابلة للتشغيل - حرّر، شغّل، وشاهد النتيجة فوراً.

TypeScript وPython لغتان عاليتا المستوى مع جمع المهملات، ودوال من الدرجة الأولى، ونظم حزم كبيرة. الفرق الأساسي هو الأنواع: يفحص المترجم أنواع TypeScript قبل تشغيل البرنامج، أما تلميحات الأنواع في Python فتعليقات اختيارية يتجاهلها المفسر. وتعملان أيضًا على محركات مختلفة وتهيمنان على أنواع مختلفة من البرمجيات: TypeScript على الويب، وPython على العمل مع البيانات والسكربتات.

إليك برنامجًا صغيرًا بـ TypeScript. اضغط Run:

الناتج:

162.25
[ 'Ada', 'Grace', 'Linus' ]

البرنامج نفسه بـ Python مع تلميحات الأنواع:

from dataclasses import dataclass


@dataclass
class Order:
    customer: str
    amount: float
    paid: bool


def total_paid(orders: list[Order]) -> float:
    return sum(o.amount for o in orders if o.paid)


orders = [
    Order("Ada", 120.0, True),
    Order("Grace", 80.5, False),
    Order("Linus", 42.25, True),
]

by_amount = [o.customer for o in sorted(orders, key=lambda o: o.amount, reverse=True)]
print(total_paid(orders))
print(by_amount)
162.25
['Ada', 'Grace', 'Linus']

الشكل متقارب: نوع للسجل، ودالة بمعاملات ذات أنواع، وقائمة من القيم. الفروق الظاهرة هي الصياغة (الأقواس المعقوصة والفواصل المنقوطة مقابل المسافات البادئة)، وinterface مقابل @dataclass، والدوال السهمية مع filter/reduce مقابل generator expression.

مقارنة سريعة بين TypeScript و Python

TypeScriptPython
الأنواعثابتة تُفحص وقت الترجمة؛ وتُمحى وقت التشغيلديناميكية؛ تلميحات أنواع اختيارية لا تُفرض وقت التشغيل
فاحص الأنواعtsc، جزء من اللغةأدوات منفصلة: mypy وpyright وغيرهما
تعمل علىمحركات JavaScript: المتصفحات وNode.js وDeno وBunCPython (المفسر المعياري) وPyPy وغيرهما
التنفيذتُترجم إلى JavaScript، ثم يترجمها المحرك بـ JITbytecode مفسَّر في CPython
الكتلالأقواس المعقوصة { }المسافات البادئة
الأرقامnumber (عدد عشري 64 بت) وbigintint (بأي حجم) وfloat
التزامنخيط واحد لكل حلقة أحداث، وasync/await؛ وworkers للعمل المتوازيasyncio والخيوط والعمليات المتعددة
مدير الحزمnpm وpnpm وYarn وBunpip وuv وPoetry
أقوى مجالاتهاواجهات الويب، وخوادم Node.js، وتطبيقات full-stackعلم البيانات، وتعلم الآلة، والسكربتات، والأتمتة، والخوادم

الصياغة جنبًا إلى جنب

إذا كنت تعرف تلميحات الأنواع في Python، فلمعظم تعليقات الأنواع في TypeScript مقابل مباشر:

PythonTypeScript
count: int = 0let count: number = 0;
def add(a: int, b: int) -> int:function add(a: number, b: number): number {
lambda x: x * 2(x) => x * 2
list[str]string[]
dict[str, int]Record<string, number> أو Map<string, number>
tuple[int, str][number, string]
str | Nonestring | null أو string | undefined
Literal["asc", "desc"]"asc" | "desc"
Callable[[int], str](n: number) => string
TypedDictinterface أو type
@dataclassclass، أو interface للبيانات البسيطة
Anyany
None وTrue وFalsenull (أو undefined) وtrue وfalse
and وor وnot&& و|| و!
f"Hello {name}"`Hello ${name}`

الأنواع الثابتة مقابل تلميحات الأنواع

تتيح لك اللغتان كتابة التعليق نفسه، a: number أو a: int. ما يحدث بعد ذلك مختلف.

في TypeScript يفحص المترجم كل استدعاء قبل تشغيل أي شيء. الوسيط الخاطئ يوقف البناء:

index.ts(7,17): error TS2345: Argument of type 'string' is not assignable to parameter of type 'number'.

في Python التلميحات بيانات وصفية. يشغّل المفسر الاستدعاء ويعيد نصًا:

def add(a: int, b: int) -> int:
    return a + b


print(add(2, 3))      # 5
print(add("2", "3"))  # 23, the hints are not enforced

الفحص خطوة منفصلة بأداة مثل mypy:

$ mypy hints.py
hints.py:6: error: Argument 1 to "add" has incompatible type "str"; expected "int"  [arg-type]
hints.py:6: error: Argument 2 to "add" has incompatible type "str"; expected "int"  [arg-type]
Found 2 errors in 1 file (checked 1 source file)

لذلك فالأنواع في Python تدريجية بطبيعة تصميمها: الكود غير المزود بتلميحات لا يُفحص ببساطة، وتضيف التلميحات حيث تفيد. يمكن أن تكون TypeScript متساهلة أيضًا (any يوقف الفحص لقيمة ما)، لكن مع تفعيل strict، وهو الافتراضي، يصبح المعامل غير المزود بنوع خطأ لا تصريح مرور.

شيء واحد تشترك فيه اللغتان: لا تفحص أي منهما الأنواع أثناء تشغيل البرنامج. تمحو TypeScript أنواعها، وتتجاهل Python تلميحاتها. البيانات التي تصل وقت التشغيل، مثل JSON من API، تحتاج إلى تحقق في اللغتين (مكتبات مثل Zod في TypeScript وPydantic في Python تفعل ذلك انطلاقًا من مخطط).

الأرقام تتصرف بشكل مختلف

لدى TypeScript أرقام JavaScript: number قيمة عشرية 64 بت للأعداد الصحيحة والكسرية معًا، وbigint نوع منفصل للأعداد الصحيحة الكبيرة. أما int في Python فيكبر إلى أي حجم بنفسه.

الناتج:

0.30000000000000004
9007199254740992
3.5 3
1267650600228229401496703205376n

تطبع Python القيمة 9007199254740993 لـ 2**53 + 1، لأن أعدادها الصحيحة دقيقة بأي حجم، ولديها عامل مخصص للقسمة الصحيحة، 7 // 2، يعطي 3. لا يوجد نوع int في TypeScript؛ العدد الصحيح هو number يصادف أنه بلا كسر.

بيئة التشغيل والأداء

تعمل TypeScript كـ JavaScript. تترجم V8 (في Chrome وNode.js) وJavaScriptCore (في Safari وBun) وSpiderMonkey (في Firefox) الكود كثير التنفيذ إلى كود آلة أثناء تشغيله، لذلك تكون الحلقات الكثيفة في TypeScript عادة أسرع بكثير من الحلقات نفسها في CPython، الذي ينفذ bytecode.

هذه الفجوة أقل أهمية مما تبدو في كثير من البرامج:

  • مكتبات Python العددية ومكتبات تعلم الآلة (NumPy وpandas وPyTorch) تنفذ عملها الثقيل في كود مترجم بـ C أو C++ أو CUDA، فبرنامج Python الذي يستدعيها لا يشغّل حلقاته الداخلية بـ Python.
  • خوادم الويب في أي من اللغتين تقضي جزءًا كبيرًا من وقتها في انتظار قواعد البيانات والشبكات.

تستخدم اللغتان خيطًا رئيسيًا واحدًا لمعظم الكود. تتعامل TypeScript على Node.js مع التزامن عبر حلقة أحداث وasync/await، وتستخدم worker threads للعمل المتوازي على المعالج. ولدى Python asyncio للأسلوب نفسه من التزامن، إضافة إلى الخيوط والعمليات.

النظم البيئية ومجالات الاستخدام

TypeScript هي الخيار الافتراضي في:

  • واجهات الويب: تدعمها React وAngular وVue وSvelte كلها، وتُترجم إلى JavaScript التي تشغّلها المتصفحات.
  • كود الخوادم على Node.js وDeno وBun: واجهات API باستخدام Express أو Fastify أو NestJS أو Hono.
  • تطبيقات full-stack يتشارك فيها الخادم والمتصفح تعريفات الأنواع، مثل مشاريع Next.js.
  • الأدوات، وأدوات سطر الأوامر، وتطبيقات سطح المكتب باستخدام Electron.

Python هي الخيار الافتراضي في:

  • تحليل البيانات وتصويرها (pandas وNumPy وMatplotlib ودفاتر Jupyter).
  • تعلم الآلة والذكاء الاصطناعي (PyTorch وscikit-learn ومعظم كود تدريب النماذج).
  • السكربتات والأتمتة: معالجة الملفات، وإدارة الأنظمة، وكود الربط.
  • خوادم الويب باستخدام Django أو Flask أو FastAPI.
  • الحوسبة العلمية والتعليم.

تطوير الواجهة الخلفية للويب هو أكثر مجال تتداخل فيه اللغتان. وغالبًا ما تختار الفرق بحسب ما يستخدمه بقية النظام: TypeScript لمشاركة الكود مع واجهة أمامية مكتوبة بـ TypeScript، وPython للبقاء بجانب كود البيانات وتعلم الآلة.

أيهما تتعلم؟

  • تبني للويب؟ تعلّم JavaScript ثم TypeScript. كل ما يعمل في المتصفح هو JavaScript في النهاية، وTypeScript هي الطريقة التي يُكتب بها معظم كود الواجهات الأمامية الاحترافي.
  • تعمل مع البيانات أو الذكاء الاصطناعي أو الأتمتة؟ تعلّم Python. مكتباتها في هذه المجالات ليس لها مقابل حقيقي في عالم JavaScript.
  • لغة أولى دون هدف محدد؟ في Python صياغة أقل تتعلمها قبل أن تكتب برامج مفيدة. أما TypeScript فتضيف نظام أنواع فوق JavaScript، وهذا شيء إضافي تتعلمه في البداية ويؤتي ثماره مع نمو البرامج.

يستخدم كثير من المطورين اللغتين: Python للبيانات والسكربتات، وTypeScript لكود الويب في المنتج. إذا كنت تعرف تلميحات الأنواع في Python، فستبدو لك تعليقات الأنواع في TypeScript مألوفة؛ الجديد أن المترجم يفرضها افتراضيًا وأن بيئة التشغيل تحتها هي JavaScript.

الأسئلة الشائعة

هل TypeScript أفضل من Python؟

لا توجد لغة أفضل بشكل عام؛ كل منهما تتصدر مجالات مختلفة. TypeScript هي الخيار المعياري لواجهات الويب وشائعة في خوادم Node.js، وفحص الأنواع فيها جزء من سير العمل العادي. وتتصدر Python علم البيانات وتعلم الآلة والسكربتات والأتمتة، ولديها تلميحات أنواع يمكنك فحصها بأدوات مثل mypy أو pyright.

هل TypeScript أسرع من Python؟

في الكود المعتمد على المعالج والمكتوب باللغة نفسها، نعم عادة: تُترجم TypeScript إلى JavaScript، وتترجمها محركات مثل V8 إلى كود آلة وقت التشغيل، بينما يشغّل مفسر Python المعياري CPython كود bytecode. أما برامج Python التي تقضي وقتها في مكتبات مكتوبة بـ C (NumPy وpandas وPyTorch) فلا يقيدها ذلك، وفي الخوادم المعتمدة على الشبكة يكون الفرق صغيرًا غالبًا.

هل في Python أنواع ثابتة مثل TypeScript؟

لدى Python تلميحات أنواع اختيارية (def add(a: int, b: int) -> int)، لكن المفسر لا يفرضها: add("2", "3") يعمل ويعيد "23". يبلّغ فاحص منفصل مثل mypy أو pyright عن عدم التطابق. أما في TypeScript ففحص الأنواع هو المهمة الأساسية للمترجم، وتُعد المشاريع عادة بحيث لا يُبنى كود فيه أخطاء أنواع.

هل أتعلم TypeScript أم Python أولًا؟

اختر بحسب ما تريد بناءه. لمواقع وتطبيقات الويب، تعلّم JavaScript ثم TypeScript، لأن المتصفحات لا تشغّل إلا JavaScript. ولتحليل البيانات أو تعلم الآلة أو الأتمتة أو كلغة أولى بصياغة قليلة جدًا، ابدأ بـ Python. الأفكار الأساسية (المتغيرات والدوال والحلقات والكائنات) تنتقل معك في الحالتين.

Coddy programming languages illustration

تعلّم البرمجة مع Coddy

ابدأ الآن