تایپ اسکریپت یک زبان transpile شده است و در طول این فرآیند مرحلهای به نام type erasure وجود دارد. در این مقاله قصد داریم تا با مفهوم transpiling و type erasure در تایپ اسکریپت آشنا شویم.
قبل از این که بررسی مفهوم type erasure بپردازیم بهتر است کمی درمورد زبانهای سطح بالا و پایین صحبت کنیم.
زبانهای سطح بالا نسبت به زبانهای سطح پایین انتزاعیتر هستند. منظور ما از انتزاعی بودن این است که درک آنها برای انسان آسانتر است. به عنوان مثال وقتی میگوییم کد ماشین، که باینری است نسبت به جاوااسکریپت سطح پایینتری دارد یعنی به زبان کامپیوتر نزدیکتر است. زبانهای سطح بالا معمولاً سادهتر از نوشتن و درک زبانهای سطح پایین، مثلاً زبان اسمبلی هستند.
کامپایل و transpilation بسیار شبیه به هم هستند اما باهم یکسان نیستند. در ادامه هر یک از این مفاهیم را بررسی میکنیم.
کامپایل کردن یک اصطلاح جامع برای تبدیل کدهایی است که در فایلهای اجرایی سطح پایینتر برای کامپیوتر نوشتهایم.
زبانهای برنامه نویسی جاوا، سیشارپ یا سی نمونهای از زبانهای کامپایل شده هستند. این زبانها گاهی اوقات در چند مرحله کامپایل میشود و در هر مرحله کد را بهینه کرده و آن را به زبان ماشین نزدیکتر میکنند.
در نتیجه این فرآیند، یک زبان سطح بالا و نزدیک به زبان انسان به به یک زبان سطح پایین و نزدیک به زبان ماشین یا دودویی تبدیل میشود.
Transpilerها گاهی اوقات به عنوان «کامپایلر سورس به سورس» شناخته میشوند. یعنی اینکه سورس کد یک برنامه نوشته شده در یک زبان برنامه نویسی را به عنوان ورودی خود میگیرد و سورس کد معادل را در یک زبان برنامه نویسی دیگر تولید میکند. بنابراین، روشی کوتاه برای گفتن «سورس کد به سورس کد» به شمار میآید. Transpiling به معنای تبدیل یک زبان سطح بالا به یک زبان سطح بالاتر دیگر است.
به عنوان مثال، تایپ اسکریپت یک زبان سطح بالا است اما پس از transpiling، به جاوااسکریپت که یک زبان سطح بالای دیگر است تبدیل میشود. یا به عنوان مثال Babel میتواند کد جاوااسکریپت ES6 را به جاوااسکریپت ES5 تبدیل کند.
مزیت transpiling این است که ما میتوانیم کد به یک زبان سطح بالا بنویسیم و همچنان به یک زبان سطح بالای دیگری برسیم.
type erasure بخشی از این فرآیند transpiling است.
زمانی type erasure بسیار ساده میشود که همه تایپهای موجود در کد تایپ اسکریپت در حین انتقال به جاوااسکریپت حذف شوند. تایپهایی که در تایپ اسکریپت استفاده میکنیم در زمان اجرا، یعنی زمانی که جاوااسکریپت اجرا میشود، قابل بررسی نیستند. بنابراین دسترسی به آنها فقط در مرحله کامپایل و یا transpilation امکانپذیر است.
کد تایپ اسکریپتی داریم که به شکل زیر میباشد:
let name: string = 'Kealan';
در نهایت به صورت زیر کامپایل و یا transpile میشود:
let name = 'Kealan'
خروجی ممکن است بسته به مراحل ساخت متفاوت باشد، یعنی متغیر ممکن است تغییر نام داده و یا inline شود. اما مثال type erasure همچنان صادق میباشد.
این موضوع فقط در مورد تایپهای اصلی مانند number
یا string
نیست، بلکه حتی با تایپهای سفارشی خود نیز میتوانیم این کار را انجام دهیم:
type StringType = string; const firstName: StringType = "Kealan";
این مفهوم فراتر از درک این که type erasure چیست، مرحله مهمی را در فرآیند transpiling توضیح میدهد که در آن تایپها دور ریخته میشوند و در سورس کد جدیدی که تولید میکنیم مورد استفاده قرار نمیگیرند. همچنین معنی دیگری که دارد است که قطعه کد ما حتی در زبان جاوااسکریپت در مرحله transpiling استفاده نمیشود و کد به طور کامل حذف میگردد. بنابراین interfaceای با۱۰۰ خط که ایجاد میکنیم حذف شده و کد کوتاهتری به کاربر ارسال میشود.
به عنوان مثال میتوانیم این موضوع را در playground تایپ اسکریپت مشاهده کنیم. جایی که interface مورد استفاده در کد تایپ اسکریپت در جاوااسکریپت ترجمه شده وجود ندارد.
در این مقاله با زبانهای سطح بالا و سطح پایین آشنا شدیم. پس از آن به تفاوتهایی که بین مفاهیم compiling و transpiling وجود دارد پرداختیم و در نهایت مفهوم type erasure در تایپ اسکریپت را باهم بررسی کردیم.