II.

Języki programowania i tworzenie oprogramowania

Jeden z powszechnych sposobów definiowania języka programowania to: „sztuczny język zbudowany w celu umożliwienia komuś wydawania instrukcji komputerowi". Komputery nie rozumieją angielskiego, arabskiego czy chińskiego, a nawet jeśli ludzie teoretycznie mogą nauczyć się języka binarnego (podstawowego języka komputerów), prawie nikt tego nie robi. Dlatego właśnie potrzebujemy jakiegoś pośredniego sposobu komunikacji, który nazywamy językami programowania.

Jak pokazaliśmy w rozdziale I, programiści tworzyli języki programowania i rozwiązania programowe od początków istnienia systemów komputerowych. W tym rozdziale dowiesz się, w jaki sposób rozwijały się języki programowania i co można z nimi zrobić.

Języki programowania niskiego poziomu

Dawniej, na początku istnienia komputerów, kod asemblera i kod binarny były głównymi językami komunikacji z komputerami, za pomocą których można było zażądać od nich wykonania poleceń, tłumacząc dane na jedynki i zera; binarnie.

Kod maszynowy, znany również jako język binarny, jest serią jedynek i zer, które reprezentują polecenie dla procesora komputera (CPU). Język asemblera jest znacznie łatwiejszy do odczytania niż język binarny. Assembler używa kodów mnemonicznych do odwoływania się do instrukcji kodu maszynowego, zamiast bezpośredniego używania wartości numerycznych instrukcji.

Można by pomyśleć, że te języki nie są już istotne, ponieważ są one niewidoczne dla większości użytkowników komputerów, ale rzeczywistość jest taka, że nadal używamy tych języków w naszych nowoczesnych komputerach. Są one podstawą każdego komputera. Każdy CPU może wykonywać określony zestaw instrukcji, który odpowiada marce lub strukturze danego CPU.

Ale dlaczego mielibyśmy uczyć się języków niskiego poziomu i programowania niskiego poziomu? Jest wiele powodów, w tym:

  • Niektóre części naszych systemów operacyjnych, a nawet wirusy, zostały napisane w asemblerze.

  • Jeśli chcesz pracować przy programowaniu GPU przy użyciu języków wysokiego poziomu, takich jak CUDA czy OpenCL, będziesz musiał(a) zrozumieć programowanie niskopoziomowe.

  • Jeśli chcesz doskonalić się w uczeniu maszynowym, możesz zoptymalizować swój kod, używając asemblera do efektywnego zarządzania pamięcią.

  • Jeśli chcesz dogłębnie poznać działanie systemów operacyjnych, znajomość języka asemblera będzie pomocna. Język asemblera jest zwykle używany w kodzie startowym systemu, kodzie niskiego poziomu, który uruchamia i testuje sprzęt systemowy przed uruchomieniem systemu operacyjnego.

  • Język asemblera jest przydatny w inżynierii wstecznej. Wiele programów jest dystrybuowanych tylko w postaci kodu maszynowego, który jest łatwy do przetłumaczenia na język asemblera przez dezasembler, ale trudniejszy do przetłumaczenia na język wyższego poziomu przez dekompilator.

Gdy już zobaczyliśmy,w jaki sposób i dlaczego warto dowiedzieć się więcej o językach niskiego poziomu, możemy przejść do nauki o językach wysokiego poziomu.

Przykład tłumaczenia kodu binarnego w akcji
Przykład tłumaczenia kodu binarnego w akcji

Języki programowania wysokiego poziomu

Wiemy, że komputer rozumie kod binarny, ale sami go nie rozumiemy - albo rozumie go tylko kilka osób na świecie.

