Sem ser presunçoso, gostaria que você considerasse a possibilidade disso. Atualmente, a maioria dos sistemas operacionais é baseada em linguagens de baixo nível (principalmente C / C ++). Até mesmo as novas, como Android, usam JNI e a implementação subjacente está em C
De fato, (esta é uma observação pessoal) muitos programas escritos em C executam muito mais rápido que seus equivalentes de alto nível (por exemplo: Transmission (um cliente bittorrent no Ubuntu) é muito mais rápido que Vuze (Java) ou Deluge (Python) ) Até os compiladores python são escritos em C, embora o PyPy seja uma exceção.
Então, existe uma razão específica para isso? Por que todos os nossos chamados "idiomas de alto nível", com os grandes conceitos de "OOP", não podem ser usados para criar um sistema operacional sólido?
Então, eu tenho 2 perguntas basicamente.
- Por que os aplicativos escritos em idiomas de baixo nível são mais eficientes do que seus equivalentes HLL? Os idiomas de baixo nível têm melhor desempenho pelo simples motivo de serem de baixo nível e serem traduzidos para código de máquina mais facilmente?
- Por que não temos um sistema operacional completo baseado inteiramente em um idioma de alto nível?
Respostas:
A Microsoft fez uma pesquisa muito interessante nessa direção, se você analisar a Singularidade:
http://research.microsoft.com/en-us/projects/singularity/
Além disso, Mothy Roscoe et al têm trabalhado no Barrelfish, que usa a linguagem de programação de restrições do Eclipse como um serviço do SO para resolver todos os tipos de problemas de gerenciamento e alocação de recursos do SO:
http://www.barrelfish.org/
fonte
Depende muito de onde você coloca a divisão entre idiomas de baixo e alto nível. Por exemplo, pessoas diferentes tendem a colocar uma linguagem como C ++ em lados diferentes dessa divisão.
Em relação às suas perguntas:
Não acredito que exista essa diferença entre idiomas de baixo e alto nível, mas mais entre idiomas interpretados e idiomas que são compilados com instruções nativas.
Mas também pode haver uma diferença na cultura entre os programadores, onde os que usam uma linguagem de baixo nível se concentram mais nos aspectos de desempenho das escolhas (de design) que fazem.
Se você considera C ++ como de alto nível, há pelo menos um SO gravado inteiramente em uma linguagem de alto nível (o SO Symbian é gravado em C ++). O que impede você de escrever um sistema operacional na maioria dos idiomas de alto nível é duas coisas:
fonte
Existem várias boas razões para isso.
O idioma de baixo nível de hoje era o idioma de alto nível de ontem
Sim, acredite ou não, uma vez até o C era visto como uma linguagem de alto nível. Até ~ 20 anos atrás, era comum vê-lo descrito como uma linguagem de "nível intermediário". Foi um tempo antes de o OO ser tão popular quanto hoje, o Java não existia, o C # não existia, até o C ++ ainda não estava padronizado adequadamente.
Inércia histórica
Os sistemas operacionais que você usa hoje têm raízes profundas na história. O Windows volta para o início / meados dos anos 80, o Unix volta para o início / meados dos anos 70. Há MUITO código antigo em funcionamento nos sistemas operacionais, e você geralmente não deseja reescrever o código antigo em funcionamento.
Em algum momento você tem que ir até o hardware
Isso acontece no kernel, nos drivers, nos subsistemas de gerenciamento de memória, no sistema de arquivos. Certamente, você pode colocar um idioma de alto nível sobre ele, mas ainda precisa acessar mais diretamente o hardware que um idioma de nível inferior oferece.
Portabilidade
Não quero dizer portabilidade para um hardware diferente ou um SO diferente, como é mais comumente entendido hoje; isso é mais sutil. Há uma grande vantagem de fornecer uma interface baseada em C para algo, e esse é o fato de que praticamente todas as outras línguas existentes podem se vincular a C. Até a API do Windows ainda é uma API baseada em C atualmente por esse motivo.
Preferência pessoal
Algumas pessoas simplesmente preferem programar dessa maneira, e isso pode ser um fator importante. Por exemplo, Linus Torvalds tem um discurso famoso contra o C ++, o que deixa bem claro que, para ele, C sempre será sua ferramenta de escolha para esse tipo de trabalho (o conteúdo do discurso e se você concorda ou não com ele) é irrelevante para essa discussão; o fato de que o discurso existe é suficiente).
Tomados em conjunto, eles devem estabelecer claramente por que um sistema operacional foi originalmente escrito em algo como C nos velhos tempos, e por que pedaços muito significativos dele - até hoje - continuam sendo.
fonte
A principal razão para o domínio do C nos sistemas operacionais está na história - os sistemas operacionais atuais, como o Windows, e todas as formas de Unix (BSD, Solaris, HP-UX, MacOS X, ... assim como clones como Linux), retornam muito tempo, antes que o OO e outras construções de "alto nível" se tornassem comuns.
Para o núcleo do sistema operacional, além do desempenho, é preciso ser muito específico sobre as instruções de hardware e é preciso controle total sobre a memória, que linguagens como C fazem muito bem.
Para sistemas embarcados, às vezes existem sistemas operacionais que utilizam linguagens de nível superior para partes maiores do sistema. Um exemplo notável é o JavaOS da Sun.
Para sistemas operacionais generalizados, um exemplo notável de não usar C também é o MacOS clássico antes do MacOS X - que era em grande parte escrito em um dialeto de Pascal que permitia alguma forma de orientação a objetos.
fonte
Primeiro, há alguns problemas de inicialização. A maioria dos recursos que facilitam as linguagens de alto nível é baseada em abstrações que um kernel deve fornecer a si próprio. Como você escreve um gerenciador de memória em um idioma que requer um gerenciador de memória? Como você escreve drivers de E / S sem usar as boas bibliotecas padrão de E / S do seu idioma? Como você cria primitivas de encadeamento e sincronização sem usar as bibliotecas do idioma?
Segundo, é extremamente útil e muito mais legível ao escrever sistemas operacionais para poder atribuir uma variável a um local de memória específico. Isso é fácil em C, e todo programador C sabe como fazê-lo. Se isso é possível em idiomas de nível superior, é tão raro que apenas os gurus sabem como fazê-lo.
Em outras palavras, quando você considera todas as limitações e modificações que precisaria aceitar, C e C ++ começam a parecer muito mais fáceis.
fonte
stdio.h
. Uma implementação mutex personalizada não usa pthreads. É exatamente isso que significa implementá-lo você mesmo! E isso é independente do idioma que você está usando. Isso não quer dizer que idiomas de alto nível sejam uma boa opção para tarefas de baixo nível (geralmente não estão na minha experiência).Primeiro, o bootstrap exige que pelo menos uma pequena parte seja escrita em Assembly ou equivalente.
Em segundo lugar, não era um sistema operacional escrito em um indiscutivelmente HLL - Lisp máquina . (O fato de ter falhado comercialmente teve mais a ver com outro hardware se tornar mais barato mais rapidamente e o triunfo do Worse é melhor do que com deficiências de sua filosofia ou design).
Terceiro, o C ++ é bastante orientado a objetos e de alto nível; portanto, como outros apontaram, o Symbian OS é outro exemplo.
Quarto, há pouca necessidade de novos sistemas operacionais no momento. Já temos vários tipos de linux e bsd que rodam em praticamente qualquer hardware, e criar um novo sistema operacional a partir do zero é bastante caro.
fonte
there is little need for new OSes at this time
Ainda não me decidi se isso é verdade ou não. Sim, sistemas operacionais modernos (janelas modernas (NT) / Unix moderno) são tudo o que precisamos, funcionalidade e desempenho. Mas apenas: eles nascem em outra área onde "a rede" era corporativa / universitária e os usuários confiavam, e o multiproc era 2/4 dos processadores. Eles são "atormentados", até certo ponto, pelo excesso de confiança (rootkits, malware, vírus ..). Estou começando a pensar que não há espaço para um, seguro sistema operacional moderno, isolado ... com melhor suporte para paralelismo também (melhor então threads)CAR
eCDR
são macros do IBM 704 assembler ! Mesmo C segrega a montagem embutida , em vez de tratá-la como qualquer outra função. Considerando o LispCAR
e oCDR
trabalho em x86, ARM e vários ISAs, isso é um conjunto impressionantemente portátil. (Nota para quem eu possa ter confundido: Sim, Lisp é uma linguagem de alto nível.CAR
ECDR
sendo macros assembler era apenas um detalhe de implementação, não uma característica fundamental;.))Para melhorar a fase do que escrevi anteriormente.
As máquinas Burroughs 5xxx - 6xxx não tinham uma linguagem assembly. O idioma mais baixo disponível era uma extensão para Algol. O Algol foi implementado em hardware. O SO e todos os idiomas foram escritos em Algol. Ele superou todas as máquinas concorrentes da época. Também exigia um número significativamente menor de códigos, o que tornava muito mais fácil a manutenção. Tinha hardware de pilha que suportava uma linguagem recursiva como o Algol.
O sistema operacional Burroughs evoluiu para uma versão chamada MCP. Atualmente, o MCP é executado nos sistemas Unisys.
fonte
A maioria dos idiomas de nível superior mencionados possui um recurso que não se ajusta bem aos sistemas operacionais: Gerenciamento automático de memória. Você não pode confiar em um coletor de lixo ao escrever um sistema em tempo real - seja flexível (que é o que é um sistema operacional) ou ainda pior. Para citar Tanenbaum [i]:
Agora, você pode argumentar que o C ++ também é um bom candidato, pois oferece gerenciamento de memória manual. O C ++ já foi usado em alguns sistemas operacionais, como o Symbian (mencionado por Bart ) e o BeOS. Mas o IMHO C ainda é a linguagem mais rápida que pode ser portada em muitas arquiteturas sem um grande esforço (em contraste com a montagem de uma arquitetura específica).
[i]: Sistemas operacionais modernos, terceira edição, página 73
fonte
Como outros já apontaram, vários sistemas operacionais foram escritos em linguagens de alto nível. Talvez o que você queira dizer é que todo o sistema operacional de sucesso, de mercado geral e de uso geral, tenha sido escrito em alguma combinação de assembly, C e C ++?
A maioria dos idiomas de alto nível possui vários recursos úteis que têm um custo de desempenho associado. O gerenciamento automatizado de memória é um exemplo óbvio, a verificação de limites de matrizes é outro. Se você estiver escrevendo um sistema operacional de uso geral, é provável que encontre situações em que a penalidade de desempenho desses recursos úteis é mais do que você deseja pagar. Nesse ponto, você gostaria de poder desativá-los. Idiomas como Python, C # e Java variam em quais recursos você pode desativar, mas nenhum deles é tão versátil quanto C ou C ++ nesse aspecto.
Nesse aspecto, C e C ++ são quase tão versáteis quanto a montagem pura. Se você decidir que precisa de dez gerenciadores de memória diferentes, cobrindo dez cenários diferentes de alocação de memória, poderá implementá-los todos em C e C ++ e carregá-los e descarregá-los conforme desejar. Caramba, você nem precisa vincular as bibliotecas de tempo de execução C padrão ou o código de inicialização, se não quiser.
fonte
A verdadeira resposta é dinheiro . Não há benefício percebido suficiente de um sistema operacional de idioma de alto nível para justificar o gasto de recursos para criar um e depois empurrá-lo para o mainstream. Há um custo enorme envolvido na criação de um novo driver para cada peça de hardware necessária, por exemplo.
Existem vários sistemas operacionais escritos em idiomas de alto nível, com o objetivo principal de pesquisa, como Oberon e Singularity .
fonte