FORTRAN is actually case insensitive, so you can call it FoRtRaN if you so please. Its IO is one of the most horrific things I have ever undertaken. It is physically painful. If you call a file .f and not .f90 then every line must start with 6 spaces or the character 'c' indicating that it is a comment. The parser is retarded. To work out the dependencies of a file, the compiler must look at the .mod file associated with a module. The .mod file is not created until you compile. But what if you don't want to compile until you know the dependencies? Tough!
They have attempted to make it backwards compatible so there have been no far-ranging and indeed really necessary changes to the language. Really, they should make a Fortran where all previous nonsense is ignored, swept under the carpet, whatever.
Everything is passed by reference, but there are no proper pointers. There are both subroutines and functions. Functions can return values, subroutines cannot. Functions can be pure, meaning they have no side effects, but they don't have to be.
This is possibly the most retarded, pants-on-head, why did you not CHANGE THIS CHRIST ALMIGHTY feature: unless you have a line at the top of your source file saying "implicit none", Fortran will assume any identifier you have not declared is a valid variable. Yes. If it starts with [ijklmn] it's of type integer, otherwise real. The only way in modern Fortran to discern between float and double is to say real(kind(some_variable)).
The reason I'm doing Fortran right now is because I am doing a Masters in High Performance Computing. It's pretty cool, we're learning GPU programming at the moment in one of the lectures (the Portland Group actually make a Fortran-CUDA compiler). I spend my time writing shitty parallel code and running said code on the 32nd largest computer in the world :D
!> Module for loading files consisting of arrays of ints and floats
!! representing land type and population densities.
!> Integer parameter, ideally a unique file identifier.
integer, parameter :: fileid = 222
subroutine load_terrain(map_image, terrain)
integer, dimension(:,:), allocatable, intent(out) :: terrain
integer :: M, N
character(30) map_image, string_format
open(unit = fileid, file = map_image)
read(fileid, *) M, N
! Write map width into format string, so we know how many ints to read.
write(string_format, '(''('', i4, ''(i1,1x))'')') M
! Contains an implicit loop to read N lines from the file, but is nice
! and compact.
read(fileid, string_format) terrain
end subroutine load_terrain
end module load
After this project, never again. Unless I have to.