Pod koniec lat 50. użytkownicy komputerów (głównie naukowcy i duże firmy) często musieli sami pisać swoje oprogramowanie. Wadą tego rozwiązania było to, że każde przedsiębiorstwo lub laboratorium musiało posiadać kogoś, kto zajmował się programowaniem komputera, a oprogramowanie było tworzone dla jednego konkretnego systemu komputerowego, co uniemożliwiało wymianę z innymi, ponieważ nie byłyby one kompatybilne. Wynaleziono kompilatory, co przyczyniło się do rozwoju języków programowania wysokiego poziomu, języków bardziej abstrakcyjnych, które są łatwiejsze do zrozumienia.

Note

Kompilator tłumaczy kod napisany w jednym języku komputerowym na inny język komputerowy.

ierwszymi językami wysokiego poziomu opracowanymi w latach 50-tych były FORTRAN, COBOL i BASIC. Pozwalały one na tworzenie programów w sposób abstrakcyjny, niezależny od dokładnych szczegółów architektury sprzętowej komputera. (Wolfram 2002).

Języki te są używane do pisania programów, które są kompletnymi i funkcjonalnymi zestawami instrukcji, wykorzystywanymi przez komputery do wykonywania zadań, takich jak ładowanie strony internetowej, generowanie analiz statystycznych czy znajdowanie sumy dwóch liczb. Kod nie jest jednak rozpoznawany bezpośrednio przez CPU. Zamiast tego musi on zostać skompilowany do języka niższego poziomu.

Ponieważ kompilacja dużego kodu może trwać bardzo długo, programiści wymyślili interpretery.

Note

Interpreter bezpośrednio wykonuje instrukcje napisane w języku programowania, nie wymagając kompilatora do skompilowania ich do programu w języku maszynowym.

Niektóre języki programowania korzystają zarówno z kompilatorów, jak i interpreterów. Jeśli napiszesz program w Javie w edytorze tekstu, to po skompilowaniu go przez kompilator Javy w rzeczywistości stworzysz coś, co nazywa się kodem bajtowym. Kod bajtowy może uchodzić za etap pośredni między kodem źródłowym a kodem obiektowym. Gdy komputer wykonuje program w Javie, programy biblioteki na tej maszynie interpretują kod bajtowy. Dzięki temu Java jest niezależna od platformy - użytkownik potrzebuje odpowiednich bibliotek do uruchamiania Javy na swojej maszynie, aby móc korzystać z programów.

Jakie są różnice między językami niskiego poziomu a językami wysokiego poziomu?

Główna różnica polega na tym, że programistom łatwiej jest zrozumieć, zinterpretować lub skompilować język wysokiego poziomu w porównaniu do języka maszynowego. Z drugiej strony, maszyny rozumieją język niskiego poziomu łatwiej niż ludzie. Przyjrzyjmy się jeszcze kilku innym różnicom:

Język wysokiego poziomuJęzyk niskiego poziomu
Język przyjazny dla programistyJęzyk przyjazny dla maszyn
Język wysokiego poziomu jest mniej wydajny pamięciowoJęzyk niskiego poziomu jest bardzo wydajny pamięciowo
Łatwiejszy do debugowaniaStosunkowo skomplikowany do debugowania
Prostszy w utrzymaniuStosunkowo skomplikowany w utrzymaniu
PrzenośnyNie przenośny
Może działać na każdej platformieZależny od maszyny
Wymaga kompilatora lub interpretera do tłumaczeniaWymaga asemblera do tłumaczenia
Powszechnie używany do programowaniaNie jest obecnie powszechnie używany w programowaniu

Pisanie własnych programów/oprogramowania

Istnieje cała dyscyplina zajmująca się tworzeniem oprogramowania (produktów) zwana inżynierią oprogramowania. Na początku dowiesz się trochę o inżynierii oprogramowania, a później o językach programowania.

Na czym polega inżynieria oprogramowania?

Kiedy myślisz o oprogramowaniu, zazwyczaj widzisz interfejs, który pozwala Ci zrobić coś na komputerze, na przykład napisać tekst. Inżynieria oprogramowania jest definiowana jako proces analizowania wymagań użytkownika (potrzeb, jakie użytkownicy mają pisząc tekst) w celu zbudowania odpowiedniego oprogramowania (produktu). Następnie chodzi o zaprojektowanie, zbudowanie i przetestowanie aplikacji, która spełni te wymagania.

