¿La asamblea como primer lenguaje de programación? [cerrado]

12

¿Qué tan buena idea crees que sería enseñar a la gente a ensamblar (alguna variante) como primer lenguaje de programación? Tomaría mucho más esfuerzo que aprender, por ejemplo, Java o Python, pero uno tendría una buena comprensión de la máquina más o menos desde el "primer día de programación" (en comparación con muchos lenguajes de nivel superior, al menos). ¿Qué piensas? ¿Es una idea realista, al menos para aquellos que están dispuestos a hacer un esfuerzo extra? ¿Ventajas y desventajas?

Nota: no soy profesor, solo curiosidad

Anto
fuente
55
Creo que es más adecuado para personas que estudian ciencias de la computación y no ingeniería / desarrollo de software
Imran Omar Bukhsh
1
@Imran Estoy de acuerdo con el director, pero todos los programas de nivel universitario en los que puedo pensar tienen títulos en Ciencias de la Computación que obtienen las personas que en su mayoría trabajan en Ingeniería de Software. (Supongo que esta pregunta se trata de una base seria para una carrera de programación, no, por ejemplo, un curso de encuesta de secundaria)
G__
77
@ Imran - Eso me pareció un poco sorprendente. ¿La informática seguramente se inclina más hacia las matemáticas y la teoría? Más interesado en conjuntos, álgebras abstractas y notación asintótica que en jugar con los bits y escribir repeticiones interminables de move-blah-to-blah.
Steve314
2
La informática ciertamente tiene temas de resúmenes, pero también está muy "cerca del hardware" en algunos aspectos. Una vez asistí a LICS, una conferencia de informática. Recuerdo que tenía documentos sobre la localidad de datos de varios algoritmos de clasificación que imagino proporciona bases teóricas para el estudio de la eficacia práctica de los algoritmos. En cuanto a montaje, personalmente me parece que tiene cierta semejanza con algunos modelos teóricos de cálculo (máquinas de Turing, máquinas de venta libre ...)
Joh
1
Todo programador debería al menos leer sobre cómo funciona el ensamblaje, IMO. Me dio mucha información y, por lo general, estoy tan cerca del cromo como puedes obtener. El lenguaje de ensamblaje paso a paso de Jeff Duntemann es una lectura divertida para principiantes.
Erik Reppen

Respuestas:

14

Sería difícil inspirar a un nuevo programador con código de ensamblaje. Un hola dinámico, el sitio web del usuario es mucho más genial con menos esfuerzo. No digo que las lecciones fundamentales sean las mismas, pero un curso introductorio tendrá un gran contenido inspirador, o de lo contrario no habrá un segundo curso.

Recuerdo que mis primeros cursos de programación se enseñaron en Scheme y me sentí frustrado porque no podía compilar fácilmente un archivo .exe y "ejecutar" mi programa (pensé que MS Visual Basic era el final de la programación). No fue hasta años después que realmente comprendí con qué herramienta poderosa había estado jugando. Creo que lo hubiera apreciado más y hubiera aprendido mejor esas lecciones si hubiera tenido alguna experiencia temprana en algo un poco más pragmático al principio.

SOL__
fuente
20
He visto a muchos estudiantes que estaban mucho más asombrados haciendo que un LED parpadeara y un motor se moviera.
cuál es
1
@Whatsisname +1, eso sería una demostración impresionante, siempre y cuando se pueda hacer sin quedar atrapado en la electrónica. Por supuesto, eso también se podría hacer con un lenguaje de nivel superior, es decir, piratería de Roomba, si el "conductor" fuera una caja negra proporcionada por el instructor.
G__
1
Muchos programadores nuevos se inspiraron en el ensamblaje en el VIC20, C = 64 y máquinas similares.
Gaius
2
@Gaius ¡No al principio! Enciende esas máquinas y está en un intérprete básico. La asamblea llega después de una buena cantidad de experiencia y llegando a los límites de lo que puede hacer lo básico ...
G__
1
@whatsisname pero puedes usar algo como un Arduino para parpadear LED y mover motores sin tener que aprender a ensamblar
Ken Liu
12

