En el artículo: Por qué POCO , hay esta oración:
Maciej Sobczak lo dice bien: "Simplemente no me gusta cuando alguien me da la mitad del idioma y me dice que es para mi propia protección".
No entiendo lo que quiere decir, aunque C # es propiedad de Microsoft y Java es propiedad de Oracle , eso no significa que tengan la mitad del lenguaje, ¿verdad? No encontré ninguna evidencia para probar esa oración, y tengo mucha curiosidad por esto. Y aún más curioso sobre la parte 'por mi propia protección'.
Respuestas:
Sobczak no está hablando de propiedad corporativa. El "medio" lenguaje que le falta son todas esas cosas que no puedes hacer en muchos idiomas modernos, aunque como experto en informática bien educado sabe que podrían hacerse posibles: hereda de tantas clases como quieras. Asigne cualquier objeto a cualquier otro sin restricciones de tipo. Controle la asignación y la liberación de recursos manualmente en lugar de confiar en el compilador y el tiempo de ejecución para hacerlo por él.
La cuestión es que todas esas restricciones se pusieron en lenguajes de programación por una razón. Nosotros nos tenemos lenguas que permitieron todo esto. Con el tiempo descubrimos que el programador promedio está mejor con una cierta cantidad de restricciones y agarre manual, porque el potencial de cometer errores realmente malos es demasiado grande como para valer la potencia y la expresividad adicionales.
(Obviamente, esto a veces molesta a los programadores que realmente no necesitarían tanta mano. Sus quejas son a veces legítimas. Pero las personas son notoriamente malas para evaluar sus propias habilidades, y muchos que piensan que no necesitan las salvaguardas, en De hecho, los necesito mucho. No siempre es fácil distinguir entre los intelectos superiores reales que se sienten retenidos por las restricciones en los idiomas de alto nivel de los codificadores promedio que solo piensan que quejarse los hará parecer superiores, o que no saben mejor.)
fuente
dynamic
.Esto se explica bastante bien en la fuente original de la cita :
En otras palabras, al autor de esa cita le gusta C ++, y no le gusta Java, y siente que a Java le falta la mitad de C ++. Y eso es todo lo que hay en esa cita.
fuente
El artículo vinculado en el blog que publicaste se ha eliminado, por lo que es difícil estar seguro, pero como dice Kilian, es probable que cuando diga "la mitad del lenguaje" signifique que C # y Java se sienten como C ++ pero con mucho características y construcciones eliminadas para que sean más fáciles de usar o más seguras.
En 2006, cuando se escribió esto, cuando C # era relativamente joven y Java era inmaduro en muchos sentidos, y cuando el poder frente a la seguridad parecía una compensación donde solo se podía elegir uno, esta no era una posición totalmente irrazonable. .
En estos días esa posición no es razonable en absoluto. Solo pensando en los lenguajes convencionales, C # y Java han madurado enormemente, tomando prestadas características de otros lenguajes (particularmente funcionales) para promover la escritura de código seguro. También tenemos idiomas como Rust y Swift que se crean desde cero para hacer esto.
Si alguien menosprecia un idioma porque tiene tu mano, o dice que un idioma que es difícil de usar es algo bueno, tomaría cualquier cosa que dijera con un grano de sal. Solo tiene que mirar la vergonzosa cantidad de errores encontrados en el código del que dependemos todos los días, escritos por las mentes más brillantes de la industria, que se habrían evitado trivialmente mediante el uso de lenguajes 'seguros', para ver por qué.
fuente
Mirando hacia atrás en los archivos , parece que esta cita fue de 2003 (a pesar del artículo que cita que es de 2006). En ese momento, C # estaba en la Versión 1. x , y carecía de muchas de sus características modernas :
Probablemente sea más comprensible que C # pareciera medio lenguaje en ese contexto, ya que le faltaba mucho de lo que C # es hoy. ¡Es extraño pensar que ni siquiera tenía
static
clases!También faltaban más cosas, ya que C # estaba vinculado a .NET. Por ejemplo, WPF no estaba en ese entonces; todo fue WinForms.
fuente
static
las clases parecen una característica tan primitiva; Me imaginé que eran anteriores a las clases instanciadas.static
todos modos no soy un gran admirador de las clases. Honestamente, lo elegí como una característica para llamar porque parecía una parte realmente simple y primitiva de C #; No consideré que no estuvieran en Java.Se quejaba de la falta de características del lenguaje que permiten un control detallado. Estas incluyen herramientas para
const
palabra clave C ++ )Esto me recuerda una de mis críticas a Java:
En los objetos C ++, los punteros y las referencias son tres conceptos distintos con una semántica clara. En Java solo tienes el pseudo-objeto-puntero. Al combinar esto y evitar la semántica de puntero verdadero, el modelo de objeto es menos claro.
En un programa C ++ bien definido, el programador puede esperar que las referencias sean válidas y no nulas. Debido a su modelo simplificado, Java no puede hacer las mismas garantías.
Los síntomas de este modelo menos claro incluyen el patrón de objeto nulo y yoda condicionales como
5.equals(potentiallyNullIntegerReference)
.fuente
Map.merge
cuándo simplemente desea actualizar un valor en un mapa).const
. Se hace mención "programación funcional", sin embargo, el lenguaje que utiliza como ejemplo es el esquema, que es no un lenguaje funcional puro (de hecho, los diseñadores del Esquema tienen cuidado de evitar el uso de la palabra "función" y hablan de " procedimientos "), por lo que parece que está utilizando la interpretación de" subrutinas de primera clase "de FP y no la de" transparencia referencial ".Estoy de acuerdo con la respuesta de @Kilian pero agregaré algunos elementos.
1- Ejecutar contra una máquina virtual, no el sistema operativo
Como Java y C # se ejecutan a través de una máquina virtual, lógicamente se espera que no pueda hacer exactamente lo que quiere cuando está directamente en el sistema operativo, ya que es probable que corrompa algo en la máquina virtual. Además, con Java orientada como plataforma independiente, es aún más lógica.
2- Toneladas de aplicaciones no requieren que necesites ese tipo de cosas.
Hay toneladas de aplicaciones que realmente no necesitan que revises tantos detalles, pero si lo haces con un lenguaje que requiere que lo hagas, obtienes:
3- Los idiomas se toman en función del costo / uso / riesgos de ponderación, como ... todo.
Con C ++ puedes hacer casi lo que quieras, esa es la elección de las personas de C ++. Sin embargo, cuanto más haya, más tendrá que manejar.
Entonces, cosas como la herencia múltiple no se abandonan solo por el hecho de que son peligrosas, sino que se abandonan porque su implementación tiene un costo (desarrollo, mantenimiento), todo por eso para una característica que rara vez se usa correctamente y puede generalmente se reescribirá de manera diferente.
fuente
B
se anula en la clase mediaM
, entoncesB
la versión de ese miembro solo será accesible a través deM
' anulación de s; (2) dada cualquier referencia de tipoT
, convertirla a cualquier supertipo y volver aT
producirá una referencia equivalente al original. Ambas garantías son útiles, y apoyar la herencia múltiple requeriría renunciar al menos a una.Simplemente ponga todas las restricciones en lenguajes de alto nivel como C # y Java para proteger al programador. No existen tanto para proteger al programador de sí mismo, sino para proteger al programador de otros programadores.
¿Cuántas veces, como programadores, encontramos bibliotecas que eran francamente atroces en sus prácticas de codificación y diseño, pero que nos vimos obligados a usar por una razón u otra?
Estos programas suelen tener el sello distintivo del antiguo método de programación de procedimientos, con falta de encapsulación, muchas escrituras de memoria directa con poca o ninguna captura o manejo de errores. Los Segfaults persiguen en masa cuando intentan usarlos en cualquier proyecto a gran escala.
Ahí es donde los lenguajes como Java y C # son extremadamente útiles; no es que disfruten el hecho de que no nos dejan hacer todas las cosas buenas que hacen otros idiomas, es que disfrutamos la falta de dolores de cabeza que tenemos que soportar porque otros programadores abusarían de las cosas buenas que otros idiomas pueden hacer.
Las interfaces bien merecen cualquier tipo de compensación en términos de memoria o velocidad de ejecución en mi mente. ¡Espero que puedan ver que en cualquier tipo de aplicación de misión crítica de tiempo limitado, todas esas protecciones, el manejo adecuado de errores y, en general, estar seguros de que la memoria no se está agitando son cosas buenas!
fuente
They exist not so much to protect the programmer from him/herself, but rather to protect the programmer from other programmers!
o es para proteger a otros programadores del programador?