¿Existen tipos de aplicaciones asesinas, clases de problemas algorítmicos, etc., donde es mejor, a la larga, crear mi propio lenguaje?
PD: Solo para estar seguro, me refiero a un nuevo lenguaje de programación y un compilador, no un nuevo compilador para un lenguaje existente.
EDITAR : Gracias por las respuestas. ¿Puede proporcionar algunos ejemplos, donde es absolutamente innecesario crear un DSL o casos en los que un DSL podría ser una buena idea?
programming-languages
dsl
Daniel Rikowski
fuente
fuente
Respuestas:
Ciertamente, es relevante que una persona escriba su propio idioma con fines educativos. Para aprender sobre el diseño del lenguaje de programación y sobre el diseño del compilador. Pero los usos del mundo real son pocos y distantes entre sí.
Al escribir su propio idioma usted es:
Entonces, si planea escribir su propio idioma para su proyecto, entonces las características que proporciona que otros idiomas no tienen que compensar los costos anteriores.
Tome el desarrollo de juegos, por ejemplo. A menudo necesitan mini-idiomas dentro de sus juegos o lenguajes de secuencias de comandos. Usan estos lenguajes para escribir una gran cantidad de eventos en el juego que suceden. Sin embargo, incluso en este caso, casi siempre eligen los lenguajes de secuencias de comandos existentes y los adaptan a sus necesidades.
fuente
Permítanme citar a Paul Vick, ex desarrollador principal del compilador de VB y ahora trabajando en el Proyecto Oslo y el lenguaje M:
DSL: definitivamente una mala idea.
fuente
¿Cuándo es razonable?
Cuando te apetece!
No escuches a estas personas que tienen comentarios sarcásticos que básicamente dicen:
"No lo hagas porque es demasiado difícil y el lenguaje X es mejor que cualquier idioma que se te ocurra".
La cuestión es que crear un DSL ocurre todo el tiempo. Un marco es un DSL. Una macro es un DSL. Cada vez que escribe una función para su programa, eso es parte de un DSL. Claro, está dentro de los límites de la gramática, pero el vocabulario es parte de un lenguaje. Es por eso que las industrias a menudo crean su propia lengua vernácula: ¡es más eficiente!
Si "no hacerlo" fuera la respuesta correcta, todos estaríamos escribiendo COBOL y Fortran.
fuente
Es posible que desee leer partes del próximo libro DSL de Martin Fowler , si está pensando en escribir su propio idioma.
Realmente no puedo pensar en un caso de negocios para crear un lenguaje desde cero que no sea una experiencia de aprendizaje tremenda.
Editar: para DSL hay muchos casos de negocios, pero la clave aquí es no dejarse llevar y mantenerlo simple.
fuente
Sugiero que las preguntas clave son: "¿Qué problema estoy tratando de resolver?" y "¿Quién obtiene el ROI?"
Si está tratando de desarrollar sus propias habilidades y experiencia, avance a toda velocidad, pero no en un sistema de producción que supuestamente resuelva el problema de otra persona.
fuente
Parece que la razón principal por la que desea un nuevo idioma es que comienza a descubrir patrones en su código que los idiomas existentes no manejan bien. Pero hay muchos problemas para crear tu propio idioma. Te perderás todas las bibliotecas y frameworks creados para los idiomas existentes. Pasará mucho tiempo diseñando e implementando el nuevo lenguaje, que es todo el tiempo que no tiene que gastar en la tarea de programación real. Pasarás un gran esfuerzo para convencer a otros desarrolladores de que deberían usar tu lenguaje. Y tendrá dificultades para reclutar y capacitar a nuevos desarrolladores.
¿Por qué no escribir en un idioma como Lisp que le permite extender el idioma a medida que descubre nuevos patrones? Luego, obtienes todo el poder de un nuevo idioma con todos los beneficios de un idioma establecido.
fuente
Una razón podría ser crearlo como un experimento para aprender sobre el diseño del lenguaje y la construcción del compilador.
Otra razón podría ser crear un lenguaje de script en una aplicación cuando no tiene la opción de agregar una API de terceros.
fuente
No creo que pueda programar sin crear un nuevo idioma, por lo que es bueno darse cuenta de que es lo que está haciendo y comprender los problemas.
Vocabulario, sintaxis y semántica.
Un lenguaje estándar como VB, Java, C #, etc. es solo un lenguaje base . Tan pronto como le agregue clases, métodos, etc., habrá agregado vocabulario y semántica. Hay muchas formas de implementar idiomas: análisis y traducción, análisis e interpretación, macros sobre un idioma existente, agregando clases y métodos a un idioma existente.
Sea bueno para expresar problemas de manera concisa.
¿Cómo sabes si has hecho esto? La medida que uso es editar recuento . Si aparece el requisito A de una oración, procedo a implementar el requisito en código. Cuando termino y elimino todos los errores, reviso el código, y el repositorio de códigos me da una lista de los cambios que hice, B. Cuanto más pequeño es B, mejor es el idioma. Promediada en el espacio de requisitos reales y posibles, esa medida me dice cuán "específico de dominio" es el lenguaje.
Porque minimiza los errores.
Si se necesitan N cambios en el código para implementar 1 requisito, y a veces comete errores, entonces el número de errores que introduce es aproximadamente proporcional a N. En el límite donde N = 1, es casi imposible introducir un error sin intentarlo.
Tenga en cuenta que este es un desafío directo a la "acumulación de código" que vemos hoy en día.
AGREGADO: en respuesta a su solicitud de un ejemplo, vea la ejecución diferencial . No diré que se puede entender rápidamente, pero reduce significativamente el código de la interfaz de usuario.
fuente
Siempre es "factible" usar la palabra en su pregunta (original), pero no suele ser útil y rara vez es óptima dada la abundancia de marcos y lenguajes maduros y bien respaldados que existen.
Sin embargo, es un desafío intelectual interesante.
fuente
Solo si el negocio principal de su equipo es lenguajes de programación.
He trabajado en un lenguaje de programación creado en una empresa financiera.
Claramente, para el arquitecto mismo, este fue un gran desafío y mejoró sus propias habilidades.
Inevitablemente, el lenguaje no pudo crecer ni mejorar en ninguna parte cerca de la velocidad que algo como C # o Java podrían: tienen equipos dedicados a hacer eso.
El lenguaje pronto se estancó ya que nadie nuevo quería asumir la tarea de mejorar el proyecto favorito de otra persona.
El arquitecto original se fue. El lenguaje se marchitó y murió después de 10 años.
Esos 10 años fueron un infierno para cualquiera que tuvo la desgracia de trabajar en un idioma sin salida.
Así que adelante, cree su propio idioma, pero no le pida a nadie más que lo use. No esperes que nadie más te lo agradezca.
fuente
Diseñar idiomas puede ser divertido. Pero no tiene que restringirse a los lenguajes de programación.
Si construyo una aplicación moderadamente compleja, me gusta agregar un tipo de lenguaje de macro / scripting para facilitar la ejecución de tareas repetitivas complejas. La mayoría de los usuarios no usarán esta funcionalidad, pero los pocos que la usan están muy agradecidos. Además, me aseguro de que sea valioso para las personas de soporte ayudarles a solucionar los problemas de los clientes.
fuente
Es completamente razonable si se hace para ampliar sus habilidades y aprender.
Aparte de eso, si tiene que hacer la pregunta, entonces no lo es. Si está tratando de determinar si puede manejar una determinada clase de algoritmo o un determinado dominio de problemas mejor que los idiomas existentes, primero debe ser un experto en el área que está abordando. Sabrás que es apropiado cuando tus habilidades y experiencia te lo indiquen.
Y también podría estar equivocado al respecto, pero necesitaría otro experto para convencerlo de eso (o para mostrarle que no es el experto que cree que es). Sería una discusión animada, no una simple pregunta y respuesta como encontrarás aquí.
fuente
Excepto para fines de autoeducación, me gustaría afirmar que hoy no existe la necesidad de crear su propio idioma. En cualquier circunstancia Siempre. Independientemente de lo que desee hacer, hay muchos cargamentos de idiomas existentes que puede tomar / adaptar a sus necesidades.
fuente
Definitivamente depende de la situación. Como dijo nosklo: si tiene una buena idea, un concepto nuevo o algo así, le recomendaría encarecidamente que lo haga.
En general, sugeriría confiar en la tecnología establecida.
Pero si está interesado en crear su propio "idioma", debería consultar: YACC y Lex
fuente
Puedes, simplemente no te atrapes en el antipatrón "Recreando la rueda cuadrada".
Lo que significa que está recreando lo que ya se ha hecho, solo que es más pobre que el original.
fuente
Wouter era conocido por crear un nuevo lenguaje para cualquier idea nueva. Puedes inspirarte en su trabajo: la página del lenguaje de programación de Wouter .
fuente
¿Cuándo crear tu propio idioma?
Cuando quieras, como un gran proyecto de hobby.
Para un lenguaje específico de dominio. Estos pueden ser bastante elaborados; mira lo que sucede en la comunidad de Ficción interactiva (o aventura de texto) revisando el archivo .
Cuando sus objetivos son muy ambiciosos y cree que puede hacer un avance real, como el proyecto Arc de Paul Graham .
Además, en cualquier lenguaje suficientemente adaptable (tal vez C ++, definitivamente Common Lisp) en el proceso de desarrollo de construcciones de bajo nivel.
¿Cuándo evitarlo como lo harías, espero, evitar un cliché como evitarlo como la peste?
Cuándo será la base del desarrollo continuo para proyectos reales. Siempre terminará quedando muy rezagado con respecto a lo que está disponible comercialmente a bajo precio, y paralizará un mayor desarrollo. Trabajé para una compañía con su propia versión de COBOL, y nunca quiero trabajar en otra compañía que mantenga su propio idioma. Vimos otras versiones de COBOL obtener mejores capacidades y mejores herramientas, mientras estábamos atrapados con los mismos problemas. (No quiero volver a trabajar con COBOL nunca más, pero esa es otra historia).
Las situaciones en las que podrías crear tu propio idioma no entran en esto. Los proyectos de pasatiempo no se utilizan para el desarrollo real. Algo como Arc tendrá éxito (y obtendrá múltiples implementaciones y más evolución y desarrollo) o fracasará (y nadie más lo usará). Un pequeño lenguaje específico de dominio es solo una parte de un proyecto, y dado que es pequeño, se puede mejorar con el tiempo. Se usa un lenguaje de aventura de texto para escribir juegos individuales, y esos juegos, además de ser proyectos de pasatiempo, casi nunca se usan para un desarrollo continuo.
fuente
Mi perspectiva es que las DSL son generalmente una "idea débil", y es más productivo a largo plazo usar un lenguaje estándar y construir sus necesidades específicas de dominio como una biblioteca de "no DSL".
Sin embargo, puede resultar que sus necesidades sean lo suficientemente personalizadas como para que sea preferible tener un DSL (no solo una implementación de gcc o lisp ligeramente modificada) para su empresa. Muchas compañías usan drop-ins de idiomas actuales que apuntan a lo que están haciendo, sin escribir / mantener su propio idioma. Por ejemplo, he oído que PHP tiene un buen acceso directo; Lua está diseñado para ser un drop-in, ModelView usa Python y AutoCAD tiene AutoLISP como scripter.
fuente
No hay nada de malo en escribir su propio lenguaje de programación si puede aprovechar las herramientas existentes. En el mundo de hoy, esto significaría que usted lo define en una sintaxis utilizable para un lenguaje existente (como Java o C #) o escribe un pequeño sistema de transformación (expansor de macro) que genera código en un lenguaje existente.
Ir hasta el código de máquina es reinventar MUCHAS ruedas ...
Una muy buena razón para un DSL es representar los datos del dominio de una manera sucinta. Esto permite a los expertos en dominios trabajar con los datos directamente en lugar de tener que pasar por otros. El truco consiste en tener los programas resultantes en un formulario fácil de procesar.
fuente
En general, la respuesta sería un gran NO. De los cientos de idiomas que existen, generalmente hay uno que se adaptará a su problema.
Sin embargo, hay circunstancias en las que es una opción racional desarrollar un nuevo lenguaje:
fuente
Para qué es bueno el lenguaje es la composicionalidad o unir los mismos componentes de diferentes maneras.
Si su problema de dominio solo necesita que configure un grupo de interruptores ortogonales, un idioma probablemente no agregue mucho sobre los formularios, una interfaz gráfica de usuario o una configuración de texto directo. archivo. (Asumo aquí que un archivo lleno de claves, pares de valores no es lo que quiere decir con un "idioma").
OTOH, si su configuración es como un lenguaje real, por ejemplo. los verbos y los sustantivos se pueden juntar en muchas combinaciones diferentes (y novedosas) a cualquier grado de complejidad, entonces un lenguaje se volverá casi inevitable, porque la explosión combinatoria de tratar de especificar lo que quieres por cualquier otro método abruma.
fuente
Dejando de lado los ejercicios de aprendizaje, es razonable crear su propio lenguaje de programación solo cuando comprende otros idiomas, su dominio del problema específico y la forma en que los idiomas existentes abordan ese dominio del problema y esta comprensión es lo suficientemente exhaustiva como para que sepa que un nuevo idioma es razonable solución sin necesidad de hacer la pregunta.
fuente
La última vez que me propuse hacer eso en un proyecto de pasatiempo, comencé a especificar cómo quería que se viera la sintaxis y me di cuenta a mitad de camino que estaba reinventando el prólogo. Otros idiomas que pueden ser adecuados cuando cree que necesita inventar un idioma son lisp, lua o algo así como Haskell. Básicamente, todos esos idiomas que ignoraste en la universidad porque pensaste que nunca serían útiles.
fuente
Una razón es para fines educativos, como ya se dijo. Pero hay más. Por ejemplo, hay muchos idiomas de investigación como
Sing#
el sistema operativo Singularity yBitC
el Coyotos que se han diseñado porque los idiomas existentes no ofrecen las características requeridas (por ejemplo, verificación a nivel de idioma).fuente
Tom Van Cutsem escribió recientemente una respuesta de ensayo a esta misma pregunta:
http://soft.vub.ac.be/~tvcutsem/whypls.html
Resumen de viñetas (de esa página):
fuente
Probablemente nunca.
Lua es la mejor opción que puede obtener si desea incrustar el idioma en prácticamente cualquier otro idioma.
Actualmente se encuentran en idiomas específicos de dominio pequeño, y tiene sentido en algunas aplicaciones.
Aparte de eso, las razones son principalmente académicas.
Crear un lenguaje cuando no es necesario, es realmente algo malo debido a la complejidad que implica desarrollarlo y mantenerlo. He visto muchos proyectos que introducen algún tipo de lenguaje de secuencias de comandos específico solo para ese programa, y fue lo que desaceleró el desarrollo de lo básico en gran medida. Buenos ejemplos son, por ejemplo, lenguajes de automatización como Phantom, AutoHotKey, AutoIt. Esas herramientas serían IMO mucho mejores si usaran algún lenguaje de emsing conocido como Lua.
fuente
Su 'edición' parece ser una pregunta sustancialmente diferente ("¿cuándo debo construir un DSL?" En lugar de la pregunta original que la gente entendió como "cuándo debería construir un nuevo lenguaje de programación de propósito general"). Parece que la gente ha respondido a fondo la pregunta "original", pero hay pocas respuestas que dan criterios específicos sobre cuándo usar un DSL. Entonces propongo una lista de verificación:
Si todo esto es cierto, entonces un DSL puede ser apropiado.
fuente
Depende.
Tomemos nuestro cerebro. Parece ser un desastre tan complejo que encontramos fronteras con CUALQUIER lenguaje de programación (al menos ahora). Entonces, para virtualizar realmente nuestro cerebro, necesitamos otros enfoques y, por lo tanto, otras semánticas y sintaxis.
En términos generales, todavía hay temas tan complejos que podrían conducir a otras estrategias que también incluirían un "mejor" lenguaje para un escenario dado.
fuente