Creo que es una idea terrible para los estudiantes de Ingeniería de Software y CS, y en general para cualquiera que esté más interesado en la programación que en la electrónica.

Se puede hacer, pero no significa que deba hacerse. En el pasado, la forma de hacer cosas realmente geniales con las computadoras domésticas era aprender primero el ensamblaje. Eso se debió a las primeras limitaciones de hardware: los lenguajes de nivel superior simplemente no eran lo suficientemente potentes y rápidos. Hoy en día, puedes hacer cosas mucho más geniales, en menos tiempo, con un lenguaje de nivel superior.

¿Qué suena más interesante, escribir un prototipo rápido para un juego simple y jugar con variaciones en un algoritmo, o luchar con registros y cosas de bajo nivel?

Andres F.
fuente
3
Como pianista, ciertamente me habría resultado más interesante saltar directamente con algunas canciones, pero para ser decente necesitas practicar arpegios, escalas, etc. Y luego hacer cosas realmente innovadoras (tocar con "pianos preparados" y similares) necesita saber cómo funciona el piano de adentro hacia afuera. Todo es lo bien que quieres conocer tu oficio.
John
10
@John en CashCommons: mala analogía. Comenzar con el ensamblador es como comenzar con los martillos, el teclado, las pesas y los amortiguadores. Y luego pasamos a la teoría de la música (círculo de quintas) para explicar el negocio de las teclas negras y las teclas blancas. Luego pasar a más teoría de la música antes de tocar una escala.
S.Lott
3
@ S.Lott: Ehhhhh ... no compre eso. Puedo escribir un programa tipo "hola mundo" en conjunto sin preocuparme por los transistores. No es necesario ser un diseñador de chips para ser un programador. El conocimiento del que está hablando sería la base para construir o reparar un piano, lo que solo está relacionado con tocar un piano.
John
3
@John en CashCommons: "construir o reparar un piano". Esa es la analogía con el ensamblador. Se puede escribir un trivial "hola mundo" en ensamblador , pero son solo llamadas a la API del sistema operativo, en efecto ignorando todos los detalles horripilantes del ensamblador. Para escribir controladores de E / S, el ensamblador es esencial. Del mismo modo, los martillos y amortiguadores tratan de construir y mantener, no de realizar.
S.Lott
1
@ S.Lott: Hmmmm ... Supongo que el conjunto de instrucciones en particular depende del chip, ¿no? Buen punto.
John
7

No creo que sea una idea terrible, pero ¿qué tan complejo programa les vas a dar a estos estudiantes? El montaje requiere mucho más trabajo. Puede estar bien comenzar con cosas muy básicas y luego moverlas a algo más fácil de trabajar, una vez que hayan recibido una apreciación por trabajar en el nivel inferior. Los estudiantes primerizos a veces tienen ideas en la cabeza, codificarán el próximo Halo, MS Office o AutoCAD o algo así, y cuando vean cuánto trabajo se dedica a un lenguaje ensamblador simple , podrían asustarse, así que aclare que hay mejores cosas que ensamblar y luego moverlas a eso una vez que hayan visto los conceptos. También podría intentar enseñar ensamblaje por concurrencia con algo más como C.

Además, ¿qué lenguaje ensamblador? De alguna manera recuerdo que MIPS era relativamente fácil de trabajar, y creo que se ejecuta en un emulador, por lo que no hay peligro de causar problemas a la máquina real , aunque ahora puede haber mejores herramientas que esa.

Esto podría funcionar bien, si se hace bien. Sólo sé cuidadoso...

