Spis treści Skorowidz Poziom główny Poziom nadrzędny Poprzednia galeria Następna galeria

Przykłady języków programowania

Języki niskiego poziomu

Binarny kod wykonywalny

Kod binarny jest ostatecznym efektem kompilacji. Pobieranie kodu wykonywalnego pochodzącego z nieznanych źródeł i dopuszczenie do jego wykonania istotnie narusza bezpieczeństwo systemu: nie wiemy co robi taki program i nie umiemy tego sprawdzić.

Z kodem binarnym dostarczonym w postaci wykonywalnej spotykamy się na codzień jako użytkownicy programów; na ogół nie ma żadnej potrzeby, by analizować zawartość pliku wykonywalnego.

Kod wykonywalny w formacie ELF Kod wykonywalny w formacie EXE/PE
[ plik binarny programu ] [ plik binarny programu ]
Kod wykonywalny Java Kod wykonywalny Python
[ plik binarny programu ] [ plik binarny programu ]

Assembler, czyli symboliczny język wewnętrzny procesora komputerowego

Assembler jest symbolicznym odpowiednikiem języka maszynowego: kody liczbowe odpowiadające operacjom i adresom danych są w nim zastąpione tekstowymi nazwami.

W czasach, kiedy kompilatory nie istniały, algorytmy kodowano bezpośrednio w języku maszynowym. Ile było z tym roboty: wystarczy porównać kod assemblerowy z kodem źródłowym języka wysokiego poziomu.

Umiejętnie napisany program assemblerowy może działać wielokrotnie szybciej od równoważnego programu wygenerowanego przez kompilator. Jednak ze względu na fakt, że kod assemblerowy musi być napisany osobno dla każdego typu procesora, programy takie szybko się starzeją razem ze sprzętem, po czym stają się praktycznie bezużyteczne.

W dzisiejszych czasach kod assemblerowy najczęściej jest etapem pośrednim kompilacji i tylko specjaliści mają z nim styczność.

Instrukcje dla procesora Intel Pentium Instrukcje dla procesora Sun Sparc
[ plik źródłowy programu ] [ plik źródłowy programu ]

Assemblery dla innego sprzętu

Prymitywny sprzęt potrafi to samo co wyrafinowany, ale to nie znaczy, że tak samo łatwo się go używa. Wioczny niżej kod jest przeznaczony do wykonania przez pewną maszynę Turinga. Działający model tej maszyny istnieje w postaci programu komputerowego; można za jego pomocą uruchomić i sprawdzić zamieszczony niżej program.

Program dla maszyny Turinga składa się z ciągu pięcioelementowych instrukcji. Pierwsze dwa elementy identyfikują bieżący stan maszyny i wartość bieżącej komórki taśmy. Program jest w każdym kroku przeglądany od początku, i pierwsza instrukcja pasująca do bieżącego stanu zostanie wykonana. Trzy pozostałe elementy instrukcji mówią, co jest do zrobienia w danym przypadku: wyznaczają wartość do zapisania w bieżącej komórce taśmy, określają nowy stan maszyny, wreszcie wyznaczają kierunek przesunięcia taśmy.

Poniższy program dodaje dwie liczby całkowite zapisane w systemie dwójkowym. Tych kilkadziesiąt instrukcji służy do obliczania wartości wyrażeń postaci =liczba+liczba, np. =1001+11 winno dać wynik 1100. Program sumujący dowolny ciąg liczb dziesiętnych byłby o wiele bardziej skomplikowany. Należałoby się po prostu przestraszyć takiego narzędzia pracy. I słusznie: o ile tylko się da, pracujmy na poziomie takich pojęć, które nam odpowiadają.

Assembler pewnej maszyny Turinga
[ plik źródłowy programu ]

Szczegółowe instrukcje dla operatorów

Charakter niskopoziomowy mają także instrukcje przeznaczone dla operatora określonego sprzętu, w których opisuje się szczegółowo tok czynności przeznaczony do wykonania za jego pomocą. Sprzęt taki może, choć nie musi, być sprzętem „komputerowym”. Poniższa instrukcja opisuje sposób skorzystania z ręcznego kalkulatora w celu obliczenia średniej z kwadratów 3 liczb.

Zauważmy, że instrukcja ta jest programem: jest skończonym zapisem poleceń o jednoznacznej interpretacji, przeznaczonym dla konkretnego wykonawcy (którym jest człowiek będący operatorem konkretnego modelu kalkulatora). Podjęcie działań zgodnych z tym opisem gwarantuje uzyskanie zamierzonego wyniku. Program nie tłumaczy sensu podejmowanych czynności, nie wymaga od operatora inteligentnych zachowań, ani nie umożliwia nauczenia się obsługi kalkulatora.

