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:

  1. oprogramowanie zamknięte
  2. 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:

  1. czytelność – wypracowano wiele sposobów formatowania kodu mających na celu zwiększenie jego czytelności z uwzględnieniem struktury konkretnego języka;
  2. wydajność generowanego kodu wynikowego;
  3. łatwość rozbudowy – wynika z odpowiedniej organizacji wykorzystywanych w kodzie elementów języka oraz stosowania właściwych technik programistycznych;
  4. 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
  1. Adapter (wzorzec projektowy)
  2. Algorytm Cohena-Sutherlanda
  3. Algorytm Earleya
  4. Algorytm Euklidesa
  5. Algorytm Prima
  6. Binarne drzewo poszukiwań
  7. Bogosort
  8. Brydżowe tablice prawdopodobieństwa
    1. Tabela: Brydżowe tablice prawdopodobieństwa
  9. Budowniczy (wzorzec projektowy)
  10. Ciąg Fibonacciego
    1. Tabela: Ciąg Fibonacciego
    2. Tabela: Potęgi dziesiątki w ciągu Fibonacciego
  11. Dekorator (wzorzec projektowy)
  12. Fabryka abstrakcyjna (wzorzec projektowy)
  13. Implementacja NIP
  14. Interpreter (wzorzec projektowy)
  15. Klasa abstrakcyjna
  16. Krzywa Béziera
  17. Liczby pierwsze
    1. Tabela: Liczby pierwsze
  18. LZW
  19. Mediator (wzorzec projektowy)
  20. Metoda szablonowa (wzorzec projektowy)
  21. Metoda wytwórcza (wzorzec projektowy)
  22. Most (wzorzec projektowy)
  23. Obserwator (wzorzec projektowy)
  24. Problem Collatza
  25. Prototyp (wzorzec projektowy)
  26. Przeszukiwanie w głąb
  27. Pusty Obiekt (wzorzec projektowy)
  28. Rok przestępny
  29. Serwlet
  30. Silnia
    1. Tabela: Silnia
  31. Singleton (wzorzec projektowy)
  32. Sortowanie bąbelkowe
  33. Sortowanie przez scalanie
  34. Sortowanie przez wstawianie
  35. Sortowanie szybkie
  36. Stan (wzorzec projektowy)
  37. Strategia (wzorzec projektowy)
  38. Tablica kwadratów
    1. Tabela: Tablica kwadratów
  39. Tablica liczb pierwszych i rozkładów na czynniki pierwsze
    1. Tabela: Tablica liczb pierwszych i rozkładów na czynniki pierwsze
  40. Tablica rozkładu Cauchy'ego
    1. Tabela: Tablica rozkładu Cauchy'ego
  41. Tablica rozkładu chi-kwadrat
  42. Tabela: Tablica rozkładu chi-kwadrat
  43. Tablica rozkładu F Snedecora
    1. Tabela: Tablica rozkładu F Snedecora
  44. Tablica rozkładu normalnego
    1. Tabela: Tablica rozkładu normalnego
  45. Tablica rozkładu t-Studenta
    1. Tabela: Tablica rozkładu t-Studenta
  46. Tablica rozkładów na sumę dwóch liczb pierwszych
    1. Tabela: Tablica rozkładów na sumę dwóch liczb pierwszych
  47. Tablica wartości krytycznych dla współczynnika korelacji rang Spearmana
    1. Tabela: Tablica wartości krytycznych dla współczynnika korelacji rang Spearmana
  48. Tablice świąt ruchomych
    1. Tabela: Tablice świąt ruchomych
  49. Zamiana liczb z systemu dziesiętnego na binarny
  50. Zamiana liczb z systemu dziesiętnego na dowolny
  51. Rząd w grupie multiplikatywnej
  52. Szukanie minimów metodą Brenta
  53. Metoda Dekkera
  54. Metoda Laguerre'a
  55. Metoda Laguerre'a dla pierwiastków wielokrotnych
  56. Rozwinięcie zmiennej systemowej w ścieżce
  57. Porównanie dwóch posortowanych list
  58. Tworzenie listy unikalnych elementów posortowanej listy
  59. Znajdowanie duplikatów w posortowanej liście