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 ++?
Respostas:
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
fonte
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
ioctl
funçã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
Socket
objeto. 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 #.
fonte
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.
fonte
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.
fonte
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.
fonte
Você deve descobrir que é possível executar a função de baixo nível com a plataforma / idioma usado ou não:
Hum, parece que a escolha de um idioma deve ser aleatória.
fonte
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.
fonte