¿Existe un lenguaje entre C y C ++?

18

Realmente me gusta la naturaleza simple y transparente de C: cuando escribo código C me siento libre de "abstracciones con fugas" y casi siempre puedo hacer una suposición astuta sobre el ensamblaje que estoy produciendo. También me gusta la sintaxis simple y familiar para C.

Sin embargo, C no tiene estos elementos simples y útiles que C ++ ofrece como clases, manejo simplificado sin cadenas, etc. Sé que todo es posible implementar en C usando tablas de salto y similares, pero a veces es un poco extraño. , y no es muy seguro de tipo por varias razones.

Sin embargo, no soy fanático del énfasis excesivo en los objetos en C ++, y me da miedo el 'nuevo' operador y similares. C ++ parece tener demasiados problemas para, por ejemplo, ser utilizado como lenguaje de programación del sistema.

¿Existe un lenguaje que se encuentra entre C y C ++ en la escala de widgets y doodads?

Descargo de responsabilidad: me refiero a esto como una pregunta puramente objetiva. No pretendo enojarlo porque no comparto su opinión de que C {, ++} es lo suficientemente bueno como para hacer lo que sea que esté planeando.

Robert Martin
fuente
10
Usted dice que su pregunta es "puramente objetiva", pero está descontando c ++ porque "parece" tener demasiados contratiempos. ¿Cuáles son estos inconvenientes y son razones válidas para descontar c ++?
whatsisname
2
¿Cuál es la 'escala de widgets y doodads'? Si desea respuestas reales a una pregunta "puramente objetiva", debe evitar métricas sin sentido.
Caleb
2
Y las pocas cosas que haces sobre C ++ traicionan alguna información errónea. newes principalmente un refuerzo mallocque también puede encargarse de inicializar la memoria por usted. Con "ubicación nueva" y operator new, puede decidir cómo y dónde asigna memoria. Y en cuanto al énfasis del objeto: unas pocas líneas por encima de usted indican que considera las clases como un "doodad simple y útil". ¡Decídete!
25
Use C+ Diclaimer: Lo siento, no pude t resist. Itel 1 de abril;)
knut
2
Esto suena muy parecido a la hipótesis del continuo, y probablemente con la misma respuesta. ( en.wikipedia.org/wiki/Continuum_hypothesis )
John Smith

Respuestas:

29

Estos podrían ser los droides que estás buscando ...

Ir - http://golang.org/

D - http://dlang.org/

Rust - http://rust-lang.org/

Jacks_Gulch
fuente
55
@dtech: D tiene ese GC inútil / "Todo lo que hereda del Objeto" / Los valores deben ser una mierda. Ya tengo C # para eso y en realidad tiene herramientas decentes. Vaya, admito que mi recuerdo de por qué lo descarté es algo confuso, pero según recuerdo, cortó varias características muy útiles.
DeadMG
44
-1 para "lo que C ++ debería haber sido". C ++ es lo que es y si no puede manejarlo, ese es en gran medida su problema. Puede manejarlo utilizando un lenguaje que le convenga mejor, pero eso no significa que C ++ debería haber sido así.
back2dos
77
@DeadMG En D, hiciste 2 afirmaciones significativas: GC es obligatorio y todo tiene que ser un objeto. Ambos están equivocados. Me lleva a pensar que su conclusión se basa más en la ignorancia que en el conocimiento real. Tengo que estar de acuerdo con CodexArcanum.
deadalnix 01 de
55
@deadalnix: Técnicamente, puedes elegir no usar el GC. Pero dado que no tiene forma de saber o controlar qué funciones de biblioteca o características de lenguaje usan el GC, no existe una forma realista de producir un programa que no lo use. Y no puede crear una clase que no herede de Object. Y sus structs están seriamente en comparación con los valores de C ++: sin herencia, sin referencias de valor, por ejemplo, por lo que es imposible producir algo tan simple como una clase de cadena de valor en D que sea tan eficiente como su equivalente en C ++. Esos son hechos sobre el lenguaje D.
DeadMG
55
@DeadMG: Hacer estructuras sin herencia es una característica , no un "gimping". Es algo que acertaron, algo que casi todos los lenguajes OO en la historia que no se llaman "C ++" acertaron (incluido Simula, el lenguaje OO original) y que C ++ se equivocó increíblemente. Los tipos de herencia y valor no se mezclan. Rompe la identidad del objeto, rompe la sustitución de Liskov, rompe todo el paradigma OO.
Mason Wheeler
19

Hay bastantes lenguajes (por ejemplo, Java, Go, D, Objective-C) que son más o menos paralelos a C ++, o intentos de solucionar problemas que los autores vieron con C ++.

Sin embargo, al menos IMO, todos ellos funcionan sustancialmente por debajo de C ++ para la mayoría de los propósitos prácticos.

