GOTO é portável? [RESOLVIDO]

1. GOTO é portável? [RESOLVIDO]

Thiago Henrique Hüpner
Thihup

(usa Manjaro Linux)

Enviado em 05/02/2016 - 22:26h

Olá!

Gostaria de saber se o goto é portável, digo, é C/C++ Ansi? Posso utilizar em qualquer Sistema? Tem algum problema com processador não suportar ou algo do tipo?

Sei que goto não é muito bom de se utilizar, mas creio que no projeto que irei fazer precisarei dele.

Grato

Thiago


  


2. Re: GOTO é portável? [RESOLVIDO]

Perfil removido
removido

(usa Nenhuma)

Enviado em 05/02/2016 - 22:38h

Tá parecendo que é sim.
Pode depender do compilador.

----------------------------------------------------------------------------------------------------------------
http://24.media.tumblr.com/tumblr_m62bwpSi291qdlh1io1_250.gif

# apt-get purge systemd

Encryption works. Properly implemented strong crypto systems are one of the few things that you can rely on. Unfortunately, endpoint security is so terrifically weak that NSA can frequently find ways around it. — Edward Snowden



3. Re: GOTO é portável? [RESOLVIDO]

Arthur J. Hoch
Arthur_Hoch

(usa FreeBSD)

Enviado em 05/02/2016 - 22:44h

É sim.


4. Re: GOTO é portável? [RESOLVIDO]

Perfil removido
removido

(usa Nenhuma)

Enviado em 06/02/2016 - 05:42h

Sinceramente não consigo imaginar GOTO em um programa feito em C.
É contra tudo o que foi aprendido em programação estruturada.
Dijkstra revirará no túmulo.

https://pt.wikipedia.org/wiki/Edsger_Dijkstra

Sua posição contrária ao comando goto em programação de computadores, até então um recurso bastante comum na programação da época, culminou no artigo de 1968 "A Case against the GO TO Statement"[7] . Dijkstra alegava que o artifício era motivo para vários erros de programação. O artigo é considerado como um grande passo para a depreciação do comando em prol de estruturas de controle como o laço de repetição. O título mais famoso para o artigo, "Go To Statement Considered Harmful", não foi um trabalho de Dijkstra mas de Niklaus Wirth, então editor da Communications of the ACM, onde o artigo foi publicado.


Só prá saber, o professor Niklaus Wirth foi o responsável pelo Pascal.

----------------------------------------------------------------------------------------------------------------
http://24.media.tumblr.com/tumblr_m62bwpSi291qdlh1io1_250.gif

# apt-get purge systemd

Encryption works. Properly implemented strong crypto systems are one of the few things that you can rely on. Unfortunately, endpoint security is so terrifically weak that NSA can frequently find ways around it. — Edward Snowden



5. Re: GOTO é portável? [RESOLVIDO]

Alexandre Mulatinho
mulatinho

(usa Slackware)

Enviado em 06/02/2016 - 16:15h

É por isso que ele foi o criador do PASCAL e não do C.

O goto é parte do ANSI C, e apesar de você ter ANY formas de se fazer algo interessante sem utilizá-lo, algumas vezes ele é muito útil. E vários softwares open source que usamos no dia atual utilizam-se de GOTO statements. Um exemplo é o Kernel do Linux, tem vários goto's. Quem não sabe o momento correto de utilizar é que diz que não serve para nada.


6. Re: GOTO é portável? [RESOLVIDO]

Paulo
paulo1205

(usa Ubuntu)

Enviado em 06/02/2016 - 16:54h

É perfeitamente possível usar goto em C e C++. Faz parte do padrão das duas linguagens.

Não é verdade que goto é sempre nocivo. Existem situações em que um goto é a solução mais limpa. Um exemplo é quando se tem múltiplos níveis de laços de repetição aninhados e, por alguma razão, decide-se que as repetições têm de ser encerradas prematuramente. Se fosse para sair de um nível só, bastaria o comando break (que, se vocês repararem bem, é uma forma disfarçada de fazer um “goto fim_do_laço_corrente”). Para mais de um nível, sem goto, seria necessário incluir mais variáveis de controle de interrupção prematura e uma série ifs para testar essas variáveis, e isso afetaria não apenas a forma, mas também a velocidade de programa, que teria de testar essas condições a cada iteração.

Em C, mais do que em C++, goto é uma forma muito comum de tratamento de erros, especialmente quando existe aquisição e liberação gradual de recursos, e é muito usada para evitar o que eu chamo de “programa na diagonal”. Só para dar uma ideia, os dois trechos de código abaixo são rigorosamente equivalentes (inclusive em termos de código executável gerado!), só que a versão com goto geralmente é considerada mais legível (imagine que as coisas que eu coloquei ocupando apenas uma linha possam ser, na verdade, sequências potencialmente longas de comandos, como de fato costumam ser).

