Publicado hace 5 años por oraculus_reloaded a words.steveklabnik.com

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

selina_kyle

#44 y cómo puede ser que Java sea tan bestialmente popular?? En mi trabajo, los informáticos son mucho más felices desde que han dejado Java y han pasado a Python. Ahora hasta los científicos aportamos código. Por curiosidad miré el código Java antiguo y ufff, sólo para comenzar hay que instalar millones de cosas y configurar y máquina virtual (sigo sin entender qué es)... Encima tooodo lento y desesperante y dos horas compilando. Yo pensé que era una broma.

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.

sillycon

#51 El Java es el mayor engaño de la industria informática. Es un producto del hype y el márketing, el mayor pelotazo de Sun.
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.

Wayfarer

#88 "El Java tiene la eficacia y la agilidad de un tanque alemán de la primera guerra mundial."

Eso es un menosprecio a los tanques alemanes de la primera guerra mundial...

CC #51

eltoloco

#44 ese es tu problema, que te has quedado en los 90. El Java de hoy en día no tiene nada que ver con el de los 90 en cuanto a rendimiento. Y en cuanto a funcionalidad, Java es uno de los lenguajes más potentes que hay, con soporte prácticamente completo de POO, con reflexión incluida.

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.

sillycon

#44 Absolutamente de acuerdo.

D

#21 Pues a mí se me ocurre como más sencillo BASIC, que cualquiera que no sepa programar puede, echando un vistazo al código, comprender cosas, así, sin tener ni idea, pero a ver quién hace eso con C.

pip

#23 me remito a #24

ragar

#23 Pues permíteme decirte que me parece más sencillo C.
BASIC tiene cosas demasiado complicadas

apetor

#14 Es que, precisamente, en una carrera o incluso en lo autodidacta, se deberia de dar eso a la par que el ensamblador, ahi se besan los mundos de la electronica digital y el ensamblador. Ejercicio de hacer un miniprocesador basico a base de puertas, crear su codigo maquina y programar programas en ensamblador o binario para ese miniprocesador. Luego dar compiladores que generen ensamblador desde un lenguaje chorra de alto nivel. Todo esto se da en una carrera de Ingenieria Informatica, y es la cuadratura del circulo, una vez entiendes e interiorizas bien esto, has ganado mucho mas dominio del que pueda parecer o puedas creer... siempre que lo hayas dominado bien, claro.

#37 Sin prisa. Quien quiera hacer un juego tipo novela gráfica y no sepa programar que programe por ejemplo con ren-py o o cualquier otro motor para quien no tenga ni idea de programación y a quien le pique que profundice un poco, por ejemplo.

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.

apetor

#59 Por supuesto, hacer algo que no te gusta... mal. Pero dos cosas:

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.

g

#14 Te hecho al menos 60 años

#42 35, pero muy inquieta.

box3d

#14 Verilog o VHDL se usa precisamente para "programar" a ese nivel.

D

#14 lo primero es el álgebra de bool, sin eso ni C ni circuitos.

D

#24 En ese sentido, es más sencillo el ensamblador

pip

#26 el de un micro de 8 bit sí. Incluso un ARM, puede. La monstruosidad de un Intel x86 moderno con todas sus cosas yo creo que supera al C en complejidad.

D

#32 Pero son instrucciones muy básicas. 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.

pip

#36 jaja, en serio, mírate las instrucciones SSE por ejemplo. De básicas nada. O las reglas de paralelismo del x86 actual ¿Podrías decir de memoria qué se ejecuta en paralelo con qué?
¿Líneas de caché?
Pero bueno, dejémoslo en que por ahí andarán en complejidad, el ASM actual y el C.

D

#38 Por ese tipo de razones es por lo que C no es más sencillo que, por ejemplo, python. En python no tienes que preocuparte de en qué posición de memoria está una variable, ni cuánto va a ocupar un array cada vez que le añado o le quito elementos.

pip

#40 no nos entendemos porque no hablamos de lo mismo.
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?

D

#46 Sí te entiendo. Lo que pasa es que la frase "C es el lenguaje más sencillo" no se puede interpretar en términos de qué componentes tiene, porque hay otros mucho más simples y "desnudos", ni en términos de que con C es más fácil obtener resultados porque, evidentemente, no lo es.

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.

zhensydow

#22 #40 deja de decir tonterías:

* 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.

D

#95
* 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.

zhensydow

#98 cito "Cuando recordé que, en C, las cadenas de texto son listas"

D

#99 Usé "lista" como sinónimo, en castellano, de conjunto, listado, grupo, etc.

Si nos ponemos exquisitos, una cadena de caracteres en C es un vector (no un array)

zhensydow

#100 no me hagas de litigante: https://en.cppreference.com/w/c/language/array y reconoce que hablas de lo que no tienes ni idea.

verocla

#24 Dadme un puntero y moveré el mundo...

F

#24 Sabes perfectamente lo que te quieren decir. C es infinitamente más complejo de implementar que los lenguajes de alto nivel. ¿Te vale así?

