{"id":2692,"date":"2020-11-01T19:58:27","date_gmt":"2020-11-01T19:58:27","guid":{"rendered":"http:\/\/blog.rastersoft.com\/?p=2692"},"modified":"2020-11-01T19:58:29","modified_gmt":"2020-11-01T19:58:29","slug":"crust-y-protothreads","status":"publish","type":"post","link":"https:\/\/blog.rastersoft.com\/?p=2692","title":{"rendered":"Crust y protothreads"},"content":{"rendered":"\n<p>Hace tiempo hab\u00eda descubierto un curioso mecanismo denominado <em><a rel=\"noreferrer noopener\" href=\"https:\/\/www.chiark.greenend.org.uk\/~sgtatham\/coroutines.html\" target=\"_blank\">protothreads<\/a><\/em>. Se trata de una manera de a\u00f1adir capacidades as\u00edncronas a C. El truco es bastante curioso, pues se basa en una caracter\u00edstica poco conocida de C, que consiste en que un <em>switch<\/em> puede saltar a la mitad de un bucle, ya sea <em>for<\/em>, <em>while<\/em> o <em>do&#8230;while<\/em>. Esto es, este c\u00f3digo es legal:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted mycode\">switch (a) {\ndefault:\n    while(1) {\n        do something\n        return;\ncase XXXX:\n        do more things\n    }\n}<\/pre>\n\n\n\n<p>Esto funciona perfectamente en C, y adem\u00e1s es perfectamente legal, gracias a la definici\u00f3n expl\u00edcita de c\u00f3mo funcionan los bucles en este lenguaje.<\/p>\n\n\n\n<p>La idea detr\u00e1s de esto es generar a mayores una serie de macros y definiciones que permitan embellecer el c\u00f3digo, y hacer que se parezca m\u00e1s a programaci\u00f3n as\u00edncrona.<\/p>\n\n\n\n<p>La cuesti\u00f3n es que llevo unas semanas trabajando en un proyectillo en C que utiliza eventos y programaci\u00f3n as\u00edncrona, y para simplificar y mejorar el c\u00f3digo decid\u00ed implementar protothreads. Por supuesto, tambi\u00e9n utilizaba mi viejo analizador est\u00e1tico <em><a href=\"https:\/\/rastersoft.com\/programas\/crust_es.html\">crust<\/a><\/em> para analizar el c\u00f3digo y detectar errores, y justo aqu\u00ed me encontr\u00e9 con el problema: no era capaz de analizar correctamente estas estructuras.<\/p>\n\n\n\n<p>As\u00ed que aqu\u00ed ten\u00eda dos opciones: o pasar de crust, o actualizarlo para que lo soporte. Y obviamente me decid\u00ed por lo segundo.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Hace tiempo hab\u00eda descubierto un curioso mecanismo denominado protothreads. Se trata de una manera de a\u00f1adir capacidades as\u00edncronas a C. El truco es bastante curioso, pues se basa en una caracter\u00edstica poco conocida de C, que consiste en que un switch puede saltar a la mitad de un bucle, ya sea for, while o do&#8230;while. &hellip; <a href=\"https:\/\/blog.rastersoft.com\/?p=2692\" class=\"more-link\">Seguir leyendo <span class=\"screen-reader-text\">Crust y protothreads<\/span> <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[3,5],"tags":[],"class_list":["post-2692","post","type-post","status-publish","format-standard","hentry","category-nueva-version","category-programacion"],"_links":{"self":[{"href":"https:\/\/blog.rastersoft.com\/index.php?rest_route=\/wp\/v2\/posts\/2692","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.rastersoft.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.rastersoft.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.rastersoft.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.rastersoft.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=2692"}],"version-history":[{"count":2,"href":"https:\/\/blog.rastersoft.com\/index.php?rest_route=\/wp\/v2\/posts\/2692\/revisions"}],"predecessor-version":[{"id":2694,"href":"https:\/\/blog.rastersoft.com\/index.php?rest_route=\/wp\/v2\/posts\/2692\/revisions\/2694"}],"wp:attachment":[{"href":"https:\/\/blog.rastersoft.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=2692"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.rastersoft.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=2692"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.rastersoft.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=2692"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}