2010-10-30 7 views
15

Estoy absolutamente feliz con Scala y sólo lo amo :)¿Qué segundo idioma usar además de Scala para LowLevel?

Pero a veces lo que realmente quiero ir un poco más "bajo nivel", sin una JVM y el uso de "cool" de CPU Características como SSE etc.

Entonces, ¿cuál sería un buen segundo idioma además de Scala?

Debería ser:

  • compilado a código máquina
  • Facilidad de uso de C-bibliotecas
  • posible programar muy cerca del hardware
  • posible programar en un muy alto nivel de ida cuando quiero

Así que, básicamente, quiero un Scala donde puedo simplemente poner en línea el ensamblador cuando quiero :) Culo ume, que tal lenguaje no existe, pero tal vez hay algunos que se acercan.

Entonces, ¿cuál sería una buena opción? C++ ?, D ?, OCaml?

Programé un bit en C++ (hace 15 años) y muy poco con OCaml. En ambos casos, solo resolví algunos problemas y nunca me puse muy "profundo" en el lenguaje en sí.

+0

Gracias por todas las respuestas. Definitivamente hay muchos idiomas que veré. El mayor problema que tengo con la mayoría de los idiomas es, en realidad, que no estoy seguro de que estén presentes en 10 años. Supongo que D sería el mejor compromiso de un idioma relativamente nuevo que parece ser al menos algo apoyado por una audiencia mayor. C++ 0x y JNI también es algo que parece práctico. –

+0

Creo que Rust tiene mucho potencial y mucho impulso alrededor. Es un lenguaje moderno, con requisitos modernos y decisiones de diseño modernas. Como Rust está respaldado por Mozilla y están escribiendo un nuevo navegador sobre Rust, diría que hay buenas posibilidades de que esté aquí para quedarse y florecer. –

Respuesta

18

Que está bastante describir D.

  • compilado a código máquina: Comprobar. Existe una implementación experimental de .NET VM, pero las tres principales implementaciones (DMD, LDC, GDC) se compilan directamente en código nativo y el lenguaje está diseñado para hacer posible la compilación nativa.

  • Fácil uso de las bibliotecas C: D supports the C ABI and all C types. Casi todo lo que tiene que hacer es traducir el archivo de encabezado y el enlace en el archivo de objeto C. can even be partially automated.

  • Posible programar muy cerca del hardware: Verificar. D es lo que yo llamaría un superconjunto idiomático de C. No admite cada pieza de sintaxis C, su sistema de módulo es completamente diferente, las matrices estáticas son tipos de valores en D2, etc. Sin embargo, para cualquier construcción en el lenguaje C propiamente dicho (es decirexcluyendo el preprocesador) hay una construcción equivalente en D o en la biblioteca estándar. Para cualquier fragmento de código C (excluyendo el abuso de preprocesador) hay una traducción canónica de D que se ve más o menos igual y debe generar las mismas instrucciones de lenguaje ensamblador si está utilizando el mismo backend del compilador. En otras palabras, cada idioma C (excluyendo el abuso de preprocesador) se puede traducir a D de una manera directa.

    La implementación de referencia de D también es compatible con inline ASM, por lo que puede meterse con SSE, etc.

  • posible programar en una vía de alto nivel muy cuando quiero: Check. D está diseñado para ser principalmente un lenguaje recogido de basura (aunque puede usar la administración de memoria manual si insiste y tiene cuidado de no utilizar las características de biblioteca/tiempo de ejecución que asumen GC). Aparte de eso, la programación de alto nivel se implementa principalmente a través de la metaprogramación de plantillas. Antes de huir, tenga en cuenta que la metaprogramación de plantillas en D ha mejorado mucho en comparación con C++. Hacer metaprogramación de plantillas en D vs. C++ es como hacer programación orientada a objetos en C++ vs. C. En la metaprogramación de plantillas D está diseñada en el lenguaje, mientras que en C++ hay suficientes funciones que puede usar astucia inteligente para que apenas funcione . Lo mismo podría decirse de la programación orientada a objetos en C++ vs C. Los std.algorithm y std.range módulos de Fobos son buenos ejemplos del subgrupo de alto nivel de D.

