Esta comparación de lenguajes de programación compara las características de la sintaxis del lenguaje (formato) para más de 50 lenguajes de programación informática.
Expresiones
Las expresiones del lenguaje de programación se pueden clasificar en cuatro estructuras sintácticas:
- notación de prefijo
- Ceceo
(* (+ 2 3) (expt 4 5))
- notación infija
- Fortran
(2 + 3) * (4 ** 5)
- sufijo, posfijo o notación polaca inversa
- Adelante
2 3 + 4 5 ** *
- notación similar a las matemáticas
- TUTOR
(2 + 3)(45) $$ note implicit multiply operator
Declaraciones
Cuando un lenguaje de programación tiene declaraciones , normalmente tiene convenciones para:
- separadores de declaraciones;
- terminadores de declaración; y
- continuación de línea
Un separador de sentencias delimita el límite entre dos sentencias independientes. Un terminador de sentencias define el final de una sentencia individual. Los lenguajes que interpretan el final de una línea como el final de una sentencia se denominan lenguajes "orientados a la línea".
La "continuación de línea" es una convención en los lenguajes orientados a líneas en la que el carácter de nueva línea podría ser malinterpretado como un finalizador de sentencia. En dichos lenguajes, permite que una sola sentencia ocupe más de una línea.
Continuación de línea
La continuación de línea generalmente se realiza como parte del análisis léxico : una nueva línea normalmente da como resultado que se agregue un token al flujo de tokens, a menos que se detecte una continuación de línea.
- Espacios en blanco : idiomas que no necesitan continuaciones
- Ada – Las líneas terminan con punto y coma
- C# – Las líneas terminan con punto y coma
- JavaScript – Las líneas terminan con punto y coma (lo que se puede inferir)
- Lua
- OCaml
- Ampersand como último carácter de la línea
- Barra invertida como último carácter de la línea
- bash [5] y otros shells de Unix
- Preprocesador C , C++
- Mathematica , lenguaje Wolfram
- Pitón [6]
- Rubí
- JavaScript : solo dentro de cadenas entre comillas simples o dobles
- Comillas invertidas como último carácter de la línea
- Guión como último carácter de la línea
- Guión bajo como último carácter de la línea
- Puntos suspensivos (tres puntos, no un carácter especial)
- MATLAB : El token de puntos suspensivos no necesita ser el último carácter de la línea, pero se ignorará cualquier carácter que lo siga. [7] (En esencia, comienza un comentario que se extiende hasta (es decir, incluye) el primer carácter de nueva línea posterior. Contraste esto con un comentario en línea, que se extiende hasta la primera nueva línea posterior).
- Delimitador de coma como último carácter de la línea
- Ruby (el comentario puede seguir el delimitador)
- Delimitador de corchete izquierdo como último carácter de la línea
- Archivo por lotes : iniciar un bloque entre paréntesis puede permitir la continuación de la línea [8]
- Ruby: paréntesis izquierdo, corchete izquierdo o llave izquierda
- Operador como último objeto de la línea
- Ruby (el comentario puede seguir al operador)
- Operador como primer carácter de una línea continua
- AutoHotkey : Cualquier operador de expresión excepto ++ y --, y una coma o un punto [9]
- Barra invertida como primer carácter de una línea continua
- Alguna forma de comentario en línea sirve como continuación de línea.
- Ensamblador Turbo :
\ - m4 :
dnl - Texto :
%
- Posición del personaje
- Fortran 77 : Una línea sin comentarios es una continuación de la línea sin comentarios anterior si aparece algún carácter que no sea un espacio en la columna 6. Las líneas de comentarios no pueden continuar.
- COBOL : Las constantes de cadena pueden continuar si no finalizamos la cadena original en una cláusula PICTURE con
', y luego insertamos un-en la columna 7 (*se utiliza la misma posición que el comentario for). - TUTOR : Las líneas que comienzan con una tabulación (después de cualquier sangría requerida por el contexto) continúan el comando anterior.
- [Fin y comienzo] usando comillas normales
- Preprocesador de C , C++ : la cadena finaliza normalmente y continúa comenzando con una comilla en la siguiente línea.
Bibliotecas
Importar una biblioteca es una forma de leer rutinas, programas o paquetes externos, posiblemente compilados. Las importaciones se pueden clasificar por nivel (módulo, paquete, clase, procedimiento,...) y por sintaxis (nombre de directiva, atributos,... )
- Importación de archivos
addpath(directory)MATLAB [10]COPY filename.COBOL:-include("filename").Prólogo#include file="filename"ÁSPID#include "filename", AutoHotkey , AutoIt , C , C++#include <filename>AutoHotkey , AutoIt , C , C++#import "filename", Objetivo-C#import <filename>Objetivo-CImport["filename"]Mathematica , lenguaje Wolframinclude 'filename'Fortraninclude "filename";PHPinclude [filename] program, Seleccione Básico#include [filename] programSeleccione Básicoinclude!("filename");Óxidoload "filename"Rubíload %filenameRojorequire('filename')Luarequire "filename";Perl , PHPrequire "filename"Rubísource(""filename"")R@import("filename");Zig
- Importación de paquetes
#include filenameC , C++#[path = "filename"] mod altname;, Óxido@import module;Objetivo-C<<nameMathematica , lenguaje Wolfram:-use_module(module).Prólogo :from module import *Pitónextern crate libname;, Óxidoextern crate libname as altname;Óxidomod modname;, Óxidolibrary("package")R :IMPORT moduleOberónimport altname "package/name"Ir :import package.module;, Dimport altname = package.module;Dimport Module, Haskellimport qualified Module as MHaskellimport package.*Java , MATLAB , Kotlinimport "modname";JavaScript :import altname from "modname";, JavaScript :import packageEscalaimport package._, Escalaimport moduleRápidoimport moduleV (lenguaje)import module, Pitón- requiere('modname') Lua :
require "gem", Rubíuse module, Fortran 90+use module, only : identifierFortran 90+use Module;Perlause Module qw(import options);Perluse Package.NameCobrauses unitPascalwith packageAda@import("pkgname");Zig
- Importación de clase
from module import ClassPitónimport package.classJava , MATLAB y Kotlinimport class from "modname";, JavaScriptimport {class} from "modname";, JavaScriptimport {class as altname} from "modname";JavaScriptimport package.class, Escalaimport package.{ class1 => alternativeName, class2 }, Escalaimport package._Escalause Namespace\ClassName;, PHPuse Namespace\ClassName as AliasName;PHP
- Importación de procedimiento/función
from module import functionPitón :import package.module : symbol;, D :import package.module : altsymbolname = symbol;D :import Module (function)Haskell :import function from "modname";, JavaScript :import {function} from "modname";, JavaScript :import {function as altname} from "modname";JavaScript :import package.functionMATLAB :import package.class.function, Escala :import package.class.{ function => alternativeName, otherFunction }Escala :use Module ('symbol');Perla :use function Namespace\function_name;, PHP :use Namespace\function_name as function_alias_name;Programa PHP :use module::submodule::symbol;, Óxido :use module::submodule::{symbol1, symbol2};, Óxido :use module::submodule::symbol as altname;Óxido :
- Importación constante
use const Namespace\CONST_NAME;PHP
Las afirmaciones anteriores también se pueden clasificar según sean una conveniencia sintáctica (que permite hacer referencia a las cosas con un nombre más corto, pero aún así se puede hacer referencia a ellas con algún nombre completamente calificado sin importancia) o según sean realmente necesarias para acceder al código (sin lo cual es imposible acceder al código, incluso con nombres completamente calificados).
- Conveniencia sintáctica
- Necesario para acceder al código
import altname "package/name"Irimport altname from "modname";JavaScriptimport modulePitón
Bloques
Un bloque es una notación para un grupo de dos o más declaraciones, expresiones u otras unidades de código que están relacionadas de tal manera que forman un todo.
- Llaves (también conocidas como llaves)
{...}
- Lenguajes de programación con llaves : C , C++ , Objective-C , Go , Java , JavaScript / ECMAScript , V (Vlang) , C# , D , Perl , PHP ( bucles
for&loopo pasar un bloque como argumento), R , Rust , Scala , S-Lang , Swift , PowerShell , Haskell (en notación do), AutoHotkey , Zig
- Paréntesis
(...)
- Batchfile , F# (sintaxis liviana), [11] OCaml , Prolog , ML estándar
- Corchetes
[...]
- Rebol , Red , Self , Smalltalk (los bloques son objetos de primera clase, también conocidos como cierres)
begin...end
- Ada , ALGOL , F# (sintaxis detallada), [11] Pascal , Ruby (
for,do/while&do/untilbucles), OCaml , SCL , Simula , Erlang .
do...end
do...done
- Bash ( bucles
for&while), F# (sintaxis detallada) [11] Visual Basic , Fortran , TUTOR (con sangría obligatoria del cuerpo del bloque), Visual Prolog
do...end
- Lua , Ruby (pasa bloques como argumentos,
forbucle), Seed7 (encierra los cuerpos del bucle entredoyend)
- X...
end(por ejemploif...end):
- Ruby (
if,while,until,def,class,moduledeclaraciones), OCaml (for&whilebucles), MATLAB (if&switchcondicionales,for&whilebucles,trycláusula,package,classdef,properties,methods,events, &functionbloques), Lua (then/else&function)
- (
begin...)
- (pronóstico...)
- (
do...)
- Sangría
- Lenguajes con reglas fuera de juego : Boo , Cobra , CoffeeScript , F# , Haskell (en notación do cuando se omiten las llaves), LiveScript , occam , Python , Nemerle (opcional; el usuario puede usar una sintaxis que distinga los espacios en blanco en lugar de la sintaxis de llaves si así lo desea), Nim , Scala (opcional, como en Nemerle)
- Lenguajes de forma libre : la mayoría de los descendientes de ALGOL (incluidos C , Pascal y Perl ); lenguajes Lisp
- Otros
- Ada , Visual Basic , Seed7 :
if...end if - APL :
:If...:EndIfo:If...:End - Bash , sh y ksh :
if...fi,do...done,case...esac; - ALGOL 68 :
begin...end,(...),if...fi,do...od - Lua , Pascal , Modula-2 , Seed7 :
repeat...until - COBOL :
IF...END-IF,PERFORM...END-PERFORM, etc. para declaraciones; ....para oraciones. - Visual Basic .Net :
If...End If,For...Next,Do...Loop - Pequeño Básico :
If...EndIf,For...EndFor,While...EndWhile
Comentarios
Los comentarios se pueden clasificar por:
- estilo (en línea/bloque)
- reglas de análisis (ignoradas/interpoladas/almacenadas en memoria)
- recursividad (anidable/no anidable)
- usos ( docstrings /comentarios descartables/otros)
Comentarios en línea
Los comentarios en línea son generalmente aquellos que utilizan un carácter de nueva línea para indicar el final de un comentario y un delimitador arbitrario o una secuencia de tokens para indicar el comienzo de un comentario.
Ejemplos:
Bloquear comentarios
Los comentarios en bloque son generalmente aquellos que utilizan un delimitador para indicar el comienzo de un comentario y otro delimitador para indicar el final de un comentario. En este contexto, los espacios en blanco y los caracteres de nueva línea no se cuentan como delimitadores. En los ejemplos, el símbolo ~ representa el comentario y los símbolos que lo rodean son entendidos por los intérpretes/compiladores como los delimitadores.
Ejemplos:
Variantes únicas
- Fortran
- La sangría de líneas en Fortran 66/77 es significativa. La declaración real está en las columnas 7 a 72 de una línea. Cualquier carácter que no sea un espacio en la columna 6 indica que esta línea es una continuación de la línea anterior. Un '
C' en la columna 1 indica que esta línea entera es un comentario. Las columnas 1 a 5 pueden contener un número que sirve como etiqueta. Las columnas 73 a 80 se ignoran y se pueden usar para comentarios; en la época de las tarjetas perforadas , estas columnas a menudo contenían un número de secuencia para que la baraja de cartas pudiera ordenarse en el orden correcto si alguien dejaba caer las cartas accidentalmente. Fortran 90 eliminó la necesidad de la regla de sangría y agregó comentarios en línea, utilizando el!carácter como delimitador de comentarios.
- COBOL
- En el código de formato fijo, la sangría de línea es importante. Se ignoran las columnas 1 a 6 y las columnas de la 73 en adelante. Si hay un
*o/en la columna 7, entonces esa línea es un comentario. Hasta COBOL 2002, si había unDoden la columna 7, definía una "línea de depuración" que se ignoraba a menos que se le indicara al compilador que lo compilara.
- Cobra
- Cobra admite comentarios en bloque con "
/#...#/", que es similar al "/*...*/" que se encuentra a menudo en los lenguajes basados en C, pero con dos diferencias. El#carácter se reutiliza a partir del formato de comentario de una sola línea "#...", y los comentarios en bloque se pueden anidar, lo que resulta conveniente para comentar grandes bloques de código.
- Rizo
- Curl admite comentarios en bloque con etiquetas definidas por el usuario como en
|foo# ... #foo|.
- Lua
- Al igual que las cadenas sin formato, puede haber cualquier cantidad de signos iguales entre los corchetes, siempre que tanto las etiquetas de apertura como de cierre tengan una cantidad coincidente de signos iguales; esto permite la anidación siempre que los comentarios de bloque anidados/cadenas sin formato utilicen una cantidad diferente de signos iguales que el comentario que los encierra:
--[[comment --[=[ nested comment ]=] ]]. Lua descarta la primera nueva línea (si está presente) que sigue directamente a la etiqueta de apertura.
- Perl
- Los comentarios en bloque en Perl se consideran parte de la documentación y reciben el nombre de Plain Old Documentation (POD). Técnicamente, Perl no tiene una convención para incluir comentarios en bloque en el código fuente, pero POD se utiliza habitualmente como solución alternativa.
- PHP
- PHP admite comentarios de estilo C/C++ estándar, pero también admite el estilo Perl.
- Pitón
- El uso de comillas triples para comentar líneas de código fuente en realidad no forma un comentario. [21] El texto incluido se convierte en una cadena literal, que Python generalmente ignora (excepto cuando es la primera declaración en el cuerpo de un módulo, clase o función; consulte docstring ).
- Elixir
- El truco anterior utilizado en Python también funciona en Elixir, pero el compilador lanzará una advertencia si lo detecta. Para suprimir la advertencia, uno necesitaría anteponer el sigilo
~S(que evita la interpolación de cadenas) a la cadena entre comillas triples, lo que lleva a la construcción final~S""" ... """. Además, Elixir admite una forma limitada de comentarios en bloque como una característica oficial del lenguaje, pero como en Perl, esta construcción está destinada exclusivamente a escribir documentación. A diferencia de Perl, no se puede utilizar como una solución alternativa, ya que está limitada a ciertas partes del código y arroja errores o incluso suprime funciones si se utiliza en otro lugar. [22]
- Raku
- Raku utiliza
#`(...)para denotar comentarios en bloque. [23] Raku en realidad permite el uso de cualquier paréntesis "derecho" e "izquierdo" después#`(es decir#`(...),#`[...],#`{...},#`<...>, e incluso los más complicados#`{{...}}son todos comentarios en bloque válidos). También se permite que los corchetes estén anidados dentro de los comentarios (es decir,#`{ a { b } c }van hasta la última llave de cierre).
- Rubí
- El comentario de bloque en Ruby se abre en
=beginla línea y se cierra en=endla línea.
- Jerga
- El intérprete ignora la región de líneas encerrada por los delimitadores
#<tag>y . El nombre de la etiqueta puede ser cualquier secuencia de caracteres alfanuméricos que se puedan utilizar para indicar cómo se debe descifrar el bloque encerrado. Por ejemplo, podría indicar el comienzo de un bloque de documentación con formato LaTeX.#</tag>#<latex>
- Esquema y estafa
- El siguiente componente sintáctico completo (expresión-s) se puede comentar con
#;.
- ABAP
ABAP admite dos tipos diferentes de comentarios. Si el primer carácter de una línea, incluida la sangría, es un asterisco ( *), toda la línea se considera un comentario, mientras que una comilla doble simple ( ") comienza un comentario en línea que actúa hasta el final de la línea. Los comentarios ABAP no son posibles entre las sentencias EXEC SQLy ENDEXECporque SQL nativo tiene otros usos para estos caracteres. En la mayoría de los dialectos SQL, --se puede utilizar el guión doble ( ) en su lugar.
- Lenguajes esotéricos
- Muchos lenguajes de programación esotéricos siguen la convención de que cualquier texto no ejecutado por el puntero de instrucción (por ejemplo, Befunge ) o al que se le asigna un significado de otro modo (por ejemplo, Brainfuck ), se considera un "comentario".
Comparación de comentarios
Existe una amplia variedad de estilos de sintaxis para declarar comentarios en el código fuente.
BlockCommenten cursiva se utiliza aquí para indicar el estilo de comentario en bloque.
InlineCommenten cursiva se utiliza aquí para indicar el estilo de comentario en línea.
lt;#code>(* BlockComment *)/code>{{efn| Fortran no admite comentarios de bloque tradicionales, pero algunos compiladores admiten directivas de preprocesador en el estilo de C / C++ , lo que permite a un programador emular comentarios de varias líneas.br/>} lt;#code>(* BlockComment *)/code>{{efn| Fortran no admite comentarios de bloque tradicionales, pero algunos compiladores admiten directivas de preprocesador en el estilo de C / C++ , lo que permite a un programador emular comentarios de varias líneas.br/>}
Véase también
- Sintaxis C
- Sintaxis de C++
- Lenguajes de programación con llaves , una amplia familia de sintaxis de lenguajes de programación
- Sintaxis de Java
- Sintaxis de JavaScript
- Sintaxis y semántica de PHP
- Sintaxis y semántica de Python
Referencias
- ^ ab Para múltiples declaraciones en una línea
- ^ Tres tipos diferentes de cláusulas, cada una separa las frases y las unidades de manera diferente:
- cláusula serial que utiliza un token continuado (por ejemplo, punto y coma): begin a; b; c end – las unidades se ejecutan en orden.
- cláusula colateral que utiliza el token and-also (es decir, ","): begin a, b, c end – el compilador debe optimizar el orden de ejecución.
- cláusula paralela que utiliza el token and-also (es decir, ","): par begin a, b, c end – las unidades deben ejecutarse en subprocesos paralelos.
- ^ punto y coma: el resultado de la declaración de retroceso está oculto, coma: el resultado se muestra
- ^ ab De la Definición del lenguaje R , sección 3.2 Estructuras de control: "Un punto y coma siempre indica el final de una declaración, mientras que una nueva línea puede indicar el final de una declaración. Si la declaración actual no está sintácticamente completa, el evaluador simplemente ignora las nuevas líneas".
- ^ Manual de referencia de Bash, 3.1.2.1 Carácter de escape
- ^ Documentación de Python, 2. Análisis léxico: 2.1.5. Unión explícita de líneas
- ^ "Mathworks.com". Archivado desde el original el 7 de febrero de 2010.
- ^ "Paréntesis/Corchetes - Windows CMD - SS64.com". ss64.com .
- ^ "Scripts - Definición y uso | AutoHotkey".
- ^ Para que un archivo M (fuente MATLAB) sea accesible por nombre, su directorio principal debe estar en la ruta de búsqueda (o directorio actual).
- ^ abc "Sintaxis detallada - F# | Microsoft Learn". Microsoft Learn . 5 de noviembre de 2021 . Consultado el 17 de noviembre de 2022 .
- ^ "Manual de Nim". nim-lang.org .
- ^ ab "Mathworks.com". Archivado desde el original el 21 de noviembre de 2013. Consultado el 25 de junio de 2013 .
- ^ "Algol68_revised_report-AB.pdf en PDF pp. 61–62, documento original pp. 121–122" (PDF) . Consultado el 27 de mayo de 2014 .
- ^ "Versión HTML del Informe revisado AB de Algol68". Archivado desde el original el 17 de marzo de 2013. Consultado el 27 de mayo de 2014 .
- ^ ab "DLang.org, Lexical" . Consultado el 27 de mayo de 2014 .
- ^ "AutoItScript.com Keyword Reference, #comments-start" (Referencia de palabras clave de AutoItScript.com, #comments-start) . Consultado el 27 de mayo de 2014 .
- ^ "slang-2.2.4/src/slprepr.c – línea 43 a 113" . Consultado el 28 de mayo de 2014 .
- ^ "Puntuación · El lenguaje Julia".
- ^ "Manual de Nim". nim-lang.org .
- ^ "Consejo de Python: puedes usar cadenas de varias líneas como comentarios de varias líneas", 11 de septiembre de 2011, Guido van Rossum
- ^ "Escribir documentación — Elixir v1.12.3" . Consultado el 28 de julio de 2023 .
- ^ "Documentación de Perl 6 (Sintaxis)". docs.perl6.org. Comentarios . Consultado el 5 de abril de 2017 .
- ^ "Uso del preprocesador FPP". Archivado desde el original el 18 de noviembre de 2022 . Consultado el 18 de noviembre de 2022 .
- ^ "Comentarios de Perl 6 POD". 25 de mayo de 2023.
- ^ "Perl 6 POD (bloques abreviados)". 25 de mayo de 2023.
Notas
- ^ Visual Basic .NET no admite comentarios tradicionales de varias líneas, pero se pueden emular mediante directivas del compilador.
- ^ ab Si bien C# admite comentarios de bloque tradicionales
/* ... */, se pueden usar directivas del compilador para imitarlos tal como en VB.NET. - ^ ab El carácter de continuación de línea
_se puede utilizar para extender un comentario de una sola línea a la siguiente línea sin necesidad de escribir'oREMde nuevo. Esto se puede hacer hasta 24 veces seguidas. - ^ Fortran no admite comentarios de bloque tradicionales, pero algunos compiladores admiten directivas de preprocesador al estilo de C / C++ , lo que permite a un programador emular comentarios de varias líneas. [24]