C'est mon avis que chaque langue a été créée dans un but spécifique. Quel était Scala Créé-t-il et quels problèmes résolvent-il le mieux?
Une des choses mentionnées dans Tanks by Martin Odersky sur Scala est-ce une langue qui s'attaque à divers problèmes. Il ne parlait pas de l'échelle dans le Sens de la performance, mais dans le sens où le la langue elle-même peut semble à expansion via des bibliothèques. Pour que:
val lock = new ReentrantReadWriteLock
lock withReadLock {
//do stuff
}
On dirait qu'il y a du sucre syntaxique spécial pour traiter j.u.c
serrures. Mais ce n'est pas le cas, il suffit d'utiliser le scala Language de telle manière que cela apparaît Pour être. Le code est plus lisible, n'est-ce pas?
En particulier, les différentes règles d'analyse du scala Language facilitent la création de bibliothèques qui ressemblent à une langue (ou à une DSL) spécifique au domaine. Regardez Scala-Test par exemple:
describe("MyCoolClass") {
it("should do cool stuff") {
val c = new MyCoolClass
c.prop should be ("cool")
}
}
(Il y a beaucoup plus d'exemples de cela - j'ai découvert celui-ci hier). Il y a beaucoup de discussions sur les nouvelles fonctionnalités dans le Java Langue dans JDK7 ( Connecte de projet ). Beaucoup de ces fonctionnalités sont du sucre syntaxique spécial pour traiter certaines Numéro. Scala a été conçu avec des règles simples qui signifient de nouveaux mots-clés pour chaque peu de contrariété ne sont pas nécessaires.
Un autre objectif de Scala= était de combler le fossé entre fonctionnel et orienté langues. Il contient de nombreuses constructions inspirées (c'est-à-dire copie de!) Langues fonctionnelles. Je suis une chose de l'incroyablement puissant assortie de motif , le Cadre de concurrence basé sur l'acteur et (bien sûr) fonctions de premier ordre et d'ordre supérieur.
Bien sûr, votre question a dit qu'il y avait un but spécifique et je viens de donner 3 raisons distinctes; Vous devrez probablement demander à Martin Odersky!
D'accord avec les réponses précédentes, mais recommandez l'introduction à ne vue d'ensemble du langage de programmation Scala :
Le travail sur Scala découle d'un effort de recherche visant à développer une meilleure prise en charge des langues pour le logiciel composant. Il y a deux hypothèses que nous aimerions valider avec l'expérience Scala. Premièrement, nous postulons qu'un langage de programmation pour le logiciel de composant doit être évolutif en ce sens que les mêmes concepts peuvent décrire de petites parties aussi bien que de grandes parties. Par conséquent, nous nous concentrons sur des mécanismes d'abstraction, de composition et de décomposition plutôt que d'ajouter un ensemble important de primitives qui pourraient être utiles pour les composants à un niveau d'échelle, mais pas à d'autres niveaux. Deuxièmement, nous posturons que la prise en charge évolutive des composants peut être fournie par un langage de programmation qui génère et généralisce la programmation orientée objet et fonctionnelle. Pour des langues typées statiquement, dont Scala est une instance, ces deux paradigmes étaient jusqu'à présent largement séparés. (Odersky)
Je qualifierais personnellement Scala à côté de Python en termes de problèmes qu'il résout et comment. La différence remarquable et la plainte occasionnelle est la complexité de type. Je pense que les abstractions de Scala sont compliquées et sont parfois apparemment convoluées mais pour quelques points:
Par exemple, une chaîne (ou plutôt: sa classe de support) peut être considérée comme une séquence de caractères, mais ce n'est pas un type de collecte générique. Néanmoins, cartographier un caractère à la carte de caractère sur une riche riche devrait donner à nouveau un riche riche, comme dans l'interaction suivante avec la Scala RÉPP:
scala> "abc" map (x => (x + 1).toChar)
res1: scala.runtime.RichString = bcd
Mais que se passe-t-il si on applique une fonction de caractère à une chaîne? Dans ce cas, nous ne pouvons pas produire de chaîne en conséquence, il doit s'agir d'une séquence d'éléments int. En effet, on obtient:
"abc" map (x => (x + 1))
res2: scala.collection.immutable.Vector[Int] = Vector(98, 99, 100)
Donc, il s'avère que la carte donne différents types en fonction de ce que le type de résultat de l'argument de fonction réussi est! (Odersky)
Un autre des objectifs de conception originaux était bien sûr de créer une langue qui fonctionne sur la machine virtuelle Java et est entièrement interopérable avec des classes Java. Cela a (au moins) deux avantages: