que haría el análisis & compilar el lenguaje mucho más fácil
no veo cómo. ¿Por qué es más fácil analizar y compilar i <i> i
si está requiere para emitir un diagnóstico, de lo que es analizarlo si se le permite hacer algo que muy bien por favor siempre que el código emitido no tenga efectos secundarios?
El compilador de Java prohíbe el código inalcanzable (a diferencia del código sin efecto), lo cual es una bendición para el programador y requiere un poco de trabajo extra del compilador que lo que un compilador de C++ debe hacer. (análisis básico de dependencia de bloques). ¿Debería C++ prohibir el código inalcanzable? Probablemente no. A pesar de que los compiladores de C++ ciertamente hacen suficiente optimización para identificar bloques básicos inalcanzables, en algunos casos pueden hacer demasiado. ¿Debería ser if (foo) { ...}
un bloque ilegible inalcanzable si foo
es una constante de tiempo de compilación falsa? ¿Qué pasa si no es una constante en tiempo de compilación, pero el optimizador ha descubierto cómo calcular el valor, si es legal y el compilador tiene que darse cuenta de que la razón por la que lo está eliminando es específico de la implementación, para no dar un error ? Casos más especiales.
en realidad nadie tiene ningún programas actuales que tienen las expresiones sin efectos secundarios en los
Cargas. Por ejemplo, si NDEBUG
es verdadero, entonces assert
se expande a una expresión vacía sin efecto. Así que eso es aún más casos especiales necesarios en el compilador para permitir algunas expresiones inútiles, pero no otras.
La razón de ser, creo, es que si se ampliara a nada, entonces (a) los compiladores terminarían arrojando advertencias para cosas como if (foo) assert(bar);
, y (b) un código como este sería legal en versión pero no en depuración, que es simplemente confuso:
assert(foo) // oops, forgot the semi-colon
foo.bar();
cosas como el análisis sintáctico más irritante
es por eso que se llama "irritante". Es un problema de compatibilidad con versiones anteriores. Si C++ ahora cambió el significado de esos molestos analizadores, el significado del código existente cambiaría. No hay mucho código existente, como usted señala, pero el comité de C++ toma una línea bastante fuerte sobre la compatibilidad con versiones anteriores. Si desea un lenguaje que cambie cada cinco minutos, use Perl ;-)
De todos modos, ya es demasiado tarde. Incluso si tuviéramos una gran idea que el comité de C++ 0x había pasado por alto, por qué alguna característica debería eliminarse o modificarse de manera incompatible, no van a romper nada en el FCD a menos que el FCD sea definitivamente erróneo.
Tenga en cuenta que para todas sus sugerencias, cualquier compilador podría emitir una advertencia para ellos (en realidad, no entiendo cuál es su problema con el segundo ejemplo, pero ciertamente para expresiones inútiles y para analizar molestos en cuerpos de funciones) . Si tiene razón en que nadie lo hace deliberadamente, las advertencias no causarán ningún daño. Si está equivocado, nadie lo hace deliberadamente, su caso declarado para eliminarlos es incorrecto. Las advertencias en los compiladores populares podrían allanar el camino para eliminar una característica, especialmente dado que el estándar está escrito principalmente por compiladores-escritores. El hecho de que no siempre recibamos advertencias sobre estas cosas me sugiere que hay más que eso de lo que piensas.
Excepto que si el compilador tiene dos formas en que podría analizar una declaración, pero una de ellas es ilegal, entonces sabe que debe ser la otra, lo cual es simple, mientras que si la Norma permite ambas, entonces el compilador debe decidir cuál, que es mucho menos simple. Cuanto menos viables sean los programas, menos lógica necesitará para decidir cuál tiene. – Puppy
Sin embargo, eso no siempre es cierto, ya que los compiladores deben detectar ciertas expresiones inválidas e informar los mensajes de error apropiados. En cualquier caso como usted sugiere, ciertamente no puede asumir que el código es válido. –
+1 para el argumento inteligente (y válido). :-) –