Język programowania. O zero-jedynkowej rozmowie z komputerem. Wywiad
Na początku chciałam uprzedzić, że programiści lub osoby choć trochę znające się na rzeczy, powinny potraktować ten wywiad jako ciekawostkę, bo niczego nowego się z niego nie dowiedzą. Przeprowadzałam go z myślą o ludziach takich jak ja, które zasadniczo wiedzą tyle, że programista dużo siedzi przed komputerem, ale ciekawi są, co to jest ten język programowania.
Języki programowania należą do grupy języków sztucznych, razem z językami pomocniczymi, projektowymi i artystycznymi. Mają swoją gramatykę, składnię, semantykę, a nawet biblioteki. Jest ich bardzo wiele. Głównych jest kilkadziesiąt, choć używa się przede wszystkim około dwudziestu. Ale tak naprawdę nie da się określić ich całkowitej liczby, bo każdy programista może stworzyć swój język i są ich tysiące. Fakt, że czasami używa ich tylko jedna osoba.
Ponieważ od kilku lat prowadzę rozmowy z pewnym programistą (no dobra, “rozmowa” to dużo powiedziane – on mówi, ja czasami zadaję jakieś pytanie, na które on też czasami przewraca oczyma), to zaczęłam interesować się podobieństwami i różnicami między językiem naturalnym a językiem programowania. A jeśli ma się pod ręką rozmówcę, to nic, tylko przeprowadzać wywiad, co uczyniłam.
A najlepiej, jak ma się pod ręką dwóch programistów, wtedy można zobaczyć różne podejścia.
Pierwszym programistą jest Zbigniew Skowron, programista operujący wieloma językami, ekspert języka C++, prelegent na kilku konferencjach programistycznych. No i mój mąż.
Drugim jest Jakub Skowron, programista operujący wieloma językami, obecnie pracujący nad oprogramowaniem dla satelitów. No i mój szwagier.
Wianki Słów: Jak byś wytłumaczył najprościej, czym jest język programowania i do czego jest używany?
Zbigniew Skowron: Języki programowania są uproszczonymi ale precyzyjnymi językami, które są zrozumiałe dla komputera.
Programy w nich napisane, zanim zostaną wykonane, zostają uprzednio przepisane do najprostszego z języków – do kodu maszynowego.
Nie jest on wygodny dla programistów, którzy z tego względu używają języków bardziej złożonych, ale za to jest wygodny dla komputera, który wykonuje tylko bardzo proste rozkazy.
Jakub Skowron: Języków programowania używa się do tłumaczenia programów (napisanych przez człowieka) na zestaw instrukcji dla komputera (kod maszynowy). W bardzo prostych przypadkach da się pisać bezpośrednio kod maszynowy, natomiast w każdym bardziej złożonym przypadku potrzebujemy języka programowania jako pośrednika.
Język programowania to język formalny, tzn. jest jasno określone, czy dane zdanie (ciąg znaków) jest poprawne, czy nie. Tylko poprawne zdania niosą ze sobą informację.
WS: Czy komputer faktycznie używa tylko zer i jedynek?
ZS: 1
JS: Tak. Każdy stan komputera, każdą daną, każdy kawałek informacji da się sprowadzić do skończonego ciągu bitów, czyli kawałków informacji. 0/1 to tylko jedna z interpretacji, inne to: prawda/fałsz, tak/nie, czarny/czerwony, a/b etc. Bit ma tylko dwa stany.
WS: Jak to możliwe, że samymi zerami i jedynkami da się opisać prawie wszystko?
ZS: W polskim alfabecie są 32 litery. Anglicy mają ich tylko 26, ale też jakoś dają sobie radę.
No a komputer ma tylko dwie litery: 0 i 1. Nie robi to zasadniczej różnicy.
JS: Jeśli początkowo do wyrażania języka polskiego mamy tylko alfabet łaciński, to są słowa których nie da się łatwo zapisać, bo brakuje znaków reprezentujących polskie głoski ś, sz, dzi itp. Możemy albo poszerzyć alfabet, dodając dodatkowe litery (ś), albo użyć kombinacji istniejących (sz, dzi). Dałoby się swobodnie pisać po polsku, używając tylko liter łacińskich, z dostateczną liczbą dwuznaków i trójznaków. Można pójść krok dalej, i jako swój alfabet wziąć tylko litery a/b. Dokładnie to robi alfabet Morse’a – wyraża każde zdanie jako ciąg tylko dwóch liter: kropki i kreski, przy użyciu nawet cztero- i pięcioznaków.
WS: Czy język programowania służy tylko do wydawania poleceń maszynom?
ZS: Tak.
Mogłyby również służyć do opisywania w sposób ścisły dowolnych procedur, np. przepisów kulinarnych czy prawa podatkowego, ale nikt ich do takich celów nie używa.
JS: Istnieją pewne języki programowania używane jedynie do rozważań teoretycznych, ale w zdecydowanej większości tak, służą tylko do wydawania poleceń, i tylko maszynom.
WS: Czy można zastąpić język naturalny językiem programowania?
ZS: Nie. Języki programowania opisują jedynie sposób obliczeń. Nie opisują znaczenia tych obliczeń.
Wyliczenie wieku babci i wysokości odsetek kapitałowych może być identycznym programem. Od nas zależy, jak wynik zinterpretujemy.
Właśnie dlatego żaden program nie jest kompletny bez komentarza w języku naturalnym opisującym znaczenie tego, co jest wyliczone.
Bez takiego komentarza nie jesteśmy w stanie nawet stwierdzić, czy program jest poprawny czy nie. Bo skąd mamy wiedzieć, czy 42 jest poprawną odpowiedzią, jeśli nie znamy pytania?
W języku naturalnym słowa mogą mieć abstrakcyjne znaczenie, jak “babcia”. W języku programowania każde słowo opisuje tylko jakieś obliczenie – i nic więcej.
JS: Nie, bo myśli to coś więcej niż przetwarzanie danych.
WS: Czy Ciebie, jako programistę, drażni niejednoznaczność języka naturalnego, którym się
posługujesz w codziennej komunikacji z innymi ludźmi?
ZS: Nie. Bardziej drażni mnie fakt, że ludzie często zakładają jedną tylko interpretację danej wypowiedzi, ignorując fakt, że można ją zrozumieć inaczej.
Poza tym nie należy zapominać, że programy są pisane przez ludzi, a więc ich wyniki są tylko tak jednoznaczne, jak precyzyjny był programista je piszący. Dlatego w programowaniu spotykamy się z niejednoznacznością równie często jak w życiu.
JS: Nie. Wszystko jest w porządku dopóki obie strony rozumieją ograniczenia języka, wyłapują niejednoznaczności i starają się łatwo je wyjaśniać. Pojawia się delikatna trudność w trakcie myślenia – myślimy, używając języka. Do myślenia konkretnego, ścisłego mamy lekko zmodyfikowany język, w którym używa m.in konstrukcji logicznych pochodzących z języka matematyki.
WS: Czy maszyny mogą stworzyć swój własny język, niezrozumiały dla człowieka?
ZS: Tak.
Można napisać program, który ewoluuje swój protokół komunikacji tak, aby uzyskać jak największą wydajność czy bezpieczeństwo. Efektem takiej ewolucji może być język zbyt skomplikowany dla człowieka.
Tutaj od razu pojawia się pytanie: w jaki sposób program może ewoluować?
Odpowiedź jest prosta: nie należy traktować programu i danych jako różnych rzeczy. One są w zasadzie tożsame. Skoro program może zbierać dane, to może też używać tych danych do konstruowania reguł, według których postępuje. W ten sposób zachowanie programu zmienia się w czasie, i może się stawać coraz bardziej skomplikowane.
Typowym przykładem są sieci neuronowe, które na podstawie zaobserwowanych przypadków dostosowują swoje parametry tak, aby nowe przypadki lepiej rozpoznawać.
WS: Cechy idealnego języka programowania, według Ciebie, to:
ZS: W języku programowania ważne jest to, żeby móc napisać program w sposób zwięzły i precyzyjny, i żeby być w stanie łatwo zapewnić i zweryfikować jego poprawność.
A to zależy nie tylko od języka, ale także od programu jaki piszemy.
Języki programowania ułatwiają pisanie pewnych rzeczy, ale kosztem tego, że inne będzie wyrazić dużo trudniej, lub wręcz będzie to niemożliwe.
Nie ma idealnego języka. Idealnego noża też nie ma: jeden nadaje się do sushi, inny do smarowania.
JS: Ważne też, żeby język był dostatecznie popularny. Dobrze jest mieć bazę istniejących rozwiązań (biblioteki) oraz przykłady i materiały do nauki.
WS: Czym różnią się języki programowania?
ZS: Każdy język programowania pozwoli wyliczyć wszystko, co tylko jest możliwe do wyliczenia. Poważnie. I tu nie ma różnicy.
Pytanie tylko jak szybko.
Języki różnią się także łatwością użycia do konkretnego zastosowania (ciężko pisać poezję językiem prawniczym), łatwością znajdowania błędów
(jedne języki mają bardziej ścisłe “reguły gramatyczne”, inne mniej) oraz dostępnymi pojęciami (nie powiesz “komputer” w języku amazońskich Indian, ale będziesz w stanie go opisać).
Kilka przykładów, jak te same rzeczy można zapisać w różnych językach programowania.
Hello World
C++
#include <iostream> int main () { std::cout << "Hello world!" << std::endl; }
Java
public class HelloWorld { public static void main(String[] args) { System.out.println("Hello world!"); } }
Python (nazwa pochodzi od Latającego Cyrku Monty Pythona, bo twórca języka bardzo lubił ten program)
print("Hello world!")
Warunek (If)
Basic
If x > 5 Then
SomeFunc1()
Else
SomeFunc()
End If
C++
if (x > 5) {
x = 5;
}
Clojure
(if (= 1 1) :yes :no)
Smalltalk
x > 0 ifTrue: [ x ] ifFalse: [ x negated ]
Po więcej przykładów możesz zajrzeć na stronę rosettacode.org
WS: Czy chciałbyś wymyślić swój język programowania?
ZS: Chyba każdy programista zaimplementował jakiś swój język.
Jedne pisze się dla zabawy, inne do rozwiązania konkretnego problemu: na przykład do przetwarzania danych.
Ale ponieważ praca programisty polega na pisaniu fragmentów kodu, nadawaniu im nazw, a potem używaniu tych nazw do napisania bardziej złożonych fragmentów kodu, to każdy program w pewnym sensie używa własnego języka – złożonego z pojęć w nim opisanych.
Językiem stworzonym dla zabawy jest Brainfuck, gdzie programy składają się prawie wyłącznie z symboli.
Na przykład Hello World w tym języku to:
++++++++++[>+>+++>++++>+++++++>++++++++>+++++++++>++ ++++++++>+++++++++++>++++++++++++<<<<<<<<<-]>>>>+.>>> >+..<.<++++++++.>>>+.<<+.<<<<++++.<++.>>>+++++++.>>>.+++. <+++++++.--------.<<<<<+.<+++.---.
JS: Tak. Zazwyczaj wynika to z frustracji spowodowanej trudnością łatwego wyrażenia czegoś prostego w języku, którego w danym momencie używam.
WS: Dlaczego warto być programistą?
ZS: Przede wszystkim dlatego, że programowanie to jedna z tych dziedzin życia, w których można stworzyć coś z niczego.
JS: Bo można tworzyć. Jest radość z tego, że coś się rusza, coś gra, coś pisze na ekranie. Dzieci bawią się klockami i kredkami. My, mając 30 lat, siedząc nocą nad jakimś hobbystycznym projektem, jesteśmy jak dzieci.
WS: Czy każdy może nauczyć się programowania?
ZS: Tak. Każdy też może zostać malarzem. Ale nie każdemu będzie to dobrze wychodziło.
JS: Tak, i coraz więcej ludzi tego potrzebuje. Programowanie jest już bardzo przydatne w nauce, zaczyna być pomocne w innych dziedzinach. Wszędzie, gdzie potrzebne jest przetwarzanie danych i analiza.
WS: Dziękuję Zbyszkowi i Kubie za poświęcony czas, no i ciekawe odpowiedzi. Mam nadzieję, Czytelniczko/Czytelniku, że podobało Ci się tak samo jak mi.
Jeśli spodobał Ci się ten wywiad, puść go dalej w swój świat.