elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Recuerda que debes registrarte en el foro para poder participar (preguntar y responder)


  Mostrar Mensajes
Páginas: 1 2 3 4 5 6 7 8 9 10 11 [12] 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 ... 279
111  Programación / Programación General / ¿Y si creamos un lenguaje de programación? [ACTUALIZADO] en: 4 Julio 2012, 10:34 am
Hola a todos, en estas vacaciones me he dedicado a escribir un intérprete para un lenguaje de programación, el cuál llamé "Yare".

Está escrito en C, con ayuda de lex y yacc.

El lenguaje que estoy haciendo aún es muy limitado, pero ya tiene algunas cosas algo "rescatables", como por ejemplo:

- Ciclos: for, while, do-while, unless.
- Condicional if y algunas expresiones se pueden procesar así:

Código
  1. expresion == expression && sentencia;

Un ejemplo:
Código
  1. 1 == 1 && "Ok\n";
-Sentencia tipo "read(var)"
-Inicialización con valor aleatorio, ejemplo:
Código
  1. x = ?;

- Lo he hecho bastante "rico" en comentarios, es decir, se admiten comentarios de la forma
Código
  1. /* hjkhjkasd
  2. asdasd
  3. */
Código
  1. rem Comentario de una sóla línea
Código
  1. # Comentario de una sóla línea
Código
  1. -- Comentario de una sóla línea
Código
  1. // Comentario de una sóla línea
Código
  1. :: Comentario de una sóla línea

- Caracteres especiales en la sentencia "puts(string)", los mismos que en C:
\n, \t, \s(este es de Perl), \b, \r, \f.
Añadí uno propio así:
\q el cuál inserta una doble comilla '"'.

- Además añadí unos caracteres de escape de nueva línea numéricos, es decir.

Código
  1. puts("Hola\1mundo") <- Haría que se insertara un \n
  2. puts("Hola\2mundo") <- Haría que se insertara dos \n
  3. puts("Hola\3mundo") <- Haría que se insertara tres \n
  4.  
y así hasta el 9.

No hay tipos de datos por ahora, el tipo de dato que manejo es "double".

Hay 26 variables por default, las variables son de la "a" a la "z" y no es sensible a mayúsculas y minúsculas. Estas variables siempre están ahí disponibles.

-Se pueden definir variables propias de este modo:
Código
  1. :suma: = 2^3;
ó así:
Código
  1. declare(:suma:, 2^3);
Código
  1. declare(:suma:);

Los identificadores pueden ser bastante flexibles, ejemplo:
Código
  1. : _Hola mundo # 123342432 : = 123;
  2. printn(: _Hola mundo # 123342432 :);

Se pueden definir bloques de código:
Código
  1. {
  2.   sentencias...
  3. }

-Constantes numéricas:
número pi, número e, logaritmo en base 2 de el número e, y varias más, se pueden utilizar así:
Código
  1. printn(cos(const.pi^2));

-Operadores:
+, -, *, /, ^, %, <<, >>, |, &, &&, ||, ! y ~ para negación, XOR.

-Funciones matemáticas:
Código
  1. factorial(expr), abs(expr), ln(expr), cos(expr), sin(expr), tan(expr), atan(expr), asin(expr), acos(expr), floor(expr), sinh(expr), sumatoria(expr, expr), etc.

-Operadores de posdecremento y posincremento, de esta manera:
Código
  1. a = 1;
  2. a+@;
  3. a-@;
  4.  
  5. ó incr(variable), decr(variable)

-Operador variable, lo que llamé operador variable no es más que un operador global que puede ser modificado, algo así:
Código
  1. _@_= *;
  2. _@_ = /;
  3. _@_ = -;
  4. etc...

Y que luego pueda ser usado de esta manera:

Código
  1. _@_ = *;
  2. printn(1 + 2 _@_ 3);
  3.  
¿Para qué podría servir esto? no lo sé :)