FrustratedWithFormsDesigner
fuente
+1 por la complejidad del problema. Mi voto sería contrastar algunas implementaciones de ensamblador con implementaciones de lenguaje de nivel superior. Y tal vez use, por ejemplo, el ensamblador 68000 en un emulador en lugar de x86: no sé cómo ha evolucionado el ensamblador x86 / amd64, pero el 68000 era mucho más limpio y fácil de trabajar que 8086 en ese entonces. También vale la pena considerarlo: un ensamblador de máquinas virtuales como el que puede obtener con LLVM. No es lo mismo que el ensamblador real, pero comparte muchos principios similares y probablemente sea más relevante.
Steve314
Enseñar ASM simultáneamente con C suena como una muy buena idea
Anto
@ Steve314: No estoy en el ensamblador x86, pero parece que se ha vuelto más complicado que 8086.
David Thornley
@David: eso espero, pero es posible que se haya simplificado de alguna manera. En los 8086 días, el rango de modos de dirección disponibles dependía del registro particular que estaba usando, así como de las instrucciones. En 68000, había (para la mayoría de los propósitos) registros de datos y registros de direcciones, con cada tipo utilizado de manera bastante uniforme, sin problemas de "esto es un índice o un puntero base" o "lo que es complicado". Con el tiempo, ¿tal vez eso cambió? El 68000 también tenía más registros, ahorrando en algunos movimientos de entrada y salida de memoria. De todos modos, no necesita aprender cosas SIMD para obtener los principios básicos del ensamblador.
Steve314
@David: no puedo creer que haya olvidado (reprimido) el direccionamiento segmentado. Esto fue suficientemente malo en un lenguaje de alto nivel. Ahora hay un direccionamiento segmentado nuevamente, pero es algo diferente, relacionado con la memoria virtual, etc., que los programadores de nivel de aplicaciones no deberían tener que preocuparse.
Steve314
7

La asamblea fue el primer idioma que aprendimos en la escuela de electrónica (en la década de 1900) y parecía una elección natural. Nos abrimos paso a través de nuestros cursos desde componentes discretos, hasta lógica de resistencia-transistor, puertas lógicas, circuitos integrados, procesadores y hasta programación en ensamblaje. Muchos de los estudiantes en estas clases nunca antes habían programado en ningún idioma y lo aprendieron de inmediato.

Por lo tanto, la asamblea puede ser una buena opción para un primer idioma si se establecen las bases adecuadas para el estudiante. Sin embargo, para cualquiera cuyo objetivo sea ser un desarrollador de aplicaciones o web, creo que el ensamblaje es probablemente un punto de partida de muy bajo nivel.

Bill el lagarto
fuente
7

Una cosa es segura, si las personas, aprendiendo primero la Asamblea, lo logran, serán programadores increíbles.

Esto me recuerda cuando aprendí a conducir. Mi madre insistió

Aprenda sobre un automóvil automático hasta que gane confianza y luego podrá conducir nuestros automóviles manuales.

El razonamiento es que no quería que me distrajera con más de lo que necesitaba, todo de una vez.

Aplique eso a aprender a programar, ¿es necesario arrojar todo sobre un alumno de una vez? Aprenden qué es una variable al mismo tiempo que aprenden cuántos datos pueden almacenar en qué tipo de registro.

Más de la mitad de mi clase reprobó nuestra clase de asamblea, y este era un grupo de personas que, en ese momento, se consideraban conocedores de la programación durante más de 2 años.

Mi preferencia personal, si tuviera que aprender todo de nuevo, sería comenzar con un idioma que haga todo lo posible por mí. Luego, a medida que aprendo, retroceda hacia los idiomas de nivel inferior.

CrazyPenguin
fuente
1
Creo que este es un buen consejo. En algún momento, es importante tener en cuenta los bits y bytes y lo que el procesador hace con ellos, pero comenzar con ellos es un esfuerzo enormemente derrochador porque tenemos lenguajes como Ruby y Python que son perfectos para principiantes y fomentan excelentes principios de ingeniería de software.
davidk01
1
¿Ha considerado la posibilidad de que el instructor hiciera un trabajo poco estelar al enseñar la clase de lenguaje ensamblador?
John R. Strohm
Creo que hizo un trabajo increíble.
CrazyPenguin
3

