Kody źródłowe
Czym jest kod źródłowy
[edytuj]Kod źródłowy (ang. source code) to zapis programu komputerowego przy pomocy określonego języka programowania, opisujący operacje jakie powinien wykonać komputer na zgromadzonych lub otrzymanych danych. Kod źródłowy jest wynikiem pracy programisty i pozwala wyrazić w czytelnej dla człowieka formie strukturę oraz działanie programu komputerowego. Jest on zwykle zapisywany w pliku tekstowym, lecz może również występować w postaci fragmentów kodu opublikowanych w artykułach prasowych lub książkach.
Przed wykonaniem kod źródłowy musi zostać poddany translacji na kod wynikowy w procesie zwanym kompilacją. Polega on na konwersji kodu do postaci kodu wynikowego, najczęściej kodu maszynowego, jako jedynego możliwego do wykonania przez procesor. Inną metodą jest wykonywanie w czasie rzeczywistym („w locie”) programu zapisanego kodem źródłowym przy pomocy interpretera lub tzw. kompilatora JIT, który wykonuje kompilację fragmentów kodu na bieżąco. Określenie „wykonanie kodu źródłowego” jest równoważne wykonaniu programu stworzonego na podstawie tego kodu.
Zastosowania
[edytuj]Głównym zastosowaniem kodu źródłowego jest wyrażanie programów komputerowych w zrozumiałej postaci, dzięki czemu mogą być one łatwo rozwijane i rozbudowywane o nową funkcjonalność. Kod stanowi wtedy wejście dla procesu, którego wynikiem jest rzeczywisty program nadający się do wykonania. Kod źródłowy stanowi także jeden ze sposobów zapisu algorytmów, np. w książkach lub artykułach.
Dzięki dodatkowemu poziomowi abstrakcji wprowadzanemu przez język programowania, kod źródłowy nie musi uwzględniać wszystkich operacji potrzebnych do rozwiązania danego problemu. Pominięte kwestie mogą być rozwiązywane na etapie kompilacji lub interpretacji zależnie od platformy sprzętowej, na jakiej aktualnie pracujemy. Umożliwia to tworzenie przenośnych programów, mniej uzależnionych od konkretnego rodzaju sprzętu i oprogramowania. Bez dostępu do kodu źródłowego, przeniesienie programu na inną platformę może być bardzo złożonym, a przez to zupełnie nieopłacalnym procesem. Innym rozwiązaniem problemu przenośności jest emulacja oryginalnej platformy.
Przeglądanie cudzego kodu źródłowego jest popularną metodą podnoszenia swoich umiejętności programistycznych i poznawania nowych technik programowania. Wśród programistów traktowany jest także niekiedy jako forma sztuki (np. konkurs International Obfuscated C Code Contest).
Organizacja
[edytuj]Kod źródłowy danego oprogramowania może się składać z wielu plików zwanych często plikami źródłowymi. Nie muszą być one zapisane w jednym i tym samym języku programowania, choć nie jest to często spotykana praktyka. Przykładowo, program napisany w języku C może posiadać pewne partie napisane w asemblerze ze względów optymalizacyjnych. Możliwe jest także niezależne stworzenie i skompilowanie poszczególnych części oprogramowania i połączenie ich później. Technika ta nosi nazwę konsolidacji.
Kolejne podejście to stworzenie specjalnego programu zwanego interpreterem języka programowania, który wczytuje kod źródłowy i na bieżąco go wykonuje. Może on być zaprojektowany jako program ogólnego przeznaczenia lub część większej aplikacji umożliwiająca jej łatwe rozszerzanie o dodatkowe funkcje bez konieczności ujawniania lub zgłębiania jej wewnętrznej struktury. Przykładem takiej aplikacji jest edytor tekstu GNU Emacs.
Duże projekty mogą liczyć sobie nawet tysiące plików. Kodowi źródłowemu towarzyszą wtedy dodatkowe instrukcje (np. w postaci pliku Makefile) opisujące zależności między poszczególnymi plikami i podające przepis, jak je skompilować, aby powstał kompletny program. Do zarządzania dużymi partiami kodu źródłowego wykorzystywane są także systemy kontroli wersji.
Licencjonowanie
[edytuj]Pod względem dostępności kodu oprogramowanie wraz z towarzyszącym mu kodem źródłowym można zakwalifikować do jednej z dwóch głównych kategorii:
- oprogramowanie zamknięte
- oprogramowanie otwarte lub oprogramowanie wolne
Z oprogramowaniem zamkniętym mamy do czynienia wtedy, gdy jego kod źródłowy nie jest dostępny publicznie, a użytkownicy nabywają wyłącznie jego binarną reprezentację. Pełne korzystanie z niego jest dodatkowo ograniczone przez prawa autorskie, tajemnice handlowe czy patenty. Licencje użytkownika końcowego dołączone do takiego oprogramowania najczęściej zabraniają dekompilacji, inżynierii wstecznej, modyfikacji lub nieautoryzowanej dystrybucji.
Oprogramowanie ma charakter otwarty, gdy użytkownicy mają dostęp do kodu źródłowego oraz mogą go legalnie adaptować do własnych potrzeb i udostępniać innym własne modyfikacje. Towarzyszące oprogramowaniu licencje służą ochronie konkretnych praw użytkowników do dokonywania tych działań lecz w większości przypadków nie narzucają ograniczeń na komercyjną sprzedaż takiego oprogramowania. Pierwszą szeroko rozpowszechnioną otwartą licencją oprogramowania była GNU General Public License napisana z myślą o projekcie GNU a w późniejszym czasie zastosowania również w wielu innych projektach.
Jakość kodu
[edytuj]Struktura i organizacja kodu źródłowego jest bardzo istotna dla opiekujących się nim osób. W zależności od potrzeb jakość kodu można definiować na różne sposoby:
- czytelność – wypracowano wiele sposobów formatowania kodu mających na celu zwiększenie jego czytelności z uwzględnieniem struktury konkretnego języka;
- wydajność generowanego kodu wynikowego;
- łatwość rozbudowy – wynika z odpowiedniej organizacji wykorzystywanych w kodzie elementów języka oraz stosowania właściwych technik programistycznych;
- przenośność.
Dokumentowanie kodu
[edytuj]Oprócz rozkazów, kod źródłowy zawiera także wiele innych elementów takich, jak deklaracje funkcji czy struktury danych. W większych projektach zachodzi potrzeba udokumentowania zawartości, budowy i organizacji kodu źródłowego, ponieważ dokładne zapamiętanie wszystkich wchodzących w jego skład elementów jest zbyt czasochłonne i uniemożliwia szybkie zapoznanie się z projektem nowym członkom zespołu programistów. Podstawowym narzędziem opisywania działania kodu są umieszczone w nim komentarze ze słownym opisem w języku naturalnym, których zawartość jest ignorowana przez programy. Komentarze mogą zawierać objaśnienie, co robi dany fragment kodu, uwagi odnośnie jego użycia bądź informacje techniczne dla innych programistów (np. o znalezionych błędach albo pozostałych do zaimplementowania funkcjach).
Dokładniejsze dokumentacje mają postać osobnych dokumentów szczegółowo opisujących wszystkie elementy kodu źródłowego w pewien ustandaryzowany sposób. Opis każdego elementu sporządzony jest w języku naturalnym może zawierać odnośniki do powiązanych elementów i przykłady użycia. Programista pragnący użyć danego elementu, może go szybko odnaleźć w dokumentacji i zapoznać się ze wszystkimi dostępnymi na jego temat informacjami. Pozostałe tematy związane z budową i działaniem kodu źródłowego opracowane są najczęściej w formie klasycznych artykułów.
Istnieje szereg wyspecjalizowanych narzędzi umożliwiających tworzenie dokumentacji bezpośrednio z istniejącego kodu źródłowego, np. Doxygen. Dzięki znajomości gramatyki języka programowania, potrafią automatycznie określić wiele związków między poszczególnymi elementami. Dodatkowe informacje oraz opis są importowane ze specjalnych komentarzy umieszczonych nad każdym elementem.
Przykładowe kody źródłowe
[edytuj]- Adapter (wzorzec projektowy)
- Algorytm Cohena-Sutherlanda
- Algorytm Earleya
- Algorytm Euklidesa
- Algorytm Prima
- Binarne drzewo poszukiwań
- Bogosort
- Brydżowe tablice prawdopodobieństwa
- Budowniczy (wzorzec projektowy)
- Ciąg Fibonacciego
- Dekorator (wzorzec projektowy)
- Fabryka abstrakcyjna (wzorzec projektowy)
- Implementacja NIP
- Interpreter (wzorzec projektowy)
- Klasa abstrakcyjna
- Krzywa Béziera
- Liczby pierwsze
- LZW
- Mediator (wzorzec projektowy)
- Metoda szablonowa (wzorzec projektowy)
- Metoda wytwórcza (wzorzec projektowy)
- Most (wzorzec projektowy)
- Obserwator (wzorzec projektowy)
- Problem Collatza
- Prototyp (wzorzec projektowy)
- Przeszukiwanie w głąb
- Pusty Obiekt (wzorzec projektowy)
- Rok przestępny
- Serwlet
- Silnia
- Singleton (wzorzec projektowy)
- Sortowanie bąbelkowe
- Sortowanie przez scalanie
- Sortowanie przez wstawianie
- Sortowanie szybkie
- Stan (wzorzec projektowy)
- Strategia (wzorzec projektowy)
- Tablica kwadratów
- Tablica liczb pierwszych i rozkładów na czynniki pierwsze
- Tablica rozkładu Cauchy'ego
- Tablica rozkładu chi-kwadrat
- Tabela: Tablica rozkładu chi-kwadrat
- Tablica rozkładu F Snedecora
- Tablica rozkładu normalnego
- Tablica rozkładu t-Studenta
- Tablica rozkładów na sumę dwóch liczb pierwszych
- Tablica wartości krytycznych dla współczynnika korelacji rang Spearmana
- Tablice świąt ruchomych
- Zamiana liczb z systemu dziesiętnego na binarny
- Zamiana liczb z systemu dziesiętnego na dowolny
- Rząd w grupie multiplikatywnej
- Szukanie minimów metodą Brenta
- Metoda Dekkera
- Metoda Laguerre'a
- Metoda Laguerre'a dla pierwiastków wielokrotnych
- Rozwinięcie zmiennej systemowej w ścieżce
- Porównanie dwóch posortowanych list
- Tworzenie listy unikalnych elementów posortowanej listy
- Znajdowanie duplikatów w posortowanej liście