programming - ¿Cómo se inspira C#en C++ más que en Java?
c# vs c++ (18)
Bueno, creo que comenzarás una pequeña discusión sobre esto.
Creo que Java también es un tipo de actualización / evolución de C ++, así que, por supuesto, esto explicaría la similitud en cierta medida. La verdad es, por supuesto, que C # se inspiró tanto en Java como en C ++ y eliminó los conceptos de ambos idiomas. Y, por supuesto, hay mucho en el campo de la programación funcional y la programación dinámica que se adapta a C #.
Así que creo que es incorrecto decir que C # está "más cerca" de Java que de C ++ o al revés. De alguna manera está cerca de ambos.
Al mirar el historial de C # , descubrí que C # se veía como una actualización de C y / o C ++. Esto me sorprendió un poco, ya que en la superficie, veo ideas mucho más comunes entre C # y Java (la recolección de basura viene a la mente). No escribo código en Java, pero por lo general no tengo problemas para seguir el código de Java, y leo habitualmente libros sobre patrones en Java que puedo transponer fácilmente en C #, y honestamente no puedo decir lo mismo de C ++.
Entonces mi pregunta es, ¿cómo es que C # está más cerca de C ++ que de Java? ¿Es esto simplemente una negativa a reconocer Java, o me estoy perdiendo o malinterpretando algo?
Creo que en el sentido de que C # es más un lenguaje de paradigma múltiple en lugar de forzar un paradigma único (OOP) como en JAVA. Es algo bueno en realidad, porque le da más libertad a sus programadores.
Creo que la conexión Java -> C # es mucho más fuerte que C ++ -> C #, principalmente porque, como se ha señalado, C # fue el resultado de la demanda del Sol por la supuesta violación de la especificación Java de MSVM. En particular, fue el uso de palabras clave / funcionalidad adicionales de J ++ como "delegate", que se convirtió en una de las principales características distintivas de C #, que fue una de las principales quejas de Sun.
Otras funciones como las directivas @dll y @com (que prefiguraban los atributos en Java y C #) también fueron parte de la queja. Note la similitud entre las directivas COM PIA de C # y las directivas @com en J ++. Compare JDirect de J ++ con interoperabilidad nativa en C #. (Otra razón para la demanda fue el hecho de que MS deshabilitó JNI de Java por completo a favor de JDirect específico de Windows).
Finalmente, Anders Hejlsberg es el responsable de J ++ y C #, por lo que la conexión entre Java / J ++ y C # es bastante sólida. Sin duda, Hejlsberg tenía muchos aspectos de la mente de C ++ (en particular, la característica de puntero / delegado del método, que primero flotaba en J ++), pero es seguro decir que Java tenía que haber estado a la vanguardia.
En muchos aspectos, puede ver la versión alterada de Java, J ++ de Microsoft como C # 0.1
En los aspectos de OO y herencia, C # es más similar a C ++. Por ejemplo:
class MyClass : MyInterface
en lugar de
class MyClass implements MyInterface
y
public MyClass() : base()
en lugar de
public MyClass() { super(); }
También C # usa la idea de funciones virtuales para permitir la sobrecarga. En java, la herencia y la sobrecarga son más bien un asunto abierto que se debe bloquear. En C ++ y C #, está por defecto más bloqueado y debe abrirse.
Otras similitudes incluyen:
- Pasar por referencia
- sobrecarga del operador
- punteros / delegados de funciones
En mi opinión, la idea de que C # se inspira más en C ++ que en Java es solo de marketing; un intento de llevar programadores de C ++ al mundo administrado de una manera que Java nunca pudo hacer. C # se deriva de Java principalmente; Cualquiera que vea la historia, particularmente las guerras de Java VM de mediados de los 90 entre Sun y Microsoft, puede ver que Java es el principal.
La sintaxis de C # es más cercana a C ++ solo en ciertas áreas: manipulación de punteros (que Java no tiene), declaración de derivación (es decir, public class Foo : Bar, IBaz
lugar de public class Foo extends Bar implements IBaz
) y sobrecarga de operadores.
Todo lo demás es igual que Java (principal estático declarado en una declaración de clase, sin archivos de encabezado, herencia única, muchos otros), al igual que Java y C ++ (sintaxis básica), o únicamente C # (propiedades, delegados, muchos otros) .
Es marketing Microsoft ciertamente no quiso admitir que "¡Hey, estamos haciendo Java 1.1!" Primero, sería lo mismo que admitir que realmente vale la pena copiar Java, lo que es una mala decisión si intentas vencer a Java.
Y, en segundo lugar, asustaría a todos los desarrolladores nativos de C ++ que se asustaron por la torpeza de Java y los problemas de rendimiento iniciales.
Entonces dicen que están construyendo sobre C ++ y que todos están más contentos.
En realidad, por supuesto, nada podría estar más lejos de la verdad.
Si C # y Java tienen un ancestro común, no es C ++, sino "C con clases"; específicamente, las versiones más tempranas de C ++, mucho antes de que se estandarizara, y antes de la mayoría de lo que lo hace útil hoy en día se agregó.
Fue poco más que un intento de atornillar algunas funciones OOP a C.
C ++, desde entonces, ha ido en una dirección completamente diferente, dejando de lado la obsesión OOP y explorando un estilo mucho más funcional, utilizando una forma de compilación de pato en tiempo de compilación para crear una programación genérica. Algunas bibliotecas increíblemente potentes y elegantes se han agregado al lenguaje. Nada de eso está representado en Java o C #.
C # está definitivamente inspirado en Java más que nada. Y donde está inspirado en C ++, está inspirado en esta temprana variante de "C con clases", en lugar de cualquier cosa que se parezca al C ++ moderno.
Pero C ++ fue, y es, considerado por muchos un lenguaje "genial". Microsoft quería aprovechar ese "cool" y llevarlo a .NET.
Personalmente, consideraría que C ++, C # y Java son hermanos. Todos se derivan del mismo lenguaje "C con clases". C # y Java tomaron una ruta menos directa desde allí que C ++, pero aún así es de donde proviene la mayor parte de su inspiración. Ahí es donde heredaron la extraña noción de OOP que prácticamente no tiene nada que ver con lo que propuso Alan Kay / Smalltalk, y es donde heredaron la torpe sintaxis de tipo C.
Es un poco como decir que los humanos somos evolucionados de los simios. No eran. Simplemente tenemos un ancestro común, y ese ancestro común era algo parecido a un simio. C # no se deriva de C ++, solo tienen un ancestro común que es ligeramente similar a C ++.
FWIW: Desde una perspectiva histórica anterior a la aparición de C #, MSFT estaba promocionando Visual J ++, que era una implementación de Java con algunas mejoras para permitir el uso de características específicas de Windows.
Sun Microsystems presentó una demanda, ya que su objetivo con Java era un lenguaje de escritura y ejecución en cualquier lugar, y Visual J ++ resultaría en aplicaciones que solo funcionaban en Windows, pero no en la implementación de Unix de Sun.
Sun prevaleció ante el tribunal y MSFT retiró Visual J ++ del mercado y, poco después, anunció que Visual C # era trivialmente diferente sintácticamente y funcionalmente idéntica al lenguaje Visual J ++ que se acaba de retirar.
La sintaxis inspirada en C ++, la VM inspirada en Java y las bibliotecas (en .net 1.1) tuvieron una correlación de casi 1-1 con las bibliotecas Delphi.
Los tres son solo parientes cercanos.
Cuya madre era pequeña.
¿Quién el padre de cada idioma es otra pregunta?
Ada + Smalltalk => Java
C + Smalltalk => C++
? + Smalltalk => C#
Para empezar, permite la manipulación de punteros (en bloques inseguros).
Personalmente, diría que está más cerca de Java que de C ++, pero algunos extras para el crisol:
- Delegados (aproximadamente punteros a funciones)
- Tipos de valor definidos por el usuario
Los genéricos son diferentes para los 3, pero los genéricos de Java de borrado de tipo son probablemente (aunque es una comparación extraña) más cercanos a las plantillas de C ++ que a los genéricos basados en el tiempo de ejecución de C #.
Por lo que vale la pena, los formularios de C # están muy relacionados con el Swing de Java. Las bibliotecas de Gui de C ++ son, en la mayoría de los casos, bastante diferentes.
Probablemente voy a tomar en serio esto, pero sí, C # es, en general, la respuesta de Microsoft a Java. Es un lenguaje que pueden extender de cualquier forma que elijan (a diferencia de Java, donde fueron censurados por extenderlo en formas no aprobadas). Tiene las características críticas de Java: administración de memoria y una gran biblioteca de sistemas. Es similar a C ++ o similar a C tanto como debe ser para atraer a los desarrolladores de C ++ y C que aún no son fanáticos de Java.
Si recuerdas el historial, Microsoft realmente intentó usar su metodología "Embrace and Extend" en Java, donde se agregan para que solo funcione con Windows y lo llame "J ++".
Sun los demandó por lo que salieron con J #, que era muy similar a Java como una brecha que les dio tiempo para desarrollar un lenguaje propio (C #).
En ese momento, era una mezcla de los mejores conceptos de todos los idiomas disponibles en ese momento; no tiene sentido decir que se basaba más en uno que en el otro, es solo una conglomeración de características seleccionadas.
Pero si le gusta esta idea de comenzar desde cero y trabajar con todas las mejores características de idiomas hasta la fecha, asegúrese de consultar en Scala: ha ido más allá de lo que Java o C # pueden hacer, incluso con una gran revolución de características.
Su nombre comienza con la letra C.
Un ejemplo es el operador de comparación == en cadenas. C # toma el enfoque de C ++ y hace una comparación léxica en la cadena. Java compara las referencias de cadena.
Aquí hay un buen artículo de MSDN que lo lleva a través de una comparación entre C # y Java y C # y C ++.
Una vez me entrevistaron y me preguntaron en qué lenguaje C # estaba modelado y rápidamente dije un mejor C ++ o Java (C--). El entrevistador dijo "¡Incorrecto!", Es Delphi. No sé Delphi, así que ...
Veo C # como una versión administrada de C ++, en lugar de una reescritura de Java. Al crear tal lenguaje, naturalmente tomó la forma de Java (sintácticamente) pero conserva los elementos del increíblemente poderoso C ++.