August 31, 2020.

TablaM: Un lenguaje relacional practico

Entré en https://repl.it/jam con TablaM, un experimento para construir un lenguaje de programación relacional.

Empecé a programar en la década de 1990 con FoxPro, un entorno de programación de stack completo (en ese momento no usamos nombres geniales como "stack completo") donde era natural usar bases de datos ... y fue MUY productivo.

Podía hacer TODO (formularios, informes, bases de datos, utilidades, etc.) con un único lenguaje y entorno.

Microsoft, en un movimiento muy extraño, lo mata junto con Visual Basic (impactante porque era el lenguaje MÁS popular en ese momento) cuando intenta pasar todo a .NET. Así que todos saltan del barco y el único remanente de la idea está representado hoy por Access y algunas otras herramientas, casi todas propietarias, atrapadas en el pasado o en pedazos de lo que chicos en estos días llaman "NoSql / BigData", que tienen una mayor complejidad.

Ahora, después de usar más de 12 idiomas y más frameworks y bibliotecas que puedo contar, quiero recuperar esa experiencia: Una herramienta diseñada para datos, donde los datos son tan importantes como el código y para usarlo no se requieren ORMs u otras herramientas que causen el conocido impedance mismatch.

Esto significa que si la mayoría de los lenguajes se centran en detalles de bajo nivel o en ingeniería en general, TablaM se adaptará con algunas decisiones de diseño pequeñas y grandes para que sea agradable escribir aplicaciones para comercio electrónico, finanzas, ERP y similares.

La característica más distintiva del lenguaje es el uso del modelo relacional como base para su funcionamiento. Esto nos permite proporcionar un conjunto de operaciones universales y consistentes que facilitan la manipulación de datos.

Por ejemplo, donde la mayoría de los idiomas tienen diferentes métodos para "consultar" elementos (a veces llamados search, otras veces get o find o filter o ...), lo que significa que debes aprender todas las formas diferentes que cambian de acuerdo con el contexto o el tipo de objeto que estás usando, en TablaM es solo ?where, y TODOS los valores, incluso archivos, bases de datos, sockets, números, texto, etc ... se puede consultar con el mismo conjunto de operadores. Y no necesitas codificarlos, porque están disponibles universalmente.

Una pequeña muestra del idioma según lo planeado (qué funciona hoy está en el sitio oficial):

-- A column, aka: Vectors...
let qty := [10.5, 4.0, 3.0] 

-- Like APL/kdb+ operations apply to more than scalars
qty * 16.0 
-- Show: Vec[it:Dec; 168.00; 64.00; 48.00]

-- The ? (query) operator allow to do SQL-like queries to anything
let doubled := qty ?select #0 * 2.0 

-- like files!
let products := open("products.csv")

-- and is streamed, so can query big ones
for p in products ?where #price > 0.0 do
    print(p)
end

-- so, we can do joins between anything:
for p in cross(products, qty) ?limit 10 do
	print(p.products.price * p.qty)
end

-- No nulls, we have proper algebraic types
type Status = case Pay, NotPay end

-- Use databases:
use db.sqlite
let db := sqlite.open("data.db")

for sale in db.invoices ?status = Status.Pay do
	print(sale)
end

Entonces, ¿qué tipo de lenguaje es TablaM?

Nota: Los elementos marcados **(tbd) **están en la hoja de ruta ...

  • Implementado en el lenguaje de programación Rust.
  • Disponible para las principales plataformas de 64 bits (Linux, Windows, MacOS, iOS (tbd), Android (tbd)).
  • Fácil de incrustar en otros idiomas, similar a Lua. (tbd)
  • Multi-paradigma, pero fuertemente basado en el modelo relacional. También proporcione capacidades funcionales, de matriz e imperativas.
  • Los valores inmutables son los predeterminados, pero permiten los mutables.
  • No hay null!
  • Proporciona matemática decimal como valor predeterminado, en lugar de coma flotante binaria, lo que lo hace mejor para las aplicaciones comerciales.
  • Proporciona tipos de fecha como tipo primitivo, en lugar de usar algunas bibliotecas externas (o una biblioteca incorporada fea) para operarlo.
  • Proporcionar tipos de datos algebraicos (tbd).
  • Proporcione una experiencia similar a SQL / LINQ en cualquier relación. Como otros lenguajes dicen "cualquier cosa es un objeto", en TablaM, "cualquier cosa es una relación".
  • Soporte integrado para una variedad de protocolos, formatos y transformación de datos (tbd).
  • No se necesitan ORMs. Hable directamente con las principales bases de datos RDBMS / SQL (PostgreSQL, MySql, SQL Server, SQLite) (tbd).

Hemos preparado este material para este concurso:

Sitio oficial: https://tablam.org

Código: https://github.com/Tablam/TablaM

Nota: ¡No se deje engañar por la abundancia de documentos! El código aún está muy temprano en su progreso ...