pip

#69 si sigues la conversación verás que estamos fijando los términos de la discusión porque no estamos hablando de lo mismo, así que claro que se lo que me dice, lo que quiero es que entienda lo que le digo.

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.

D

Yo sólo programaba con 0 y 1, y a veces sólo con 0.

D

#30 Privilegiado, yo tenía que programar con medios ceros.

c

#65 C++ es muchísimo más complejo qye C. C es muy sencillo.

D

#75 ¿qué entiendes por complejidad?

c

#78 La complejidad del lenguaje en si mismo. No del desarrollo.

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.

D

#80 joder estamos diciendo lo mismo, pero con el foco invertido. Claro que los lenguajes de alto nivel son mucho más complejos y abstractos (desde el punto de vista del ordenador).
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

c

#81 Hombre, mira el titular del post....

Java tiene un garbage collector. No se libera memoria.

apetor

#80 Yo diria que incluso es mas sencillo. Es mas laborioso programar y exige hacer mas cosas poor tu cuenta, no tienes las librerias que te dan "todo hecho" de lenguajes de mas alto nivel, pero es mas facil de mantener y desarrollar codigo en C, aunque sea mas "la maquina y tu" y te tengas que buscar mas la vida. Pero eso, quitas variables o factores de complicacion, aunque añadas labor y tengas que saber mas, tanto de la maquina como de algoritmia, etc.

apetor

#16 Para eso, por ejemplo HLA, aunque si, se puede argumentar que no hay dios que use HLA.

pip

#9 sí, ASM del z80

pip

#54 Sí, el x86 moderno está pensado para que lo generen los compiladores, no los humanos. Tiene una complejidad absurda en por ejemplo el orden concreto en el que hay que ejecutar las instrucciones para no "atascar" el procesador que solo un compilador puede hacer razonablemente y es estúpidamente complejo por la cantidad de compatibilidad que arrastra. Hay otros micros modernos como por ejemplo ARM que son infinitamente más sencillos y no por ello rinden menos o incluso rinden más (en watios necesarios para lo mismo).

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.

Joya

asm es la respuesta.

sillycon

#67 De acuerdo. No es broma.

c

No. Aprendiendo Ensamblador, a lo mejor... pero C?

ailian

#10 Porque C es lo más cercano a ensamblador sin depender de una arquitectura hardware concreta.

c

#16 C no es para nada cercano al ensamblador.

visualito

#48

No es cierto

Con los compiladores actuales de C, la optimización hace que en muchos casos ni siquiera sea necesario programar en ensamblador.

c

#61 El qué no es cierto? Que ensamblador permite ver el funciinamiento del ordenador mucho mejor que C? Que con C no venos prácticamente nada de. como. funciona?

D

#16 Precisamente por eso C no sirve para "aprender como funciona el ordenador", porque es independiente de la arquitectura, y para saber cómo funciona un ordenador lo que hay que aprender es precisamente la arquitectura.

p

#2 Porque C es más complejo que lenguajes de más alto nivel.

c

#6 No. No realmente.

apetor

#11 Tipico mito de los que andan mucho en lenguajes de muy alto nivel y poco a medio o bajo nivel. Con C tienes que hacer mas cosas tu, a pelo, y depende, pero no, no es mas complejo que en lenguajes de alto nivel.

D

#11 como dice #31, C es más complejo que un lenguaje de alto nivel porque está considerado un lenguaje de nivel medio, supongo que cuando afirmas eso estarás pensando en C++ que es el C de los cobardes

apetor

#65 Tio, no has entendido mi comentario, he dicho que en C tienes que programarte tu las rutinas y demas, pero NO, C NO ES mas complejo, es mas sencillo.

D

#17 ¿El más sencillo? No me creo nada de nada.

D

#17 Programo en R, php, python y javascript. Hace pocos meses me planteé programar una función en C para un cálculo muy concreto que necesitaba optimizar. Hacía años que no tocaba ese lenguaje. Cuando recordé que, en C, las cadenas de texto son listas de caracteres individuales, desistí.

¿El más sencillo?

D

#22 ¿Llevas años programando y te asusta un array?

D

#70 Mucho. Nunca los uso. Ni los bucles.

g

#85 tengo curiosidad ¿que te asuste de un array y de un bucle?

D

#91 Es un trauma infantil. Prefiero no hablar de ello

D

#22 por eso son cadenas de caracteres

D

#6 Igual que las matemáticas son más complejas con papel y boli y nadie aconseja aprenderlas con Wolfram. Decir que has aprendido a programar porque has hecho un script con python es como decir que sabes matemáticas porque has resuelto una ecuación con Wolfram.

eltoloco

Como estudiante de ingeniería que está aprendiendo C, y que el año pasado aprendí ensamblador, puedo decir sin miedo a equivocarme que para entender como funciona un ordenador lo mejor es aprender ensamblador.

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.

D

#43 jajaja que bueno.....aprendí ensamblador el año pasado dice...ains...

https://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.

eltoloco