Przykład

Przyjrzyjmy się różnym definicjom inżynierii oprogramowania:

  • IEEE w swoim standardzie 610.12-1990 definiuje inżynierię oprogramowania jako zastosowanie systematycznego, zdyscyplinowanego, obliczeniowego podejścia do rozwoju, eksploatacji i utrzymania oprogramowania.

  • Fritz Bauer zdefiniował ją jako "ustanowienie i stosowanie standardowych zasad inżynierii. Pomaga to uzyskać, w sposób ekonomiczny, oprogramowanie, które jest niezawodne i działa wydajnie na rzeczywistych maszynach."

  • Boehm definiuje inżynierię oprogramowania jako obejmującą "praktyczne zastosowanie wiedzy naukowej do twórczego projektowania i budowania programów komputerowych". Obejmuje to również związaną z tym dokumentację potrzebną do ich rozwijania, obsługi i konserwacji."

Ale czy do inżynierii oprogramowania potrzebne jest coś więcej niż tylko kodowanie?

Tak, do stworzenia oprogramowania potrzeba wielu kroków, zarówno przed, jak i po kodowaniu. Nazywamy to Cyklem Życia Rozwoju Oprogramowania (SDLC, Software Development Life Cycle) i jest on podzielony na dobrze zdefiniowaną sekwencję etapów, która czyni proces projektowania i rozwoju wydajnym. Etapy te są następujące:

  • Komunikacja jest pierwszym krokiem. Zazwyczaj potencjalny klient firmy produkującej oprogramowanie zgłasza zapotrzebowanie na potrzebny produkt.

  • Zbieranie wymagań polega na próbie uzyskania jak największej ilości informacji na temat wymagań klienta.

  • Studium wykonalności polega na tym, że zespół wymyśla przybliżony plan procesu tworzenia oprogramowania.

  • Analiza systemu polega na tym, że zespół projektowy analizuje zakres projektu i odpowiednio planuje harmonogram i zasoby.

  • Projektowanie oprogramowania odbywa się wtedy, gdy zespół wykorzystuje wiedzę z etapów wymagań oraz analizy i faktycznie projektuje produkt, który jest oprogramowaniem.

  • Etap kodowania lub programowania to moment, w którym zespół zaczyna pisać kod programu w odpowiednim języku programowania i efektywnie rozwija wolne od błędów programy wykonawcze.

  • Testowanie jest istotną częścią procesu, pozwalającą na wykrycie i usunięcie potencjalnych błędów.

  • Etap integracji jest potrzebny, jeśli oprogramowanie ma integrować się z zewnętrznymi jednostkami, takimi jak bazy danych lub inne programy.

  • Etap wdrożenia to moment, w którym nowe oprogramowanie jest gotowe i faktycznie zainstalowane na komputerach użytkowników.

  • Eksploatacja i konserwacja polega na potwierdzeniu sprawności oprogramowania w warunkach rzeczywistych. Ewentualne błędy zostają sprawdzone i naprawione.

Programowanie kaskadowe kontra programowanie zwinne

Wszystkie powyższe etapy lub czynności w SDLC mogą być wykonywane w różnej kolejności, zgodnie z różnymi podejściami. Ponadto, różne podejścia poświęcają więcej lub mniej czasu na poszczególne etapy SDLC. Etapy te mogą być wykonywane po kolei, jak w modelu kaskadowym lub mogą być powtarzane w różnych iteracjach, które kładą nacisk na przyrostowe dostarczanie oprogramowania, jak w modelu zwinnym.

Stos nazw języków oprogramowania
Stos nazw języków oprogramowania

