SlideShare una empresa de Scribd logo
MAD · NOV 22-23 · 2019
El peor lenguaje del mundo
(Una charla basada en una que dio Mark
Rendle en una BuildStuff)
Eduard Tomàs
Making beers. Breaking software.
@eiximenis
MAD · NOV 22-23 · 2019
¿Quien soy yo?
Empecé a desarrollar con un ZX Spectrum
Aficionado a la literatura fantastica
(buenos, nada de R. A. Salvatore) y de
ciencia ficción
Hago cerveza (y me la bebo)
Trabajo en Plain Concepts
Microsoft MVP desde 2012
MAD · NOV 22-23 · 2019
MAD · NOV 22-23 · 2019
COBOL…
IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO-WORLD.
PROCEDURE DIVISION.
DISPLAY 'Hello, world'.
STOP RUN.
Inspirado en Flow-Matic (creado por
Grace Hopper) se diseñó en 1960
MAD · NOV 22-23 · 2019
… AND IBM COBOL!
//COBUCLG JOB CLASS=A,MSGCLASS=A,MSGLEVEL=(1,1)
//HELOWRLD EXEC COBUCLG,PARM.COB='MAP,LIST,LET'
//COB.SYSIN DD *
001 IDENTIFICATION DIVISION.
002 PROGRAM-ID. 'HELLO'.
003 ENVIRONMENT DIVISION.
004 CONFIGURATION SECTION.
005 SOURCE-COMPUTER. IBM-360.
006 OBJECT-COMPUTER. IBM-360.
0065 SPECIAL-NAMES.
0066 CONSOLE IS CNSL.
007 DATA DIVISION.
008 WORKING-STORAGE SECTION.
009 77 HELLO-CONST PIC X(12) VALUE 'HELLO, WORLD'.
075 PROCEDURE DIVISION.
090 000-DISPLAY.
100 DISPLAY HELLO-CONST UPON CNSL.
110 STOP RUN.
//LKED.SYSLIB DD DSNAME=SYS1.COBLIB,DISP=SHR
// DD DSNAME=SYS1.LINKLIB,DISP=SHR
//GO.SYSPRINT DD SYSOUT=A
//
Sí, los mismos que años más tarde se
superaron con JSONx
MAD · NOV 22-23 · 2019
APL (A Programming Language)
'Hello, World!'
Creado en 1962 por Kenneth Iverson cuando trabajaba en IBM
MAD · NOV 22-23 · 2019
APL (A Programming Language)
life←{↑1 ⍵∨.∧3 4=+/,¯1 0
1∘.⊖¯1 0 1∘.⌽⊂⍵}
Creado en 1962 por Kenneth Iverson cuando trabajaba en IBM
¡Se usaban teclados especiales!
MAD · NOV 22-23 · 2019
MUMPS
Q N R,Q,C,D,E,W,B,G,H,S,T,U,V,F,L,P,N,J,A S N=$G(N),Q='N,F=Q+Q,P=F+F,W=$L($T(Q))
S W=$E(W,Q),S='N_+N,W=W-F*S,L=$G(L),R=$C(Q_F_P),R(F)=$C(F+Q_F),R(P)=$C(W-F) W #
S T=$E($T(Q+F),F,WS)_$C(W+S+F) X T S B=$P(T,$C(P_P),F),C=B(W*W),D=B-(C*W*W)W
F G=S-Q:F:S+F+Q S E=B-(C*W*W+(D*W)),H=$E($T(Q),G),@H=$S(@H<S:'Q,Q:N)_@H,T=C_D_E
F A=Q:Q:WS S J=$E(T,A),C(F)=$S(J>(F+Q)&(J<(S-F)):Q,Q:+N),C(P)=$S(J#F:Q,Q:+N) D
.S C(Q)=$S(J<(S-F):+N,Q:Q),C(F+Q)=$S(J>Q&(J<(S-F))&(J'=(P+'L))&(J'=(P)):Q,Q:+N)
.S H('L)=L F S H(N?.E)=$O(C(H('$G(N)))) Q:H('+L)=L S F(A,H('L))=C(H(W[(WS)))
F U=Q:Q:P W !,R F V=Q:Q:P+F W $S(F(V,U):'Q,Q:$C(P_(WS))) W:'(V#F) $C('N_F_F+F)
W !!,R(F)_C_R(P)_D_R(P)_E_R(F) X $RE($E($T(Q),Q+F,P+Q))_R(P)_'N W # G:N=L Q+F Q
Creado en 1966 por Neil Pappalardo, Robert Greenes and Curt Marble
Todo se puede abreviar a 1,2 ó 3 carácteres
Y el tamaño máximo de fichero estaba limitado…
hello()
write "Hello, World!",!
quit
MAD · NOV 22-23 · 2019
INTERCAL
DO ,1 SUB #5 <- #64
DO ,1 SUB #6 <- #194
DO ,1 SUB #7 <- #48
PLEASE DO ,1 SUB #8 <- #22
DO ,1 SUB #9 <- #248
DO ,1 SUB #10 <- #168
DO ,1 SUB #11 <- #24
DO ,1 SUB #12 <- #16
DO ,1 SUB #13 <- #162
PLEASE READ OUT ,1
PLEASE GIVE UP
Creado en 1972 por Don Woods y James Lyons
No usa GOTO (ya sabemos que es malo)
… pero usa COMEFROM que es peor.
MAD · NOV 22-23 · 2019
MAD · NOV 22-23 · 2019
Brainfuck
+[-[<<[+[--->]-[<<<]]]>>>-]>-.---
.>..>.<<<<-.<+.>>>>>.>.<<.<-.
El que conoce (casi) todo el mundo. De 1992 por Urban Müller
Se ejecuta sobre una máquina que es una cinta con celdas y un puntero a una de ellas
El lenguaje tiene solo 8 caracteres, que cada uno efectua una operación sobre el puntero
o bien el contenido de la celda apuntada.
MAD · NOV 22-23 · 2019
Malbolge
(=<`#9]~6ZY32Vx/4Rs+0No-
&Jk)"Fh}|Bcy?`=*z]Kw%oG4UUS0/@-ejc(:'8dc
Lo creó Ben Olmstead en 1998 con el objetivo de conseguir el lenguaje de programación
más difícil de desarrollar
De hecho se tardaron dos años en generar el primer programa válido
¡Y lo generó un algoritmo!
Parece ser que es Turing-Completo, pero no se ha demostrado al 100%
MAD · NOV 22-23 · 2019
Nuestro propio lenguaje
MAD · NOV 22-23 · 2019
Principios de diseño
Queremos que los programadores entren en él…
… y atraparlos en un mar de características inútiles, complejas o raras
No dejar que el desarrollador puede tomar decisiones en las cosas simples
Pero darle toda la libertad en las complejas
Queremos que parezca simple pero sea complicado
MAD · NOV 22-23 · 2019
MAD · NOV 22-23 · 2019
PHP
PHP == PHP Hates Programmers
Incosistencia total en el naming y el casing
Prefijo de variables inútil
Mucha de la sintaxis molesta de C/C++
… con el rendimiento de BASIC
MAD · NOV 22-23 · 2019
Primera iteración
class Greeter {
public function __construct(£name) {
£this->name = £name;
}
public function say(£thing) {
echo £thing, ' ', £this->name, BS::EOL;
}
}
MAD · NOV 22-23 · 2019
Python
Invalid code
for root, sub, files in os.walk('.'):
if 'AssemblyInfo.cs' in files:
file = os.path.join(root, 'AssemblyInfo.cs')
for line in fileinput.input(file, inplace=1):
if aiv_pattern.search(line):
print(aiv)
else:
print(line, end='')
Valid code
for root, sub, files in os.walk('.'):
if 'AssemblyInfo.cs' in files:
file = os.path.join(root, 'AssemblyInfo.cs')
for line in fileinput.input(file, inplace=1):
if aiv_pattern.search(line):
print(aiv)
else:
print(line, end='')
¡Espacios importan!
MAD · NOV 22-23 · 2019
Segunda iteración
class Greeter
public function __construct(£name)
£this->name = £name;
public function say(£thing)
echo £thing, ' ', £this->name, BS::EOL;
No es solo Python: F#, Occam, Haskell, YAML,…
MAD · NOV 22-23 · 2019
Whitespace
Lenguaje publicado en 2003 por Edwin Brady y Chris Morris.
La sintaxis solo son espacios, tabuladores y líneas en blanco
MAD · NOV 22-23 · 2019
(Casi) Cada lenguaje
null, nothing, nil, undefined, null_ptr, NULL, void, unit
Algunos como C# hasta permiten nulls en tipos “simples” (int, bool, …)
MAD · NOV 22-23 · 2019
Nuestros operadores para null
£a = null // Todo se puede asignar a null
£a->equals(null) // Falso o excepción
null->equals(£a) // Excepción siempre
£a == null // Siempre falso (nada es igual a null)
nada == null // Siempre cierto (ya que nada es igual a null)
£a is null
MAD · NOV 22-23 · 2019
Ruby
raise InvalidFormat unless AllowedFormats.include?(format)
MAD · NOV 22-23 · 2019
unless null checking
class Greeter
public function __construct(£name)
TO_TAKE_FROM_THE_BAG;
(unless £name isNot null);
£this->name = £name;
public function say(£thing)
echo £thing, ' ', £this->name, BS::EOL;
MAD · NOV 22-23 · 2019
Cadenas…
No hay lenguaje que lo haga “bien”… Vamos a arreglarlo de una vez
• ‘Hello World’  ASCII string
• ‘’Hello World’’ -> ANSI string
• “’Hello World”’ -> DBCS string
• ‘”Hello World”’ -> EBDCDIC String
• “Hello World” -> UTF8 String
• “”Hello World”” -> UTF16 String
• «Hello ⛄» -> UTF32 String
• ««Hello ⛄»» -> UTF256 String (¡hay que estar preparados!)
MAD · NOV 22-23 · 2019
JavaScript
'' == '0' // false
0 == '' // true
0 == '0' // true
false == undefined // false
false == null // false
null == undefined // true
de JavaScript: The Good Parts, by Douglas Crockford
MAD · NOV 22-23 · 2019
JavaScript (2)
[] + [] = ''
[] + {} = '[object Object]'
{} + [] = 0
{} - {} = NaN
Array(16).join(‘commitconf' - 1) + ' Batman' =
'NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
Batman'
de Gary Bernhardt’s “Wat” talk
MAD · NOV 22-23 · 2019
JavaScript (3)
El ; en JavaScript es opcional
var foo = function() {
var bar = 'baz'
return
{
bar: bar
}
}
MAD · NOV 22-23 · 2019
Tipado: ¿Estático o dinámico?
class Greeter
public function __construct(£name)
TO_TAKE_FROM_THE_BAG;
(unless £name isNot null);
£this->name = £name;
public function say(£thing isProbablyA string)
echo £thing, ' ', £this->name, BS::EOL;
MAD · NOV 22-23 · 2019
Palabras claves contextuales
En C# async/await son palabras claves contextuales
El siguiente código es válido en C#:
https://gist.github.com/jaredpar/de522f659963bf50e0fd9f24d3b00768
public class C
{
async async await(await async) => await async;
}
MAD · NOV 22-23 · 2019
Palabras clave contextuales
struct for
if isProbablyA number
else isProbablyA number
function function(£then)
if £then->if > £then->else
return £then->if
else
return £then->else
MAD · NOV 22-23 · 2019
MAD · NOV 22-23 · 2019
Manejo de memoria
Garbage collector?
Java, C#, JavaScript, Go,
Python
Automatic reference counting?
Switft, ObjetiveC, Rust, C++
100% manual?
C, C++, ObjectiveC
void f() {
int *x = malloc(sizeof(int));
*x = 1024;
printf("%dn", *x);
free(x);
}
fn f() {
let x: ~int = ~1024;
println(fmt!("%d", *x));
}
void f() {
unique_ptr<int> i = new int(1024);
cout << *foo
}
MAD · NOV 22-23 · 2019
Manejo de memoria
class Greeter
public function __construct(£name)
TO_TAKE_FROM_THE_BAG;
(unless £name isNot null);
£this->name = £name;
free &£name
public function say(*£thing isProbablyA string)
echo *£thing, ' ', £this->name, BS::EOL;
MAD · NOV 22-23 · 2019
Otras preguntas a hacernos
Metaprogamación? (templates, macros, …)
C, C++, rust
Paso por valor/referencia?
Implícito (Java, JavaScript), explícito (C#, C++, Go)
Asincronía?
Gorutinas (Go), funciones async (C#, JavaScript, Rust)
MAD · NOV 22-23 · 2019
Manejo de las dependencias
Versionado de paquetes
Paquetes “grandes” o
“pequeños”?
MAD · NOV 22-23 · 2019
Herramientas
MAD · NOV 22-23 · 2019
Versionado del lenguaje
Como C++? (C++11, C++14, C++17, C++20…)
Como JavaScript? (ES4, ES5, ES2015, ES2016,…)
Como Java? (J2SE 1.3, J2SE 1.4, J2SE 5.0, Java SE 6, Java SE 7,…)
Como dotnet? (.net core 1.0 con asp.net 5, mvc 6, EF 7 y C#7)
MAD · NOV 22-23 · 2019
¡Gracias!

Más contenido relacionado

Más de Eduard Tomàs

Esos contenedores, ¡a producción! (Commit Conf 2018)
Esos contenedores, ¡a producción! (Commit Conf 2018)Esos contenedores, ¡a producción! (Commit Conf 2018)
Esos contenedores, ¡a producción! (Commit Conf 2018)
Eduard Tomàs
 
Codemotion 2015 - Bienvenido de nuevo c++
Codemotion 2015 - Bienvenido de nuevo c++Codemotion 2015 - Bienvenido de nuevo c++
Codemotion 2015 - Bienvenido de nuevo c++
Eduard Tomàs
 
Containerize a netcore application with aks
 Containerize a netcore application with aks Containerize a netcore application with aks
Containerize a netcore application with aks
Eduard Tomàs
 
Escenarios avanzados en AKS (Global Azure Bootcamp Barcelona 2019)
Escenarios avanzados en AKS (Global Azure Bootcamp Barcelona 2019)Escenarios avanzados en AKS (Global Azure Bootcamp Barcelona 2019)
Escenarios avanzados en AKS (Global Azure Bootcamp Barcelona 2019)
Eduard Tomàs
 
Aplicaciones de consola fáciles? Más quisieramos
Aplicaciones de consola fáciles? Más quisieramosAplicaciones de consola fáciles? Más quisieramos
Aplicaciones de consola fáciles? Más quisieramos
Eduard Tomàs
 
Serverless with Azure Functions and CosmosDb
Serverless with Azure Functions and CosmosDbServerless with Azure Functions and CosmosDb
Serverless with Azure Functions and CosmosDb
Eduard Tomàs
 
Docker y todo eso... más o menos
Docker y todo eso... más o menosDocker y todo eso... más o menos
Docker y todo eso... más o menos
Eduard Tomàs
 
Microservices: Yes or not?
Microservices: Yes or not?Microservices: Yes or not?
Microservices: Yes or not?
Eduard Tomàs
 
ASP.NET MVC Core
ASP.NET MVC CoreASP.NET MVC Core
ASP.NET MVC Core
Eduard Tomàs
 
Azure functions
Azure functionsAzure functions
Azure functions
Eduard Tomàs
 
React native - Unleash the power of your device
React native - Unleash the power of your deviceReact native - Unleash the power of your device
React native - Unleash the power of your device
Eduard Tomàs
 
JavaScript in 2016 (Codemotion Rome)
JavaScript in 2016 (Codemotion Rome)JavaScript in 2016 (Codemotion Rome)
JavaScript in 2016 (Codemotion Rome)
Eduard Tomàs
 
Asp.Net Core 1.0 Deep Dive
Asp.Net Core 1.0 Deep DiveAsp.Net Core 1.0 Deep Dive
Asp.Net Core 1.0 Deep Dive
Eduard Tomàs
 
React native - t3chfest 2016
React native - t3chfest 2016React native - t3chfest 2016
React native - t3chfest 2016
Eduard Tomàs
 
React, Flux y React native
React, Flux y React nativeReact, Flux y React native
React, Flux y React native
Eduard Tomàs
 
Novedades de ASP.NET MVC6
Novedades de ASP.NET MVC6Novedades de ASP.NET MVC6
Novedades de ASP.NET MVC6
Eduard Tomàs
 
JavaScript - HTML5 - IndexedDb
JavaScript - HTML5 - IndexedDbJavaScript - HTML5 - IndexedDb
JavaScript - HTML5 - IndexedDb
Eduard Tomàs
 
Winobjc - Windows Bridge for iOS
Winobjc - Windows Bridge for iOSWinobjc - Windows Bridge for iOS
Winobjc - Windows Bridge for iOS
Eduard Tomàs
 
EcmaScript unchained
EcmaScript unchainedEcmaScript unchained
EcmaScript unchained
Eduard Tomàs
 
Introducción al desarrollo de videojuegos 2D con Wave Engine
Introducción al desarrollo de videojuegos 2D con Wave EngineIntroducción al desarrollo de videojuegos 2D con Wave Engine
Introducción al desarrollo de videojuegos 2D con Wave Engine
Eduard Tomàs
 

Más de Eduard Tomàs (20)

Esos contenedores, ¡a producción! (Commit Conf 2018)
Esos contenedores, ¡a producción! (Commit Conf 2018)Esos contenedores, ¡a producción! (Commit Conf 2018)
Esos contenedores, ¡a producción! (Commit Conf 2018)
 
Codemotion 2015 - Bienvenido de nuevo c++
Codemotion 2015 - Bienvenido de nuevo c++Codemotion 2015 - Bienvenido de nuevo c++
Codemotion 2015 - Bienvenido de nuevo c++
 
Containerize a netcore application with aks
 Containerize a netcore application with aks Containerize a netcore application with aks
Containerize a netcore application with aks
 
Escenarios avanzados en AKS (Global Azure Bootcamp Barcelona 2019)
Escenarios avanzados en AKS (Global Azure Bootcamp Barcelona 2019)Escenarios avanzados en AKS (Global Azure Bootcamp Barcelona 2019)
Escenarios avanzados en AKS (Global Azure Bootcamp Barcelona 2019)
 
Aplicaciones de consola fáciles? Más quisieramos
Aplicaciones de consola fáciles? Más quisieramosAplicaciones de consola fáciles? Más quisieramos
Aplicaciones de consola fáciles? Más quisieramos
 
Serverless with Azure Functions and CosmosDb
Serverless with Azure Functions and CosmosDbServerless with Azure Functions and CosmosDb
Serverless with Azure Functions and CosmosDb
 
Docker y todo eso... más o menos
Docker y todo eso... más o menosDocker y todo eso... más o menos
Docker y todo eso... más o menos
 
Microservices: Yes or not?
Microservices: Yes or not?Microservices: Yes or not?
Microservices: Yes or not?
 
ASP.NET MVC Core
ASP.NET MVC CoreASP.NET MVC Core
ASP.NET MVC Core
 
Azure functions
Azure functionsAzure functions
Azure functions
 
React native - Unleash the power of your device
React native - Unleash the power of your deviceReact native - Unleash the power of your device
React native - Unleash the power of your device
 
JavaScript in 2016 (Codemotion Rome)
JavaScript in 2016 (Codemotion Rome)JavaScript in 2016 (Codemotion Rome)
JavaScript in 2016 (Codemotion Rome)
 
Asp.Net Core 1.0 Deep Dive
Asp.Net Core 1.0 Deep DiveAsp.Net Core 1.0 Deep Dive
Asp.Net Core 1.0 Deep Dive
 
React native - t3chfest 2016
React native - t3chfest 2016React native - t3chfest 2016
React native - t3chfest 2016
 
React, Flux y React native
React, Flux y React nativeReact, Flux y React native
React, Flux y React native
 
Novedades de ASP.NET MVC6
Novedades de ASP.NET MVC6Novedades de ASP.NET MVC6
Novedades de ASP.NET MVC6
 
JavaScript - HTML5 - IndexedDb
JavaScript - HTML5 - IndexedDbJavaScript - HTML5 - IndexedDb
JavaScript - HTML5 - IndexedDb
 
Winobjc - Windows Bridge for iOS
Winobjc - Windows Bridge for iOSWinobjc - Windows Bridge for iOS
Winobjc - Windows Bridge for iOS
 
EcmaScript unchained
EcmaScript unchainedEcmaScript unchained
EcmaScript unchained
 
Introducción al desarrollo de videojuegos 2D con Wave Engine
Introducción al desarrollo de videojuegos 2D con Wave EngineIntroducción al desarrollo de videojuegos 2D con Wave Engine
Introducción al desarrollo de videojuegos 2D con Wave Engine
 

Último

Mi Carnaval, Aplicación web para la gestión del carnaval y la predicción basa...
Mi Carnaval, Aplicación web para la gestión del carnaval y la predicción basa...Mi Carnaval, Aplicación web para la gestión del carnaval y la predicción basa...
Mi Carnaval, Aplicación web para la gestión del carnaval y la predicción basa...
micarnavaltupatrimon
 
TARJETA MADRE DE DAYRON FABRI RUIZ-1.pptx
TARJETA MADRE DE DAYRON FABRI RUIZ-1.pptxTARJETA MADRE DE DAYRON FABRI RUIZ-1.pptx
TARJETA MADRE DE DAYRON FABRI RUIZ-1.pptx
dayronfabricioruizmo
 
primer manual de nuestra compañía de soporte
primer manual de nuestra compañía de soporteprimer manual de nuestra compañía de soporte
primer manual de nuestra compañía de soporte
eliersin13
 
DIAPOSITIVA DE LA MEMORIA RAM.PPXT.-MARIATRUJILLO.
DIAPOSITIVA DE LA MEMORIA RAM.PPXT.-MARIATRUJILLO.DIAPOSITIVA DE LA MEMORIA RAM.PPXT.-MARIATRUJILLO.
DIAPOSITIVA DE LA MEMORIA RAM.PPXT.-MARIATRUJILLO.
Maria Celeste Trujillo Cruz
 
herramientaswebpdfwww.edu.pe.edu.institutoluisevalcarcel
herramientaswebpdfwww.edu.pe.edu.institutoluisevalcarcelherramientaswebpdfwww.edu.pe.edu.institutoluisevalcarcel
herramientaswebpdfwww.edu.pe.edu.institutoluisevalcarcel
Eduardo455921
 
Introduccion al Lenguaje de Programación C++
Introduccion al Lenguaje de Programación  C++Introduccion al Lenguaje de Programación  C++
Introduccion al Lenguaje de Programación C++
PaulDelgadoSoto
 
Mi Carnaval, Aplicación web para la gestión del carnaval y la predicción basa...
Mi Carnaval, Aplicación web para la gestión del carnaval y la predicción basa...Mi Carnaval, Aplicación web para la gestión del carnaval y la predicción basa...
Mi Carnaval, Aplicación web para la gestión del carnaval y la predicción basa...
micarnavaltupatrimon
 

Último (7)

Mi Carnaval, Aplicación web para la gestión del carnaval y la predicción basa...
Mi Carnaval, Aplicación web para la gestión del carnaval y la predicción basa...Mi Carnaval, Aplicación web para la gestión del carnaval y la predicción basa...
Mi Carnaval, Aplicación web para la gestión del carnaval y la predicción basa...
 
TARJETA MADRE DE DAYRON FABRI RUIZ-1.pptx
TARJETA MADRE DE DAYRON FABRI RUIZ-1.pptxTARJETA MADRE DE DAYRON FABRI RUIZ-1.pptx
TARJETA MADRE DE DAYRON FABRI RUIZ-1.pptx
 
primer manual de nuestra compañía de soporte
primer manual de nuestra compañía de soporteprimer manual de nuestra compañía de soporte
primer manual de nuestra compañía de soporte
 
DIAPOSITIVA DE LA MEMORIA RAM.PPXT.-MARIATRUJILLO.
DIAPOSITIVA DE LA MEMORIA RAM.PPXT.-MARIATRUJILLO.DIAPOSITIVA DE LA MEMORIA RAM.PPXT.-MARIATRUJILLO.
DIAPOSITIVA DE LA MEMORIA RAM.PPXT.-MARIATRUJILLO.
 
herramientaswebpdfwww.edu.pe.edu.institutoluisevalcarcel
herramientaswebpdfwww.edu.pe.edu.institutoluisevalcarcelherramientaswebpdfwww.edu.pe.edu.institutoluisevalcarcel
herramientaswebpdfwww.edu.pe.edu.institutoluisevalcarcel
 
Introduccion al Lenguaje de Programación C++
Introduccion al Lenguaje de Programación  C++Introduccion al Lenguaje de Programación  C++
Introduccion al Lenguaje de Programación C++
 
Mi Carnaval, Aplicación web para la gestión del carnaval y la predicción basa...
Mi Carnaval, Aplicación web para la gestión del carnaval y la predicción basa...Mi Carnaval, Aplicación web para la gestión del carnaval y la predicción basa...
Mi Carnaval, Aplicación web para la gestión del carnaval y la predicción basa...
 

El "peor" lenguaje del mundo

  • 1. MAD · NOV 22-23 · 2019 El peor lenguaje del mundo (Una charla basada en una que dio Mark Rendle en una BuildStuff) Eduard Tomàs Making beers. Breaking software. @eiximenis
  • 2. MAD · NOV 22-23 · 2019 ¿Quien soy yo? Empecé a desarrollar con un ZX Spectrum Aficionado a la literatura fantastica (buenos, nada de R. A. Salvatore) y de ciencia ficción Hago cerveza (y me la bebo) Trabajo en Plain Concepts Microsoft MVP desde 2012
  • 3. MAD · NOV 22-23 · 2019
  • 4. MAD · NOV 22-23 · 2019 COBOL… IDENTIFICATION DIVISION. PROGRAM-ID. HELLO-WORLD. PROCEDURE DIVISION. DISPLAY 'Hello, world'. STOP RUN. Inspirado en Flow-Matic (creado por Grace Hopper) se diseñó en 1960
  • 5. MAD · NOV 22-23 · 2019 … AND IBM COBOL! //COBUCLG JOB CLASS=A,MSGCLASS=A,MSGLEVEL=(1,1) //HELOWRLD EXEC COBUCLG,PARM.COB='MAP,LIST,LET' //COB.SYSIN DD * 001 IDENTIFICATION DIVISION. 002 PROGRAM-ID. 'HELLO'. 003 ENVIRONMENT DIVISION. 004 CONFIGURATION SECTION. 005 SOURCE-COMPUTER. IBM-360. 006 OBJECT-COMPUTER. IBM-360. 0065 SPECIAL-NAMES. 0066 CONSOLE IS CNSL. 007 DATA DIVISION. 008 WORKING-STORAGE SECTION. 009 77 HELLO-CONST PIC X(12) VALUE 'HELLO, WORLD'. 075 PROCEDURE DIVISION. 090 000-DISPLAY. 100 DISPLAY HELLO-CONST UPON CNSL. 110 STOP RUN. //LKED.SYSLIB DD DSNAME=SYS1.COBLIB,DISP=SHR // DD DSNAME=SYS1.LINKLIB,DISP=SHR //GO.SYSPRINT DD SYSOUT=A // Sí, los mismos que años más tarde se superaron con JSONx
  • 6. MAD · NOV 22-23 · 2019 APL (A Programming Language) 'Hello, World!' Creado en 1962 por Kenneth Iverson cuando trabajaba en IBM
  • 7. MAD · NOV 22-23 · 2019 APL (A Programming Language) life←{↑1 ⍵∨.∧3 4=+/,¯1 0 1∘.⊖¯1 0 1∘.⌽⊂⍵} Creado en 1962 por Kenneth Iverson cuando trabajaba en IBM ¡Se usaban teclados especiales!
  • 8. MAD · NOV 22-23 · 2019 MUMPS Q N R,Q,C,D,E,W,B,G,H,S,T,U,V,F,L,P,N,J,A S N=$G(N),Q='N,F=Q+Q,P=F+F,W=$L($T(Q)) S W=$E(W,Q),S='N_+N,W=W-F*S,L=$G(L),R=$C(Q_F_P),R(F)=$C(F+Q_F),R(P)=$C(W-F) W # S T=$E($T(Q+F),F,WS)_$C(W+S+F) X T S B=$P(T,$C(P_P),F),C=B(W*W),D=B-(C*W*W)W F G=S-Q:F:S+F+Q S E=B-(C*W*W+(D*W)),H=$E($T(Q),G),@H=$S(@H<S:'Q,Q:N)_@H,T=C_D_E F A=Q:Q:WS S J=$E(T,A),C(F)=$S(J>(F+Q)&(J<(S-F)):Q,Q:+N),C(P)=$S(J#F:Q,Q:+N) D .S C(Q)=$S(J<(S-F):+N,Q:Q),C(F+Q)=$S(J>Q&(J<(S-F))&(J'=(P+'L))&(J'=(P)):Q,Q:+N) .S H('L)=L F S H(N?.E)=$O(C(H('$G(N)))) Q:H('+L)=L S F(A,H('L))=C(H(W[(WS))) F U=Q:Q:P W !,R F V=Q:Q:P+F W $S(F(V,U):'Q,Q:$C(P_(WS))) W:'(V#F) $C('N_F_F+F) W !!,R(F)_C_R(P)_D_R(P)_E_R(F) X $RE($E($T(Q),Q+F,P+Q))_R(P)_'N W # G:N=L Q+F Q Creado en 1966 por Neil Pappalardo, Robert Greenes and Curt Marble Todo se puede abreviar a 1,2 ó 3 carácteres Y el tamaño máximo de fichero estaba limitado… hello() write "Hello, World!",! quit
  • 9. MAD · NOV 22-23 · 2019 INTERCAL DO ,1 SUB #5 <- #64 DO ,1 SUB #6 <- #194 DO ,1 SUB #7 <- #48 PLEASE DO ,1 SUB #8 <- #22 DO ,1 SUB #9 <- #248 DO ,1 SUB #10 <- #168 DO ,1 SUB #11 <- #24 DO ,1 SUB #12 <- #16 DO ,1 SUB #13 <- #162 PLEASE READ OUT ,1 PLEASE GIVE UP Creado en 1972 por Don Woods y James Lyons No usa GOTO (ya sabemos que es malo) … pero usa COMEFROM que es peor.
  • 10. MAD · NOV 22-23 · 2019
  • 11. MAD · NOV 22-23 · 2019 Brainfuck +[-[<<[+[--->]-[<<<]]]>>>-]>-.--- .>..>.<<<<-.<+.>>>>>.>.<<.<-. El que conoce (casi) todo el mundo. De 1992 por Urban Müller Se ejecuta sobre una máquina que es una cinta con celdas y un puntero a una de ellas El lenguaje tiene solo 8 caracteres, que cada uno efectua una operación sobre el puntero o bien el contenido de la celda apuntada.
  • 12. MAD · NOV 22-23 · 2019 Malbolge (=<`#9]~6ZY32Vx/4Rs+0No- &Jk)"Fh}|Bcy?`=*z]Kw%oG4UUS0/@-ejc(:'8dc Lo creó Ben Olmstead en 1998 con el objetivo de conseguir el lenguaje de programación más difícil de desarrollar De hecho se tardaron dos años en generar el primer programa válido ¡Y lo generó un algoritmo! Parece ser que es Turing-Completo, pero no se ha demostrado al 100%
  • 13. MAD · NOV 22-23 · 2019 Nuestro propio lenguaje
  • 14. MAD · NOV 22-23 · 2019 Principios de diseño Queremos que los programadores entren en él… … y atraparlos en un mar de características inútiles, complejas o raras No dejar que el desarrollador puede tomar decisiones en las cosas simples Pero darle toda la libertad en las complejas Queremos que parezca simple pero sea complicado
  • 15. MAD · NOV 22-23 · 2019
  • 16. MAD · NOV 22-23 · 2019 PHP PHP == PHP Hates Programmers Incosistencia total en el naming y el casing Prefijo de variables inútil Mucha de la sintaxis molesta de C/C++ … con el rendimiento de BASIC
  • 17. MAD · NOV 22-23 · 2019 Primera iteración class Greeter { public function __construct(£name) { £this->name = £name; } public function say(£thing) { echo £thing, ' ', £this->name, BS::EOL; } }
  • 18. MAD · NOV 22-23 · 2019 Python Invalid code for root, sub, files in os.walk('.'): if 'AssemblyInfo.cs' in files: file = os.path.join(root, 'AssemblyInfo.cs') for line in fileinput.input(file, inplace=1): if aiv_pattern.search(line): print(aiv) else: print(line, end='') Valid code for root, sub, files in os.walk('.'): if 'AssemblyInfo.cs' in files: file = os.path.join(root, 'AssemblyInfo.cs') for line in fileinput.input(file, inplace=1): if aiv_pattern.search(line): print(aiv) else: print(line, end='') ¡Espacios importan!
  • 19. MAD · NOV 22-23 · 2019 Segunda iteración class Greeter public function __construct(£name) £this->name = £name; public function say(£thing) echo £thing, ' ', £this->name, BS::EOL; No es solo Python: F#, Occam, Haskell, YAML,…
  • 20. MAD · NOV 22-23 · 2019 Whitespace Lenguaje publicado en 2003 por Edwin Brady y Chris Morris. La sintaxis solo son espacios, tabuladores y líneas en blanco
  • 21. MAD · NOV 22-23 · 2019 (Casi) Cada lenguaje null, nothing, nil, undefined, null_ptr, NULL, void, unit Algunos como C# hasta permiten nulls en tipos “simples” (int, bool, …)
  • 22. MAD · NOV 22-23 · 2019 Nuestros operadores para null £a = null // Todo se puede asignar a null £a->equals(null) // Falso o excepción null->equals(£a) // Excepción siempre £a == null // Siempre falso (nada es igual a null) nada == null // Siempre cierto (ya que nada es igual a null) £a is null
  • 23. MAD · NOV 22-23 · 2019 Ruby raise InvalidFormat unless AllowedFormats.include?(format)
  • 24. MAD · NOV 22-23 · 2019 unless null checking class Greeter public function __construct(£name) TO_TAKE_FROM_THE_BAG; (unless £name isNot null); £this->name = £name; public function say(£thing) echo £thing, ' ', £this->name, BS::EOL;
  • 25. MAD · NOV 22-23 · 2019 Cadenas… No hay lenguaje que lo haga “bien”… Vamos a arreglarlo de una vez • ‘Hello World’  ASCII string • ‘’Hello World’’ -> ANSI string • “’Hello World”’ -> DBCS string • ‘”Hello World”’ -> EBDCDIC String • “Hello World” -> UTF8 String • “”Hello World”” -> UTF16 String • «Hello ⛄» -> UTF32 String • ««Hello ⛄»» -> UTF256 String (¡hay que estar preparados!)
  • 26. MAD · NOV 22-23 · 2019 JavaScript '' == '0' // false 0 == '' // true 0 == '0' // true false == undefined // false false == null // false null == undefined // true de JavaScript: The Good Parts, by Douglas Crockford
  • 27. MAD · NOV 22-23 · 2019 JavaScript (2) [] + [] = '' [] + {} = '[object Object]' {} + [] = 0 {} - {} = NaN Array(16).join(‘commitconf' - 1) + ' Batman' = 'NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN Batman' de Gary Bernhardt’s “Wat” talk
  • 28. MAD · NOV 22-23 · 2019 JavaScript (3) El ; en JavaScript es opcional var foo = function() { var bar = 'baz' return { bar: bar } }
  • 29. MAD · NOV 22-23 · 2019 Tipado: ¿Estático o dinámico? class Greeter public function __construct(£name) TO_TAKE_FROM_THE_BAG; (unless £name isNot null); £this->name = £name; public function say(£thing isProbablyA string) echo £thing, ' ', £this->name, BS::EOL;
  • 30. MAD · NOV 22-23 · 2019 Palabras claves contextuales En C# async/await son palabras claves contextuales El siguiente código es válido en C#: https://gist.github.com/jaredpar/de522f659963bf50e0fd9f24d3b00768 public class C { async async await(await async) => await async; }
  • 31. MAD · NOV 22-23 · 2019 Palabras clave contextuales struct for if isProbablyA number else isProbablyA number function function(£then) if £then->if > £then->else return £then->if else return £then->else
  • 32. MAD · NOV 22-23 · 2019
  • 33. MAD · NOV 22-23 · 2019 Manejo de memoria Garbage collector? Java, C#, JavaScript, Go, Python Automatic reference counting? Switft, ObjetiveC, Rust, C++ 100% manual? C, C++, ObjectiveC void f() { int *x = malloc(sizeof(int)); *x = 1024; printf("%dn", *x); free(x); } fn f() { let x: ~int = ~1024; println(fmt!("%d", *x)); } void f() { unique_ptr<int> i = new int(1024); cout << *foo }
  • 34. MAD · NOV 22-23 · 2019 Manejo de memoria class Greeter public function __construct(£name) TO_TAKE_FROM_THE_BAG; (unless £name isNot null); £this->name = £name; free &£name public function say(*£thing isProbablyA string) echo *£thing, ' ', £this->name, BS::EOL;
  • 35. MAD · NOV 22-23 · 2019 Otras preguntas a hacernos Metaprogamación? (templates, macros, …) C, C++, rust Paso por valor/referencia? Implícito (Java, JavaScript), explícito (C#, C++, Go) Asincronía? Gorutinas (Go), funciones async (C#, JavaScript, Rust)
  • 36. MAD · NOV 22-23 · 2019 Manejo de las dependencias Versionado de paquetes Paquetes “grandes” o “pequeños”?
  • 37. MAD · NOV 22-23 · 2019 Herramientas
  • 38. MAD · NOV 22-23 · 2019 Versionado del lenguaje Como C++? (C++11, C++14, C++17, C++20…) Como JavaScript? (ES4, ES5, ES2015, ES2016,…) Como Java? (J2SE 1.3, J2SE 1.4, J2SE 5.0, Java SE 6, Java SE 7,…) Como dotnet? (.net core 1.0 con asp.net 5, mvc 6, EF 7 y C#7)
  • 39. MAD · NOV 22-23 · 2019 ¡Gracias!

Notas del editor

  1. ssss
  2. ssss
  3. ssss
  4. ssss
  5. ssss
  6. ssss