Alternativas modernas compilables a C / C ++ [cerrado]

38

Estoy considerando escribir un nuevo producto de software. El rendimiento será crítico, por lo que desconfío de usar un lenguaje interpretado o uno que use una capa de emulación (leer java).

Lo que me lleva a pensar en usar C (o C ++), sin embargo, ambos son bastante largos en el diente. No los he usado en mucho tiempo. Supuse que en los últimos 20 años, alguien probablemente ha creado algo que es razonablemente popular, agradable de codificar y compilar.

¿Qué alternativas más modernas hay para C para escribir código compilado de alto rendimiento?

Si C ++ es una bestia diferente de lo que era hace 15 años, lo consideraría, supongo que suponía que tenía algunos problemas inherentes.

La paralelización sería importante, pero probablemente no en varias máquinas.

Jeremy French
fuente
21
C ++ moderno es radicalmente diferente a C. Es mucho más comparable a algo como Java o C # que a C, excepto que presenta destrucción determinista en lugar de recolección de basura, y también tiene un comportamiento indefinido ya que no se ejecuta en una VM o administrado medio ambiente. Su otra alternativa es D, que es un lenguaje decente, pero aún muy inmaduro en términos de bibliotecas y soporte.
Charles Salvia
11
¿Puedes dar más detalles sobre la parte de "el rendimiento será crítico"? ¿Por qué será crítico? ¿Ya has medido algo?
JesperE
3
¡15 años es un eón en términos informáticos y durante ese tiempo, personas como Ericsson han estado utilizando lenguajes funcionales como Erlang para admitir aplicaciones distribuidas, tolerantes a fallas, en tiempo real suave y sin interrupciones en sus sistemas integrados! No asuma que solo C ++ puede brindarle el rendimiento que desea, puede ser mejor que arroje más hardware al problema y se ahorre mucho tiempo de implementación con otro lenguaje.
Mark Booth
55
@JeremyFrench: pero estás haciendo una pregunta basada en suposiciones falsas, ese rendimiento => compilación estática.
vartec
44
Por lo que vale, Haskell actualmente sirve como mi reemplazo para C ++ en la mayoría de los casos.
Jon Purdy

Respuestas:

54

Existe un lenguaje en desarrollo llamado The Rust Programming Language que persigue objetivos similares a los de C ++, en particular abstracciones de costo cero y un control preciso sobre la administración de la memoria. Dicho esto, es quizás el próximo candidato más notable a pesar de ser todavía muy joven.

Además de Rust, realmente no hay otras alternativas populares que se compilen en código nativo. También están Delphi y D, por supuesto, pero no son tan rápidos, populares o usados. El lenguaje Go de Google podría ser un candidato, pero aún es muy joven y apunta a un dominio un poco diferente.

Sin embargo, tenga en cuenta que C # (suponiendo que la plataforma Microsoft) y Java podrían no ser tan lentos aunque se ejecuten sobre una máquina virtual; la compilación de código justo a tiempo puede hacer algunas optimizaciones que los compiladores tradicionales anticipados no son capaces de aplicar debido a la falta de información sobre el estado y el entorno del programa.

Francamente, personalmente no consideraría a C como un candidato si C ++ es una opción, principalmente debido al hecho de que C ++ moderno es más seguro, funciona a un nivel más alto de abstracción, es más expresivo y prácticamente no tiene pérdida de rendimiento sobre C (en algunos casos C ++ es notablemente más rápido). En pocas palabras, C ++ proporciona todo lo que proporciona C y más. La mayor parte de la funcionalidad de C se considera "obsoleta" y la biblioteca estándar de C ++ proporciona alternativas mejores, más seguras, más rápidas y más intuitivas.

