Najlepsza odpowiedź
To zależy od tego, co rozumiesz przez „programowanie systemów” i „najlepsze”.
Na przykład ATS (http://www.ats-lang.org/) może spełniać wszystkie Twoje kryteria i nie tylko – jest to bezpieczny język z funkcjami współbieżności wysokiego poziomu, obsługujący, ale nie wymagający, funkcji styl i bardzo dobre wyniki. Nawet jeśli jest to jeden z najlepszych na papierze, może nie być „najlepszy”, ponieważ nie ma wystarczającej liczby osób, a wydaje się „inny”.
Z drugiej strony, C jest okropne z różnych powodów. Ręczne zarządzanie pamięcią jest ogromnym źródłem błędów i jeszcze trudniejsze do wykonania w tym samym otoczeniu. Pozostając koncepcyjnie blisko metalu, pozostawia Cię bez możliwości abstrakcyjne w sposób, który pozwala szybciej tworzyć działający kod i zachęca do pisania rzeczy na poziomie, który jest trudny do zrównoleglenia. Z drugiej strony może to być najlepszy język programowania systemów, jeśli musisz działać na sprzęcie, na którym brakuje innych kompilatorów, lub jeśli potrzebujesz zatrudnić programistów jądra.
Chociaż boli mnie to mówić, ponieważ zasadniczo nie zgadzam się z kilkoma aspektami jego projektu, możesz rzucić okiem na Go. Wygląda na to, że ich kryteria projektowe dość dobrze pasują do twoich wymagań.
Odpowiedź
Wygląda na to, że szukasz „języka”, który daje ci abstrakcje, więc nie musisz się martwić o zawiłościach z tym związanych (tj. nie ma potrzeby budowania współbieżności od zera), ale jednocześnie zapewnia wysoką wydajność i oszczędność zasobów. A ponieważ jest to zadanie systemu, powinno być w stanie bezpośrednio łączyć się z całym sprzętem. coś, gdzie większość ciężkiej pracy jest już rozwiązana (albo w idiomach języka, albo w dostępnych bibliotekach, albo może w obu). Ponadto potrzebowałby natywnego kompilatora zamiast maszyny wirtualnej.
Jeśli to tak jest w przypadku, gdy zdecydowanie nie jestem pewien co do „najlepszego”. Istnieje wiele alternatyw, nawet wiele z tej małej grupy, którą znam. Jeśli „naprawdę” chcesz dostać się do „najlepszego”, musisz wygenerować listę wszystkich języków – bez żadnych uprzedzeń. Następnie zacznij udoskonalać przez pominięcie – tj. przejrzyj wszystkie wymagania i pomiń (lub przynajmniej przesuń się niżej na liście) te, w których język (lub jego narzędzia) są mniej niż adekwatne do wymagania.
Wymagania abstrakcji najprawdopodobniej usunęłyby C i jej podobne z listy, być może nowe aktualizacje C ++ nadal działają.
Wszystkie maszyny oparte na maszynach wirtualnych prawdopodobnie zawiodłyby w jakimś aspekcie (uwaga niekoniecznie, ale potrzebujesz jakiegoś sposobu wytwarzania / konwertowania przynajmniej jego części na rodzime). Więc te Java / PVM / DotNet / etc. rodzina języków prawdopodobnie również może zostać pominięta.
Linki sprzętowe mogą usunąć całkiem sporo, chociaż pamiętaj, że nie jest niemożliwe użycie więcej niż jednego języka (lub rodziny języków) w celu poruszania się To wymaganie. Np. niemożliwe jest nawet użycie C dla całego stosu zadań systemowych – przynajmniej niektóre części rozruchowe we wszystkich systemach są zapisywane w asemblerze, a na dodatek wiele systemów jest napisanych na wyższym poziomie powyżej Części „C”. W większości przypadków jest to sytuacja, w której wystarczy użyć tego, co już zostało zrobione i / lub dodać do tego to, co jest lepiej dopasowane do tych miejsc, w których się one mieszczą. Więc prawdopodobnie (w tym samym duchu) możesz pobrać jakąś bibliotekę / „wtyczkę” co umożliwia każdemu językowi bezpośredni wpływ na sprzęt. To, czy usunie to rzeczy takie jak wydajność lub oszczędność zasobów, to inna sprawa, która wymagałaby testowania i alternatywnego myślenia łączonego (np. Czy tworzysz procedurę dostępu do dysku atomowego w C, która jest wywoływana z „wątku” aktora w Lisp i prawdopodobnie powoduje każde wywołanie atomowe wykorzystuje własne zasoby i prawdopodobnie wydajność jest tracona z powodu wywołań CFFI).
A potem biały słoń (i główny powód, dla którego C jest tak wszechobecny) jest przykładami: Jest znacznie trudniejsze spróbować czegoś w innym języku, w którym trudno jest znaleźć próbki lub w ogóle ich nie ma. Zawsze jest niezwykle trudno być pierwszym, który to zrobi, zamiast robić to samo, tylko „po swojemu”.
Jeśli pójdziesz tą drogą, prawdopodobnie bardzo szybko wyeliminujesz duże fragmenty tej ogromnej listy języków. Jednak najbardziej czasochłonną czynnością byłoby zbadanie każdego języka, aby dowiedzieć się, jak radzi sobie on z innymi w każdym z wymagań. Dlatego większość by się nie przejmowała i po prostu trzymaj się czegoś takiego jak C, nawet jeśli (na dłuższą metę) może to oznaczać, że mogliby szybciej zrobić coś „lepszego”.