Melhor resposta
Depende do que você entende por “programação de sistemas” e “melhor”.
Por exemplo, ATS (http://www.ats-lang.org/) pode atender a todos os seus critérios e muito mais – é “uma linguagem segura com recursos de simultaneidade de alto nível, suporte para, mas não mandato de um funcional estilo e desempenho muito bom. Mesmo que seja um dos melhores no papel, pode não ser “o melhor”, porque não há pessoas suficientes usando-o e parece “diferente”.
Na outra direção, C é péssimo por uma variedade de razões. O gerenciamento manual de memória é uma grande fonte de bugs e ainda mais difícil de acertar em uma configuração simultânea. Ao ficar conceitualmente próximo ao metal, você fica sem a capacidade de abstrato de maneiras que permitem produzir código funcional mais rápido e o encoraja a escrever coisas em um nível que é difícil de paralelizar. Por outro lado, pode ser a melhor linguagem de programação de sistemas se você precisar rodar em hardware onde outros compiladores são escassos, ou se você precisar contratar programadores de kernel.
Embora seja doloroso dizer isso, como discordo fundamentalmente de vários aspectos de seu design, você pode querer dar uma olhada no Go. Parece que seus critérios de design se alinham muito bem com seus requisitos.
Resposta
Parece que o que você está procurando é uma “linguagem” que fornece abstrações para você não ter que se preocupar sobre as complexidades envolvidas (ou seja, não há necessidade de criar concorrência do zero), mas também ter alto desempenho e economia de recursos. E porque é uma tarefa “do Sistema”, ele deve ser capaz de se conectar diretamente a todo o hardware. Então você quer algo em que a maior parte do trabalho pesado já está resolvido (nos idiomas da linguagem ou nas bibliotecas disponíveis, ou talvez em ambos). Também seria necessário um compilador nativo em vez de uma VM.
Se este é o caso de que “definitivamente não tenho certeza do” melhor “. Existem muitas alternativas, até mesmo muitos do pequeno grupo que conheço. Se você “realmente” deseja obter o “melhor”, precisa gerar uma lista de todas as línguas – sem quaisquer preconceitos. Em seguida, comece a refinar por omissão – ou seja, percorrer todos os requisitos e omitir (ou pelo menos mover para baixo na lista) aqueles em que a linguagem (ou suas ferramentas) são menos que adequadas ao requisito.
Os requisitos de abstração provavelmente removeriam C e seu tipo da lista, talvez as novas atualizações para C ++ ainda o mantenham em execução.
Todos os baseados em VM provavelmente falhariam em algum aspecto ou outro (observe que não necessariamente, mas você precisa de alguma forma de fazer / converter pelo menos suas porções em nativo). Então, aqueles Java / PVM / DotNet / etc. família de idiomas provavelmente também pode ser omitida.
Os links de hardware podem remover alguns, embora observe que não é impossível usar mais de um idioma (ou família de idiomas) para contornar este requisito. Por exemplo, é mesmo impossível usar C para toda a pilha de tarefas do sistema – pelo menos algumas das partes de inicialização em todos os sistemas são escritas em conjunto e, além disso, muitos sistemas são escritos em alto nível acima do Porções “C”. Na maioria dos casos, é uma situação de apenas usar o que já foi feito e / ou adicionar a ele usando o mais adequado para os lugares onde se encaixam. Portanto, você provavelmente pode (na mesma linha) obter alguma biblioteca / “plugin” o que permite que qualquer idioma afete diretamente o hardware. Se isso remove coisas como desempenho ou economia de recursos é uma questão diferente que precisa de teste e pensamento de combinação alternativo (por exemplo, você faz uma rotina de acesso ao disco atômico em C que é chamada de um “thread” de ator em Lisp e possivelmente incorre em sobrecarga como cada chamada atômica usa seus próprios recursos e, possivelmente, o desempenho é perdido devido às chamadas CFFI).
E o elefante branco (e a principal razão de C ser tão onipresente) são exemplos: é muito mais difícil para tentar algo em algum outro idioma onde as amostras são difíceis de encontrar ou mesmo inexistentes. É sempre extremamente difícil ser o primeiro a fazer isso, em vez de apenas fazer a mesma coisa, apenas “do seu jeito”.
Se você seguir esse caminho, provavelmente eliminará muito rapidamente grandes pedaços dessa enorme lista de linguagens. A ação mais demorada, porém, seria investigar cada linguagem para descobrir como ela se compara a outras para cada um dos requisitos. É por isso que a maioria não se incomodaria e ficar com algo como C, embora (no longo prazo) isso signifique que eles “seriam capazes de tornar algo” melhor “mais rápido.