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
| TypeScript | Python | |
|---|---|---|
| الأنواع | ثابتة تُفحص وقت الترجمة؛ وتُمحى وقت التشغيل | ديناميكية؛ تلميحات أنواع اختيارية لا تُفرض وقت التشغيل |
| فاحص الأنواع | tsc، جزء من اللغة | أدوات منفصلة: mypy وpyright وغيرهما |
| تعمل على | محركات JavaScript: المتصفحات وNode.js وDeno وBun | CPython (المفسر المعياري) وPyPy وغيرهما |
| التنفيذ | تُترجم إلى JavaScript، ثم يترجمها المحرك بـ JIT | bytecode مفسَّر في CPython |
| الكتل | الأقواس المعقوصة { } | المسافات البادئة |
| الأرقام | number (عدد عشري 64 بت) وbigint | int (بأي حجم) وfloat |
| التزامن | خيط واحد لكل حلقة أحداث، وasync/await؛ وworkers للعمل المتوازي | asyncio والخيوط والعمليات المتعددة |
| مدير الحزم | npm وpnpm وYarn وBun | pip وuv وPoetry |
| أقوى مجالاتها | واجهات الويب، وخوادم Node.js، وتطبيقات full-stack | علم البيانات، وتعلم الآلة، والسكربتات، والأتمتة، والخوادم |
الصياغة جنبًا إلى جنب
إذا كنت تعرف تلميحات الأنواع في Python، فلمعظم تعليقات الأنواع في TypeScript مقابل مباشر:
| Python | TypeScript |
|---|---|
count: int = 0 | let 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 | None | string | null أو string | undefined |
Literal["asc", "desc"] | "asc" | "desc" |
Callable[[int], str] | (n: number) => string |
TypedDict | interface أو type |
@dataclass | class، أو interface للبيانات البسيطة |
Any | any |
None وTrue وFalse | null (أو 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. الأفكار الأساسية (المتغيرات والدوال والحلقات والكائنات) تنتقل معك في الحالتين.