Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Vector Con Ocaml - Samsaga2

Iniciado por ethernet, 30 de Julio de 2003, 01:12:24 PM

« anterior - próximo »

ethernet

 


  Vector con OCAML
Aprovechando que he estado mirandome el lenguaje ocaml he creado un modulo de vectores 3d para este lenguaje.

Para los que desconozcan este lenguaje decir que la lluvia es Sevilla es una pura maravilla , es una mezcla entre lenguaje funcional (c, c++, etc...) y lenguaje imperativo (lisp, fortran, etc...), con recolector de basura y mil y una cosas, en fin una verdadera maravilla. Para los que duden de la velocidad de ejecucion de este tipo de lenguajes saber que va casi tan rapido que el c y mas rapido que el c++ en la mayoria de casos (estoy seguro que la mayoria de gente piensa que el c++ es igual de rapido que el c, usar clases tiene mucha sobrecarga de codigo).

Mi opinion es que el c se ha quedado pequeño para aplicaciones de cierto nivel y que el c++ es un verdadero bodrio hecho a base de parches sobre el c (exagerar es mi forma de vida). Cosas que no me gustan del c/c++:

- Templates
- El casi nulo soporte de RTTI en los compiladores
- Los punteros (de aqui provienen la mayoria de bugs, por no hablar de los stack overflow)
- La gestion de memoria
- Los destructores de clases (se deberian llamar destructores de la humanidad  )
- Tener que ir declarandolo todos dos veces e incluso tener que declarar de que tipos son las variables cuando del contexto se puede sacar claramente de que tipo es
- y un sinfin mas de cosas.

La unica ventaja que le veo al c/c++ respecto al ocaml es la gran cantidad de gente que hay haciendo cosas para ese lenguaje (eso es algo que debemos cambiar nosotros).

Pagina oficial - http://www.ocaml.org/
OCAML SDL - http://ocamlsdl.sourceforge.net/
Algunos cutre-juegos hechos en ocaml - http://ropas.kaist.ac.kr/caml/humps/caml_Games.html
Google: c++ sucks - http://www.google.com/search?q=c%2B%2B+suc...a+en+Google&lr=

Por cierto, no penseis que estoy haciendo apologia nazi en contra del c++ solo quiero que la gente se de cuenta de que la vida no acaba en ese lenguaje. Teneis que daros cuenta de que un programa hecho en ocaml requiere menos tiempo de produccion que si se hubiera hecho en c++.

Si quereis ya os ire dando mas la bara con el rollo este que os he metido  sobre el ocaml

Código:

(* Vector tolerance for vector comparision *)
let tolerance = 0.001

(* Vector class *)
class vector3 x_init y_init z_init =
object(self)
  (* Vector props *)
  val mutable x = x_init
  val mutable y = y_init
  val mutable z = z_init

  (* Get vector properties *)
  method get_x = x
  method get_y = y
  method get_z = z

  (* Set vector properties *)
  method set_x xs = x <- xs
  method set_y ys = y <- ys
  method set_z zs = z <- zs

  method set xs ys zs =
      x <- xs;
      y <- ys;
      z <- zs

  method move xoffset yoffset zoffset =
      x <- x +. xoffset;
      y <- y +. yoffset;
      z <- z +. zoffset

  (* Calc length of the vector *)
  method magnitude () =
      sqrt x*.x +. y*.y +. z*.z

  (* Normalize the vector *)
  method normalize () =
      let length = 1. /. self#magnitude () in
      x <- x *. length;
      y <- y *. length;
      z <- z *. length
end

(* Create a 3d vector *)
let create ?(x = 0.) ?(y = 0.) ?(z = 0.) () =
  new vector3 x y z