Program dla operatora kalkulatora ręcznego
[ plik źródłowy programu ]

Języki kompilowane

Fortran (od 1954 r.)

Pierwszy na świecie język programowania niezależny od modelu komputera i systemu operacyjnego, co wpłynęło na nazwę języka (ang. Formula Translator = tłumacz formuł). Do dzisiaj używany, zwłaszcza w obliczeniach numerycznych.

Rozwiązywanie równania drugiego stopnia Sumowanie ciągu liczb
[ plik źródłowy programu ] [ plik źródłowy programu ]

LISP (od 1958 r.)

Język o zupełnie innej filozofii programowania, niż pozostałe tu wymienione, bazującej na pojęciach listy i funkcji (LISP = List Processor). Raczej trudny dla początkujących. Dla LISPa skonstruowano wiele kompilatorów i interpreterów. Jest on podstawowym językiem skryptowym stosowanym w edytorze Emacs i w niektórych środowiskach CAD. Pełni też istotną rolę w środowiskach obliczeń symbolicznych oraz w systemach sztucznej inteligencji.

Rozwiązywanie równania drugiego stopnia Sumowanie ciągu liczb
[ plik źródłowy programu ] [ plik źródłowy programu ]

Pascal (od 1971 r.)

Skonstruowany jako jedno z pierwszych narzędzi do programowania proceduralnego, ułatwiającego definiowanie i kontrolowanie złożonych czynności. Łatwy w nauce i precyzyjny w notacji, używany szeroko w nauczaniu algorytmiki i do publikowania algorytmów. Spopularyzowany w latach 80-tych XX wieku przez kompilator Turbo Pascal firmy Borland. Dostępny w wielu systemach i do dziś chętnie używany, chociaż traci znaczenie na rzecz języków obiektowych.

Rozwiązywanie równania drugiego stopnia Sumowanie ciągu liczb
[ plik źródłowy programu ] [ plik źródłowy programu ]

C (od 1978 r.)

Najważniejszy język kompilowany w systemach UNIX. Kompilatory C są zaimplementowane w praktycznie każdym systemie operacyjnym. Trudniejszy i mniej precyzyjny od Pascala, jednak zwięzła notacja sprzyja tworzeniu efektywnego kodu, z którego słyną kompilatory tego języka. Ma obiektowe rozszerzenie zwane C++, opracowane w roku 1983.

Rozwiązywanie równania drugiego stopnia Sumowanie ciągu liczb
[ plik źródłowy programu ] [ plik źródłowy programu ]

Java (od 1995 r.)

Pierwszy na świecie język programowania od początku konsekwentnie projektowany jako obiektowy. Sprzyja utrzymywaniu porządku w projekcie dużego programu, ale jednocześnie wymusza komplikację rzeczy najprostszych.

Skompilowane programy Java są wykonywane przez tzw. wirtualne maszyny, których architektura jest taka sama w każdym systemie operacyjnym. Dlatego przenoszenie programu z systemu na system nie wymaga ponownej kompilacji. Szeroko stosowany do tworzenia programów przeznaczonych dla urządzeń przenośnych (palmtopy, telefony komórkowe) oraz w klienckich interfejsach do aplikacji sieciowych.

Rozwiązywanie równania drugiego stopnia Sumowanie ciągu liczb
[ plik źródłowy programu ] [ plik źródłowy programu ]

C# (od 2000 r.)

Bazujący na języku C obiektowy język programowania przeznaczony do tworzenia programów dla środowiska uruchomieniowego .NET, charakteryzującego współczesne systemy operacyjne Windows.

.NET jest maszyną wirtualną niezależną od architektury sprzętowej komputera. Istnieją też implemenacje .NET dla systemów innych niż Windows; z powodów licencyjnych noszą one inną nazwę.

Rozwiązywanie równania drugiego stopnia Sumowanie ciągu liczb
[ plik źródłowy programu ] [ plik źródłowy programu ]

D (od 2007 r.)

...

Języki interpretowane

Języki skryptowe powłok systemowych

Systemowe procesory poleceń (powłoki systemowe) dają możliwość realizacji ciągów poleceń umieszczanych w plikach skryptowych. Są one wykonywane wiersz po wierszu w trybie interpretacji. Istnieje mechanizm przekazywania argumentów do programu skryptowego z poziomu polecenia uruchamiającego skrypt. Składnia poleceń jest specyficzna dla danej powłoki.

Oprócz poleceń specyficznych dla danej powłoki, poleceniami w skryptach mogą być także nazwy plików wykonywalnych.

Przedstawione niżej przykładowe skrypty realizują pewien nieskomplikowany przypadek archiwizacji zawartości katalogu.

