2009-06-04 20 views
93

Trabajo para una empresa de tecnología que hace más prototipos que el envío de productos. Me acaban de preguntar cuál es la diferencia entre C# y F #, por qué MS creó F # y qué escenarios sería mejor que C#.¿Cuáles son los beneficios de usar C# frente a F # o F # frente a C#?

He estado usando el lenguaje por un tiempo y me encanta, así que podría continuar sobre las excelentes características de F #, pero me falta la experiencia en C# para decir por qué deberíamos usar una sobre la otra.

¿Cuáles son los beneficios de usar C# frente a F # o F # frente a C#?

+4

Me parece que ya hay un montón de preguntas en SO que, al menos parcialmente, responden a su pregunta. ¿Has intentado buscar utilizando la palabra clave "[F #]" en lugar de "f # palabra clave"? ("[f #] ventajas", por ejemplo) – Benjol

Respuesta

86

beneficios generales de la programación funcional más de los lenguajes imperativos:

Puede formular muchos problemas mucho más fácil, más cerca de su definición y más concisos en un lenguaje de programación funcional como F # y su código es menos propenso a errores (inmutabilidad, sistema de tipo más poderoso, algoritmos recurrentes intuitivos). Puede codificar lo que quiere decir en lugar de lo que la computadora quiere que diga ;-) Encontrará muchas discusiones como esta cuando la busque en Google o incluso la busque en SO.

Especial F # -Ventajas:

  • programación asíncrona es extremadamente fácil e intuitiva con async {}-expressions - Incluso con ParallelFX, el correspondiente C# -code es mucho más grande

  • Very easy integration de los compiladores del compilador y lenguajes específicos de dominio

  • la extensión de la lengua a medida que n EED que: LOP

  • Units of measure

  • sintaxis más flexible

  • menudo soluciones más elegantes

miren this document

Las ventajas de C# son más cortos y que a menudo es más preciso que "imperativo" -aplicaciones (interfaz de usuario, algoritmos imperativos) que un lenguaje de programación funcional, que el .NET-Framework que utiliza está diseñado imperativamente y está más extendido.

Además se puede tener F # y C# juntos en una solución, por lo que puede combinar las ventajas de ambos idiomas y utilizarlos donde se necesitan.

+16

Se combinan de maneras muy extrañas. Por ejemplo, puede sobrecargar el operador> en F #. Los desarrolladores de C# pueden usarlo. Sin embargo, los desarrolladores de F # no pueden. Así es, F # puede emitir sobrecargas de operador que no puede consumir. –

+0

"este documento" se ha roto el enlace ... –

27
  • F# Has Better Performance than C# in Math
  • Usted podría utilizar los proyectos de F # en la misma solución con C# (y llamar de uno a otro)
  • F # es realmente bueno para la programación de algoritmos complejos, aplicaciones financieras y científicas
  • F # lógicamente es realmente bueno para la ejecución en paralelo (es más fácil hacer que el código F # se ejecute en núcleos paralelos, que C#)
+6

Acerca de F # tener un mejor rendimiento que C# para las matemáticas: Aparentemente, eso no es cierto. Ver http://thoughtfulcode.wordpress.com/2010/12/30/is-f-math-really-faster-than-c/ – Joh

+3

@Joh: 'inline' es un ejemplo obvio de algo que puede proporcionar mejoras masivas en el rendimiento en F # que C# no puede expresar. –

+0

@Jon Harrop: Me refería específicamente a la entrada del blog de Rinat. Parece que los tiempos a favor de F # que obtuvo se debieron a un código de C# subóptimo. – Joh

6

Usted está pidiendo una comparación entre un lenguaje procedimental y af lenguaje unctional así que siento que su pregunta puede ser respondida aquí: What is the difference between procedural programming and functional programming?

En cuanto a por qué MS creó F # la respuesta es simple: la creación de un lenguaje funcional con acceso a la biblioteca .Net simplemente expandió su base de mercado. Y viendo cómo la sintaxis es casi idéntica a OCaml, realmente no requirió mucho esfuerzo de su parte.

+1

Aunque creo que su respuesta general es correcta, que la verdadera pregunta es acerca de la comparación de paradigmas de programación y no de idiomas, creo que la respuesta en la pregunta a la que hace referencia es un poco superficial. –

+0

No dude en sugerir otra pregunta si tiene una mejor. Esa es la más alta calificación que encontré en una búsqueda en Google. –

+1

Creo que estaba tratando de ser amable acerca de que sonaba como un asno por decir que F # no requería mucho esfuerzo por parte de Micrsoft. –

36

Es como preguntar cuál es el beneficio de un martillo sobre un destornillador. En un nivel extremadamente alto, ambos hacen esencialmente lo mismo, pero a nivel de implementación es importante seleccionar la herramienta óptima para lo que estás tratando de lograr. Hay tareas que son difíciles y requieren mucho tiempo en C# pero fáciles en f #, como intentar golpear una uña con un destornillador. Puede hacerlo, seguro, simplemente no es ideal.

La manipulación de datos es un ejemplo que personalmente puedo señalar donde f # realmente brilla y C# puede ser potencialmente difícil de manejar. Por otro lado, diría (en términos generales) que la IU con estado complejo es más fácil en OO (C#) que funcional (f #). (Probablemente haya algunas personas que no estén de acuerdo con esto ya que es "bueno" en este momento "probar" lo fácil que es hacer cualquier cosa en F #, pero yo lo defiendo). Hay muchos otros.

+0

+1 ... Excelente analogía –

+22

Si todo lo que tiene es un martillo, todo parece un clavo. -Maslow –

+0

Simpática analogía - Totalmente de acuerdo con usted – Dario

5

F # aún no es otro lenguaje de programación si lo está comparando con C#, C++, VB. C#, C, VB son todos los lenguajes de programación imperativos o de procedimiento. F # es un lenguaje de programación funcional.

Dos ventajas principales de los lenguajes de programación funcionales (en comparación con los lenguajes imperativos) son 1. que no tienen efectos secundarios. Esto hace que el razonamiento matemático sobre las propiedades de su programa sea mucho más fácil. 2. que las funciones son ciudadanos de primera clase. Puede pasar funciones como parámetros a otras funciones tan fácilmente como a otros valores.

Ambos lenguajes de programación imperativos y funcionales tienen sus usos. Aunque todavía no he hecho ningún trabajo serio en F #, actualmente estamos implementando un componente de programación en uno de nuestros productos basado en C# y vamos a hacer un experimento codificando el mismo programador en F # para ver si la corrección del la implementación se puede validar más fácilmente que con el equivalente de C#.

+4

-1. F # es un lenguaje multi-paradigma (OO + FP). Solo ** los lenguajes ** puramente funcionales no tienen efectos secundarios (como Haskell), pero F # no es puro. –

5

F # es esencialmente el C++ de lenguajes de programación funcionales. Conservaron casi todo, desde Objective Caml, incluidas las partes realmente estúpidas, y lo lanzaron encima del tiempo de ejecución de .NET de tal forma que trae todas las cosas malas de .NET también.

Por ejemplo, con el Objetivo Caml se obtiene un tipo de nulo, la opción < T>. Con F # obtienes tres tipos de nulo, opción < T>, Nullable < T>, y nulos de referencia. Esto significa que si tiene una opción, primero debe verificar si es "Ninguna", entonces debe verificar si es "Some (null)".

F # es como el viejo clon de Java J #, sólo un lenguaje bastarda sólo para llamar la atención. A algunas personas les encantará, algunas de ellas incluso lo usarán, pero al final sigue siendo un lenguaje de 20 años añadido al CLR.

+2

+1, esta puede ser la verdad dura y dura, sin embargo, estoy bastante contento de poder utilizar un lenguaje funcional en VS con .NET – gradbot

+0

. Espero que las masas tengan algo de sentido común. ellos y F # 5 serán un poco más pragmáticos. –

+1

Acepto que Nullable debe hacer que el compilador haga un alias mágico para nosotros. No estoy seguro de que hacer que "Some null" sea equivalente a None siempre funcionaría; es posible que algún código de interoperabilidad dependa de él. Pero referencia nulo? ¿Cómo vas a trabajar en un agujero importante en .NET? Ajustar cada tipo de referencia en una opción? En la práctica, esto solo parece ser un problema con ciertos escenarios de interoperabilidad. – MichaelGG

