Skocz do zawartości
  • 👋 Witaj na MPCForum!

    Przeglądasz forum jako gość, co oznacza, że wiele świetnych funkcji jest jeszcze przed Tobą! 😎

    • Pełny dostęp do działów i ukrytych treści
    • Możliwość pisania i odpowiadania w tematach
    • System prywatnych wiadomości
    • Zbieranie reputacji i rozwijanie swojego profilu
    • Członkostwo w jednej z największych społeczności graczy

    👉 Dołączenie zajmie Ci mniej niż minutę – a zyskasz znacznie więcej!

    Zarejestruj się teraz

Rekomendowane odpowiedzi

Opublikowano

588881405006240873334.png


    Scala to stosunkowo nowy, mało popularny obiektowo-funkcyjnym i prężnie się rozwijający się językiem programowania. Skąd jego nazwa? Od skalowalności. Język polecam osobom zaznajomionym z programowaniem, najlepiej w Javie



Co łączy Scale z Javą

   Scala jest językiem kompilowanym do kodu bajtowego Javy, a więc działa na JVM. Można łączyć ją swobodnie z kodem napisanym w Javie - w jednym projekcie może znajdować się jednocześnie kod napisany w Javie i w Scali. Można także korzystać z dowolnych bibliotek napisanych w Javie. Warto zaznaczyć, że istnieje niewspierana i nierozwijana już wersja na .NET.



W Scali wszystko jest obiektem

   Zapis 2 + 2 jest identyczny do 2.+(2). '+' jest więc zwykłą metodą klasy Int. Daje to bardzo wygodne możliwości tworzenia operatorów - każdą metodę można używać jak operator. Jednak po kompilacji Int zmienia się w zwykły, prymitywny int. Funkcje również są obiektami.



Na co Scala pozwala

   Pierwszym atutem są bardzo rozbudowane kolekcje. Znajdują się one w dwóch pakietach:

  • scala.collection.immutable - Kolekcje niemodyfikowalne
  • scala.collection.mutable - Kolekcje modyfikowalne.

Znacznie częściej używane są te znajdujące się w pakiecie immutable. Są one lepiej przystosowane do tworzenia rozwiązań rekurencyjnych i lepiej pasują do idei programowania funkcyjnego. Co udostępniają kolekcje w Scali?

Więcej możliwości można znaleźć tutaj.
 
Kolekcjami znajdującymi się w Scali są standardowo Map, List, Set oraz wiele innych pojawiających się także w innych językach. Dość rzadkim, ale bardzo przydatnym typem jest Stream. Pozwala on na zapisanie w kolekcji nieskończonego ciągu. Jak on to robi? Jako ogon przyjmuje funkcje, którą wykonuje dopiero, gdy go o to poprosimy. Przykład użycia klasy Stream można dostrzec w jednej z metod pierwszego kodu jaki podałem - algorytmie rozwiązującym Water-Pouring Problem. Dzięki tej klasie generowany jest nieskończony ciąg rozwiązań.


http://pastebin.com/thLLMbru

   Singletony uzupełniają w Scali lukę po zmiennych statycznych. Tworzy się je jak klasy z tym, że nie można tworzyć ich obiektów. Same z siebie są obiektami. Singleton i klasa mogą się nazywać identycznie. Bardzo często można się spotkać z istniejącymi obok siebie singletonem i klasą o tej samej nazwie. Aby utworzyć singleton trzeba zastąpić słowo class słowem object:


object Singleton {
  var zmienna = 3
  val stała = 4
  def metoda: Int = 5
}

   Ciało klasy jest jednocześnie jej konstruktorem.  Po utworzeniu obiektu danej klasy wykonuje się kod wewnątrz jej - deklarowane są zmienne, stałe, metody i wykonywany jest kod znajdujący się wewnątrz klasy. Czyli prawidłowym jest:


class Klasa(val argumentKonstruktora: Int) {
  var zmienna = 3
  println("Coś")
  def metoda = 'k'
  print("Coś")
}

