Programowanie komputerowe

Programu , znany również jako kodowanie w dziedzinie komputerów, to zbiór działań, które umożliwiają pisanie programów komputerowych . Jest to ważny etap w rozwoju oprogramowania (nawet hardware ).

Pisanie programu odbywa się w języku programowania . Oprogramowanie to zestaw programów (które mogą być napisane w różnych językach programowania) przeznaczonych do wykonywania określonych zadań przez jednego (lub więcej) użytkowników oprogramowania.

Programowanie tutaj reprezentuje zatem pisanie kodu źródłowego oprogramowania. Terminu rozwoju używa się raczej na określenie wszystkich czynności związanych z tworzeniem oprogramowania i programów, które je tworzą. Obejmuje to specyfikację oprogramowania, jego konstrukcję, następnie jego faktyczną implementację w sensie pisania programów w dobrze zdefiniowanym języku programowania, sprawdzanie jego poprawności itp.

Historia

Pierwszy programowalny automat (czyli maszyn, których ewentualne zmiany podczas modyfikacji programu) jest prawdopodobnie krosno z żakardowych , który został ukończony w 1801 roku . W maszynie zastosowano serię pudełek perforowanych. Otwory wskazywały na wzór, po którym krosno wykonało splot  ; przy użyciu różnych kart krosno wytwarzało różne sploty. Ta innowacja została następnie udoskonalona przez Hermana Holleritha dla IBM w celu opracowania słynnej karty Punch Card dla IBM .

W 1936 roku opublikowanie artykułu założycielskiego informatyki On Computable Numbers with an Application to the Entscheidungsproblem autorstwa Alana Turinga zapoczątkowało tworzenie programowalnego komputera. Zaprezentował swoją maszynę Turinga , pierwszy uniwersalny komputer programowalny i wynalazł pojęcia i terminy programowania i programu .

Pierwszy programu z komputera przeprowadzano z lutownicą i dużą liczbę rurek próżniowych (Później, tranzystorów ). W miarę jak programy stawały się coraz bardziej złożone, stało się to prawie niemożliwe, ponieważ pojedynczy błąd sprawiał, że cały program był bezużyteczny. Wraz z rozwojem nośników danych , stało się możliwe ładowanie programu z kart perforowanych , zawierających listę instrukcji w kodzie binarnym specyficznym dla danego typu komputera. Wraz ze wzrostem mocy komputerów były one wykorzystywane do tworzenia programów, programiści naturalnie woleli pisać tekst, a nie ciągi zer i jedynek, pod warunkiem, że komputer sam wykona tłumaczenie.

Z czasem pojawiły się nowe języki programowania , przez co coraz częściej ignorujemy sprzęt, na którym powinny się uruchamiać programy . Daje to kilka korzyści: te języki są łatwiejsze do nauczenia, programista może szybciej tworzyć kod , a produkowane programy mogą działać na różnych typach maszyn .

Przykładowy program

Zdecydowana większość programów uruchamianych na naszych komputerach, telefonach i innych narzędziach elektronicznych jest napisana w tak zwanych imperatywnych językach programowania: wiersze programu są wykonywane jedna po drugiej. Każda linia programu albo wykonuje prostą operację, albo wykonuje funkcję, która sama w sobie jest serią prostych operacji.

W „  Hello World!  Jest tradycyjnie pierwszym programem napisanym przez wszystkich programistów. Jedyną funkcją programu jest wyświetlanie "Hello World!" do swojego użytkownika.

Oto wersja „  Witaj świecie!”  ":

Poniższy program napisany w języku Java (nieco uproszczony i do którego dodano komentarze), po prostu prosi użytkownika o wpisanie dwóch liczb całkowitych i wyświetla ich iloraz.