¿Es una idea realista, al menos para aquellos que están dispuestos a hacer un esfuerzo extra?

No

pero uno tendría una buena comprensión de la máquina

¿Por qué es eso ventajoso? ¿Puede proporcionar un ejemplo o una pista sobre cómo esto podría tener algún valor?

¿Ventajas y desventajas?

Ventajas: ninguna.

Desventajas

  • Un montón de curiosidades aleatorias sobre banderas y estados y registros y esquemas complejos de direccionamiento de memoria y dispositivos de E / S y DMA e interrupciones y ciclos de reloj y demás. Ninguno de los cuales ayuda a comprender los lenguajes y la informática modernos basados ​​en VM.

  • Una desconexión de la resolución de problemas real a la que se aplican realmente las computadoras.

  • Un divorcio de los usuarios finales y los datos prácticos y los problemas de procesamiento que necesitan resolver.

  • Una serie innecesaria de explicaciones de la máquina y la máquina virtual y el compilador e intérprete y toda la pila de tortugas que sostienen el mundo.

  • Una gran cantidad de "esta es la implementación física de un 'objeto'" en el lenguaje de nivel superior al que finalmente llegan.

  • Una gran cantidad de "así es como se distribuyen las funciones del método" en el lenguaje de nivel superior al que eventualmente llegan.

  • Muchas de las explicaciones de "esto no se aplica a 80386 pero sí a 80586 chipset".

  • Muchas llamadas de API de sistema operativo de bajo nivel para hacer que un programa ASM haga algo que parezca ser útil para alguien.

El objetivo de un primer lenguaje de programación no es dominar el conjunto de chips.

El objetivo de un primer lenguaje de programación es

  1. Comprende cómo pensar en informática.

  2. Comprenda cómo hacer un procesamiento de datos útil.

  3. Comprende cómo hacer algo. Diseño - código - prueba.

S.Lott
fuente
1
@ S.Lott - Claro, ese no es el punto de mi pregunta original, pero podría ser ventajoso tenerlos antes de pasar a los idiomas de nivel superior. No me malinterpretes, haces un punto válido.
Anto
3
-1 Muchas de tus desventajas considero ventajas. Es mejor saber cómo funciona el nivel bajo, antes de usarlo desde arriba. Los fundamentos son importantes.
Orbling
1
Assembler como lenguaje de programación, lo expone mucho mejor a la estructura de datos, la lógica y más bases de bajo nivel que los lenguajes de nivel superior. Ambos tienen un lugar, el ensamblador podría ser más fácil de entender que los lenguajes de nivel superior, siempre que no haya intentado lograr algo demasiado complicado. Las personas no deberían estar tratando de hacer cosas complejas al principio.
Orbling
44
La ventaja del ensamblador es que demuestra cómo funciona una computadora real. Ya sabes. La cosa en la que todo funciona realmente .
Paul Nathan
1
@ S.Lott - No, pero eso significa que puede utilizar muy bien la mayoría de los conocimientos antiguos que ha reunido y agregar nuevos conocimientos con el tiempo. Mira, lenguajes de alto nivel como Python vienen con nuevas versiones a través del tiempo, pero el conocimiento de edad es aún utilizable (y, de hecho, Python rompió la compatibilidad hacia atrás con v3)
Anto
3

Si me encargaran diseñar un plan de estudios, tendría dos cursos en ejecución al mismo tiempo el primer semestre: asm + organización / arquitectura básica de computadoras, y un curso basado en SICP fundado en Scheme. El segundo semestre estaría orientado a estructuras de datos y algoritmos elementales en Scheme.

El segundo año sería un proyecto de un año de duración utilizando uno de Delphi, C ++ o C #, centrado en el diseño de software moderno (diseño OO, diseño funcional, ingeniería de software, control de versiones, etc.).

El efecto debería ser dar una base intensa tanto en lo abstracto como en lo práctico, conduciendo a cursos en profundidad en el tercer y cuarto año.

Paul Nathan
fuente
3

Solía ​​asistir a clases introductorias de informática, y creo que es una mala idea.

  1. Assembly usa tanto la lógica (si esto pasa a eso) como las traducciones muy difíciles entre conceptos y números. Los estudiantes de introducción de CS a menudo luchan solo con la lógica (bucles, si / si no, expresiones booleanas), y realmente necesitan lidiar con esto antes de preocuparse sobre qué números significan qué expresiones lógicas. El uso de lenguajes de nivel superior resume esta lógica para los estudiantes que no han tenido ninguna razón para pensar de esa manera antes.
  2. Las clases introductorias de CS no son necesariamente tomadas solo por los mayores de CS que continuarán con CS. A menudo, también son tomados por otras especialidades de ingeniería y no especializadas que simplemente están "recorriendo" un tema interesante para una materia optativa. La asamblea es ideal para una base para estudiantes de CS comprometidos y comprometidos, pero no ofrece una visión general muy buena de lo que a menudo es la programación para los estudiantes que consideran la especialización o que nunca van a tomar la especialidad pero quieren una introducción al campo. ; ni es terriblemente útil por sí solo en la mayoría de los campos.
  3. Los lenguajes de nivel superior hacen que el núcleo de la programación real funcione más transparente. El ensamblaje aborda algunos temas fundamentales clave: conceptos básicos de memoria, conceptos básicos de rendimiento, etc., pero realmente no entra en la creación de un diseño legible y fácil de mantener, que es más importante en estos días, IMO. Los primeros estudiantes parecen tener a menudo las ideas anticuadas de "Los verdaderos programadores escriben código que nadie más puede manejar", y enseñar un lenguaje de nivel superior ayuda a enseñar que la codificación es una tarea de colaboración y no solo sobre ser brillante.

Dicho esto, creo que el hardware de ensamblaje / computadora debería ser una clase muy temprana, idealmente, el primer trimestre de la carrera. Haga que los estudiantes obtengan un lenguaje de alto nivel debajo de sus cinturones, luego salte a las cosas de hardware de bajo nivel de inmediato antes de pasar a las estructuras de datos, idealmente en un lenguaje que requiera el manejo de la memoria.

Ethel Evans
fuente
Muy bien dicho, estoy de acuerdo. El primer curso necesita llegar al punto, mostrar la utilidad de extremo a extremo de las habilidades que se están aprendiendo y disparar la imaginación: "¡Dios! ¡Puedo programar? Ahora, ¿qué más puedo hacer con esta nueva habilidad ..." Acuerde también que el mejor momento para el lenguaje ensamblador es después de un lenguaje de nivel superior. Eso motiva a mirar "bajo el capó" cómo la computadora realmente está entendiendo las cosas de nivel superior. Ver el lenguaje ensamblador por primera vez después de que un lenguaje de nivel superior deja otro impacto poderoso: el estudiante encuentra electrónica, chips, sensores, etc.
Assad Ebrahim
3

La asamblea fue mi segundo idioma, justo después de BASIC. Sin embargo, cuando estaba aprendiendo era un momento diferente. Mi Commodore 64 tenía otros idiomas disponibles, pero si quería que algo pareciera rápido, o deseaba hacer más de una cosa a la vez, tenía que aprender el lenguaje ensamblador y cómo trabajar con las interrupciones. El sistema operativo de entorno gráfico (GEOS) que le dio al Commodore un sistema de ventanas también fue todo ensamblado. En general, fue la mejor API de ensamblaje que he visto. También fue la única plataforma que utilicé donde puedes diseñar tu código. Así es, podría usar cursiva y diferentes tamaños de fuente, algo que resultó útil para leer los comentarios.

