44 meneos
621 clics
Este envío tiene varios votos negativos. Asegúrate antes de menear
¿Debes aprender C para "aprender cómo funciona el ordenador"? [Eng]
A menudo he visto a personas sugerir que deberías aprender C para aprender cómo funcionan las computadoras. ¿Es esta una buena idea?.
|
comentarios cerrados
Me cuesta mucho concebir un aprendizaje inverso y tener realmente conocimiento de todas las capas, pero es mi experiencia y creo también que es difícil de replicar hoy en día.
Me cuesta mucho concebir un aprendizaje inverso y tener realmente conocimiento de todas las capas, pero es mi experiencia y creo también que es difícil de replicar hoy en día.
Por cierto yo también hice ese camino, añadiendo basic delante de todo jajaj
Hasta que llegue a un lenguaje de alto nivel como C le queda un trecho. Y para desplegar una aplicación distribuïda en un cloud ni te cuento.
O ser prácticos, decidir para qué quiere aprenderlo y aprender lo mínimo que le ayude a hacer cosas que desee a hacer. Y cuando quiera profundizar en algo que profundice.
El estándar es muy muy pequeño.
Claro programar bien igual requiere años, pero no por culpa del lenguaje, si no porque.. programar bien requiere años.
El C son muy pocas cosas, otra cosa es que te falte práctica programando.
No confundas lo sencillo que sea el lenguaje con lo fácil que te resulte llegar a un resultado concreto porque no tiene nada que ver.
En cambio C++, llevo más de 20 años aprendiendo el estándar (bueno, los varios que hay) y no estoy seguro de conocerlo completamente. Eso sí es un lenguaje grande, diría que el más complejo de todos.
¿El más sencillo?
¿Sabes por qué "las cadenas de texto son caracteres individuales"? Porque C no tiene el concepto de cadenas de nada, es simplemente un puntero a una memoria que algunas funciones del estándar interpretan como cadena.
Y no tiene el concepto de cadenas precisamente porque es muy sencillo.
En cambio C++ sí tiene parcialmente un concepto de cadena, al menos un objeto cadena (pero sigue sin tener cadena como tipo básico).
El estándar de C se aprende en una semana por decir algo, si tienes base de arquitectura de ordenadores y entiendes la memoria y demás.
Otra cosa es que te resulte complicado hacer algo con un lenguaje tan sencillo precisamente porque tienes que programar cosas básicas que lo que los lenguajes más complejos ya han hecho por ti.
¿Líneas de caché?
Pero bueno, dejémoslo en que por ahí andarán en complejidad, el ASM actual y el C.
Es obvio que más allá de eso no servirá de mucho, pues hoy en día poco, muy poco software se hace en ensamblador. En dispositivos empotrados, y poco más. Pero sin duda es lo mejor para entender como funciona un procesador y la memoria principal, las interrupciones, etc.
Saber C++ debería ser de conocimiento obligatorio.
Saber .NET...venga, va, te perdonamos...todos cometemos errores.
JAVA debería ser erradicado.
Fdo: un ingeniero de los 90.
software.intel.com/en-us/articles/intel-sdm#nine-volume
Ahí tienes, la biblioteca oficial de intel para arquitectura x64...luego me lo cuentas. De nada.
Yo hablo de lo simple/sencillo que es el lenguaje en sí, y tu de lo fácil que resulta llegar a determinado resultado.
Podemos estar discutiendo días porque no estamos en el mismo concepto.
Es cierto que Python es bastante sencillo, pero tiene clases con sus herencias, namespaces, lambdas, cadenas normales y raw, excepciones... C no tiene nada de eso y además, la librería estándar de Python es mayor que la de C.
Además, esos lenguajes dependen mucho de la versión, de Python 2 a 3 cambia bastante hasta el punto de no funcionar, mientras que C89 y C11 son muy compatibles hacia atrás.
Si tuvieses que hacer un compilador funcional muy rápidamente para uno de esos dos lenguajes ¿Escogerías Python o C?
Ahora en serio, C tal vez sea el lenguaje más simple, sólo bhay que leer el libro de Ken Thompson y Dennis Ritchie "The C programming language" es una joya y en muy pocas páginas te explica perfectamente los fundamentos de C.
Ahora sí quieres aprender cómo funciona un ordenador, diseña una ALU usando puertas lógicas.
Lo que he dicho es que aprender a programar en ensamblador para cualquier procesador es suficiente para aprender cómo funciona un ordenador. En ningún momento he dicho que sea programador experto de ensamblador, y de Intel ni he hablado.
PD: Lo que enlazas no es una biblioteca, es un API. No deberías dártelas de experto y corregir a los demás cuando confundes cosas tan básicas.
www.redbubble.com/people/orinemaster/works/29525321-ansi-c-programming
Tienes razón que aprender un poco de electrónica es bueno para un programador.
Me dijeron que la ventaja es poder escribir código para todos los sistemas... pero todos los sistemas son 2? Windows y Linux? En serio es la única ventaja?? Porque con Python no necesitamos escribir nada 2 veces.
No es casualidad que sea el lenguaje más usado del mundo. Y al contrario de lo que se suele decir, no es por simplicidad, pues Java no es ni mucho menos fácil de aprender, mucho menos de dominar. Es mucho más sencillo aprender con lenguajes de scripting y no tipados como Javascript o PHP.
Si te refieres específicamente a Intel, mis profesores ya nos avisaron de que el juego de instrucciones de x86 es más complicado de aprender, porque no es tan “ortogonal” como el 68000. Pero vamos, que la base es la misma; mirarse el juego de instrucciones y las llamadas a interrupciones.
No sé si me explico.
Te respondí en un principio porque me pareció una afirmación muy categoría en cualquiera de los sentidos.
Si quieres lo dejamos en que "C es el lenguaje de nombre más sencillo que hay".
Es broma... pero tienes razón, podríamos discutir de matices hasta el fin de los tiempos. Lo dejo aquí. Un placer.
Siempre he escuchado lo de que se meta a ensamblador, o que se meta a C, o lo que sea, y estudiarlo sin ganas solo porque alguien dice que hay que empezar por ahí hace que no aprendas nada práctico y que al año se te quiten las ganas porque cualquier mico sin conocimientos teóricos hace un juego con un framework chorra que tu no eres capaz de hacer con lo que has estudiado en la universidad.
Al final se aprende haciendo algo que te gusta y con curiosidad sobre lo que le rodea se acaba profundizando más. Algunos de los compañeros de trabajo más capaces que he tenido y con mejor base en algunos aspectos han estudiado cosas tales como música o magisterio. A uno a partir de programar loopers con efectos les dio por meterse a programar otras cosas, y de ahí a construirse un secuenciador. O otro por querer comprender como funcionaba un kit de robótica para niños al final se pico y ahora sabe bastante de microcontroladors. No es como si hubieran hecho la carrera porque les faltan muchas cosas pero saben como funciona un ordenador.
Y rezar porque al tio del traje que les dice que si a todo y habla con acrónimks y presume de viajes de esquí a los alpes suizos tenga un accidente en Sant Moritz y quede libre una vacante. Y el día que visites al posible cliente la moqueta de su oficina conjunt con tu corbata.
Vamos, que para pillar una plaza bien pagada de esas en las que se cobra muy bien se tienen que alinear los astros. En general tiene que ser estar en el momento justo en el lugar exacto. Que digas una palabra clave que sea justo la que al cliente le interesa y suene la campana en ese momento de puñetera chiripa. Porque en general vas a cobrar menos que el gurú que habia antes en el puesto. Da igual si es para desarrollador SAP, para administrador de sistemas cinturón negro, desarrollador backend legacy, o lo que toque. Se suele cumplir que el que estaba antes cobra más de lo que vas a cobrar tú.
No es cierto
Con los compiladores actuales de C, la optimización hace que en muchos casos ni siquiera sea necesario programar en ensamblador.
Tus profesores te han dicho muy bien, el 68000 es un micro precioso y más que suficiente para entender todos los conceptos de bajo nivel. Creo que te están llevando por muy buen camino.
a) no confundamos que algo incomodo no nos gusta. Es verdad que hay una edad para empezar, o un rango de edad, donde la curiosidad, y si se tiene, hace mucho. Pero vamos, hace falta algo de camino para saber si algo te gusta. Y el lowlevel en general, que supongo que no es para todo el mundo, si, cuesta un poco al principio, pero luego es jodida adiccion. Programas o software que incluso no tenga mucha interaccion de usuario y tal, que toca tripas de la maquina... si superas un umbral... heroina .
b) Ahora se busca mucho de eso del placer inmediato, no se, no hay que ser masoquista, pero vamos, con demasiada comodidad no se llega muy lejos. No digo que no haya cosas interesantes a alto nivel que se elijan fuera de la comodidad, pero he visto que a menudo ese es el problema, que como C y ensamblador exigen que te hagas las rutinas y algoritmos tu y los resultados no son inmediatos... la gente se va a .NET, python, etc. donde la libreria te da tanto que, si, programas muy rapido... ahora, aprendes estructura y demas, pero muchas cosas quedan cojas...
Pero si, tambien se puede empezar por arriba a ir bajando.
Entre mayor nivel del lenguaje, normalmente más complejidad, pero más sencillo el. desarrollo.
C++ es muy complejo, tiene muchas más. características que C, que es muy sencillo.
Aquí de lo que estamos hablando es de la complejidad de desarrollo de cara al usuario final, y esta cuanto más alejado está el lenguaje de programación del lenguaje del usuario ( de más bajo nivel es) es mayor.
Si no haz el ejemplo y ponle a un javero a reservar memoria dinámicamente y que al finalizar el programa le cuadre con la memoria que tenía antes de la ejecución cómo nos obligaban en las prácticas de C
Java tiene un garbage collector. No se libera memoria.
He trabajado directa o indirectamente con Java durante más de diez años y creo firmemente que su despliegue ha retrasado el avance de la informática una década.
Su punto fuerte era que el código era reutilizable (mentira, era incompatible de versión a versión), que podía usarse en cualquier arquitectura de procesador (como cualquier otro lenguaje compilado) y que era fácil de aprender (la mayor mentira).
El Java tiene la eficacia y la agilidad de un tanque alemán de la primera guerra mundial.
Vale, la VM de Java es mejor ahora que en los noventa (parece que el "garbage collector" ahora sí existe). Pero la sintaxis y toda la arquitectura sigue siendo un error. El único valor que puede tener es didáctico para aprender programación estructurada y orientación a objetos. Como lenguaje real es impráctico.
Aparte, y debería ser suficiente, es una pesadilla de ciberseguridad. Llevo 5 años desinstalando Java en una empresa y sustituyendolo por otros productos.
Que el lenguaje sea sencillo aunque sea mas difícil de hacer según que cosas (otras pueden ser imposibles en un lenguaje de alto nivel) tiene ventajas didácticas.
Por ejemplo puedes aprender rápido el lenguaje y dedicarte más tiempo a aprender a programar en vez de aprender el lenguaje.
Al ser un lenguaje muy explícito y limitado acota bastante las posibles soluciones de implementación y reduce a 1 la interpretación posible del código, pues C es tan totalmente explícito sin ambigüedades.
Por ejemplo, en C++ podrías decir : ¿He de hacer un objeto o funciones libres? ¿Sería mejor una clase con virtuales o un template? ¿Un puntero a función o lambda?
Pero eso son detalles de implementación del lenguaje que te van a despistar de lo que realmente estás haciendo.
En cambio el C te va a llevar por un camino con muchas menos ramales de implementación, simplemente no tiene tantas opciones al menos que lo implementes tu, y si lo implementas tu, aprenderás mucho.
Es muy bueno y muy sano hacer tu propia implementación de un vector, lista enlazada, cadena o lo que sea.
Una vez que tienes conocimientos reales de programación ya puedes ir subiendo el nivel del lenguaje y te será más fácil de entender y de dominar todos los conceptos.
* php tiene las mismas funciones que C ... strcmp, strlen...etc.
* en C puedes programar perfectamente sin necesidad de preocuparte en que posición de memoria están las variables
* si confundes listas con arrays no es problema de C. Es que no tienes ni idea.
#85 lo dudo.
Pascal > ensamblador > C > C++/ java / ...
Enseguida empece con temas de cracking, vx, algo de demoscene, etc., para eso usaba el ensamblador. Mucha depuracion con turbodebugger y luego SoftICE, etc.
Y hoy dia es C + Ensamblador de x86-64 la mayoria.
* php tiene las mismas funciones que C ... strcmp, strlen...etc.
---No he dicho lo contrario
* en C puedes programar perfectamente sin necesidad de preocuparte en que posición de memoria están las variables
---también puedes liarla si usas punteros. En otros lenguajes, no.
* si confundes listas con arrays no es problema de C. Es que no tienes ni idea.
---no las he confundido en ninguno de mis comentarios.
Si nos ponemos exquisitos, una cadena de caracteres en C es un vector (no un array)