Język C++ należy do języków kompilowanych (tak jak Fortran, Ada, Pascal i wiele innych).
W odróżnieniu np. od Javy, wynikiem kompilacji nie jest niezależny od platformy kod bajtowy (ang. byte-code), ale plik wykonywalny (ang. executable), czyli taki, który zawiera kod programu w języku maszynowym odpowiednim dla platformy (czyli systemu operacyjnego i procesora naszego komputera). Tak więc dla uruchomienia programu nie jest konieczne specjalne środowisko uruchomieniowe (jak maszyna wirtualna Javy czy interpreter Pythona) — wykonanie odbywa się bezpośrednio pod kontrolą systemu operacyjnego, choć zwykle do jego działanie są konieczne pewne pliki biblioteczne (w wypadku platformy .NET wygląda to nieco inaczej). Ponieważ w czasie wykonania nie jest już dokonywana żadna dodatkowa translacja, programy w C/C++ są zwykle szybkie (programy w C są prawie tak szybkie jak programy w Fortranie, programy w C++ są zwykle, choć nie zawsze, nieco wolniejsze).
W rzeczywistości potrzebny jest jeszcze na przykład preprocesor i tzw. linker (zwany też konsolidatorem albo programem łączącym). W dużym skrócie, rolą linkera jest połączenie w jeden plik wykonywalny wielu plików otrzymanych w wyniku kompilacji poszczególnych plików źródłowych, których może być wiele i mogą być kompilowane osobno i w różnym czasie.
Zaletą tego podejścia jest duża szybkość wykonywania kodu zawartego w pliku wykonywalnym. Kompilacji oczywiście nie trzeba powtarzać przed każdym uruchomieniem programu: raz utworzony plik wykonywalny można zlecać systemowi operacyjnemu do wykonania, czyli uruchamiać, dowolną liczbę razy. Wadą języków w pełni kompilowanych, jak C++, jest, jak wspomnieliśmy, uzależnienie kodu wykonywalnego od platformy. Oczywiście sam tekst programu (źródło, ang. source) jest niezależny od platformy, jeśli trzymamy się w nim ściśle standardu języka C++ i nie stosujemy żadnych specyficznych dla danego kompilatora rozszerzeń.
Co dla nas z tego wszystkiego wynika to to, że potrzebujemy kompilatora
(wraz z linkerem, preprocesorem, bibliotekami itd.). Dla tych, którzy nie
mają zainstalowanego na swoim komputerze kompilatora C++ (albo mają,
ale o tym nie wiedzą), podamy więc parę szczegółów dotyczących jego
instalacji. Do jej sprawdzenia możemy potem użyć następującego
programu:
1. /*
2. * Test instalacji. Program powinien wypisać nazwy
3. * 4 języków programowania w porządku alfabetycznym.
4. */
5. #include <vector>
6. #include <algorithm>
7. #include <iostream>
8. #include <string>
9. using namespace std;
10.
11. int main() {
12. vector<string> vs{"Python", "Haskell",
13. "C++", "Java"};
14. sort(vs.begin(),vs.end());
15. for (const auto& e : vs) cout << e << " ";
16. cout << endl;
17. }
którego uruchomienie powinno spowodować wypisanie na ekranie nazw czterech języków programowania w porządku alfabetycznym. Program może na razie być niezrozumiały, ale chodzi tu raczej o to by sprawdzić, czy Twoja instalacja C++ (kompilator, linker, biblioteki) jest prawidłowa. Spróbuj zapisać ten program w oddzielnym katalogu, skompilować go i uruchomić.
Przy okazji podkreślmy, że
o umiejętnie dobranej nazwie i przemyślanej lokalizacji w strukturze katalogów. Nieprzestrzeganie tego zalecenia wcześniej czy później (raczej wcześniej) doprowadzi do powstania chaosu niemożliwego do opanowania.
W najprostszej sytuacji są użytkownicy Linuksa: nie potrzebują bowiem niczego ponad to, co już prawdopodobnie mają, nawet jeśli nie byli tego świadomi. Należy tylko zadbać podczas instalacji samego systemu, aby zaznaczyć do instalacji pakiet „dla programistów”; jeśli tego nie zrobiliśmy, to można zainstalować go później jednym poleceniem za pomocą instalatora właściwego dla danej dystrybucji (dotyczy to również komputerów Mac).
Jeśli w aktualnym katalogu mamy plik źródłowy zawierający program w C++, np. wspomniany wyżej plik testInst.cpp, to komenda
g++ -o testInst testInst.cpp
powinna spowodować uruchomienie kompilatora i linkera
(konsolidatora) i, jeśli nie
zostały wykryte żadne błędy, pojawienie się na dysku, w tym
samym katalogu, pliku
testInst,
który właśnie jest plikiem wykonywalnym.
W świecie Linuxa pliki wykonywalne tradycyjnie nie mają żadnego
rozszerzenia, choć oczywiście nic nie stoi na przeszkodzie,
abyśmy takie rozszerzenie, np.
.exe, dodali: nazwa pliku
wykonywalnego będzie taka, jaką podamy po opcji '-o'
powyższej komendy. Jeśli opcję tę w ogóle pominiemy,
to przyjęta zostanie domyślna nazwa
a.out.
Jeśli w programie używamy nowych konstrukcji językowych (ze standardów 2011/2014), może okazać się konieczne dodanie opcji '-std=c++14'; dobrze jest też dodać opcje które wymuszą sprawdzanie zgodności ze standardem – na przykład:
g++ -o testInst -std=c++14 -pedantic-errors -Wall testInst.cpp
Program zawarty w pliku wykonywalnym uruchamiamy pisząc po prostu
jego nazwę poprzedzoną znakami './', a więc w naszym przypadku
'./testInst', i wciskając klawisz Enter.
Zatem przebieg takiej sesji mógłby być następujący:
cpp> g++ -o testInst -pedantic-errors -Wall testInst.cpp
cpp> ./testInst
C++ Haskell Java Python
Jeśli nasz program zapisany jest w wielu plikach, to podajemy je wszystkie; można używać znaków uniwersalnych, czyli tzw. dżokerów (ang. wild cards), takich jak np. gwiazdki
cpp> g++ -o testInst *.cpp
Plik wykonywalny powstaje, oczywiście, jeden. Dodatkowe informacje
i opis wszystkich opcji kompilatora i linkera dostępne są, jak zwykle,
na stronie pomocy man (komenda man g++)
lub poprzez program
info (info g++).
W wielu edytorach można kompilację
i uruchamianie programu przypisać do mnemoników klawiszowych;
istnieją też graficzne programy bardzo ułatwiające pisanie programów
w C++ (jak
Eclipse,
Anjuta,
Geany,
KDevelop,
CodeWarrior,
Code::Blocks
— można je łatwo znaleźć w internecie).
Większość dobrych edytorów tekstu zapewnia podkreślanie składni,
zwijanie i rozwijanie struktur, automatyczne wcinanie i inne
udogodnienia do redagowania plików źródłowych C/C++.
Dobry kompilator C++ wchodzi w skład pakietu Visual Studio firmy Microsoft. Jest on wyposażony w bogaty interfejs graficzny, funkcje pomocy, debugger itd. Istnieje wersja darmowa, Visual Studio Express, w zupełności wystarczająca do nauki programowania. Osobom posiadającym to narzędzie można tylko przypomnieć, aby zawsze przed przystąpieniem do pisania programu zadbali o utworzenie najpierw tzw. projektu, w osobnym katalogu, przeznaczonym tylko na pliki wchodzące w skład tego projektu. Tworząc nowy projekt zadbać trzeba o jego właściwy typ, w naszym przypadku będzie to 'Empty project'; inaczej mogą pojawić się niewiele wyjaśniające komunikaty o błędach podczas kompilacji. Uruchamiać kompilator można zarówno korzystając z interfejsu graficznego jak i bezpośrednio z linii poleceń wywołując program cl (co jest skrótem od compile and link). Kompilator ma wiele opcji, z których dobrze będzie wybrać '-Wall -Za -GR -EHsc', które, między innymi, włączą komunikaty o błędach, a za to wyłączą niestandardowe rozszerzenia języka.
T.R. Werner, 23 lutego 2022; 19:40