New Features


Apple Silicon Mac Support


IDL now runs natively on Apple silicon Macs. This enables IDL to take full advantage of Apple's M-series chips. Performance is improved relative to running IDL built for Intel chips under Apple's Rosetta translator on an Apple silicon Mac.  The Intel build of IDL remains available for Macs with Intel hardware.

All Macs now use Apple silicon instead of Intel chips. The term "Apple silicon" refers to a system on a chip (SoC) with names that include M1, M2, M2 Pro, M2 Max, M2 Ultra, etc.  These can be referred to as "M-series" chips.  The common name for the architecture is "arm64" and this is reflected in IDL's "bin.darwin.arm64" directory, which contains IDL's binary files. Finally, this documentation will refer to "Intel builds" and "Arm builds" of IDL.

Intel builds of IDL continue to run natively on Macs with Intel hardware. They can also run on Apple silicon Macs using the Rosetta 2 translator.  The Arm builds of IDL only run on Apple silicon Macs.

There are two primary benefits to running the Arm build of IDL on Apple silicon Macs versus an Intel build under translation:

  • Apple's Rosetta 2 software will eventually be removed by Apple.  This will prevent Intel builds of IDL from running on Apple silicon hardware. The first version of Rosetta was for the PPC to Intel transition and it was provided by Apple for five years. Rosetta 2 has been in existence for three years, and hence it may last another two years.

  • The Arm build of IDL has better performance on Apple silicon than the Intel build running under Rosetta 2.

The following plots show the relative performance of Intel and Arm versions of IDL 9.0 running on Apple silicon. Intel IDL is running under Rosetta 2 translation, while the Arm version is running natively. Higher bars mean better performance. These plots are most useful for customers who have an Apple silicon Mac and are thinking about updating to IDL 9.0. The plots do not compare Intel Mac versus Apple silicon Mac, nor do they compare Windows PC versus Mac. These are apples-to-apples comparisons.

File I/O

Read and write performance is dominated by the underlying hardware. Hence even under Rosetta translation, the Intel version of IDL performs similarly to the Arm version. File size and the disk's design, such as caches, will affect the relative performance between reading and writing.

Read and Write Performance

Time Tests

For this plot, IDL's "time_test4" and "graphics_times4" routines were used to get a generalized perspective of performance. They test a mixture of raw interpreter speed, basic array operations, file I/O, plotting, displaying, and font rendering. These two routines ship with IDL, so it is possible to compare your system.

Transpose

This plot presents the number of matrix transpose operations per second. The number of elements in the test matrix is doubled with each successive group of bars. Although Intel IDL compares well against Arm with 4 million elements, plotting 8 million elements shows Arm IDL doing better with a ratio similar to that seen with 1 and 2 million elements. This demonstrates that the number of dimensions and size of matrices in combination with the CPU's design (such as caches) does affect an algorithm's performance.

Fast Fourier Transform

This plot presents the number of FFT operations per second. All Intel-based builds of IDL use Intel's MKL library to implement FFT.  The Arm build of IDL uses the Arm Performance Libraries (ArmPL). As mentioned in the FFT documentation, the number of dimensions and their sizes determine FFT performance.  Regardless, IDL implements FFT efficiently for both Intel and Arm versions.

Matrix Multiplication

This plot presents the number of matrix multiplication operations per second. The Arm build uses Apple's Accelerate library for LAPACK and BLAS routines. This enables matrix multiplication to take advantage of the M-series chip's custom matrix multiplication units.

HttpRequest Class


IDL has a new HttpRequest class that lets you easily perform Get, Post, Put, and Delete requests to servers. The new class includes support for multipart form posts, authentication, custom headers, and callbacks during upload or download (with the option to cancel the request). For example, to do a simple Get request:

params = hash('key1', '2+2', 'key2', 'with spaces ')
response = HTTPRequest.Get('http://localhost:3000', params=params, /escape)
print, response.url
print, `status_code = ${response.status_code}`
help, response.text

IDL prints:

http://localhost:3000/?key1=2%2B2&key2=with%20spaces%20
status_code = 200
<Expression>    STRING    = 'GET /?key1=2%2B2&key2=with%20spaces%20...

Here we do a Post with a multipart form, including a local file:

multipart = dictionary('key1', 'value1', $
    'key2', {file: 'c:/image.jpg', mimetype: 'image/jpeg'})
response = HTTPRequest.Post('https://httpbin.org/post', multipart = multipart)
print, `status_code = ${response.status_code}`
print, response.json(), /implied

IDL prints:

