ترانسپایل‌سازی: چیست، فرآیند و ابزارهای تبدیل کد

نویسنده: IT Sectr منتشر شده: 2026-05-19 زمان مطالعه: 8 دقیقه

ترانسپایل‌سازی — تبدیل کد منبع از یک زبان برنامه‌نویسی به زبان دیگر در همان سطح انتزاع. برخلاف کامپایل به کد ماشین، ترانسپایل‌سازی کد را بین زبان‌های سطح بالا ترجمه می‌کند: TypeScript به JavaScript، Kotlin به Java، Dart به JavaScript. طبق Babel Documentation، Babel محبوب‌ترین ترانسپایلر با ۳۵+ میلیون بارگیری در هفته و پشتیبانی از صدها پلاگین است.

نکات اصلی

  • ترانسپایل‌سازی — ترجمه کد بین زبان‌های هم‌سطح انتزاع (کامپایل مبدأ به مبدأ)
  • Babel — ترانسپایلر JavaScript مدرن (ES6+) به ES5 سازگار برای مرورگرهای قدیمی
  • TypeScript از طریق tsc به JavaScript کامپایل می‌شود — ترانسپایلری که انواع را حذف و به ES تبدیل می‌کند
  • Kotlin/Native و Kotlin/JS — ترانسپایل Kotlin به کد بومی و JavaScript برای توسعه کراس‌پلتفرم
  • Dart برای وب به JavaScript (dart2js) و برای پلتفرم‌های موبایل به کد بومی (dart2native) کامپایل می‌شود

ترانسپایل‌سازی چیست؟

ترانسپایل‌سازی (کامپایل مبدأ به مبدأ) — فرآیند ترجمه برنامه از یک زبان برنامه‌نویسی به زبان دیگر با حفظ سطح انتزاع. ترانسپایلر کد منبع را به زبان A دریافت می‌کند و کد معادل به زبان B تولید می‌کند که می‌تواند در محیط مقصد اجرا شود. مثال‌های معمول: TypeScript به JavaScript، SASS به CSS، Haxe به چندین زبان مقصد.

ترانسپایل‌سازی با کامپایل تفاوت دارد زیرا کد خروجی در سطح بالا باقی می‌ماند و قابل خواندن توسط انسان است (اگرچه برای این منظور طراحی نشده). کامپایلر (GCC, LLVM, javac) کد را به کد ماشین یا بایت‌کد — فرمت غیرقابل خواندن — تبدیل می‌کند. ترانسپایلر کدی تولید می‌کند که می‌تواند بیشتر کامپایل یا مینیفای شود.

چرا ترانسپایل‌سازی لازم است. دلیل اصلی سازگاری است. توسعه‌دهندگان می‌خواهند از زبان‌های مدرن (TypeScript با انواع، Kotlin با null safety) استفاده کنند، اما پلتفرم مقصد فقط JavaScript یا Java را پشتیبانی می‌کند. ترانسپایل‌سازی امکان نوشتن به زبان مدرن و استقرار کدی قابل فهم برای محیط مقصد را فراهم می‌کند.

ترانسپایلرهای محبوب

ترانسپایلرمبدأ ← مقصدکاربرد
BabelES6+/TypeScript ← ES5توسعه وب، React، Vue
tsc (TypeScript Compiler)TypeScript ← JavaScriptهر برنامه TypeScript
kotlinc-jsKotlin ← JavaScriptKotlin/JS، React Kotlin Wrappers
dart2jsDart ← JavaScriptFlutter Web، AngularDart
SWCTypeScript/JS ← ES5Next.js، ساخت روی Rust

ترانسپایل‌سازی در مقابل کامپایل: تفاوت‌های کلیدی

سطح انتزاع — تفاوت اصلی. ترانسپایلر کد را بین زبان‌های هم‌سطح ترجمه می‌کند (سطح بالا ← سطح بالا). کامپایلر از سطح بالا به سطح پایین (کد ماشین، بایت‌کد) ترجمه می‌کند. LLVM IR یک نمایش میانی است، اما باز هم از C++ یا Rust مبدأ سطح پایین‌تری دارد.

خوانایی نتیجه — دومین تفاوت. نتیجه ترانسپایل (JavaScript از TypeScript) قابل خواندن و اشکال‌زدایی در مرورگر است. نتیجه کامپایل (کد ماشین از C++) برای خواندن طراحی نشده — تجزیه و تحلیل آن نیاز به دیساسمبلر دارد. Source maps به اشکال‌زدایی کد ترانسپایل شده کمک می‌کند و آن را به کد مبدأ متصل می‌کند.

