The Julia Programming Language for your Windows PC!

Julia Language

Julia Language

  -  137 MB  -  Open Source
  • Latest Version

    Julia Language 1.11.1 (64-bit) LATEST

  • Review by

    Daniel Leblanc

  • Operating System

    Windows 7 64 / Windows 8 64 / Windows 10 64 / Windows 11

  • User Rating

    Click to vote
  • Author / Product

    The Julia Project / External Link

  • Filename

    julia-1.11.1-win64.exe

Julia Language is dynamically-typed, feels like a scripting language, and has good support for interactive use. Julia has a rich language of descriptive data types, and type declarations can be used to clarify and solidify programs. The programs compile to efficient native code for multiple platforms via LLVM.

Julia uses multiple dispatch as a paradigm, making it easy to express many object-oriented and functional programming patterns. The standard library provides asynchronous I/O, process control, logging, profiling, a package manager, and more. It has high-level syntax, making it an accessible language for programmers from any background or experience level. Julia Language is free for everyone to use, and all source code is publicly viewable on GitHub.

It has been downloaded over 10 million times and the community has registered over 2,000 packages for community use. These include various mathematical libraries, data manipulation tools, and packages for general-purpose computing. In addition to these, you can easily use libraries from Python, R, C/Fortran, C++, and Java.

Features and Highlights

Data Visualization and Plotting
Data visualization has a complicated history. Plotting software makes trade-offs between features and simplicity, speed and beauty, and a static and dynamic interface. Some packages make a display and never change it, while others make updates in real-time.

Build, Deploy or Embed Your Code
The app lets you write UIs, statically compile your code, or even deploy it on a webserver. It also has powerful shell-like capabilities for managing other processes. It provides Lisp-like macros and other metaprogramming facilities.

Interact with your Data
The data ecosystem lets you load multidimensional datasets quickly, perform aggregations, joins and preprocessing operations in parallel, and save them to disk in efficient formats. You can also perform online computations on streaming data with OnlineStats.jl. Whether you're looking for the convenient and familiar DataFrames or a new approach with JuliaDB, It provides you a rich variety of tools. The Queryverse provides query, file IO, and visualization functionality. In addition to working with tabular data, the JuliaGraphs packages make it easy to work with combinatorial data.

Scalable Machine Learning
It provides powerful tools for deep learning (Flux.jl and Knet.jl), machine learning, and AI. Julia’s mathematical syntax makes it an ideal way to express algorithms just as they are written in papers, build trainable models with automatic differentiation, GPU acceleration, and support for terabytes of data with JuliaDB.

Rich Ecosystem for Scientific Computing
Julia is designed from the ground up to be very good at numerical and scientific computing. This can be seen in the abundance of scientific tooling written in the app, such as the state-of-the-art differential equations ecosystem (DifferentialEquations.jl), optimization tools (JuMP.jl and Optim.jl), iterative linear solvers (IterativeSolvers.jl), a robust framework for Fourier transforms (AbstractFFTs.jl), a general-purpose quantum simulation framework (Yao.jl), and many more, that can drive all your simulations.

Parallel and Heterogeneous Computing
The language is designed for parallelism and provides built-in primitives for parallel computing at every level: instruction-level parallelism, multi-threading, and distributed computing. The Celeste.jl project achieved 1.5 PetaFLOP/s on the Cori supercomputer at NERSC using 650,000 cores. The compiler can also generate native code for various hardware accelerators, such as GPUs and Xeon Phis. Packages such as DistributedArrays.jl and Dagger.jl provide higher levels of abstraction for parallelism.

  • Julia Language 1.11.1 (64-bit) Screenshots

    The images below have been resized. Click on them to view the screenshots in full size.

    Julia Language 1.11.1 (64-bit) Screenshot 1
  • Julia Language 1.11.1 (64-bit) Screenshot 2
  • Julia Language 1.11.1 (64-bit) Screenshot 3
  • Julia Language 1.11.1 (64-bit) Screenshot 4
  • Julia Language 1.11.1 (64-bit) Screenshot 5

What's new in this version:

New language features:
- public is a new keyword. Symbols marked with public are considered public API. Symbols marked with export are now also treated as public API. The difference between public and export is that public names do not become available when using a package/module
- ScopedValue implements dynamic scope with inheritance across tasks
- The new macro Base.Cartesian.@ncallkw is analogous to Base.Cartesian.@ncall, but allows to add keyword arguments to the function call
- Support for Unicode 15.1
- Three new types around the idea of text with "annotations" (Pair{Symbol, Any} entries, e.g. :lang => "en" or :face => :magenta). These annotations are preserved across operations (e.g. string concatenation with *) when possible.
- AnnotatedString is a new AbstractString type. It wraps an underlying string and allows for annotations to be attached to regions of the string. This type is used extensively in the new StyledStrings standard library to hold styling information.
- AnnotatedChar is a new AbstractChar type. It wraps another char and holds a list of annotations that apply to it.
- AnnotatedIOBuffer is a new IO type that mimics an IOBuffer, but has specialised read/write methods for annotated content. This can be thought of both as a "string builder" of sorts and also as glue between annotated and unannotated content.
- Manifest.toml files can now be renamed in the format Manifest-v{major}.{minor}.toml to be preferentially picked up by the given julia version. i.e. in the same folder, a Manifest-v1.11.toml would be used by v1.11 and Manifest.toml by every other julia version. This makes managing environments for multiple julia versions at the same time easier
- @time now reports a count of any lock conflicts where a ReentrantLock had to wait, plus a new macro @lock_conflicts which returns that count

Language changes:
- During precompilation, the atexit hooks now run before saving the output file. This allows users to safely tear down background state (such as closing Timers and sending disconnect notifications to heartbeat tasks) and cleanup other resources when the program wants to begin exiting.
- Code coverage and malloc tracking is no longer generated during the package precompilation stage. Further, during these modes pkgimage caches are now used for packages that are not being tracked. This means that coverage testing (the default for julia-actions/julia-runtest) will by default use pkgimage caches for all other packages than the package being tested, likely meaning faster test execution.
- Specifying a path in JULIA_DEPOT_PATH now results in the expansion of empty strings to omit the default user depot

Compiler/Runtime improvements:
- Updated GC heuristics to count allocated pages instead of individual objects
- A new LazyLibrary type is exported from Libdl for use in building chained lazy library loads, primarily to be used within JLLs
- Added support for annotating Base.@assume_effects on code blocks
- The libuv library has been updated from a base of v1.44.2 to v1.48.0

Command-line option changes:
- The entry point for Julia has been standardized to Main.main(Base.ARGS). This must be explicitly opted into using the @main macro (see the docstring for further details). When opted-in, and julia is invoked to run a script or expression (i.e. using julia script.jl or julia -e expr), julia will subsequently run the Main.main function automatically. This is intended to unify script and compilation workflows, where code loading may happen in the compiler and execution of Main.main may happen in the resulting executable. For interactive use, there is no semantic difference between defining a main function and executing the code directly at the end of the script ([50974]).
- The --compiled-modules and --pkgimages flags can now be set to existing, which will cause Julia to consider loading existing cache files, but not to create new ones
- The --project argument now accepts @script to give a path to a directory with a Project.toml relative to the passed script file. --project=@script/foo for the foo subdirectory. If no path is given after (i.e. --project=@script) then (like --project=@.) the directory and its parents are searched for a Project.toml

Multi-threading changes:
- Threads.@threads now supports the :greedy scheduler, intended for non-uniform workloads
- A new public (but unexported) struct Base.Lockable{T, L<:AbstractLock} makes it easy to bundle a resource and its lock together

Build system changes:
- There is a new Makefile to build Julia and LLVM using the profile-guided and link-time optimizations (PGO and LTO) strategies, see contrib/pgo-lto/Makefile

New library functions:
- in!(x, s::AbstractSet) will return whether x is in s, and insert x in s if not.
- The new Libc.mkfifo function wraps the mkfifo C function on Unix platforms
- copyuntil(out, io, delim) and copyline(out, io) copy data into an out::IO stream
- eachrsplit(string, pattern) iterates split substrings right to left.
- Sys.username() can be used to return the current user's username
- GC.logging_enabled() can be used to test whether GC logging has been enabled via GC.enable_logging
- IdSet is now exported from Base and considered public