+2

Programa de hombres reales en C usando un editor de texto ;-) –

6

Estoy pensando en esto, también, ya que actualmente estoy haciendo un proyecto de C y me siento muy improductivo, también me falta Scala. (También hice un montón de C++ en el Pleistoceno ...) Puedo cambiar para irme. D también se ve atractivo.

Otra opción, si tiene sentido para el problema, es usar C + un lenguaje de scripting, como Lua o Ruby. Es lo que han hecho siempre las conchas Unix + y los emacs. Obtienes rendimiento y movimientos de bits de bajo nivel cuando lo necesitas y productividad cuando eso es más importante.

3

Algo que se ajuste a sus necesidades es C/C++, ya que puede alinear el lenguaje ensamblador con código normal. Llamando bibliotecas de C será natural :)

Otra cosa que se ajusta es el HLA implementation del lenguaje ensamblador (wiki artículo here) - es el montaje con una gran cantidad de construcciones de alto nivel para facilitar las cosas (y más rápido) para los principiantes a aprender (compila al código nativo "apropiado").

1

Usted debe echar un vistazo a Go.

8

Éstos son algunos que satisfacen los criterios mencionados en su pregunta:

+0

Cambie el enlace de BitC a uno utilizable ... también si hago clic en Clay, se devuelve una página "no encontrada". – nbro

+0

@nbro, la respuesta fue publicada hace seis años. No puedo evitarlo si los enlaces han dejado de funcionar desde entonces. No soy dueño de esos sitios web. – missingfaktor

+0

@nbro, no lo soy. Si encuentras un enlace roto, puedes tomar la libertad de solucionarlo. No asuma que todos tienen tiempo en sus vidas para seguir actualizando sus respuestas de StackOverflow publicadas hace más de cinco años. – missingfaktor

5

C++ 0X, Erlang y tal vez Haskell and Go. C++ y Erlang tienen una sólida base de usuarios y hay muchos trabajos disponibles con C++ 0x y Erlang. (No estoy seguro de cuán buena es la interoperabilidad de C/C++ con Go)

C++ 0X ("cee plus plus oh ex") es una buena opción. Tiene lamda functions y otro good stuff.

walktrough de C++ 0X TechDays 2010: Modern Programming with C++0x

También C++ 0X tiene buen soporte Generics como se documenta en Type Classes as Objects and Implicits, Oliviera, Moors, Odersky, OOPSLA 2010. Ver la Figura 12 a continuación:

Figure 12 from Type Classes as Objects and Implicits

1

Todavía es muy nuevo, pero échale un vistazo a Vala. Es una capa dulce de glaseado sintáctico en la torta GObject y compilada en C. puro

Es compatible con funciones como cierres e inferencia de tipo limitado.

1

Piense en usar C o C++ para la programación de nivel más bajo, y luego envolver eso con JNI o ​​JNA en una biblioteca de Scala. En algunos casos, puedes tener tu pastel y comértelo también de esta manera.

+0

¿Sabes cuánto de esto produce una sobrecarga? ¿Es solo práctico llamar a una función "grande" o puede llamar a muchas funciones pequeñas sin preocuparse por una sobrecarga? –

+1

@ Plankalkül - Solía ​​saber exactamente, pero desde entonces lo he olvidado. La esencia de esto es que es una mala idea usarlo en algo como la multiplicación, pero una vez que se llega a algo tan complejo como la multiplicación de enteros grandes hechos de unas pocas docenas de enteros primitivos, es insignificante. Hasta ahora siempre lo he usado en casos en los que C/C++ tenía tanto trabajo que hacer que no tenía que pensar en la sobrecarga de la llamada. –

+0

Gracias, definitivamente es bueno saberlo. –

2

Creo que Nimrod es también un candidato válido aquí en función de sus requisitos.

Cuestiones relacionadas