Tradycyjne metody rozwoju oprogramowania wykorzystują to, co znane jest jako programowanie kaskadowe. Zanim aktualizacje oprogramowania mogły być w łatwy sposób pobierane z Internetu lub automatycznie wdrażane w Internecie, proces programowania kaskadowego został zaprojektowany tak, aby można było sprawdzić oraz zapewnić, że kiedy program zostanie wysłany do klienta, będzie on zawierał wszystkie wymagane funkcje, a wszystkie znane problemy będą przetestowane i rozwiązane do czasu wydania kolejnej wersji programu. Proces ten jest obarczony wysokim ryzykiem i jest czasochłonny, ponieważ testowanie produktu odbywa się na końcu, po tym jak programiści i projektanci spędzili ogromną ilość czasu na projektowaniu i budowaniu całego programu. Ten rodzaj procesu rozwoju faworyzuje również wydajność inżynieryjną kosztem doświadczeniem użytkownika końcowego, co może prowadzić do problemów nieprzewidzianych przez inżynierów, powodując frustrację klientów końcowych, którzy nie są zaangażowani w proces rozwoju po wstępnym badaniu wymagań. Ta frustracja użytkownika końcowego może skutkować potencjalnie utraconym zyskiem lub kosztownymi zmianami.

Zwinne programowanie to nowoczesna najlepsza praktyka współpracy przy tworzeniu oprogramowania pomiędzy zespołami i klientami, polegająca na ciągłym planowaniu, uczeniu się i komunikacji w celu dostarczenia oprogramowania stopniowo, zamiast dostarczania wszystkiego naraz na koniec projektu. Użytkownicy końcowi (osoby, które będą faktycznie korzystać z oprogramowania) znajdują się w centrum projektowania wymagań i funkcji, a także są proszeni o przetestowanie ich małymi krokami w trakcie trwania projektu. W ten sposób, jeśli pojawi się błąd w procesie, na podstawie którego produkt został zaprojektowany, można natychmiast, przed przystąpieniem do dalszych prac, wprowadzić poprawki. Rozbicie procesu na mniejsze części oraz ciągłe testowanie i integrowanie funkcji oprogramowania partiami zmniejsza ryzyko inwestycji w programowanie i przyspiesza przekazanie oprogramowania użytkownikom.

Teraz, gdy poznaliśmy już cały proces tworzenia oprogramowania, wrócimy do kodowania i języków programowania.

Note

Jak już wiesz, większość programów komputerowych jest napisana w języku programowania wysokiego poziomu; jednakże wersja programu czytelna dla człowieka jest nazywana kodem źródłowym. Ty i programista możecie tworzyć i edytować kod źródłowy w języku wysokiego poziomu za pomocą oprogramowania IDE lub nawet zwykłego edytora tekstu.

Czym jest oprogramowanie IDE?

Oprogramowanie IDE to skrót od angielskiego terminu "integrated development environment" (zintegrowane środowisko programistyczne) i jest to aplikacja, której programiści używają do tworzenia programów komputerowych. W tym przypadku termin "zintegrowane" odnosi się do sposobu, w jaki wiele narzędzi do programowania jest połączonych w jeden program. Na przykład, typowe IDE zawiera edytor kodu źródłowego, debugger i kompilator. Większość aplikacji IDE udostępnia również interfejs projektu, który pozwala programistom śledzić wszystkie pliki związane z projektem. Wiele z nich obsługuje również kontrolę wersji.

Niektóre aplikacje IDE udostępniają "środowisko uruchomieniowe" (RTE) do testowania programów. Kiedy program jest uruchamiany w RTE, programista może śledzić każde zdarzenie, które ma miejsce w testowanej aplikacji. Może to być przydatne do znajdowania i naprawiania błędów oraz lokalizowania źródeł wycieków pamięci. Ponieważ aplikacje IDE zapewniają scentralizowany interfejs użytkownika do pisania kodu i testowania programów, programista może szybko wprowadzić zmiany, przekompilować program i uruchomić go ponownie. Programowanie to nadal ciężka praca, ale oprogramowanie IDE pomaga usprawnić proces tworzenia oprogramowania.

