@logankilpatrick, welcome to this forum and thanks for your comments.
A different approach to comparing programming languages is sometimes more appropriate than selecting just one attribute from, say, speed of execution, the quality of the tools available, the pleasure of using an IDE, the ease of debugging, what language the other members of one’s team wish to use, etc. We could ask, for example, “Here is a programming task that I have to execute. Which of the languages and tools that are available to me is the best choice for this task?” The resulting selected language could be different for different programming tasks.
Since several people have posted about the speeds of Julia and Fortran programs, here is a link that may be of interest. There, we can find source codes and comparisons of run times, for a number of languages and a number of tasks of medium size. There are additional pages at the same site where comparisons are made over a larger family of languages including C, Rust, Java, and so on.
My impression from the results at that site is that Julia and Fortran are worthy competitors. The Fortran source codes, however, could be made a bit more modern, with fewer DO loops. For instance, here is my go at a Fortran program to perform the Spectral Norm benchmark. I hope that some readers will find the code easier to read and understand than, say, the C version posted at the benchmark site.
program spnormex
!https://benchmarksgame-team.pages.debian.net/benchmarksgame/fastest/julia-ifc.html
!Spectral norm example
use BLAS95
implicit none
integer, parameter :: dp = kind(0d0)
real(dp), allocatable :: u(:), v(:), A(:,:)
integer i, j, n
character(len=6) :: arg1
call get_command_argument(1,arg1)
read(arg1, *)n
allocate(u(n), v(n), A(n,n))
do j = 1, n
A(1:n,j) = 1d0/[((i+j-1)*(i+j-2)/2+i, i=1,n)]
end do
u = 1d0
do i = 1, 10
call MultAtAv(u,v)
call MultAtAv(v,u)
end do
print '(A,F11.9)',' Computed result: ', &
sqrt(dot_product(u,v)/dot_product(v,v))
print *,'Expected result: 1.274224153'
contains
subroutine MultAtAv(v,AtAv)
implicit none
real(dp) :: v(:), AtAv(:), u(size(v))
call gemv(A,v,u)
call gemv(A,u,AtAv,trans='T')
return
end subroutine MultAtAv
end program