ترانسپایل‌سازی در زمینه CI/CD

در خطوط لوله CI/CD ترانسپایل‌سازی در مرحله ساخت (build stage) انجام می‌شود. برای پروژه‌های TypeScript، tsc یا Babel در کانتینر Docker اجرا می‌شوند، JavaScript و source maps تولید می‌کنند که سپس مینیفای و روی سرور یا فروشگاه برنامه مستقر می‌شوند. مهم است که حافظه نهان نتایج ترانسپایل پیکربندی شود — tsc --incremental گراف وابستگی را بین اجراها ذخیره می‌کند و زمان ساخت را ۳۰–۵۰٪ کاهش می‌دهد.

برای پروژه‌های موبایل (React Native) ترانسپایل از طریق Metro Bundler در سرور CI در هر انتشار انجام می‌شود. برای سرعت بخشیدن از دایرکتوری‌های کش (tmp/metro-cache) و ساخت موازی از طریق --workers استفاده می‌شود. GitHub Actions و GitLab CI از کش کردن node_modules و دایرکتوری‌های .cache بین اجراها پشتیبانی می‌کنند که برای کاهش زمان خط لوله حیاتی است.

سرعت اجرا نیز متفاوت است. کامپایل به کد ماشین حداکثر کارایی را می‌دهد. ترانسپایل سربار سطح انتزاع را حفظ می‌کند: JavaScript از TypeScript با همان سرعت JavaScript معمولی اجرا می‌شود. بهینه‌سازی‌ها (TypeScript --strict) در مرحله تحلیل کار می‌کنند، نه در مرحله اجرا.

سناریوهای محبوب ترانسپایل

سناریو ۱: TypeScript ← JavaScript — پرکاربردترین سناریو. توسعه‌دهنده با TypeScript با انواع می‌نویسد، کامپایلر tsc یا Babel حاشیه‌نویسی انواع را حذف و JavaScript خالص تولید می‌کند. همه پروژه‌های Angular و بیشتر پروژه‌های React (۲۰۲۶) از ترانسپایل TypeScript استفاده می‌کنند. طبق آمار State of JS ۲۰۲۵، ۷۹٪ از توسعه‌دهندگان شرکت‌کننده در نظرسنجی از TypeScript در پروژه‌های اصلی استفاده می‌کنند.

سناریو ۲: Kotlin ← JavaScript — در Kotlin/JS برای توسعه Full-Stack استفاده می‌شود. کد Kotlin از طریق Kotlin Compiler با IR (Intermediate Representation) به JavaScript کامپایل می‌شود. Kotlin/JS از اعلان‌های تایپ‌شده TypeScript (.d.ts) برای ادغام با کتابخانه‌های خارجی JS پشتیبانی می‌کند. JetBrains از Kotlin/JS در محصولات خود برای رابط‌های وب استفاده می‌کند.

سناریو ۳: SASS/SCSS ← CSS — ترانسپایل پیش‌پردازنده‌های CSS. Dart Sass (پیاده‌سازی توصیه‌شده) .scss را به .css ترانسپایل می‌کند، میکسین‌ها، متغیرها، قوانین تودرتو و توابع را گسترش می‌دهد. این کامپایل نیست (CSS همچنان CSS است)، بلکه ترانسپایل با گسترش نحوی است.

مقایسه: ترانسپایل در مقابل کامپایل در مقابل تفسیر

پارامترترانسپایلکامپایلتفسیر
ورودی ← خروجیسطح بالا ← سطح بالاسطح بالا ← کد ماشینکد ← اجرای لحظه‌ای
مثالTypeScript ← JavaScriptC++ ← ARM/x86Python ← CPython runtime
کد خروجی قابل خواندنبلهخیرنامعتبر
کاراییمانند زبان مقصدحداکثرپایین‌تر از کامپایل
نیاز به runtimeخیر (کد مقصد خالص)خیربله

Babel: ترانسپایل JavaScript مدرن

Babel — رایج‌ترین ترانسپایلر JavaScript که کد ES6+/ESNext را به JavaScript سازگار با ES5 تبدیل می‌کند. Babel از طریق سیستم پلاگین‌ها و پریست‌ها کار می‌کند: هر پلاگین مسئول یک تبدیل است (arrow functions، async/await، optional chaining). @babel/preset-env به طور خودکار پلاگین‌های لازم را بر اساس مرورگرهای مقصد (browserslist) تعیین می‌کند.

معماری Babel از سه مرحله تشکیل شده است: تجزیه (parsing) ← تبدیل (transformation) ← تولید (generation). تجزیه‌گر (Babylon/@babel/parser) کد مبدأ را به AST (درخت نحو انتزاعی) تبدیل می‌کند. تبدیل‌کننده‌ها (پلاگین‌ها) AST را تغییر می‌دهند. تولیدکننده (@babel/generator) کد خروجی را از AST تغییر یافته ایجاد می‌کند.

مثال: ترانسپایل از طریق Babel

js
// کد مبدأ ES6+
const greet = (name = "World") => {
  return `Hello, ${name}!`;
};

class User {
  constructor(name) {
    this.name = name;
  }
}

const data = { user: { address: { city: "Moscow" } } };
const city = data?.user?.address?.city;
js
// پس از Babel (target: > 0.25%, not dead)
"use strict";

var greet = function (name) {
  if (name === void 0) { name = "World"; }
  return "Hello, " + name + "!";
};

var User = function (name) {
  this.name = name;
};

var data = { user: { address: { city: "Moscow" } } };
var city = data != null
  ? data.user != null
    ? data.user.address != null
      ? data.user.address.city
      : void 0
    : void 0
  : void 0;

Babel تبدیل کرد: تابع پیکانی به function expression، پارامتر پیش‌فرض (name = «World») به بررسی void 0، template string به الحاق، کلاس به تابع سازنده و optional chaining (?.) به زنجیره عملگرهای سه‌تایی. const برای سازگاری با محیط‌های ES5 با var جایگزین شد.

TypeScript: ترانسپایل با سیستم انواع

TypeScript — زبان به شدت تایپ‌شده که به JavaScript ترانسپایل می‌شود. کامپایلر tsc (TypeScript Compiler) دو وظیفه را انجام می‌دهد: بررسی انواع (type checking) و ترانسپایل (emit). مهم است بدانید: بررسی انواع و ترانسپایل مراحل مستقل هستند. می‌توان ترانسپایل را بدون بررسی انواع (--noEmitOnError false) یا بررسی را بدون تولید کد (--noEmit true) انجام داد.

ترانسپایل TypeScript همه حاشیه‌نویسی انواع، رابط‌ها، نام‌های مستعار نوع و پارامترهای جنریک را حذف می‌کند — در JavaScript وجود ندارند. Enum‌ها به اشیاء، دکوراتورها به فراخوانی توابع، async/await به ژنراتورها (اگر target پایین‌تر از ES2017 باشد) تبدیل می‌شوند. tsconfig.json target (نسخه JavaScript)، module (سیستم ماژول)، strict (درجه بررسی انواع) و outDir (پوشه خروجی) را مدیریت می‌کند.

پیکربندی TypeScript برای ترانسپایل

json
{
  "compilerOptions": {
    "target": "es2015",
    "module": "esnext",
    "lib": ["es2015", "dom"],
    "strict": true,
    "outDir": "./dist",
    "rootDir": "./src",
    "esModuleInterop": true,
    "sourceMap": true,
    "declaration": true
  },
  "include": ["src/**/*"],
  "exclude": ["node_modules"]
}

target: «es2015» به tsc دستور می‌دهد JavaScript با نحو ES6 (توابع پیکانی، کلاس‌ها، let/const) تولید کند. module: «esnext» ماژول‌های ES (import/export) را برای Tree Shaking بعدی در Webpack حفظ می‌کند. strict: true همه بررسی‌های انواع را فعال می‌کند (strictNullChecks، noImplicitAny، strictFunctionTypes). declaration: true فایل‌های .d.ts را برای مصرف‌کنندگان کتابخانه در TypeScript تولید می‌کند.

ترانسپایل‌سازی در توسعه موبایل

React Native از Babel و Metro برای ترانسپایل JavaScript/TypeScript به کدی که توسط JavaScriptCore (iOS) یا Hermes (Android) اجرا می‌شود استفاده می‌کند. پلاگین‌های Babel تبدیل JSX، حاشیه‌نویسی Flow/TypeScript و بهینه‌سازی‌های خاص React Native را اضافه می‌کنند. Metro Bundler علاوه بر این ماژول‌ها را ترکیب و Hot Module Replacement را برای توسعه انجام می‌دهد.

Flutter از ترانسپایل Dart استفاده می‌کند. برای Flutter Web، dart2js Dart را به JavaScript بهینه‌شده ترانسپایل می‌کند. برای Flutter Mobile، dart2native Dart را به کد بومی ARM کامپایل می‌کند. Flutter همچنین از Dart DevCompiler (dartdevc) برای توسعه پشتیبانی می‌کند — Dart را سریع‌تر اما با بهینه‌سازی کمتر به JavaScript ترانسپایل می‌کند.

