Como os programadores lidam com o desenvolvimento de software de baixo nível em linguagens de alto nível?

20

Sou um pouco novo em programação e a melhor maneira de fazer essa pergunta é com um exemplo.

Eu sei como fazer coisas básicas em Java e C #. Coisas como um pequeno aplicativo de formulários do Windows ou formam uma classe genérica. Eu basicamente aprendi e ainda não tentei fazer nada grande. De qualquer forma, sempre fiquei curioso sobre como as coisas são feitas "sob o capô", acho que você poderia dizer.

Eu sei que tudo se resume a 1s e 0s e que as linguagens assembly basicamente dão comandos aos padrões de 1s e 0s, mas parece que há esse salto daqui para: usar uma biblioteca para isso, uma biblioteca para isso. Parece-me que tudo o que o C # pode fazer sem uma biblioteca é lógica aritmética e binária. Para obter entrada ou saída, você usa bibliotecas, etc ...

Sei que essa pergunta provavelmente parece óbvia para alguns e sei que tenho muito a aprender, mas nem sei por onde começar com uma pergunta como essa. Obrigado.

Então, minha pergunta é esta:

Se alguém iria fazer uma máquina virtual ou um emulador de Playstation, ou um sistema operacional, ou um driver, ou adicionar suporte mp3 a um media player, ou criar seu próprio tipo de arquivo, etc ... Como? Não consigo ver como isso seria feito com C # ou Java.

Em outras palavras, se eu ler um livro como Professional C # da WROX ou Programming C # da OReilly, saberia como fazer essas coisas? Ou você precisa aprender a linguagem assembly ou algo mais baixo como o C ++?

fender1901
fonte
7
Um truque para entender o que está acontecendo "oculto" é focar e usar parágrafos para facilitar a leitura e compreensão das coisas. Por favor edite esta questão para ser mais fácil de ler.
S.Lott
1
Dado o seu interesse, você pode querer pegar uma cópia do Código de Charles Petzold: a linguagem oculta do hardware e software do computador. É uma boa leitura. Amazon.com/Code-Language-Computer-Hardware-Software/dp/…
DKnight
@ S. Lott Para o resgate :-)
Martin Wickman
@ Martin Wickman: Embora tenha sido um trabalho muito bom, ajudou o fender1901 a editar ou focar?
S.Lott
1
@ Martin Wickman: Desfazer as alterações não é o ponto. Incentivar os outros a aprender fazendo é o meu ponto. Você claramente já sabe. @ fender1901 precisa aprender fazendo. Minha pergunta é a seguinte: "ajudou o fender1901 a editar ou focar?" O que você acha?
S.Lott

Respostas:

9

Pergunta interessante! Você verá que linguagens como Java e C # de fato suportam programação de nível bastante baixo. Por exemplo, observe alguns dos códigos-fonte de E / S no OpenJDK for Java. Você verá que os métodos de nível superior são implementados com tecnologias de soquete de nível inferior, matrizes de bytes e ajustes de bits.

Com relação ao C # e Java, essas linguagens são compiladas até o bytecode, que é executado em uma máquina virtual. Você pode realmente visualizar e aprender com o bytecode (por exemplo, vendo como o Java lida com a concatenação de objetos String).

Se o ambiente em que você está desenvolvendo não hospedar uma dessas VMs de nível superior (geralmente devido a requisitos de espaço e desempenho), será necessário usar uma linguagem de 'nível inferior'.

Acredito que o C / C ++ ainda governa a polêmica na área de gravação de drivers de baixo nível etc., pois você pode ajustar o gerenciamento de memória e as estruturas de dados até o enésimo grau.

Atualmente, a montagem é bastante especializada, é bom fazer pelo menos um curso rápido para apreciar o que acontece nesse nível. Quando você escreve um Assembly para preencher um registro enquanto ele está vazio, você começa a apreciar os tipos de comprimentos que cada camada da linguagem de programação deve ter.

