Quais linguagens de programação você usaria para criar um kernel do sistema operacional do computador?

Depende de várias coisas.

1) Por que você constrói um kernel?

Na maioria das vezes, as pessoas desenvolvem kernels para aprender como funcionam e se divertir. Neste caso, basta ir com qualquer idioma que você conhece e gosta.

Se você possui uma linguagem favorita que não é C ou C ++, por exemplo, uma linguagem funcional ou dinâmica, use-a de qualquer forma, pois 1) tornará seu projeto interessante para a comunidade e 2) poderá ensinar sobre algumas das seus limites.

Você provavelmente precisará conhecer C, já que deseja ver como os sistemas operacionais de código aberto resolveram seus problemas …

Por outro lado, se este kernel não for um projeto de brinquedo, você terá objetivos como limitar o risco de bugs e problemas de segurança, trabalhar com outras pessoas … que podem ajudá-lo a escolher o idioma certo. Obviamente, o mais testado na história é C; portanto, se você escolher algo radicalmente diferente, verifique se não está ignorando os problemas.

2) Alvo hardware e portabilidade

O sistema operacional precisa ser portátil? Se sim, você precisa de uma linguagem que tenha sido portada para uma variedade de plataformas (como ANSI C ou talvez Java) ou uma linguagem que possa ser portada / reimplementada facilmente (como a Forth). Você desejará o mínimo de montagem possível.

Por outro lado, se você estiver direcionado para uma plataforma específica e incorporada, talvez o uso de linguagens de baixo nível (C, Assembly) seja o caminho a seguir.

3) Que tipo de kernel você está construindo?

Micro-kernels como L4 ou Minix3 não são o mesmo tipo de bestas que os kernels Linux ou Windows. A principal diferença para mim é que um único programador pode ter toda a base de código de um micro-kernel em sua cabeça, enquanto isso é quase impossível em um kernel monolítico.

O que isso muda é que, em um kernel monolítico, você precisa limitar o acoplamento o máximo possível e precisa padronizar mais. Existem implementações da linguagem Assembly do L4, mas duvido que seria fácil implementar o kernel do Linux no Assembly.

4) E eu?

Não pretendo implementar um kernel em breve e, se o fizesse, entraria na categoria “para aprendizado e diversão”. Eu já implementei um gerenciador de inicialização no x86 ASM (também por diversão) há alguns anos atrás.

Se eu decidisse implementar um kernel hoje, provavelmente seria em C e Lua (porque https://github.com/bogdanm/eLuaB… me fascina e me pergunto se é possível criar a maioria de um kernel em uma linguagem dinâmica. com coroutines) ou Forth (porque é fácil inicializar e coisas como http://wiki.laptop.org/go/Open_F… também me fascinam).

Eu acho que você precisa considerar o ambiente em que está operando; diretamente no processador, na memória, no barramento e na arquitetura do dispositivo subjacentes.

Você deseja um idioma que possa ser facilmente direcionado para um novo ISA (Arquitetura do Conjunto de Instruções) do processador e também exige um tempo de execução mínimo / zero, especialmente durante os estágios iniciais da inicialização inicial do OS C, em particular, que atende particularmente bem a esses objetivos, o que não é (necessariamente ou geralmente) o caso de linguagens como Java, LISP, C #, etc. que (normalmente) exigem algumas abstrações de tempo de execução de suporte subjacentes (intrepreter, JVM, CLR) para operar, esses tempos de execução geralmente não são adequados para uso no contexto de um sistema operacional (principalmente durante a inicialização)

As linguagens no estilo C têm um modelo muito simples que mapeia bem para uma ampla variedade de ISAs, com base em seu registro, usa um modelo de chamada / retorno de pilha simples e pode manipular facilmente o endereçamento virtual e físico, portanto, é fácil compilar no destino conjunto de instruções e existem muitos compiladores e conjuntos de ferramentas para (opcionalmente cruzar) compilar para muitas arquiteturas de processadores, etc.

C também tem a capacidade de incorporar o assembler embutido, quando você precisa acessar aspectos específicos da arquitetura de um processador, o que é útil para o acesso no nível do dispositivo (para itens como controles de interrupção e memória)

Quanto ao suporte a construções de nível superior, como isolamento / gerenciamento de recursos, elas são tradicionalmente suportadas no hardware subjacente (anéis de privilégios do processador) ou nas camadas mais altas do próprio sistema operacional, e não no idioma e no tempo de execução

Você quer dizer programação do Kernel do SO? Bem, escolha C. É a linguagem de alto nível mais próxima do metal que você pode encontrar. Além disso, a maioria das outras programações do Kernel foi feita em C para a maioria dos sistemas. E, em algumas situações, você também precisará codificar em linguagem assembly.

Outra linguagem que poderia ser contestada seria o C ++, que pode ser usado para sistemas embarcados, se não for usado com RAII e outras coisas de gerenciamento de memória; e Rust, uma nova linguagem de programação de sistemas. Isso é mais adequado se você estiver desenvolvendo um RTOS para um sistema incorporado, se puder pagar a codificação da maioria das coisas do zero e a plataforma escolhida for mais aberta e tiver mais informações públicas sobre manipulação de interrupções, IO e similares, como mbed. No entanto, ao programar sistemas incorporados com um cronograma apertado, você observará como o uso de bibliotecas e compilador proprietário do fornecedor é * muito * mais fácil do que uma solução DIY.

Rust – a linguagem de programação Rust

C é uma escolha óbvia para o kernel do SO. Por quê? Verifique o kernel do Linux e outras fontes. No entanto, em 2017, acredito que o Rust é um ótimo substituto do C / C ++. Apenas tente um futuro melhor, reduzindo o uso de linguagens de programação herdadas.

No passado:
– Houve tentativas de gravar o SO sensível no Lisp – http://bit.ly/asg9df e http://bit.ly/97VSm9+, por exemplo. Existe uma lenda urbana de que o Emacs é um sistema operacional em si 🙂

– A IBM escreveu o OS / 360 em um derivado do PL / 1

– A Sun (RIP) construiu o JavaOS em… Java.

– O sistema operacional NonStop em tandem foi escrito em TAL http://bit.ly/d1CKiW

Caso contrário, C é a língua franca para escrever sistemas operacionais hoje.

Notavelmente, o Microsoft Singularity é um sistema operacional escrito em C # como parte de sua pesquisa sobre a construção de sistemas confiáveis http://bit.ly/b4Hahi .

Eu desenvolvi um pequeno sistema operacional para o meu PC alguns anos atrás.
Eu usei :
– C para o kernel, misturado com algum código de montagem. (kernel no modo protegido) (compilado com gcc)
– Código de montagem para o bootstrap (compilado com nasm)

Eu provavelmente usaria C. Mas você pode estar interessado em projetos como:

Além de C:

Haiku, que reivindica C ++ (mas deve usar muito C). Mas acho que existem muitos sistemas operacionais incorporados que não dependem de C – por exemplo, http://www.forth.org/svfig/osf.html .

Tim pode falar com http://en.wikipedia.org/wiki/JavaOS .

Eu usaria um dialeto (personalizado) de Oberon http://www.ics.uci.edu/~franz/Si…

C. Quase como eu posso dizer, ninguém nunca conseguiu começar com mais nada.