get_array(Array, vector(i,j))
. Instead, many languages provide syntax such as Array ,j/code>. Similarly an array element update is a procedure consisting of three arguments, for example set_array(Array, vector(i,j), value)
, but many languages also provide syntax such as Array ,j= value
.
A construct in a language is syntactic sugar if it can be removed from the language without any effect on what the language can do: functionality and expressive power will remain the same.
Language processors, including compiler
In computing, a compiler is a computer program that Translator (computing), translates computer code written in one programming language (the ''source'' language) into another language (the ''target'' language). The name "compiler" is primaril ...
s and static analyzers, often expand sugared constructs into their more verbose equivalents before processing, a process sometimes called "desugaring".
Origins
The term ''syntactic sugar'' was coined by Peter J. Landin in 1964 to describe the surface syntax of a simple ALGOL
ALGOL (; short for "Algorithmic Language") is a family of imperative computer programming languages originally developed in 1958. ALGOL heavily influenced many other languages and was the standard method for algorithm description used by the ...
-like programming language which was defined semantically in terms of the applicative expressions of lambda calculus
In mathematical logic, the lambda calculus (also written as ''λ''-calculus) is a formal system for expressing computability, computation based on function Abstraction (computer science), abstraction and function application, application using var ...
, centered on lexically replacing λ with "where".
Later programming languages, such as CLU, ML and Scheme, extended the term to refer to syntax within a language which could be defined in terms of a language core of essential constructs; the convenient, higher-level features could be "desugared" and decomposed into that subset. This is, in fact, the usual mathematical practice of building up from primitives.
Building on Landin's distinction between essential language constructs and syntactic sugar, in 1991, Matthias Felleisen proposed a codification of "expressive power" to align with "widely held beliefs" in the literature. He defined "more expressive" to mean that without the language constructs in question, a program would have to be completely reorganized.
Notable examples
* In COBOL, many of the intermediate keywords are syntactic sugar that may optionally be omitted. For example, the sentence MOVE A B.
and the sentence MOVE A TO B.
perform exactly the same function, but the second makes the action to be performed clearer.
* Augmented assignment or compound assignment operators: For example, a += b
is equivalent to a = a + b
in C and similar languages, assuming a
has no side effects such as if a
is a regular variable. Some languages, such as Python may allow overloading augmented assignment operators, so they may behave differently than standard ones.
* In Perl
Perl is a high-level, general-purpose, interpreted, dynamic programming language. Though Perl is not officially an acronym, there are various backronyms in use, including "Practical Extraction and Reporting Language".
Perl was developed ...
, unless (condition)
is syntactic sugar for if (not condition)
. Additionally, any statement can be followed by a condition, so statement if condition
is equivalent to if (condition)
, but the former is more naturally formatted on a single line.
* In the C language, the a /code> notation is syntactic sugar for *(a + i)
. Likewise, the a->x
notation is syntactic sugar for accessing members using the dereference operator (*a).x
.
* The using
statement in C# ensures that certain objects are disposed of correctly. The compiler expands the statement into a try-finally block.
* The C# language allows variables to be declared as var x = expr
, which allows the compiler to infer the type of x
from the expression expr
, instead of requiring an explicit type declaration. Similarly, C++ allows auto x = expr
since C++11 and Java allows var x = expr
since Java 11.
* Python list comprehensions (such as *x for x in range(10)/code> for a list of squares) and decorators (such as @staticmethod
).
* In Haskell
Haskell () is a general-purpose, statically typed, purely functional programming language with type inference and lazy evaluation. Designed for teaching, research, and industrial applications, Haskell pioneered several programming language ...
, a string, denoted in quotation marks, is semantically equivalent to a list of characters. An optional language extension ''OverloadedStrings'' allows string literals to produce other types of values, such as Text, as well.
* In the tidyverse collection of R packages, the ''pipe'', denoted by %>%
, declares that the data (or output of the function) preceding the pipe will serve as the first argument for the function following the pipe. So, x %>% f(y)
is equivalent to f(x,y)
.
* In SQL, a mere JOIN
is equivalent to an INNER JOIN
, the latter clarifying that the join statement is specifically an inner join operation as opposed to an outer join operation. Likewise, one may omit the OUTER
from the LEFT OUTER JOIN
, RIGHT OUTER JOIN
and FULL OUTER JOIN
.
* Extension method in OOP languages in the form of myObject.myMethod(parameter1, parameter2, parameter3)
is syntactic sugar for calling a global function as myMethod(myObject, parameter1, parameter2, parameter3)
. The reference to the object is passed as a hidden argument, usually accessible from within the method as this
.
* A parameter called by reference is syntactic sugar for technically passing a ''pointer'' as the parameter, but syntactically handling it as the variable itself, to avoid constant pointer de-referencing in the code inside the function.
* In Java
Java is one of the Greater Sunda Islands in Indonesia. It is bordered by the Indian Ocean to the south and the Java Sea (a part of Pacific Ocean) to the north. With a population of 156.9 million people (including Madura) in mid 2024, proje ...
, an import
declaration enables the compiler to find classes that are not otherwise specified with fully qualified names. For example import javax.swing.*;
allows the programmer to reference a Swing object such as javax.swing.JButton
using the shorter name JButton
.
* In the ES6 version of JavaScript
JavaScript (), often abbreviated as JS, is a programming language and core technology of the World Wide Web, alongside HTML and CSS. Ninety-nine percent of websites use JavaScript on the client side for webpage behavior.
Web browsers have ...
, arrow functions have a short form (x) => x + 1
, which is equivalent to the longer form (x) =>
.
* In Scala, triple questions marks ( ???
) is equivalent to throw new NotImplementedError
. This is useful to mark a place for code that has not yet been written.
* In JavaScript
JavaScript (), often abbreviated as JS, is a programming language and core technology of the World Wide Web, alongside HTML and CSS. Ninety-nine percent of websites use JavaScript on the client side for webpage behavior.
Web browsers have ...
, if the key and value are the same in an object, you have the option to write it just once. For example,
is equivalent to
. This is called the Shorthand Property.
Criticism
Some programmers feel that these syntax usability features are either unimportant or outright frivolous. Notably, special syntactic forms make a language less uniform and its specification more complex, and may cause problems as programs become large and complex. This view is particularly widespread in the Lisp
Lisp (historically LISP, an abbreviation of "list processing") is a family of programming languages with a long history and a distinctive, fully parenthesized Polish notation#Explanation, prefix notation.
Originally specified in the late 1950s, ...
community, as Lisp has very simple and regular syntax, and the surface syntax can easily be modified.
For example, Alan Perlis once quipped in " Epigrams on Programming", in a reference to bracket-delimited languages, that "Syntactic sugar causes cancer of the semi-colons".
Derivative terms
Syntactic salt
The metaphor has been extended by coining the term ''syntactic salt'', which indicates a feature designed to make it harder to write bad code. Specifically, syntactic salt is a hoop that programmers must jump through just to prove that they know what is going on, rather than to express a program action.
In C#, when hiding an inherited class member, a compiler warning is issued unless the new
keyword is used to specify that the hiding is intentional. To avoid potential bugs owing to the similarity of the switch statement
In computer programming languages, a switch statement is a type of selection control mechanism used to allow the value of a variable or expression to change the control flow of program execution via search and map.
Switch statements function ...
syntax with that of C or C++, C# requires a break
for each non-empty case
label of a switch
(unless goto
, return
, or throw
is used) even though it does not allow implicit ''fall-through''. (Using goto
and specifying the subsequent label produces a C/C++-like ''fall-through''.)
Syntactic salt may defeat its purpose by making the code unreadable and thus worsen its quality – in extreme cases, the essential part of the code may be shorter than the overhead introduced to satisfy language requirements.
An alternative to syntactic salt is generating compiler warnings when there is high probability that the code is a result of a mistake – a practice common in modern C/C++ compilers.
Syntactic saccharin
Other extensions are ''syntactic saccharin'' and ''syntactic syrup
In cooking, syrup (less commonly sirup; from ; , beverage, wine and ) is a condiment that is a thick, viscous liquid consisting primarily of a Solution (chemistry), solution of sugar in water, containing a large amount of dissolved sugars but ...
'', meaning gratuitous syntax that does not make programming any easier.
Sugared types
Data types with core syntactic support are said to be "sugared types". Common examples include quote-delimited strings, curly braces for object and record types, and square brackets for arrays.
Notes
References
*
*
*
*
* , reprinted in
*
{{refend
Programming language syntax
Computer jargon
Source code
Programming language design
Metaphors referring to food and drink