Hola lenguaje de programación: comenzando a diseñar

Estamos empezando a diseñar el lenguaje de programación Hi . Aquí hay una introducción y algunas respuestas a preguntas sobre por qué es necesario. Sin embargo, y sin una buena razón, el diseño del lenguaje es una tarea inusualmente interesante si se lo toma en serio.



Siguiendo nuestra tesis de máxima accesibilidad para el aprendizaje, intentaremos integrar lógicamente todos los elementos básicos del lenguaje a partir de los elementos más utilizados de otros lenguajes algorítmicos. Aquí seguimos la lógica interna dada en el primer artículo y el supuesto de que la composición de las entidades de varios lenguajes populares facilitará la captación de nuevos contenidos con menos esfuerzo, ya que las personas tienen incorporada una máquina integradora basada en redes neuronales que introduce automáticamente violaciones de parte de semántica. soobscheni.



La idea de construir nuevos lenguajes a partir de elementos ya conocidos tiene una larga historia. Hace más de 140 años, el Dr. Zamenhof creó el idioma artificial del esperanto a partir de las partes constituyentes de otros idiomas naturales. El idioma resultó ser tan lógico y fácil de aprender que resultó ser viable y sobrevivió hasta el día de hoy. Por ejemplo, está disponible en Google Translate. Saluton Habr! Bonvenon sub la kat!



Intentemos diseñar un lenguaje que sea conveniente para la programación rápida de juegos y acertijos intelectuales, y cuyo uso complacerá con su lógica y consideración.



Comentarios



Para un comentario de una línea, use el símbolo # (Python, R, Ruby). La combinación // (C y muchos otros lenguajes) se puede usar como un operador de división de enteros para obtener el resultado de una operación como un número real, para no usar en este caso una expresión de conversión algo engorrosa como CGFloat (int), como en Swift.



PRINT “Hi world\n”
#  Hi world     


Para resaltar comentarios de varias líneas, use la combinación ## .

##   .
,      Python ##


La elección del símbolo # también es conveniente porque en el futuro lo utilizará el intérprete de lenguaje Hi para procesar metaetiquetas en el texto del programa que se pueden sintetizar a partir del texto de los comentarios. Esto es un poco como el preprocesador en C / C ++, que, por cierto, también usa el símbolo #.



Tipos de datos elementales



El lenguaje Hi en la edición básica utiliza tres tipos de datos elementales:



Binario: BOOL

Operaciones posibles: & (y), | (o), ~ (no)

LET true = TRUE 
LET false = FALSE
PRINT true & true   #  TRUE
PRINT true | false   #  TRUE
PRINT ~true   #  FALSE


Enteros: INT

Operaciones posibles: + , - , * , / (división de enteros), % (resto), // (división con conversión automática del resultado al tipo REAL)

VAR i = 0
PRINT (i + 6 – 2) * 3 / 5   #  2


Números reales: REAL

Operaciones posibles: + , - , * , /

VAR pi = 3.1415926535


Instrumentos de cuerda



Las cadenas son de tipo compuesto porque se tratan como una cadena de caracteres Unicode

LET the_force = “flow through you”


No utilizamos comillas simples para cadenas literales, ya que los caracteres, especialmente los que se encuentran en el teclado estándar, son un recurso valioso para el futuro.

Operaciones de cadena estándar:

# 
VAR language = “C”
LET statement  = “ – the best language ever”
LET proposition = language + statement
language = “Python”


Por ahora, no necesitamos introducir un tipo de datos del tipo Character; para resolver problemas prácticos, puede utilizar ...

#    
LET secondSym = language[2]


El resultado de la asignación en el caso de que la referencia del índice esté fuera de la cadena es "" y no conduce a un error de tiempo de ejecución.



Constantes y variables



Como vimos en los ejemplos anteriores, Hi es un lenguaje escrito de forma estática para reducir la probabilidad de errores en el uso de identificadores y una mejor comprensión de su propósito. Las constantes ( LET ) y las variables ( VAR ) deben declararse antes del primer uso del objeto. Es más ergonómico declarar tipos sin especificar explícitamente un tipo específico asignando valores iniciales; en este caso, la inferencia de tipos se vuelve obvia.

##  
LET one: INT = 1  : ##
LET one = 1
VAR boolean = TRUE


El concepto de declarar constantes y variables let y var se toma prestado de Swift, pero en Hi es posible hacer múltiples declaraciones con la asignación de un valor:

VAR i, j, k = 0


Entrada y salida estándar



La entrada de datos desde el teclado se realiza mediante el comando INPUT :

VAR startFrom: INT
PRINT "Start from: "; INPUT startFrom


No es necesario que escriba verdadero o falso para ingresar un valor BOOL. La aplicación móvil para programación, que estamos preparando para su lanzamiento en la AppStore, es lo suficientemente inteligente como para mostrar solo dos botones con una opción binaria en este caso. Asimismo, se mostrará un teclado numérico sin un punto para ingresar un número entero y un teclado normal para ingresar un valor de texto.



El comando PRINT imprime líneas en una pantalla de tipo de pantalla de consola. El valor predeterminado es 20 líneas de 40 caracteres. Puede seleccionar el modo con caracteres grandes 10 X 20 o pequeños: 40 X 80.

PRINT "     Hi language"


Hola, idioma de la calculadora



Ahora tenemos todo para formar una gramática de calculadora con entrada-salida interactiva en forma de EBNF en términos del lenguaje Hi.

1. The Syntax of HI Programming Language

digit = "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9".
capital = "A" | ... | "Z".
small = "a" | ... | "z".
character = [Unicode_character].
addOperator = "+" | "-" | "|".
mulOperator = "*" | "/" | "//" | "%" | "&".
relation = "==" | "~=" | "<" | "<=" | ">" | ">=".

integer = digit {digit}.
real = digit {digit} "." {digit}.
string = """ {character} """.

number = integer | real.
letter = capital | small.

keyword = capital capital {capital}.
ident = letter {letter | digit}.
type = keyword.

factor = number | string | TRUE | FALSE | ident | "(" expression ")" | "~" factor.
term = factor {mulOperator factor}.
simpleExpression = ["-"] term {addOperator term}.
expression = simpleExpression [relation simpleExpression].
assignment = ident "=" expression.

identList = ident {"," ident}.
expList = expression {"," expression}.
constDeclaration = LET identList [":" type] "=" expression.
varDeclaration = VAR identList [":" type] ["=" expression].
funcCall = keyword [expList ].

statement = assignment | funcCall | constDeclaration | varDeclaration 
statementSequence = statement {("\n" | ";") statement}.

2. Standard Data Types

BOOL	INT	REAL	STRING

3. Standard Procedures and Functions

INPUT	PRINT

4. Other Keywords

LET	VAR


A diferencia de la gramática de muchos idiomas, donde las palabras clave se incluyen en la lista de excepciones de una clase más general de identificadores, introducimos un tipo especial de token: palabra clave, que ya se reconoce en el nivel del escáner de intérpretes de idiomas Hi.



En el próximo artículo, presentaremos los tipos de datos compuestos en Hi además de STRING. Para nuestro lenguaje simple, son lo suficientemente poderosos como para expresar fácilmente ideas de manipulación de conjuntos de objetos, matrices y diccionarios.



All Articles