Programación * en * un lenguaje vs. escritura de código C en Ruby

10

Code Complete indica que siempre debe codificar en un idioma en lugar de codificar en él. Con eso quieren decir

No limite su pensamiento de programación solo a los conceptos que su lenguaje admite automáticamente. Los mejores programadores piensan en lo que quieren hacer, y luego evalúan cómo lograr sus objetivos con las herramientas de programación a su disposición. (capítulo 34.4)

¿No conduce esto a usar un estilo de programación en cada idioma, independientemente de las fortalezas y debilidades particulares del idioma en cuestión?

O, para poner la pregunta en un formato más responsable:

¿Propondría que uno debe tratar de codificar el problema de la manera más clara posible con los detalles del lenguaje de uno, o debería buscar la solución más elegante en general, incluso si eso significa que necesita implementar construcciones posiblemente incómodas que no existen de forma nativa en el idioma de uno?

bastibe
fuente
55
+1 buena pregunta. Puedo escribir en Perl en media docena de idiomas diferentes, en este momento.
Dan Ray
@Dan Ray - raro! Siempre escribo C en Perl.
James Anderson el
Ver también: Programación "en" un lenguaje versus programación "en" un lenguaje por Jon Skeet
Arseni Mourzenko

Respuestas:

7

Hay un enfoque aún mejor: olvídate de tu patético lenguaje de programación fijo. Codifique su problema en un lenguaje que acaba de inventar, derivado de los términos del dominio del problema relevante, codifíquelo de la forma más natural posible, y solo entonces piense en implementar este nuevo lenguaje de programación o reducir su código a las limitaciones de lenguaje existente

Este enfoque se llama programación orientada al lenguaje . Existen muchas técnicas para implementar los lenguajes específicos de dominio de manera eficiente, y es un tema especialmente candente para la comunidad Ruby.

SK-logic
fuente
1
La comunidad de Haskell también adopta lenguajes específicos de dominio, y el lenguaje de programación de Haskell es particularmente adecuado para implementarlos.
tdammers
¿Implementar un sistema de scripting a medida basado en un lenguaje incrustado como Lua o Tkl se considera escribir un DSL? Si es así, ¿cómo lidiar con las deficiencias de, por ejemplo, Lua?
bastibe
@Paperflyer, en algunos casos tiene sentido implementar lenguajes además de algo como Lua (especialmente si es Metalua), pero es más fácil escribir un compilador adecuado para la mayoría de las DSL típicas.
SK-logic
@tdammers, sí, Haskell y Scala tienen que ver con las DSL. Pero soy del lado más oscuro de la Fuerza: mi enfoque preferido es la metaprogramación. Creo que los intérpretes ad hoc son casi siempre inferiores a los compiladores.
SK-logic
2
@tdammers, un DSL implementado sobre funciones de alto orden es, prácticamente, un intérprete ad hoc. No puede extender la sintaxis de Haskell de la misma manera que extenderá, digamos, Lisp. Incluso con Template Haskell. Es una forma totalmente diferente (y, diría, limitada) de implementar DSL. Está bien en muchos casos, pero para cualquier cosa realmente compleja conduce a implementaciones totalmente ilegibles, mientras que una metaprogramación de varias etapas es simplemente trivial, no importa cuán grande y extraño sea su DSL.
SK-logic
2

Creo que la respuesta correcta, y la que pretende el libro es:

uno debe tratar de codificar el problema de la manera más clara posible con los detalles del lenguaje

Al programar en un lenguaje, siempre asumí que era usar técnicas fuera del estilo normal del lenguaje, lo que conduciría a un beneficio . Esta es una diferencia clave para escribir en un estilo en todos los idiomas.

Por ejemplo, aprender Haskell mejoró enormemente mi habilidad para usar funciones de orden superior. Ahora, cuando programo en c #, utilizo varios IEnumerablemétodos, como Selectmás a menudo, ya que el uso de estos métodos conduce a un código más limpio que escribir bucles. También tiendo a usar las funciones de pasar y usar (es decir Func<int, int>) con más frecuencia debido a mi experiencia en haskell. Mi uso de la herencia ha disminuido debido a esto, y la mayoría de las veces el resultado es un código más simple.

Sin embargo, no uso conceptos como mónadas o tipos de datos algebraicos en c #. Esto se debe a que ninguno de los dos es claramente representable en C # y genera pocos beneficios a cambio de mucha oscuridad.

Entonces uso las herramientas del lenguaje para usar las habilidades que tengo para el mejor efecto. Creo que eso es programar en el lenguaje.

David Miani
fuente
0

¿Propondría que uno debe tratar de codificar el problema de la manera más clara posible con los detalles del lenguaje de uno, o debería buscar la solución más elegante en general, incluso si eso significa que necesita implementar construcciones posiblemente incómodas que no existen de forma nativa en el idioma de uno?

El punto es que los buenos programadores no tienen un lenguaje. La cita del libro habla de "herramientas de programación a su disposición", lo que significa que si conoce perl y Java, entonces tal vez debería usar perl para esa rápida manipulación de cadenas. Los lenguajes de programación no son cuadros para limitarnos, sino herramientas que usamos para resolver problemas. Esto es (imo) a lo que se refiere Code Complete. No codifique en un cuadro de lenguaje / entorno de programación, coloque la mejor solución en el mejor lenguaje / entorno de programación para usted, su problema y su solución.

Telastyn
fuente