Z tego można wywnioskować, że definicja metody jest traktowana na równi ze zwykłym wywołaniem metody, czy tworzeniem zmiennej. I jest to prawda. Można tworzyć metody wewnątrz innych metod, a nawet podczas tworzenia zmiennych:


class Klasa {
  var zmienna = {
    def metoda(a: Int) = a + 1;
    metoda(3);
  }
  def metoda: Int = {
    def metoda2(a: Int) = a + 1;
    metoda2(3);
  }
}

   To, co jest wewnątrz nawiasów klamrowych, jest traktowane jako wartość. W powyższych kodach widać, że po znaku równości przy tworzeniu zmiennej, w nawiasach klamrowych, może znajdować się kod zawierający definicje i wywołania metod oraz inne konstrukcje. Wartością faktycznie uzyskiwaną z zawartości nawiasów klamrowych jest ostatnia podana wartość (lub to, co znajduje się po return, ale to tylko w przypadku metod).



Czym jest REPL

   REPL (read-eval-print loop) to środowisko pozwalające początkującemu na wygodną naukę i analizę bibliotek Scali. Programistom natomiast pozwala na wygodne testowanie API swojej aplikacji i ułatwia przyjęcie strategii TDD:


880261405006373873334.png


Czy Scala pozwala na coś jeszcze

Poza tym, co zdążyłem wymienić, programowanie w Scali umilają jeszcze:

  • Biblioteki do programowania reaktywnego, jak akka i RxScala.
  • Wartości domniemane 
  • Genialny Play Framework
  • ScalaDoc
  • i wiele więcej...

Jak rozpocząć naukę

   Najlepszym źródłem do nauki Scali są archwia kursu prowadzonego przez twórce tego języka - Martina Odersky'ego. Można ewentualnie czekać na następną sesje, ale będzie ona najprawdopodobniej dopiero za rok i zdobyć certyfikat (mi się szczęśliwie udało zapłapać na tegoroczną). Dobrym uzupełnieniem wiedzy po kursie jest książka Joshua Sureth'a "Scala od podszewki".  Poza tym, oczywiście, wspomniana już dokumentacja.
 
Temat przygotowany w całości przez Jaca777. Proszę o zgłaszanie błędów.

708121422388637873334.png

Opublikowano

skoro w Scali wszystko jest obiektem.. to czy na pewno to jest dobre?

prymitywy są jednak szybsze - odnoszą się bezpośrednio do wartości a nie do obiektu.

 

 

PS:mały wynik czasowy liczenia do 100k w javie

Objects: 37133678, 5000050000
Objects: 16879491, 5000050000
Objects: 3538530, 5000050000
Objects: 9777856, 5000050000
Objects: 1030239, 5000050000
Objects: 3133315, 5000050000
Objects: 2004229, 5000050000
Objects: 6375307, 5000050000
Objects: 1091677, 5000050000
Objects: 2332989, 5000050000
Prim: 28397, 5000050000
Prim: 28397, 5000050000
Prim: 28397, 5000050000
Prim: 28398, 5000050000
Prim: 28671, 5000050000
Prim: 28398, 5000050000
Prim: 28397, 5000050000
Prim: 54338, 5000050000
Prim: 28397, 5000050000
Prim: 28398, 5000050000
kod obiektowy:

            long t1 = System.nanoTime();
            Long sum = 0l;
            for (Integer i = 0; i <= 100_000; i++)
            {
                sum += i;
            }
            long t2 = System.nanoTime();
            System.out.println("Objects: " + (t2 - t1) + ", " + sum);
kod prymitywny

            long t1 = System.nanoTime();
            long sum = 0l;
            for (int i = 0; i <= 100_000; i++)
            {
                sum += i;
            }
            long t2 = System.nanoTime();

To już jest koniec smerfa:


http://www.mpcforum.pl/topic/1323530-info-znikam/


GG: 48522543


PS: Na innych forach i stronach znajdziesz mnie pod nickiem: 


BukkitSmerf

Opublikowano