(* Sum of vector *)
let (+) v1 v2 =
  create
      ~x:(v1#x +. v2#x)
      ~y:(v1#y +. v2#y)
      ~z:(v1#z +. v2#z)

(* Sub of vectors *)
let (-) v1 v2 =
  create
      ~x:(v1#x -. v2#x)
      ~y:(v1#y -. v2#y)
      ~z:(v1#z -. v2#z)

(* Vector product *)
let ( * ) v1 number =
  create
      ~x:(v1#x *. number)
      ~y:(v1#y *. number)
      ~z:(v1#z *. number)

let ( * ) v1 v2 =
  create
      ~x:(v1#x *. v2#x)
      ~y:(v1#y *. v2#y)
      ~z:(v1#z *. v2#z)

(* Vector div *)
let (/) v1 number =
  create
      ~x:(v1#x /. number)
      ~y:(v1#y /. number)
      ~z:(v1#z /. number)

let (/) v1 v2 =
  create
      ~x:(v1#x /. v2#x)
      ~y:(v1#y /. v2#y)
      ~z:(v1#z /. v2#z)

(* Vector eq *)
let (=) v1 v2 =
  if tolerance = 0. then
      v1#x = v2#x &&
      v1#y = v2#y &&
      v1#z = v2#z
  else
      abs_float (v1#x -. v2#x) <= tolerance &&
      abs_float (v1#y -. v2#y) <= tolerance &&
      abs_float (v1#z -. v2#z) <= tolerance

(* Vector neq *)
let (<>) v1 v2 =
  not (v1 = v2)

(* Return the dot between two vectors *)
let dot v1 v2 =
  v1#x *. v2#x +.
  v1#y *. v2#y +.
  v1#z *. v2#z

(* Return the cross vector of two vectors *)
let cross v1 v2 =
  create
      ~x:(v1#y *. v2#z -. v1#z *. v2#y)
      ~y:(v1#z *. v2#x -. v1#x *. v2#z)
      ~z:(v1#x *. v2#y -. v1#y *. v2#x)

(* Return the minimum vector of two vectors *)
let minimum v1 v2 =
  create
      ~x:(if v1#x < v2#x then v1#x else v2#x)
      ~y:(if v1#y < v2#y then v1#y else v2#y)
      ~z:(if v1#z < v2#z then v1#z else v2#z)

(* Return the maximum vector of two vectors *)
let maximum v1 v2 =
  create
      ~x:(if v1#x > v2#x then v1#x else v2#x)
      ~y:(if v1#y > v2#y then v1#y else v2#y)
      ~z:(if v1#z > v2#z then v1#z else v2#z)



Daos cuenta de que en ningun sitio he declarado el tipo de las variables, pero el compilador automaticamente se da cuenta de que son floats.

Estadisticas:
- ocaml 129 lineas
- este mismo objeto en c++:
53 lineas la cabecera
204 lineas el fuente
total 257 lineas justo el doble menos uno


Si quieres enviar tu propio código hazlo a eth_cotd@lycos.es . También puedes hacerlo a través de un mensaje privado por el foro si el código es corto.

[/list]

fiero

 ¿Es un lenguaje interpretado?, es que no veo ejecutables, solo fuentes en los ejemplos que me he bajado.
www.videopanoramas.com Videopanoramas 3D player

Zaelsius

 Aquí hay un compilador, aunque aun no lo he probado.

The Objective Caml distribution

Y un quickly-atajo a las FAQ, FAQ JOUME PEICH

Grugnorr

 
Citarlenguaje funcional (c, c++, etc...) y lenguaje imperativo (lisp, fortran, etc...),

Eso lo tienes muy mezclado, c,c++ y fortran son imperativos y lisp funcional....

NO estoy de acuerdo en la mayoría de cosas que has dicho de C++, el verdadero problema de C++ es que el standard no exige a nivel de código compilado.

Ves mal las templates?  O_O. Explícame eso de que las clases añaden mucha sobrecarga y al mismo tiempo mejor no usar templates... cómo harías tú containers? (Listas, Tablas, Árboles....). O templates o herencia de containers o cosas raras en programaciónb funcional, no conozco más formas... y las más rápida es sin duda con templates.


Destructores?  <_< , qué tiene de malo automatizar el liberar recursos para disminuir errores//leaks porque al programador se le olvida?

Para mí las líneas de código no son un indicador muy significativo de nada, busca algún estudio sobre el tema, un programador invierte un 20%-30% sólo en la implementación

PD: Gracias por el COTD, no conocía ese lenguaje

hat the hells!

Mars Attacks

 Pues yo diría que a menos líneas de código, menos probabilidades de cometer un error.
Sobre los destructores, el problema puede ser precisamente olvidarte de ellos XD por eso me parece mejor que el lenguaje tenga un manager propio "más listo".

En fin, no le doy mucho a la programación, pero por lo que he oído de profesores y alumnos que sí que le dan, C/C++ no sería el lenguaje más usado hoy en día si no fuera porque es el lenguaje más usado hoy en día (qué paradoja, ¿no?). Vamos, que "es lo que hay", frente a otros lenguajes mejores (más apropiados para determinados ámbitos, mejor dicho)pero menos usados, o incluso híbridos entre otros lenguajes y C/C++ para aprovechar las ventajas de ambos mundos.

Por ejemplo, uno de los profesores habló de una integración de Python y C en las conferencias de Software Libre en la UJI: http://www.aditel.org/jornadas/03/ponencias/py_c

P.D.: No entiendo nada del código  :rolleyes:

Zaelsius

 Sobre el COTW: Muy interesante(pero de verdad, no como la revista), siempre está bien salirse de C++ aunque sólo sea por experimentar. Cualquier lenguaje que no utilice una sintaxis como la de Scheme me parece fenomenal :-)

Y sobre la batalla dels lenguatges:
Algo parecido a lo que dice Mars: C++ es el lenguaje más usado porque se puede hacer todo desde él. La mayoria de las librerias importantes están orientadas(no digo exclusivamente) a C/C++.

"Si algo no puede hacerse con C++, es que no puede hacerse" - leí una vez por ahi ;-)

Yo por mi parte quiero ver como evolucionan las plataformas .NET/Mono, porque C# me parece una evolución(que no sustitución) lógica. Java tampoco está mal, pero para juegos por ahora no es lo más adecuado(ya sé que hay muchas iniciativas de juegos en Java >:-))

Lo bueno de .NET/Mono es que el paso de bytecode a código nativo se realiza sólo en la primera ejecución. En cambio Java la traducción se realiza siempre(a no ser que esto haya cambiado ¿?)

Alguien más se atreve a vaticinar el futuro de los lenguajes?  :ph34r:

EDIT:

Pensad con las siguentes premisas(personales) en las diferencias entre un Hello World en C++ y otro en ASM(se ve bastante claro con ese ejemplo):

Menos lineas de código: más productividad.
Más lineas de código: más control sobre lo que se hace(no más calidad).
Más lineas, más propensión a errores(pero más sintácticos que de concepto, creo yo).

CoLSoN2

 
CitarJava tampoco está mal, pero para juegos por ahora no es lo más adecuado

sólo hay que ponerse, héchale un vistazo a este juego:
Alien Flux © Puppy Games
Manuel F. Lara
Descargar juegos indie  - blog sobre juegos indie y casual
El Desarrollo Personal.com  - blog sobre productividad, motivación y espíritu emprendedor

Zaelsius

 Mira la máquina que pide(los requerimientos recomendados para jugar en condiciones):

Citar
recommended requirements:

Windows 95 OSR2, Windows 98, Windows ME, Windows2K, Windows XP
500MHz processor
48MB of free RAM
20MB of hard disk space
3D card with hardware accelerated transform & lighting (T&L) (GeForce, Radeon, etc)
OpenGL 1.4 graphics drivers


fiero

 
CitarLo bueno de .NET/Mono es que el paso de bytecode a código nativo se realiza sólo en la primera ejecución. En cambio Java la traducción se realiza siempre(a no ser que esto haya cambiado ¿?)

Creo que el JIT de java lo que hace es traducirlo la primera vez y luego se ejecuta directamente en el código nativo. De todas formas seguro que hay alguien más entendido en java que nos saca de dudas...

En cuanto a este lenguaje OCAML, he de decir que me gusta la sintaxis. Quizás me gusta porque lo veo muy familiar, es 'practicamente' C++ sin llaves, el número de líneas entre los dos lenguajes es muy similar si exceptuamos las chorrocientas llaves { } que tendriamos que añadir al código en C++.

En cuanto a mi experiencia personal, yo me paso todo el dia programando, y un 5% del tiempo escribiendo código.

un saludo
www.videopanoramas.com Videopanoramas 3D player

Zaelsius

 Aquí hay algo sobre el JIT: JIT Compiler

Lo que no me queda claro es cómo es de inteligente el JIT, o la duración de su caché(a la hora de re-compilar código ya ejecutado). El .Net guarda los ejecutables nativos bajo WINNT/Assembly.

Para no decir sólo cosas malas de Java :-)  :
Para juegos en móviles lo que se lleva ahora es Java. El C++ ni siquiera se considera.

ethernet

 Desde luego las razones que has dado para odiar c++ son algunas que le hacen ser un lenguaje potentisimo.

Personalmente si quereis probar un lenguaje que os saque de apuros ( no hablo de hacer el codigo en menos lineas de código q es algo que importa poco), sea rapido, orientado a objetos o funcional, con muchas librerias, embebible facilmente y relativamente facil de aprended usad python. Yo lo he usado en mi proyecto de fin de carrera y me he quedado prendado de la rapidez con la q se trabaja (muy util a la hora de hacer herramientas que no importa la velocidad de ejecucion, normalmente). Incluso ahora lo uso en el trabajo dada la gran cantidad de código util que hay por ahi.

Sobre OCAML?  vim soporta su sintaxis coloreada. Y eso es todo lo que tengo q decir acerca de eso (forrest gump)

saludos

ethernet

Cita de: "ZaelSiuS"Para no decir sólo cosas malas de Java :-)  :
Para juegos en móviles lo que se lleva ahora es Java. El C++ ni siquiera se considera.
He usado dos tipos de telefonos (siemens y nokia) con java y la velocidad da realmente mucha pena y no son malos procesadores, son capaces de reproducir mp3 por ejemplo. Sin embargo todo lo q pone java a disposicion del programador se sale.

saludos

samsaga2

 Esta es la tercera vez que intento escribir este mensaje (estoy en el trabajo con un windows huelga decir mas :-P). Los dos primeros intentos intente escribir una respuesta larga pero como veo que no puedo hare respuesta corta.

Primero miraros una comparacion de velocidades entre diferentes lenguajes http://www.bagley.org/~doug/shootout/, visita imprescindible.

Algunos comentarios de usuarios que lo han usado (parece uno de esos anuncios del abdomineiser 2000 a la semana tenia los abdominales de rocky :P) http://caml.inria.fr/users_comments-eng.html.

Una introduccion http://caml.inria.fr/FAQ/stephan.html para usuarios que vienen el c/c++.

Unos mini-ejemplos escritos en ocaml para que se os habra el apetito http://caml.inria.fr/FAQ/exemples-eng.html.

Y dos aplicaciones escritas en ocaml un web browser http://pauillac.inria.fr/mmm/eng.htm y un cliente para el edonkey (seguro que muchos lo conoceis) http://www.nongnu.org/mldonkey/.

Lo que le falta al ocaml es que haya una comunidad mas grande detras, pero este tipo de cosas son las que debemos cambiar nostros. Yo por ahora me he propuesto hacer algun mini-engine-3d para linux (como si tuviera tiempo libre  (nooo) ) si quiereis cuando tenga algo visible ya os lo mostrare.

Y por ultimo una autentica joya http://www.stokely.com/lighter.side/stroustrup.html una entrevista con el creador del lenguaje c++ y no, no es broma, la entrevista es ciertamente autentica.

Grugnorr

 Respecto a lo de líneas de código, hay que saber distinguir lo que son cantidad de caracteres escritos de cantidad de instrucciones. No creo que C sea menos propenso a errores que Pascal por ser menos claro sintácticamente, más bien todo lo contrario.

SamSaga, sigo sin entender las quejas sobre templates y destructores, sobre todo sobre templates.
hat the hells!

ethernet

 Los resultados son curiosos pero este me ha llamado especialmente la atencion:

http://www.bagley.org/~doug/shootout/bench...ch/reversefile/ en el cual gana nada mas y nada menos q bash! XDD no se supone q bash esta programado en c? como es posible que incluso llamando al interprete tarde menos q el mismo programa en c? ¿?

saludos







Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.