Co ma programowanie do smolistego grzęzawiska? Odpowiada

Transkrypt

Co ma programowanie do smolistego grzęzawiska? Odpowiada
WYWIAD
Co ma programowanie do smolistego
grzęzawiska? Odpowiada Bjarne
Stroustrup – twórca języka C++
Wielu z Was zapewne słyszało o nowych możliwościach, jakie otwiera przed programistami standard C++14. Nie każdy jednak wie, jak na dzień dzisiejszy wygląda
proces zarządzania rozwojem tego popularnego języka programowania. Odpowiedzi na to i wiele innych pytań udziela człowiek, który miał gigantyczny wpływ na
rozwój nie tylko informatyki, ale i wszystkich gałęzi życia czerpiących z tej dziedziny wiedzy. Tym człowiekiem jest Bjarne Stroustrup: twórca C++.
Magazyn Programista: Jak i kiedy rozpoczęła się twoja przygoda
z programowaniem?
Bjarne Stroustrup: Na uniwersytecie. Zapisałem się na kurs „Mathematics with Computer Science”, nie mając w zasadzie pojęcia, o czym
on tak naprawdę będzie (duńska nazwa kursu nie zawierała słowa
„komputer”, więc myślałem, że chodzi po prostu o jakąś nową gałąź
matematyki stosowanej). Kiedy odkryłem informatykę i ogólnie programowanie, nigdy więcej nie spojrzałem wstecz. To było niesamowite, czego można się było nauczyć i co dało się potem z tym zrobić!
To, czego nauczyłem się wtedy na temat architektury sprzętu, struktur danych, systemów operacyjnych i kompilatorów, zostało dobrze
wykorzystane w późniejszych latach.
Jaki był pierwszy poważny program, który napisałeś?
nośny kod w C. Kompilator został zaprojektowany do pracy na maszynie wyposażonej w 1 megabajt pamięci i procesor o taktowaniu
Poczynając od trzeciego roku studiów, miałem serię małych komer-
1 MHz. Okazało się, że mógł działać na maszynie z jeszcze mniejszą
cyjnych zleceń programistycznych, z których utrzymywałem się do
ilością pamięci. Później przeportowałem go na oryginalny PC. To był
magisterki. Zlecenia te były niewielkie i dostosowane do specyfiki
bardzo przenośny program. Jednym z powodów, dla których kompi-
małego biznesu. Pracując nad nimi, nauczyłem się procesu projek-
lator mógł pracować z tak niewielką ilością pamięci, było to, że nigdy
towania i implementacji, poczynając od analizy wymagań (umiejęt-
nie przechowywał żadnej informacji dłużej niż było to konieczne,
ność interakcji z klientami), po wdrożenie i wsparcie. Wyobrażałem
a pamięć nigdy nie wyciekała.
sobie katastrofy, które mogłyby przytrafić się konkretnym osobom,
jeżeli nie wykonałbym mojej pracy prawidłowo – to było to, co uczy-
Nad jakiego rodzaju projektami związanymi z wytwarzaniem
niło te programy „poważnymi”.
oprogramowania pracujesz obecnie?
Który ze stworzonych przez ciebie programów, patrząc na prze-
Pracując dla firmy Morgan Stanley, zajmuję się głównie zapewnie-
strzeń całej twojej kariery zawodowej, napawa cię największą
niem niezawodności oraz wydajności dużych systemów rozproszo-
dumą?
nych. Jako członek komitetu standaryzacyjnego ISO C++ opracowuję różne propozycje dla C++17 oraz późniejszych wersji języka,
Cfront, pierwszy kompilator C++. Wykonywał analizę leksykalną
między innymi: mechanizm „inteligentnych referencji” (bazujących
i syntaktyczną, budując AST, później przechodził przez to drzewo,
na operatorze .()), automatyczne generowanie operatorów porów-
sprawdzając typy raz jeszcze, aby wykonać kilka optymalizacji na po-
nań (np. == czy <) czy jednolitą składnię wywołania funkcji (w celu
ziomie kodu źródłowego i finalnie znowu, aby wygenerować prze-
ułatwienia współdziałania w zorientowanym obiektowo i generycz-
72
/ 11 . 2014 . (30) /
CO MA PROGRAMOWANIE DO SMOLISTEGO GRZĘZAWISKA?
nym kodzie). Propozycje te można znaleźć, wyszukując w Google
Od początku C++ miał szereg nieobiektowych funkcjonalności i...
frazę WG21 i szukając konkretnych opracowań. Oprócz tego można
byłem za to krytykowany! Programowanie generyczne, reprezento-
zajrzeć na podstronę z moimi publikacjami (na www.stroustrup.com)
wane przez STL, miało mnóstwo aspektów funkcjonalnych: obiekty
lub na stronę internetowej Fundacji C++: www.isocpp.org.
funkcyjne były używane w C++ przez dekady, kiedy języki funkcyjne
używały lambd i domknięć. C++11 oferuje lambdy jako wygodną no-
Z jakich języków programowania i narzędzi aktualnie korzystasz?
tację do generowania obiektów funkcyjnych. Funkcje constexpr są
czyste (w sensie funkcyjnym). Od 1984 roku język C++ oferuje mody-
Głównie C++, aczkolwiek systemy, nad którymi pracuję, korzystają
fikator const, wymuszający niezmienność danych.
z wielu różnych języków.
Warto też zauważyć, że przez ponad 30 lat społeczność skupiona
Swego czasu Frederick P. Brooks nazwał Inżynierię Oprogramo-
wokół funkcyjnych języków programowania trzymała w garści mnó-
wania „smolistym grzęzawiskiem”... Jaka jest twoja opinia odno-
stwo stanowisk decyzyjnych w edukacji, bez zauważalnego wpływu
śnie bieżącej kondycji tej branży? Czy dostrzegasz tutaj jakieś
na praktyki informatyczne. Uważam, że prawidłową polityką jest – jak
wyraźne szanse bądź poważne zagrożenia?
zawsze – ostrożna adaptacja tego, co zostało zademonstrowane jako
działające, i przetłumaczenie tego na coś, co może być zastosowa-
Programowanie może być „smolistym grzęzawiskiem” (albo „smo-
ne w przemyśle na dużą skalę. Cytując z pamięci Kirstena Nygaarda
listym grzęzawiskiem Turinga” w słowach Brooksa), jeżeli robisz
(twórcę programowania obiektowego): „Jeżeli doktor z MIT jest zo-
z niego bałagan. Naprawdę powinniśmy bardziej przykładać się do
bowiązany używać naszego języka, przegraliśmy.”
konstruowania prawidłowych abstrakcji w budowanych przez nas
systemach. C++ oferuje (i zawsze oferował) dwa uzupełniające się
Odnośnie twojej twórczości, czy planujesz prace nad jakimś
składniki: niskopoziomowy dostęp do zasobów sprzętowych (ory-
kolejnym tytułem? Może piąta edycja książki The C++ Program-
ginalnie pożyczony z C) oraz zestaw mechanizmów modelowania
ming Language?
abstrakcji (oryginalnie pożyczony z języka Simula1) pozwalających
programować na wyższym poziomie. Zarówno możliwości bezpo-
Póki co utrzymuję moje istniejące książki: The C++ Programming
średniego odwoływania się do sprzętu i abstrahowania od niego
Language została całkowicie przepisana w 4 edycji rok temu, Pro-
zostały znacznie usprawnione w nowoczesnym C++ (np. C++14),
gramming: Principles and Practice using C++ pojawiła się zeszłą
ale podstawowa idea języka od lat pozostała niezmienna. Dużym
wiosną w drugiej edycji, a całkiem niedawno wydałem nową książ-
marnotrawstwem jest pisanie każdej części programu w katego-
kę: A Tour of C++, opisującą nowoczesny język ISO C++ oraz jego
riach bitów, bajtów i wskaźników, mając nadzieję na uzyskanie wy-
bibliotekę standardową w 180 stronach (przy stosunkowo niskim
sokiej wydajności i niezawodności. Znaczne lepsze efekty uzyskuje
stopniu szczegółowości oczywiście). Na razie mi to w zupełności wy-
się, stosując bardziej ustrukturyzowane i systematyczne podejście.
starczy. Nad kolejnymi publikacjami zastanowię się dopiero wtedy,
Od czasu do czasu potrzebujemy manipulować bitami i odnosić się
gdy C++ osiągnie kolejny przełomowy etap rozwoju. Pisanie takich
bezpośrednio do sprzętu (przy czym C++ jest w tym nadzwyczajnie
książek to niewiarygodna ilość pracy.
dobry), ale nie powinniśmy tego robić cały czas – w przeciwnym razie
wylądujemy w niemożliwym do utrzymania bałaganie złożonym ze
Czego możemy oczekiwać w nadchodzącym standardzie C++17?
spaghetti wskaźników i podatnych na błędy struktur danych.
Przede wszystkim lepszych mechanizmów wysokopoziomowych
Jak w twojej opinii wyglądał będzie rozwój Inżynierii Oprogra-
dla współbieżności i równoległości – to są miejsca, gdzie prowadzi
mowania w przedziale najbliższych kilkunastu lat? Co sądzisz
nas sprzęt. Kilka nowych standardowych bibliotek (np. networking
o językach funkcyjnych oraz o ich roli w tym procesie?
i zakresy). Koncepty i być może bazowany na konceptach STL. Rozważamy też moduły (szybsza kompilacja) oraz proste współprogra-
Odpowiadając cytatem: „bardzo ciężko jest przewidywać, szcze-
my (ang. coroutines – przyp red.). Prawie na pewno pojawi się wiele
gólnie w kwestiach związanych z przyszłością” ;). Nie, nie będę
prostych usprawnień. Mam nadzieję że właśnie te małe rozszerzenia
próbował niczego przewidywać. Są ludzie, którzy święcie wierzą w
będą prowadzić do prostszych programów tak, jak zrobiły to w przy-
to, że programowanie funkcyjne jest lekiem na całe zło, tak samo
padku C++11 takie nowe elementy języka jak auto, pętla for pracują-
jak niegdyś byli ludzie wierzący, że programowanie zorientowane
ca na zakresach, lambdy, listy inicjalizacyjne itd.
obiektowo jest odpowiedzią na wszystkie problemy. Moim zdaniem programowanie funkcyjne niesie ze sobą bardzo duży poten-
Czy znasz może jakieś wstępne wytyczne dotyczące standardu C++20?
cjał, tak samo jak programowanie obiektowe, ale fanatycy mylą się
– jak zwykle. Nawet najbardziej udany język funkcyjny nie będzie
Komisja złożona z setek wolontariuszy ciężko pracuje nad ustale-
w 100% funkcjonalny.
niem technicznych celów dla C++20.
/ www.programistamag.pl /
73
WYWIAD
Czy Komisja Standaryzacyjna C++ posiada coś w rodzaju długo-
w połączeniu z formalną specyfikacją usprawnień jako ISO/TS (ISO
terminowej strategii dla ewolucji standardu C++? Powiedzmy,
Technical Specification). Usprawnienia są zatwierdzane dopiero jeśli
w perspektywie 10-20 lat? Czy masz jakieś przewidywania na
sprawdzą się w praktyce. Dostarczanie tego, co zostało ukończone
temat tego, jak miałby wyglądać standard C++30?
w terminach określonych z góry, zostało zasugerowane przez Herba Suttera jako odpowiedź na problem tradycyjnych 10-letnich
Nie. Próbuję ustalić kierunek rozwoju języka C++, ale nie jest to pro-
przerw pomiędzy wydaniami standardu ISO języka. Pomysł wydaje
ste. Kompatybilność i stabilność to cechy faworyzowane przez ten
się działać. Udostępniliśmy C++14 zgodnie z planem, jedynie 3 lata
język. Nie możemy pozwolić sobie na znaczące łamanie kompaty-
po C++11. C++14 to pomniejsze wydanie, oferuje jednak znaczące
bilności lub długie opóźnienia w oczekiwaniu na perfekcję. Potrze-
usprawnienia w stosunku do C++11 (dopełnia C++11). Co ważne,
bujemy strategii ewolucyjnej, gdzie język jest trafnym wyborem dla
główne implementacje (tj. GCC, clang, Microsoft) już teraz dostar-
milionów programistów w każdym momencie tej drogi.
czają wszystkie, bądź prawie wszystkie elementy C++14. Pierwsze
specyfikacje techniczne post-C++11 zostały zatwierdzone i są bliskie
Mam nadzieję że powierzchowna złożoność języka zmaleje. Mam ku
ukończenia.
temu powody: Programy w C++11 i C++14 mogą być znacznie prostsze, krótsze i szybsze niż ich odpowiedniki w C++98. Kompatybilność
Jak oceniasz swoją znajomość C++? Czy widzisz jakieś luki bądź
wsteczna jest niezbędna, ale pisanie kodu w antycznych i nieopty-
słabości w tej wiedzy?
malnych stylach już nie.
Moja znajomość C++ jest w porządku. Nie próbuję przez cały czas
Możemy działać bez eksponowania surowych wskaźników – „new”
być „prawnikiem językowym” i szczerze mówiąc, niektóre bardziej
i „delete” (obiekty kontekstowe, make_unique i make_shared). Mo-
sprytne użycia C++ przerażają mnie: nienawidzę ich utrzymywać
żemy eliminować wycieki zasobów (używając RAII i semantyki prze-
lub uzależniać mojego życia od ich poprawności lub wydajności.
niesienia). Powinniśmy eliminować makra i większość rzutowań: to
Nie próbuj być niepotrzebnie sprytny podczas wyrażania swoich
w końcu umożliwi developerom znaczne usprawnienie narzędzi
pomysłów!
i środowisk programistycznych dla C++. Powinniśmy mieć więcej,
znacznie więcej wysokiej jakości bibliotek.
Mam wiele słabości i luk w mojej wiedzy, oczywiście, ale nie leżą one
w obszarze głównego nurtu programowania w C++.
Czy widzisz przyszłość języka Rust jako alternatywy dla C++?
Czy może on być pewnego rodzaju „zagrożeniem” dla pozycji
Jak z perspektywy czasu oceniasz twój wkład w historię języków
C++ w przyszłości?
programowania?
Nie. Podoba mi się pomysł na Rust'a, który próbuje być bezpieczniej-
Wydaje mi się, że nie mnie to oceniać, ale kiedy zaczynałem praco-
szym językiem na modelu zasobów C++, ale nie wyobrażam sobie,
wać jako programista, deklaracje funkcji z typami argumentów leżały
żeby przestał on być niszowy. Mamy bardzo wiele dobrych języków,
jeszcze w sferze przyszłości C, tak samo jak modyfikator const. Progra-
które dostosowują się do nowych „wyzwań” i adaptują do nowych po-
mowanie obiektowe było ogólnie nieznane, ponadto większość ludzi
mysłów. Znacznie trudniej jest skłonić ludzi do zastosowania języka
w branży (i ze środowisk akademickich) uważało je za zbyt skompli-
w poważnych projektach, niż zaprojektować go i zaimplementować.
kowane, zbyt wolne i zbyt wyspecjalizowane dla rzeczywistych zastosowań. Programowanie generyczne było nieznane lub uznawane
Jak pracuje Komisja Standaryzacyjna? Czy wasza praca opiera
za mrzonkę (i element programowania funkcyjnego). W dzisiejszych
się wyłącznie na zebraniach?
czasach ludziom ciężko wyobrazić sobie, jak prymitywne były ówczesne szczytowe osiągnięcia w rzeczywistym zastosowaniu języków
Komisja pracuje cały czas. Rzadko zdarza się dzień, kiedy nie widzę
programowania i jak odległe od powszechnego użytku i nieznane
wiadomości na wewnętrznych grupach dyskusyjnych. Ludzie pra-
były systemy badawcze, które obecnie podziwiamy. Myślę, że doło-
cują nad propozycjami pomiędzy zebraniami. Istnieją trzy główne
żyłem swoją cegiełkę w procesie budowy tego, co dziś postrzegamy
(intensywne, trwające tydzień) zebrania w ciągu roku i mniejsze, bar-
jako nowoczesne języki programowania. Kiedy rozważamy poważne
dziej skoncentrowane na konkretnych kwestiach spotkania w mię-
zmiany w sposobie myślenia ludzi, musimy przemyśleć to w katego-
dzyczasie (twarzą w twarz i telefonicznie). W sumie obstawiam, że
riach całych dekad.
ponad 250 osób bierze w tym udział. Są to wolontariusze. Jeśli chcesz
spróbować, zacznij od obserwowania www.isocpp.org.
W 2003 roku powstał pierwszy szkic dotyczący konceptów, niestety do dzisiaj nie wprowadzono ich do C++. Poza tym, zostały
Obecnie pracujemy nad dwoma usprawnieniami organizacyjnymi:
one odrzucone jako część standardu C++11. Czy są jakieś plany
częste wydawanie standardu zgodnie ze sztywnym terminarzem,
aby w przyszłości stały się one częścią języka?
74
/ 11 . 2014 . (30) /
CO MA PROGRAMOWANIE DO SMOLISTEGO GRZĘZAWISKA?
Koncepty
to zrobić na przykład dla zakresu pętli for). Myślę, że w przyszłości
Rozszerzenie systemu szablonów C++, które było proponowane w C++11.
Miały być metodą formalizacji wymagań dotyczących argumentów generycznych szablonów. Przykładowo, biblioteka do operacji na macierzach,
która umożliwia użytkownikowi podpięcie własnych typów elementów,
musi posiadać pewien koncept dotyczący tego, jakie operacje można wykonywać na tych elementach. Koncepty miały umożliwić wyrażenie tego
typu potrzeby w kodzie, aby zwiększyć przejrzystość i umożliwić kompilatorowi dokonywanie bardziej precyzyjnych optymalizacji.
doczekamy się C++ gwarantującego bezpieczeństwo zasobów i pa-
Koncepty staną się częścią Specyfikacji Technicznej ISO C++ w 2015.
Język jako taki staje się bardziej skomplikowany, jest to konieczne
Nie będzie to nieudany projekt z 2003 roku, ale nowszy, znacznie
o tyle, o ile stabilność ma być jedną z jego cech. Mimo wszystko,
prostszy design oparty na idei konceptów jako predykatów. Jego im-
realne znaczenie ma nie złożoność języka, ale prostota jego zasto-
plementacja istnieje już jako gałąź GCC, specyfikacja istnieje jako doj-
sowania. Dzięki lepszym bibliotekom (których powstanie umożli-
rzały szkic ISO, a inne implementacje są w drodze (Clang i Microsoft).
wiają udogodnienia języka) i lepszym/prostszym/bezpieczniejszym
mięci, ale nie będę tutaj określał, kiedy konkretnie się to stanie.
C++ staje się coraz bardziej złożony. Usuwane są kolejne ograniczenia, ale ceną tego jest zwiększanie stopnia skomplikowania
języka. Czy uważasz to za problem?
funkcjonalnościom języka możemy uprościć kod aplikacji. Jest to
Autorami obecnej formy konceptów (czasami określanej jako „lekkie
problem, ale jest on rozwiązywalny i można podejmować w tym
koncepty”) byli Gabriel Dos Reis, Andrew Sutton i ja (pracowaliśmy
kierunku działania. Po prostu porównaj kod C++11 do kodu C++98
nad tym wspólnie na Texas A&M University). Implementację w GCC
i spróbuj skoncentrować się raczej na prostocie niż na pomysłowości
wykonał Andrew Sutton. Projekt został oparty na wcześniejszych
rozwiązań. Dokonaj pomiarów, zanim będziesz orzekał o wydajności.
pomysłach Gabriela Dos Reis i moich oraz olbrzymiej pracy i zaan-
Podczas nauczania i uczenia się C++ musimy złamać zły stary nawyk
gażowaniu Alexa Stephanova („ojca” STL) oraz wielu innych. Więcej
dotyczący próbowania zrozumienia każdego drobnego detalu jed-
informacji na temat historii konceptów można zasięgnąć na mojej
nocześnie (tak czy inaczej, to niemożliwe dla jakiegokolwiek nowo-
stronie z publikacjami oraz stronie opisującej mój wkład w WG21
czesnego języka) i, w szczególności, nie wolno próbować uczyć się
(standard ISO C++).
C++ w manierze „od góry do dołu” („najpierw wszystko z C”). Robienie tak to największe marnotrawstwo i często prowadzi do wyszkole-
Usuwanie wycieków pamięci to jeden z najpopularniejszych pro-
nia kiepskich programistów.
blemów oprogramowania. Czy uważasz, że obecne rozwiązania
istniejące w C++ są satysfakcjonujące? Czy planujesz zrobić coś,
Jakie są największe problemy C++ w jego obecnym kształcie i jak
aby naprawić je w przyszłości?
widzisz perspektywy dla ich rozwiązania?
Nie możemy poprzestać na zabezpieczeniu wycieków pamięci, po-
Największym problemem C++ do tej pory jest przestarzały kod
trzeba ogólnego mechanizmu gwarantującego bezpieczne uwalnia-
i przestarzałe style programowania. Ciągle istnieją ludzie przekona-
nie zasobów. Usuwanie luk pamięci jest ważnym, ale niekompletnym
ni, że „czysto obiektowy kod, polegający wyłącznie na hierarchii klas”
rozwiązaniem: wyciek uchwytu wątku, pozostawienie nieużywane-
jest jedynym ideałem dla programów w C++! Podobnie, wiele ludzi
go klucza w słowniku lub wyciek gniazda sieciowego może w koń-
twierdzi, że wydajny kod musi być niskopoziomowy.
cu spowodować spowolnienie systemu z powodu braku zasobów
i ostatecznie jego zatrzymanie. Zasoby inne niż pamięć nie mogą
Powinniśmy przekonać ludzi, że w ich interesie jest przeniesienie
przeciekać ani być używane dłużej niż to konieczne. Model zasobów
się na nowocześniejsze style programowania. To bardzo trudne
w C++ (zmienne o ograniczonym zasięgu, RAII, semantyka przenie-
i wymaga nie tylko edukacji i wsparcia języka, ale lepszych bibliotek,
sienia, inteligentne wskaźniki) to umożliwia. Garbage collector sam
lepszych narzędzi do analizy kodu i narzędzi wspierających odmła-
w sobie – nie. Odśmiecanie pamięci nie jest samo w sobie konieczne
dzanie/modernizowanie kodu. Nie jest to zadanie, które może zostać
ani wystarczające.
wykonane ręcznie w sposób bezpieczny i ekonomiczny.
Eliminacja wycieków zasobów jest konieczna, ale istnieją inne spo-
Programowanie bywa uzależniające, ale z czasem pojawiają się
soby uszkodzenia obiektów: na przykład niesprawdzone unie, rzuto-
problemy dotyczące zjawiska wypalenia. Jeżeli możemy spy-
wania albo brak sprawdzania zakresu. Wierzę, że niebezpieczne unie
tać, jakie są twoje sposoby na odpoczynek od programowania
i rzutowania mogą zostać wyeliminowane. W dzisiejszych czasach
i ogólnie IT?
używam ich dość rzadko. Możemy zbudować wydajne, tagowane
(dyskryminujące) unie, a szablony mogą ograniczyć użycie rzutowań
Bieganie, czytanie, podróżowanie, turystyka, dzieci, słuchanie muzy-
do interfejsów stricte sprzętowych. Typowy sprzęt niedługo będzie
ki, przyjaciele.
umożliwiał tanie sprawdzanie zakresu w przypadkach, gdzie kompilator nie mógł zagwarantować braku błędów zakresu (tak jak może
Z Bjarne Stroustrupem rozmawiali:
Michał Leszczyński i Rafał Kocisz
/ www.programistamag.pl /
75

Podobne dokumenty