Prawdą jest, że zapomniałem o tym wspomnieć, ale podczas kompilacji Int jest zamieniany w zwykły prymitywny int. Tylko podczas pisania wydaje się, że jest to obiekt. Przykładowo:

object Singleton {
  val a: Int = 19;
  var c = 22;
  def main(args: Array[String]){
    val i1 = args.length + a + c + 20;
    val i2 = ~a;
  }
}
kompiluje się w ten sposób.

708121422388637873334.png

Opublikowano

skoro w Scali wszystko jest obiektem.. to czy na pewno to jest dobre?

prymitywy są jednak szybsze - odnoszą się bezpośrednio do wartości a nie do obiektu.

 

 

PS:mały wynik czasowy liczenia do 100k w javie

Objects: 37133678, 5000050000
Objects: 16879491, 5000050000
Objects: 3538530, 5000050000
Objects: 9777856, 5000050000
Objects: 1030239, 5000050000
Objects: 3133315, 5000050000
Objects: 2004229, 5000050000
Objects: 6375307, 5000050000
Objects: 1091677, 5000050000
Objects: 2332989, 5000050000
Prim: 28397, 5000050000
Prim: 28397, 5000050000
Prim: 28397, 5000050000
Prim: 28398, 5000050000
Prim: 28671, 5000050000
Prim: 28398, 5000050000
Prim: 28397, 5000050000
Prim: 54338, 5000050000
Prim: 28397, 5000050000
Prim: 28398, 5000050000
kod obiektowy:

            long t1 = System.nanoTime();
            Long sum = 0l;
            for (Integer i = 0; i <= 100_000; i++)
            {
                sum += i;
            }
            long t2 = System.nanoTime();
            System.out.println("Objects: " + (t2 - t1) + ", " + sum);
kod prymitywny

            long t1 = System.nanoTime();
            long sum = 0l;
            for (int i = 0; i <= 100_000; i++)
            {
                sum += i;
            }
            long t2 = System.nanoTime();

Lol... Nie w takim sensie.

 

On mowi ze sie zachowują jak obiekty w kodzie a nie ze kod wyjściowy jest obiektowy dla jvm. Wszystko jest normalnie, przykład nic nie wnosi ;o

o8HfXuR.png

CAPSLOCK TEAM - LEPIEJ WIDOCZNI WIDOCZNIE LEPSI

Cała prawda o LittleBlack

Opublikowano

Lol... Nie w takim sensie.

 

On mowi ze sie zachowują jak obiekty w kodzie a nie ze kod wyjściowy jest obiektowy dla jvm. Wszystko jest normalnie, przykład nic nie wnosi ;o

nie napisał o tym na poczatku, teraz dopisał :D A tak to było że niby jest obiektem :<

juz nie mówiąc o tym ile to mi na GG pisał o tym że w scali wszystko jest obiektem.

 

To już jest koniec smerfa:


http://www.mpcforum.pl/topic/1323530-info-znikam/


GG: 48522543


PS: Na innych forach i stronach znajdziesz mnie pod nickiem: 


BukkitSmerf

Opublikowano

nie napisał o tym na poczatku, teraz dopisał :D A tak to było że niby jest obiektem :<

juz nie mówiąc o tym ile to mi na GG pisał o tym że w scali wszystko jest obiektem.

 

 

W javie tez wszystko moze byc obiektem. Spokojnie mozna ten shitty code zamienić na normalny bez zbędnych komplikacji. To wszystko kwestia interpretera/kompilatora.

Ważne jest ze jak sie pisze kod to jest łatwiej, ale najważniejsze to to jak bd wygladal bytecode, java rzadko sobie z tym radzi a scala wyszła trochę na przeciw.

o8HfXuR.png

CAPSLOCK TEAM - LEPIEJ WIDOCZNI WIDOCZNIE LEPSI

Cała prawda o LittleBlack

  • 2 miesiące temu...
  • 5 miesięcy temu...

Zarchiwizowany

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

×
×
  • Dodaj nową pozycję...