zxcdw
fuente
55
No diría que la funcionalidad C está "obsoleta", en un sentido oficial, solo que casi no hay razón para usar funciones de biblioteca C, punteros sin formato o matrices C en C ++.
Charles Salvia
20
+1 por hablar en contra de la suposición falsa 'se requiere compilación para el rendimiento'.
Telastyn
3
@gbjbaanb intenta compilar con Visual Studio y con MinGW en Windows y buena suerte con eso: | intente también convencer a una persona que le proporciona una biblioteca compilada compilada con una de estas herramientas que no sabe nada acerca de los ABI de que está equivocado y que debe proporcionarle la fuente de esa biblioteca o aprender a recompilar y proporcionar las especificaciones correctas . El horror, a veces.
user827992
55
@paxRoman: puede escribir pequeños programas en C ++ y escribirlos de manera más segura que en C.
kevin cline
3
@JBRWilkinson Hasta donde yo sé, la popularidad de Objective-C no existe fuera de la plataforma de Apple.
zxcdw
19

También está Ada , que compila el código nativo, y es portátil en varias plataformas dentro de los límites de su biblioteca estándar. El idioma está vivo y bien, con la actualización estándar de idioma más reciente actualmente en curso (conocida como Ada 2012).

Resumen rápido para aquellos que no están familiarizados con Ada:

  • Fuertemente tipado
  • Soporte incorporado para concurrencia
  • Orientado a objetos o de procedimiento, según sus requisitos.
  • Compatible con la cadena de herramientas GNU (GCC contiene interfaz de usuario Ada)
  • Excelente también para el desarrollo de software, es decir, cuando necesita interactuar directamente con el hardware
  • Admite programación genérica (paquetes genéricos, procedimientos, funciones)
  • Las características admiten el desarrollo de software a gran escala (paquetes, paquetes secundarios, compilación separada, distinción estricta entre especificación e implementación)
Schedler
fuente
1
Sin mencionar Ada Tasks (¡Paralelismo!)
NWS
66
+1: He intentado aprender algo de Ada y creo que es un lenguaje muy robusto y limpio. Una pena que no haya tantos trabajos como para otros lenguajes de programación.
Giorgio
3
Buena mención, estaba buscando algo más 'moderno' pero me había olvidado de Ada
Jeremy French
44
@Jeremy French: ¿Qué características estás buscando en un lenguaje más 'moderno' que Ada no ofrece?
Giorgio
17

Si C ++ es una bestia diferente de lo que era hace 15 años, lo consideraría, supongo que suponía que tenía algunos problemas inherentes.

Hace 15 años, no existía el estándar C ++. El segundo ha sido publicado el año pasado. Las mejores prácticas de C ++ cambiaron mucho en los 5 años posteriores a la publicación del estándar 98, y están cambiando nuevamente con la publicación del 11.

Un programador
fuente
12

¿Por qué la gente siempre insiste en buscar nuevos idiomas?

C ++:

  • Es el lenguaje número 4 de TIOBE, pero pisa toda competencia si se combina con C
  • Tiene muchos marcos
  • Es muy fácil de codificar
  • Es muy fácil de sintonizar
  • Es muy eficiente
  • Es muy seguro
  • Tiene un muy buen apoyo de la industria.
  • Es plataforma cruzada
  • No necesita VM adicionales / Frameworks / desorden de implementación si se hace correctamente
  • Te conseguirá fácilmente un trabajo
  • Tiene todo lo necesario para compilar .so / .dll para iniciar en sistemas muy antiguos
  • Fácil de solucionar
  • Muy expresivo
  • Muy dinámico
  • y un montón de otras cosas interesantes

El único inconveniente de C ++ es que tienes que aprender un poco. Eso es.

Compare eso con otros idiomas que son uno o más de:

  • Estrechamente compatible (OCML, Fortran, ...)
  • Lento (Java, Javascript)
  • Experimental (Silverlight)
  • Un objetivo en movimiento (.NET 1/2/3/4/5? ¿Cuál es el último ahora?)
  • Plataforma bloqueada (.NET)
  • Tener un soporte deficiente del marco (Fortran)
  • Tiene comunidades pequeñas (cualquier cosa fuera de los 10 principales)
  • Son una pesadilla para solucionar problemas (cualquier cosa con conceptos y cosas a prueba de tontos de alto nivel)
  • Necesita 500 MB de preintallación en la máquina del cliente (JVM / .NETVM)