/* Aquisição gradual de recursos -- programa na diagonal. */
int func(){
int retval=valor_sucesso; /* Presume execução com sucesso. */
if(obtem_recurso_1()){
if(obtem_recurso_2()){
if(obtém_recurso_3()){
if(obtem_recurso_4()){
/*
Usa os quatro recursos obtidos.
*/

libera_recurso_4();
}
else {
retval=valor_erro_4;
}
libera_recurso_3();
}
else {
retval=valor_erro_3;
}
libera_recurso_2();
}
else {
retval=valor_erro_2;
}
libera_recurso_1();
}
else {
retval=valor_erro_1;
}
return retval;
}


/* Aquisição gradual de recursos -- versão com goto */
int func(){
int retval=valor_sucesso; /* Presume execução com sucesso. */
if(!obtem_recurso_1()){
retval=valor_erro_1;
goto saida_0;
}
if(!obtem_recurso_2()){
retval=valor_erro_2;
goto saida_1;
}
if(!obtem_recurso_3()){
retval=valor_erro_3;
goto saida_2;
}
if(!obtem_recurso_4()){
retval=valor_erro_4;
goto saida_3;
}
/*
Usa os quatro recursos obtidos.
*/

libera_recurso_4();
saida_3:
libera_recurso_3();
saida_2:
libera_recurso_2();
saida_1:
libera_recurso_1();
saida_0:
return retval;
}


De modo geral, em C se considera aceitável ter goto para frente, mas gotos para trás geralmente devem ser vistos com desconfiança.

Um artigo interessante sobre goto existe na Wikipedia. Veja https://en.wikipedia.org/wiki/Goto.


7. Re: GOTO é portável?

???
gokernel

(usa Linux Mint)

Enviado em 06/02/2016 - 17:08h

Sim goto é muito portável.

E é um comando/palavra reservada que não gasta muito na formação do binário quando gera "opcodes" em assembly(jmp).

Faz pouco tempo que a linguagem Lua atualizou com esse comando... depois de muito eu encher o "saco" dos caras que desenvolvem a Lua. ...rassrs.

Tambem é muito útil/rápido utilizar para criar máquinas virtuais saltando entre os "labels"(instruções) .... infelizmente esse modo não é compatível com o compilador c/c++ da MicroSoft(Visual C++).


OBS: EDITADO.



8. Re: GOTO é portável?

Paulo
paulo1205

(usa Ubuntu)

Enviado em 06/02/2016 - 18:52h

listeiro_037 escreveu:

Sinceramente não consigo imaginar GOTO em um programa feito em C.
É contra tudo o que foi aprendido em programação estruturada.
Dijkstra revirará no túmulo.


Claro que Dijkstra tem o seu valor, mas eu realmente acho chato quando alguém, só porque tem alguma fama, começa a dar uma de aiatolá. Quer ver o tamanho do absurdo? No mesmo paper em que ele pede a abolição de goto em todas as linguagens de alto nível, ele chega a cogitar também eliminar também gotos em nível de linguagem de máquina, e flerta com a ideia de eliminar também laços de repetição, substituindo-os universalmente por funções recursivas.

Tudo muito bonito teoricamente, e matematicamente pode fazer todo sentido. Contudo, o cientista teórico Dijkstra tem de colocar o pé no chão. No mundo real, não basta produzir o resultado certo: computadores têm recursos finitos (inclusive memória) e os usuários têm expectativas com relação a desempenho.

Sua posição contrária ao comando goto em programação de computadores, até então um recurso bastante comum na programação da época, culminou no artigo de 1968 "A Case against the GO TO Statement"[7] . Dijkstra alegava que o artifício era motivo para vários erros de programação. O artigo é considerado como um grande passo para a depreciação do comando em prol de estruturas de controle como o laço de repetição. O título mais famoso para o artigo, "Go To Statement Considered Harmful", não foi um trabalho de Dijkstra mas de Niklaus Wirth, então editor da Communications of the ACM, onde o artigo foi publicado.


Só prá saber, o professor Niklaus Wirth foi o responsável pelo Pascal.


Uma linguagem que, por sinal, tem goto. Ainda bem!


9. Re: GOTO é portável? [RESOLVIDO]

Perfil removido
removido

(usa Nenhuma)

Enviado em 06/02/2016 - 21:16h

