![](/edu/images/logo.png)
TI/Algorytm
Spis treści
TI/ Jak to działa: algorytm → kod źródłowy → program wykonywalny
Pisząc program komputerowy, chcemy stworzyć coś, co będzie zrozumiałe dla komputera, i będzie pewnego rodzaju instrukcją — dokładnym i jednoznacznym opisem tego, co komputer ma wykonywać. Programem komputerowym jest np. przeglądarka internetowa, edytor tekstów, odtwarzacz multimediów, czy też prosta aplikacja kalkulatora.
Człowiek pisze program komputerowy zgodnie z jakimś językiem programowania. Tworzy w ten sposób kod źródłowy. Chcąc, by komputer go wykonał, ma dwa wyjścia:
- skompilować go do kodu maszynowego, zrozumiałego dla komputera, czyli użyć programu, zwanego kompilatorem (tego konkretnego języka, w którym program napisano), który potrafi wczytać kod źródłowy i zgodnie z gramatyką danego języka programowania przetworzyć na kod maszynowy, który będzie tzw. "programem wykonywalnym". Żeby używać programu w takiej postaci nie potrzebujemu już kodu żródłowego. Wystarczy postać wykonywalna. Mówimy wtedy o językach programowania kompilowanych.
- użyć do wykonania napisanego przez siebie kodu "interpretera" (np. Pythona). Mówimy wtedy o językach interpretowanych. Tym, co uruchamiamy za każdym razem, jest napisany przez nas kod źródłowy, ale żeby komputer mógł go zrozumieć, używamy interpretera danego języka — programu, który analizuje kod źródłowy i od razu go wykonuje. Takie rozwiązanie jest zwykle wolniejsze i pochłania więcej zasobów, niż uruchamianie skompilowanego wcześniej kodu maszynowego, jednak do pewnych zastosowań języki interpretowane, zwane też skryptowymi, są wygodniejsze niż kompilowane. Szczególnie, gdy kod źródłowy jest często zmieniany — nie musimy za każdym razem go kompilować i uruchamiać kodu maszynowego. Tak jest np. w przypadku Pythona, którego uczycie się na ćwiczeniach. Języki skryptowe przydają się np. do zastosowań naukowo-badawczych.
Przyjrzyjmy się, co właściwie piszemy w takim kodzie źródłowym. Najczęściej jest to ciąg instrukcji, opisującym bardzo dokładnie jakiś algorytm — schemat postępowania. Na przykład algorytm otwierania drzwi mógłby wyglądać tak:
naciśnij klamkę jeśli drzwi się otworzą udało się - koniec. w przeciwnym razie włóż do zamka klucz, przekręć w lewo i naciśnij klamkę jeśli drzwi się otworzą udało się - koniec. w przeciwnym razie nie udało się - koniec.
Program komputerowy to zapis algorytmu w języku zrozumiałym dla komputera. Ten język składa się niestety z samych zer i jedynek (wyjaśnienie w następnym rozdziale) i nie jest dla ludzi wygodny w użyciu. Dlatego do pisania programów komputerowych stworzono języki programowania (Ada, C, Pascal, Fortran, Logo, Basic... Python :-) ).
Tekst programu (czyli kod źródłowy) podlega ścisłej gramatyce i ortografii danego języka — zamiana jednej litery zwykle spowoduje, że program nie będzie działał. To znaczy zwykle nawet nie da się go skompilować.
Przykład: kod źródłowy programu obliczającego silnię w języku C
#include <stdio.h>
int main()
{
long int wynik=1, liczba=1;
while (liczba < 5) {
liczba = liczba+1;
wynik = wynik*liczba;
}
printf("5! = %ld\n", wynik);
return 0;
}
Przykład: kod źródłowy programu obliczającego silnię w języku C++
#include <iostream>
using namespace std;
int main()
{
long liczba=1, wynik=1;
while (liczba < 5) {
liczba = liczba + 1;
wynik = wynik*liczba;
}
cout << "5! = "<< wynik << endl
<<"obliczone programem w C++ :-)" << endl;
}
Przykład: kod źródłowy programu obliczającego silnię w języku Java
class Silnia {
public static void main(String[] args) {
int wynik=1, liczba=1;
while(liczba<5){
liczba=liczba+1;
wynik=wynik*liczba;
}
System.out.println(wynik);
}
}
Kompilacja to zamiana kodu źródłowego na binarny (tj. zera i jedynki), wykonywalny przez komputer. Dokonuje tego program komputerowy zwany kompilatorem. Jeśli "nie zrozumie" jakiegoś słowa w kodzie źródłowym, bo np. end zamieniliśmy na edn, to po prostu odmówi kompilacji.
Niestety zdarzają się również błędy, które przechodzą przez proces kompilacji, ale powodują, że skompilowany program nie działa dokładnie według intencji autora. Takie błędy bywają trudne do wyśledzenia, szczególnie, gdy ujawniają się tylko np. w rzadko używanych funkcjach i w specyficznych sytuacjach. Mówi się o nich bugs (insekty, robaki). Nazwa pochodzi z czasów pierwszych komputerów, budowanych na lampach i zajmujących ogromne pomieszczenia. Ich programowanie polegało na przełączaniu kabelków, a zwarcia (czyli błędy) powodowały czasem ginące wśród nich ćmy.
Nawet dziś fachowcy uważają, że nie ma większych programów całkowicie wolnych od błędów. Testowanie programów (czyli wykrywanie błędów) jest co najmniej tak samo kosztowne i pracochłonne jak ich pisanie. Stąd pojawiające się często darmowe "wersje beta", czyli programy nie przetestowane do końca — ich udostępnianie wiązane jest z nadzieją, że resztę błędów znajdą użytkownicy.
Coraz większego znaczenia nabiera idea "otwartych źródeł", według której każdy użytkownik powinien mieć prawo wglądu w kod źródłowy programu, którego używa, a nawet jego modyfikacji, czyli dostosowania do własnych potrzeb. Jednak w przypadku komercyjnych programów i systemów operacyjnych kod źródłowy bywa wciąż pilnie strzeżoną tajemnicą producenta, a użytkownik dostaje wyłącznie programy wykonywalne (czyli zera i jedynki).