En mi humilde opinión, cuantos menos idiomas usaremos y apoyaremos, mejor será la situación.

Esto provoca mejoras automáticas en los marcos para el idioma, el soporte, la documentación, el trabajo de los comités de estandarización, mejores libros, más conocimiento, software más fácil de soportar, mejores patrones, ciclos de soporte de idiomas más largos y un código más experto escrito en el idioma.

Sé que la gente votará en contra de esto, pero piénselo de verdad.

Descifrador
fuente
71
C ++ "es muy fácil de codificar" es ridículamente incorrecto, lo siento. Es un lenguaje increíblemente difícil de aprender e incluso si usa modismos modernos de C ++ y evita punteros, se enfrentará a toneladas de compiladores desconcertantes y errores de tiempo de ejecución antes de acostumbrarse. E incluso después de haberlo dominado, la sintaxis se interpone con frecuencia. Safe C ++ a menudo usa un desorden de plantillas anidadas que generan grandes cantidades de código repetitivo.
Konrad Rudolph
20
Muy expresivo y muy dinámico no suenan como rasgos típicos de C ++, en comparación con los lenguajes dinámicos.
vartec
29
@gbjbaanb "un poco más difícil de aprender" está, una vez más, ridículamente fuera de lugar. Lo siento. He estado programando todos esos lenguajes durante años, claramente prefiero C ++ (y hago la programación más seria), pero decir que es fácil es totalmente engañoso. Y no estoy hablando de cosas sofisticadas de metaprogramación, estoy hablando de errores de compilación producidos por código común, causados ​​por ocultación de nombres, ADL, constproblemas de corrección y cosas por el estilo. Cualquiera que haya leído C ++ efectivo (como dice Coder) y mantiene que C ++ es fácil tiene una desconexión mental.
Konrad Rudolph
13
@gbjbaanb Soy un programador de C ++. Una vez más, no creo que C ++ sea fácil. Y este hilo de comentarios también obtuvo algunos ceños fruncidos del chat de C ++. Entonces no es eso. Y la diferencia entre las trampas de C ++ y las de otros idiomas es que si no las conoce en otros idiomas, probablemente estará bien. En C ++, eres tostada. E incluso si los conoce, aún puede obtener varias páginas de pantalla de errores de compilación para un solo error (me sucedió de nuevo hoy). Y aunque el error fue fácil de solucionar (un error tipográfico), lleva tiempo analizar todo eso.
Konrad Rudolph el
66
¿Cuándo ha sido bueno un lenguaje popular? PHP es muy popular y ninguna persona seria piensa que es un "buen" lenguaje, incluso para su nicho. Lo único "bueno" de los lenguajes populares es que hay muchas bibliotecas para facilitar la programación de ciertos dominios. C ++ está lleno de frustración.
weberc2
11

C / C ++ es bastante largo en el diente ... esto es algo bueno . Implica que se diseñaron lo suficientemente bien (ejem) que todavía son muy utilizables, que muchas personas los usan para las tareas cotidianas y que encontrará un gran grupo de desarrolladores que son expertos en ellos. La madurez es algo para atesorar.

Si pasas todo el tiempo buscando algo nuevo, solo porque es nuevo y piensas que, de alguna manera, debe ser mejor, te encontrarás con una gran decepción. Esto se aplica a los lenguajes de software, sistemas GUI (tomar nota, Microsoft y Gnome) y amantes (tomar nota, señoritas :))

Ahora, sin duda, si su experiencia con C ++ tiene 20 años, cuando el código de C ++ generalmente se codificó como C, entonces tal vez es hora de reevaluar el lenguaje, todas las características que estaban allí en el día que nunca se usaron del todo se usan mucho más hoy en día, y algunos esfuerzos de estandarización han ampliado un poco el lenguaje para que parezca muy diferente de los antiguos desarrollos de estilo C. No es que C también sea malo, ¡también es un lenguaje perfecto para muchos tipos de tareas de codificación!