HTH

Martijn Verburg
fonte
Você pode realmente programar com os idiomas intermediários ou eles estão aí apenas para examinar?
Fender1901
Você está perguntando se pode escrever o código fonte 'bytecode'?
Martijn Verburg
Eu acho que. Gostaria de saber se você pode apenas começar a codificar usando bytecode ou il, assim como faria java ou c #?
Fender1901
Java ou C #, muito poucas pessoas estão em manipulação de bytecode, no entanto, um conjunto maior de pessoas fazem olhar para o que o código byte seu código de nível superior específico resume-se a
Martijn Verburg
4

A maioria das programações de "nível baixo" equivale basicamente à interface direta com o sistema operacional. A razão pela qual parece não haver uma maneira "óbvia" de fazer isso é porque, em geral, linguagens de nível superior, como Java, se esforçam para facilitar o uso e a portabilidade. O código que faz interface direta com o sistema operacional geralmente é muito menos portátil que o código de nível superior, a menos que esteja envolvido em uma abstração.

Em linguagens de nível inferior, como C e C ++, a API do sistema operacional é diretamente acessível (em grande parte devido ao fato de a maioria dos sistemas operacionais ser escrita em C, de modo que expõem uma API através da linguagem C). Por exemplo, em C em um sistema UNIX, você pode chamar a ioctlfunção para interagir diretamente com um dispositivo.

Obviamente, linguagens de nível superior, como Java e C #, também precisam conversar com o sistema operacional. Sempre que você abre um arquivo ou lê a partir de um soquete de rede, está em interface com o sistema operacional. É que Java e C # envolvem as chamadas do sistema OS de baixo nível em abstrações de nível superior, como um Socketobjeto. Essa abordagem de nível superior tem a vantagem de que o mesmo código Java funcionará em plataformas diferentes. Considerando que, a maneira como você abriria um soquete no C no UNIX é bem diferente da maneira como o faria no Windows.

Em geral, quanto mais alto o nível da linguagem, menos controle você terá sobre como o seu programa faz interface com o sistema operacional. Dito isso, é possível fazer muitas coisas que você menciona em um idioma de nível superior. Por exemplo, não há motivo para você não poder escrever uma Máquina Virtual em Java ou C #.

Charles Salvia
fonte
2

A boa notícia é que isso pode ser feito com Java ou C #. O único problema que você precisa saber é como . Basicamente, você precisa conhecer essas pequenas coisas interessantes sobre Arquitetura de Hardware (PC não necessário, mas Playstation, se é isso que você deseja emular). E temo que você precise se aprofundar, como Assembler e Machine Language.
Todas as ALUs, registros, MMUs e outras coisas podem ser abstraídas e emuladas com linguagem de alto nível. Você pode até chamar funções de baixo nível para obter suporte de hardware (saiba mais sobre PInvoke e JNA, por exemplo).

No entanto, como você é iniciante, eu não recomendaria começar com uma tarefa tão grande. Eu sugiro que você aprenda C / C ++, um pouco sobre Linux (ou outro sistema operacional semelhante ao Unix, ou seja, FreeBSD), arquitetura de computadores e, em seguida, Assembler ... Pode levar alguns anos, então ...
O que você realmente precisa é motivação e paciência.

Paweł Dyda
fonte
2

O que eu fiz, o que aprendeu uma linguagem de alto nível (Java), ficou mais interessado, como você, em linguagens e hardware de baixo nível. Em seu estado mais primitivo, um computador é eletrônico. 1 e 0 são apenas números para cargas elétricas (ligado e desligado). Depois que comecei a entender a lógica por trás dos processadores, e o que há dentro de uma Unidade Aritmética Lógica, as coisas realmente se encaixaram.
Eu acho que você deveria começar seus estudoscom coisas como lógica booleana (AND, OR, XOR, etc.), comece a projetar pequenas ALUs e ver como a memória e os registros se encaixam nas coisas. Depois disso, aprenda um pouco da linguagem assembly e você perceberá como uma compilação funciona. Em breve, idiomas de alto nível parecerão chatos! :) Só brincando. É lindo como tudo se encaixa, e deve ser agradável de aprender. Depois de começar a seguir o caminho da curiosidade, você perceberá as coisas rapidamente.

