[ubuntu-bo] [General] [OFFTOPIC] Una pregunta, ¿Qué se necesita hacer para crear un IDE?

Marcelo Morales marcelomorales.name en gmail.com
Lun Mayo 10 16:36:59 BST 2010


2010/5/9 Mario César Señoranis Ayala <mariocesar.c50 at gmail.com>:
> ¿Qué se necesita hacer para crear un IDE?.

Un IDE se hace utilizando utilizando un marco de trabajo para hacer
IDEs. De hecho, los vendedores de IDEs de la actualidad utilizan
marcos de trabajo como eclipse para sus productos. Para el caso de
eclipse, por ejemplo, basta buscar la palabra "IDE" en
http://en.wikipedia.org/wiki/List_of_Eclipse-based_software y
encontrarás productos como aptana, adobe flash builder, o ibm
rational.

> ¿Como hacer un IDE similar a Eclipse, MonoDevelop, Visual Studio, etc?

Un marco de trabajo para hacer un IDE como eclipse se hace en
componentes y capas. Googlea "eclipse architecture plugin
programming", o mira el wiki de netbeans y encuentras varios artículos
con gráficos.

La tarea es de embergadura. Como ejemplo, he bajado los fuentes de
netbeans, que es un IDE para java/ruby/c/c++/python/javascript con
doble licenciamiento GPL y CDDL, y escrito en java. Resulta que es una
pieza de software verdaderamente masiva, como se muestra a
continuación:
marcelo at kaboola:~/src/netbeans-main$ find . -name '*.java' -type f
-exec cat '{}' \; |wc -l
10151207
marcelo at kaboola:~/src/netbeans-main$ du -hs --exclude .hg
989M
marcelo at kaboola:~/src/netbeans-main$ hg log |wc -l
1469824
marcelo at kaboola:~/src/netbeans-main$ ls |wc -l
908

Los fuentes están divididos en módulos, como era de esperarse. Son 907
módulos diferentes en este particular IDE.

La mayor parte del IDE no hace uso extensivo directo de la librería
gráfica. Resulta que existe una gran cantidad de código escrito para
manejo de menús, el sistema de módulos, un API de acciones, diálogos
comunes, un sistema virtual de archivos, etc. Todo este conjunto se
conoce como RCP (Rich Client Platform) y funciona como un marco de
trabajo para hacer aplicaciones de escritorio. Esto librera al
programador de varias tareas mundanas como definir layouts, hacer
mementos, e incluso auto-actualizaciones. De hecho, luego de ver el
RCP, no veo ninguna razón por la que se deba programar sin marco de
trabajo y directamente sobre la librería gráfica.

Encima hay otros módulos que dan apoyo a varios elementos comunes,
como el lexeo, el parseo, las barras de errores, el pareo de
paréntesis, el "folding" de código, la numeración de líneas, el manejo
de preferencias, colores, etc. etc.

Encima de éste hay recién las implementaciones particulares de lexers,
las ventanas de edición, los diálogos particulares, etc. etc.

> Especialmente el autocompletado, la inspección del código, cuales son los
> fundamentos con los que se hace?

Esta es una excelente pregunta. Las herramientas comunes para generar
lexers (como lex) generalmente están orientadas a compilación, que es
una operación en lote, cuyo objetivo es generar una salida, en una
pasada, para un parser. Los IDE utilizan un método diferente llamado
"General Incremental Lexical Analysis", cuya idea original se puede
encontrar en una tesis doctoral:
http://www.cs.berkeley.edu/Research/Projects/harmonia/papers/twagner-lexing.pdf
Los buenos IDEs no lexean el fuente completo con cada cambio del
contenido, sino que manejan una cola de cambios de tokens. En
Netbeans, el lexer de java está "escrito a mano" y hay un API de lexer
que abstrae los detalles del algoritmo.

Con respecto al parse, los IDE proveen un API de parser que se enlaza
con el RCP. El parser utiliza estructuras de datos permanentes (¿o son
llamadas persistentes?), de modo que los árboles de análisis
sintáctico también cambian incrementalmente a medida que se difunden
los cambios en el lexer, y mantienen la historia del parse de modo que
"deshacer" o "borrar" no lanzan re-parses.

La indexación está íntimamente ligada con el parser, y generalmente
utiliza técnicas de motor de búsqueda y no de persistencia relacional:
no hay tablas, hay tries. El autocompletado consiste en consulta a la
indexación. NetBeans utiliza lucene, que es un proyecto de apache.org

Saludos
-- 
Marcelo Morales



Más información sobre la lista de distribución Ubuntu-bo