Por que não ter um sistema operacional baseado em linguagem de alto nível? Os idiomas de baixo nível são mais eficientes?

44

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.

  1. 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?
  2. Por que não temos um sistema operacional completo baseado inteiramente em um idioma de alto nível?
rtindru
fonte
36
Você implica que apenas "linguagens de alto nível" são orientadas a objetos, o que não é verdade.
Uooo
2
@rtindru "Linguagem de baixo nível" (principalmente C / C ++)? Qual é a sua definição de linguagem de alto nível então? Você precisa ser claro sobre sua definição / interpretação da linguagem de alto nível. O Python é na verdade uma linguagem de script, pois é executado diretamente em seu mecanismo (IDLE ou terminal de linha de comando), se você não percebeu isso até agora. Há uma boa razão (filosófica e prática) para que o C / C ++ seja usado como linguagem de implementação para muitos sistemas operacionais, mas tenho certeza de que os usuários avançados aqui provavelmente não irão se interessar por essa questão.
hagubear
10
O Android não é um sistema operacional totalmente novo. É apenas mais um sabor do Linux.
Den
3
@hagubear Há uma boa razão (filosófica e prática) para que o C / C ++ seja usado como linguagem de implementação para muitos sistemas operacionais . Qual é esse motivo muito bom?
Rtindru 28/06
2
Se bem entendi, o SO para máquinas LISP foi escrito em LISP. Embora talvez se possa argumentar que o dialeto usado era uma linguagem de baixo nível?
Robert Fisher

Respostas:

38

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/

Rafe
fonte
Uau, não posso votar, preciso de 15 representantes ... acabei de participar hoje! Muito obrigado.
rtindru
9
@rtindru: mesmo com 1 ponto de repetição, você pode aceitar uma resposta O que significa quando uma resposta é "aceita"?
Marjan Venema
6
Aceitar uma resposta tende a reduzir as novas respostas / discussão. Pessoalmente, eu recomendaria não aceitar (a essa pergunta específica) por pelo menos outro dia.
28713 Brian
1
Eu adicionaria o Cosmos ao grupo: código aberto, terceiros, não tão interessante quanto a singularidade, mas tenho algumas idéias legais! cosmos.codeplex.com
Lorenzo DEMATTÊ
38

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:

  1. 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.

  2. 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:

    • Um sistema operacional precisa de acesso de baixo nível à memória e ao hardware e executa truques sujos com eles. Esse tipo de acesso geralmente é considerado inseguro para programas em nível de aplicativo; portanto, muitos idiomas de alto nível não o permitem.
    • Um sistema operacional precisa ser executado sem a presença de software de suporte, como intérpretes. Isso torna extremamente difícil escrever um sistema operacional em um idioma que não possa ser facilmente compilado em instruções nativas.
Bart van Ingen Schenau
fonte
35
Não existe um idioma interpretado ou um idioma que seja compilado com instruções nativas. Uma linguagem é um conjunto de regras matemáticas, não é interpretada nem compilada, apenas é . Interp. e Comp. são características do intérprete ou do compilador, não da linguagem. Cada idioma pode ser implementado usando um compilador ou um intérprete. Atualmente, a maioria dos idiomas possui implementações interpretadas e compiladas. Existem intérpretes para C e todas as principais implementações de JavaScript são compiladas no código nativo. E o que é código nativo, afinal? Se eu compilar Java para JVM bytecode e executar
Jörg W Mittag
11
isso em uma CPU Java, e eu compilo o código da máquina C para ARM e o executo em um intérprete ARM porque meu PC não possui uma CPU ARM, então o que torna o ARM nativo e a JVML não?
Jörg W Mittag
5
@ JörgWMittag: Se você possui uma CPU que pode executar diretamente o bytecode Java (sem usar uma JVM adicional), o bytecode Java é o código nativo dessa CPU. Além disso, não descarto a possibilidade de escrever um sistema operacional em um idioma que normalmente é interpretado ou executado em uma VM, mas as torna menos óbvias.
Bart van Ingen Schenau
15
@ JörgWMittag - Concordo que qualquer idioma pode ser compilado ou interpretado (compile um script bash; use C ++ interpretado (CINT / Cling)), mas muitas decisões no design de idiomas são baseadas, serão interpretadas, compiladas ou ambas. Um idioma que faz com que você declare / inicialize manualmente variáveis ​​digitadas estaticamente, aloque / libere manualmente, faça aritmética de ponteiros, lembre-se de verificar os limites do array será menos conveniente para um intérprete (em comparação com um idioma que coleta lixo pela memória, infere o tipo dinâmico, verifica os limites da matriz). Essa linha é 100% clara? Não, mas a diferença existe na prática.
dr jimbob
15

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.

Maximus Minimus
fonte
13

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.

johannes
fonte
12

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.

Karl Bielefeldt
fonte
2
Seu primeiro parágrafo não faz sentido. Um driver de E / S em C também não usa 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).
Eu estou ciente disso. Estou apenas apontando que muito do que diferencia um nível alto de um idioma de baixo nível está naquelas partes do idioma que não estão disponíveis no desenvolvimento do kernel. Quando você compara idiomas de núcleo a núcleo, C não parece mais tão espartano.
Karl Bielefeldt
Não é bem verdade. Enquanto você vai precisar de algum código que não usa X para implementar X, todo o código restante pode depender de que código e uso X.
Este é um bom ponto.
Karl Bielefeldt
6

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.

sds
fonte
Você perdeu os mainframes do Burroughs B5000. O sistema operacional deles foi escrito em Burroughs Extended ALGOL.
John R. Strohm
1
there is little need for new OSes at this timeAinda 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)
Lorenzo DEMATTÊ
Lisp é de baixo nível CARe CDRsão macros do IBM 704 assembler ! Mesmo C segrega a montagem embutida , em vez de tratá-la como qualquer outra função. Considerando o Lisp CARe o CDRtrabalho 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. CARE CDRsendo macros assembler era apenas um detalhe de implementação, não uma característica fundamental;.))
8bittree
4

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.

Donleslie
fonte
3

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]:

Algumas coisas que C não possui incluem seqüências de caracteres internas, threads, pacotes, classes, objetos, segurança de tipo e coleta de lixo. O último é uma rolha de exibição para sistemas operacionais. Todo o armazenamento em C é estático ou explicitamente alocado e liberado pelo programador, geralmente com a função de biblioteca malloc e free . É a última propriedade - controle total do programador sobre a memória - junto com ponteiros explícitos que tornam C atraente para a criação de sistemas operacionais. Os sistemas operacionais são basicamente sistemas em tempo real, até certo ponto, até sistemas de uso geral. Quando ocorre uma interrupção, o sistema operacional pode ter apenas alguns microssegundos para executar alguma ação ou perder informações críticas. Ter a coleta de lixo em um momento arbitrário é intolerável.

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

sakisk
fonte
3
Máquinas Symbolics tinham gerenciamento automático de memória. Smalltalk fez em um alto. Isso foi nos anos 80. Um sistema do tipo linear remove completamente a necessidade de GC. Estes são problemas resolvidos, se pudéssemos lembrar disso!
22813 Frank Shearar
Seria possível que um idioma incluísse gerenciamento automático de memória, mas inclua um tipo especial de referência "profundamente fixada" e permita que os métodos declarem explicitamente que eles não acessarão nenhuma referência não fixada nem invoquem métodos que possam fazê-lo. Não haveria necessidade de um coletor de lixo do mundo parar para interferir com o código em execução em um método que não acessaria nenhum objeto que pudesse ser modificado pelo GC.
22714
2

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.

Charles E. Grant
fonte
0

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 .

Peter
fonte