Estoy considerando aprender C
No hay una razón específica para no aprender C, pero sugeriría C ++. Ofrece mucho de lo que hace C (ya que C ++ es un súper conjunto de C), con una gran cantidad de "extras". Aprender C antes que C ++ es innecesario: son efectivamente lenguajes separados.
Dicho de otra manera, si C fuera un conjunto de herramientas para trabajar la madera, probablemente sería:
- martillo
- uñas
- Sierra de mano
- taladro de mano
- lijadora de bloque
- cincel (tal vez)
Puede construir cualquier cosa con estas herramientas, pero cualquier cosa agradable requiere potencialmente mucho tiempo y habilidad.
C ++ es la colección de herramientas eléctricas en su ferretería local.
Si se apega a las características básicas del lenguaje para comenzar, C ++ tiene relativamente poca curva de aprendizaje adicional.
Pero, ¿por qué las personas usan C (o C ++) si se puede usar 'peligrosamente'?
Porque algunas personas no quieren muebles de IKEA. =)
En serio, aunque muchos lenguajes que son "superiores" a C o C ++ pueden tener cosas que los hacen (potencialmente) "más fáciles" de usar en ciertos aspectos, esto no siempre es algo bueno. Si no le gusta la forma en que se hace algo o no se proporciona una función, es probable que no haya mucho que pueda hacer al respecto. Por otro lado, C y C ++ proporcionan suficientes características de lenguaje de "bajo nivel" (incluidos punteros) para que pueda acceder a muchas cosas de manera bastante directa (especialmente hardware o sistema operativo) o construirlo usted mismo, lo que puede no ser posible en otros idiomas implementados.
Más específicamente, C tiene el siguiente conjunto de características que lo hacen deseable para muchos programadores:
- Velocidad : debido a su relativa simplicidad y optimizaciones del compilador a lo largo de los años, es nativamente muy rápido. Además, muchas personas han descubierto muchos atajos a objetivos específicos al usar el lenguaje, lo que lo hace aún más rápido.
- Tamaño : por razones similares a las enumeradas para la velocidad, los programas en C pueden hacerse muy pequeños (tanto en términos de tamaño ejecutable como de uso de memoria), lo cual es deseable para entornos con memoria limitada (es decir, integrada o móvil).
Compatibilidad : C ha existido durante mucho tiempo y todos tienen herramientas y bibliotecas para ello. El lenguaje en sí tampoco es exigente: espera que un procesador ejecute instrucciones y memoria para guardar cosas y eso es todo.
Además, hay algo conocido como una interfaz binaria de aplicación (ABI) . En resumen, es una forma para que los programas se comuniquen a nivel de código de máquina, lo que puede tener ventajas sobre una interfaz de programación de aplicaciones (API) . Si bien otros lenguajes como C ++ pueden tener una ABI, generalmente son menos uniformes (acordados) que los C, por lo que C es un buen lenguaje básico cuando desea utilizar una ABI para comunicarse con otro programa por alguna razón.
¿Por qué los programadores no solo usan Java o Python u otro lenguaje compilado como Visual Basic?
Eficiencia (y ocasionalmente esquemas de administración de memoria que no pueden implementarse sin un acceso relativamente directo a la memoria).
El acceso directo a la memoria con punteros presenta muchos trucos ingeniosos (generalmente rápidos) cuando puede poner sus patas sucias en los pequeños y ceros en sus cubículos de memoria directamente y no tener que esperar a que ese viejo maestro entregue los juguetes solo a la hora de jugar y luego recogerlos de nuevo.
En resumen, agregar cosas potencialmente crea un retraso o, de lo contrario, introduce una complejidad no deseada.
Con respecto a los lenguajes con secuencias de comandos y cosas por el estilo, debe trabajar duro para obtener los lenguajes que requieren que los programas secundarios se ejecuten de manera tan eficiente como C (o cualquier lenguaje compilado) de forma nativa. Agregar un intérprete sobre la marcha introduce inherentemente la posibilidad de disminuir la velocidad de ejecución y aumentar el uso de memoria porque está agregando otro programa a la mezcla. La eficiencia de sus programas depende tanto de la eficiencia de este programa secundario como de qué tan bien (mal =) escribió su código de programa original. Sin mencionar que su programa a menudo depende completamente del segundo programa para ejecutarse. ¿Ese segundo programa no existe por alguna razón en un sistema en particular? Código no ir.
De hecho, la introducción de algo "extra" potencialmente ralentiza o complica su código. En los lenguajes "sin punteros de miedo", siempre está esperando que otros fragmentos de código se limpien detrás de usted o que de otra manera descubra formas "seguras" de hacer las cosas, porque su programa todavía está haciendo las mismas operaciones de acceso a la memoria que se podrían hacer con punteros Simplemente no eres el que lo maneja (por lo que no puedes joderlo, genio = P).
Por peligroso, quiero decir con punteros y otras cosas similares. [...] Como la pregunta de desbordamiento de pila ¿ Por qué la función gets es tan peligrosa que no debería usarse?
Por la respuesta aceptada:
"Seguía siendo una parte oficial del lenguaje hasta el estándar ISO C de 1999, pero fue eliminado oficialmente por el estándar de 2011. La mayoría de las implementaciones de C todavía lo admiten, pero al menos gcc emite una advertencia para cualquier código que lo use".
La idea de que, debido a que algo se puede hacer en un idioma, debe hacerse es una tontería. Los idiomas tienen fallas que se arreglan. Por razones de compatibilidad con el código anterior, esta construcción aún se puede utilizar. Pero no hay nada (probable) que obligue a un programador a usar gets () y, de hecho, este comando fue esencialmente reemplazado por alternativas más seguras.
Más aún, el problema con gets () no es un problema de puntero per se. Es un problema con un comando que no necesariamente sabe cómo usar la memoria de manera segura. En un sentido abstracto, se trata de cuestiones de puntero: leer y escribir cosas que no debes. Eso no es un problema con los punteros; Es un problema con la implementación del puntero.
Para aclarar, los punteros no son peligrosos hasta que accidentalmente acceda a una ubicación de memoria que no tenía intención de hacer. Y aun así, eso no garantiza que su computadora se derrita o explote. En la mayoría de los casos, su programa dejará de funcionar (correctamente).
Dicho esto, debido a que los punteros brindan acceso a ubicaciones de memoria y a que los datos y el código ejecutable existen en la memoria juntos, existe un peligro real de corrupción accidental como para que desee administrar la memoria correctamente.
Hasta ese punto, debido a que las operaciones de acceso directo a la memoria a menudo brindan menos beneficios en general de lo que podrían haber sido hace años, incluso los lenguajes no recolectados como C ++ han introducido cosas como punteros inteligentes para ayudar a cerrar la brecha entre la eficiencia y la seguridad de la memoria.
En resumen, hay muy pocas razones para temer al puntero siempre que se use de manera segura. Solo tome una pista de la versión de South Park de Steve "El cazador de cocodrilos" Irwin: no ande metiendo el pulgar en los huecos de los cocodrilos .