Sunday, March 22, 2009
The silliest comment I got was that "he is trying to learn Haskell by installing an IDE", while I did talk about both learning Haskell and installing the Leksah IDE I didn't give any hint to learning by installing an IDE. If you want to know how I've been learning then skip down to the next section.
The other posts were mostly about how either I had given up on scheme from lack of an IDE or saying I didn't need an IDE. I can agree I don't need an IDE however I like them and this being my hobby language (nothing in the foreseeable future will replace C at work) I would like to have one. The main reason I'm not looking to into scheme anymore isn't because of a lack of a good IDE anyways, it's the lack of community and not enough program structure (parenthesis get hard to read quite fast).
There were also a few posts about my emacs comment. Yeap I did make it a little flame prone but all I really said was that emacs isn't for me and I don't see how other can get along with such primitive tools. The command line is great for some things but as an editor/IDE it's not very well suited for the task.
I have been reading the "Real World Haskell" online book and am currently on chapter 4 (been taking it slow in my free time). So far I really like the book, most things are easy to understand and laid out well but for those that aren't the comments do help. I quite like the idea of a comment system for continuous improvement of the book, it gives the author feedback on things that they didn't think about and those who read the book a better understanding when they get lost. There are a few places in the book where I feel it jumps too much or the exercises are either using something that hasn't been covered (ex: importing modules took a bit) or have an abstract concept that most people don't deal with (ex: convex hulls). Overall I feel like I am learning a lot of fun new stuff and most of the content so far as been great.
On another note, I have decided what I will be making in the meantime as a learning/test program. A simple bug tracker application is what I plan on writing. The first iteration will just be design and a simple command-line utility for adding and querying bugs and then from there I could branch out to databases and/or a gui.
Tuesday, March 17, 2009
That being said there is nothing wrong with scheme however the community support is somewhat lacking. The irc channel (#scheme on freenode) while there are quite a bit of people there, many are away and no one really says much of anything (common in irc I guess). I did say a few things in the channel and the people are generally nice and helpful and pointed out quite a few resources for learning.
In Comes Haskell
The lack of a good ide and community support have lead me searching for something new again. Through out my looking for languages haskell has popped up quite a bit. I joined the haskell irc channel just to see what happens there and to my surprise it's quite busy most the time (busy enough that I don't want to read all the chatting that goes on). The next thing I looked at is an IDE, there are quite a few out there although most of them seem dead. The last thing that really won me over is the great amount of packages that are easy to install.
The IDE that looked the best to me was leksah. It is fairly new but looks to have a good feature list and is in active development. The installation was a bit of an issue on ubuntu 8.10 because they tend to use older packages. GHC, the main compiler for haskell, was only 6.8.x in ubuntu and the current is 6.10. Unfortunately ghc 6.10 requires a newer version of glib than ubuntu has as well and if you have ever tried to update glib on linux you know what a pain it can be. Anyways I decided to switch to OpenSuse 11.1, it's packages are more up to date than ubuntu's and is easy to install/maintain. Once up and running with opensuse I only ran into one issue with getting leksah running and it was my fault for not looking hard enough for a manual/install guide. For others who want to install leksah, here is a simple install guide (thanks to Jürgen for the help).
Open up the package manager and install the following packages:
tar -xvjpf cabal-install-0.6.2.tar.gz
Now you need to install gtkhs
tar -xvjpf gtk2hs-0.10.0.tar.gz
sudo make install
Make sure that gtksourceview2, glib and gtk all say "yes" after you do "./configure", otherwise you have missed installing one or more of the packages above.
The last thing you will want to do is add cabal to your path. My ~/.bash_profile looks like this:
If you change your path you will have to restart X to make it apply automatically or you can type
each time you open a new terminal until you get a chance to restart X.
Finally we are ready to install leksah.
Once you are done, just type "leksah" to run it.
cabal install leksah
I'm still playing with the IDE and it seems good so far but it looks like you have to make your own cabal package before you get started working on something and some of the dialogs seem a bit rough or I don't know what they are looking for exactly. I'm going to look over the manual and see how I like it.
To summarize a bit, I'm trying out new things again and Haskell seem to be the most mainstream functional language out there at the moment with quite a bit of support and community.
Saturday, March 14, 2009
So what am I doing at work? I can't give out specifics however I have developed two projects and updated a third (only been there three weeks). Recently however I've been moved off making games and focusing on making an engine since unity has quite a few issues (random hickups, large application sizes and overall buggy experiance). So far I've done some nifty things and learned quite a bit. The biggest hurdle right now is 3d, while I have dabbled in it quite a bit I usualy only use OpenGL for 2d. Luckly I know the math and general ideas, I am just lacking the experiance and some of the common "gotchas". So far I have a nice scene graph system going, 3d static models and 3d skeletal animations (I think thats quite good for a week of work).
My first approach to making the engine was in C++. I somewhat like C++ even tho it's not a very modern language. It allows me to access the machine directly for performance when needed, class/namespaces are decent for organization (although my thoughts on these change quite a bit), it has a good standard library and boost adds most everything else missing from the STL. For these reasons I wanted to go with C++ however, I ended up going with straight C.
Why straight C? C is more portable and it has been requested of me to make it portable in case we decided to branch out to other platforms. C doesn't suffer as much of a performance hit as C++, sure you can use C in C++ however it takes away from the point of C++ being a higher level language and you can't enforce people not to use virtual class, inheritance and other things that are slow and common in modern C++. Also like I've said C is more portable, gcc is good but it's not on all platforms. I've worked on other embedded devices which claim to have a C++ compiler but all they really add are classes and many things are either different or broken between compilers. The last reason I have for using C is the ability to use another language for the main game code and C for the base engine (yes scheme is on my mind), it seems there are quite a few languages that can compile to C, use C libs and many scripting languages work better/more supported with C.
Anyways enough of the flamewar, hopefully this should be enough to hold people over until I get more time to play with scheme.
Wednesday, March 11, 2009
I can't say that writing this code in scheme is any easier than writing it in C, however I also haven't gotten to anything complex yet. Anyways here is the code I wrote.
;; makes the screen to draw on
(define (make-screen width height)
;; makes a rectangle that is the size of the surface
(define (rect-from-surface surface)
;; draws a surface onto another surface given an x and y
(define (draw-surface src dst x y)
(make-sdl-rect x y 0 0)))
;; handles a game event, returns false if the user wants to quit
(define (handle-event event)
(define event-type (sdl-event-type event))
((= event-type SDL_QUIT) #f)
((= event-type SDL_KEYDOWN) #f)
;; starts up the demo and doesn't quit until a key is pressed or the window is closed
(define ryu (img-load "ryu.png"))
(define event (make-sdl-event))
(define screen (make-screen 1024 768))
;; draws the ryu sprite and then flips it to the main screen
(define (draw screen)
(draw-surface ryu screen 200 100)
;; polls all events
(if (sdl-poll-event! event)
(if (handle-event event)
;; start the main loop and clean up afterwards
I tried to make it a bit more functional than just throwing everything in a big (begin ) statement but since drawing graphics requires side effects its not an easy thing to do. If you can't follow the code, all it is doing is loading up a picture of Ryu (guy from street fighter) and drawing it to the screen, upon pressing a keyboard key or the window close button the program exits.
When making this application I did most of the things I wanted from "csi" then pasted them into scite for the things that worked. This interactive level of development was nice however it is probably not possible anymore the way I am doing things. Since the update loop is being called infinitively many times until the program is quiting it won't reach the top level for more input. I have a few ideas of getting around this but none of them are really ideal, the best one being an in-game console that would act like csi. Another more complicated idea is to have a client/server architecture and the game would evaluate the code sent to it in a que like fashion.
The last thing I tried was to compile the code. The chicken scheme compiler is "csc" and it works much in the same way as gcc does. To compile the code all I has to do was "csc sdlDemo.scm" and it spit out "sdlDemo" which is a binary executable with no dependency on chicken. I do love the compiler, most notably it knows what libraries you have used so you don't have to tell it what to link to. The program runs just fine and the executable is only 25k (a lot less than I expected). I haven't tried doing any performance tests on the program but from looking at it in "top" (tells cpu and memory usage of all running programs) it looks to be about what I expected.
So far, so good. Nothing really new came from scheme but I didn't have to do as much memory management as a C version, I didn't have to deal with pointers and I feel the code is more concise and easier to follow. So now my goals are to start some work with OpenGL, look into what OOP means in scheme and see how multiple source files work together.
Tuesday, March 10, 2009
Now, while I have used scheme before, mostly while I was at the university (PLT/ Dr Scheme), I always thought of it as a learning language and nobody used it or could use it for real world coding. The more I dug into finding a new language, scheme kept popping up every now and then so I decided to take a closer look. To my surprise there were quite a few other implementations I didn't know about, of those were Gambit-C and Chicken Scheme that stood out to me. The main drawing factor was that they both compiled to C, could call native C easily and could be called from C.
I first started with Gambit-C as I found benchmarks that said it was the fastest one of the two, I don't know if those benchmarks were biased or still held true for the current releases but I figured it was worth a shot. I started messing around with Gambit-C and it was quite fun but when I decided that I wanted to give some game programming a shot I noticed that there were very few libraries and support in general. I decided to investigate Chicken Scheme to see if it was any better, I found out it has its own package manager with tons of "eggs" (what they call a package). Of those packages people had already created interfaces for SDL, OpenGL, OpenAL and a ton more of things I found useful. Needless to say I switched over to Chicken Scheme, it seemed to have more support and at the very least I could use all the existing packages.
The one thing about scheme that somewhat bothers me right now is the syntax. There are tons of parenthesis but I understand why because of S-expressions and I think I will learn to tolerate it (after all I did get use to OCaml). I'm tired of language hopping for now so I decided that I will at the very least write a game or two in it and see where it takes me. I've also decided that I want to semi-document things. I haven't decided what exactly that means but at the very least I plan on throwing together some tutorial-esque posts with some source code to go along with it. I'll say this right now however, I know I'm not a good scheme/functional programmer (yet) so if you see something weird or I'm over complicating things, I probably am (feel free to point it out to me).
Setting up your Environment
I've decided to use Ubuntu Linux for development. My main reason are:
- Package management is easier than windows for development.
- The windows command line sucks and many scheme implementations use the command line for normal tasks.
- My vista installation doesn't like OpenGL (yes I have the latest amd/ati drivers)
- I miss alt-f2 to run a program by name
In other words, personal preference :). If your following along on windows I highly suggest you either get cygwin or msys and friends up and running on your system, it will make things a lot easier.
Installing Chicken Scheme
The latest version in 8.10 is 2.5-1 which is extremely old, the current stable release as of right now is 3.4 . The semi-good news is the next version of Ubuntu will have a more updated version 3.2.7-2 which is more acceptable but not ideal. I installed these packages on 8.10 without any issues. You can grab all the files needed through launchpad (just get the .deb files on these pages:
(for amd64 processors x86-64)
amd64 - libchicken3/3.2.7-2
amd64 - libchicken-dev/3.2.7-2
amd64 - chicken-bin/3.2.7-2
(for i386 processors x86)
i386 - libchicken3/3.2.7-2
i386 - libchicken-dev/3.2.7-2
i386 - chicken-bin/3.2.7-2
Make sure to install them in the order listed, if you don't then it will complain about a missing dependency.
Next feel free to try out chicken scheme, I made a simple little fib program (seems to be the "standard" example for lisps).
(define (fib x)
(define (fib-helper x y)
(if (= x 0)
(fib-helper (- x 1) (* x y))))
(fib-helper x 1))
(print (fib 5))
Save off to a file named something like "schemeTest.scm". Now open up the command line and navigate to where you saved the file and type "csi schemeTest.scm" or whatever you named the file. You should see it print out something like this:
sean@sean-linux:~/programming$ csi schemeTest.scm
(c)2008 The Chicken Team
(c)2000-2007 Felix L. Winkelmann
Version 3.2.7 - linux-unix-gnu-x86-64 [ 64bit manyargs dload ptables applyhook hostpcre ]
compiled 2008-11-05 on debian (Linux)
; loading schemeTest.scm ...
Pressing ctrl-d will exit out of the interactive console.
Hopefully everything will be working now. Next I want to install SDL and OpenGL for game development. Through synaptic/the package manager install libSDL-dev libSDL_image-dev libSDL_net-dev libSDL_gfx-dev libSDL_mixer-dev . Once those are done installing open up a command line and login as root ("sudo su"). type "chicken-setup sdl" then "chicken-setup opengl". If you get errors then usually it will say something to the effect of "couldn't find header file 'sdl.h' ", that means you should search in synaptic and install the -dev version of the file needed (however you shouldn't run into any errors).
The last thing that I recommend is a decent editor for your source code. There are a few choices out there, emacs seems to be the preferred environment however I don't feel like learning all the commands of emacs and I want more of UI based editor. I decided to go with scite, it's quite simple but it has all I need, syntax highlighting, code folding, parenthesis highlighter and auto indentation. Once you have everything setup you should be good to go for development.
While I don't plan to teach scheme, I do think it's a good idea to show some example code and hopefully people can follow along. If you don't know scheme at all I recommend visiting here and get a brief overview. Another good resource is http://mitpress.mit.edu/sicp/ , it is an online book with exercises to test your knowledge.
On a closing note, I doubt that I will be posting back to back like this again. The main reason for the fast post is because I had this post in mind when starting my blog. The last post was mainly just an introduction and a repost of something I had written previously that related to this post. I hope to keep this updated somewhat regularly but I'm making no promises.
Since this is my first post and I assume no one knows who I am, so a little introduction seems necessary. I am Sean Chapel a professional game programmer. I've been a programmer for about a decade now and have been creating games for about 3-4 year with the last two years being a professional. I've programmed for Windows, Mac, Linux, Nintendo DS and the iPhone. That should be enough of an introduction to know where I am coming from. For my first post I figured I would take something older from my site that will lead me into my new series of posts.
The Search for Something New
Originally posted on December 14, 2008.
Ever since I became familiar with programming in C/C++ I've been searching for a new language and unfortunately nothing has stood out as a "replacement". Among the languages I've learned or looked at are Ruby, C#, Obj-C, Java, OCaml, F# and Scheme/Lisp. I really like the idea of functional languages, they offer a lot of power and are aimed more at how to do things rather than dealing with syntax or language features. Of the language I've messed with Ruby, OCaml, Obj-C and C# stood out for various reasons.
Before I go into deal about the languages perhaps I should tell what I want to do with programming. Being a professional/(and hobbist) game developer (recently released "My Japanese Coach" and "My Chinese Coach" for the DS) I am looking for something for game development. Requirements are that it allows some sort of 3d API(OpenGL?), 3d Sound API (OpenAL?), Windowing, input and be fast enough for decent game without too much hacking. The most important thing I value is that the language is cross-platform (Win/Lin/Mac), the reason being is that I use all three and it increases my target audience.
Ruby I knew was going to be slow from reading about it and I was right but it's a good little language. I ended up using gosu which was nice but awkward at times. I liked Ruby quite a bit besides it's sometime odd syntax and even ended up making a meteors clone in it (only took 2 hours :) ). The short development time was mostly due to Ruby having a lot of functionality in little code, the big core library was nice as well. Ruby was also easy to follow and learn. I will consider Ruby in the future for scripting but as far as games goes it was just too slow unless I was to use the foreign function interface with C libs for most of the code which defeats the purpose.
OCaml I had heard quite a bit about and that it had roughly the speed of C/C++. OCaml defiantly has some odd syntax and it does turn me off but it was easy to learn and follow. For OCaml I used ocamlgl and ocamlsdl, they worked well on windows and Linux but getting ocamlsdl to play nicely with OS X was a pain because of the way SDL works (read more in my OCaml articles). The biggest thing about OCaml for me was that it was my first real functional language but also allowed imperative style. I caught on to functional programming quite quick and really liked it but I ended up using imperative programming more as game programming requires a lot of state and data manipulation. One of the things that I liked and later came to dislike is that you didn't have to give types to things because they were statically typed by inference. The problem that OCaml has is that it differentiates number types int/float/etc , so if you were going to add an int to a float you would have to cast the int to a float then use the special float addition operator "+." . In the end I still sort of like OCaml despite it's short comings but I didn't really see anything special about it and the lack of true threads makes it not very future proof.
Everyone has heard of C# and I've used it for a lot of things myself before considering it as a game programming language. The syntax is nice although can be quite wordy at times. I tried using the TAO libraries and also XNA. TAO was nice but hard to setup on the mac (I'm seeing a trend here :) ), it was also just a straight port to C# with little to no syntactical sugar. Nothing really special with TAO but then again it's just a wrapper for some C libs. XNA was a new world for me as I haven't done any directx programming before. Just looking at C++ games in DirectX is enough to make any programmer barf. I'm not saying DirectX isn't powerful but all that com cruft is quite off putting. More on topic, XNA was easy to use and get things going and the content pipeline was quite nice. The biggest thing about XNA that put me off is the lack of control. In XNA you inherit from a GameApplication class which is monolithic and you ended up passing graphic device reference to everything, not my idea of well planned out or nice to use. In the end I still like C# but it's lack of decent cross-platform ability is what keeps me from using it. I know some will say that there is mono but mono is slower and it's not easy to distribute on the mac nor easy to setup all the libs on any platform.
Currently I am using Obj-C at work on iPhone games. Obj-C is my opinion is the C++ of mac development, everyone uses it and is though of as the standard. Obj-C isn't bad, it reminded me a lot of C++ and it's libraries are quite extensive. It has some odd syntax and it took me awhile to overcome that but it's not bad to me anymore. One of the things that bothers me is that the libraries while there is a lot of them they aren't easy to remember. I'm constantly looking up NSString and NSDictionary to remember what the name of a function is exactly and I've been working with Obj-C exclusively for about fours months at work. Luckily XCode's built in documentation view is quite nice, if it wasn't for that then I would be very frustated with Obj-C. Obj-C fails in the way that it is not cross-platform. Obj-C will compile with gcc on windows and Linux however all the libraries even including the string class are OS X only. There is an alternative called GNUStep but it's not quite the same and is lacking a lot of functionality that is on the OS X platform. Obj-C seem to me like a alternative version of C++ with some nice things added and others taken away.
So.. Nothing has Changed
I realize that this posting might make some people want to point out that I didn't try XXX or I'm giving something an unfair rap. This is probably true and feel free to point it out but I don't think you will change my opinions too much.