-Inicialización por medio de smileys....  ;D, algo así:
Código
  1. x = :);   # Lo inicializa a 1
  2. x = :|;  # Lo inicializa a 0
  3. x = :(;  # Lo inicializa a -1.

-Sentencia break para los ciclos, aún no hallo como implementar la sentencia continue.

-Ciclo foreach de esta manera:
Código
  1. foreach(1 ... factorial(5), k) {
  2. printn(k);
  3. }

-Sentencia system(CADENA).

-Asignaciones flexibles:
Código
  1. let x to 1+2;
  2. set x to 1+2;
  3. move 1+2 to x;
  4. x = 1+2;
  5. mov x, 1+2;
  6. x <- 1+2;
  7. let x = 1+2;
  8. set x = 1+2;
  9. x := 1+2;
  10.  
Todas ellas son equivalentes.

-Sentencias tipo assembly:
Código
  1. mov x, factorial(6);
  2. sub x, -123;
  3. add x, 1+2;

-Sentencia "swap" para intercambiar valores:

Código
  1. x = 1;
  2. y = 2;
  3. x <-> y;
  4.  

-Sentencia exit:
Código
  1. exit(-1);

-Sentencia read(variable) para leer desde el teclado, ejemplo:
Código
  1. read(x);
  2. for i = 0, i < x, +1 {
  3. printn(i);
  4. }

-Asignaciones abreviadas:
Código
  1. x += 1;
  2. x -= 1;
  3. x *= 1;
  4. x ^= 3;
  5. x /= 2;
  6. x <<= 1;
  7. x >>= 1;
  8. x |= 1;
  9. x &= 1;
  10. x %= 2;
  11.  

-Función par(expr) para saber si el número resultado de la expresión es par.

-Definición de procedimientos por el usuario, en la forma:
Código
  1. proc $suma$ {
  2. a += b;
  3. # Demás sentencias ...
  4. }
  5.  
  6. a = 1;
  7. b = 2;
  8.  
  9. # Imprime 3
  10. # El valor retornado por el procedimiento o función es
  11. # el resultado de la última sentencia o expresión.
  12. printn(call $suma$);
  13.  

-Soporta recursión, obviamente no tan flexible, un ejemplo de cálculo del factorial con algoritmo recursivo:
Código
  1. # Intento de recursion
  2. proc $factorial$ {
  3. if(a != 1) {
  4. r *= a;
  5. a-@;
  6. call $factorial$;
  7. }
  8. }
  9.  
  10. # Calculando el factorial de 5:
  11. a = 5;
  12. r = 1;
  13.  
  14. call $factorial$;
  15. printn(r);
  16.  
  17. .
  18.  

Da por resultado 120.

La ejecución de algunos programas no es tan lenta, por ejemplo, calculemos el número pi en perl y luego calculemoslo en Yare.
Código
  1. #!/usr/bin/env perl
  2. my $suma = 0.0;
  3. my $i = 0.0;
  4. for($i = 1; $i <= 1000000; $i++) {
  5. $suma += (-1)**($i + 1)/(2 * $i - 1);
  6. }
  7. $suma *= 4.0;
  8. print($suma . "\n");
  9.  
Código:
3.14159165358978

real 0m0.646s
user 0m0.572s
sys 0m0.004s

Ahora en Yare:
Código
  1. :suma: = 0;
  2. for i = 1, i <= 1000000, +1 {
  3. :suma: += (-1)^(i + 1)/(2 * i - 1);
  4. }
  5. :suma: *= 4.0;
  6. puts("pi = ");
  7. printn(:suma:);
  8. .
  9.  
Código:
pi = 3.141592

real 0m0.641s
user 0m0.564s
sys 0m0.000s

Los tiempos de ejecución son muy similares. Obviamente no pretendo decir que la calidad de mi código es superior o si quiera igual que el de Perl, sería una estupidez, pero bueno... .
Estas son algunas cosas que he implementado en Yare, es muy muy limitado, pero bueno, quizás alguien quiera hacerlo crecer junto conmigo.

Lo primero en qué hay que pensar cuando se quiere hacer un lenguaje es "¿para qué va a servir?", "¿qué objetivo tiene?", yo no tengo objetivo, sólo aprender, ver cómo funcionan las cosas, y he aprendido muchisimo, no todo ha sido "miel sobre ojuelas", he batallado mucho con esto, han sido horas y horas de programar y a veces de dedicarle un día entero a algo y ver al final que las cosas no funcionan, y ni modo, a seguir adelante con otra cosa.

Por ahora estoy añadiendo soporte para arrays, pero les soy sincero, ya me aburrí de esto, porque son muchas horas dedicadas a esto y tengo otras cosas que hacer :).