Aprendí mucho sobre cómo funcionaba el Commodore, pero el chip Motorolla tenía un conjunto de códigos de operación muy simple. No es demasiado difícil mantener menos de 255 códigos de operación separados entre sí. Yo era no poder valerse de mi experiencia en el chip de 6510 Motorolla a la programación para el Intel 8086. Las patatas fritas y arquitecturas de sistemas eran demasiado diferentes. Me imagino que también habría tenido los mismos problemas para pasar al chip Amiga's Motorolla 68000.

En resumen, tengo que estar totalmente en desacuerdo con cualquiera que diga que la Asamblea debería ser un buen primer idioma. Este es el por qué:

  • No tiene una estructura inherente, no hay una forma común de descomponer la funcionalidad en una aplicación. Esto es lo que hace que los lenguajes de nivel superior sean tan útiles.
  • Tienes que saber cosas inútiles como llamar a un método en una biblioteca correctamente. Cuando la biblioteca fue creada por C, eso significa manipular la pila (mejor obtener todo en el orden correcto), pero en otro lenguaje podría significar establecer registros. Estas son todas las cosas que se ocupan de un compilador o un intérprete, y no puede optimizarlas.
  • Su código no se puede usar en otro chip, y muy probablemente se romperá con una plataforma de hardware diferente.

En estos días, el lenguaje ensamblador se usa para acelerar ciertas acciones finitas donde el ensamblaje hecho a mano sería más rápido que el ensamblado generado por el compilador. La estructura principal de la aplicación se realiza en un lenguaje de nivel superior como C, C ++, etc. Por supuesto, la programación de ensamblaje sería muy importante si comienza a escribir compiladores. ¿Cuántos de nosotros hacemos eso?

Berin Loritsch
fuente
1

Tomé asamblea en mi último año de secundaria. Ya había tomado clases en Java, Pascal, C y C ++, y no era competente en ninguna de ellas y realmente apestaba en la Asamblea: era la única persona que tomaba la clase en un programa de aprendizaje a distancia en el colegio comunitario, me llevó uno o dos meses antes de que alguien pudiera hacer que el compilador funcionara para mí.

No creo que sea necesario o inteligente aprender primero el lenguaje ensamblador, pero es inteligente aprender lo que le enseñan en las primeras semanas de ensamblaje, sobre cómo funciona el procesador y algunos de los trucos de depuración. Esas cosas me parecieron muy interesantes e ilustrativas como neófito.

Peter Turner
fuente
0

No veo por qué no se pudo hacer, aunque lo buena idea que es depende totalmente de la multitud que le enseñarías también. Alguien cuyo objetivo final es ser un desarrollador web probablemente se aburriría y podría dejar de fumar, ya que no les daría la satisfacción inmediata de crear algo que Python, Ruby, etc. Si desean eventualmente trabajar en hardware u otros proyectos de bajo nivel, entonces creo que sería un buen comienzo (siempre que proporcione suficiente experiencia en arquitectura de computadoras para que tenga sentido). Creo que podría ayudar a las personas a escribir un mejor código en el futuro, aunque creo que sería más difícil comenzar a aprender otros idiomas.

Jetti
fuente
0

Creo que el lenguaje ensamblador solo tendrá sentido si te enfocas en cosas como:

  • Técnicas de gestión de memoria
  • HW IO (especialmente desafíos relacionados con el tiempo y el rendimiento)
  • Características de la CPU, en particular, características de seguridad

Sin un enfoque en esta área, es solo un lenguaje simplista que tenderá a enseñar malos hábitos de organización. Es bueno tener una codificación a nivel de máquina en el kit de herramientas para saber cómo funcionan las cosas, pero no es un buen primer idioma.

Me interesaría alguien en un lenguaje de nivel superior. Luego enseñe C ++; luego ensamble con un enfoque en cómo los compiladores de C ++ generan código de ensamblaje. La comprensión de las tablas v y otras características de lenguaje de nivel superior ayudarán al desarrollador a pensar en cómo funcionan realmente los idiomas, en lugar de simplemente archivar la información bajo 'magia'.

Jim Rush
fuente