Foi necessário reescrever o código de um idioma para outro e constatou que, ao acessar um índice de matriz inexistente, idiomas diferentes se comportam de maneira diferente. Detalhes sob o corte.

Aqui está um código de exemplo no texto estruturado, usado para programar controladores industriais. Os programas nesse idioma podem executar várias ações, desde o controle de um semáforo até o controle de processos em uma usina nuclear. As especificidades do idioma e da plataforma são respeitadas, portanto o código pode parecer bastante incomum.
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;
O que esse programa faz? Lê dados dos sinais de entrada e grava a ação de controle na variável OUT. O valor dessa variável será 15. Agora, introduzimos algum erro no programa, pegando especificamente um elemento em um índice inexistente na matriz e analisando o 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;
O valor na variável OUT = 15
É o mesmo que antes do erro. O programa não lançou uma exceção, mas simplesmente ignorou o elemento inexistente. Esse comportamento é bastante aceitável para nós se não tratamos acidentalmente a exceção e gerenciamos as hastes de emergência de um reator nuclear. A ação de controle da variável OUT será a mesma de antes da alteração incorreta do índice. Se for uma falha de curto prazo, o sistema não responderá ao erro e continuará a trabalhar de forma estável. Agora imagine que programas diferentes em outras linguagens de programação executem a mesma tarefa e compare os resultados.
O código sem um índice incorreto é executado de forma idêntica em todas as linguagens de programação e a variável OUT sempre tem o valor 15. Somente consideraremos o código no qual o erro ocorreu com o valor do índice inicial 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
Go
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: erro de tempo de execução: índice fora da faixa
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); } }
Exceção no encadeamento "main" 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 do PHP: deslocamento 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
No Python, índices negativos são suportados e a numeração vai do final da 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; }
Com a linguagem C ++, uma história separada. Se você quiser verificar este exemplo em sites populares, obterá estes resultados:
http://codepad.org
OUT = -143484461
https://ideone.com/ et al.
OUT = 15
https://www.jdoodle.com
OUT = 14
Neste artigo, não entrarei em detalhes sobre quais compiladores C / C ++ em quais plataformas esses sites usam. Eu ficaria muito feliz se você compartilhar sua opinião nos comentários.
C afiado
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); } }
Exceção não tratada:
System.IndexOutOfRangeException: o índice estava fora dos limites da matriz.
Conclusões
Ao escrever código em qualquer linguagem de programação, você precisa considerar os recursos de trabalhar com estruturas de dados na linguagem. Leve também em consideração todos os locais do código em que o programa pode "travar". Geralmente, após uma exceção, o código do programa não pode mais ser retornado à linha de erro e ações importantes podem ser executadas abaixo do código. Portanto, nem todos os idiomas são adequados para solucionar certos problemas ou exigem verificações adicionais e ramificações de código. Nos idiomas do padrão IEC, há proteção contra erros de software primitivos, pois muitas vezes não há ninguém para sobrecarregar o programa do controlador quando ocorre uma falha e essa operação também pode ser fatal em algumas situações.