Cześć!
Wiemy już, że chcemy programować i jakie języki są przydatne. W tym poście chciałbym opisać jak możemy podzielić znane nam języki programowania.
Głównym podziałem jest na te, które są kompilowane oraz interpretowane. Kompilacja polega na przetłumaczeniu naszego kodu na ciąg bitów, jak w C++ lub na język pośredni, jak w Javie lub C#.
Proces kompilacji w C++ rozrysowany jest poniżej:
Wiemy już, że chcemy programować i jakie języki są przydatne. W tym poście chciałbym opisać jak możemy podzielić znane nam języki programowania.
Głównym podziałem jest na te, które są kompilowane oraz interpretowane. Kompilacja polega na przetłumaczeniu naszego kodu na ciąg bitów, jak w C++ lub na język pośredni, jak w Javie lub C#.
Proces kompilacji w C++ rozrysowany jest poniżej:
Interpretowane języki programowania (np. Python, PHP) sprawdzane i wykonywane są linijka po linijce. Błędy wychwytywane są dopiero po wykonaniu danej linii programu, co sprawia, że wcześniejsza część skryptu zostanie wykonana np. brak dołączonej biblioteki wykrywany jest dopiero podczas przetwarzania linijki, gdzie element danej biblioteki jest używany. W przypadku kompilacji taka sytuacja nie może mieć miejsca, ponieważ zarówno składnia, jak i dostępność bibliotek sprawdzana jest przed wygenerowaniem i odpaleniem programu.
Oba te rozwiązania mają swoje wady i zalety. Odpalając program kompilowany mamy pewność, że jest z nim wszystko ok, przynajmniej jeśli chodzi o składnie, bo sensu waszego kodu kompilator nie jest w stanie sprawdzić. W przypadku języków skryptowych zaletą jest to, że nawet w programie z błędem, przynajmniej jego część się wykona. Niestety, jeśli nie zapisujemy na bieżąco wyników obliczeń może nas spotkać niemiła niespodzianka. Ostatnio uruchomiłem skrypt badający podobieństwo cosinusowe dokumentów. Wykonywał się całą noc i... okazało się zrobiłem literówkę w instrukcji zapisującej wyniki do pliku...
Kompilacja do kodu maszynowego (C++) zapewnia najwyższą wydajność programów (co wspominałem w drugim poście), jednak kod jest powiązany z platformą sprzętową, jak np. użyty kompilator. Języki interpretowane zapewniają przenośność programów, które są niezależne od platformy i systemu operacyjnego. Programy w języku interpretowanym można uruchomić na prawie każdej platformie, wystarczy posiadać dla niej interpreter. Jednak taki sposób wykonywania jest mniej wydajny. Alternatywą jest kompilacja programów do postaci pośredniej, tzw. kodu bajtowego (C#, Java). Jest ona wykonywana przez wirtualne maszyny tłumaczące elementarne rozkazy kodu bajtowego na rozkazy procesora.
Dodatkowym podziałem może być na języki typowane statycznie i dynamicznie.
Typowanie statyczne oznacza, że każda stała i zmienna w programie musi mieć swój typ. Mechanizm ten pozwala kontrolować co i w jakim formacie przechowujemy w programie, wymaga jednak używania konwersji typów (czasem kłopotliwej):
1: int piec = 5;
2: string piec_napis = "5";
3: if (piec==atoi(piec_napis))
4: {
5: cout<<"konwersja dziala!";
6: }
ale:
1: int liczba = 1;
2: liczba = "1"; // błąd podczas kompilacji, ponieważ '1' to typ tekstowy (string), zatem nie jest liczbą (int)
3:
Nietypowany (lub dynamicznie typowany) język programowania wygląda tak (na przykładzie PHP):
1: $a = "ala";
2: $a = 4;
3: var_dump($a);
Typowanie słabe jest to mechanizm zmiany typu zmiennej, jeśli program tego wymaga:
1: $liczba = 1;
2: if ("1" == $liczba) {
3: // mimo porównywania z tekstem, warunek jest prawdziwy, ponieważ liczba jest rzutowana na typ string
4: }
W PHP od wersji 5 wprowadzono type hinting. Jest to mechanizm zapobiegający błędom w przekazywaniu danych i ich konwersji, po przez "podpowiadanie" jakiego typu zmiennej spodziewa się metoda np.:
1: <?php 2: \ 3: class moja_klasa { 4: public $hello= 'Hi!'; 5: } 6: /** 7: * Funkcja testowa: 8: * 9: * Parametr musi być obiektem (mieć typ) moja_klasa 10: */ 11: function test(moja_klasa $m) { 12: echo $m->hello; 13: } 14: $klasa1= new moja_klasa; 15: test($moja_klasa); 16: ?>
Kolejną płaszczyzną jaką możemy podzielić języki to wysoki bądź niski poziom.
Języki wysokiego poziomu oferują składnie zbliżoną do języka naturalnego:
int element = Convert.ToInt(lista.ElementAt(5));
Nawet nie znając składni konkretnego języka możemy wywnioskować, co oznacza dany fragment kodu, podczas gdy w przypadku języka niskiego poziomu, jak Assembler, może być to trudne:
LOAD 1
ADD =1
JMPZ etykieta
STORE 2
Ostatnim podziałem jaki chciałem omówić, jest wpierany paradygmat programowania. Paradygmat do zestaw cech i punkt widzenia programisty na przechowywanie zmiennych, przepływ sterowania itp.
Język Java, czy C# związany jest ściśle z paradygmatem programowania obiektowego. Haskell natomiast jest językiem funkcyjnym. Paradygmat ten zakasuje funkcjom żadnych interakcji z programem, czy systemem operacyjnym poza zwracaniem wartości operacji. Niedopuszczalne jest np. manipulowanie zmiennymi globalnymi.
Dziękuję za uwagę :). Nadal przypominam, że do programowania niezbędna jest znajomość zaawansowanej matematyki:


Jak dla mnie osobiście najlepiej programuje się w języku PHP stosując DPO czyli obiektowe programowanie. Zapytania np. do bazy MYSQL są o wiele łatwiejsze i fajnie można ominąć SQL Injection. Jesli programujemy jak https://craftware.pl to skupmy się przede wszystkim na przejrzystości kodu oraz jego bezpieczeństwie. Jeśli ktoś znajdzie lukę w naszym kodzie, to niestety ale może ją wykorzystać w bardzo brzydki sposób. Tyczy to się wszystkich języków programowania.
OdpowiedzUsuńJak najbardziej samo pisanie programów już świadczy o tym, że znamy się na rzeczy. Osobiście na ten moment rozważam to aby mieć firmową stronę internetową. Jak czytałem na stronie https://ibytow.pl/pl/651_materialy_partnera/2948_strona-internetowa--kluczowy-element-budowania-wizerunku-w-sieci.html to jak najbardziej jest to znakomity ruch wizerunkowy.
OdpowiedzUsuń