En mi opinión, lo que las personas consideran coloquialmente un "lenguaje de programación" son en realidad tres cosas diferentes:
- Tipo de lenguaje y sintaxis
- IDE de idioma
- Bibliotecas disponibles para un idioma
Por ejemplo, cuando alguien menciona C # en una discusión, puede pensar que está hablando de la sintaxis del lenguaje (1), pero es 95% seguro de que la discusión involucrará .Net framework (3). Si no está diseñando un nuevo lenguaje, es difícil y generalmente inútil aislar (1) e ignorar (2) y (3). Esto se debe a que IDE y la biblioteca estándar son "factores de comodidad", cosas que afectan directamente la experiencia de usar una herramienta determinada.
Los últimos años también participé en Google Code Jam. La primera vez opté por C ++ porque tiene un buen soporte para leer la entrada. Por ejemplo, leer tres enteros de una entrada estándar en C ++ se ve así:
int n, h, w;
cin >> n >> h >> w;
Mientras que en C # el mismo se vería así:
int n, h, w;
string[] tokens = Console.ReadLine().Split(' ');
n = int.Parse(tokens[0]);
h = int.Parse(tokens[1]);
w = int.Parse(tokens[2]);
Eso es mucho más sobrecarga mental para una funcionalidad simple. Las cosas se vuelven aún más complicadas en C # con entrada multilínea. Tal vez simplemente no he descubierto una mejor manera en ese entonces. De todos modos, no pude pasar la primera ronda porque tenía un error que no podía corregir antes del final de la ronda. Irónicamente, el método de lectura de entrada ofuscó el error. El problema era simple, la entrada contenía un número que era demasiado grande para un entero de 32 bits. En C # int.Parse(string)
arrojaría una excepción, pero en C ++ la secuencia de entrada del archivo establecería un cierto indicador de error y fallaría silenciosamente, haciendo que el desarrollador desprevenido desconozca un problema.
Ambos ejemplos demuestran cómo se usó la biblioteca en lugar de la sintaxis del lenguaje. El primero demuestra la verbosidad y el otro demuestra la fiabilidad. Muchas bibliotecas se portan a varios idiomas y algunos idiomas pueden usar bibliotecas que no están específicamente diseñadas para ellos (consulte la respuesta de @ vartec sobre Python con bibliotecas C).
Para concluir, conocer el algoritmo correcto ayuda. En las competencias de codificación es crucial, especialmente cuando los recursos, como el tiempo de ejecución y la memoria, están limitados a propósito. En el desarrollo de aplicaciones es bienvenido pero generalmente no es crucial. La mantenibilidad es más importante allí. Se puede lograr mediante la aplicación de patrones de diseño correctos, con una buena arquitectura, código legible y documentación relevante y todos esos métodos dependen en gran medida de las bibliotecas internas y de terceros. Por lo tanto, me parece más importante saber qué tipo de ruedas ya se han inventado y cómo se ajustan y cómo hacer las mías.