void main() { // fonction 'main' : c'est toujours ici qu'un programme Java commence // 'int' signifie integer : nombre entier en anglais int A, B; // on déclare deux variables A et B qui sont des nombres entiers WriteLine("entrez deux entiers : "); // 'WriteLine' permet d'écrire à l'écran A = ReadIntFromKeyboard(); // on attend que l'utilisateur tape un entier au clavier, // et on l'enregistre dans A B = ReadIntFromKeyboard(); // puis on fait la même chose pour B if (B == 0) { // si B est égal à 0 WriteLine("erreur : division par zéro"); } else { // sinon float C = CalculerDivision(A,B); // on exécute la fonction 'CalculerDivision' // que l'on a programmée ci-dessous, // et on enregistre le résultat dans C qui est un 'float' : un nombre à virgule WriteLine("le résultat est : " + C); // on affiche C } } float CalculerDivision(float U, float V) { // U et V sont les paramètres de notre fonction 'CalculerDivision' : ce sont des nombres à virgules (float). // et celle-ci renvoie un 'float' : un nombre à virgule flottante // dans la fonction 'main', A et B étaient des nombres entiers, // U et V sont des copies des valeurs de A et B, // et qui ont été converties en nombres à virgule (22 deviendrait simplement 22.0000000) float Resultat; Resultat = U / V; // on effectue la division return Resultat; /// on renvoie le résultat }

W programie tym wykorzystywane są główne funkcjonalności programowania imperatywnego: zmienne typu integer , liczba zmiennoprzecinkowa , ciąg znaków , funkcja obliczająca wynik z parametrów, funkcja realizująca zadanie np. wyświetlenie komunikatu do użytkownika screen, ifwykonanie instrukcji możliwe jest wykonanie kodu lub innego kodu zgodnie z wartością takiej lub takiej zmiennej.

W typowym programie komputerowym można znaleźć, w zależności od języka, pętle whilelub forumożliwiające wykonanie fragmentu kodu w pętli lub po prostu określoną liczbę razy, newdo dynamicznej alokacji danych (na przykład tablice) oraz bardzo często elementy programowania obiektowego w celu innej struktury kodu i tworzenia niestandardowych typów danych lub wyjątków w celu łatwiejszej obsługi niektórych przypadków błędów.

Zwróć uwagę, że do wykonania bardzo prostego zadania, kod komputerowy może być bardzo pracochłonny i tutaj znowu nie mamy do czynienia z błędami (jeśli użytkownik wpisze słowo zamiast liczby), a wyświetlacz jest minimalistyczny. Dlatego języki programowania nigdy nie przestały ewoluować, aby pomóc programiście, który chce tworzyć programy, które są szybkie w działaniu, bezawaryjne, a przede wszystkim łatwe do napisania, przynajmniej w jak największym stopniu.

Fazy

Projekt

Faza projektowania określa cel programu. Jeśli przeprowadzamy szybką analizę funkcjonalną programu, zasadniczo określamy dane, które będzie przetwarzał (dane wejściowe), zastosowaną metodę (zwaną algorytmem ) oraz wynik (dane wyjściowe). Dane wejściowe i wyjściowe mogą mieć bardzo zróżnicowany charakter. Metodę wykorzystaną do osiągnięcia celu programu można opisać za pomocą algorytmu. Programowanie proceduralne i funkcjonalne jest oparte na algorytmach . Zasadniczo znajdujemy te same podstawowe funkcje.

Programowanie imperatywne "Tak" Si prédicat Alors faire ceci Sinon faire cela "Tak długo jak" Tant que prédicat Faire ... "Dla" Pour variable allant de borne inférieure à borne supérieure Faire ... „Dla” (wariant) Pour variable dans conteneur faire ...

Realizacja

Po zdefiniowaniu algorytmu następnym krokiem jest zakodowanie programu. Kodowanie zależy od architektury, na której program będzie działał, od kompromisów pamięci czasu i innych ograniczeń. Te ograniczenia określą, którego języka programowania użyć do „przekształcenia” algorytmu w kod źródłowy.

Transformacja kodu źródłowego

Kod źródłowy (prawie) nigdy nie nadaje się do użytku w takim stanie, w jakim jest. Zwykle jest napisany w języku "wysokiego poziomu", zrozumiałym dla ludzi, ale nie dla maszyn.

Kompilacja

Niektóre języki to tak zwane języki skompilowane. Najogólniej mówiąc, kompilacja to operacja polegająca na przekształceniu języka źródłowego na język docelowy. W przypadku programu kompilator przekształci cały tekst reprezentujący kod źródłowy programu w kod zrozumiały dla maszyny, zwany kodem maszynowym .

W przypadku tzw. języków kompilowanych to, co jest wykonywane, jest wynikiem kompilacji. Po zakończeniu wynikowy plik wykonywalny może być używany bez kodu źródłowego.

Należy również zauważyć, że wynikiem kompilacji niekoniecznie jest kod maszynowy odpowiadający maszynie rzeczywistej, ale może być kodem rozumianym przez maszynę wirtualną (czyli program symulujący maszynę), o czym będziemy mówić kod bajtowy . Tak jest na przykład w Javie . Zaletą jest to, że w ten sposób program może działać na dowolnej rzeczywistej maszynie, o ile istnieje dla niego maszyna wirtualna.

W przypadku zapytania SQL zapytanie jest kompilowane do wyrażenia przy użyciu operatorów algebry relacyjnej. To wyrażenie jest oceniane przez system zarządzania bazą danych.

Interpretacja

Inne języki nie wymagają specjalnej fazy kompilacji. Metoda używana do uruchomienia programu jest wtedy inna. W większości przypadków faza kompilacji jest zawarta w fazie wykonania. Mówi się, że ten program interpretuje kod źródłowy. Na przykład Python lub Perl są językami interpretowanymi.

Zalety wady

Ogólnie rzecz biorąc, zalety używania języków „skompilowanych” polegają na tym, że są one wykonywane szybciej niż języki interpretowane, ponieważ interpreter musi być uruchamiany przy każdym uruchomieniu programu, co systematycznie mobilizuje zasoby.

Tradycyjnie języki interpretowane oferują natomiast pewną przenośność (możliwość korzystania z kodu źródłowego na różnych platformach), a także łatwość pisania kodu. Rzeczywiście, nie jest konieczne przechodzenie przez fazę kompilacji, aby przetestować kod źródłowy. Nie jest również konieczne posiadanie innego programu ( debugger ) w celu usunięcia błędów z programu, jest to interpreter, który pozwala bezpośrednio wyświetlić zawartość zmiennych programu.

Niewłaściwa nazwa

Należy zauważyć, że niewłaściwie mówimy o językach kompilowanych lub interpretowanych. Rzeczywiście, znak kompilowany lub interpretowany nie zależy od języka, który ostatecznie jest tylko gramatyka i pewna semantyka. Co więcej, niektóre języki mogą być interpretowane lub kompilowane. Na przykład bardzo często używa się Rubiego z interpreterem, ale istnieją również kompilatory dla tego języka. Należy jednak pamiętać, że może być ważne określenie sposobu wykonania kodu źródłowego. Rzeczywiście, rzadko zdarzają się organizacje, które proponują jednocześnie kompilator i interpreter, wyniki programu mogą się różnić podczas wykonywania, nawet jeśli standard języka jest jasno określony.

Niemniej jednak użycie języków jest na ogół ustalone.

Test programu

To jeden z najważniejszych kroków w tworzeniu programu. W zasadzie każdy programista powinien sprawdzać każdą część programu, testować go. Istnieją różne rodzaje testów. Możemy przytoczyć w szczególności:

Należy zauważyć, że czasami można zweryfikować program komputerowy, czyli mniej lub bardziej automatycznie udowodnić, że posiada określone właściwości.

Ćwiczyć

Paradygmaty

Paradygmat to podstawowy styl programowania , określający sposób formułowania programów.

Paradygmat to sposób rozwiązywania problemów i podstawowy styl programowania, określający sposób formułowania programów. Każdy paradygmat wnosi swoją filozofię programowania; gdy programista wyobrazi sobie rozwiązanie zgodnie z określonym paradygmatem, język programowania zgodny z tym paradygmatem pozwoli na jego wyrażenie.

Programowanie imperatywne

Najbardziej rozpowszechniony jest paradygmat imperatywny, operacje są serią instrukcji wykonywanych przez komputer w celu zmiany stanu programu .

Programowanie proceduralne

Programowanie proceduralne jest podzbiorem programowania imperatywnego. Wprowadza pojęcie rutyny lub funkcji, która jest rodzajem faktoryzacji kodu, każda procedura może być wywołana na dowolnym etapie programu . Ten paradygmat pozwala również na tłumienie stwierdzeń goto go.

Ten paradygmat jest bardzo rozpowszechniony, występuje w językach takich jak C , COBOL czy FORTRAN .

Programowanie strukturalne

Programowanie strukturalne, które pojawiło się w latach 70. , jest podzbiorem programowania imperatywnego. Pochodzi z pracy Nicklausa Wirtha w jego przełomowym artykule Algola W i Dijkstry w Communications of the ACM , mającym na celu stłumienie oświadczenia goto .

Wszystkie języki proceduralne mogą wykonywać programowanie strukturalne, ale niektóre, takie jak FORTRAN, są bardzo słabe.

Programowanie deklaratywne

W programowaniu deklaratywnym program jest niezależny od stanu maszyny , dlatego jest wolny od skutków ubocznych, a wywołanie tej samej funkcji zawsze da ten sam wynik.

Program nie jest napisany jako seria instrukcji do rozwiązania problemu, ale (w przeciwieństwie do programowania imperatywnego ) jako rozwiązanie problemu.

Programowanie funkcjonalne

Programowanie funkcjonalne opiera się na kilku zasadach takich jak: niezmienność , czyste funkcje (które nie zależą od stanu maszyny) oraz rachunek lambda .

Obecnie istnieje wiele języków oferujących możliwość funkcjonalnego podejścia do programu. Niektóre, jak LISP czy Scala, są tam od czasu ich powstania. Inne, takie jak JavaScript , Java czy PHP, następnie dodały narzędzia pozwalające na bardziej funkcjonalne podejście.

Programowanie logiczne

Programowanie logiczne polega na wyrażaniu problemów i algorytmów w postaci predykatów z bazą złożoną z podstawowych reguł i silnika wnioskowania .

Programowanie obiektowe

Programowanie obiektowe (w skrócie OOP) polega na definicji i interakcji cegieł programowych zwanych obiektami  ; obiekty te reprezentują koncepcję, ideę. Każdy obiekt zawiera atrybuty i metody związane z tematem.

Programowanie zorientowane na prototypy

Programowanie zorientowane na prototypy jest podzbiorem programowania obiektowego. W tym paradygmacie każdy obiekt jest tworzony z prototypu, który sam jest obiektem. Prototyp zatem istnieje fizycznie w pamięci i jest zmienny w przeciwieństwie do klas.

JavaScript The Lua lub Własna są przykładami języków wykorzystujących ten paradygmat.

Programowanie klasowe

Programowanie klasowe opiera się na pojęciu klas . Klasa jest statyczna, jest abstrakcyjną reprezentacją obiektu , na tym poziomie przechodzi dziedziczenie . Każdy obiekt jest zatem instancją klasy.

Języki klasowe mogą występować w formie funkcjonalnej ( CLOS ) jak i imperatywnej ( C++ , Java ) lub obu ( Python , OCalm ).

Inne paradygmaty

Uwagi i referencje

  1. „Aby uniknąć tego wieloznacznego zamieszania, czasami używa się terminów alternatywnych, takich jak kod lub kodowanie, ale programowania komputerowego nie można zredukować do kodu”. Por. Margarida Romero, Benjamin Lille i Azeneth Patiño, Kreatywne wykorzystanie technologii cyfrowych do nauki w XXI wieku , PUQ,2017, 190  s. ( przeczytaj online ).
  2. „  Model: Original Jacquard craft  ” , w Muzeum Sztuki i Rzemiosła (dostęp 20 grudnia 2020 r. )
  3. (en-US) „  IBM100 - The IBM Punched Card  ” , pod adresem www-03.ibm.com ,7 marca 2012(dostęp 20 grudnia 2020 r. )
  4. (w) Alan Turing, O liczbach obliczalnych, z zastosowaniem do problemu decyzyjnego: Proceedings of the London Mathematical Society , London Mathematical Society,1937( DOI  10.1112/PLMS/S2-42.1.230 , przeczytaj online )oraz „  [ idem ]: Korekta  ”, proc. Londyn Matematyka. Soc. , 2 nd Series, tom.  43,1938, s.  544-546 ( DOI  10.1112 / plms / s2-43.6.544 , przeczytaj online )
  5. (pl) XRuby
  6. Oryginalny tekst w EW Dijkstra, „  Idź do oświadczenia uważane za szkodliwe  ”, Komunikaty ACM , tom.  11 N O  3,Marzec 1968, s.  147-14 ( czytaj online )
  7. „  Przejdź do oświadczenia uważane za szkodliwe  ” [PDF] , na Uniwersytecie w Teksasie

Zobacz również

Powiązane artykuły

Linki zewnętrzne