Desafortunadamente, según su gusto aparente por saber qué código de ensamblaje se producirá, probablemente podamos descartar Objective C y Java inmediatamente.

Teóricamente, consideraría Ir como el más interesante de estos: tiene algunas ideas realmente originales y enfoques interesantes para resolver problemas que hacen que algunos tipos de código sean mucho más fáciles. Desafortunadamente, los compiladores actuales no producen un código muy bueno, y no ha habido muchas mejoras al respecto en los últimos años.

Eso deja a D como el único que tiene una oportunidad. Probablemente sea el más similar a C ++ (de estos), pero también el menos probable (IMO) para solucionar lo que parece ver como problemas.

Eso deja un enfoque obvio: use C ++, pero use solo las partes que desee y evite las partes que no le gustan.

Jerry Coffin
fuente
13
+1 para "usa C ++ y evita las partes que no te gustan". Y sugeriría al OP que aprenda más sobre C ++, las personas a menudo rechazan las cosas solo porque no las conocen lo suficientemente bien.
Doc Brown
1
@DocBrown Quizás sea porque no es tan fácil conocer C ++ lo suficientemente bien.
Malcolm
3
@ Malcolm: por supuesto, es difícil aprender C ++ moderno en profundidad. Pero por otro lado, no hay absolutamente ninguna razón para ser "tímido con el nuevo operador", eso me parece supersticioso.
Doc Brown
3
@ Malcolm: Probablemente porque el concepto es muy simple . ¿Necesito un literal de cadena UTF-32 o un literal de cadena UTF-16? Bueno, esa es una pregunta bastante fácil de responder, suponiendo que conozca los conceptos básicos de las codificaciones de cadenas wtf. ¿Y esa multitud de características duras? Existen por una razón . Por ejemplo, los genéricos de Java. Son patéticos en comparación con las plantillas. Claro, hay menos que aprender, pero eso es simplemente porque no son muy útiles. Es como llamar a algo más complejo que Brainfuck difícil.
DeadMG
3
@ Malcolm: Eso no es cierto en absoluto. La popularidad está influenciada por 99999 cosas además de si el idioma es bueno o útil.
DeadMG
16

Sin embargo, C no tiene estos elementos simples y útiles que C ++ ofrece como clases, manejo simplificado sin cadenas, etc. Sé que todo es posible implementar en C usando tablas de salto y similares, pero a veces es un poco extraño. , y no es muy seguro de tipo por varias razones.

Sin embargo, no soy fanático del énfasis excesivo en los objetos en C ++, y me da miedo el 'nuevo' operador y similares.

Lo siento, amigo, alarma de contradicción. Se requiere un manejo sin cadenas new. Es una necesidad fundamental. No puedes tener std::stringsin new. Y, además, new/ deletees exactamente equivalente a malloc/ freepero más seguro , porque garantiza la correcta construcción y destrucción de los objetos del montón (¡totalmente necesario!) Y utiliza un manejo de excepciones en lugar de un NULLretorno, y por lo tanto es superior en todas las formas imaginables. En C ++ 11 es muy posible escribir su propia newfunción de estilo, porque el reenvío perfecto le permite tratar con cualquier constructor de cualquier tipo. Si tiene miedo a las armas new, le sugiero que simplemente no sepa con qué está tratando.

Ah, sí, y los punteros inteligentes hacen que nunca, nunca, tengas que lidiar con nada de esto tú mismo.

Además, en C ++ no hay un énfasis excesivo. No tiene que usar ningún objeto que no quiera. Puede programar funcionalmente con lambdas y tal cuando lo desee. Nadie te obliga a usar la herencia y las funciones virtuales; de hecho, muchos buenos programas de C ++ rara vez exhiben herencia. Las plantillas son la técnica de abstracción más poderosa y más útil. Esto no es Java.

DeadMG
fuente
1
Estoy de acuerdo. Es mucho mejor usar C ++ de la manera que desee que buscar una alternativa (probablemente inferior)
dtech
1
No creo que las lambdas sean suficientes para programar funcionalmente. También esperaría tener un operador de composición de funciones, curry, etc. Consulte también stackoverflow.com/questions/1981400/functional-programming-in-c . Para mí, parece casi como hacer POO en C ...
Giorgio
@Giorgio: Las respuestas de esa pregunta solo dicen "¡Es difícil!". No muestran ninguna evidencia de que sea realmente difícil . ¿Por qué querrías un operador separado para la composición de funciones? f(g(x))Parece funcionar bien para mí. Y también creo que el currículum se puede hacer como una biblioteca genéricamente en C ++ 11.
DeadMG
1
@DeadMG: Un operador de composición de funciones es un concepto básico bastante bien establecido en programación funcional. Esperaría encontrarlo en un lenguaje compatible con FP. Me parece muy conveniente (conciso) definir una función compleja como composición de otras funciones (por ejemplo, como lo hace con las tuberías en Unix) sin usar variables: k = h. g. f
Giorgio
1
@Giorgio: std::bindapoya esas cosas.
DeadMG
4

C es casi un subconjunto de C ++, por lo que puede usar esas partes de C ++ que le gustan y no tener en cuenta el resto. Incluso es posible escribir C válido que también es C ++ válido.

No escribirás C ++ idiomático, pero eso es casi tan "intermedio" como parece.

Alternativamente, puede consultar otros lenguajes que intentan extender C hacia algo más poderoso, especialmente D y Objective-C.

Y finalmente, dependiendo de la naturaleza del proyecto, puede optar por un enfoque políglota: divida su proyecto en módulos y elija el idioma más adecuado para cada parte. La desventaja de esto es que necesita que los idiomas funcionen juntos, lo que puede ser demasiado trabajo para que valga la pena el esfuerzo.

tdammers
fuente
De hecho, trabajar en industrias como el desarrollo de juegos de consola, donde realmente queríamos "un lenguaje entre C y C ++", eso es exactamente lo que hicimos. Utilizamos un subconjunto de funcionalidades de C ++, con ciertas cosas fuera de los límites, o más probablemente fuera de los límites dentro de los bucles críticos de rendimiento.
Carson63000
3

Solo para ofrecer una respuesta salvaje, lista para usar: si el idioma que desea no existe, ¿por qué no hacer uno usted mismo? Hay una variedad de poderosas herramientas de desarrollo del lenguaje, justo en los viejos recursos de (F) Lex y Yacc / Bison. Como ya conoce C, solo necesita su "compilador" para generar el código C, para el que luego usa su cadena de herramientas existente.

Esto puede ser más simple y más poderoso de lo que piensas. Comience con un analizador / lexer para C, luego agregue las características adicionales que considere importantes. Si las tablas de salto son molestas para escribir a mano, descubra una construcción para expresar el resumen y deje que su intérprete las escriba por usted. Esencialmente, esto es solo un nivel superior de metaprogramación previa al procesador, utilizando herramientas externas para realizar la metaprogramación. Siempre sabrá exactamente cómo será el ensamblaje final, ya que conoce el C y sabe en qué C se expandirán sus extensiones de lenguaje.

Obviamente, existen algunas limitaciones sobre la efectividad de esto sin mucho trabajo adicional. Agregar un sistema de tipo estático completo puede ser un poco más complejo de lo que desea ingresar, pero es una opción que podría explorar si le gusta. Sus extensiones DSL son tan poderosas y complejas como usted tiene tiempo y energía para hacerlas, y quién sabe, tal vez algún día su lenguaje de extensiones se convertirá en "el próximo C ++".

CodexArcanum
fuente
2

No ha dicho qué características de C ++ son molestas para usted. de todos modos podrías probar Objective-C. Se enfatiza en Orientado a Objetos en lugar de Biblioteca Estándar en C ++.

nulo
fuente
2
imho Objective-C es un exiguo intento de introducir clases en C e inferior en muchos aspectos a C ++. Además, se usa muy poco fuera de Mac OS X / iOS.
dtech
1
@dtech: Interesante, un antiguo colega mío, que no es fanático de Mac (más bien un tipo Debian / Linux) estaba convencido de que Objective-C era una extensión OO mucho más limpia de C que C ++. Sin embargo, nunca he probado Objective-C, así que no tengo una opinión al respecto.
Giorgio el
1
@dtech: Entonces, humildemente, le sugiero que reconsidere su opinión;) Objective-C trata sobre la orientación a objetos, y hace un trabajo mucho mejor que C ++, ya que introduce el paso de mensajes. Si bien estoy de acuerdo en que el lenguaje es inferior a C ++ en muchos sentidos, es igual de superior en otros aspectos.
back2dos
@Giorgio Estoy de acuerdo con su colega, aunque Obj-C también tiene algunos límites (tal vez algunos de estos desaparecieron con Obj-C 2.0), por ejemplo, me gustaría tener una sobrecarga de "métodos" (selectores), por cierto me gustaría función sobrecargando a la Fortran en C ...
ShinTakezou
2

El mundo incrustado especificó Embedded C ++ , que puede ser lo que estás buscando. Quitaron cosas como herencia múltiple y similares. Hasta donde yo sé, sin embargo, se ha extinguido.

Mattnz
fuente
0

Puede encontrar útil esta comparación detallada de C ++, Objective-C, Java y C # . Personalmente, creo que C # es mucho más limpio para trabajar que C ++. He portado varias funciones C (numéricas / cálculos) a C # antes sin que sean necesarios demasiados cambios debido a la similitud de los tipos de datos numéricos y de sintaxis.

dodgy_coder
fuente