New library features:
- invmod(n, T) where T is a native integer type now computes the modular inverse of n in the modular integer ring that T defines
- invmod(n) is an abbreviation for invmod(n, typeof(n)) for native integer types
- replace(string, pattern...) now supports an optional IO argument to write the output to a stream rather than returning a string
- New methods allequal(f, itr) and allunique(f, itr) taking a predicate function
- sizehint!(s, n) now supports an optional shrink argument to disable shrinking
- New function Docs.hasdoc(module, symbol) tells whether a name has a docstring
- New function Docs.undocumented_names(module) returns a module's undocumented public names
- Passing an IOBuffer as a stdout argument for Process spawn now works as expected, synchronized with wait or success, so a Base.BufferStream is no longer required there for correctness to avoid data races
- After a process exits, closewrite will no longer be automatically called on the stream passed to it. Call wait on the process instead to ensure the content is fully written, then call closewrite manually to avoid data-races. Or use the callback form of open to have all that handled automatically.
- @timed now additionally returns the elapsed compilation and recompilation time
- filter can now act on a NamedTuple
- Iterators.cycle(iter, n) runs over iter a fixed number of times, instead of forever
- zero(::AbstractArray) now applies recursively, so zero([[1,2],[3,4,5]]) now produces the additive identity [[0,0],[0,0,0]] rather than erroring

Standard library changes:
- It's not possible to define length for stateful iterators in a generally consistent manner. The potential for silently incorrect results for Stateful iterators is addressed by deleting the length(::Stateful) method. The last type parameter of Stateful is gone, too. Issue:

StyledStrings:
- A new standard library for handling styling in a more comprehensive and structured way
- The new Faces struct serves as a container for text styling information (think typeface, as well as color and decoration), and comes with a framework to provide a convenient, extensible (via addface!), and customisable (with a user's Faces.toml and loadfaces!) approach to styled content
- The new @styled_str string macro provides a convenient way of creating a AnnotatedString with various faces or other attributes applied

Package Manager:
LinearAlgebra:
- cbrt(::AbstractMatrix{<:Real}) is now defined and returns real-valued matrix cube roots of real-valued matrices
- eigvals/eigen(A, bunchkaufman(B)) and eigvals/eigen(A, lu(B)), which utilize the Bunchkaufman (LDL) and LU decomposition of B, respectively, now efficiently compute the generalized eigenvalues (eigen: and eigenvectors) of A and B. Note: The second argument is the output of bunchkaufman or lu
- There is now a specialized dispatch for eigvals/eigen(::Hermitian{<:Tridiagonal}) which performs a similarity transformation to create a real symmetrix triagonal matrix, and solve that using the LAPACK routines
- Structured matrices now retain either the axes of the parent (for Symmetric/Hermitian/AbstractTriangular/UpperHessenberg), or that of the principal diagonal (for banded matrices)
- bunchkaufman and bunchkaufman! now work for any AbstractFloat, Rational and their complex variants. bunchkaufman now supports Integer types, by making an internal conversion to Rational{BigInt}. Added new function inertia that computes the inertia of the diagonal factor given by the BunchKaufman factorization object of a real symmetric or Hermitian matrix. For complex symmetric matrices, inertia only computes the number of zero eigenvalues of the diagonal factor
- Packages that specialize matrix-matrix mul! with a method signature of the form mul!(::AbstractMatrix, ::MyMatrix, ::AbstractMatrix, ::Number, ::Number) no longer encounter method ambiguities when interacting with LinearAlgebra. Previously, ambiguities used to arise when multiplying a MyMatrix with a structured matrix type provided by LinearAlgebra, such as AbstractTriangular, which used to necessitate additional methods to resolve such ambiguities. Similar sources of ambiguities have also been removed for matrix-vector mul! operations
- lu and issuccess(::LU) now accept an allowsingular keyword argument. When set to true, a valid factorization with rank-deficient U factor will be treated as success instead of throwing an error. Such factorizations are now shown by printing the factors together with a "rank-deficient" note rather than printing a "Failed Factorization" message