Μεταγλώττιση — μετατροπή πηγαίου κώδικα από μία γλώσσα προγραμματισμού σε άλλη στο ίδιο επίπεδο αφαίρεσης. Σε αντίθεση με τη μεταγλώττιση σε κώδικα μηχανής, η μεταγλώττιση μεταφράζει κώδικα μεταξύ γλωσσών υψηλού επιπέδου: TypeScript σε JavaScript, Kotlin σε Java, Dart σε JavaScript. Σύμφωνα με το Babel Documentation, το Babel είναι ο πιο δημοφιλής μεταγλωττιστής με 35+ εκατομμύρια λήψεις την εβδομάδα και υποστήριξη εκατοντάδων προσθηκών.
Κύρια σημεία
Μεταγλώττιση (μεταγλώττιση source-to-source) — η διαδικασία μετάφρασης ενός προγράμματος από μία γλώσσα προγραμματισμού σε άλλη, διατηρώντας το επίπεδο αφαίρεσης. Ένας μεταγλωττιστής λαμβάνει πηγαίο κώδικα στη γλώσσα Α και παράγει ισοδύναμο κώδικα στη γλώσσα Β που μπορεί να εκτελεστεί στο περιβάλλον-στόχο. Τυπικά παραδείγματα: TypeScript σε JavaScript, SASS σε CSS, Haxe σε πολλές γλώσσες-στόχους.
Η μεταγλώττιση διαφέρει από τη μεταγλώττιση (compilation) στο ότι ο κώδικας εξόδου παραμένει σε υψηλό επίπεδο και μπορεί να διαβαστεί από άνθρωπο (αν και δεν προορίζεται για αυτό). Ο compiler (GCC, LLVM, javac) μεταφράζει κώδικα σε κώδικα μηχανής ή bytecode — μη αναγνώσιμη μορφή. Ο μεταγλωττιστής παράγει κώδικα που μπορεί να μεταγλωττιστεί περαιτέρω ή να σμικρυνθεί.
Γιατί χρειάζεται η μεταγλώττιση. Ο κύριος λόγος είναι η συμβατότητα. Οι προγραμματιστές θέλουν να χρησιμοποιούν σύγχρονες γλώσσες (TypeScript με τύπους, Kotlin με null safety), αλλά η πλατφόρμα-στόχος υποστηρίζει μόνο JavaScript ή Java. Η μεταγλώττιση επιτρέπει τη σύνταξη σε σύγχρονη γλώσσα και την ανάπτυξη κώδικα κατανοητού από το περιβάλλον-στόχο.
| Μεταγλωττιστής | Πηγή → Στόχος | Χρήση |
|---|---|---|
| Babel | ES6+/TypeScript → ES5 | Ανάπτυξη ιστού, React, Vue |
| tsc (TypeScript Compiler) | TypeScript → JavaScript | Οποιεσδήποτε εφαρμογές TypeScript |
| kotlinc-js | Kotlin → JavaScript | Kotlin/JS, React Kotlin Wrappers |
| dart2js | Dart → JavaScript | Flutter Web, AngularDart |
| SWC | TypeScript/JS → ES5 | Next.js, κατασκευή σε Rust |
Επίπεδο αφαίρεσης — η κύρια διαφορά. Ο μεταγλωττιστής μεταφράζει κώδικα μεταξύ γλωσσών του ίδιου επιπέδου (υψηλό επίπεδο → υψηλό επίπεδο). Ο compiler μεταφράζει από υψηλό επίπεδο σε χαμηλό (κώδικας μηχανής, bytecode). Το LLVM IR είναι μια ενδιάμεση αναπαράσταση, αλλά εξακολουθεί να είναι χαμηλότερου επιπέδου από το πηγαίο C++ ή Rust.
Αναγνωσιμότητα αποτελέσματος — η δεύτερη διαφορά. Το αποτέλεσμα της μεταγλώττισης (JavaScript από TypeScript) είναι αναγνώσιμο και μπορεί να εντοπιστεί σφαλμάτων στο πρόγραμμα περιήγησης. Το αποτέλεσμα της μεταγλώττισης (κώδικας μηχανής από C++) δεν προορίζεται για ανάγνωση — η ανάλυσή του απαιτεί αποσυναρμολογητή. Τα source maps βοηθούν στον εντοπισμό σφαλμάτων του μεταγλωττισμένου κώδικα, συνδέοντάς τον με τον πηγαίο κώδικα.
Σε αγωγούς CI/CD η μεταγλώττιση εκτελείται στο στάδιο δημιουργίας (build stage). Για έργα TypeScript, το tsc ή το Babel εκτελούνται σε ένα δοχείο Docker, παράγουν JavaScript και source maps, τα οποία στη συνέχεια σμικρύνονται και αναπτύσσονται στον διακομιστή ή στο κατάστημα εφαρμογών. Είναι σημαντικό να ρυθμίσετε την προσωρινή αποθήκευση των αποτελεσμάτων μεταγλώττισης — το tsc --incremental αποθηκεύει το γράφημα εξαρτήσεων μεταξύ εκτελέσεων, μειώνοντας τον χρόνο δημιουργίας κατά 30–50%.
Για έργα κινητών (React Native) η μεταγλώττιση μέσω Metro Bundler εκτελείται στον διακομιστή CI σε κάθε δημοσίευση. Για επιτάχυνση χρησιμοποιούνται κατάλογοι προσωρινής αποθήκευσης (tmp/metro-cache) και παράλληλη δημιουργία μέσω --workers. Τα GitHub Actions και GitLab CI υποστηρίζουν προσωρινή αποθήκευση των node_modules και των καταλόγων .cache μεταξύ εκτελέσεων, κάτι που είναι κρίσιμο για τη μείωση του χρόνου του αγωγού.
Ταχύτητα εκτέλεσης επίσης διαφέρει. Η μεταγλώττιση σε κώδικα μηχανής δίνει μέγιστη απόδοση. Η μεταγλώττιση διατηρεί την επιβάρυνση του επιπέδου αφαίρεσης: το JavaScript από TypeScript εκτελείται με την ίδια ταχύτητα με το συνηθισμένο JavaScript. Οι βελτιστοποιήσεις (TypeScript --strict) λειτουργούν στο στάδιο ανάλυσης, όχι στο στάδιο εκτέλεσης.
Σενάριο 1: TypeScript → JavaScript — το πιο μαζικό σενάριο. Ο προγραμματιστής γράφει σε TypeScript με τύπους, ο compiler tsc ή το Babel αφαιρεί τις σημειώσεις τύπων και παράγει καθαρό JavaScript. Όλα τα έργα Angular και τα περισσότερα έργα React (2026) χρησιμοποιούν μεταγλώττιση TypeScript. Σύμφωνα με στατιστικά του State of JS 2025, το 79% των προγραμματιστών που συμμετείχαν στην έρευνα χρησιμοποιούν TypeScript στα κύρια έργα τους.
Σενάριο 2: Kotlin → JavaScript — χρησιμοποιείται σε Kotlin/JS για ανάπτυξη Full-Stack. Ο κώδικας Kotlin μεταγλωττίζεται σε JavaScript μέσω Kotlin Compiler με IR (Intermediate Representation). Το Kotlin/JS υποστηρίζει δηλώσεις με τύπους TypeScript (.d.ts) για ενσωμάτωση με εξωτερικές βιβλιοθήκες JS. Η JetBrains χρησιμοποιεί Kotlin/JS στα προϊόντα της για διεπαφές ιστού.
Σενάριο 3: SASS/SCSS → CSS — μεταγλώττιση προεπεξεργαστών CSS. Το Dart Sass (συνιστώμενη υλοποίηση) μεταγλωττίζει .scss σε .css, επεκτείνοντας mixins, μεταβλητές, ένθετους κανόνες και συναρτήσεις. Αυτό δεν είναι μεταγλώττιση (το CSS παραμένει CSS), αλλά μεταγλώττιση με συντακτική επέκταση.
| Παράμετρος | Μεταγλώττιση | Compilation | Διερμηνεία |
|---|---|---|---|
| Είσοδος → Έξοδος | Υψηλό επίπεδο → Υψηλό επίπεδο | Υψηλό επίπεδο → Κώδικας μηχανής | Κώδικας → Άμεση εκτέλεση |
| Παράδειγμα | TypeScript → JavaScript | C++ → ARM/x86 | Python → CPython runtime |
| Κώδικας εξόδου αναγνώσιμος | Ναι | Όχι | Δ/Ι |
| Απόδοση | Όπως η γλώσσα-στόχος | Μέγιστη | Χαμηλότερη από compilation |
| Απαιτεί runtime | Όχι (καθαρός κώδικας-στόχος) | Όχι | Ναι |
Babel — ο πιο διαδεδομένος μεταγλωττιστής JavaScript, που μετατρέπει κώδικα ES6+/ESNext σε συμβατό με ES5 JavaScript. Το Babel λειτουργεί μέσω ενός συστήματος προσθηκών και presets: κάθε προσθήκη είναι υπεύθυνη για έναν μετασχηματισμό (arrow functions, async/await, optional chaining). Το @babel/preset-env καθορίζει αυτόματα τις απαραίτητες προσθήκες βάσει των προγραμμάτων περιήγησης-στόχων (browserslist).
Η αρχιτεκτονική του Babel αποτελείται από τρία στάδια: ανάλυση (parsing) → μετασχηματισμός (transformation) → δημιουργία (generation). Ο αναλυτής (Babylon/@babel/parser) μετατρέπει τον πηγαίο κώδικα σε AST (Abstract Syntax Tree). Οι μετασχηματιστές (προσθήκες) τροποποιούν το AST. Η γεννήτρια (@babel/generator) δημιουργεί κώδικα εξόδου από το τροποποιημένο AST.
// Πηγαίος κώδικας 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;// Μετά το 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 αντικαταστάθηκε με var για συμβατότητα με περιβάλλοντα ES5.
TypeScript — μια αυστηρά τυποποιημένη γλώσσα, που μεταγλωττίζεται σε JavaScript. Ο compiler tsc (TypeScript Compiler) εκτελεί δύο εργασίες: έλεγχο τύπων (type checking) και μεταγλώττιση (emit). Είναι σημαντικό να κατανοήσετε: ο έλεγχος τύπων και η μεταγλώττιση είναι ανεξάρτητα στάδια. Είναι δυνατό να εκτελεστεί μεταγλώττιση χωρίς έλεγχο τύπων (--noEmitOnError false) ή έλεγχος χωρίς δημιουργία κώδικα (--noEmit true).
Μεταγλώττιση TypeScript αφαιρεί όλες τις σημειώσεις τύπων, διεπαφές, ψευδώνυμα τύπων και γενικές παραμέτρους — στο JavaScript δεν υπάρχουν. Τα enum μετατρέπονται σε αντικείμενα, οι διακοσμητές σε κλήσεις συναρτήσεων, τα async/await σε γεννήτριες (αν το target είναι κάτω από ES2017). Το tsconfig.json διαχειρίζεται το target (έκδοση JavaScript), module (σύστημα αρθρωμάτων), strict (βαθμός ελέγχου τύπων) και outDir (φάκελος εξόδου).
{
"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.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 προσθέτει ψευδώνυμα για σύντομες εισαγωγές (@/components/Button αντί για ../../components/Button). Σε λειτουργία παραγωγής, το transform-remove-console αφαιρεί όλα τα console.log από τον κώδικα.
Συχνές Ερωτήσεις
Μεταγλώττιση (transpilation) μεταφράζει κώδικα από μία γλώσσα σε άλλη στο ίδιο επίπεδο (π.χ. TypeScript → JavaScript). Μεταγλώττιση (compilation) μεταφράζει από υψηλό επίπεδο σε χαμηλό (C++ → κώδικας μηχανής). Το αποτέλεσμα της transpilation είναι αναγνώσιμο, το αποτέλεσμα της compilation — όχι.
React Native απαιτεί μεταγλώττιση από προεπιλογή — το Metro Bundler χρησιμοποιεί Babel για τη μετατροπή JSX, TypeScript και σύγχρονου JavaScript σε κώδικα συμβατό με JavaScriptCore και Hermes. Χωρίς Babel, το React Native δεν μπορεί να εκτελέσει τη σύνταξη JSX των στοιχείων.
Ναι: Το Babel με @babel/preset-typescript και το SWC υποστηρίζουν μεταγλώττιση TypeScript. Είναι ταχύτερο από το tsc, αλλά το Babel δεν εκτελεί έλεγχο τύπων — αφαιρεί μόνο τις σημειώσεις τύπων. Για έλεγχο τύπων, το tsc --noEmit πρέπει να εκτελεστεί ως ξεχωριστή εντολή ή μέσω fork-ts-checker-webpack-plugin.
Source maps — αρχεία που συνδέουν τον μεταγλωττισμένο κώδικα με τον πηγαίο κώδικα. Επιτρέπουν τον εντοπισμό σφαλμάτων TypeScript στο πρόγραμμα περιήγησης: τα σημεία διακοπής τοποθετούνται σε αρχεία .ts, τα stack traces δείχνουν γραμμές .ts, όχι .js. Χωρίς source maps, ο εντοπισμός σφαλμάτων του μεταγλωττισμένου κώδικα είναι πρακτικά αδύνατος.
Η ίδια η μεταγλώττιση δεν επηρεάζει την απόδοση της εφαρμογής — ο κώδικας εξόδου εκτελείται με την ίδια ταχύτητα με τον εγγενώς γραμμένο κώδικα στη γλώσσα-στόχο. Επιβάρυνση προκύπτει μόνο αν ο μεταγλωττιστής παράγει μη βέλτιστο κώδικα (π.χ. το Babel μπορεί να δημιουργήσει ογκώδη polyfill για μεθόδους πινάκων).
Σύνοψη
Θα αναπτύξουμε μια εφαρμογή για κινητά έτοιμη για χρήση
Η IT Sectr δημιουργεί εφαρμογές iOS και Android για νεοφυείς επιχειρήσεις και επιχειρήσεις από το 2017. Θα σας συμβουλεύσουμε και θα προτείνουμε την καλύτερη λύση.
Διαβάστε επίσης