🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: es.comp.lenguajes
Article #161

Re: Programacion con GOTO

#161
From: Pedro Maicas
Date: Sun, 19 Nov 2000 00:00
159 lines
6962 bytes
On Sat, 18 Nov 2000 12:47:19 +0100, "David" <davidrodrNOS@PAMexcite.es> wrote:

>> Es imposible programar en ensamblador sin usar saltos incondicionales
>(jmp)
>
>En absoluto.
>...........

   Cuando traduces un while o un for a asm, supongamos que
la comparacion va al principo del bucle, entonces al acabar
las instrucciones del bucle tienes que poner forzosamente un
jmp para volver al principio.

  while(condicion){
    instrucciones;
  }  <----- Aqu� va un jmp en asm

   Cuando traduces un  if ... else, si hay instrucciones
que se han de ejecutar en el if y otras en el else, es inevitable
poner jmp

  if (condicion){
    instrucciones
  }
  else{     <----- Aqu� va un jmp en asm
    instrucciones
  }

>programador en ensamblador que he conocido, Ciriaco Garc�a de Celis, Ciri
>para los amigos), en el que s�lo te encontrar�s con 2 jmps en la parte en

  Estoy segur�simo de que Ciriaco no dir�a que hay que programar sin 
usar jmp, y tampoco dir�a que los saltos condicionales no son el
equivalente a un goto.

  Si lo dijese Ciriaco, que no lo dice, tampoco ser�a cierto.


>> Adem�s un salto condicional es 'tan goto' como como uno incondicional.
>
>�Einnn? �Norrrrrl!. Nabsoluto. �Tas de co�a? Con eso me est�s diciendo que
>un for, un do-while o un while (incluso un if) no son m�s que gotos
>maquillados. Si no �c�mo se traducen a ensamblador estas estructuras de
>control?

  Seg�n t�, en el antiguo basic:   IF condicion THEN  numerolinea
� eso no es un goto ?  �solo porque es condicional ?  � amosy� !

  Las instrucciones de la programacion estructurada se traducen al
asembler convirtiendo el programa en no estructurado, obviamente.

  Un while, por muy estructurado que sea, cuando se traduce a asm
queda como el ejemplo de lo que nunca se debe hacer (de lo que
nunca se debe hacer en C, pero que en asm es inevitable).

Esto es estructurado:

  while(condicion){
    instrucciones;
  }

Y esto no:

ini_bucle:
  if(!condicion) goto fin_bucle;
  instrucciones; 
  goto ini_bucle;
fin_bucle:

  Estas dos porciones de c�digo se traducen a asm exactamente igual,
el resultado en asm se parece m�s a lo segundo, claro. Y es que
en asm no se puede programar sin saltos, porque no hay otra cosa que
saltos. El asm no es un lenguaje estructurado, y que compiles
un lenguaje estructurado no va a conseguir que el asm "se estructure".

  Yo creo que los que son tan 'integristas' en esto de goto han
olvidado el fondo del asunto y se han quedado en la forma. Por
ejemplo, todo el mundo echa pestes porque en visual basic
existe la instruccion 'or error goto xxxx', solo porque ven
ah� la palabra goto, cuando esa instruccion tiene poco
que ver con un goto, es un tratamiento de excepciones,
seguro que si se escribiera  catch error xxxx  nadie se quejar�a.

  Incluso en los gotos de verdad, muchas veces es m�s facil
seguir la l�gica del programa usando un goto en una funcion,
tambien es m�s facil de mantener para una persona distinta a la
que escribi� el programa. Un goto bien usado, siempre que se vea
claro a donde va, puede simplificar mucho el aspecto del programa 
(que al fin es lo que cuenta cuando te pones a tocar c�digo de otro).

  Por ejemplo:

funcion()
{
    obtiene recursos;
    ........
    if(loquesea) goto salida;
    ........
    if(loquesea) goto salida;
    ........
    if(loquesea) goto salida;
    ........
    if(loquesea) goto salida;

salida:    
    libera recursos;
}

   Cuando ah� metes muchas instrucciones y la funcion es grande, est�
