Google Colaboratoryで実行できる主な言語と環境構築方法まとめ

こんにちは。うっかりじゅうべえ(@u-10bei)と申します。
Qiitaには、様々なコードがアップされています。  
「これ、ちょっと試してみたい」と思っても、専門外の言語だと環境構築するのが面倒だとつい思ってしまいます。  
そこで、[Google Colaboratory](https://colab.research.google.com/?hl=ja)で実行できる言語とその方法についてまとめてみました。

---

# 前提条件
[TIOBE Index](https://www.tiobe.com/tiobe-index/)2023年3月版でランキング上位１０位に入っている言語を対象に、試してみることにします。

---

## 第１位　Python  
これについては、そもそもリンク先で使い方が詳しく掲載しているので説明不要かと思います。
ただし、2023年3月時点では、Python3系しか実行できないようです。

---

### 無理やりPython2系を実行したいとき
まず、Colabの裏で何のOSが動いているか確認します。
```bash:コマンド
!lsb_release -a
```
```:実行結果
No LSB modules are available.
Distributor ID:	Ubuntu
Description:	Ubuntu 20.04.5 LTS
Release:	20.04
Codename:	focal
```
今回（2023年3月15日実行）は、Ubuntu20.04が動いているようです。
ならば、普通にaptでインストールできるはず。
```bash:コマンド
!apt -y install python2
```
でインストールする事ができました。
ちなみにバージョン確認してみると、
```bash:コマンド
!python2 --version
```
```:実行結果
Python 2.7.18
```
と実行できるようになってます。

---

### コードの書き方
```Python:コード
%%python2
print 1+2*3-4/5
```
```:実行結果
7
```
のように、セル内でマジックコマンド```%%python2```を最初に宣言してあげると実行できます。  
参考：[マジックコマンドの使い方](https://ipython.readthedocs.io/en/stable/interactive/magics.html)

---

## 第２位　C 、第４位　C++ 
@nsd24さんの投稿 [^1]を参考に試してみました。

---

### ツールの導入
```bash:コマンド
!gcc --version
!g++ --version
```
で確認すると、
```:実行結果
gcc (Ubuntu 9.4.0-1ubuntu1~20.04.1) 9.4.0
Copyright (C) 2019 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

g++ (Ubuntu 9.4.0-1ubuntu1~20.04.1) 9.4.0
Copyright (C) 2019 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
```
と実行できるようになってます。そこで、
```bash:コマンド
!apt install build-essential
```
でツールを導入します。

---

### ファイルの作成とコンパイル

ファイルの作成は、マジックコマンド```%%writefile```を使います。
```C:Cのコード
%%writefile hello.c
#include<stdio.h>
int main(void)
{
    printf("Hello World!\n");

    return 0;
}
```
```C++:C++のコード
%%writefile hello.cpp
#include <iostream>

int main()
{
    std::cout << "Hello World!!!" << std::endl;

    return 0;
}
```
C言語はコンパイラ言語なので、コンパイルします。
```bash:コマンド
!gcc hello.c -o hello
!g++ hello.cpp -o hello2
```

---

### 実行
```bash:コマンド
!./hello
!./hello2
```
とすると、
```:実行結果
Hello World!
Hello World!!!
```
と返ってきます。

---

## 第３位　JAVA  
@ryomeさんの投稿 [^2]を参考に試してみました。

---

### 実行環境の確認
```bash:コマンド
!java -version
```
で確認すると、
```:実行結果
openjdk version "11.0.18" 2023-01-17
OpenJDK Runtime Environment (build 11.0.18+10-post-Ubuntu-0ubuntu120.04.1)
OpenJDK 64-Bit Server VM (build 11.0.18+10-post-Ubuntu-0ubuntu120.04.1, mixed mode, sharing)
```
とすでに実行環境はあるようです。

---

### ファイルの作成とコンパイル

Cの時と同様、マジックコマンド```%%writefile```でファイルを作成します。
```JAVA:コード
%%writefile Hello.java
public class Hello{
   public static void main(String[] args){
     System.out.println("Hello World!!");
   }
}
```
JAVAもコンパイラ言語なので、コンパイルします。
```bash:コマンド
!javac Hello.java
```

---

### 実行
```bash:コマンド
!java Hello
```
とすると、
```:実行結果
Hello World!!
```
と返ってきます。

---

## 第５位　C#、第６位　VB
Microsoftの公式ページ[^3]を参考にインストールしてみました。

---

### .NET環境
#### Microsoftパッケージリポジトリの追加
```bash:コマンド
!wget https://packages.microsoft.com/config/ubuntu/20.04/packages-microsoft-prod.deb -O packages-microsoft-prod.deb
!dpkg -i packages-microsoft-prod.deb
!rm packages-microsoft-prod.deb
```
#### SDKのインストール
```bash:コマンド
sudo apt-get update && \
  sudo apt-get install -y dotnet-sdk-7.0
```
念のため、バージョン確認してみます。
```bash:コマンド
!dotnet --version
```
```:実行結果
7.0.202
```

---

### C#
ここからは、Microsoftのチュートリアル[^4]を参考に試してみました。

#### テンプレートを利用してアプリを作成
```bash:コマンド
%mkdir HelloWorld
%cd HelloWorld
!dotnet new console --framework net7.0
```
#### ファイルを作成
```c#:コード
%%writefile Program.cs
Console.WriteLine("Hello, World.");
```
#### 実行
```bash:コマンド
!dotnet run
```
```:実行結果
Hello, World.
```
どうやら、ubuntuで.netも使えるようです。

---

### VB
こちらは、@yajuさんの投稿[^5]を参考に試してみました。

#### テンプレートを利用してアプリを作成
```bash:コマンド
%mkdir HelloWorld
%cd HelloWorld
!dotnet new console --language vb --framework net7.0
```
ここで、```--language```を使って言語を指定すればVB用になります。
#### ファイルを作成
```VB:コード
%%writefile Program.vb
Imports System

Module Program
    Sub Main(args As String())
        Console.WriteLine("Hello VBWorld!")
    End Sub
End Module
```
#### 実行
```bash:コマンド
!dotnet run
```
```:実行結果
Hello VBWorld!
```

---

## 第７位　javascript  
donguriさんのnote [^6]を参考に試してみました。

---

こちらは、すでに環境が構築されているので、マジックコマンド```%%javascript```だけで実行できます。ただし、実行結果ウィンドウへの出力に一工夫必要です。
```javascript:コード
%%javascript
document.querySelector("#output-area").appendChild(
  document.createTextNode("Hello World.."));
```
で確認すると、
```:実行結果
Hello World..
```
が返ってきます。

---

## 第８位　SQL  
@_jintaさんの投稿 [^7]を参考に試してみました。

---

今回は、JupySQLとDuckDBを導入することにします。エクステンションを読み込むことで、マジックコマンド```%sql```が有効になります。
```bash:コマンド
!pip install jupysql duckdb-engine
# エクステンションを読み込む
%load_ext sql
```
次に、DuckDBに接続します。
```bash:コマンド
# DuckDBのインメモリのDBに接続する
%sql duckdb://
```
DuckDBは、csvに対してSQLを発行できるようなので、colabのサンプルデータで試してみます。
```SQL:SQL
%cd ./sample_data
%%sql
SELECT
  *
FROM
  mnist_train_small.csv
LIMIT 3;
```
```:実行結果（一部）
*  duckdb://
Done.
column000	column001	column002	...	column784
6	0	0	...	0
5	0	0	...	0
7	0	0	...	0
```

---

## 第９位　PHP
```bash:コマンド
!apt install -y php
```
でPHPをインストールします。
ちなみにバージョン確認してみると、
```bash:コマンド
!php -version
```
```:実行結果
PHP 7.4.3-4ubuntu2.18 (cli) (built: Feb 23 2023 12:43:23) ( NTS )
Copyright (c) The PHP Group
Zend Engine v3.4.0, Copyright (c) Zend Technologies
    with Zend OPcache v7.4.3-4ubuntu2.18, Copyright (c), by Zend Technologies
```
と実行できるようになってます。
構文の確認程度なら、コマンドラインで大丈夫なので試してみます。
```bash:コマンド
!php -r 'echo "hello world!?\n";'
```
```:実行結果
hello world!?
```
と、確認できました。

---

## 第１０位　GO
```bash:コマンド
!apt install -y golang
```
でGOをインストールします。
ちなみにバージョン確認してみると、
```bash:コマンド
!go version
```
```:実行結果
go version go1.13.8 linux/amd64
```
と少々古いバージョンですが、実行できるようになってます。
GOに関しては全くの素人なので、ここからは公式のチュートリアル[^8]に従って作業してみます。

---

### Goソースコード用にhelloディレクトリを作成
```bash:コマンド
%mkdir hello
%cd hello
```
### コードの依存関係の追跡を有効にする　
```bash:コマンド
!go mod init example/hello
```
```:実行結果
go: creating new go.mod: module example/hello
```
### ファイル作成
```go:コード
%%writefile hello.go
package main

import "fmt"

func main() {
    fmt.Println("Hello, World!!?")
}
```
### 実行
```bash:コマンド
!go run hello.go
```
```:実行結果
Hello, World!!?
```
で無事実行が確認できました。

---

# おわりに
基本的に、ubuntuに導入できる言語であれば、実行可能だと理解しました。

---
# 参考にしたサイト
[^1]:[ubuntuでC, C++の開発環境をインストールしてHelloWorldしよう！](https://qiita.com/nsd24/items/805d0b53c67a1043e819)
[^2]:[【最新】UbuntuでJavaの環境を構築する方法](https://qiita.com/ryome/items/37c53e9638a9c6ea146a)
[^3]:[Ubuntu 20.04 に .NET SDK または .NET ランタイムをインストールする](https://learn.microsoft.com/ja-jp/dotnet/core/install/linux-ubuntu-2004)
[^4]:[チュートリアル: Visual Studio Code を使用して .NET コンソール アプリケーションを作成する](https://learn.microsoft.com/ja-jp/dotnet/core/tutorials/with-visual-studio-code?pivots=dotnet-7-0)
[^5]:[Windows Subsystem for Linuxでの .NET Core を使用したVisual Basic のHello World アプリケーションの構築](https://qiita.com/yaju/items/ce0cbb79f27110d96afe)
[^6]:[Google ColabでJavaScript!](https://note.com/dngri/n/nfe29e07c05fa)
[^7]:[【2023年版】Google ColabでSQLを使う【DuckDB, JupySQL】](https://qiita.com/_jinta/items/479355d4709cd30d56c8)
[^8]:[Tutorial: Get started with Go](https://go.dev/doc/tutorial/getting-started)