Agora me convenceram do GOTO. Tem que se saber usar.

----------------------------------------------------------------------------------------------------------------
http://24.media.tumblr.com/tumblr_m62bwpSi291qdlh1io1_250.gif

# apt-get purge systemd

Encryption works. Properly implemented strong crypto systems are one of the few things that you can rely on. Unfortunately, endpoint security is so terrifically weak that NSA can frequently find ways around it. — Edward Snowden



10. Re: GOTO é portável? [RESOLVIDO]

Thiago Henrique Hüpner
Thihup

(usa Manjaro Linux)

Enviado em 07/02/2016 - 14:38h

Galera, obrigado por tirarem esse peso de mim, já estava pensando que iriam tacar pedras em mim por causa do goto.

Então se é um padrão da linguagem vou usar, mas como falaram, com cuidado.

Vou marcar o tópico como resolvido, mas não vou marcar melhor resposta pois não sei quem merece "de verdade", sendo que todos ajudaram [com participação "especial" do Paulo e sua explicação].

Muito obrigado!

[]'s

T+

--

Att,

Thiago Henrique Hüpner

(Mensagem scaneada pelo antivírus........ops! não precisa, afinal eu uso Linux!)



11. Re: GOTO é portável? [RESOLVIDO]

Paulo
paulo1205

(usa Ubuntu)

Enviado em 09/02/2016 - 22:05h

Eu sei que o tópico já foi marcado como resolvido, mas eu gostaria de deixar alguns comentários finais.

(1) Longe de mim atacar o grande Dijkstra. O paper mencionado tinha uma preocupação séria e relevante (e que permanece relevante e séria até os dias de hoje) com a possibilidade de garantir, de um ponto de vista formal, matemático mesmo, que um programa esteja correto. É uma preocupação no campo teórico, mas com consequências práticas muito pertinentes. A pergunta marcante é “como o fluxo de execução chegou até aqui?”, e é fato que o uso indiscriminado de goto torna mais difícil responder a essa pergunta, tanto para o matemático que tenta aplicar métodos formais de análise quanto para o programador que se esforça para encontrar bugs num código escrito por ele próprio ou por terceiros. Nesse sentido, o paper está em pleno contato com a realidade.

O problema é quando, após teorizar sobre a dificuldade, sugerem-se medidas extremas. Se o aedes eagypti pode se reproduzir em caixas d'água mal instaladas (i.e. sem tampa), vamos proibir todas as caixas d'água? Usando lógica análoga à proposta de Dijkstra a respeito de goto, provavelmente a resposta seria “sim”. Afinal de contas, é teoricamente possível limpar o corpo, a casa ou qualquer objeto usando apenas lenços umedecidos, certo?

(2) Não sou, por outro lado, um ardoroso defensor de goto. Ele deve ser usado tão somente quando ele for A melhor alternativa, considerando-se ao mesmo tempo vários aspectos, incluindo consumo de recursos, desempenho e legibilidade.

(3) goto não é o único elemento da linguagem que se pode alegar como desvio dos princípios de programação estruturada, do modo como seus proponentes mais ardorosos e puristas costumam propor. Se fosse para rezar pela sua cartilha, todos os blocos, tanto de funções como de laços de repetição e de execução condicional, deveriam ser sempre executados até o final.

Isso implicaria que o C deveria perder imediatamente não apenas o goto, mas também os comandos break e continue, e o comando return se tornaria redundante pois, como o único ponto de saída da função seria o seu final, seria possível assumir o valor da última expressão avaliada como valor de retorno, como fazem o Shell, Perl e algumas outras linguagens. Além disso, o comando switch deveria mudar de semântica: em vez de ter labels, com possibilidade de compartilhamento de código entre diferentes opções (“fall-through”), ter-se-ia de fato fluxos de execução completamente separados para cada alternativa.

Com uma linguagem assim capada (fosse por força de design ou pela escolha do programador que deseje seguir de modo purista a maneira de pensar de programação estruturada), todo programa seria obrigado a ter muitos mais testes condicionais e mais variáveis de controle, ou, como alternativa ou como complemento, a criar funções pequeninhas. Provavelmente aumentaria também o uso de ponteiros, ou se criaria passagem por referência, como se fez em Pascal (as referências de C++ existem por outro motivo).

(4) Por curiosidade, por conta deste tópico, eu fiz uma varredura em todos os programas em C, C++ e Perl que escrevi e ainda tenho no meu micro, arquivados desde 1988. O resultado foi o seguinte.

 Linguagem | Arquivos | Com goto | Nº Linhas | Nº gotos  
