program execution |
---|
general concepts |
types of code |
compilation strategies |
Notable runtimes |
|
Notable compilers & toolchains |
|
compile time (tsz. compile times)
A compile time (fordítási idő) során a következő dolgok történnek:
✅ Lexikális elemzés (Lexical Analysis) – A forráskódot tokenekre bontja.
✅ Szintaktikai elemzés (Syntax Analysis) – Ellenőrzi, hogy a kód megfelel-e a C++ nyelvtannak.
✅ Típusellenőrzés (Type Checking) – Megvizsgálja, hogy az adattípusok helyesen vannak-e használva.
✅ Kódoptimalizáció (Code Optimization) – Bizonyos optimalizációkat végez el a fordító.
✅ Bináris kód generálása (Code Generation) – Elkészül a futtatható bináris fájl.
A következő kód hibát generál még a fordítás során, mert a változó típusa nem egyezik meg a kifejezés eredményével:
#include <iostream>
using namespace std;
int main() {
int x = "szoveg"; // ❌ Fordítási hiba: "szoveg" nem int típusú
cout << x << endl;
return 0;
}
🔴 Hibajelzés (Compile Time Error):
error: cannot convert ‘const char*’ to ‘int’ in initialization
✅ A fordító már compile time felismeri, hogy a "szoveg"
egy const char* típusú, és nem lehet int
-be konvertálni.
A C++ lehetőséget ad arra, hogy bizonyos számításokat már fordítási időben végrehajtsunk a constexpr
kulcsszóval.
#include <iostream>
using namespace std;
constexpr int osszead(int a, int b) {
return a + b;
}
int main() {
constexpr int eredmeny = osszead(10, 20); // ✅ Compile Time számítás
cout << "Eredmény: " << eredmeny << endl;
return 0;
}
✅ Mivel az osszead(10, 20)
egy constexpr
függvény, a fordító már a fordítási időben ki tudja számolni az eredményt.
A függvény túlterhelés (function overloading) compile time működik, mert a fordító már fordításkor eldönti, hogy melyik függvényt kell meghívni.
#include <iostream>
using namespace std;
void kiir(int x) {
cout << "Egész szám: " << x << endl;
}
void kiir(double x) {
cout << "Lebegőpontos szám: " << x << endl;
}
int main() {
kiir(10); // ✅ Compile time eldől, hogy kiir(int) kell
kiir(3.14); // ✅ Compile time eldől, hogy kiir(double) kell
return 0;
}
✅ A fordító már fordításkor tudja, hogy az kiir(int)
és kiir(double)
különböző függvények, és a megfelelő hívásokat társítja.
A C++ sablonok (templates) egy másik fontos compile time mechanizmust biztosítanak. A sablonokból a fordító már fordítási időben konkrét verziókat generál.
#include <iostream>
using namespace std;
template <typename T>
T osszeg(T a, T b) {
return a + b;
}
int main() {
cout << osszeg(10, 20) << endl; // ✅ Compile time generálódik osszeg<int>
cout << osszeg(3.5, 2.5) << endl; // ✅ Compile time generálódik osszeg<double>
return 0;
}
✅ A fordító már a fordítás során különböző verziókat generál (osszeg<int>
és osszeg<double>
), így nincs szükség futásidőbeli ellenőrzésre.
Jellemző | Compile Time (Fordítási idő) | Run Time (Futásidő) |
---|---|---|
Időpont | Fordításkor történik | A program futtatásakor történik |
Példák | Típusellenőrzés, constexpr , sablonok, túlterhelés
|
Felhasználói bemenet, fájlkezelés, dinamikus memóriakezelés |
Hibák | Szintaktikai hibák, típuskövetkezetési hibák | Logikai hibák, memóriaszivárgás |
Sebesség | Gyorsabb, mert a fordító előre elvégzi az ellenőrzéseket | Lassabb, mert a programnak futás közben kell számításokat végeznie |
A modern C++ fordítók képesek különböző optimalizációkat végezni már compile time alatt, például: - Konstans kifejezések kiértékelése (constexpr
használata) - Inline függvények kezelése (inline
kulcsszóval) - Felesleges kód eltávolítása (dead code elimination) - Hurkok kiterjesztése (loop unrolling)
#include <iostream>
using namespace std;
inline int osszeg(int a, int b) {
return a + b; // A fordító ezt a kódot közvetlenül behelyettesíti
}
int main() {
cout << osszeg(5, 10) << endl; // ✅ Compile time optimalizáció
return 0;
}
✅ A fordító compile time behelyettesíti az osszeg(5,10)
hívást, így nincs tényleges függvényhívás futásidőben.
C++ fordítási időben már számos hibát és figyelmeztetést jelezhet:
int main() {
int x = "hello"; // ❌ Típushiba fordítási időben
return 0;
}
int main() {
cout << y; // ❌ Fordítási hiba: 'y' nincs deklarálva
return 0;
}
int main() {
myFunction(); // ❌ Fordítási hiba: ismeretlen függvény
return 0;
}
🔹 Minden ilyen hiba már fordításkor jelentkezik, így nem kell a program futtatása után keresni a problémákat!
✅ A Compile Time (fordítási idő) az az időszak, amikor a fordító feldolgozza a C++ kódot.
✅ Compile Time során történik a típusellenőrzés, szintaktikai ellenőrzés és optimalizáció.
✅ Sablonok (templates
), konstans kifejezések (constexpr
) és inline függvények is compile time működnek.
✅ A compile time hibák könnyen észlelhetőek, így érdemes őket a program futtatása előtt kijavítani.