Entonces ahí está la petición, si alguien quiere unirse a desarrollar esto, yo encantado.

Saludos.
112  Informática / Hardware / Re: Pila de alta duración.... en: 2 Julio 2012, 20:53 pm
Pues la pila es totalmente nueva ..., esperemos y dure bastante.

Muchas gracias, entonces procederé a cargarla. Saludos :)
113  Informática / Hardware / Pila de alta duración.... en: 2 Julio 2012, 20:23 pm
Hola a todos.

Recién compré una pila o bateria para mi laptop, según lo que me dijeron, duraba hasta 6 horas la pila, ayer que la usé por primera vez después del primer ciclo de carga (14 horas) me duró casi 4 horas. El manual dice para alcanzar su máximo rendimiento se deben realizar de 3 a 4 ciclos de carga/descarga siendo el de carga de 14 horas..... pero les soy honesto, me da miedo, jaja.

Qué piensan?, que por ser la primera carga/descarga sólo me duró 4 horas o que con más ciclos durará más según el manual? ....


PD: La probé sobre linux, no he visto el rendimiento sobre Windows.
114  Programación / Scripting / Re: [Reto Batch] It's a dir? en: 1 Julio 2012, 08:46 am
Sí, al uso de && y || en batch y en algunos lenguajes script se le llama ejecución condicional, podrías buscar un post que escribí sobre ello.

Código
  1. cd dir 2> nul && (
  2.    echo Es dir.
  3. ) || (
  4.    echo No es dir.
  5. )

Otra sería usar el comando pushd y popd para regresarse luego que ingreses al directorio.

A ver si funciona esto...

Código
  1. pushd dir 2> nul && (
  2.    echo Es dir
  3.    popd
  4. ) || (
  5.   echo No es dir.
  6. )
115  Programación / Programación C/C++ / Re: Ayuda - Funcion factorial de un numero en: 30 Junio 2012, 20:09 pm
Lo mejor sería que usaras la librería gmp para esto, pero si es para un factorial, podrías checar el siguiente enlace:

http://mailman.linuxchix.org/pipermail/courses/2002-November/001043.html
116  Programación / Scripting / Re: [Reto Batch] It's a dir? en: 30 Junio 2012, 19:58 pm
No estoy en Windows, pero algo así debería funcionar, bueno, quizás :p

Código
  1. cd dir && (
  2.    echo Es dir
  3. ) || (
  4.    echo No es un dir...
  5. )

Saludos.
117  Programación / Scripting / Re: Qué lenguaje me sería conveniente aprender? en: 17 Junio 2012, 01:50 am
Perl.
118  Programación / Scripting / Re: Problema con variables en BASH en: 17 Junio 2012, 01:49 am
Solo hay que definir las variables antes de definir la función:

Código
  1. #!/usr/bin/env bash
  2. edad=21
  3.  
  4. function algo() {
  5. read -p "Edad: " edad
  6. }
  7.  
  8. echo -e "Antes de llamar a función: ${edad}";
  9. algo;
  10. echo -e "Después de llamar a función: ${edad}";
  11.  
119  Programación / Scripting / Re: [Reto Bash] It's a dir? en: 18 Mayo 2012, 15:53 pm
[ -f "$in" ] && echo -e "Es un archivo regular."
[ -d "$in" ] && echo -e "Es un directorio."

Creo que con eso basta.
120  Programación / Programación C/C++ / Re: como hacer una estructura de datos nueva????? en: 11 Mayo 2012, 06:44 am
Tienes que pensar en "algo" en donde guardar otro "algo" y en cómo se va a "ordenar" o "estructurar", por ejemplo, una TAD llamada "bolsa" que contenga elementos de cualquier tipo, por ejemplo.

Solo debes imaginartelo.

Ahora, la tienes más fácil por que es en C++ y tienes sobrecarga de operadores que te permitirá definir de una manera característica las operaciones que se realizarán con esa nueva TAD.

Saludos.
Páginas: 1 2 3 4 5 6 7 8 9 10 11 [12] 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 ... 279
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines