O slideshow foi denunciado.
Utilizamos seu perfil e dados de atividades no LinkedIn para personalizar e exibir anúncios mais relevantes. Altere suas preferências de anúncios quando desejar.

El "peor" lenguaje del mundo

54 visualizações

Publicada em

En esta charla, basada en una que dió Mark Rendle, analizamos características de varios lenguajes de programación a la vez que las combinamos para crear eso... el "peor" lenguaje posible.

Charla que di en la Commit Conf 2019

Publicada em: Software
  • Entre para ver os comentários

  • Seja a primeira pessoa a gostar disto

El "peor" lenguaje del mundo

  1. 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. 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. 3. MAD · NOV 22-23 · 2019
  4. 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. 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. 6. MAD · NOV 22-23 · 2019 APL (A Programming Language) 'Hello, World!' Creado en 1962 por Kenneth Iverson cuando trabajaba en IBM
  7. 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. 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. 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. 10. MAD · NOV 22-23 · 2019
  11. 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. 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. 13. MAD · NOV 22-23 · 2019 Nuestro propio lenguaje
  14. 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. 15. MAD · NOV 22-23 · 2019
  16. 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. 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. 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. 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. 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. 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. 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. 23. MAD · NOV 22-23 · 2019 Ruby raise InvalidFormat unless AllowedFormats.include?(format)
  24. 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. 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. 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. 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. 28. MAD · NOV 22-23 · 2019 JavaScript (3) El ; en JavaScript es opcional var foo = function() { var bar = 'baz' return { bar: bar } }
  29. 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. 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. 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. 32. MAD · NOV 22-23 · 2019
  33. 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. 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. 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. 36. MAD · NOV 22-23 · 2019 Manejo de las dependencias Versionado de paquetes Paquetes “grandes” o “pequeños”?
  37. 37. MAD · NOV 22-23 · 2019 Herramientas
  38. 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. 39. MAD · NOV 22-23 · 2019 ¡Gracias!

×