Si el lenguaje ensamblador me resultara fácil, ¿también me resultaría fácil?

Comencé con el código de máquina hexadecimal. La asamblea fue un gran paso para mí. Poder codificar a ese nivel, no, tachar eso, ser REQUERIDO codificar a ese nivel fue un gran problema para mí cuando llegué a mi primer “lenguaje de alto nivel”.

Había estado haciendo mi propia E / S (byte a byte, o configurando DMA y detectando interrupciones). Había estado haciendo mi propia gestión de memoria y tenía mis preferencias sobre dónde iban las cosas. Estaría escribiendo, bueno, digamos que el código fue MUY eficiente en espacio a expensas de ser comprensible. Había estado escribiendo código para el que no había más optimizaciones, porque había trabajado en cada instrucción, cada vez que el procesador pirateaba para maximizar el rendimiento. Incluso había pensado mucho sobre las ubicaciones de la tienda de trabajo en función del tiempo del ciclo de memoria en función de qué hoja de memoria estaba activa en ese momento.

Y luego me enfrento a un lenguaje de alto nivel: PL / I

Hola2: opciones de proceso (principal);
poner lista (‘¡Hola, mundo!’);
fin Hello2;

¿Qué demonios era el infierno triplemente perfecto? ¿Cómo se tradujo a algo que realmente entendí?

Estaba desconcertado. Asumiría una tarea, la examinaría en ensamblador en minutos, luego trabajaría durante horas tratando de descubrir cómo hacerlo en PL / I. Contra-intuitivo, sí, pero así fue. Finalmente dejé el curso.

Tuve suerte. Encontré, por casualidad, un libro mágico llamado “IBM System / 370 Principals of Operations”. Eso, más una tarjeta de referencia de IBM 370 Assembler, lo configuró todo bien para mí. Me di cuenta de lo que estaba haciendo este “compilador” con mi código, y estaba feliz de nuevo.

Regresé, volé la curva en la introducción al curso de programación el próximo semestre, nunca miré hacia atrás.

Lo que sucedió a lo largo de ese camino fue realmente importante: también descubrí el libro Structured Programming de Ed Dijkstra y “entendí” que mientras estaba elaborando un código de rendimiento serio, me estaba perdiendo el punto. No estaba pensando algorítmicamente, o al menos, no tanto como debería haberlo hecho. Comencé a pensar en términos de estructuras de datos, sobre las cuales se realizaban las operaciones, en lugar del código que se ejecutaba en los datos. Es un gran cambio.

Y le garantizo que si está escribiendo en ensamblador y pregunta acerca de C, no ha cruzado esa división. Es probable, como yo, autodidacta. Eso es genial y todo, me quito el sombrero, pero te lo estás perdiendo. A lo grande.

C, una vez que comprenda la importancia de las estructuras de datos y el pensamiento algorítmico, cambiará su vida. Es probable que seas un gran imbécil cuando se trata de código de rendimiento, ya que puedes activar el interruptor “-s” y mirar la salida y optimizar tu código manualmente para ayudar al compilador a producir un código mucho mejor que él nativamente se inclinaría a hacer (pista: muchas veces hacer-hasta es una victoria más grande que un enunciado while).

Pero no estás ahí. Necesitas llegar allí, para entender lo que no.

Luego, retrocede, prenderás fuego a tu mundo.

Si. Respaldo todo lo que Pat Roberts escribió (he estado programando en C desde 1980), pero agregaría que tal vez disfrutes aprendiendo otro idioma, Julia, dependiendo de lo que intentes lograr con la programación en lenguaje ensamblador / C.

Para un programador en C, una cosa genial que tiene Julia es que puede ver exactamente qué código de ensamblado nativo se genera para una función (o es AST o LLVM IR), con una simple llamada de macro, es decir, `@code_native function (args) `. (Para C, tuve que compilar constantemente con -S, y luego mostrar el archivo en mi editor, para ver si C estaba generando el código de ensamblaje que quería). Julia también puede llamar a C directamente, así que tampoco me falta nada.

Algunos podrían encontrar molesto que yo, posiblemente el menos calificado de los que responden aquí, estoy trayendo esto, pero hablando de “lenguaje ensamblador” como un sustantivo singular ignora su ambigüedad. ¿Estás hablando de x86? x86_64? MIPS, incluso?

Supongamos que el viejo x86 de 32 bits normal. Depende de lo que quieras decir con “fácil”. Decir que lo encontraste fácil implica que has terminado de aprender, pero es muy, muy poco probable que conozcas todos los entresijos de x86, o incluso todos los códigos de operación que podría generar un compilador de C. ¿Qué tal los extraños como phminposuw? Registros de control?

Sé una cantidad razonable sobre x86 y sé bastante de C, y de lo que sé sobre cada uno diría que si realmente ha dominado un lenguaje ensamblador, escribir código C para la misma plataforma con el mismo conocimiento relativo generalmente Ser mucho más rápido y más fácil. Cada “unidad” (instrucción / declaración) tiene mucha más potencia y generalmente se puede usar en muchas plataformas diferentes. Tampoco tienes que preocuparte por muchas cosas.

Tener una asamblea te ayudará mucho con C. ¿Tienes un accidente extraño? Puede ver y comprender exactamente dónde y por qué se bloquea. ¿Estás jugando con carrozas y tu código se vuelve lento? Puedes entender por qué. Comprenderá POR QUÉ son las cosas y cómo ajustar su código para mejorarlo. Y probablemente podrá saber qué partes de su código son vulnerables y cómo solucionarlas.

Pero como dijo David Ecale, debido a ese conocimiento de exactamente lo que está sucediendo, puede ser difícil obtener una visión general de las cosas. Puede ser difícil de comprender “y crea un nuevo objeto Car y llama a su método setColor”, pero está bien.

A pesar de mi inexperta, voy a ir en contra de las otras respuestas y decir que C probablemente no será súper fácil. Podrá comprender lo que está sucediendo, pero si solo tiene experiencia en ensamblaje, no habrá desarrollado conceptos de cosas como operadores, clases y otras cosas que podría proporcionar el aprendizaje de un lenguaje más similar como Java. Puede descubrir que sabe lo que desea que genere su compilador, pero no cómo hacer que lo genere. Pero si aprende lenguaje C y ensamblador para su plataforma, su comprensión y conocimiento serán piadosos.

Espero no sonar arrogante … ¡buena suerte!

Si tiene buena experiencia con el ensamblaje (por ejemplo, ha trabajado mucho con punteros y aritmética de punteros), encontrará que C es un lenguaje bastante natural. En su mayoría, C es lenguaje ensamblador sin la necesidad de registros, además de la conveniencia de obtener expresiones, bucles y llamadas a funciones justo cuando las codifica.

Si. 🙂

Probablemente aún más fácil, ya que el ensamblaje tiende a ser más complejo con declaraciones más complicadas y una administración de memoria más compleja.

Sin embargo, si crees que el ensamblaje es fácil, no creo que lo hayas dominado por completo. El ensamblaje puede parecer fácil al principio, pero puede volverse bastante complejo una vez que realmente comienza a construir proyectos con él. Una vez que necesite lidiar con las interrupciones, la asignación de memoria, el subprocesamiento múltiple y el manejo de archivos serán mucho más difíciles. Esas cosas son más fáciles en C.

Tal vez

Todo depende de lo que hayas logrado codificar en Assembly. Simplemente entender a Assembly y poder codificar programas muy simples en el lenguaje no es lo mismo que ser un gurú de Assembly.

Escribir un programa suficientemente complejo en Asamblea es un dolor, por eso pocas personas lo hacen. Aquellos que programan en la Asamblea generalmente tienen una razón específica para hacerlo.

Además, lo que es más importante, escribir Assembly no garantiza que seas un buen programador en C, o bueno para escribir en cualquier lenguaje de alto nivel.

Para ser un buen programador, necesita escribir código que esté bien estructurado y que no se vea como un código de espagueti. Los lenguajes de programación de alto nivel le brindan construcciones para escribir código agradable y bien estructurado, mientras que el lenguaje ensamblador no lo hace.

Por ejemplo, en C, nunca querrás usar una instrucción jump / goto, pero en Assembly ese es básicamente el único tipo de control de flujo que tienes. Entonces, la razón para aprender un lenguaje de alto nivel antes de aprender uno de bajo nivel es para que pueda desarrollar buenas prácticas de programación.

Al contrario de las respuestas anteriores, ¡NO! !!!

Aprender el lenguaje ensamblador y la verdadera física de la operación de una computadora, así como las construcciones físicas de archivos de datos y formatos de disco ¡ENVENENARÁN su perspectiva!

* Nunca * podrá volver a considerar los conceptos “abstractos” de estructuras de archivos, punteros, etc. sin la REALIDAD DE LAS OPERACIONES FÍSICAS que ocurren.

Creeme lo se. ¡He estado allí! “C” es genial, ¡pero los programadores de C que no entienden el hardware subyacente son tontos! ¡Y tratar con ellos es doloroso como mínimo!

No necesariamente.

En Assembly, le preocupa principalmente el estado de la CPU. En C, le preocupa el estado de la memoria .

Aunque sutil, esto abarca algoritmos, estructuras de datos y consistencia de ejecución. Es cierto que incluso en el ensamblaje puede implementar todo esto, pero es comparable a implementar la orientación a objetos en C: se puede hacer, tal vez sea más difícil.

Detener. ASM es fácil, también lo es C. Aunque técnicamente es más difícil de escribir que un lenguaje moderno, el espacio del problema es más estrecho. Hay fundamentalmente menos que puedes hacer con él.

ASM es para JavaScript, como lo es la física newtoniana para la bioquímica molecular. Uno tiene un alcance muy pequeño y está bien definido, el otro es complejo y desordenado.

Por ejemplo, su ASM se ejecuta en una máquina, un tipo de hardware en una ubicación frente a My JavaScript se ejecuta en> 1000000 máquinas diferentes, en diferentes ubicaciones geográficas en hardware diferente y> 8 sistemas operativos diferentes.

No solo lo encontrará fácil, sino que probablemente le encantará C. Es bastante fácil visualizar cómo su fuente C se correlacionará con el ensamblaje. El único inconveniente es que C (como casi cualquier otro idioma) solo proporciona características comunes a todas las CPU. Esto lo hace vainilla, pero se compilará en casi cualquier sistema. También puede integrar características de ensamblaje que no están en C dentro de su fuente C utilizando intrínsecos (intrin.h o intrinsics.h), que son algo portátiles.

Cuando escribí por primera vez algo de C (estilo K&R en PDP-11) pude ver cuántas operaciones se asignarían al ensamblador; algunas formas parecían ser 1: 1 con instrucciones PDP-11 únicas (* p ++, * (- p)), pero otras requerirían dos (* (++ p), * p–) debido a los modos de registro limitados en el conjunto de instrucciones, básicamente hay operaciones de incremento / decremento automático suficientes para implementar una pila. También parece que C completa la operación de ensamblaje “faltante” para hacer las cosas más simétricas, aunque puede terminar con alguna penalización, será pequeña y probablemente diferente en ARM en comparación con X86.

Para responder esto, creo que sería más sencillo si quisieras decir fácil en el sentido sintáctico o fácil, ya que en las construcciones de codificación son muy sencillas e intuitivas. Pero para responder a la pregunta, supongo que diría que no necesariamente, ya que los lenguajes de alto nivel pueden admitir construcciones conceptuales para realizar una determinada tarea. Con las construcciones enterradas bajo abstracción, a veces puede llevar un poco más de tiempo identificar correctamente lo que el código intenta realizar.

Sintácticamente, Assembly puede ser un conjunto fácil de mnemotécnicos para recordar junto con los efectos secundarios de cada instrucción. C, por otro lado, usa muchos más símbolos para hacer sus construcciones programáticas …

Sin embargo, una cosa es segura. Una vez que aprenda un lenguaje de nivel superior, hará que la programación de su software sea mucho más fácil en general.

Espero que sea algo informativo y en el camino correcto.

Gracias

Es otra cosa, C es un lenguaje mucho más complejo que te hace considerar mucho más en cada paso que das. También lo hace mucho más cómodo con lo que puede hacer y las opciones que puede tomar. A veces se vuelve demasiado complejo y pueden surgir errores. Ahí es donde debes asegurarte de practicar mucho, a menos que uses esas herramientas, como checkmarx, que te ayuden.

Buena suerte. Sigue practicando.

Es muy probable que encuentre todo lo demás fácil. Creo que algo importante sobre la programación es la capacidad de saber cómo obtener un resultado deseado de la manera más simple posible y eso es algo que va más allá de un lenguaje de programación específico. Entonces, lo más probable es que estés en camino de convertirte en un gran programador.

Usted puede. Pero realmente, ¿no debería ser la pregunta importante si lo harás, aprenderlo mejor? Creo que la respuesta a eso es claramente sí.

Te estás centrando en lo incorrecto. Todos los lenguajes de programación son fáciles. Decidir qué necesita programar es difícil, en realidad no hacerlo.