gbjbaanb
fuente
16
Creo que C y C ++ ejemplifican el comentario de Hoare sobre el diseño de software: o lo hacen tan simple que obviamente no hay deficiencias, o lo hacen tan complicado que no hay deficiencias obvias.
TMN
1
¿Cómo son las "vulnerabilidades de seguridad repetidas debido a alguna forma de explotación de búfer" algo bueno, independientemente de la antigüedad o arraigo de un idioma? Y, ¿es esto realmente diferente de argumentar la continuación de un matrimonio establecido después de repetidos abusos?
usuario2864740
@ user2864740 lo que estás sugiriendo es divorciarte porque la esposa es vieja y quieres un modelo nuevo y emocionante ... Digo que te quedes con lo que tienes porque conoces las debilidades y peculiaridades. ¿Cuántos de los nuevos y geniales idiomas resuelven problemas como el desbordamiento del búfer y luego resultan tener formas sutiles de desbordar los búferes? Entonces, ¿qué es mejor: el desbordamiento que puedes evitar al no ser perezoso o usar la construcción correcta, o la que caes porque no sabías que estaba allí?
gbjbaanb
@gbjbaanb No, nunca dije eso. Estaba dibujando un símil específicamente para el daño causado por no mejorar el contexto de las situaciones. En general, soy bastante racional y no soy propenso a la selección "fanboi" de temas o herramientas de tendencias (esto es solo mi naturaleza). Además, C y C ++ son lenguajes diferentes; Sin embargo, ambos están justificados por el mismo motivo de cobertura. Y ese es el problema con eso .
user2864740
8

El estándar actual de C ++ es C ++ 11 , que se publicó en 2011. Por lo tanto, no es un estándar de 20 años. Y ha habido numerosos estándares en el medio. Cada uno de ellos presenta numerosas mejoras de rendimiento.

Los compiladores también han estado mejorando constantemente. Son mucho mejores en optimización de lo que solían ser.

Los formatos ejecutables también han mejorado, hace 20 años tenía una salida , ahora tiene ELF .

En general, la sugerencia de que C ++ no cambió en 20 años no puede estar más lejos de la verdad.

Además, tenga en cuenta que C y C ++ son lenguajes muy diferentes.

vartec
fuente
2
Supuse que algo que fue concebido por primera vez hace 20 años tendría limitaciones arquitectónicas inherentes que solo podrían mejorarse con una pizarra en blanco. Creo que esta suposición puede haber estado equivocada.
Jeremy French el
44
@JeremyFrench: ¿Te gusta la arquitectura x86?
TMN
2
@ TMN ¿eso prueba o refuta mi suposición?
Jeremy French el
66
La arquitectura original x86 era un compromiso desagradable entre la compatibilidad con el 8080 y un conjunto de características para competir con el 68000 y el NS32032. Memoria segmentada (con punteros "lejanos" y "cercanos"), solo 4 registros de propósito general, codificación de instrucciones de longitud variable, más de 50 tipos de instrucciones JMP, un bus de sistema multiplexado de tres estados ... Y aún hoy, eso mismo el diseño básico se está volviendo más fuerte que nunca, después de que muchos diseños de pizarra limpia "superiores" (Alpha, MIPS, PowerPC) no pudieron desplazarlo.
TMN
1
@JeremyFrench no, su suposición no estaba mal, al menos en el caso de C ++. Las características de C ++ 11 son definitivamente útiles; Sin embargo, en este punto son más basura en la pila de basura. Intentan incorporar características de los lenguajes modernos, pero para hacer frente al desorden existente de C ++, deben tener excepciones, y esas excepciones tendrán excepciones y así sucesivamente.
weberc2
6

No soy un gran experto en este lenguaje, pero creo que OCaml podría ser una opción interesante a la vista.

OCaml es un lenguaje compilado, funcional / orientado a objetos. Para una comparación de rendimiento con C ++, vea C ++ vs OCaml: comparación del rastreador de rayos . Por supuesto, este es un ejemplo muy específico y uno debería hacer pruebas más extensas para tener una mejor idea del rendimiento de OCaml.

Giorgio
fuente
¿Puede el votante dar una pista sobre cómo se puede mejorar esta respuesta? Gracias.
Giorgio
3

Depende de lo que haga su producto. Si el rendimiento es realmente crítico, el idioma de elección sigue siendo FORTRAN . Tampoco descartaría Java: se usa en muchas aplicaciones de comercio financiero de alto volumen. Vale la pena echarle un vistazo a Erlang si su dominio problemático requiere una alta concurrencia. Objective-C es bueno, aunque no sé qué tan bien soportado está fuera del ecosistema de Apple (más allá de los compiladores y el tiempo de ejecución básico). También he escuchado cosas buenas sobre el rendimiento de Haskell, pero no estoy seguro de si es un rendimiento absoluto o solo un rendimiento en relación con otros lenguajes funcionales.

TMN
fuente
2
Todos los trabajos financieros que he visto quieren desarrolladores de C / C ++, no Java. Por experiencia con Java, no puedo ver ninguno que sea de alto rendimiento a menos que le arrojes grandes cantidades de hardware.
gbjbaanb
Hay muchos sistemas de comercio Java en funcionamiento en Wall Street y en varios bancos de inversión en los Estados Unidos y el Reino Unido. También se usa bastante en la Bolsa Mercantil de Chicago.
TMN
3

Cuando dice que su proyecto es sensible al rendimiento, ¿se refiere a cada línea de código del mismo? O, como es normal, ¿hay un porcentaje menor que sea crítico para el rendimiento, mientras que el resto es el código comercial habitual del molino?

Después de responder eso, ¿cuál es el mayor riesgo para su proyecto: que el resultado final sea demasiado lento o que nunca lo termine en primer lugar?

Suponiendo que responda el segundo para ambos, debe desarrollar en un lenguaje de nivel superior que admita interoperabilidad nativa (Python, Ruby, la familia .Net tienen todo esto). Primero, termina el proyecto. Luego perfile, optimice, enjuague, repita. Solo después de eso, considere volver a escribir el segmento de elección de su aplicación en código nativo e integrar ese código nativo con su producto terminado.

Chris Pitman
fuente
Una vez que es Java, no puede recuperarlo si es demasiado lento.
Codificador
66
@Coder Java tiene un FFI (JNI) que le permite 'causar estragos' en el idioma que elija. Entonces, si ha diseñado bien las interfaces, puede reemplazar una implementación de Java con una nativa. La plataforma Java está bien pensada.
K.Steff
1

Vala es similar a Java y C #, compila a código nativo (o código fuente C si lo prefiere), y es muy rápido . Requiere GLib para sus bits orientados a objetos, y está escrito por hackers de Linux para hackers de Linux, por lo que si su dominio es Windows, puede que no sea muy bueno.

Reinstalar a Mónica
fuente
1

Objective-C es una alternativa moderna y compilada a C y C ++. Tiene gestión de memoria tanto recolectada de basura como determinista, y el tiempo de ejecución OO de paso de mensajes se ha optimizado para el rendimiento.

Está disponible a través de GCC y CLang y hay bibliotecas de aplicaciones como GNUStep y Cocotron que funcionan en varias plataformas.

Si está haciendo un trabajo de alto rendimiento, voy a suponer que es una especie de cálculo de números u otro trabajo de divide y vencerás en lugar de la interfaz de usuario, por lo que eso significa que puede hacer la interfaz de usuario en el idioma que sea más fácil para usted, por ejemplo, HTML a través de un mini servidor http.

JBRWilkinson
fuente
0

Nunca lo he usado, pero un amigo de mis juramentos de Cython que le permite usar primitivas de estilo C en partes críticas de rendimiento de su código mientras mantiene la sintaxis general de Python y puede aprovechar al máximo las construcciones de nivel superior de Python para reducir el desarrollo tiempo en cualquier otro lugar.

Dan Neely
fuente