Istnieje niewiarygodna liczba języków programowania komputerów, które są używane przez koderów, programistów oprogramowania, programistów stron internetowych i innych specjalistów z dziedziny informatyki. Ale ile ich jest naprawdę?

Według Wikipedii istnieje około 700 języków programowania, wliczając w to ezoteryczne języki kodowania. Inne źródła, które wymieniają tylko godne uwagi języki, podają nadal imponującą liczbę 245 języków. Inna lista zwana HOPL, która podobno zawiera każdy język programowania, jaki kiedykolwiek istniał, podaje całkowitą liczbę 8945. Niektórzy szacują, że jest ich nawet 25 000.

Ale jak wybrać język programowania do nauki? I czy rzeczywiście można nauczyć się kodować? Odpowiedź brzmi: tak! Można, a wręcz warto, ponieważ zapotrzebowanie na umiejętność kodowania w różnych zawodach jest coraz większe.

Carlcheo stworzyło przydatną infografikę, która ma nam pomóc w wyborze języka programowania do nauki oraz ukazuje dobry punkt wyjścia do nauki niektórych z wymienionych języków.

  • Jeśli chcesz, aby Twoje dzieci nauczyły się języka, polecamy Scratch, a kiedy już się go nauczycie, polecamy przejście do języka Python.

  • Jeśli chcesz nauczyć się języka, aby dostać pracę w Facebooku lub Google, najlepszym wyborem może być Python. Tak się składa, że Python jest świetnym językiem do wyboru w ogóle, ponieważ jest uważany za język, którego można relatywnie łatwo się nauczyć.

  • Jeśli chcesz nauczyć się "łatwego" języka, według programistów możesz wybrać Python, Ruby i JavaScript. Te języki mogą zapewnić Ci solidne podstawy w zakresie logiki programowania i składni. A gdy już będziesz miał(a) solidne podstawy, każdy kolejny język będzie łatwiejszy do opanowania.

  • Jeśli chcesz tworzyć gry, C++ będzie najlepszym wyborem.

  • Jeśli chcesz kodować na stosunkowo niskim poziomie, C i C++ są najlepszym wyborem, ponieważ zazwyczaj są one kompilowane bezpośrednio do języka maszynowego używanej platformy. Ponadto C i C++ pozwalają na pisanie w sposób, który jest dość zbliżony do większości kodów maszynowych (inkrementacja wskaźników, itp.). Rust jest językiem nowszym w tej przestrzeni.

  • Jeśli chcesz pracować nad projektami dla iPhone'a, a więc projektami związanymi z iOS, twój wybór powinien paść na Swift.

  • Jeśli chcesz pracować nad projektami związanymi z Androidem, wybierz Javę lub Kotlin.

  • Jeśli pociąga Cię piękno stron internetowych, są duże szanse, że zainteresuje Cię nauka kodu skierowanego do użytkownika (front-end web development), a Twoim językiem wyboru będzie JavaScript.

  • Jeśli interesują Cię serwery (back-end web development) i bazy danych, Twoim językiem może być Ruby lub Python.

  • Jeśli wiesz już która dziedzina technologii Cię interesuje, będziesz wybierać między front-endem a back-endem.

I nasza ostatnia rada: Ponieważ istnieją setki opcji wyboru języka, dobrze jest zadać sobie dwa kluczowe pytania przed dokonaniem wyboru.

  • Co sprawiło, że interesujesz się programowaniem?

  • Co chcesz robić jako programista?

Jest wiele możliwości rozwoju karierę. Wykorzystaj pierwszy język, aby nauczyć się myśleć jak programista i poznać podstawową logikę programowania. I nie zapominaj, że uczenie się przez całe życie jest niezbędne, aby nadążyć za trendami językowymi i technologicznymi.

Next section
III. Zrozumienie i korzystanie z oprogramowania na naszych urządzeniach