Durante años he considerado profundizar en lo que considero idiomas de "bajo nivel". Para mí esto significa C y montaje. Sin embargo, todavía no tuve tiempo para esto, y NUNCA ha sido necesario.
Ahora, como no veo surgir ninguna necesidad, siento que debería programar algún momento en el que estudiaré el tema o abandonaré el plan para siempre.
Mi posición
Durante los últimos 4 años me he centrado en las "tecnologías web", que pueden cambiar, y soy un desarrollador de aplicaciones, que es poco probable que cambie.
En el desarrollo de aplicaciones, creo que la usabilidad es lo más importante. Usted escribe aplicaciones para ser "consumidas" por los usuarios. Cuanto más utilizables sean esas aplicaciones, más valor tendrá.
Para lograr una buena usabilidad, creo que las siguientes cosas son viables
- Buen diseño : características bien pensadas accesibles a través de una interfaz de usuario bien pensada.
- Corrección : el mejor diseño no vale nada, si no se implementa correctamente.
- Flexibilidad : una aplicación A debe evolucionar constantemente, de modo que sus usuarios no necesiten cambiar a una aplicación B diferente, que tenga nuevas características, que A pueda implementar. Las aplicaciones que abordan el mismo problema no deberían diferir en características sino en filosofía.
- Rendimiento : el rendimiento contribuye a una buena experiencia de usuario. Lo ideal es que una aplicación siempre responda y realice sus tareas razonablemente rápido (según su frecuencia). El valor de la optimización del rendimiento más allá del punto en que el usuario lo percibe es cuestionable.
Creo que la programación de bajo nivel no me va a ayudar con eso, excepto por el rendimiento. Pero escribir una aplicación completa en un lenguaje de bajo nivel en aras del rendimiento es una optimización prematura para mí.
Mi pregunta
¿Qué podría enseñarme la programación de bajo nivel, qué otros lenguajes no me enseñarían? ¿Me estoy perdiendo algo, o es solo una habilidad, que es de muy poca utilidad para el desarrollo de aplicaciones? Por favor, comprenda que no estoy cuestionando el valor de C y el ensamblaje. Es solo que en mi vida cotidiana, estoy bastante feliz de que todas las complejidades de ese mundo se abstraigan y gestionen para mí (principalmente por capas escritas en C / C ++ y ensambladas). Simplemente no veo ningún concepto, eso podría ser nuevo para mí, solo detalles con los que tendría que pensar. Entonces, ¿qué hay para mí?
Mi conclusión
Gracias a todos por sus respuestas. Debo decir que nadie realmente me sorprendió, pero al menos ahora estoy bastante seguro de que abandonaré esta área de interés hasta que surja la necesidad.
Según tengo entendido, escribir ensamblajes en estos días para los procesadores, ya que están en uso en las CPU actuales, no solo es innecesariamente complicado, sino que corre el riesgo de tener un rendimiento de tiempo de ejecución más pobre que una contraparte en C. La optimización manual es casi imposible debido a OOE, mientras que no obtienes todo tipo de optimizaciones que un compilador puede hacer automáticamente. Además, el código es portátil, ya que utiliza un pequeño subconjunto de comandos disponibles o está optimizado, pero probablemente solo funcione en una arquitectura.
Escribir C ya no es tan necesario, como lo era en el pasado. Si tuviera que escribir una aplicación en C, utilizaría bibliotecas y marcos probados y establecidos, lo que me permitiría implementar rutinas de copia de cadenas, algoritmos de clasificación y otro tipo de cosas que sirven como ejercicio en la universidad. Mi propio código se ejecutaría más rápido a costa de la seguridad de tipo. No estoy interesado en volver a inventar la rueda en el curso del desarrollo normal de aplicaciones, ni en tratar de depurar mirando los volcados del núcleo: D
Actualmente estoy experimentando con idiomas e intérpretes, así que si hay algo que me gustaría publicar, supongo que Transmitiría un concepto de trabajo a C, aunque C ++ también podría funcionar.
Nuevamente, gracias a todos por sus respuestas y su visión.
Respuestas:
La programación de bajo nivel es para los casos de esquina donde existe un requisito que no está presente de inmediato en las computadoras de escritorio normales. Esto podría ser un cuello de botella de velocidad, o un cuello de botella de memoria o algo completamente diferente, y con mucha frecuencia es muy interesante ver qué se puede hacer con esos requisitos.
Piense en ello como Haikus o Limericks, donde las restricciones lo hacen interesante.
Para darle una idea de lo que es posible en lo que parecería imposible hoy, aquí está uno de los mejores hacks de la historia. ¡Ajedrez en 1 Kb de RAM! http://users.ox.ac.uk/~uzdm0006/scans/1kchess/
fuente
Estaba pensando esto recientemente. Actualmente me considero un desarrollador de C #, lo cual está perfectamente bien para mi carrera.
Sin embargo, de vez en cuando me pierdo las cosas de nivel realmente bajo (esencialmente 'ensuciarme las manos' al hacer ensambladores o controladores de dispositivos en C). Solo extraño la programación. No espero que eso me ayude en mi carrera masivamente. Si lo tuyo son los controladores de dispositivos o los sistemas integrados, entonces podría ser de gran ayuda.
Cuanto más programo en los lenguajes abstractos, más extraño lo que me metió en las computadoras en primer lugar: hurgar en la computadora y ver qué se contrae. Assembler y C son muy adecuados para hurgar :)
Al usar los idiomas más antiguos, creo que estás obligado a hacer casi todo por ti mismo. En C # puedo hacer algo como
myArray.SortBy(x=>x.Name)
. De ninguna manera podría hacer eso en C. Estoy aceptando que el idioma hará la mejor clasificación por mí. Si tuviera que hacerlo en C, podría volver a los días de mis módulos universitarios y revisar mis diferentes algoritmos de búsqueda y clasificación.Por lo tanto, creo que los idiomas de nivel inferior lo ayudarían a revisar cualquiera de los bits olvidados que se han abstraído. Más un desafío personal que una carrera que progresa.
fuente
Mi sugerencia es jugar con C como curiosidad intelectual. No invierta mucho tiempo porque no vale la pena.
Metas sugeridas:
fuente
si desea comprender cómo funciona la máquina , y no solo la máquina virtual de la que depende su lenguaje de alto nivel, entonces Assembly le enseñará esto
Si no tiene motivos para preocuparse, y la mayoría de los programadores realmente no lo hacen en estos días, no se preocupe por eso.
mejorará su base, pero probablemente no mejorará sus aplicaciones web
fuente
Cada lenguaje de programación cambia un poco acerca de cómo piensas acerca de la programación en general. Un ejemplo concreto que puedo darle es cuando comencé a aprender haskell y, de repente, los bits funcionales de javascript, ruby y python tenían mucho más sentido. Nunca antes había usado foldl en ninguno de mis códigos, pero después de haskell casi lo veo en todas partes donde veo matrices. Por lo tanto, hay muchas posibilidades de que si aprende algo de C se volverá mucho más consciente de las características de rendimiento relativo de varias construcciones en su lenguaje favorito. Hace unos minutos estaba escuchando una charla sobre la escritura de JavaScript rápido y optimizado y el orador dijo: "Si es difícil de hacer en C, entonces será muy lento en JavaScript". Su intención es que javascript sea un lenguaje interpretado y el intérprete esté escrito en C o C ++.
fuente
Si no lo haces solo por diversión, porque a los geeks realmente les encanta tener control total sobre su hardware, al menos podrías tener una mejor idea de cuánto más rápido puede ser un programa cuando se escribe en C en lugar de, por ejemplo, Java. También puede aprender a apreciar realmente las características de los lenguajes de nivel superior, como la recolección de basura.
fuente
¡Hurra por la curiosidad!
Es muy bueno tener una idea de lo que realmente está sucediendo en los niveles más bajos de un sistema complejo, incluso si no hay una necesidad lógica de saber para los deberes cotidianos. Con mucho, la mejor manera de asimilar las cosas a nivel de bits es construir su propia CPU. Debe pensar en códigos de operación de nivel de lenguaje de máquina, comprender por qué los conjuntos de instrucciones ortogonales son tan buenos, las complicaciones del manejo de interrupciones, las compensaciones entre circuitos complejos frente a microcódigos (por ejemplo, en unidades de multiplicación) y ¡tanta diversión!
Pero eso, obviamente, requiere conocimientos de electrónica y lleva mucho tiempo, por lo que lo mejor es jugar con una CPU de 8 bits de estilo antiguo. Los microcontroladores como el 8051 todavía se usan ampliamente y están disponibles para los aficionados. Eso todavía requiere algo de conocimiento en electrónica de pastoreo y hacer que los LED brillen sin fumar, y cuesta $$ si aún no está equipado para la electrónica.
Lo mejor después de eso: jugar en un simulador de CPU (¿emulador? Tengo esos términos mezclados): existen para Z80, 6502, 8086 ... todos los viejos 8-bitters. Eso puede ser lo más educativo y divertido para un programador de aplicaciones que no sabe qué extremo del soldador debe sostener (aunque uno aprende eso bastante rápido :) Cómo se escribe el texto en la memoria de video, cómo los trucos del código de ensamblaje ayudan con el rendimiento. ... hay muchas cosas divertidas para explorar a este nivel.
No estoy tan seguro de aprender C como un lenguaje más, sin una comprensión inicial del funcionamiento interno de la CPU. Saber cómo se envían los bits entre los registros de la CPU y cómo se accede a la memoria, ayuda enormemente a obtener realmente punteros y otros conceptos de lenguaje C.
fuente
En una palabra, diversión. Cuando solía jugar con el ensamblador (después de trabajar de VB a C ++, C, etc.) fue increíble mover datos de una parte del procesador a otra. Fue una gran sensación saber exactamente lo que estaba sucediendo dentro de la CPU, sin preocuparse por lo que estaba sucediendo debajo de lo que no sabías. Además de una gran sensación de libertad: puede hacer casi cualquier cosa, porque no hay limitaciones incorporadas que encuentre en los idiomas de nivel superior.
Además, poder recurrir a cualquiera que haya programado en cualquier otro idioma y decir 'bueno, si no eres lo suficientemente duro ...' fue una diversión infantil, infantil.
fuente
¿Hay alguna buena razón para aprender / practicar programación de bajo nivel? Tengo varias respuestas según el contexto.
Primero, estoy enseñando programación C (pero también OCaml y Java), motivar a los estudiantes a aprender programación desde el lado difícil es probablemente la parte más difícil de la tarea. El mejor argumento que he encontrado hasta ahora es la "comprensión": los lenguajes de nivel superior ocultan muchos mecanismos subyacentes y algunas veces no son para bien, también lo empujan a permanecer en el nivel superior incluso cuando algunos trucos de bajo nivel realmente podrían ser útiles ( para el rendimiento, la mayoría de las veces.) Comprender lo que está usando realmente puede ayudarlo a usarlo mejor. Mi experiencia docente me demuestra que los estudiantes que han aprendido programación de nivel inferior (y otros compiladores no orientados al usuario) son más adaptables y aprenden nuevos conceptos o herramientas de nivel superior más rápidos.
En segundo lugar, como usted dice, el rendimiento es parte de la experiencia del usuario. La mayoría de las veces, el rendimiento se ve como una cuestión de escritura compleja y cercana al código de máquina. Este no es siempre el caso, el rendimiento es mucho más una cuestión de algoritmos y estructuras de datos, sino también la interacción entre algo y datos. Utilizo un proyecto especial sobre el tema, básicamente es una simple búsqueda de ruta, pero el problema real es el tamaño de los datos: el gráfico es infinito. La única forma de lograr rendimientos de descenso y encajar en la memoria es escribir un asignador de memoria dedicado (de hecho, dos, un asignador de grupo y un asignador de reciclaje). Esto es algo que no se puede hacer en la mayoría de los idiomas de nivel superior. De hecho, la mayoría de los idiomas recolectados de basura tendrán problemas de rendimiento y memoria.
Probablemente haya muchos más argumentos, como la estabilidad (en el sentido de la historia y la longevidad) de los lenguajes de nivel inferior frente a los "exagerados" (el hecho de que un lenguaje considerado como referencia futura para la programación pueda desaparecer en unos pocos años es muy largo). historia, uno no puede predecir la longevidad de un material nuevo, pero este argumento sigue siendo cierto para los idiomas más antiguos ...), por supuesto, también hay una cuestión de gustos, o el hecho de que lo que se puede hacer en la mayoría de los idiomas de alto nivel también puede ser hecho en idiomas de nivel inferior pero no al revés (pero teniendo en cuenta eso, todos deberíamos codificar solo en ensamblador ...)
Yo mismo estoy atrapado en ambos mundos (de manera bastante diferente), pasé varios años trabajando en el concepto de programación teórica, el diseño de sistemas de tipo y la prueba, y al hacerlo solo tengo que usar y estudiar lenguajes de muy alto nivel (principalmente uno funcional, pero también puro orientado a objetos.) Recientemente volví al otro lado (principalmente programación de sistema y kernel) y me encontré bastante a gusto en esta área. ¡Me estoy divirtiendo mucho! Para mí, el siguiente paso es encontrar el punto común: ¡características de lenguaje de nivel superior para programación de nivel inferior! Entonces, hasta ahora no hay un lenguaje para eso (tal vez Google busque la programación del sistema de usuario) y estoy considerando la idea de construir mi propio idioma, pero esta es otra historia.
fuente
Diría que no hay muchas razones en su dominio, sin embargo, si tuviera que hacer algo de computación de alto rendimiento (por ejemplo, juegos, ciencia, etc.) estaría justificado.
fuente
Creo que hoy en día la programación de bajo y alto nivel puede estar bastante separada. Básicamente, esto significa que podría vivir toda su vida profesional sin conocer C y ensamblador sin ningún problema. Dicho esto, el lenguaje de programación C no puede enseñarle mucho desde los puntos de vista de programación y diseño.
Solo por curiosidad podrías aprender cómo funcionan las cosas en un nivel inferior. Cuando estaba en la universidad, por ejemplo, disfruté usando gcc para generar código ensamblador desde C ++. Fue útil comprender cómo se implementan el polimorfismo y la excepción. Pero aparte de eso, las únicas cosas que puedes aprender de C hoy en día son:
1) trucos de memoria sucia. C es la mejor manera de entender que no hay fondo en la locura de los programadores :)
2) Los GOTO se usan realmente (y son útiles) para deshacer errores
3) aprender mejor cómo funciona la asignación de memoria (¿diferencia entre apilar y apilar a alguien?).
Básicamente, mi tesis es: si ya terminaste la Universidad y todavía no necesitas C, entonces no lo aprendas :)
fuente
No es necesario que comprenda los idiomas de bajo nivel, pero debe comprender lo que sucede debajo de las cubiertas del idioma de alto nivel elegido. Usar un lenguaje de bajo nivel te enseñará esto, pero no es la única forma.
Aquí hay algunos ejemplos de conceptos de bajo nivel que pueden afectar los lenguajes de alto nivel.
Punteros:
Instrumentos de cuerda:
Liza:
¿Cuándo utiliza una lista frente a una lista vinculada? (Casi imposible saber esto sin comprender a un nivel bastante bajo de cómo funciona una lista)
-
¿Es necesario saber todo esto? No, pero puede tener un impacto y si quieres ser un maestro de un lenguaje de alto nivel necesitas tener una idea bastante buena del funcionamiento interno.
fuente
En particular, le enseñará cómo funcionan realmente las computadoras. No hay otra forma de aprender esto que a través de la programación de bajo nivel. No importa qué tipo de aplicaciones programe, esto siempre será útil. De hecho, comprenderá lo que sucede en el fondo debajo de todas esas cosas web. Y si está trabajando con Windows, toda la API está escrita en C, por lo que saber ese lenguaje le permitirá comunicarse directamente con el sistema operativo, siempre que necesite utilizar una función que carece de sus idiomas actuales y sus bibliotecas.
Por supuesto, la programación de bajo nivel le permitirá trabajar con cosas completamente diferentes, como la programación integrada y la programación en tiempo real, donde asm / C / C ++ es imprescindible. Si no tiene interés en este tipo de aplicaciones, no hay mucha necesidad de aprender asm / C / C ++.
Además, aprenderá bits y bytes. Manipulaciones de bits, hexadecimales, etc. Estas cosas que puede encontrar de vez en cuando incluso al hacer programación web / de escritorio. Los algoritmos de cifrado son uno de esos ejemplos en los que se usa.
fuente