¿Por qué C ++ no puede adoptar el enfoque de D para la implementación de su concepto?


19

Como muchos de ustedes saben, los conceptos , el enfoque de C ++ para restringir los tipos posibles para un argumento de plantilla no se pudo incluir en C ++ 11.

Aprendí que el lenguaje de programación D 2.0 tiene una característica similar para su programación genérica. Su solución me parece bastante elegante y simple.

Entonces mi pregunta es por qué C ++ no puede usar un enfoque similar .

  • ¿El objetivo del concepto C ++ podría ser mayor que el que proporciona la implementación de D?
  • ¿O el legado de C ++ le impide adoptar este enfoque?
  • ¿O cualquier otro?

Gracias por tus respuestas.

ps Para ver algunos ejemplos del poder de programación genérico de D, consulte esto: /programming/7300298/metaprogramming-in-c-and-in-d/7303534#7303534


2
Esta pregunta debería haberse migrado a programmers.se. (Voté por eso, pero 3 votos fueron por "no constructivo").
iammilind

3
Creo que la pregunta podría no estar escrita de la manera más constructiva, pero que tiene valor. Me encantaría que alguien explicara cómo D maneja los conceptos, y pueda compararlo con los dos enfoques principales que el comité de C ++ adoptó los conceptos antes de que decidieran posponer la característica por completo ... Si esto se va a cerrar, entonces debería al menos ser trasladado a programadores
David Rodríguez - dribeas

2
@David: voté a favor de reabrir (y luego tal vez, se puede mover al sitio de programadores)
Nawaz

1
De acuerdo con David No veo ninguna razón para decir preventivamente "no constructivo" antes de que alguien pueda intentar construir algo. con 0 respuestas, la "constructividad" es 0/0 por lo tanto indeterminada.
Emilio Garavaglia

1
@ jj1: ¿Puede proporcionar una breve explicación sobre el enfoque de D para aquellos de nosotros que no conocemos el idioma?
David Rodríguez - dribeas

Respuestas:


9

El estándar de C ++ es un documento normativo, que establece reglas que permanecerán (en su mayoría no afectadas) en los documentos futuros. Por lo tanto, el comité ha adoptado un enfoque muy cauteloso con respecto a sus actualizaciones.

Las adiciones a la biblioteca estándar fueron algo fáciles. Varias bibliotecas habían estado en Boost durante mucho tiempo: se había demostrado que funcionaban.

Sin embargo, las adiciones a los conceptos centrales en el lenguaje son mucho más difíciles de experimentar, ya que primero requiere modificar un compilador. Se había especificado una característica de C ++ 03 (la exportación de plantillas) sin el soporte del compilador ... el resultado fue horrible. Los implementadores de la interfaz del compilador EDG lo informaron como una tarea masiva (varios años hombre) con muy poca ganancia. Ningún otro compilador ha intentado implementarlo. No es una situación cómoda.

Características como constexpro static_asserteran fáciles (y ya emuladas por bibliotecas). Las lambdas se entienden bastante bien y se implementan en una variedad de otros idiomas, ya se ha realizado una investigación exhaustiva, por lo que fue principalmente una cuestión de sintaxis.

Por otro lado, los conceptos se consideraron demasiado nuevos y no se probaron . Apenas se especificaron a tiempo, no hubo prueba de concepto ... y, por lo tanto, fueron rechazados, en lugar de esperarlos (o cometer un error).

¿Por qué no seguir a D? No se dice que no lo hará. El comité ha alentado a las personas a repensar desde cero, sin límite de tiempo, e intentar incluirlos en un compilador para ver cómo interactúan con otras características del lenguaje. Cabe destacar la cuestión de separar los conceptos y los mapas conceptuales: ¿deberían agruparse como uno o no?

FYI: Actualmente hay una rama de Clang dedicada a esta experimentación, dirigida por Larisse Voufo de la universidad de Indiana.


Comentario menor: la palabra clave de exportación era en realidad una característica de c ++ 98 (la estandarización original). La corrección de errores de 2003 abordó principalmente las características de la biblioteca.
ex0du5

@ ex0du5: Correcto, el '03 es una revisión menor del Estándar C ++ 98, que se refería principalmente a correcciones.
Matthieu M.

3

