SlideShare una empresa de Scribd logo
1 de 41
Descargar para leer sin conexión
Enlighten your software
Diseño de compiladores:
un vistazo a Ceylon-JS
Enrique Zamudio López
@chochosmx
Ceylon
• Lenguaje con tipado estático
• Múltiples backends
• Java
• JavaScript
• Sistema de manejo de dependencias basado en
módulos
Ceylon
• Lenguaje con tipado estático
• Múltiples backends
• Java
• JavaScript
• Sistema de manejo de dependencias basado en
módulos
¿Cómo funciona un
compilador?
print "hola"
1100100100011
1001010101100
1000101001010
0001011010101
?
Ceylon-JS
shared void run() =>
print("hola");
function run() {
m$1.print("hola");
}
ex$.run=run;?
?
Frontend / Backend
B
F
Fases
321
Crear modelo
• Cargar modelo del módulo de lenguaje
• Cargar modelos foráneos sobre demanda
• Tenemos dos tipos especiales:
• Nothing
• Unknown
Parse
shared void run =>
print( )"hola" ;
()
ANTLR
Another Tool for Language Recognition
^(abstract MEMBER_OR_TYPE_EXPRESSION:PRIMARY
Reference target;
Declaration declaration;
List<Type> signature;
boolean ellipsis;
boolean directlyInvoked;
boolean assigned;
boolean staticMethodReference;
boolean staticMethodReferencePrimary;)
ANTLR
Another Tool for Language Recognition
NATURAL_LITERAL
: Digits
(
('.' ('0'..'9')) =>
'.' Digits (Exponent|Magnitude|FractionalMagnitude)? { $type =
FLOAT_LITERAL; }
| FractionalMagnitude { $type = FLOAT_LITERAL; }
| Magnitude?
)
| '#' HexDigits
| '$' BinaryDigits
;
Parse
shared void run =>
print( )"hola" ;
()
ANTLR
shared
void
run
print
()
"hola"
()
Asignar tipos
shared
run
print
()
"hola"
()
String
Anything
[Anything]
Anything
SharedAnnotation
[]
Abstract Syntax Tree
MethodDeclaration
AnnotationList
Annotation
Identifier
ParameterListLazySpecifierExpression
Expression
InvocationExpression
BaseMemberExpression
PositionalArgumentList
ListedArgument
Expression
BaseMemberExpression
Identifier
Identifier
StringLiteral
Visitor
visit(BaseMemberExpression that) {...}
visit(ClassDefinition that) {...}
visit(Comprehension that) {...}
visit(InvocationExpression that) {...}
visit(LazySpecifierExpression that) {...}
visit(MethodDeclaration that) {...}
visit(QualifiedTypeExpression that) {...}
visit(SequencedArgument that) {...}
visit(SpecifierStatement that) {...}
visit(StringLiteral that) {...}
visit(SumOp that) {...}
Frontend
Abstract Syntax Tree
AST validado, tipos asignados, referencias a
declaraciones, modelo completo
Backends
• Java
• JavaScript
• CeylonDoc
Cada backend genera y carga modelo en
formato accesible en tiempo de ejecución
Java Backend
• Modelo basado en anotaciones
• Utiliza javac para generar un AST en Java y
a partir de ahí, bytecode
CeylonDoc
• Usa cualquiera de los
dos modelos (JS/Java)
• Genera páginas HTML
a partir de las
anotaciones doc
JavaScript Backend
• Modelo en formato JSON
• Genera código JavaScript encapsulado en un
módulo en formato CommonJS
Abstract Syntax Tree
MethodDeclaration
AnnotationList
Annotation
Identifier
ParameterListLazySpecifierExpression
Expression
InvocationExpression
BaseMemberExpression
PositionalArgumentList
ListedArgument
Expression
BaseMemberExpression
Identifier
Identifier
StringLiteral
public void visit(final Tree.Block that) {
List<Statement> stmnts = that.getStatements();
if (stmnts.isEmpty()) {
out("{}");
} else {
beginBlock();
visitStatements(stmnts);
endBlock();
}
}
public void visit(final Tree.InOp that) {
box(that.getRightTerm());
out(".contains(");
if (!isNaturalLiteral(that.getLeftTerm())) {
box(that.getLeftTerm());
}
out(")");
}
public void visit(final Tree.ClassDefinition that) {
if (opts.isOptimize() &&
that.getDeclarationModel().isClassOrInterfaceMember())
return;
TypeGenerator.classDefinition(that, this);
}
public void visit(final Tree.Comprehension that) {
new ComprehensionGenerator(this, names,
directAccess).generateComprehension(that);
}
public void visit(final Tree.SequenceEnumeration that) {
SequenceGenerator.sequenceEnumeration(that, this);
}
public void visit(final Tree.ObjectArgument that) {
FunctionHelper.objectArgument(that, this);
}
public void visit(Tree.LetExpression that) {
FunctionHelper.generateLet(that, directAccess, this);
}
Ceylon JavaScript
• Funciones nivel tope
• Funciones orden
superior
• Referencias a
funciones
• Objetos
✓
✓
✓
✓
Ceylon JavaScript
• Tipado fuerte
• Clases, interfaces,
constructores, tipos
anidados
• Genéricos
• Reificados
• Metamodelo
• Inmutabilidad
• Scoping
• Invocaciones por
nombre
• Interpolación
• Expresiones inline
✕
✕
✕
✕
✕
😐
✕
✕
✕
😐
Ceylon JavaScript
• Comprensiones
• Múltiples listas de
parámetros
• Alias de tipos
• Singletons
✕
😐
✕
✕
Ceylon JavaScript
• this
• outer 😡
Ejemplo: Clase simple
shared class Ejemplo(uno, dos) {
shared String uno;
shared variable Integer dos;
shared String algo(String x) {
value z = "``uno`` y ``x``";
return z.uppercased;
}
shared Ejemplo clone() =>
Ejemplo(uno, dos);
}
Clase en JS
function Ejemplo(uno,dos,ejemplo$) {
$init$Ejemplo();
if(ejemplo$===undefined)
ejemplo$=new Ejemplo.$$;
ejemplo$.uno_=uno;
ejemplo$.dos_=dos;
return ejemplo$;
}
Clase en JS
Ejemplo.$crtmm$=function(){
return{
mod:$CCMM$,'super':{t:m$1.Basic},
ps:[
{nm:'uno',mt:'prm',$t:{t:m$1.$_String},pa:1},
{nm:'dos',mt:'prm',$t:{t:m$1.Integer},pa:1025}
],pa:1,d:['','Ejemplo']
};
};
ex$.Ejemplo=Ejemplo;
Clase en JS
function Ejemplo(uno,dos,ejemplo$) {
$init$Ejemplo();
if(ejemplo$===undefined)
ejemplo$=new Ejemplo.$$;
ejemplo$.uno_=uno;
ejemplo$.dos_=dos;
return ejemplo$;
}
Clase en JS
m$1.initTypeProto(Ejemplo,'Ejemplo',m$1.Basic);
...
m$1.atr$(ejemplo$,'dos',
function(){return this.dos_;},
function($2){return this.dos_=$2;},
function(){return{mod:...,$t:{t:m$1.Integer},$cont:Ejemplo,...};});
ejemplo$.algo=function($3){
var ejemplo$=this;
var $4="".plus(ejemplo$.uno).plus(" y ").plus($3).plus("");
return $4.uppercased;
};
ejemplo$.algo.$crtmm$=function(){return{mod:...,$t:{t:m$1.$_String},ps:[
{nm:'x',mt:'prm',$t:{t:m$1.$_String}}],$cont:Ejemplo,pa:1,d:
['','Ejemplo','$m','algo']};};
Inmutabilidad
m$1.atr$(ejemplo$,'uno',function(){return
this.uno_;},undefined,function(){return{mod:$CCMM$,$t:{t:m$1.$_String},
$cont:Ejemplo,pa:1,d:['','Ejemplo','$at','uno']};});
var x = Ejemplo("1",2);
x.uno="2";
x.uno=="2"; //false
x.dos=5;
x.dos==5; //true
Invocación por nombre
value x = Ejemplo {
dos = 5;
uno = "uno";
};
var $5=($6=(5),$7="uno",Ejemplo($7,$6));
var $6,$7;
Invocación con spread
value t=["uno",2];
value x=Ejemplo(*t);
var $5=m$1.tpl$(["uno",2],
m$1.mtt$([{t:m$1.$_String},{t:m$1.Integer}]));
var $6=Ejemplo($5.$_get(0), $5.$_get(1));
Referencia a Método
shared class Ejemplo(uno, dos) {
shared String uno;
shared variable Integer dos;
shared String algo<Algo>(Algo x)
given Algo satisfies Object {
value z = "``uno`` y ``x``";
return z.uppercased;
}
shared Ejemplo clone() =>
Ejemplo(uno, dos);
}
Referencia a Método
value o = Ejemplo("a",2);
value r1 = o.algo<Integer>;
value r2 = Ejemplo.algo<String>;
r1(1);
r2(o)("otra cosa");
Referencia a Método
value o = Ejemplo("a",2);
value r = Ejemplo.algo<String>;
r(o)("otra cosa");
var $5=Ejemplo("a",2);
var $6=m$1.$JsCallable(function(x){
return m$1.JsCallable(x,x.algo,
{Algo$algo:{t:m$1.$_String}});
},[{nm:'p2',mt:'prm',$t:{t:Ejemplo}}],
{Return$Callable:{t:m$1.Callable,a:{Return$Callable:{t:m$1.$_String},Arguments
$Callable:m$1.mtt$([{t:m$1.$_String}])}},Arguments$Callable:m$1.mtt$
([{t:Ejemplo}])});
$6($5)("otra cosa");
Enlighten your software
¿Preguntas?
@chochosmx
enrique@ceylon-lang.org
github.com/chochos

Más contenido relacionado

La actualidad más candente

Taller SoraScript para HAEduc 1
Taller SoraScript para HAEduc 1Taller SoraScript para HAEduc 1
Taller SoraScript para HAEduc 1hsg2020
 
7. Utilización de mecanismos de comunicación asíncrona
7. Utilización de mecanismos de comunicación asíncrona7. Utilización de mecanismos de comunicación asíncrona
7. Utilización de mecanismos de comunicación asíncronaLaura Folgado Galache
 
5. Interacción con el usuario: eventos y formularios
5. Interacción con el usuario: eventos y formularios5. Interacción con el usuario: eventos y formularios
5. Interacción con el usuario: eventos y formulariosLaura Folgado Galache
 
Hack (Lenguaje de Programacion)
Hack (Lenguaje de Programacion)Hack (Lenguaje de Programacion)
Hack (Lenguaje de Programacion)Elwin Huaman
 
Clase8 innerclasses
Clase8 innerclassesClase8 innerclasses
Clase8 innerclassesjorg_marq
 
Introducción a PHP 5.4
Introducción a PHP 5.4Introducción a PHP 5.4
Introducción a PHP 5.4El Taller Web
 
Java: Entrada y salida de datos por consola en windows.
Java: Entrada y salida de datos por consola en windows.Java: Entrada y salida de datos por consola en windows.
Java: Entrada y salida de datos por consola en windows.Sergio
 
Práctica Completa en Flash – ActionScript
Práctica Completa en Flash – ActionScriptPráctica Completa en Flash – ActionScript
Práctica Completa en Flash – ActionScriptjubacalo
 
PARADIGMAS FP Y OOP USANDO TÉCNICAS AVANZADAS DE PROGRAMACIÓN ASÍNCRONA
PARADIGMAS FP  Y OOP USANDO TÉCNICAS AVANZADAS DE PROGRAMACIÓN ASÍNCRONAPARADIGMAS FP  Y OOP USANDO TÉCNICAS AVANZADAS DE PROGRAMACIÓN ASÍNCRONA
PARADIGMAS FP Y OOP USANDO TÉCNICAS AVANZADAS DE PROGRAMACIÓN ASÍNCRONAVíctor Bolinches
 
Creación indices y constraints en bases de datos de sql server
Creación indices y constraints en bases de datos de sql serverCreación indices y constraints en bases de datos de sql server
Creación indices y constraints en bases de datos de sql serverCarlos Flores Glez
 
Taller de programación clase #2
Taller de programación   clase #2Taller de programación   clase #2
Taller de programación clase #2Juan Cardona
 

La actualidad más candente (18)

Taller SoraScript para HAEduc 1
Taller SoraScript para HAEduc 1Taller SoraScript para HAEduc 1
Taller SoraScript para HAEduc 1
 
7. Utilización de mecanismos de comunicación asíncrona
7. Utilización de mecanismos de comunicación asíncrona7. Utilización de mecanismos de comunicación asíncrona
7. Utilización de mecanismos de comunicación asíncrona
 
5. Interacción con el usuario: eventos y formularios
5. Interacción con el usuario: eventos y formularios5. Interacción con el usuario: eventos y formularios
5. Interacción con el usuario: eventos y formularios
 
Hack (Lenguaje de Programacion)
Hack (Lenguaje de Programacion)Hack (Lenguaje de Programacion)
Hack (Lenguaje de Programacion)
 
Clase8 innerclasses
Clase8 innerclassesClase8 innerclasses
Clase8 innerclasses
 
Introducción a PHP 5.4
Introducción a PHP 5.4Introducción a PHP 5.4
Introducción a PHP 5.4
 
Java: Entrada y salida de datos por consola en windows.
Java: Entrada y salida de datos por consola en windows.Java: Entrada y salida de datos por consola en windows.
Java: Entrada y salida de datos por consola en windows.
 
Eventos-en-visual-basic-60
Eventos-en-visual-basic-60Eventos-en-visual-basic-60
Eventos-en-visual-basic-60
 
Java 8
Java 8Java 8
Java 8
 
Programas en netbeans
Programas en netbeansProgramas en netbeans
Programas en netbeans
 
Práctica Completa en Flash – ActionScript
Práctica Completa en Flash – ActionScriptPráctica Completa en Flash – ActionScript
Práctica Completa en Flash – ActionScript
 
PARADIGMAS FP Y OOP USANDO TÉCNICAS AVANZADAS DE PROGRAMACIÓN ASÍNCRONA
PARADIGMAS FP  Y OOP USANDO TÉCNICAS AVANZADAS DE PROGRAMACIÓN ASÍNCRONAPARADIGMAS FP  Y OOP USANDO TÉCNICAS AVANZADAS DE PROGRAMACIÓN ASÍNCRONA
PARADIGMAS FP Y OOP USANDO TÉCNICAS AVANZADAS DE PROGRAMACIÓN ASÍNCRONA
 
Semana 2 Fundamentos de Python(Ciclos y Listas)
Semana 2   Fundamentos de Python(Ciclos y Listas)Semana 2   Fundamentos de Python(Ciclos y Listas)
Semana 2 Fundamentos de Python(Ciclos y Listas)
 
Ejemplo de aplicación cliente-servidor en C#
Ejemplo de aplicación cliente-servidor  en C#Ejemplo de aplicación cliente-servidor  en C#
Ejemplo de aplicación cliente-servidor en C#
 
Creación indices y constraints en bases de datos de sql server
Creación indices y constraints en bases de datos de sql serverCreación indices y constraints en bases de datos de sql server
Creación indices y constraints en bases de datos de sql server
 
Doctrine2 sf2Vigo
Doctrine2 sf2VigoDoctrine2 sf2Vigo
Doctrine2 sf2Vigo
 
Java
JavaJava
Java
 
Taller de programación clase #2
Taller de programación   clase #2Taller de programación   clase #2
Taller de programación clase #2
 

Similar a Diseño compiladores, Ceylon JS

Similar a Diseño compiladores, Ceylon JS (20)

Los lenguajes de la web
Los lenguajes de la webLos lenguajes de la web
Los lenguajes de la web
 
Javascript - 2014
Javascript - 2014Javascript - 2014
Javascript - 2014
 
Javascript Básico
Javascript BásicoJavascript Básico
Javascript Básico
 
03. Introduccion a JavaScript y JQuery
03. Introduccion a JavaScript y JQuery03. Introduccion a JavaScript y JQuery
03. Introduccion a JavaScript y JQuery
 
Creación de Builders y DSL's con Groovy
Creación de Builders y DSL's con GroovyCreación de Builders y DSL's con Groovy
Creación de Builders y DSL's con Groovy
 
Asp vNext Is Comming
Asp vNext Is CommingAsp vNext Is Comming
Asp vNext Is Comming
 
32773 php-basico
32773 php-basico32773 php-basico
32773 php-basico
 
Dart como alternativa a TypeScript (Codemotion 2016)
Dart como alternativa a TypeScript (Codemotion 2016)Dart como alternativa a TypeScript (Codemotion 2016)
Dart como alternativa a TypeScript (Codemotion 2016)
 
Fundamento de poo en php
Fundamento de poo en phpFundamento de poo en php
Fundamento de poo en php
 
P2C2 Introducción a JEE5
P2C2 Introducción a JEE5P2C2 Introducción a JEE5
P2C2 Introducción a JEE5
 
Sistemas de tipos: Lo bueno, lo malo y lo feo
Sistemas de tipos: Lo bueno, lo malo y lo feoSistemas de tipos: Lo bueno, lo malo y lo feo
Sistemas de tipos: Lo bueno, lo malo y lo feo
 
Jquery
JqueryJquery
Jquery
 
Concurrency with Promise Style – Rayco Araña
Concurrency with Promise Style – Rayco ArañaConcurrency with Promise Style – Rayco Araña
Concurrency with Promise Style – Rayco Araña
 
Sockets al limite, como explotar los sockets al límite en un proyecto de Symf...
Sockets al limite, como explotar los sockets al límite en un proyecto de Symf...Sockets al limite, como explotar los sockets al límite en un proyecto de Symf...
Sockets al limite, como explotar los sockets al límite en un proyecto de Symf...
 
Introducción a Scala
Introducción a ScalaIntroducción a Scala
Introducción a Scala
 
TUTORIAL JAVA
TUTORIAL JAVATUTORIAL JAVA
TUTORIAL JAVA
 
JAVA.PPT
JAVA.PPTJAVA.PPT
JAVA.PPT
 
JAVA (1).PPT
JAVA (1).PPTJAVA (1).PPT
JAVA (1).PPT
 
JAVA (1).PPT
JAVA (1).PPTJAVA (1).PPT
JAVA (1).PPT
 
Estructuras de control en la POO
Estructuras de control en la POOEstructuras de control en la POO
Estructuras de control en la POO
 

Más de Software Guru

Hola Mundo del Internet de las Cosas
Hola Mundo del Internet de las CosasHola Mundo del Internet de las Cosas
Hola Mundo del Internet de las CosasSoftware Guru
 
Estructuras de datos avanzadas: Casos de uso reales
Estructuras de datos avanzadas: Casos de uso realesEstructuras de datos avanzadas: Casos de uso reales
Estructuras de datos avanzadas: Casos de uso realesSoftware Guru
 
Building bias-aware environments
Building bias-aware environmentsBuilding bias-aware environments
Building bias-aware environmentsSoftware Guru
 
El secreto para ser un desarrollador Senior
El secreto para ser un desarrollador SeniorEl secreto para ser un desarrollador Senior
El secreto para ser un desarrollador SeniorSoftware Guru
 
Cómo encontrar el trabajo remoto ideal
Cómo encontrar el trabajo remoto idealCómo encontrar el trabajo remoto ideal
Cómo encontrar el trabajo remoto idealSoftware Guru
 
