Article View: es.comp.lenguajes
Article #161Re: Programacion con GOTO
From: Pedro Maicas
Date: Sun, 19 Nov 2000 00:00
Date: Sun, 19 Nov 2000 00:00
159 lines
6962 bytes
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-mailReferences:
<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