Era necesario reescribir el código de un idioma a otro, y descubrimos que al acceder a un índice de matriz inexistente, los diferentes idiomas se comportan de manera diferente. Detalles debajo del corte.

Aquí hay un código de muestra en Texto estructurado, que se utiliza para programar controladores industriales. Los programas en este lenguaje pueden realizar diversas acciones, desde controlar un semáforo hasta controlar procesos en una planta de energía nuclear. Se respetan los detalles del lenguaje y la plataforma, por lo que el código puede parecer bastante inusual.
VAR i: INT; OUT: INT; IN: ARRAY [0..4] of INT:= 1, 2, 3, 4, 5; END_VAR OUT := 0; FOR i:= 0 TO 4 DO OUT := OUT + IN[i]; END_FOR;
¿Qué hace este programa? Lee datos de las señales de entrada y escribe la acción de control en la variable OUT. El valor de esta variable será 15. Ahora introducimos algún error en el programa, tomando específicamente un elemento en un índice inexistente en la matriz y observando el resultado.
VAR i: INT; OUT: INT; IN: ARRAY [0..4] of INT:= 1, 2, 3, 4, 5; END_VAR OUT := 0; FOR i:= -1 TO 4 DO OUT := OUT + IN[i]; END_FOR;
El valor en la variable OUT = 15
Eso es lo mismo que antes del error. El programa no arrojó una excepción, sino que simplemente ignoró el elemento inexistente. Este comportamiento es bastante aceptable para nosotros si no manejamos accidentalmente la excepción y manejamos las barras de emergencia de un reactor nuclear. La acción de control de la variable OUT será la misma que antes del cambio de índice erróneo. Si se trata de una falla a corto plazo, el sistema no responderá al error y continuará funcionando de manera estable. Ahora imagine que diferentes programas en otros lenguajes de programación realizan la misma tarea y comparan los resultados.
El código sin un índice erróneo se ejecuta de manera idéntica en todos los lenguajes de programación y la variable OUT siempre tiene el valor 15. Solo consideraremos el código donde el error se introdujo con el valor del índice de inicio igual a -1.
Javascript
var IN = [ 1, 2, 3, 4, 5 ]; var OUT = 0; for (var i = -1; i <= 4; i++) { OUT += IN[i]; } console.log('OUT = '+ OUT);
OUT = NaN
Ir
package main import "fmt" func main() { IN := [5]int{ 1, 2, 3, 4, 5 } OUT := 0 for i := -1; i <= 4; i++ { OUT += IN[i] } fmt.Printf("OUT = %d", OUT) }
pánico: error de tiempo de ejecución: índice fuera de rango
Java
public class MyClass { public static void main(String args[]) { int[] IN = {1, 2, 3, 4, 5}; int OUT = 0; for (int i = -1; i <= 4; i++) OUT += IN[i]; System.out.printf("OUT = %d", OUT); } }
Excepción en el hilo "principal" java.lang.ArrayIndexOutOfBoundsException: -1
Php
<?php $IN = [1, 2, 3, 4, 5]; $OUT = 0; for ($i=-1; $i<=4; $i++) { $OUT += $IN[$i]; } echo('OUT = '.$OUT);
OUT = 15
Aviso PHP: Desplazamiento indefinido: -1
Python 3
IN = [ 1, 2, 3, 4, 5 ]; OUT = 0; for i in range(-1, 5): OUT += IN[i]; print('OUT = {0:1d}'.format(OUT));
OUT = 20
En Python, se admiten índices negativos y la numeración va desde el final de la matriz.
C / c ++
#include<stdio.h> int main() { int IN[]= {1,2,3,4,5}; int OUT=0; int i; for (i=-1; i<=4; i++) { OUT += IN[i]; } printf("OUT = %i", OUT); return 0; }
Con el lenguaje C ++, una historia separada. Si desea consultar este ejemplo en sitios populares, obtendrá estos resultados:
http://codepad.org
FUERA = -143484461
https://ideone.com/ et al.
OUT = 15
https://www.jdoodle.com
OUT = 14
En este artículo, no entraré en detalles sobre qué compiladores de C / C ++ en qué plataformas usan estos sitios. Estaría muy feliz si compartes tu opinión en los comentarios.
Do sostenido
using System; class Program { static void Main() { int[] IN = new int[] { 1, 2, 3, 4, 5 }; int OUT = 0; for (int i = -1; i <= 4; i++) { OUT += IN[i]; } Console.Write("OUT of IN + y = "+ OUT); } }
Excepción no controlada:
System.IndexOutOfRangeException: el índice estaba fuera de los límites de la matriz.
Conclusiones
Al escribir código en cualquier lenguaje de programación, debe tener en cuenta las características de trabajar con estructuras de datos en el lenguaje. También tenga en cuenta todos los lugares en el código donde el programa puede "bloquearse". A menudo, después de una excepción, el código del programa ya no se puede devolver a la línea de error, y se pueden realizar acciones importantes debajo del código. Por lo tanto, no todos los idiomas son adecuados para resolver ciertos problemas o requieren verificaciones adicionales y ramificaciones de código. En los idiomas del estándar IEC, existe protección contra errores primitivos de software, ya que a menudo no hay nadie que sobrecargue el programa del controlador cuando ocurre una falla y esta operación también puede ser fatal en algunas situaciones.