[PYTHON] Ich habe Java und Ruby persönlich verglichen
Ich wurde beim Interview gefragt und konnte nicht antworten, also hatte ich Schmerzen, also werde ich es für mich selbst organisieren.
Überblick
Mein Erfahrungszeitraum ist wie folgt (Stand Juli 2020)
Sprache |
Nutzungsdauer |
Verwenden Sie Anwendungen |
Python |
2018.5 ~ 2020.3 |
(1)Datenanalyse einschließlich Web Scraping und maschinellem Lernen auf Jupyter Notebook(2)AWS Lambda-Ausführungsskript und AWS Batch-Ausführungsdatei in MLOps |
Java |
2018.8 ~ 2019.5 |
Standalone-App-Entwicklung mit Java |
Ruby |
2019.11 ~ |
Web-App-Entwicklung mit Rails |
――Es war Java, das die Grundlagen der Objektorientierung und Systementwicklung erlernt hat, und Ruby on Rails, das die Webanwendung tatsächlich erstellt hat.
- Django in Python hat nur ein Tutorial gemacht
――Da PYthon hauptsächlich für die Datenanalyse verwendet wurde, werden wir Java und Ruby vergleichen, die Erfahrung in der Systementwicklung haben.
Java
- Ein Bild, das häufig in Datenverarbeitungssystemen wie Kafka und Hadoop verwendet wird.
--Kompilierte Sprache beschleunigt die Verarbeitung
--Bytecode kompilierte Sprache
- Mit anderen Worten, wenn es mit dem Befehl javac kompiliert wird, ist es ** Bytecode (Zwischencode) ** anstelle der Maschinensprache.
- Die Software wird in diesem Zustand verteilt und funktioniert überall mit einer JVM.
- Die JustInTime-Kompilierung (Laufzeitkompilierung) dieses Bytecodes in der JVM wird auf der CPU ausgeführt, während sie in Maschinencode umgewandelt wird.
--JIT-Kompilierung dient zum Kompilieren des Codes einer bestimmten Einheit, z. B. von Modulen, Klassen und Funktionen, aus denen die Software zum Zeitpunkt ihrer Ausführung besteht.
――Ich höre oft, dass Sie Multithreading können. [Einführung in Entwurfsmuster mit mehreren Threads](https://www.amazon.co.jp/%E5%A2%97%E8%A3%9C%E6%94%B9%E8%A8%82%E7%89 % 88-Java% E8% A8% 80% E8% AA% 9E% E3% 81% A7% E5% AD% A6% E3% 81% B6% E3% 83% 87% E3% 82% B6% E3% 82 % A4% E3% 83% B3% E3% 83% 91% E3% 82% BF% E3% 83% BC% E3% 83% B3% E5% 85% A5% E9% 96% 80-% E3% 83% 9E% E3% 83% AB% E3% 83% 81% E3% 82% B9% E3% 83% AC% E3% 83% 83% E3% 83% 89% E7% B7% A8-% E7% B5% 90 % E5% 9F% 8E-% E6% B5% A9 / dp / 4797331623) Es ist aus.
Ruby
- Ich habe noch nie gesehen, dass es für etwas anderes als das Webframework (Rails) verwendet wird.
- Die Verarbeitungsgeschwindigkeit ist in einer Dolmetschersprache (anscheinend) langsam.
――Es ist einfach zu schreiben. Das Folgende sind die Faktoren.
- Die Methode () ist optional. Ich fühle mich persönlich unwohl ...
--Alias wird häufig an die Methode der Klasse angehängt. (Beispiel)
--Einführung von Blöcken.
――Ist dies nicht eingeführt, um das Lesen zu erleichtern? Ich fühle. Es scheint kein Problem zu geben, eine Lambda-Funktion anstelle eines Blocks im Argument der Methode zu übergeben.
-Blöcke einführen und dann Blöcke
{|x|...}
Auchdo |x| ... end
Indem Sie jeweils den Schreibstil zulassen/map/Einfaches Schreiben in Kombination mit funktionaler Programmierung wie Filter/Die Lesbarkeit wurde stark verbessert.(Als ich das Folgende zum ersten Mal sah, fragte ich mich wirklich, wie diese Art des Schreibens eine akzeptable Sprachspezifikation sein würde.)
[1, 2, 3].map do |each_num|
each_num + 1
end
--Konstanten können umgeschrieben werden
--Konstanten sind Variablen, deren Namen mit einem Großbuchstaben beginnen, z. B. Var.
- Sie können eine Konstante neu zuweisen und eine destruktive Methode der Konstante ausführen (obwohl eine Warnung ausgegeben wird).
- Die Einfriermethode kann zerstörerische Methoden verhindern
- Sie können Metaprogrammierung (schwarze Magie) durchführen.
――Es ist einfach für Leute, Code zu schreiben, aber Leute, die Code lesen, mögen ihn nicht so sehr, weil es ziemlich schwierig ist, ihn zu verfolgen.
- Dies wird durch die folgende Methode erreicht.
- Das String-Objekt kann als Code mit
eval" @ # {key} = value "
interpretiert werden
- Mit
define_method str {...}
können Sie Methoden dynamisch in eine Klasse einfügen
--Dynamischer Methodenaufruf ist mit send (: Methodenname, Argumente)
möglich
- Ich habe nicht viele Multithread-Programme gesehen.
Java vs Ruby
-
Implementierte Java-Schnittstelle <=> MixIn Ruby-Modul
-
Die Java-Schnittstelle implementiert den Inhalt der Methode nicht
-
Der Inhalt des für MixIn of Ruby verwendeten Moduls ist implementiert.
-
Es ist möglich, die Instanzvariable / Methode der Include-Quellklasse über die Instanzmethode des Moduls aufzurufen
-
Es wird erwartet, dass Sie den Anrufer zum Zeitpunkt des Schreibens des Moduls kennen müssen. Ich finde es nicht sehr gut.
-
Für jede Methode in Java ist eine Fehlerbehandlung erforderlich. <=> In Ruby nicht erforderlich
-
In Java müssen für jede Methode Ausnahmen behandelt (oder Ausnahmen explizit ausgelöst) werden.
--RuntimeException und IllegalArgumentException müssen nicht sein
-
Wenn in Ruby ein nicht behandelter Fehler in einer Methode auftritt, wird die aktuelle Methode an diesem Punkt beendet und der Fehler vom Aufrufer geerbt.
-
Übrigens, mit `Rails, als ich erfuhr, dass es eine Spezifikation gibt, dass eine HTTP-Antwort mit einem 404-Fehler zurückgegeben wird, wenn ActiveRecord :: RecordNotFound, das im aktiven Datensatz aufgetreten ist, nicht explizit von der Aktion des Controllers behandelt wird, ist dies tatsächlich der Fall. Ich war beeindruckt, dass es gut gemacht war.
-
Übrigens wird in Golang das Fehlerobjekt als Rückgabewert zurückgegeben.
--Primitiver Typ existiert in Java <=> In Ruby sind alle Werte Objekte
- In Java sind
boolean, byte, char, short, int, float long, double
primitive Typen.
- Für diese gibt es eine Wrapper-Klasse. Wenn Sie beispielsweise int als Listenelement einschließen möchten, verwenden Sie den Wrapper-Typ java.lang.Integer anstelle von "List ", um "List " zu erstellen.
- Der Vorteil der Verwendung des primitiven Typs ist [hier](http://itstudy365.com/blog/java-%E3%83%97%E3%83%AA%E3%83%9F%E3%83%86%E3% 82% A3% E3% 83% 96% E5% 9E% 8B% E3% 81% AE% E3% 83% A1% E3% 83% AA% E3% 83% 83% E3% 83% 88% E3% 81% Detailliert in A3% E3% 81% A6 /). Ich wusste es nicht...
- In Ruby ist Integer auch eine Klasse, sodass Sie eine Methode aus einem numerischen Wert wie
3.each {...}
erstellen können.
――Dies scheint auch zu dem Ruf beizutragen, dass es Spaß macht, Ruby zu schreiben.
――Es ist kompliziert und betont, dass die Bedeutungen von gleich und == entgegengesetzt sind.
- In Java ist
== Identität
und .equals () ist Äquivalenz
.
--Verwenden Sie .equals () , um die Schlüssel von
Hash zu vergleichen. (Bestätigt unter hier)
- Wenn Sie equals () überschreiben, müssen Sie auch hashCode () überschreiben.
- Es ist nicht erlaubt, dass "A.equals (B) false" ist, aber "A und B haben unterschiedliche hashCode ()".
- Es ist zulässig, dass "A und B hashCode () gleich sind", obwohl "A.equals (B) false" ist. In diesem Fall tritt jedoch Kollision in dem von der Kettenmethode implementierten Hash auf.
- In Ruby ist
== äquivalent
und gleich? () Ist identisch
- Verwenden Sie eql?
Um die Schlüssel von
Hash zu vergleichen. Dies ist die Summe von "gleich ()? + Ist die Klasse der beiden zu vergleichenden Objekte gleich?".
- Wenn Sie eql? () Überschreiben, müssen Sie auch hash () überschreiben.
- Es ist nicht erlaubt, dass "A.eql? (B) falsch ist", aber "A und B Hash () sind unterschiedlich".
- Es ist zulässig, dass "A und B Hash () gleich sind", obwohl "A.eql? (B) falsch ist". In diesem Fall tritt jedoch Kollision in dem von der Kettenmethode implementierten Hash auf.