مثال: پیکربندی Babel برای React Native

js
// babel.config.js — ترانسپایل React Native
module.exports = {
  presets: [
    ["module:metro-react-native-babel-preset"],
  ],
  plugins: [
    ["module-resolver", {
      root: ["."],
      alias: {
        "@": "./src",
        "@components": "./src/components",
      },
    }],
    "react-native-reanimated/plugin",
  ],
  env: {
    production: {
      plugins: ["transform-remove-console"],
    },
  },
};

metro-react-native-babel-preset شامل تمام پلاگین‌های لازم برای React Native است: JSX، Flow/TypeScript، سیستم ماژول Metro، async/await، class properties و دکوراتورها. پلاگین module-resolver aliasهایی برای importهای کوتاه اضافه می‌کند (@/components/Button به جای ../../components/Button). در حالت تولید، transform-remove-console همه console.logها را از کد حذف می‌کند.

سوالات متداول

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

ترانسپایل کد را از یک زبان به زبان دیگر در همان سطح ترجمه می‌کند (مثلاً TypeScript ← JavaScript). کامپایل از سطح بالا به سطح پایین ترجمه می‌کند (C++ ← کد ماشین). نتیجه ترانسپایل قابل خواندن است، نتیجه کامپایل — خیر.

آیا ترانسپایل برای React Native لازم است؟

React Native به طور پیش‌فرض نیاز به ترانسپایل دارد — Metro Bundler از Babel برای تبدیل JSX، TypeScript و JavaScript مدرن به کد سازگار با JavaScriptCore و Hermes استفاده می‌کند. بدون Babel، React Native نمی‌تواند نحو JSX کامپوننت‌ها را اجرا کند.

آیا می‌توان از TypeScript بدون tsc استفاده کرد؟

می‌توان: Babel با @babel/preset-typescript و SWC از ترانسپایل TypeScript پشتیبانی می‌کنند. این کار از tsc سریع‌تر است، اما Babel بررسی انواع انجام نمی‌دهد — فقط حاشیه‌نویسی انواع را حذف می‌کند. برای بررسی انواع باید tsc --noEmit را به عنوان دستور جداگانه یا از طریق fork-ts-checker-webpack-plugin اجرا کرد.

Source maps در زمینه ترانسپایل چیست؟

Source maps — فایل‌هایی که کد ترانسپایل شده را به کد مبدأ متصل می‌کنند. امکان اشکال‌زدایی TypeScript در مرورگر را فراهم می‌کنند: نقاط توقف در فایل‌های .ts قرار می‌گیرند، stack traceها خطوط .ts را نشان می‌دهند نه .js. بدون source maps اشکال‌زدایی کد ترانسپایل شده عملاً غیرممکن است.

ترانسپایل چگونه بر عملکرد تأثیر می‌گذارد؟

خود ترانسپایل بر عملکرد برنامه تأثیر نمی‌گذارد — کد خروجی با همان سرعت کد بومی نوشته شده به زبان مقصد اجرا می‌شود. سربار فقط زمانی ایجاد می‌شود که ترانسپایلر کد بهینه تولید نکند (مثلاً Babel ممکن است polyfill‌های حجیم برای متدهای آرایه ایجاد کند).

خلاصه

  • ترانسپایل — تبدیل کد بین زبان‌های هم‌سطح انتزاع (کامپایل مبدأ به مبدأ)
  • Babel — ترانسپایلر اصلی JavaScript با سیستم پلاگین و @babel/preset-env برای پیکربندی خودکار
  • TypeScript از طریق tsc به JavaScript ترانسپایل می‌شود، حاشیه‌نویسی انواع را حذف و نحو مدرن را تبدیل می‌کند
  • React Native از Babel و Metro برای ترانسپایل JSX، TypeScript و ES6+ به کد سازگار استفاده می‌کند
  • ترانسپایل در مقابل کامپایل: ترانسپایل سطح انتزاع بالا را حفظ می‌کند، کامپایل به کد ماشین تبدیل می‌کند
  • Source maps برای اشکال‌زدایی کد ترانسپایل شده ضروری هستند و کد تولید شده را به کد مبدأ متصل می‌کنند

ما یک اپلیکیشن موبایل به صورت کلید در دست توسعه خواهیم داد

IT Sectr از سال 2017 برنامه‌های iOS و Android را برای استارتاپ‌ها و کسب‌وکارها ایجاد می‌کند. ما به شما مشاوره می‌دهیم و بهترین راه‌حل را پیشنهاد خواهیم کرد.

بحث درباره پروژه

همچنین بخوانید