mucho m�s claro con el goto que la version estructurada (un monton 
de ifs anidados dentro de otros ifs), sobre todo porque hay un 
�nico destino de todos los gotos y porque el nombre de la etiqueta
es lo suficientemente descriptivo. En este caso el nombre elegido
para la etiqueta es m�s importante que ninguna otra cosa, porque
simplifica enormemente seguir el flujo del programa.

   Lo mismo se aplica a la salida de una serie de bucles anidados,
claro que se puede hacer sin goto, pero eso �simplifica el programa
o lo complica ?   si lo complica que cada uno saque sus conclusiones.

   Adem�s no comprendo a los que dicen que un profesor le
dijo que un goto no se usa nunca (y encima ponen el nunca en
mayusculas). Seguramente el profesor no confiaba mucho en el
sentido comun de los alumnos y se cur� en salud, a lo mejor 
ten�a raz�n el profe porque yo tampoco me fiar�a del que no
encuentra argumento mejor que el argumento de autoridad. A
mi me lo puede decir san pedro, si veo que el programa queda
m�s claro con un goto no lo dudo ni un momento.

   Luego tampoco tiene mucho sentido que un integrista del
goto, que se supone debe ser un maestro en hacer c�digo
entendible, le ponga de nombre a una funcion 'funcion',
o te cree una funcion de trescientas lineas y diez niveles 
de anidamiento que no hay quien la entienda. O bien que
no te pongan un comentario, y los pocos que ponen son
de esta guisa:

funcion()
{
  int i;
  i = 0;  //inicializo i a cero

  Aaaaa, ya, vale, pero sobre todo no uses un goto NUNCA.

  Por cierto, esto es un crossposting bestial, aunque supongo que est� 
dentro del tema de todos los grupos. Ya puestos a hacer algo m�s que preguntar
y responder (yo tambien opino que esto es m�s util y m�s entretenido) creo
que podr�amos abrir otro crossposting sobre c�mo hacer el c�digo m�s
facilmente entendible/mantenible.



Saludos :-)           -Pedro-

  Maicrosoft LVP

  http://www.maicas.net/ 

  e-mail en www.maicas.net
Technical Details
Message-ID: <4omd1toikcik7gsm6d0c6jfu9jnken815u@4ax.com>
Path: arc1-ca.pugleaf.net!unknown!not-for-mail
References: <zXhQ5.698$cQ5.16259@m2newsread.uni2.es> <8uto1a$t5g$1@titan.bt.es> <vpoa1tc0cg7go25021sfiajav8p4qa5e1v@4ax.com> <8v5q8s$jb2$1@titan.bt.es>

Show Full Headers
Complete Article Headers
X-Google-Language: SPANISH,ASCII
X-Google-Thread: 1135b7,9ebb41239b0c5eaa
X-Google-Attributes: gid1135b7,public
X-Google-Thread: 105378,9ebb41239b0c5eaa
X-Google-Attributes: gid105378,public
X-Google-Thread: 1116f3,9ebb41239b0c5eaa
X-Google-Attributes: gid1116f3,public
X-Google-Thread: f59de,9ebb41239b0c5eaa
X-Google-Attributes: gidf59de,public
X-Google-Thread: f78ff,9ebb41239b0c5eaa
X-Google-Attributes: gidf78ff,public
X-Google-Thread: 10d088,9ebb41239b0c5eaa
X-Google-Attributes: gid10d088,public
X-Google-Thread: f86c8,9ebb41239b0c5eaa
X-Google-Attributes: gidf86c8,public
From: Pedro Maicas <www@direccion.es>
Subject: Re: Programacion con GOTO
Date: 2000/11/19
Message-ID: <4omd1toikcik7gsm6d0c6jfu9jnken815u@4ax.com>
X-Deja-AN: 695485569
Content-Transfer-Encoding: 8bit
References: <zXhQ5.698$cQ5.16259@m2newsread.uni2.es> <8uto1a$t5g$1@titan.bt.es> <vpoa1tc0cg7go25021sfiajav8p4qa5e1v@4ax.com> <8v5q8s$jb2$1@titan.bt.es>
Organization: PROEL PSIC
Content-Type: text/plain; charset=ISO-8859-1
Mime-Version: 1.0
Newsgroups: es.comp.lenguajes,es.comp.lenguajes.java,es.comp.lenguajes.misc,es.comp.os.linux.programacion,es.comp.os.ms-windows.programacion,es.foro.lenguajes,esp.comp.so.linux.programacion