Para el estándar de 2011, los conceptos de C ++ eran en lo que se estaba trabajando, y finalmente se eliminaron de ese estándar, porque no estaban "suficientemente cocidos". El trabajo continúa en conceptos de C ++ que pueden llevarlos a pasar al siguiente estándar. Sin embargo, podría ser que algunas personas trabajen en una propuesta para el próximo estándar que sea similar a las restricciones de plantilla de D. Queda por ver si eso sucede o no. Hasta donde sé, no existía tal propuesta para el estándar de 2011, por lo que no había posibilidad de que se convirtiera en ese estándar independientemente de sus méritos, pero lo que lo hará o no en el próximo estándar es completamente desconocido. en este punto.

No conozco ninguna razón importante por la que algo similar a las restricciones de plantilla de D no se pueda implementar para C ++, aunque dado que C ++ generalmente es más limitado en lo que puede hacer en tiempo de compilación, podría ser más difícil hacer que funcionen como bien como lo hacen en D (aunque la introducción de cosas como constexprciertamente ayuda).

Entonces, realmente, creo que la respuesta corta es que no hay una razón técnica por la cual algo similar a las restricciones de plantilla de D no pueda estar en C ++.

La pregunta es si dicha propuesta se hará para el próximo estándar y cómo se comparará con cualquier propuesta similar que se haga (por ejemplo, propuestas relacionadas con conceptos). Suponiendo que se pueda hacer una propuesta aceptable, esperaría completamente que algo similar a los conceptos o las restricciones de la plantilla de D lo conviertan en el próximo estándar simplemente porque hay un gran deseo de hacerlo. La pregunta es si alguien puede presentar una propuesta que sea lo suficientemente sólida y "lo suficientemente elaborada" para ser aceptable.


2

¿Te refieres a las restricciones de plantilla de D?

Hasta donde sé, los conceptos de C ++ se habían propuesto en nombre de boost :: concept. El problema, aquí, es que boost es una biblioteca escrita para C ++ 03. C ++ 11 tiene otras capacidades de sintaxis que permiten implementar ciertas cosas de una manera diferente que C ++ 03 permite (por lo tanto, el refuerzo en sí mismo puede reescribirse aprovechando la nueva sintaxis).

El comité estándar abandonó los conceptos porque habría tardado demasiado en especificarlos (lo que retrasará nuevamente la aprobación de c ++ 11). Probablemente irán en la próxima versión de C ++.

Mientras tanto, la sintaxis de D es diferente de C ++ y D conserva algunas capacidades de evaluación de expresión en tiempo de compilación que C ++ no siempre puede tener sin romper algún código heredado (algo que D no tiene, ya que tiene un historial más corto). C ++ ahora tiene static_asserty costexpr, eso permite mejorar las capacidades de evaluación de tiempo de compilación. Puede ser en el futuro alcanzará un nivel similar.


2

Aquí hay un control de calidad con Herb Sutter, habla sobre conceptos en la marca de 15 minutos.

http://channel9.msdn.com/Shows/Going+Deep/Herb-Sutter-C-Questions-and-Answers

Si te gusta, aquí hay otro: http://channel9.msdn.com/Shows/Going+Deep/Conversation-with-Herb-Sutter-Perspectives-on-Modern-C0x11

Ahora en cuanto a tu pregunta. ¿Por qué no la versión D? Bueno, ¿por qué usarlo? C ++ es un lenguaje muy complejo y estable. Cada característica debe seleccionarse con mucho cuidado, ya que generalmente debe ser compatible durante décadas. Si observa el primer estándar de C ++ y sigue las revisiones, hay algunas características obsoletas, pero incluso esas deben ser compatibles. Por lo tanto, tiene sentido diseñar conceptos que se ajusten al 100% a C ++.

En cuanto a por qué no se incluyó en C ++ 0x. Bueno porque era enorme. La propuesta tenía 100 páginas y era muy difícil de implementar. Se decidió que esta característica necesita más tiempo para madurar hasta que se incluya en el estándar.


2

En pocas palabras, C ++ tiene mucho más bagaje histórico que D. Sería mucho más fácil implementar un montón de cosas si no fuera por el hecho de que C ++ tiene enormes cantidades de código histórico que deben continuar funcionando correctamente. y como se esperaba D no tiene este problema.


Tal vez simplemente lo expresaste mal, pero el problema no es el código heredado, el problema es que cualquier característica nueva estará presente en el lenguaje durante décadas y debe ser compatible. Eso significa que cada nueva característica debe elegirse con mucho cuidado.
Let_Me_Be

@Let_Me_Be: Correcto, el problema está en el código heredado que tendremos diez años más adelante si incluimos conceptos ahora.
David Thornley
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.