blog for PLs (es)
This commit is contained in:
parent
8b8d0d4f86
commit
d7349bca3a
@ -39,6 +39,14 @@ pre.astro-code>code .line::before {
|
||||
margin-bottom: 1.5rem;
|
||||
}
|
||||
|
||||
#blog h3 {
|
||||
font-size: 1.25rem;
|
||||
font-family: "Iosevka Etoile Web", serif;
|
||||
font-weight: 900;
|
||||
margin-top: 2.25rem;
|
||||
margin-bottom: 1.5rem;
|
||||
}
|
||||
|
||||
#blog li {
|
||||
list-style-type: circle;
|
||||
margin: 0.5rem 0;
|
||||
@ -51,6 +59,11 @@ pre.astro-code>code .line::before {
|
||||
|
||||
#blog img {
|
||||
max-height: 400px;
|
||||
display: inline-block;
|
||||
}
|
||||
|
||||
#blog p:has(> img) {
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
#blog blockquote {
|
||||
|
BIN
public/img/blog/es/lang/cover.png
Normal file
BIN
public/img/blog/es/lang/cover.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 38 KiB |
BIN
public/img/blog/es/lang/minecraft.jpg
Normal file
BIN
public/img/blog/es/lang/minecraft.jpg
Normal file
Binary file not shown.
After Width: | Height: | Size: 154 KiB |
@ -39,12 +39,22 @@ lang = lang ?? "en";
|
||||
class="fixed top-0 left-0 bg-black text-white rotate-[-90deg] font-display w-[100vh] translate-y-[100vh] px-8 py-2"
|
||||
style="transform-origin: 0% 0%;"
|
||||
>
|
||||
<a class="font-semibold inline-block text-2xl hover:underline" href="/">
|
||||
<a
|
||||
class="font-semibold inline-block text-2xl hover:underline"
|
||||
href="/"
|
||||
>
|
||||
Fernando Araoz
|
||||
</a>
|
||||
<a class="ml-6 inline-block hover:underline" href="/side-projects">Side projects</a>
|
||||
<a class="ml-6 inline-block hover:underline" href="/blog/en">Eng Blog</a>
|
||||
<a class="ml-6 inline-block hover:underline" href="/blog/es">Es Blog</a>
|
||||
<a
|
||||
class="ml-6 inline-block hover:underline"
|
||||
href="/side-projects">Side projects</a
|
||||
>
|
||||
<a class="ml-6 inline-block hover:underline" href="/blog/en"
|
||||
>Eng Blog</a
|
||||
>
|
||||
<a class="ml-6 inline-block hover:underline" href="/blog/es"
|
||||
>Es Blog</a
|
||||
>
|
||||
</nav>
|
||||
</div>
|
||||
<div id="blog" class="container mx-auto max-w-[1000px]">
|
||||
@ -66,11 +76,13 @@ lang = lang ?? "en";
|
||||
{
|
||||
frontmatter?.image && (
|
||||
<figure>
|
||||
<div class="text-center">
|
||||
<img
|
||||
class="dark:opacity-70 rounded pt-8"
|
||||
class="dark:opacity-70 rounded pt-8 inline-block"
|
||||
src={frontmatter.image.url}
|
||||
alt={frontmatter.image.alt}
|
||||
/>
|
||||
</div>
|
||||
<figcaption class="text-xs text-center pt-2 pb-8 opacity-75">
|
||||
{frontmatter.image.caption}
|
||||
</figcaption>
|
||||
|
200
src/pages/blog/es/lenguajes-01.md
Normal file
200
src/pages/blog/es/lenguajes-01.md
Normal file
@ -0,0 +1,200 @@
|
||||
---
|
||||
layout: ../../../layouts/BlogLayout.astro
|
||||
title: "¿Con qué lenguaje de programación se crean los lenguajes de programación?"
|
||||
description: |
|
||||
Vista superior de cómo funciona un lenguaje de programación
|
||||
realmente.
|
||||
pubDate: "2024-07-25"
|
||||
tags: ["tech", "lenguajes", "tutorial"]
|
||||
image:
|
||||
url: "/img/blog/es/lang/cover.png"
|
||||
alt: ""
|
||||
caption: ""
|
||||
---
|
||||
|
||||
Si estás leyendo esto seguramente sabes uno o más lenguajes
|
||||
de programación. También sabes que los computadores trabajan
|
||||
en base a `código máquina`, o unos y ceros.
|
||||
|
||||
Pero, ¿sabes cómo funciona internamente un lenguaje de programación?
|
||||
O cómo funciona un compilador/intérprete?
|
||||
|
||||
Este artículo asume que sabes qué es un
|
||||
[intérprete](https://es.wikipedia.org/wiki/Int%C3%A9rprete_(inform%C3%A1tica)),
|
||||
[compilador](https://es.wikipedia.org/wiki/Compilador)
|
||||
y otros conceptos básicos.
|
||||
|
||||
|
||||
## Motivación
|
||||
|
||||
Al parecer no hay recursos sobre este tema en español (o soy
|
||||
muy malo buscando en internet, que es una posibilidad real).
|
||||
|
||||
El otro día, mientras trabajaba en la documentación de mi
|
||||
[lenguaje de programación THP](https://thp.araozu.dev/),
|
||||
me dió curiosidad saber qué se dice del tema en español.
|
||||
Porque en Inglés hay un montón de recursos acerca de lenguajes
|
||||
de programación, clasificación, características, implementaciones,
|
||||
tutoriales, etc., por ejemplo:
|
||||
|
||||
- [Reddit: Programming languages](https://old.reddit.com/r/ProgrammingLanguages/)
|
||||
- [Crafting Interpreters](https://craftinginterpreters.com/)
|
||||
- [Interpreter/Compiler book](https://interpreterbook.com/)
|
||||
- [Youtube: Context Free](https://www.youtube.com/@contextfree)
|
||||
|
||||
etc. etc. etc.
|
||||
|
||||
Buscando en YouTube "como funciona un lenguaje de programación"
|
||||
encontré un único video que habla acerca del tema, de EDteam.
|
||||
Y al verlo me pareció: 1) muy simplista, y 2) incorrecto en
|
||||
muchos aspectos básicos.
|
||||
|
||||
Y bien puede ser que no sé buscar cosas en internet, pero como
|
||||
es común en el área, casi todos los recursos buenos están en
|
||||
inglés.
|
||||
|
||||
So, ya que tengo esta especie de blog, me interesó escribir
|
||||
al respecto y eventualmente detallar cómo se crea un
|
||||
lenguaje de programación, desde cero, con código y todo.
|
||||
|
||||
|
||||
## ¿Con qué lenguaje se crean los lenguajes?
|
||||
|
||||
Con *literalmente* cualquier lenguaje de programación.
|
||||
Es como el huevo y la gallina. ¿Quién vino primero, el huevo?
|
||||
o la gallina?
|
||||
|
||||
|
||||
### En un principio...
|
||||
|
||||
No existía ningún lenguaje de programación. Existían computadoras,
|
||||
y las computadoras se programaban en unos y ceros.
|
||||
Pero como esto era re-complicado y re-difícil y propenso a errores,
|
||||
se inventó el [lenguaje ensamblador](https://es.wikipedia.org/wiki/Lenguaje_ensamblador).
|
||||
|
||||
Y el ensamblador se escribió en código máquina.
|
||||
|
||||
|
||||
### Luego!
|
||||
|
||||
Hubieron varios lenguajes de programación a lo largo de los años
|
||||
como FORTRAN, Lisp, Cobol, etc., todos implementados esta vez en
|
||||
ensamblador.
|
||||
|
||||
Pero aquí es donde surge un concepto nuevo: Bootstraping
|
||||
[(que curiosamente no tiene un artículo en Wikipedia español así que
|
||||
lo llamaré así: Bootstraping)](https://en.wikipedia.org/wiki/Bootstrapping_%28compilers%29).
|
||||
|
||||
Bootstraping es el proceso mediante el cual un lenguaje de
|
||||
programación se implementa en sí mismo. Curioso, y confuso.
|
||||
|
||||
Poniendo como ejemplo el lenguaje C:
|
||||
|
||||
1. Primero se crea un compilador para C en cualquier lenguaje
|
||||
[(C se implementó inicialmente en B)](https://www.bell-labs.com/usr/dmr/www/chist.html).
|
||||
2. Ahora que tenemos un compilador de C capaz de crear programas
|
||||
nuevos (escrito en B), crearemos el siguiente programa:
|
||||
un compilador de C.
|
||||
3. Una vez que terminamos de escribir el compilador de C, en C,
|
||||
listo. Tenemos un lenguaje de programación escrito en sí mismo.
|
||||
|
||||
Confuso. Como me gustan las analogías, aca va una con Minecraft:
|
||||
|
||||
"Las hachas de madera se crean con hachas de madera. ¿Cómo
|
||||
se creó la primera hacha de madera?"
|
||||
|
||||
Pues, primero obtienes madera con tu mano. Despues creas un
|
||||
hacha de madera con la madera que obtuviste.
|
||||
Finalmente, usas el hacha de madera para picar más madera,
|
||||
y con esa madera creas nuevas hachas de madera.
|
||||
|
||||
![Imágen ilustrativa](/img/blog/es/lang/minecraft.jpg)
|
||||
|
||||
|
||||
### Finalmente
|
||||
|
||||
Los lenguajes compilados suelen seguir ese
|
||||
proceso: Primero se implementan en un lenguaje (generalmente
|
||||
C, C++ o Rust) y luego se implementan en sí mismos. Este es el
|
||||
caso de: Fortran, Pascal, C, C++, Haskell, OCaml,
|
||||
F#, [Erlang](https://www.erlang.org/),
|
||||
[Rust](https://www.rust-lang.org/), [Swift](https://swift.org/),
|
||||
[Go](https://go.dev/), [Zig](https://ziglang.org/),
|
||||
[Nim](https://nim-lang.org/), [Crystal](https://crystal-lang.org/),
|
||||
y muchisimos más.
|
||||
|
||||
Los lenguajes que se ejecutan en máquinas virtuales
|
||||
están generalmente implementados en una mezcla de los 2,
|
||||
por ejemplo Java está implementado en Java + C + C++.
|
||||
|
||||
Los lenguajes interpretados generalmente se implementan en otro
|
||||
lenguaje, on en una mezcla de otro y sí mismos.
|
||||
PHP está implementado en C, Python en C, Ruby en C + Ruby, etc.
|
||||
JavaScript en C++, y curiosamente, TypeScript está implementado
|
||||
en TypeScript.
|
||||
|
||||
Asi que: ¿Con qué lenguaje de programación se crean los
|
||||
lenguajes de programación? Con cualquier lenguaje, y eventualmente
|
||||
en sí mismos.
|
||||
|
||||
|
||||
## ¿Y cómo se crea un compilador?
|
||||
|
||||
¡Próximamente, en Dragon Ball Z!
|
||||
|
||||
|
||||
## Addendum
|
||||
|
||||
- ¿Por qué los lenguajes interpretados no suelen implementarse
|
||||
completamente en sí mismos?
|
||||
|
||||
Los lenguajes interpretados y los que se compilan a una máquina
|
||||
virtual (Java, C#), por su naturaleza, no pueden
|
||||
realizar el proceso de bootstraping. Esto se debe a que los
|
||||
lenguajes interpretados **no generán código máquina**,
|
||||
sino que [**generan bytecode**](https://es.wikipedia.org/wiki/Bytecode),
|
||||
que debe ser ejecutado por el **intérprete** o la
|
||||
[**máquina virtual**](https://es.wikipedia.org/wiki/M%C3%A1quina_virtual_Java).
|
||||
|
||||
Pero, el intérprete/VM tienen que ejecutarse en metal. Y los únicos
|
||||
lenguajes que pueden hacer eso son los lenguajes compilados.
|
||||
|
||||
- ¿Por qué hay tantos lenguajes de programación?
|
||||
|
||||
Porque no existe el lenguaje perfecto
|
||||
([aunque me duela admitirlo](https://rust-lang.org/)),
|
||||
siempre existirán avances que los lenguajes antiguos
|
||||
no puedan implementar o sean muy lentos en hacerlo,
|
||||
y porque [es un hobby](https://old.reddit.com/r/ProgrammingLanguages/)
|
||||
muy interesante.
|
||||
|
||||
Cada lenguaje nuevo puede tener conceptos radicalmente nuevos
|
||||
como [borrow checking](https://rust-lang.org/),
|
||||
[comptime](https://ziglang.org/documentation/0.13.0/#comptime),
|
||||
[programación funcional pura](https://www.haskell.org/),
|
||||
[concurrencia masiva](https://www.erlang.org/), etc.
|
||||
|
||||
O pueden ser una reimaginación/mejora de lenguajes existentes
|
||||
como [Mojo](https://www.modular.com/mojo),
|
||||
[Kotlin](https://kotlinlang.org/),
|
||||
[Lisp Flavored Erlang](https://lfe.io/),
|
||||
[Gleam](https://gleam.run/).
|
||||
|
||||
O pueden ocupar un nicho que tiene ciertas necesidades
|
||||
como [Hack](https://hacklang.org/), [MoonScript](https://moonscript.org/),
|
||||
[GDScript](https://docs.godotengine.org/en/stable/tutorials/scripting/gdscript/gdscript_basics.html),
|
||||
[Vala](https://vala.dev/).
|
||||
|
||||
O pueden ser una demostración de lo que es posible como
|
||||
Brainfuck, [LOLCODE](http://www.lolcode.org/),
|
||||
[Shakespeare](https://esolangs.org/wiki/Shakespeare).
|
||||
|
||||
O pueden ser una sátira del status quo como
|
||||
[Dreamberd](https://github.com/TodePond/DreamBerd).
|
||||
|
||||
O pueden ser un acto de rebeldía como
|
||||
[CrabLang](https://crablang.org/).
|
||||
|
||||
O pueden ser... creo que ya entendiste.
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user