@szuler,
post #77
> Nadaje sie jak najbardziej.
Nie twierdze że nie można napisać systemu operacyjnego w C++, bo można, na upartego można by i w Pascalu :]
Ale jakoś bardziej mi się tu widzi C, czy asembler. Uważam że system operacyjny powinien być jak najmniej skomplikowany.
Nie wiem, czy są jakieś wymierne korzyści z zastosowania C++ i jak przekłada się to na rachunek ekonomiczny.
Zresztą poniekąd architektura i API systemu będą związane z językiem w jakim został napisany, można napisać OS tak, że będzie do C++ przystosowany i w tym języku będzie się go programowało łatwiej niż w C.
Mi odpowiada styl AmigaOS, czyli lekki system, pisany bardziej pod kątem C/asm, ale to w sumie takie moje "zboczenie" w kierunku minimalizacji wszystkiego co się da, na codzień mikrokontrolery programuję :P
> Moglbys rozwinac te mysl? Brzmi intrygujaco tyle ze niepodparta zadnym logicznym argumentem jest calkiem bezsensowna.
A tak jakoś wydaje mi się, że w systemie operacyjnym nie ma za bardzo miejsca na wykorzystanie "ficzerów" C++, przeciążania operatorów, template'ów, czy skomplikowanego dziedziczenia razem z całym bagażem konstruktorów, destruktorów i przechwytywania wyjątków. Takie rzeczy przydają się na przykład przy uniwersalnych bibliotekach, dając użytkownikowi możliwość stosowania dowolnych typów zmiennych, czy rozbudowywania funkcji bibliotecznych. Ale czy takie coś potrzebne jest w systemie operacyjnym?
Przynajmniej tak mi się to widzi w świetle obecnych systemów, większość operacji jest w miarę prosta, na przykład takie przekazywanie wiadomości pomiędzy procesami, w zasadzie sprowadza się tylko do znalezienia konca kolejki wiadomości docelowego procesu, dodaniu nowego elementu i ustawieniu w strukturze procesu flagi informującej o nadejściu nowej wiadomości, a to są operacje, które w C, czy w asemblerze można wykonać za pomocą kilku instrukcji.
W C++ wyglądało by to na przykład tak, że mamy zdefiniowaną klasę proces powiedzmy (która dziedziczy po klasie task, która dziedziczy po klasie jakaśtam_lista, która dziedziczy po klasie jakaś_prostsza_lista, jak w AmigaOS :]) No i dodanie wiadmości do kolejki takiego procesu można by rozwiązać na przykłąd za pomocą metody, ale żeby było śmieszniej, to wiadomości mogą też otrzymywać taski, więc dodanie wiadomości do kolejki procesu będzie wywoływało metodę zdefiniowaną w klasie task. No a zazwyczaj metody wywoływane są jako funkcje (pewnie jest jakiś atrybyt inline, nie wiem, nie używam C++), a w wypadku takiej operacji wywoływanie funkcji to dość spory overhead.
Nie wiem, czy dla takich operacji jest w ogóle sens "ubierania" ich w "skórki" C++, da się, czemu nie, nawet ładnie to będzie w kodzie źródłowym wyglądało, bo będzie tylko proces->dodaj_wiadomość(wiadomość). Tylko czy jakiś kompilator "załapie" że to samo można wykonać za pomocą raptem kilku instrukcji?
>> Zresztą chyba żaden kompilator nie wykorzystuje potencjału, jaki daje C++ jeśli chodzi o optymalizację
>Co masz na mysli?
Właściwie to powinienem był napisać "nie wykorzystuje w pełni".
A mam na myśli między innymi ostatnie zdanie w poprzednim akapicie.
C++ jest dość nowym językiem, bardzo rozbudowanym w porównaniu z C, autorzy kompilatorów musieli przede wszystkim skupić się na tym, żeby kompilator generował kod który działa tak jak powinien, czyli w jakikolwiek sposób wykonuje to co w kodzie źródłowym napisano, czyli po prostu trzyma się standardu. Optymalizacje są raczej rzeczą drugoplanową. To co jest napisane w C++ przy użyciu składni C będzie zoptymalizowane tak samo jak w C, a składnia C++ będzie zoptymalizowana, albo nie. Chodzi mi o to że engine optymalizacji jest po prostu niekompletny, przynajmniej w gcc i to nie tylko w C++, ale i w C zdarzało mi się, że uparcie kilku rzeczy zoptymalizować nie chciał mimo sugerowania mu tego na chyba wszystkie możliwe sposoby. Fakt, te najprostsze optymalizacje są wykonywane, ale z tego co zauważyłem to gcc jest "upośledzony" pod względem optymalizacji na poziomie asemblera i potrafi zostawiać śmieci typu: (na AVR)
ldi r24, 0
jakaś operacja na innym rejestrze
ldi r24, 0xff
>> zazwyczaj działa to zupaełnie odwrotnie, czyli analogiczny program napisany w C++ jest większy i wolniejszy od programu napisanego w C.
> Umiesz to udowodnic?
A umiesz udowodnić przeciwny przypadek? Zapewne tak.
Z tym że udowadnianie tu czegokolwiek nie ma raczej sensu, musiało by zostać postawione zadanie na przykład przetworzenia jakiegoś pliku do napisania w C i C++.
Ktoś napisze w C++
A potem ktoś zrobi to samo w C i będzie szybsze/mniejsze.
Potem znowy kto inny zrobi to w C++ i znowu będzie szybsz/mniejsze i tak w nieskończoność można, aż w końcu dojdzie się do argumentów typu "mój program jest lepszy bo jak w przetwarzanym pliku są takie a takie wartości w takiej a takiej kolejności, a najczęściej właśnie taka sytuacja występuje, to wykonuje się o 0.1% szybciej niż Twój" :P
Z moich doświadczeń wyciągam wniosek taki że programy pisane w C++ działają wolniej. Największa w tym "zasługa" programistów, którzy nie znając w pełni języka nie potrafią go wydajnie wykorzystać. I chyba to jest zasadniczy problem C++, wcale nie tak łatwo napisać w tym języku program wydajny, wykorzystujący przy tym oferowane przez język "ficzery", a przy tym będący podatnym na modyfikacje, rozbudowę i jeszcze żeby kod źródłowy był czytelny :]
I taki przykład paskudny przykład, nie wiem, czemu, ale kompilacja aMule (napisanego w C++) pod gcc (Linux) potrzebowała grubo ponad 260MB miejsca na dysku, nie wiem dokładnie ile, bo miejsca brakło... Źródła zajmują nieco ponad 16MB. Szybkość kompilacji to po prostu masakra, przez tyle czasu, ile straciłem na kompilację aMule skompilowałbym ze 3 razy kernela.
Zwolennikiem C++ to ja na pewno nie jestem, zdecydowanie wolę C i staram się go stosować wszędzie gdzie istnieje taka możliwość (np. ostatnio pod DirectX, którego API jest w zasadzie zrobione pod kątem C++, a raczej programowania obiektowego w ogóle). Częściowo bierze się to z tąd, że lubię wiedzieć co dokładnie robi procesor, takie "analityczne" podejście do programowania. :]
------ edit
O to je dobre :]
> To sproboj zainstalowac windowa xp na p3 600 i 128 ramu zobaczymy czy ci ten wydajny system w ogole ruszy
Ja mam jakiś dziwny komputer ( i używam go na codzień), bo win xp działał bez problemów, całkiem szybko i stabilnie na Pentium II 400MHz i 128MB RAMu, teraz mu jeszcze 64 MB dołożyłem, bo mam zwyczaj używania całego mnóstwa aplikacji naraz. :]
Ostatnia modyfikacja: 09.11.06 02:55