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