27

Para responder a su pregunta tal como lo entiendo: ¿Por qué usar C#? (Usted dice que ya está vendido en F #.)

primer lugar. No es solo "funcional versus OO". Es "Funcional + OO versus OO". Las características funcionales de C# son bastante rudimentarias. F # 's no lo son. Mientras tanto, F # hace casi todas las características OO de C#. En su mayor parte, F # termina como un superconjunto de la funcionalidad de C#.

Sin embargo, hay algunos casos en los que F # podría no ser la mejor opción:

  • interoperabilidad. Hay muchas bibliotecas que no van a ser demasiado cómodas desde F #. Tal vez exploten ciertas cosas C# OO que F # no hace lo mismo, o tal vez se basan en los componentes internos del compilador C#. Por ejemplo, Expresión. Si bien puede convertir fácilmente una cita F # en una Expresión, el resultado no siempre es exactamente lo que C# crearía. Ciertas bibliotecas tienen un problema con esto.

    • Sí, la interoperabilidad es una red bastante grande y puede provocar un poco de fricción con algunas bibliotecas.

    • Considero que la interoperabilidad también incluye si tiene una gran base de código existente. Puede que no tenga sentido comenzar a escribir partes en F #.

  • Herramientas de diseño. F # no tiene ninguno. No significa que no podría tener, pero ahora mismo no se puede actualizar una aplicación WinForms con código F # detrás. Incluso cuando es compatible, como en las páginas ASPX, actualmente no recibe IntelliSense. Por lo tanto, debe considerar cuidadosamente dónde estarán sus límites para el código generado. En un proyecto realmente pequeño que utiliza casi exclusivamente a varios diseñadores, puede que no valga la pena usar F # para el "pegamento" o lógica. En proyectos más grandes, esto podría convertirse en un problema menor.

    • Esto no es un problema intrínseco. A diferencia de la respuesta de Rex M, no veo nada intrínseco sobre C# o F # que los haga mejores para hacer una interfaz de usuario con muchos campos mutables. Tal vez se refería a la sobrecarga adicional de tener que escribir "mutable" y usar < - en lugar de =.

    • También depende de la biblioteca/diseñador utilizado. Nos encanta usar ASP.NET MVC con F # para todos los controladores, luego un proyecto web de C# para obtener los diseñadores de ASPX. Mezclamos el "código en línea" de ASPX real entre C# y F #, dependiendo de lo que necesitamos en esa página. (Tipos de IntelliSense frente a F #)

  • Otras herramientas. Quizás solo estén esperando C# y no sepan cómo lidiar con proyectos de F # o código compilado. Además, las bibliotecas de F # no se envían como parte de .NET, por lo que tienes un poco más para enviar.

  • ¿Pero el problema número uno? Gente. Si ninguno de sus desarrolladores quiere aprender F #, o peor, tiene dificultad para comprender ciertos aspectos, entonces probablemente esté brindando. (Aunque, de todos modos, diría que estás tostada en ese caso). Ah, y si la gerencia dice que no, eso podría ser un problema.

escribí sobre esto hace un tiempo: Why NOT F#?

5

Uno de los aspectos de .NET que más me gusta son los genéricos. Incluso si escribe el código de procedimiento en F #, aún se beneficiará de la inferencia de tipo. Hace que escribir código genérico sea fácil.

En C#, se escribe un código concreto por defecto, y hay que poner algo de trabajo adicional para escribir el código genérico.

En F #, escribe código genérico de forma predeterminada.Después de pasar más de un año de programación en F # y C#, encuentro que el código de la biblioteca que escribo en F # es más conciso y más genérico que el código que escribo en C#, y por lo tanto también es más reutilizable. Extraño muchas oportunidades para escribir código genérico en C#, probablemente porque estoy cegado por las anotaciones de tipo obligatorio.

Sin embargo, hay situaciones en las que es preferible usar C#, según el gusto y el estilo de programación.

  • C# no impone un orden de declaración entre tipos, y no es sensible al orden en que se compilan los archivos.
  • C# tiene algunas conversiones implícitas que F # no puede permitirse debido a la inferencia de tipo.
Cuestiones relacionadas