¿Aprender C es esencial para la informática? [cerrado]

15

Soy un desarrollador front-end que apenas veo un archivo .ho .cextensión. Conozco la sintaxis básica de C, la aprendí en Unreality pero nunca me interesó una programación de tan bajo nivel porque simplemente era demasiada configuración para cosas simples.

Estoy muy interesado en aprender todos los aspectos de la informática pero quiero creer que realmente no tengo que saber un idioma específico para comprender la mayoría de los conceptos en informática. Sin embargo, cuando comienzo a leer libros y artículos sobre conceptos fundamentales de informática como estructuras de datos y diseño de algoritmos, parece que tengo que aprender C, porque todos los ejemplos e incluso las lecciones están en C (y a veces en Java).

Mi pregunta es, ¿es el C como lenguaje de programación esencial para la informática o simplemente tenemos todos nuestros recursos en CS escritos en C? ¿Se puede aprender Informática sin aprender C?

Mohsen
fuente
44
Aquí está la opinión de Joel Spolsky sobre eso: joelonsoftware.com/articles/CollegeAdvice.html Es discutible, pero creo que tiene sus puntos.
Doc Brown
2
Los puristas argumentarían que la informática no se trata de computadoras, lo que hace innecesarios los lenguajes de programación.
Blrfl
1
¿Qué quieres decir con "informática"? Lo que describe es principalmente la parte de Ingeniería de Software de la informática, creo. Además, no veo cómo se escriben todos los recursos en C. Leí algunos libros sobre algoritmos / estructuras de datos y ninguno usó C. Casi todos usaron algún tipo de lenguaje de pseudocódigo, fácilmente comprensible para todos (bueno, excepto TAOCP que usa ensamblaje ... pero esa es otra historia)
Bakuriu
¿Irrealidad? ¿Se suponía que era una peculiaridad de la autocorrección de la Universidad o es una escuela de magia negra? Sin embargo, conozco la Universidad Invisible: [
Deer Hunter

Respuestas:

31

Voy a ir en contra de la corriente aquí y decir que sí, tienes que aprender C. De hecho, estoy de acuerdo con los puntos en muchas de las otras respuestas, pero haces una declaración muy fuerte de que

Estoy muy interesado en aprender todos los aspectos de la informática pero quiero creer que realmente no tengo que saber un idioma específico para comprender la mayoría de los conceptos en informática.

(énfasis mío)

Bueno, los sistemas operativos y las pilas de red son dos aspectos importantes de la informática, y todos los sistemas operativos y las pilas de red dominantes están escritos en gran parte en C. Si quieres entenderlos, debes aprender C. Sí, algunas escuelas logran enseñar sus clases de sistema operativo en Java, pero es como leer a Homero en inglés.

Además, C no es tan grande de lenguaje. Si realmente quiere aprender todos los aspectos de la informática, debe encogerse de hombros y decir 'meh', '¿qué es un idioma más?'

Charles E. Grant
fuente
Generalmente estoy de acuerdo con esto, aunque para mí "aprender" C significa que soy esencialmente fluido en el idioma para escribir programas no triviales en él sin ayuda. No estoy seguro de si ese nivel de comprensión es un requisito previo para los sistemas operativos y la programación de redes.
Telastyn
3
@Telastyn: significa que eres lo suficientemente fluido como para comprender y modificar el código de los sistemas operativos y el código de red, los dominios para los que se usa C, y eso es todo. No significa que necesite saber cómo escribir juegos en C, crear aplicaciones de IU y gráficos bonitas en C, gráficos o motores de inteligencia artificial en C; porque para cada otro dominio de CS hay otras opciones de idioma.
rwong
12

Durante mucho tiempo, durante el apogeo de la informática como una ciencia en lugar de una vocación, hubo algunas opciones limitadas para un idioma que se ejecutara en todos los sistemas que usaban las diferentes universidades.

Con mucho, las universidades tienden a usar sistemas Unix. Convenientemente, esto fue programado en C. Uno podría comenzar con el aprendizaje de C en cualquier máquina, y eventualmente ingresar al código fuente de Unix en C. En casa, los estudiantes podrían usar un compilador de C como Borland Turbo C en Windows o MPW en un Mac: funcionó en todas partes.

Pascal era otra opción, pero tendía a tener el problema de que, en cierto punto de la programación, no era suficiente lenguaje para hacer lo que realmente necesitaba hacer (programar un sistema operativo en Pascal sería doloroso).

Algunas de las escuelas más antiguas aprendieron Fortran, pero de nuevo, en muchos casos no era un lenguaje lo suficientemente poderoso como para poder enseñar clases de CS de nivel superior (¿teoría de la IA en fortran?

Y así, durante mucho tiempo C fue la elección.

No es la única opción y ahora hay muchas universidades que enseñan en otros idiomas para pasar por alto algunas de las partes internas y aprender conceptos de nivel superior sin tener que lidiar con la fealdad del manejo de la memoria y cosas por el estilo. Algunos piensan que esto es bueno, algunos piensan que esto es malo .


Entonces, no, aprender C no es esencial para aprender informática. Puede encontrar muchos otros libros que enseñan informática desde Java o Python. Es solo que durante mucho tiempo, C fue la elección y los libros académicos se mueven lentamente.


fuente
Para el registro, el entrenamiento de IA se realizó tradicionalmente con el compañero de cabeza de huevo de C durante los años 70 y 80, LISP, pero la respuesta está en la cabeza.
jwrush
@jwrush mi respuesta fue más similar a la que puedes estudiar AI en C también, en comparación con los otros idiomas de la época (no LISP, y tomé una clase de lisp en los años 90 para AI). Por supuesto, el MIT (hogar de los cabeza de huevo) en ese momento enseñaba muchas de sus clases en LISP, y ciertamente era otra opción, pero no tan práctica en otras áreas. En la enseñanza, era importante trabajar desde la misma base en cada clase para que uno no tuviera que pasar la primera semana o dos enseñando a los estudiantes otro idioma especializado para esa clase.
12

Admito que uno puede conseguir un trabajo bien remunerado y ser productivo sin tocar C, pero recomiendo aprender C para cualquiera que sea serio sobre tener una sólida comprensión de la informática.

Aunque la informática se trata de conceptos, que podrían aprenderse independientemente de cualquier lenguaje de programación específico, hay campos que pueden entenderse mucho mejor aprendiendo C o aprendiendo ese campo usando C.

  • Algoritmos y estructuras de datos. El Estándar C casi no tiene ninguno de estos: tenerlos ya implementados en el lenguaje o en su biblioteca estándar tienden a ser desmotivadores para los estudiantes: " ¿Por qué debería molestarme en implementar algo fácilmente disponible?"Al observar un fragmento de código C, inmediatamente se ve su costo algorítmico, ya que todo en C se compila solo con unas pocas instrucciones de la máquina. Los lenguajes de alto nivel (por ejemplo, Perl o Python) a menudo usan estructuras de datos avanzadas bajo el capó de la sintaxis ligera. El código se siente ligero, pero no lo es. Ya necesita una gran cantidad de conocimiento para razonar correctamente sobre la complejidad algorítmica de esas piezas de código. Por lo tanto, esos lenguajes no son tan adecuados para el aprendizaje de algoritmos y estructuras de datos, y muchos programadores que siempre vivieron en lenguajes de alto nivel, tienden a ser incapaces de lidiar con problemas de rendimiento cuando se encuentran con ellos.

  • Sistemas operativos. La mayoría de los sistemas operativos están escritos en C. ¿Cómo desea comprender la creación de procesos sin tener que llamar fork? La capa de abstracción de Java VM no es de ayuda aquí. Y hablar de ello sin crear un proceso es aún peor ... ¿Cómo puede escribir un software como Eclipse que pueda redirigir la salida estándar a una de sus ventanas? Debe comprender los conceptos de nivel de sistema operativo para eso, y puede tocarlos directamente en C solamente.

  • Indirección No puedes hacer C sin tratar con punteros. Los punteros te obligan a pensar en dos niveles, y eso extiende tus habilidades de abstracción.

También hay algunas ventajas técnicas del conocimiento de C:

  • Interoperabilidad entre idiomas. Desea integrar un gran módulo Ruby en su proyecto de Python (sustituya dos lenguajes arbitrarios aquí). Lo más probable es que la única forma de hacerlo sea a través de C, porque ambos lenguajes tienen una interfaz externa para C.

  • Redacción de software de rendimiento crítico. No se puede omitir ir a bajo nivel para hacer esto.


No digo que cada programa deba escribirse en C. Pero C puede ayudarlo a conocer, lo cual es útil en cualquier idioma en el que programe.

Miklós Homolya
fuente
La aritmética del puntero es fundamental para comprender los sistemas operativos, ya que conduce al por qué. Por ejemplo, por qué son montones y montones diferentes, ¿por qué la memoria virtual funciona bien o mal, ¿por qué algunos bucles funcionan más rápido que otros, etc.
Michael Shopsin
6

También voy a ir contra la corriente aquí y tratar de hacer un caso estético (ligeramente humorístico) para C. Mientras que algunas personas podrían llamarlo "feo" por diferentes razones, como la falta de construcciones de alto nivel como clases o su dependencia de punteros, me parece que no es el caso para .

TL; DR : En mi opinión, C es simple, el buen C es legible y hay cierta alegría en golpear bits.

C es simple

El estándar C define solo unos pocos tipos y mecanismos básicos para crear funciones, punteros y matrices a partir de ellos. Además de eso, hay una pequeña cantidad de construcciones de composición para hacer tipos más complejos de las primitivas (como estructuras y uniones). Observe cómo describí la mayor parte del lenguaje en dos oraciones. Esto significa que no tiene que mantener demasiadas reglas y formas sintácticas en su cabeza mientras codifica.

Lo simple es hermoso .

C no es arcano

A diferencia de muchos lenguajes de nivel superior, sería difícil encontrar muchos símbolos extraños e ininteligibles en C. En el mundo C, la función principal para la abstracción y la "compresión sintáctica" es la función, semánticamente, muy simple y construcción autoexplicativa. El buen estilo C fomenta una belleza casi poética y legible. Para ilustrar, intentemos leer el siguiente fragmento del núcleo de Linux. Incluso sin tener conocimiento de las estructuras de datos subyacentes y los detalles de implementación, podemos tener mucho sentido de lo siguiente:

bool kthread_freezable_should_stop(bool *was_frozen)
{
    bool frozen = false;

    might_sleep();

    if (unlikely(freezing(current)))
        frozen = __refrigerator(true);

    if (was_frozen)
        *was_frozen = frozen;

    return kthread_should_stop();
}

El centro de la función dice "en el improbable caso de que la corriente se esté congelando, pregunte al refrigerador si realmente ocurrió la congelación". El Dr. Seuss no podría haberlo escrito mejor.

Legible es hermoso .

C es transparente

A menos que una instrucción C incluya una llamada de función, generalmente puede tener una muy buena idea de su costo de tiempo de ejecución y sus efectos secundarios. C le da control al programador y finalmente confía en él o ella para hacer lo correcto. Podemos tener una idea de lo que sucede cuando este fragmento (ligeramente reformateado para SE) sale de la implementación strlen()en la biblioteca GNU C, porque cada operador tiene una semántica bien definida. No hay sobrecarga en C.

for (char_ptr = str; ((unsigned long int) char_ptr & (sizeof (longword) - 1)) != 0;
        ++char_ptr)

if (*char_ptr == '\0')
    return char_ptr - str;

Para fines de "optimizabilidad", esta propiedad es excelente. Podría decirse que algunos lenguajes de nivel superior hacen que la expresión concisa de algoritmos de nivel superior sea más fácil (como C ++ con clases y sobrecarga), pero a los efectos de C fue diseñada para, actuando como un ensamblador portátil, C es ideal. A veces, tras la ejecución exitosa de código de bajo nivel, un programador puede sentirse uno con la máquina, en cierto sentido (o cero, es un detalle de implementación). Esto no quiere decir que otros idiomas sean malos, no lo suficientemente "zen" o algo así de tonto, solo que IMO C puede ser interesante en formas que muchos otros idiomas han elegido no ser, por muchas razones válidas.

En mi opinión, los tres puntos presentados anteriormente hacen manejable la creación de sistemas complejos, aunque eficientes, incorporados en mi mente por Linux. Me parece que este mundo atrae a mi sensibilidad estética y aconsejaría a cualquiera que considere a C como su próximo objetivo que considere estos puntos. Siento que los argumentos sobre los sistemas operativos y otras cosas están mejor respaldados al declararlos explícitamente porque ciertamente no es necesario comprender los núcleos para ser un programador exitoso, pero uno podría encontrar estos campos convincentes subjetivamente.

idoby
fuente
3

El lenguaje de programación que usa para discutir la ciencia de la computación es en gran medida irrelevante para la tarea de aprender los medios y la ciencia de la computación.

El trabajo (posiblemente) seminal sobre Ciencias de la Computación, The Art of Computer Programming , no utiliza ningún lenguaje existente para informar el tema. En cambio, Donald Knuth decidió definir una computadora ficticia y un lenguaje de máquina ficticio (y un lenguaje ensamblador asociado) en términos de los cuales discute todos los temas.

Otro trabajo de gran prestigio sobre el tema, The Structure and Interpretation of Computer Programs , adoptó un enfoque similar, ideando un dialecto simplificado del lenguaje de programación LISP para actuar como su propio contexto. Este lenguaje es lo que conocemos ahora como Scheme.

Otro trabajo muy bueno sobre informática, los elementos de los sistemas informáticos (que en realidad son partes iguales de ingeniería informática y ciencias de la computación, y muy breve), adopta el enfoque más fundamental de la enseñanza de la lógica digital, a partir del cual construye la máquina, las herramientas , y el lenguaje, antes de enseñar informática básica.

Entonces, no, C no es necesario para comprender la informática. Lo que importa es su comprensión de los conceptos centrales de los algoritmos y su aplicación.

Greyfade
fuente
2

Comencé una carrera en programación aprendiendo vb3 de los manuales que se enviaron con los disquetes en los que vino. Aprendí algo de Java y pude producir algunos programas respetables, pero no fue hasta que estudié C en la universidad que sentí que realmente entendía lo que estaba sucediendo "bajo el capó". Ahora trabajo solo con .net y nunca me preocupo realmente por los punteros, direcciones inválidas o desbordamientos, pero los entiendo, esto informa las decisiones que tomo a diario y algunas de las cosas de la vieja escuela todavía están allí en idiomas modernos interpretados, banderas , operaciones poco sabias, lógica booleana, todas herramientas poderosas y muy eficientes.

Aprende C. Te servirá de mucho. Guardé una copia del manual de programadores de c durante años y leí Kernighan y Ritchie de principio a fin. No importa en qué lenguaje termines trabajando. Entender C definitivamente te ayudará.

Mate
fuente
1

¿Se puede aprender Informática sin aprender C?

La respuesta es sí. Tengo mi título en CS y no estaba obligado a aprender C, sino más bien Java. Al menos en mi escuela, el énfasis estaba en aprender programación orientada a objetos, con algunas enseñanzas sobre lenguaje ensamblador, estructuras de datos y diseño de bases de datos.

PhillyNJ
fuente
77
¿Estás seguro de que tu título cubrió " todos los aspectos" de CS?
SK-logic
Yo diría todos los aspectos necesarios. Ningún título cubre todos los aspectos de un programa de grado. Además, "todo" es subjetivo.
PhillyNJ
1
¿Cómo se define "necesario"? Todo es todo, es decir, abarca todas las aplicaciones CS posibles. No es "subjetivo", es bastante cuantificable.
SK-logic
Defino "necesario" en el contexto de que CS cubre el estudio de la computación y la tecnología informática, hardware y software y no cualquier lenguaje específico, que está respondiendo la pregunta original.
PhillyNJ
Ok, ¿y cómo vas a cubrir el hardware sin los idiomas de bajo nivel? ¿Cómo cubrirá la historia de los lenguajes de programación (que es una parte excepcionalmente importante de "todos" los CS) sin un lenguaje tan clave? ¿Cómo cubrirá la semántica del lenguaje de programación sin al menos un lenguaje con aritmética de puntero? De una forma u otra, pero un lenguaje similar a C debe estar presente en cualquier plan de estudios integral de CS.
SK-logic
0

Realmente depende de lo que quieras hacer con lo que estás aprendiendo. Definitivamente es cierto que se dan muchos algoritmos en C, o descendientes de los mismos. Sin embargo, a lo largo de los años he visto más ejemplos de C ++, C # y Java. Lo que CS debe enseñar es una comprensión general de la informática y, por lo tanto, cómo aprender o crear un lenguaje apropiado para la tarea en cuestión.

Sin embargo, todavía hay muchas personas cuyo primer y último lenguaje es alguna variación de C o Java, y no todos van a tener la capacitación para comprender cualquier lenguaje que brinde un título de CS. Incluso algunos graduados de CS tienen problemas con la programación. Por lo tanto, es posible que necesite tener una comprensión suficiente de esos idiomas para poder comunicarse con ellos, dependiendo de su trayectoria profesional. Si planea apegarse a la academia, entonces tendrá aún más barreras idiomáticas para el contenido, especialmente en áreas interdisciplinarias (donde las personas usan prolog, lisp, haskell, matemáticas, etc.)

jzx
fuente
-1

Si realmente vas a aprender "todos los aspectos de la informática" (¡plan ambicioso!), Tendrías que lidiar con varios lenguajes de ensamblaje diferentes y al menos un HDL (y practicar la codificación en un nivel de lista de red).

Y como un paso de nivel superior para abordar estas cosas verdaderamente fundamentales, tendría que elegir algo como C o Pascal, es inevitable. Omitir pasos en una escalera de abstracción es contraproducente.

De todos modos, dudo que esta pregunta valga la pena. Después de todo, C es solo un lenguaje pequeño. Podrías haber aprendido lo básico en un tiempo más corto de lo que perdiste al reflexionar sobre si tienes que aprender C o no.

SK-logic
fuente