status_code = 200
{
    "files": {
      "key2": "data:image/jpeg;base64,/9j/4AAQ..."
    },
    "form": {
      "key1": "value1"
    },
    "headers": {
      "Accept": "*/*",
      "Content-Length": "1040",
      ...
}

See HttpRequest for details.

IDL Extension for VS Code


IDL now has a new, modern developer environment, available for free within Visual Studio Code. The IDL for VSCode extension can be easily downloaded and installed from the VS Code extensions page. The extension has the following features:

  • Make the editor your own with extensions and themes.

  • Basic IDL type detection for seamless auto-complete.

  • Automation for formatting, adding and updating code documentation.

  • Auto-completion for routines, methods, keywords, and variables.

  • Hover help contains complete IDL documentation including code examples.

  • Problem detection, detects more than 100 problems in your code without having to compile.

  • An integrated debugger with breakpoints, or run command-line IDL within the VS Code terminal.

  • Native multi-language support.

For details visit the IDL for VSCode page.

IDL Notebooks


IDL now has a native IDL Notebook format and developer environment. The IDL Notebooks are available for free via the IDL for VSCode extension. IDL Notebooks are:

  • A friendly format for capturing text markup and code in one place.

  • The way that modern or ad-hoc developers and scientists are learning to program.

  • More approachable compared to creating files on disk and running from a command line.

IDL Notebooks can be easily created from the IDL for VSCode extension. You can also convert an IDL Notebook to a fully-commented IDL program that can be run outside of VSCode. The IDL Notebooks is fully native, is not based on Jupyter, and does not require Python. For details visit the IDL for VSCode page.

IDL_String::Dup and IDL_Variable::Dup Method


All IDL strings and variables now have a new Dup static method. The Dup method duplicates a scalar value and returns either a new scalar string or a new array variable. See IDL_String::Dup and IDL_Variable::Dup for details.

Matrix_Multiply NAN Keyword


The MATRIX_MULTIPLY function has a new NAN keyword. Set this keyword to cause the routine to check for occurrences of the IEEE floating-point values NaN or Infinity in the input data. Elements with the value NaN or Infinity are treated as equal to zero.

TYPESIZE attribute for variable attributes


Static variable attributes now have a new TYPESIZE attribute that returns the size in bytes of a single element of that datatype. For example:

IDL> x = 1.5d + 2i
IDL> print, x.typename, x.typesize
DCOMPLEX          16
IDL> x = findgen(1000)
IDL> print, x.typename, x.typesize
FLOAT           4

The TYPESIZE attribute may be useful when performing unformatted input/output, or converting variables to/from bytes. For example:

IDL> x = [!values.f_infinity, !values.f_nan]
IDL> print, byte(x, 0, x.length * x.typesize)
0   0 128 127   0   0 192 127

For more details see Variable Attributes.

Updates


ARROW function supports dashed and dotted line styles


The ARROW graphics function has a new LINESTYLE keyword. Set this keyword to an integer or string specifying the line style for the arrow. See ARROW for details.

Improved margins for MAP function


The MAP graphics function now uses better default margins when creating the map, based upon the font size. For example:

m = map('Geographic', limit=[-7, 104.5, -5.5, 106.5], $
  label_position=0, fill_color='light blue', font_size=12)
mc = mapcontinents(fill_color='light green',/hires)

MODIFYCT now allows color tables to be removed


The MODIFYCT procedure now allows you to remove direct graphics color tables by supplying an empty string for the color table name. See MODIFYCT for details.

TIFF now supports Zstandard (zstd) compression


The READ_TIFF and WRITE_TIFF routines are now able to read and write using Zstandard (zstd) compression. In addition, the QUERY_TIFF routine is now able to return the compression used in a TIFF file. Zstandard is a fast lossless compression algorithm which is fast enough for real-time compression. See QUERY_TIFF, READ_TIFF and WRITE_TIFF for details.

Variable attributes now support indexing


Static variable attributes now support array indexing without using parentheses. For example:

arr = fltarr(5,4,3)
print, arr.dim
print, arr.dim[1] ; used to require (arr.dim)[1]

IDL prints:

5           4           3
4

For more details see Variable Attributes.

IDL Python Bridge now supports Python 3.11


The IDL Python Bridge (IDL to Python and Python to IDL) now supports Python 3.11. The IDL-to-Python bridge lets you easily access Python routines and objects within IDL:

IDL> np = Python.Import('numpy')
IDL> coords = np.random.random([10,2])
IDL> x = coords[0,*]
IDL> y = coords[1,*]
IDL> r = np.sqrt(x^2+y^2)
IDL> t = np.arctan2(y,x)

Similarly, the Python-to-IDL bridge lets you access all IDL functionality from within Python:

Python 3.11.4 | packaged by Anaconda, Inc.
>>> import sys
>>> sys.path.append('c:/Program Files/NV5/IDL90/lib/bridges')
>>> from idlpy import *
IDL 9.0.0 (Win32 x86_64 m64).
>>> p = IDL.plot(test=1)
>>> p.color = 'red'

See the IDL Python Bridge for details and examples.

Library Updates


See the IDL Release Notes inside the IDL installation for library updates.

See Also


What's New in IDL 8.9

What's New in IDL 8.8.3

What's New in IDL 8.8.2

What's New in IDL 8.8.1

What's New in IDL 8.8

What's New in IDL 8.7.3

What's New in IDL 8.7.2

What's New in IDL 8.7.1

What's New in IDL 8.7

What's New in IDL 8.6.1

What's New in IDL 8.6

What's New in IDL 8.5.1

What's New in IDL 8.5

What's New in IDL 8.4.1

What's New in IDL 8.4

What's New in IDL 8.3

What's New in IDL 8.2.3

What's New in IDL 8.2.2

What's New in IDL 8.2.1

What's New in IDL 8.2

What's New in IDL 8.1

What's New in IDL 8.0