About me → Programador. → Estudiante de Ingeniería. → Former Emprendedor. → Blogger. → Athlete wanna be.
The C Programming language
40+ years old
→ General-purpose. → Imperative, Structured. → Státic, Weak. → Multiplataforma.
Hello World code: http://pastebin.com/MwxK3pbw
Compile & Execute
#include <stdio.h>
~$ gcc -O2 -o helloworld hello.c
int
~$ ./helloworld
main(void) {
~$ printf("Hello World!\n"); return 0;
}
Hello World!
¿Por qué C?
ยกC es rรกpido! Y proporciona acceso a recursos de nivel bajo y de nivel alto. Low level
High level
"Talk is cheap. Show me the code." â&#x20AC;&#x201C; Linus Torvalds
C code: http://pastebin.com/ag9f3pPT
Python code: http://pastebin.com/kR28UZws
#include <stdio.h>
#!/usr/bin/python
#define LIMIT 1000000
suma = 0 for i in range(1000000):
int
suma += i
main(void) { int i; long int sum; for(i=0; i < LIMIT; i++) sum += i; printf("%ld\n", sum); return 0; }
print(suma)
~ $./a.out 499999500000 real
0m0.002s
user
0m0.000s
sys
0m0.000s
~ $ python sample.py 499999500000 real
0m0.548s
user
0m0.513s
sys
0m0.003s
So, why don't we use C more often?
Porque es tedioso programar en C
Well, actually we use C more than ever ... through Python modules.
Dummy module1
1 For dummies.
Necesitarás → Un editor. → Un compilador. → Python. → Python devel2
2 En sistemas como Ubuntu generalmente se necesita un paquete adicional de desarrollo.
code: http://pastebin.com/iJAqed9B
#include <Python.h> static PyObject * static PyMethodDef DummyMethods[] = { {
dummy(PyObject *self, PyObject *args) {
"dummy", dummy,
Py_INCREF(Py_False);
METH_NOARGS, "method"
return Py_False;
},
}
{NULL, NULL, 0, NULL} };
PyMODINIT_FUNC PyInit_dummy(void)
static struct PyModuleDef conf = {
{
PyModuleDef_HEAD_INIT,
PyObject *module;
"dummy",
module = PyModule_Create(&conf);
"dummy module.",
if(!module)
-1,
return NULL;
DummyMethods };
return module; }
Rerefence Counting ?
Python internamente hace muchas llamadas a malloc() y realloc() a lot!
La memoria devuelta por malloc() y realloc() debe ser liberada cuando no se necesita.
Reference counting es un algoritmo que mantiene un registro del nĂşmero de â&#x20AC;&#x153;referenciasâ&#x20AC;? de un objeto3, cuando la referencia llega a cero la memoria es liberada.
3 Diccionarios, Listas, Cadenas de caracteres, etc.
So, la creaci贸n de objetos en Python es costosa y debe ser minimizada.
Por eso cuando en Python creamos una lista de un elemento, Python con una llamada reserva memoria para 4 elementos.
array = [1]
# malloc() cuatro espacios
array.append(2)
# 2da inserción gratis!
array.append(3)
# la 3ra también.
array.append(4)
# y la cuarta.
array.append(5)
# inserción costosa realloc()
Ver: Core Python Cointainers “Under-the-hood” by Raymond Hettinger.
so, back to the dummy module!
How do I compile the dummy module?
Con un script setup.py y el m贸dulo Distutils.
code: http://pastebin.com/ScWzrQEe ~$ python setyp.py build_ex --inplace from distutils.core import setup, Extension module = Extension('dummy',sources=['dummymodule.c'])
running build_ext building 'dummy' extension ... ~$
setup(
name
= 'dummy',
version
= '1.0-alpha',
author
= 'MaG',
description = 'dummy module.', ext_modules = [module])
So, what are the limitations ?
Puedes hacer casi cualquier cosa
como crear un m贸dulo para ejecutar c贸digo de Ruby
You've been told, never trust a troll!!
What is pyby?
import pyby
>>> pyby.rubyfy('true') True >>> pyby.rubyfy('false') False >>> pyby.rubyfy('{}') {} >>> pyby.rubyfy(''' ... [*1..5].each do |n| ... puts n ... end ... ''') 1 2 3 4 5 [1, 2, 3, 4, 5]
>>> ... ... ... ... [2,
pyby.rubyfy(''' (1..10).select do |n| n.even? end ''') 4, 6, 8, 10]