開発にどのプログラム言語を使うかは、非常に難しい問題です。選ぶプログラム言語によってできることも違うこともあり、また、プログラム言語によって、開発の工数が変わります。それはすなわち予算に響いてくるので、慎重にならざる負えません。
現段階ではwebサイトの開発や、モバイルアプリの開発ではJavaが使われることが主流ですが、最近ではJavaの上位互換のScalaが使われることも増えています。
開発を外部に委託する場合でも開発会社がどの言語に精通していて、開発の時にどの言語を使うか、その言語はどのようなメリットやデメリットを知っておくことが大事です。この記事ではScalaについて基本的なことを説明します。
![Nao Yanagisawa](https://xs691486.xsrv.jp/wp-content/themes/JITERA/images/director-nao-1.png)
2014年 大学在学中にソフトウェア開発企業を設立
2016年 新卒でリクルートに入社 SUUMOの開発担当
2017年 開発会社Jiteraを設立
開発AIエージェント「JITERA」を開発
2024年 「Forbes 30 Under 30 Asia 2024」に選出
アプリ・システム開発は生成AIを活用することで、従来の開発ではあり得なかった、低コスト・高品質開発・スピード開発が同時に実現できます。
▼従来の開発とAIを使った開発の違い
![](https://xs691486.xsrv.jp/wp-content/uploads/2024/06/ad10-table.png)
![](https://xs691486.xsrv.jp/wp-content/uploads/2024/06/メイン画像-1-1.png)
システムソリューションを得意とし、新規事業からDX推進まで幅広いジャンルの開発実績があります。
Scala言語とは何か?
参照元:Scala
Scala言語とは、プログラム言語のひとつです。この記事を読んでいる方ならすでにご存知のことかも知れませんが、コンピュータに何かを仕事をさせる時は、コンピュータのわかる言葉でなにをするかを記述します。
それをプログラミングと呼びますが、その際に使う言葉がプログラム言語です。実際はプログラム言語でプログラミングしたものをソースと呼びますが、ソースを翻訳(コンパイル)して、機械語というコンピュータにわかるONかOFFか、0か1かで表すものにします。
他にも、コンパイルをしないスクリプト言語とすぐに1行づつ実行するインタプリタ言語というものもあります。スクリプト言語は、通常、WEBブラウザ(今、皆様が見ている画面を出すアプリです。)で表示できるHTMLというマークアップ言語に変換され、実行されます。インタプリタ言語は、言語を実行するアプリから1行づつ実行されます。(Scalaはインタプリタとしても使えます)。
JavaはJavacというコンパイラで翻訳されますが、そのまま実行されるのでなく、JVM(Java Virtual Machine)というアプリ上で実行されます。長々と説明しましたがScala言語も実は、JVM(Java Virtual Machine)で動作します。それを前提として、ここではScala言語とはなにかを詳しく説明します。※ちなみにScalaはスカラと読みます。
Scala言語の定義
Scala言語は、スイス連邦工科大学 (EPFL)という、スイス・ローザンヌにある大学の教授であるMartin Odersky氏が、2001年に設計して、リリースは、2003年にされたJavaと比べると、新しいプログラミング言語となっています。(ちなみにJavaは、1996年にサンマイクロシステムズからリリースされています。現在はOracle社の版権になってます。)
Scaia言語は、MacOS、linuX、Windowsという複数の環境(OS)で使えますので、マルチパラダイムの言語とも呼ばれます。Scala言語の特徴は、オブジェクト指向言語と関数型言語の特徴を統合した言語ということです。
オブジェクト指向は、今やメジャーなプログラミングの手法で、クラスを作って、すべてのものをオブジェクトとして扱うもので、プログラムの改定や再利用に優れています。JavaやC++など、現在、現場でよく使われている言語は、ほとんどがオブジェクト指向のものです。
関数型はまだあまり使われている現場が少ないですが、数学的な意味で使われる関数を主に使うプログラミングの手法で、関数を組み合わせて使います。(数学的意味の関数とは、関数型でないプログラミング言語でも、関数という仕組みがあるので、従来的なプログラミング言語の関数とは違うという意味がありますが、入力した値に対して、必ず同じ計算をおこなって出力するというものです。入力した値によって、違う振る舞いをしないし、外部からの影響を一切受けないということです。)
関数型プログラミングを行うとプログラミングの行数が減り、修正がしやすいです。(通常のプログラミングと違い、分岐(IF)や繰り返し(For)がいらないからです。)Martin Odersky氏がオブジェクト指向と関数型をミックスしたのは、大きなプログラムでも小さなプログラムでも同じ概念で記述できるべきであれという思想からであり、それゆえに名前がスケーラビリティにちなんで、「scalable language」略してScalaとなっています。
Scala言語の主な用途
Scala言語は、Javaとの互換性があり、JVM上で動きますので、Javaを使って作れているものはほとんどScalaで置き換えができますが、現段階で、主にScalaで開発されたものには次のものがあります。
- 1.WEB開発
- 2.スマホアプリ
- 3.業務システム
1.WEB開発
WEB開発の多くは、Javaで開発されることが多いのですが、Javaよりもコーディング数(プログラムの行数)が少なく書けるので、
開発する工数が少なく済む、修正がやりやすい、実行スピードが速いなどの観点で、Scalaで開発することが増えています。代表的なものに以下のWEBサイトがあります。
- ✕(旧Twitter)
- Foursquare
- SmartNews
- Line
大手の企業が多く、Scalaでの開発が信頼性が高いことが、証明されています。
2.スマホアプリ
スマホアプリもAndroidのアプリ開発では、Javaが使われることがありましたが、それゆえScalaが使われるようになってきてます。WeB開発とかぶりますが、以下のスマホアプリがあります。
- SmartNews
- Line
3.業務システム
業務システムとは、企業が内部で使うシステムのことです。人事・経理・営業事務(請求書や見積書、納品書などの作成や発行、印刷)などをおこないます。企業システムでは、エラーが起こりにくい、改訂がしやすいなどの点が求めらるので、Scalaでの開発が適しています。
- サイバーエージェント
- ビズリーチ
- ドワンゴ
いずれも大企業であり、ここでもScalaの信頼性が保証されていると言えるでしょう。
Scala言語のメリット・デメリット
プログラミングというのは、システムの開発におけるひとつの工程です。システムの開発には通常は、要件定義・基本設計・詳細設計・コーディング・テストという工程があります。
テストも単体・結合・総合といういくつかの段階があり、コーディングして、文法エラーというのを取り除き、単体テストを繰り返してバグ(不具合)を取り除き、次の結合テストへ進みますが、コーディングから単体テストまで行うのが、通常、プログラマーの仕事であり、プログラミングと呼ばれます。
開発には納期というものがあり、どのくらいの時間(工数)をかけるのかが、予算となります。そのため、いかにはやくプログラミングを済ませるか、不具合をなくせるかが問われますが、それがプログラム言語のメリット・デメリットになります。ここではScalaのメリット・デメリットを詳しく解説していきます。
Scalaのメリット
どのプログラミング言語にもメリットというものはあります。それぞれのプログラム言語にも特性というものがあり、WEB開発に向いているものや、組み込み(家電や車などのコンピュータシステムに組み込む)に向いているもの、最近、流行りのAI・機械学習にむいているものなど様々で、特性にあうということ自体が、プログラム言語のメリットとなりますが、その他にもコーディングが早くできるなどがプログラミング言語のメリットとなります。そういう観点からScalaのメリットをみていきます。
Javaとの互換性の高さ
Scalaを最初に作ったMartin Odersky氏が、過去にJavaのコンパイラであるJavacの開発や、Javaのジェネリクスの開発に携わった経験があるため、Javaとの互換性が高いです。※ジェネリクス(総称型)というのはプログラミングの手法のひとつですが、説明すると長くなるのでここでは割愛させていただきます。
JavaとScalaの共通点は3つあり、関数型という手法を使うことがなければ、大雑把に言うと変換が可能です。その3つの点とは以下のとうり
- メソッドの定義
- 変数の宣言
- 型の宣言
※メソッドとは、オブジェクト指向の中でクラスに定義する処理を記述するものです。
Javaを知っている人なら、すぐに理解ができますが、上記に加えて、Javaのライブラリが使えますので置き換えがスムーズにいきます。また、Javaの実行環境であるJVM上で、Scalaの作ったプログラムが動きます。
つまりはJavaでの設計や、いままで作ってきた資産がそのまま使えるため開発の工数を削減できます。
使用するソースコードが少ない
関数型プログラミング言語のメリットは、コーディングが少なくて済むということです。【Scala】は【Java】との互換性がありますが、関数型の良いところを取り入れたJavaの上位互換といわれてます。
例えば、ある文字列から特定の文字を探すプログラムをJavaで書くと、少なくても文字列を繰り返し探しなさいという命令(for)と、文字列のなかに、特定の文字はありますかという判定文(if)を書いて、{}で閉じるので、最低でも6行はいりますが、Scalaだと1行で済みます。※実際は戻り値など書くので4行くらいはいる。
実に半分で済みますし、書かれたソースは非常に読みやすくなります。関数型では、分岐や繰り返しの処理が省略されますので短くわかりやすいソースになります。
カリー化
カリー化とは何かを言葉で説明すると複雑なのですが、あえて解説してみます。
まず関数には引数というものがあります。例えば
const add =(X,y)
と書くと、constは無視して、addというのが関数名で、引数が(x,y)になります。
引数は関数に与える値で、変数という名前の入れ物です。
これをconst add =(X,y)=>x + y;というように定義すると、
addはXとyを足しなさいという関数になります。
ここでaddを使う時、普通は、
add(5,1)
add(5,100)
add(5,20)
のように引数が2つ書かなくてはいけませんが、最初の引数add(5 は同じなのに何度も書くのは無駄です。無駄があるプログラムはエラーが起こりやすく、綺麗ではないと言われます。
そこでカリー化という手法を使いますが、
const add = X =>(y)=>x + y;
const add1 = aad(5)
と定義すると
add1(1)
add1(100)
add1(20)
と書けて、常に引数はひとつであるということになります。これは引数に関数をもってくることができるということで、引数を単純化することにより、無駄を省くことや、プログラムが見やすくなります。これがカリー化で、実際はもっと複雑なものとなりますが、要は、カリー化をすると、無駄を省き、プログラムが見やすくなるというメリットがあるということです。
Scalaのデメリット
先程、システム開発の工程の説明をしましたが、プログラミング言語の一般的なデメリットは、人員の確保ということがあげられるとおもいます。
大規模なシステムになればなるほど、開発するプログラム、アプリケーション(ソフトウェアとも言う)の数は膨大になります。その時に何人の人が集められるかはとても重要な問題となります。
昔の言語であるCOBOLという言語はとても覚えやすく、簡単でしたので、すぐにでも使える人が多く出てきました。しかし、現代のweb開発には向いていないため今では、大型コンピュータの開発でしか使われません。ではScalaのデメリットとはなんでしょうか、ここではScalaのデメリットについて解説していきます。
習得のハードルが高い
導入部分で、人員の確保の話を書きましたが、そのプログラミング言語を使うことのできる人材がどのくらいいるのかで集められる人の数が変わります。
ということはそのプログラミング言語は、習得しやすいかどうかという点が問題となってくるのですが、Scalaはオブジェクト指向と関数型の両方に対応しているため、オブジェクト指向だけでも習得するのは難しいのですが、さらに関数型というプログラミングの手法は、まだ、新しい方のものですので、関数型でプログラミングを習得するのはかなり難しいと言えます。
この2つの手法を駆使できるようになれば、自由度の高い、綺麗なプログラミングができるのですが、初心者が習得するにはかなり難しいと言えます。なので、Scalaの開発で、その人員を集めるのはかなり難しいです。
Scala言語の難易度と学習リソース
プログラミングを習得するには、どのような方法があるでしょうか?最近のプログラミング言語は、オープンソースのものが多いので、プログラミングをする環境は個人でも作れることが多いです。
Scalaもプログラミングをする環境をダウンロードして作ることはできます。なので、自分で独学で勉強することも可能ですし、または、プログラミングスクールで学ぶことも可能です。どちらもできますが、お金があるならプログラミングスクールで教えてもらう方がよいですが、無料でも書籍やインターネットの情報を使って学習することもできます。
Scalaのプログラミング用環境はここからダウンロードできます。
参照元:Scala公式サイト
Scala言語の難易度
Scalaは先程も説明しましたが、習得するにはかなりの難しさがあります。そこで先にJavaを学んで見るというやり方もあるかとおもいます。
ScalaはJavaと互換性があるというか、上位互換なので、Javaを先に学んでみるという手はあります。というのもJavaですといろいろな書籍があり、しかも、インターネットでの情報が多い上に、プログラミングスクールでも対応しているところが多いので学びやすいです。
オブジェクト指向を学ぶにはJavaを学んでみるのはおすすめです。また、Scalaは関数型でもあるので、関数型のプログラミング言語であるHaskellを学んでみるのもよいかとおもいます。
Haskellは関数型の考え方を学ぶのにとても適しています。急がば回れではありませんが、まずはこの2つのプログラミング言語を学んでみるというやり方もおすすめです。Javaをすでに習得している方は、関数型だけの勉強をすればよいです。
Scala学習リソース
とはいってもまわり道はしたくないScalaを直接学びたいという方のために、書籍や学習リソースを紹介します。
Scalaのおすすめ書籍
インターネットで学ぶにしろ、プログラミングスクールで学ぶにしても、書籍はやはり何冊かもっていることは
必要です。なにか知りたいときすぐに開いてみることができるからです。
この書籍は、開発者であるMartin Odersky氏が著作者の1人で、かなり丁寧にひとつづつ詳しくScalaについて解説されている本です。Scalaを学ぶ人は必ず持っていて、呼んでみることをおすすめします。
Scalaスケーラブルプログラミングは、かなりの内容で、Scalaのすべてを網羅しているようなバイブルですが、さすがにヘビーなので、その点、この本は、知っておきたいことについて書いてあるので、まずは、一通りScalaを知りたいという人にはお勧めです。
この書籍は、すでにJavaを習得している人向けにScalaのポイントを解説しています。
Javaはすでに、習得済みの方向けです。
やりたいことがなにかがわかっているときは、サンプル集をみた方が早い場合もあります。また、プログラミングはまねて覚えるのも大事なので、サンプル集をみてまねて作ってみるのも勉強になります。この本は、サンプル集の書籍です。
インターネットの情報
独学で勉強する時には、やはり、インターネットでの情報が頼りです。いろいろなサイトがありますが、ここではその中でもいくつかを紹介したいおもいます。
こちらはScalaの公式サイトのドキュメントで日本語で読めます。基本的なことが書いてありScalaの基本的なことがわかります。
公式サイトには、自分のパソコンにScalaの環境をインストールしなくてもwebから使える機能もあり、試してみたい人はこちらを使うのもありです。使い方は上記のリンクの先のドキュメントに書いてあります。
公式サイトには、チュートリアルや他にも学習できる情報がありますが、英語なのでブラウザの翻訳機能を使って読む必要があります。
参照元:Scalaの初心者研修資料 ドワンゴ
企業の業務システム開発で、紹介した角川のドワンゴが作成したScalaの初心者用研修資料です。研修資料なので、一通りScalaでのプログラミングの仕方が書かれています。
他にもインターネット上では、Scalaの情報はたくさんあるので、検索して、自分にあうサイトを見つけて学習ができます。
プログラミングスクール
いくつかのプログラミングスクールで、Scalaのカリキュラムがあるようですが、まだ、Scalaの講師が少ないせいか、はっきりとしたカリキュラムが載ってないので、問い合わせてみることが必要です。
ただし、良い講師(メンター)に教えてもらう方が、独学よりも学習しやすさはあります。躓いた時に質問ができるからです。
独学の場合は、なにかに躓くと、めげてしまい投げ出すことが多いので、予算があるならプログラミングスクールに通う(またはオンラインで学ぶ)のはお勧めです。
下記は、数々のプログラミング言語を学べるサイトですが、自分で動画を見て勉強するスタイルです。比較的プログラミングスクールよりは予算が低く済みますが、Scalaの講座が英語でしかないので、英語でもやれる自信のある方向けです。
参照元:udemy
Scala言語の基本構文
Scalaの基本構文を説明していきますが、ここではある程度のプログラミング経験がある方向けの解説となります。
また、1からすべてを紹介すると1冊の本になりますので、あくまでもScalaとはなんとなくこういうものかというのがわかるような解説となります。そのことを前提として、いくつかのポイントで基本構文を紹介します。
なお、Scalaは関数型に関すること以外は、Javaと似ていますが、一部、記述の仕方が異なっているものもあります。
変数とデータ型
プログラミング言語には、必ず変数というものがあります。変数名はアルファベット名で、わかりやすいものをつけます。プログラミング言語には、予約語といって、プログラムで使う言葉もあるので、それと同じものをつけてはいけません。
アルファベットの1文字目は大文字にします。これを、「キャメルケース」命名規約といいます。
変数は、この変数名を使いますと宣言というものをおこないます。
Javaと変数の宣言の仕方は、違っています。Scalaの場合は以下のように記述します。※一部、Javaと似てます
val 変数名: 変数の型 = 値 |
または、
var 変数名: 変数の型 = 値 |
varとvalの違いは、valは一度値を入れると違う値を入れられなくなります。Javaのfinal変数と同じです。
型を省略することもできます。※JavaもJava10からvarによる変数名の宣言(型の宣言がいらない)ができるようになっています。
var 変数名 = 値 |
型というのは変数に入るものが何(属性)を許すかを決めるものです。型で決めらたもの以外の属性を持つものは、その変数きはには入れられません。
型を省略した場合は、型推論といって、入れる値によって、型が自動的にきめられます。
型には、以下のものがあります。
名前 | 属性 |
BooleanString | 真偽値(true|false) |
Char | 文字(‘a’) |
String | 文字列(“ABC”) |
Byte | 8ビット整数(127) |
Short | 16ビット整数(32767) |
Int | 32ビット整数(2147483647) |
Long | 64ビット整数(9223372036854775807L) |
BigInt | 任意精度整数 |
Float | 32ビット浮動小数点数(1.2f) |
Double | 64ビット浮動小数点数(1.2e3) |
BigDecimal | 任意精度浮動小数点数 |
Symbol | シンボル |
Unit | ユニット |
(())Any | 任意型(Any) |
Option | オプション |
制御構文
前に解説しましたが、関数型プログラミングでは、IF(分岐)FOR(繰り返し)という手続き型言語の制御構文は関数を使うので、極力なくなる方向でプログラミングを考えますが、(純粋な関数型では思想的に存在しない)なくしてしまう訳にもいかず必要な場合は使います。特にScalaはJavaと互換性があるので、制御構文というのが存在しています。いくつか紹介いたします。
条件分岐 if文
|
または
|
繰り返し while文
|
繰り返し For文
|
または
|
for文の例 Xを1から5まで変化させて、Yを1から4まで変化させて画面に出力しています。
|
関数とオブジェクト指向
ここからの話はオブジェクト指向のある程度の知識がある前提で解説していきますが、オブジェクト指向は、クラスをまず作って、クラスからオブジェクトを生成して、使います。クラスの中に変数(フィールド)やメソッドが指定というか設定できます。Scalaではクラスの定義を以下のようにします。
|
座標を示すクラスを作るとしたら、次のようなクラスを作成します。
class Zahyo(var x: Int, var y: Int)
{ def move(dx: Int, dy: Int): Unit = { x = x + dx y = y + dy } override def toString: String = s”($x, $y)” } val Point1 = new Zahyo(2, 3) Point1.x // 2 println(Point1) // (2, 3) |
この実利はクラス名 Zahyo で、変数XとYをもち、メッソドにはdef を点けます。ここではmoveとtoStringがメッソドとなります。val point1 = new Zahyo(2, 3) point1.xで,クラスZahyoをオブジェクト生成してます。
下の2行は、値の出力をしています。
Javaと違うところは、メッソドにdefをつけなけばいけないというところです。
関数については、単純に関数を定義するには以下のようにします。
(パラメーターリスト) => 式 or ブロック |
実例
(x: Int, y: Int) => x – y |
この定義した関数の使い方
val sub = (x: Int, y: Int) => x – y
val result = sub(3, 1) println(result) //2 |
このようにして、Scalaでは関数を使います。実際はもっと複雑なことをしますが、基本はこの形になります。
Scala言語の将来性
Scalaは。Javaとの互換性があり、プラスで、関数型の手法も使えるために、Javaよりもソースが短く、わかりやすくなり、開発の工数を減らすことができます。しかもマルチな環境(数々のOS)で使えるため、webサイトの作成、モバイルアプリ、業務システムの開発といろいろな分野で使われることができ、これからも数々な開発で使われることが予測されますが、
ただ、習得の難しさ、特に関数型のプログラミングがまだメジャーでないために、果たしてJavaのように多くの開発に使われるようになるかは、まだ、未知数です。
しかし、Javaもまだ、20年くらい前は、大企業でない現場では、オブジェクト指向を使わずᴄ言語のような使い方をして普及していきました。オブジェクト指向の設計がまともにおこなわれるようになったのは10年くらい前なので、Scalaも最初はJavaと同じような使われ方をして、やがて、関数型も普通に使われるようになっていき、Javaに置き換わってくるかもしれません。
scalaのまとめ
Scala言語は、スイス連邦工科大学 (EPFL)という、スイス・ローザンヌにある大学の教授であるMartin Odersky氏が、2001年に設計して、リリースは、2003年にされたJavaと比べると、新しいプログラミング言語となっています。
Scalaは、Javaの上位互換と呼ばれ、オブジェクト指向と関数型の両方の手法に対応しています。
関数型に対応しているため、ソースが簡潔になり、Javaと比べると3分の1程度になります。ソースが短くなるということは開発の工数が減ります。工数が減るということは、開発にかかる予算が減ることになります。これがScalaのメリットです。
オブジェクト指向は、プログラムの改訂や修正に長けていますが、さらに関数型に対応することによってよりプログラムが見やすく、綺麗になります。
逆にデメリットとしては、オブジェクト指向だけでも、初心者には、習得が難しいのですが、さらに関数型ということで初心者には壁の高いプログラミング言語となっています。
現在は、開発現場で使われるプログラミング言語は、Javaですが、Scalaに置き換わる可能性はあります。
Scalaを使った、業務システムの開発社会社の選定に迷った場合は、実績豊富な株式会社Jiteraに一度ご相談ください。貴社の要件に対する的確なアドバイスが提供されると期待できます。