Automatizando ideas con Apache Airflow
Automatizando ideas con Apache AirflowAutomatizando ideas con Apache Airflow
Automatizando ideas con Apache AirflowSoftware Guru
 
How thick data can improve big data analysis for business:
How thick data can improve big data analysis for business:How thick data can improve big data analysis for business:
How thick data can improve big data analysis for business:Software Guru
 
Introducción al machine learning
Introducción al machine learningIntroducción al machine learning
Introducción al machine learningSoftware Guru
 
Democratizando el uso de CoDi
Democratizando el uso de CoDiDemocratizando el uso de CoDi
Democratizando el uso de CoDiSoftware Guru
 
Gestionando la felicidad de los equipos con Management 3.0
Gestionando la felicidad de los equipos con Management 3.0Gestionando la felicidad de los equipos con Management 3.0
Gestionando la felicidad de los equipos con Management 3.0Software Guru
 
Taller: Creación de Componentes Web re-usables con StencilJS
Taller: Creación de Componentes Web re-usables con StencilJSTaller: Creación de Componentes Web re-usables con StencilJS
Taller: Creación de Componentes Web re-usables con StencilJSSoftware Guru
 
El camino del full stack developer (o como hacemos en SERTI para que no solo ...
El camino del full stack developer (o como hacemos en SERTI para que no solo ...El camino del full stack developer (o como hacemos en SERTI para que no solo ...
El camino del full stack developer (o como hacemos en SERTI para que no solo ...Software Guru
 
¿Qué significa ser un programador en Bitso?
¿Qué significa ser un programador en Bitso?¿Qué significa ser un programador en Bitso?
¿Qué significa ser un programador en Bitso?Software Guru
 
Colaboración efectiva entre desarrolladores del cliente y tu equipo.
Colaboración efectiva entre desarrolladores del cliente y tu equipo.Colaboración efectiva entre desarrolladores del cliente y tu equipo.
Colaboración efectiva entre desarrolladores del cliente y tu equipo.Software Guru
 
Pruebas de integración con Docker en Azure DevOps
Pruebas de integración con Docker en Azure DevOpsPruebas de integración con Docker en Azure DevOps
Pruebas de integración con Docker en Azure DevOpsSoftware Guru
 
Elixir + Elm: Usando lenguajes funcionales en servicios productivos
Elixir + Elm: Usando lenguajes funcionales en servicios productivosElixir + Elm: Usando lenguajes funcionales en servicios productivos
Elixir + Elm: Usando lenguajes funcionales en servicios productivosSoftware Guru
 
Así publicamos las apps de Spotify sin stress
Así publicamos las apps de Spotify sin stressAsí publicamos las apps de Spotify sin stress
Así publicamos las apps de Spotify sin stressSoftware Guru
 
Achieving Your Goals: 5 Tips to successfully achieve your goals
Achieving Your Goals: 5 Tips to successfully achieve your goalsAchieving Your Goals: 5 Tips to successfully achieve your goals
Achieving Your Goals: 5 Tips to successfully achieve your goalsSoftware Guru
 
Acciones de comunidades tech en tiempos del Covid19
Acciones de comunidades tech en tiempos del Covid19Acciones de comunidades tech en tiempos del Covid19
Acciones de comunidades tech en tiempos del Covid19Software Guru
 
De lo operativo a lo estratégico: un modelo de management de diseño
De lo operativo a lo estratégico: un modelo de management de diseñoDe lo operativo a lo estratégico: un modelo de management de diseño
De lo operativo a lo estratégico: un modelo de management de diseñoSoftware Guru
 

Más de Software Guru (20)

Hola Mundo del Internet de las Cosas
Hola Mundo del Internet de las CosasHola Mundo del Internet de las Cosas
Hola Mundo del Internet de las Cosas
 
Estructuras de datos avanzadas: Casos de uso reales
Estructuras de datos avanzadas: Casos de uso realesEstructuras de datos avanzadas: Casos de uso reales
Estructuras de datos avanzadas: Casos de uso reales
 
Building bias-aware environments
Building bias-aware environmentsBuilding bias-aware environments
Building bias-aware environments
 
El secreto para ser un desarrollador Senior
El secreto para ser un desarrollador SeniorEl secreto para ser un desarrollador Senior
El secreto para ser un desarrollador Senior
 
Cómo encontrar el trabajo remoto ideal
Cómo encontrar el trabajo remoto idealCómo encontrar el trabajo remoto ideal
Cómo encontrar el trabajo remoto ideal
 
Automatizando ideas con Apache Airflow
Automatizando ideas con Apache AirflowAutomatizando ideas con Apache Airflow
Automatizando ideas con Apache Airflow
 
How thick data can improve big data analysis for business:
How thick data can improve big data analysis for business:How thick data can improve big data analysis for business:
How thick data can improve big data analysis for business:
 
Introducción al machine learning
Introducción al machine learningIntroducción al machine learning
Introducción al machine learning
 
Democratizando el uso de CoDi
Democratizando el uso de CoDiDemocratizando el uso de CoDi
Democratizando el uso de CoDi
 
Gestionando la felicidad de los equipos con Management 3.0
Gestionando la felicidad de los equipos con Management 3.0Gestionando la felicidad de los equipos con Management 3.0
Gestionando la felicidad de los equipos con Management 3.0
 
Taller: Creación de Componentes Web re-usables con StencilJS
Taller: Creación de Componentes Web re-usables con StencilJSTaller: Creación de Componentes Web re-usables con StencilJS
Taller: Creación de Componentes Web re-usables con StencilJS
 
El camino del full stack developer (o como hacemos en SERTI para que no solo ...
El camino del full stack developer (o como hacemos en SERTI para que no solo ...El camino del full stack developer (o como hacemos en SERTI para que no solo ...
El camino del full stack developer (o como hacemos en SERTI para que no solo ...
 
¿Qué significa ser un programador en Bitso?
¿Qué significa ser un programador en Bitso?¿Qué significa ser un programador en Bitso?
¿Qué significa ser un programador en Bitso?
 
Colaboración efectiva entre desarrolladores del cliente y tu equipo.
Colaboración efectiva entre desarrolladores del cliente y tu equipo.Colaboración efectiva entre desarrolladores del cliente y tu equipo.
Colaboración efectiva entre desarrolladores del cliente y tu equipo.
 
Pruebas de integración con Docker en Azure DevOps
Pruebas de integración con Docker en Azure DevOpsPruebas de integración con Docker en Azure DevOps
Pruebas de integración con Docker en Azure DevOps
 
Elixir + Elm: Usando lenguajes funcionales en servicios productivos
Elixir + Elm: Usando lenguajes funcionales en servicios productivosElixir + Elm: Usando lenguajes funcionales en servicios productivos
Elixir + Elm: Usando lenguajes funcionales en servicios productivos
 
Así publicamos las apps de Spotify sin stress
Así publicamos las apps de Spotify sin stressAsí publicamos las apps de Spotify sin stress
Así publicamos las apps de Spotify sin stress
 
Achieving Your Goals: 5 Tips to successfully achieve your goals
Achieving Your Goals: 5 Tips to successfully achieve your goalsAchieving Your Goals: 5 Tips to successfully achieve your goals
Achieving Your Goals: 5 Tips to successfully achieve your goals
 
Acciones de comunidades tech en tiempos del Covid19
Acciones de comunidades tech en tiempos del Covid19Acciones de comunidades tech en tiempos del Covid19
Acciones de comunidades tech en tiempos del Covid19
 
De lo operativo a lo estratégico: un modelo de management de diseño
De lo operativo a lo estratégico: un modelo de management de diseñoDe lo operativo a lo estratégico: un modelo de management de diseño
De lo operativo a lo estratégico: un modelo de management de diseño
 

Diseño compiladores, Ceylon JS