Bez zarozumiałości chciałbym, abyś rozważył taką możliwość. Większość systemów operacyjnych opiera się obecnie na językach dość niskiego poziomu (głównie C / C ++). Nawet nowe, takie jak Android, używają JNI, a podstawowa implementacja jest w C
W rzeczywistości (jest to obserwacja osobista) wiele programów napisanych w C działa o wiele szybciej niż ich odpowiedniki wysokiego poziomu (np .: Transmisja (klient bittorrent na Ubuntu) jest o wiele szybsza niż Vuze (Java) lub Potop (Python) ). Nawet kompilatory Pythona są napisane w C, chociaż PyPy jest wyjątkiem.
Czy jest więc jakiś konkretny powód? Dlaczego wszystkie nasze tak zwane „języki wysokiego poziomu” ze świetnymi koncepcjami „OOP” nie mogą być użyte do stworzenia solidnego systemu operacyjnego?
Zasadniczo mam 2 pytania.
- Dlaczego aplikacje napisane w językach niskiego poziomu są bardziej wydajne niż ich odpowiedniki HLL? Czy języki niskiego poziomu działają lepiej z tego prostego powodu, że mają niski poziom i są łatwiej tłumaczone na kod maszynowy?
- Dlaczego nie mamy pełnego systemu operacyjnego opartego całkowicie na języku wysokiego poziomu?
Odpowiedzi:
Microsoft przeprowadził bardzo interesujące badania w tym kierunku, jeśli spojrzysz na Osobliwość:
http://research.microsoft.com/en-us/projects/singularity/
Ponadto Mothy Roscoe i wsp. Pracowali nad Barrelfish, który używa języka programowania z ograniczeniami Eclipse jako usługi systemu operacyjnego w celu rozwiązania wszystkich problemów związanych z zarządzaniem systemem operacyjnym i alokacją zasobów:
http://www.barrelfish.org/
źródło
Wiele zależy od tego, gdzie umieścisz podział na języki niskiego i wysokiego poziomu. Na przykład różni ludzie mają tendencję do umieszczania języka takiego jak C ++ po różnych stronach tego podziału.
Jeśli chodzi o twoje pytania:
Nie wierzę, że istnieje taka różnica między językami niskiego i wysokiego poziomu, ale bardziej różnica między językami interpretowanymi a językami, które kompilują się z instrukcjami natywnymi.
Ale może też występować różnica w kulturze między programistami, w których ci, którzy używają języka niskiego poziomu, bardziej skupiają się na aspektach wydajności podjętych przez siebie wyborów (projektowych).
Jeśli uważasz, że C ++ jest na wysokim poziomie, to przynajmniej jeden system operacyjny jest napisany w całości w języku wysokiego poziomu (Symbian OS jest napisany w C ++). To, co powstrzymuje Cię przed napisaniem systemu operacyjnego w większości języków wysokiego poziomu, to dwie rzeczy:
źródło
Istnieje wiele dobrych powodów.
Dzisiejszy język niskiego poziomu był wczoraj językiem wysokiego poziomu
Tak, wierzcie lub nie, dawno temu nawet C było postrzegane jako język wysokiego poziomu. Nawet ~ 20 lat temu było dość powszechne, aby opisywać go jako język „średniego poziomu”. To był czas, kiedy OO było tak popularne jak dziś, Java nie istniała, C # nie istniało, nawet C ++ nie był jeszcze odpowiednio ustandaryzowany.
Historyczna bezwładność
Systemy operacyjne, których używasz dzisiaj, mają głębokie, głębokie korzenie w historii. Windows wraca do wczesnych / środkowych lat 80., Unix wraca do wczesnych / środkowych lat 70. W systemach operacyjnych jest DUŻO starego, działającego kodu i na ogół nie chcesz przepisywać starego, działającego kodu.
W pewnym momencie musisz przejść do sprzętu
Dzieje się tak w jądrze, w sterownikach, w podsystemach zarządzania pamięcią, w systemie plików. Na pewno możesz nałożyć na niego język wysokiego poziomu, ale nadal potrzebujesz możliwości bardziej bezpośredniego dostępu do sprzętu oferowanego przez język niższego poziomu.
Ruchliwość
Nie mam na myśli przenośności na inny sprzęt lub inny system operacyjny, ponieważ dziś jest to powszechnie rozumiane; to jest bardziej subtelne. Jedną z głównych zalet dostarczania interfejsu opartego na języku C jest fakt, że praktycznie każdy inny istniejący język może zawierać link do C. Nawet interfejs API systemu Windows jest obecnie interfejsem API opartym na języku C z tego powodu.
Osobiste preferencje
Niektóre osoby po prostu wolą programować w ten sposób, co może być głównym czynnikiem. Na przykład Linus Torvalds ma słynne zdanie przeciwko C ++, co wyraźnie pokazuje, że jeśli chodzi o niego, C zawsze będzie jego wybranym narzędziem do tego rodzaju pracy (treść zdania i czy zgadzasz się z nim, czy nie) nie ma znaczenia w tej dyskusji; wystarczy fakt, że istnieje rant).
Podsumowując, powinny one jasno ustalić, dlaczego system operacyjny został pierwotnie napisany w czymś w rodzaju C w dawnych czasach i dlaczego bardzo znaczące fragmenty - nawet dzisiaj - pozostają takie.
źródło
Głównym powodem dominacji C w systemach operacyjnych jest historia - obecne systemy operacyjne głównego nurtu, takie jak Windows i wszystkie formy Uniksa (BSD, Solaris, HP-UX, MacOS X, ... a także klony takie jak Linux) wracają długo zanim OO i inne konstrukty „wysokiego poziomu” stały się głównym nurtem.
Rdzeń systemu operacyjnego oprócz wydajności wymaga bardzo szczegółowych instrukcji dotyczących sprzętu i pełnej kontroli nad pamięcią, które języki takie jak C radzą sobie bardzo dobrze.
W przypadku systemów osadzonych czasami istnieją systemy operacyjne wykorzystujące języki wyższego poziomu dla większych części systemu. Jednym z godnych uwagi przykładów jest JavaOS firmy Sun.
W przypadku powszechnych systemów operacyjnych godnym uwagi przykładem nieużywanie C jest również klasyczny MacOS przed MacOS X - napisany w dużej części dialektem Pascala, który pozwalał na pewną formę orientacji obiektowej.
źródło
Po pierwsze, istnieją pewne problemy z uruchamianiem. Większość funkcji ułatwiających obsługę języków wysokiego poziomu opiera się na abstrakcjach, które jądro musi sam zapewnić. Jak napisać menedżera pamięci w języku, który wymaga menedżera pamięci? Jak pisać sterowniki we / wy bez korzystania z ładnych standardowych bibliotek we / wy w twoim języku? Jak tworzyć prymityw wątków i synchronizacji bez korzystania z bibliotek języka?
Po drugie, jest niezwykle przydatny i znacznie bardziej czytelny podczas pisania systemów operacyjnych, aby móc przypisać zmienną do określonej lokalizacji pamięci. W C jest to łatwe, a każdy programista w C wie, jak to zrobić. Jeśli jest to nawet możliwe w językach wyższego poziomu, jest tak rzadkie, że tylko guru wiedzą, jak to zrobić.
Innymi słowy, kiedy weźmiesz pod uwagę wszystkie ograniczenia i modyfikacje, które musisz zaakceptować, C i C ++ zaczną wyglądać o wiele łatwiej.
źródło
stdio.h
. Niestandardowa implementacja mutex nie używa pthreads. Właśnie to oznacza wdrożenie go samemu! I to jest niezależne od używanego języka. Nie oznacza to, że języki wysokiego poziomu są dobrym wyborem do zadań niskiego poziomu (zazwyczaj nie są to moje doświadczenia).Po pierwsze, ładowanie wymaga co najmniej małej części do napisania w asemblerze lub równoważnej.
Po drugie, system operacyjny został napisany w bezsprzecznie HLL - Lisp Machine . (Fakt, że zawiodła komercyjnie, miał więcej wspólnego z tym, że inny sprzęt stawał się tańszy szybciej, a zwycięstwo Gorzej jest lepsze niż z brakami jego filozofii lub projektu).
Po trzecie, C ++ jest zorientowany obiektowo i na wysokim poziomie, więc jak zauważyli inni, Symbian OS jest kolejnym przykładem.
Po czwarte, nowe systemy operacyjne nie są obecnie potrzebne. Mamy już sporo linuksowych i bsdowych smaków, które działają na prawie każdym sprzęcie, a stworzenie zupełnie nowego systemu operacyjnego od podstaw jest dość drogie.
źródło
there is little need for new OSes at this time
Nadal nie zdecydowałem, czy to prawda, czy nie. Tak, nowoczesne systemy operacyjne (nowoczesne okna (NT) / nowoczesny Unix) są wszystkim, czego potrzebujemy, funkcjonalnością i wydajnością. Ale ledwo: rodzą się w innym obszarze, w którym „sieć” była korporacyjna / uniwersytecka, a użytkownicy ufali, a multiproc to 2/4 procesorów. Są do pewnego stopnia „nękani” nadmiernym zaufaniem (rootkity, złośliwe oprogramowanie, wirusy ...). Zaczynam myśleć, że istnieje przestrzeń dla nowoczesnego, bezpiecznego, izolowanego systemu operacyjnego ... z lepszym wsparciem dla równoległości (lepiej niż wątki)CAR
aCDR
to IBM 704 assembler makr ! Nawet C segreguje wbudowany zestaw , zamiast traktować go jak każdą inną funkcję. Biorąc pod uwagę LispCAR
iCDR
pracę nad x86, ARM i całą gamę ponad ISA, jest to imponująco przenośny zestaw. (Side note każdemu mogę mylić: Tak, Lisp jest językiem wysokiego poziomu.CAR
ICDR
będące makra asemblera właśnie szczegółów wdrażania, a nie główną cechą;).)Aby lepiej fazować to, co napisałem wcześniej.
Maszyny Burroughs 5xxx - 6xxx nie miały języka asemblera. Najniższym dostępnym językiem było rozszerzenie do Algolu. Algol został zaimplementowany sprzętowo. System operacyjny i wszystkie języki zostały napisane w Algolu. Wyprzedził wszystkie konkurencyjne maszyny tamtych czasów. Wymagało to również znacznie mniej kodu, co znacznie ułatwiło utrzymanie. Miał sprzęt stosu, który obsługiwał rekurencyjny język, taki jak Algol.
System operacyjny Burroughs przekształcił się w wersję o nazwie MCP. MCP działa obecnie w systemach Unisys.
źródło
Większość wymienionych wyżej języków wyższego poziomu ma funkcję, która nie pasuje dobrze do systemów operacyjnych: automatyczne zarządzanie pamięcią. Podczas pisania systemu w czasie rzeczywistym nie można polegać na śmieciarzu - ani miękkim (jakim jest system operacyjny), ani nawet najgorszym. Cytując Tanenbaum [i]:
Teraz możesz argumentować, że C ++ jest również dobrym kandydatem, ponieważ oferuje ręczne zarządzanie pamięcią. C ++ był już używany w niektórych systemach operacyjnych, takich jak Symbian (wspomniany przez Barta ) i BeOS. Ale IMHO C jest wciąż najszybszym językiem, który można przenosić w wielu architekturach bez dużego wysiłku (w przeciwieństwie do montażu konkretnej architektury).
[i]: Nowoczesne systemy operacyjne wydanie 3, strona 73
źródło
Jak zauważyli inni, kilka systemów operacyjnych zostało napisanych w językach wysokiego poziomu. Być może chodzi ci o to, że wszystkie odnoszące sukcesy, masowe rynki, ogólne zastosowania systemu operacyjnego zostały napisane w kombinacji kombinacji a, C i C ++?
Większość języków wysokiego poziomu ma mnóstwo przydatnych funkcji, które wiążą się z kosztami wydajności. Zautomatyzowane zarządzanie pamięcią jest oczywistym przykładem, sprawdzanie granic tablic to kolejny. Jeśli piszesz system operacyjny ogólnego przeznaczenia, możesz spotkać się z sytuacjami, w których kara za wydajność tych pomocnych funkcji jest większa niż jesteś skłonny zapłacić. W tym momencie chciałbyś móc je wyłączyć. Języki takie jak Python, C # i Java różnią się pod względem funkcji, które można wyłączyć, ale żaden z nich nie jest tak wszechstronny jak C lub C ++ pod tym względem.
W tym aspekcie C i C ++ są prawie tak wszechstronne, jak czysty montaż. Jeśli zdecydujesz, że potrzebujesz dziesięciu różnych menedżerów pamięci obejmujących dziesięć różnych scenariuszy alokacji pamięci, możesz zaimplementować je wszystkie w C i C ++ oraz ładować i zwalniać je według własnego uznania. Do diabła, nie musisz nawet łączyć się ze standardowymi bibliotekami wykonawczymi C lub kodem startowym, jeśli nie chcesz.
źródło
Prawdziwa odpowiedź to Pieniądze . Nie ma dostatecznych korzyści z systemu operacyjnego na wysokim poziomie językowym, aby uzasadnić przeznaczenie zasobów na zbudowanie jednego z nich, a następnie wprowadzenie go do głównego nurtu. Zbudowanie nowego sterownika dla każdego sprzętu, który musi obsługiwać, wiąże się z ogromnymi kosztami.
Istnieją różne systemy operacyjne napisane w językach wysokiego poziomu, których głównym celem są badania, takie jak Oberon i Singularity .
źródło