Skrypt powłoki bash systemu UNIX Skrypt powłoki cmd.exe systemu Windows
[ plik źródłowy programu ] [ plik źródłowy programu ]

Basic (od 1964 r.)

Nazwa Basic jest akronimem wyrażenia Beginners’ All-purpose Symbolic Instruction Code (uniwersalny język instrukcji symbolicznych dla początkujących).

Język o długiej tradycji, pełnił m.in. rolę namiastki systemu operacyjnego w mikrokomputerach. Spopularyzowany w latach 80-tych XX wieku dzięki interpreterom Turbo Basic (Borland) i QBasic (Microsoft) dla systemów DOS, a później Visual Basic (Microsoft) dla systemów Windows. Dziś szeroko wykorzystywany jako język makropoleceń w systemach użytkowych. Pozostaje najważniejszym językiem skryptowym systemu Windows. Przedstawione przykłady napisano w dialekcie StarBasic dla środowiska OpenOffice.

Rozwiązywanie równania drugiego stopnia Sumowanie ciągu liczb
[ plik źródłowy programu ] [ plik źródłowy programu ]

Perl (od 1987 r.)

Język zorientowany na przetwarzanie plików tekstowych, na co wskazuje jego nazwa rozwijająca się do Practical Extraction and Report Language. Ma notację niezbyt czytelną dla niewprawnego odbiorcy, choć niepozbawioną swoistej elegancji i pozwalającą na ogromną zwięzłość kodu. Umożliwia łatwe wykorzystanie silnych narzędzi edycyjnych. Stosowany głównie do analizowania i przekształcania dużych plików znakowych oraz do generowania dokumentów, w tym także w ramach serwisów WWW.

Rozwiązywanie równania drugiego stopnia Sumowanie ciągu liczb
[ plik źródłowy programu ] [ plik źródłowy programu ]

Python (od 1991 r.)

Język ogólnego przeznaczenia. Ma bardzo prostą składnię, pozwalającą m.in. grupować instrukcje za pomocą głębokości wcięć bloków. Do innych jego zalet należą: ogromna elastyczność pozwalająca na swobodny wybór konwencji programowania (proceduralna, funkcyjna, obiektowa) przez programistę, szybki interpreter, wbudowany typ danych zespolonych, dobrze wyposażona biblioteka standardowa (polityka „batteries included”).

Rozwiązywanie równania drugiego stopnia Sumowanie ciągu liczb
[ plik źródłowy programu ] [ plik źródłowy programu ]

Lua (od 1993 r.)

Język skryptowy przeznaczony do integracji ze środowiskami użytkowymi.

Rozwiązywanie równania drugiego stopnia Sumowanie ciągu liczb
[ plik źródłowy programu ] [ plik źródłowy programu ]

Ruby (od 1995 r.)

Obiektowy język skryptowy o rozszerzalnej i modyfikowalnej składni.

Rozwiązywanie równania drugiego stopnia Sumowanie ciągu liczb
[ plik źródłowy programu ] [ plik źródłowy programu ]

PHP (od 1997 r.)

Język przeznaczony przede wszystkim do przetwarzania i generowania dokumentów XML (skrót PHP znaczy PHP Hypertext Processor), zwłaszcza na potrzeby programowania serwerów WWW. Chętnie używany m.in. z uwagi na notację znaną z języków klasycznych oraz łatwość współpracy z systemami baz danych.

Rozwiązywanie równania drugiego stopnia Sumowanie ciągu liczb
[ plik źródłowy programu ] [ plik źródłowy programu ]

Scala (od 2001 r.)

Obiektowy język programowania zaprojektowany z myślą o zwięzłości kodu źródłowego. Kod Scali może być uruchamiany przez interpreter lub kompilowany. Podobnie jak w przypadku wielu innych nowoczesnych języków, wykonywaniem instrukcji zajmuje się niezależna od sprzętu maszyna wirtualna.

Rozwiązywanie równania drugiego stopnia Sumowanie ciągu liczb
[ plik źródłowy programu ] [ plik źródłowy programu ]

Inne materiały źródłowe

B. Kinnersley: The Language List; http://people.ku.edu/~nkinners/LangList/Extras/langlist.htm, od 1991
É. Lévénez: Computer Languages History; http://www.levenez.com/lang/, od 1999
T. Robinson i in.: 99 Bottles of Beer; http://99-bottles-of-beer.net/, od 1994
M. Mol i in.: Rosetta Code; http://rosettacode.org/, od 2007
© Copyright 2001–2011 by Jan Jełowicki, Katedra Matematyki Uniwersytetu Przyrodniczego we Wrocławiu
janj@aqua.ar.wroc.pl
http://karnet.up.wroc.pl/~jasj