-----------+----------+----------+-----------+----------
C | 241 | 10 | 32872 | 42
C++ | 219 | 1 | 38053 | 2
Perl | 134 | 15 | 40345 | 63
-----------+----------+----------+-----------+----------
TOTAL | 594 | 26 | 111270 | 107


Uso em C:

Tipo | Arquivos | % Arqs. | Nº gotos | % Linhas
--------------------------+----------+---------+----------+----------
Tratamento de erro | 8 | 3,1395 | 36 | 0,10952
Parar laços multi-níveis | 1 | 0,4149 | 1 | 0,00304
Parser | 1 | 0,4149 | 5 | 0,01521
--------------------------+----------+---------+----------+----------
TOTAL | 10 | 4,1494 | 42 | 0,12777


Uso em C++:

Tipo | Arquivos | % Arqs. | Nº gotos | % Linhas
--------------------------+----------+---------+----------+----------
Tratamento de erro em | 1 | 0,4566 | 2 | 0,00526
destrutor | | | |
--------------------------+----------+---------+----------+----------
TOTAL | 1 | 0,4566 | 2 | 0,00526


Uso em Perl:

Tipo | Arquivos | % Arqs. | Nº gotos | % Linhas
--------------------------+----------+---------+----------+----------
Tratamento de erro | 12 | 8,9552 | 58 | 0,14376
Parar laços multi-níveis | 1 | 0,7463 | 1 | 0,00248
Sucesso prematuro(*) | 2 | 1,4925 | 4 | 0,00991
--------------------------+----------+---------+----------+----------
TOTAL | 15 | 11,194 | 63 | 0,15615

(*) “Sucesso prematuro” é como eu chamei a situação em que um
processamento relativamente longo pôde ser abreviado porque
o dado desejado calhou de vir num formato adequado antes de
chegar ao fim do processamento. É uma espécie de exceção
às avessas, um dado excepcionalmente bom.


O fato de C++ possuir exceções ajuda a evitar gotos. De fato, a única ocorrência de goto num código meu em C++ vem justamente do único lugar em que C++ não permite deixar que exceções apareçam para outros pontos do programa, que é na execução de um destrutor. Eu até poderia ter feito o código desse destrutor lançando uma exceção para si mesmo (a exceção só não poderia escapar para fora do bloco do destrutor), mas seria como usar um canhão para matar um mosquito. Uma vez que é para desviar o fluxo para dentro da mesma função e é muito menos custoso usar goto do que exceções, foi melhor usar goto.

C e Perl não possuem exceções (Perl diz que tem, usando a construção “eval BLOCK”, mas elas não funcionam -- ou não funcionavam -- muito bem), e isso ajuda a explicar o número maior de gotos nessas linguagens. O caso é ainda um pouco mais grave em Perl por causa do objetivo dos programas: a maioria dos programas que fiz em Perl era para gerar relatórios grandes e voltados à web, às vezes mesmo como CGI. Nesses casos, não dá para simplesmente matar o programa na hora e exibir uma mensagem de erro para o usuário, mas até o erro precisa ser devidamente bem formatado.


12. Re: GOTO é portável? [RESOLVIDO]

Perfil removido
removido

(usa Nenhuma)

Enviado em 09/02/2016 - 23:52h

Eu li uma vez que C tem exceções, mas é algo implementado artificialmente.
Usa-se umas funções daquelas em que o protótipo vem com três pontinhos.
Se eu lembrar eu coloco.

Agora uma coisa em que GOTO aparecia muito eram aqueles programas BASIC antigos.
O GOTO era usado para se desviar para linha tal. E tinha também o comando GOSUB.
E também um comando ON ... GOTO ... se não me engano.

No Debian o interpretador BASIC chama-se bwbasic e pode ser baixado via apt-get.
Ele grava programas em texto ASCII com o comando SAVE.
Tem um site chamado gwbasic.com com download para o velho GWBASIC que roda no DOSBOX ou no DOSEMU.
Mas ele salva em formato binário. Sem chance de formato ASCII.

EDIT: Antes que eu esqueça: programação com GOTO desordenado chama-se PROGRAMAÇÃO ESPAGUETE.
https://pt.wikipedia.org/wiki/C%C3%B3digo_espaguete

----------------------------------------------------------------------------------------------------------------
http://24.media.tumblr.com/tumblr_m62bwpSi291qdlh1io1_250.gif

# apt-get purge systemd (não é prá digitar isso!)

Encryption works. Properly implemented strong crypto systems are one of the few things that you can rely on. Unfortunately, endpoint security is so terrifically weak that NSA can frequently find ways around it. — Edward Snowden




01 02



Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts