¿Cómo manejan los programadores el desarrollo de software de bajo nivel en lenguajes de alto nivel?

20

Soy algo nuevo en programación y la mejor manera de hacer esta pregunta es con un ejemplo.

Sé cómo hacer cosas básicas en Java y C #. Cosas como una pequeña aplicación de formularios de Windows o hacer una clase genérica. Básicamente he estado aprendiendo y todavía no he intentado hacer nada grande. De todos modos, siempre he tenido curiosidad sobre cómo se hacen las cosas "bajo el capó", supongo que se podría decir.

Sé que todo se reduce a 1s y 0s y que los lenguajes ensambladores básicamente dan comandos a los patrones de 1s y 0s, pero parece que hay un salto desde allí para: usar una biblioteca para esto, una biblioteca para eso. Me parece que todo lo que C # puede hacer sin una biblioteca es aritmética y lógica binaria. Para obtener entrada o salida, utiliza bibliotecas, etc.

Sé que esta pregunta probablemente parezca obvia para algunos y sé que tengo mucho que aprender, pero ni siquiera sé por dónde comenzar con una pregunta como esta. Gracias.

Así que mi pregunta es esta:

Si alguien iba a hacer una máquina virtual o un emulador de Playstation, o un sistema operativo, o un controlador, o agregaría soporte mp3 a un reproductor multimedia, o haría su propio tipo de archivo, etc. ¿Cómo? No puedo ver la forma en que se haría con C # o Java.

En otras palabras, si leyera un libro como Professional C # by WROX o Programming C # by OReilly, ¿sabría cómo hacer estas cosas? ¿O tienes que aprender lenguaje ensamblador o algo de nivel más bajo como C ++?

fender1901
fuente
77
Un truco para comprender lo que está sucediendo "bajo el capó" es enfocarse y usar párrafos para facilitar la lectura y comprensión. Por favor editar esta pregunta a ser más fácil de leer.
S.Lott
1
Dado su interés, es posible que desee obtener una copia del Código de Charles Petzold: El lenguaje oculto del hardware y software de la computadora. Es una buena lectura. amazon.com/Code-Language-Computer-Hardware-Software/dp/…
DKnight
@ S.Lott Al rescate :-)
Martin Wickman
@ Martin Wickman: Si bien fue un trabajo muy bueno, ¿ayudó a @ fender1901 editar o enfocar?
S.Lott
1
@ Martin Wickman: deshacer los cambios no es el punto. Animar a otros a aprender haciendo es mi punto. Claramente ya lo sabes. @ fender1901 necesita aprender haciendo. Mi pregunta es esta: "¿ayudó a @ fender1901 editar o enfocar?" ¿Qué piensas?
S.Lott

Respuestas:

9

¡Interesante pregunta! Encontrará que lenguajes como Java y C # de hecho admiten una programación de nivel bastante bajo. Por ejemplo, mire algunos de los códigos fuente de E / S en OpenJDK para Java. Verá que los métodos de nivel superior se implementan con tecnologías de socket de nivel inferior, matrices de bytes y twiddling de bits.

Con respecto a C # y Java, esos lenguajes se compilan en bytecode, que se ejecuta en una máquina virtual. En realidad, puede ver y aprender del código de bytes (por ejemplo, ver cómo Java trata concatenando objetos String).

Si el entorno en el que se está desarrollando no aloja una de estas máquinas virtuales de nivel superior (a menudo debido a requisitos de espacio y rendimiento), entonces debe usar un lenguaje de "nivel inferior".

Creo que C / C ++ todavía gobierna el gallinero en el área de escribir controladores de bajo nivel, etc., ya que puede ajustar la gestión de la memoria y las estructuras de datos en el enésimo grado.

El ensamblaje es bastante especializado en estos días, es bueno tomar al menos un curso rápido para apreciar lo que sucede a ese nivel. Cuando escribe un ensamblaje para rellenar un registro mientras se está vaciando, comienza a apreciar el tipo de longitudes a las que debe ir cada capa del lenguaje de programación.

HTH

Martijn Verburg
fuente
¿Se puede programar con los idiomas intermedios o simplemente están allí para examinar?
fender1901
¿Pregunta si puede escribir el código fuente 'bytecode'?
Martijn Verburg
Yo creo que. Me pregunto si puede comenzar a codificar usando bytecode o il como lo haría con java o c #.
fender1901
Java o C #, muy pocas personas están manipulando el código de bytes, sin embargo, un grupo más grande de personas sí mira qué código de byte se reduce a su código de nivel superior particular
Martijn Verburg
4

La mayoría de la programación de "bajo nivel" básicamente equivale a una interfaz directa con el sistema operativo. La razón por la que no le parece que haya una forma "obvia" de hacerlo es porque, en general, los lenguajes de nivel superior como Java se esfuerzan por facilitar su uso y portabilidad. El código que interactúa directamente con el sistema operativo generalmente es mucho menos portátil que el código de nivel superior, a menos que esté envuelto en una abstracción.

En lenguajes de nivel inferior como C y C ++, la API del sistema operativo es directamente accesible (en gran parte debido al hecho de que la mayoría de los sistemas operativos están escritos en C, por lo que exponen una API a través del lenguaje C). Por ejemplo, en C en un sistema UNIX puede llamar a la ioctlfunción para interactuar directamente con un dispositivo.

Por supuesto, los lenguajes de nivel superior como Java y C # también necesitan hablar con el sistema operativo. Cada vez que abre un archivo o lee desde un socket de red, está interactuando con el sistema operativo. Es solo que Java y C # envuelven las llamadas del sistema operativo de bajo nivel en abstracciones de alto nivel, como un Socketobjeto. Este enfoque de nivel superior tiene la ventaja de que el mismo código Java funcionará en diferentes plataformas. Mientras que, la forma en que abriría un socket en C en UNIX es bastante diferente de la forma en que lo haría en Windows.

En general, cuanto más alto sea el nivel del lenguaje, menos control tendrá sobre cómo su programa interactúa con el Sistema Operativo. Dicho esto, es posible hacer muchas cosas que mencionas en un idioma de nivel superior. Por ejemplo, no hay ninguna razón por la que no pueda escribir una máquina virtual en Java o C #.

Charles Salvia
fuente
2

La buena noticia es que se puede hacer con Java o C #. El único problema que necesita saber es cómo . Básicamente, necesita saber estas pequeñas cosas agradables sobre Arquitectura de hardware (no es necesario para PC, pero Playstation si eso es lo que desea emular). Y me temo que necesitaría profundizar, como Assembler y Machine Language.
Todas las ALU, registros, MMU y otras cosas se pueden abstraer y emular con un lenguaje de alto nivel. Incluso puede llamar a funciones de bajo nivel para obtener soporte de hardware (aprenda sobre PInvoke y JNA por ejemplo).

Sin embargo, como eres principiante, no recomendaría comenzar con una tarea tan enorme. Te sugiero que aprendas C / C ++, un poco sobre Linux (u otro sistema operativo similar a Unix, es decir, FreeBSD), arquitectura de computadora, luego ensamblador ... Podría tomar algunos años, así que ...
lo que realmente necesitas es Motivación y paciencia.

Paweł Dyda
fuente
2

Lo que hice lo que aprendí con un lenguaje de alto nivel (Java) se interesó más, como tú, por los lenguajes y hardware de bajo nivel. En su estado más primitivo, una computadora es electrónica. 1's y 0's son solo cifras para cargas eléctricas (encendido y apagado). Una vez que comencé a comprender la lógica detrás de los procesadores, y lo que hay dentro de una Unidad de lógica aritmética, las cosas realmente encajaron.
Creo que deberías comenzar tus estudioscon cosas como la lógica booleana (AND, OR, XOR, etc.), luego comience a diseñar pequeñas ALU y observe cómo la memoria y los registros juegan en las cosas. Después de eso, aprenda un lenguaje ensamblador y luego se dará cuenta de cómo funciona una compilación. ¡Muy pronto los idiomas de alto nivel parecerán aburridos! :) Es una broma. Sin embargo, es hermoso cómo todo encaja, y debería ser divertido aprenderlo. Una vez que comience a seguir el camino de la curiosidad, recogerá las cosas en poco tiempo.

Trevor Arjeski
fuente
2

Si bien puedes hacer cosas de bajo nivel con C # o Java (o la mayoría de los otros lenguajes), la mayoría de las personas no lo hacen. Por lo tanto, cualquier libro razonablemente popular que elija, ya sea, dejará fuera las cosas de bajo nivel. Es probable que cubran las características del idioma que necesitaría, pero no las aplicarán de la manera que le interesen. Del mismo modo, los libros sobre cosas de bajo nivel probablemente estarán en C, con quizás un poco de lenguaje ensamblador.

Aprender C en sí no será difícil para un programador de C #, aparte de la manipulación del puntero, aunque aprender a hacer cosas en él llevará más tiempo. Dado que C es un lenguaje menos expresivo que C #, algunas cosas que usted sabe cómo hacer eficientemente en C # tendrán que hacerse de una manera muy diferente y, a menudo, más torpe en C.

Lo que debe buscar a continuación son libros sobre las cosas de nivel inferior que desea aprender. Hay libros sobre el kernel de Linux, por ejemplo, pero la programación a nivel del kernel será difícil de comprender sin algunos antecedentes, por lo que es posible que desee estudiar los fundamentos del sistema operativo primero.

David Thornley
fuente
Creo que mi mayor problema en este momento es que muchos de estos temas serán difíciles de entender porque no tengo los antecedentes. Necesito, supongo, un puente hacia esas áreas.
fender1901
@ fender1901: Eso podría ser un problema. El kernel de Linux hace algunas cosas que parecerían realmente extrañas para alguien que no entiende lo que hacen los sistemas operativos. El emulador, de las cosas que mencionó, probablemente sería el más fácil de entender, y existen emuladores simples, a menudo para las primeras microcomputadoras.
David Thornley
1

Debe descubrir que es posible realizar la función de bajo nivel con la plataforma / lenguaje utilizado o no:

  • almacenar un byte en una variable,
  • leer / escribir archivos por bytes,
  • configurar una matriz de bytes, acceder a elementos,
  • usar verdaderas funciones de procedimiento, OOP,
  • Accediendo a la pantalla, teclado, enchufes.

Hm, parece que elegir un idioma debe ser aleatorio.

ern0
fuente
-2

La pregunta tiene varias respuestas: 1. Java y C # son lenguajes de alto nivel, están desarrollados para el desarrollo de aplicaciones en un sistema operativo existente que gestiona la memoria (esto también hace posible crear programas híbridos que pueden ejecutarse en diferentes sistemas). 2. Las áreas donde se necesita una programación de bajo nivel es el desarrollo del sistema operativo, el desarrollo de controladores, el desarrollo de juegos AAA, etc. Normalmente, la programación de bajo nivel no se realiza en Java o C #, sino que se lleva a cabo utilizando C / C ++ y lenguaje ensamblador.

Con solo estos dos puntos podemos decir que la programación de bajo nivel se realiza por separado y no hay necesidad de programación de bajo nivel en programación de alto nivel. Las partes en las que se necesita una programación baja, como la E / S, la realiza el intérprete, que está escrito en un lenguaje de bajo nivel (por ejemplo, la JVM de Java está escrita en C).

La respuesta principal de su pregunta es que estas cosas no se desarrollan utilizando Java y C #, estas cosas se hacen en C y Assembly, por lo que en lugar de encontrar formas de hacerlo en Java y C #, debe comenzar a aprender C y Assembly, ya que son los tipos más grandes de programación y sí, la gran ventaja es que el programa escrito en bajo nivel es pequeño y rápido.

mur2501
fuente
Esto no parece ofrecer nada sustancial sobre los puntos formulados y explicados en las 6 respuestas anteriores que se publicaron hace unos años
mosquito