Trevor Arjeski
fonte
2

Embora você possa fazer coisas de baixo nível com C # ou Java (ou com a maioria das outras linguagens), a maioria das pessoas não. Portanto, qualquer livro razoavelmente popular que você escolher irá deixar de fora as coisas de baixo nível. É provável que abranjam os recursos de idioma de que você precisa, mas não os apliquem da maneira que mais lhe interessa. Da mesma forma, livros sobre coisas de baixo nível provavelmente estarão em C, com talvez um pouco de linguagem assembly.

Aprender C em si não será difícil para um programador de C #, além da manipulação de ponteiros, embora aprender a fazer as coisas demore mais. Como C é uma linguagem menos expressiva que C #, algumas coisas que você sabe fazer com eficiência em C # terão que ser feitas de uma maneira muito diferente e muitas vezes desajeitada em C.

O que você deve procurar a seguir são livros sobre as coisas de nível inferior que você deseja aprender. Existem livros sobre o kernel do Linux, por exemplo, mas a programação no nível do kernel será difícil de entender sem algum histórico, portanto, você deve estudar primeiro os fundamentos do sistema operacional.

David Thornley
fonte
Eu acho que meu maior problema agora é que muitos desses tópicos serão difíceis de entender porque eu não tenho o histórico. Acho que preciso de uma ponte para essas áreas.
Fender1901
@ fender1901: Isso pode ser um problema. O kernel do Linux faz algumas coisas que pareceriam realmente estranhas para alguém que não entende o que os sistemas operacionais fazem. O emulador, das coisas que você mencionou, provavelmente seria o mais fácil de entender, e existem emuladores simples por aí, geralmente para os primeiros microcomputadores.
precisa
1

Você deve descobrir que é possível executar a função de baixo nível com a plataforma / idioma usado ou não:

  • armazenar um byte em uma variável,
  • leitura / gravação de arquivos por bytes,
  • configurar uma matriz de bytes, acessar elementos,
  • use recursos procedimentais verdadeiros, OOP,
  • acessando a tela, teclado, soquetes.

Hum, parece que a escolha de um idioma deve ser aleatória.

ern0
fonte
-2

A pergunta tem várias respostas: 1. Java e C # são linguagens de alto nível desenvolvidas para o desenvolvimento de aplicativos em um sistema operacional existente que gerencia a memória (isso também possibilita a criação de programas híbridos que podem ser executados em sistemas diferentes). 2. As áreas em que a programação de baixo nível é necessária são: desenvolvimento do SO, desenvolvimento do driver, desenvolvimento de jogos AAA, etc. Normalmente, a programação de baixo nível não é feita em Java ou C #, é realizada usando a linguagem C / C ++ e Assembly.

Com apenas esses dois pontos, podemos dizer que a programação de baixo nível é feita separadamente e não há necessidade de programação de baixo nível na programação de alto nível. As partes em que baixa programação é necessária, como a E / S, são executadas pelo intérprete, que é escrito em uma linguagem de baixo nível (por exemplo, a JVM do java é escrita em C).

A principal resposta da sua pergunta é que essas coisas não são desenvolvidas usando Java e C #. Essas coisas são feitas em C e Assembly. Em vez de encontrar maneiras de fazê-lo em Java e C #, você deve aprender C e Assembly, pois são os maiores caras do mundo. programação e sim a grande vantagem é que o programa escrito em baixo nível é pequeno e veloz.

mur2501
fonte
este não parece oferecer nada substancial sobre pontos feitos e explicado em anteriores 6 respostas que foram postadas alguns anos atrás
mosquito