#45 imagino que sabes que cada arquitectura tiene un API diferente. Yo he hablado de ensamblador en general, en mi caso aprendí a programar para el Motorola 68000. Y aprender a programar no es lo mismo que dominar un lenguaje, para esto último obviamente hacen falta años y años de práctica.

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.

pip

#49 tienes razón. Yo te diría que puesto que es muy difícil y algo frustrante programar algo medianamente serio en ASM x86 actual, intentases hacer algo completo en una máquina simple como una consola de 8bit o algo así. Un Tetris o algo así 100% en ASM.

eltoloco

#52 ya lo hize para el 68k, como práctica final de una asignatura hize un juego tipo Bejeweled, perfectamente jugable en cualquier PC a través del emulador Easy68k.

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.

D

#49 en mi pueblo una biblioteca es un conjunto de libros...ahí los tienes. Una API es otra cosa...sigue estudiando.

#68 #49 y en el mío solo lleva API delante si es algo relacionado con las abejas.

D

#83 La API buena es esta: https://www.coapimadrid.org/

D

Cuñao's de la programación debajo:

D

#3 ¡Hola mundo!

apetor

#66 A ver, yo mamonee algunos meses con BASIC, habia hecho LOGO en el colegio y empece con pascal, solo que como pascal tenia su asm ... end y tal ya empece a tocar ensamblador enseguida.

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.

p

En absoluto. Para aprender C es recomendable haber aprendido antes algún lenguaje de más alto nivel.

D

#1 y eso por qué?

tiopio

#5 ¿Z80? ¿Sería ensamblador, no?

c

#5 Yo igual.

PauMarí

#33 #12 #5 pues yo lo primero, y de muy crío (5 o 6 años) , LOGO, después ya también más o menos el estándar que comentáis más COBOL

D

#5 mi camino es paradisu, aunque empecé con el 6800 y luego el 6502

ur_quan_master

#5 cuanto tiempo de mi mocedad programando en ensamblador el Z80 del Spectrum.

apetor

#5 Me sumo a ese bonito camino. Aunque me he quedado sobre todo en C+ASM y algo de C++, aunque haya tocado algo mas arriba alguna vez.

D

#5 se me ha caído una lágrimilla nostalgica al leer tu comentario.

D

#1 Sí. Para coger malos vicios y no entender nada.

D

#1 como el Inglés

o

Si quieres aprender lo que es la locura aprende Ook! O brainfuck.
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.

pip

#47 incluso puedes comprar la camiseta con la edición en japonés del libro

https://www.redbubble.com/people/orinemaster/works/29525321-ansi-c-programming-book-japanese?p=t-shirt

Tienes razón que aprender un poco de electrónica es bueno para un programador.

o

#50 Que guapa la camiseta!! Gracias por la info

D

Para aprender cómo funciona el ordenador no hace falta saber ningún lenguaje de programación, pero aprender cualquier lenguaje de programación es recomendable.

D

madre mia....
al paredón todos

B

Pues yo empece por Basic, Cobol y Pascal y para cuando me tocaba C ya estaba hasta los mismisimos de programación

Antichulus

Joder con el postureo de los programadores.

M

Que aprenda lo que mejor le paguen

pip

#29 lo que mejor te pagan es precisamente saber hacer una optimización en ASM con SSE, mantener código C legacy, mantener autotools, desarrollar C++14, scriptear en Python, Bash, del lado de server php, MySQL, JavaScript en cliente web...

comadrejo

#39 Discrepo. Desgraciadamente lo que mas se cotiza es software para jefes, como módulos de SAP. Se necesita menos habilidad y conocimiento pero debe vestir de etiqueta.

pip

#55 la verdad que sí, que los sueldos más altos que tengo noticia en Barcelona son de SAP. Aunque me han dicho que programar lo que se dice programar, no lo hacen mucho.

#55 Eso los que encuentran trabajo en eso. En general para vender a un cliente un modulo de SAP tienes que saber de SAP y además del negocio del sector del cliente.

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ú.

comadrejo

#60 Conozco casos de programadores, que han pasado de C en Indra Militar a programar ABAP en consultora SAP duplicando su sueldo.
Mi experiencia esta basada en el mercado de hace mas de 6 años y en general para las empresas, incluso tecnológicas, el programador es la base de la pirámide.
En la escala de consideraciones de las empresas Españolas, por encima del programador están DBAs, Administradores de sistemas, Consultores, Jefes de proyecto, etc... Generalmente si un programador es bueno "evoluciona" a otros puestos mejor considerados.
Yo tuve que tomar una decisión a finales de los 90 y claramente Administración de sistemas estaba mucho mejor considerado por las empresas que programador. Algo incomprensible, puesto que el puesto de Admin es mucho mas sencillo y menos exigente que el de programador.
Y antes de entrar en el mercado laboral de medio/alto perfil informático yo venía de la demoscene con un nivel aceptable de asm x86 y pascal. Pero el maltrato del mercado laboral al programador en España, al menos desde el 98 al 2014 ha sido brutal.

1 2