PG0がプログラミング研修に向いている理由

# はじめに
[PG0](https://www.nakka.com/soft/pg0/)は、プログラミング学習を目的としたプログラミング言語です。
PG0の詳細は『[初心者用プログラミング言語「PG0」のススメ](https://qiita.com/nakka_/items/adfe04d701640a72015d)』を参照してください。

最近の便利なプログラミング言語(以下「言語」という)では、標準ライブラリや外部ライブラリを組み合わせるだけで簡単にプログラムが作れます。
そのためプログラミング研修を便利な言語で行うと、ライブラリを組み合わせる事は出来ますが、アルゴリズムを考える力が身につきません。

PG0は、アルゴリズムを考える事に特化した言語のため、便利な言語を学ぶ前にプログラミングの基礎であるアルゴリズムを考える力が身につきます。

# アルゴリズム向きの言語
プログラミング研修でアルゴリズムを教えるのに向いている言語としてCがあげられます。
C以外でもアルゴリズムを教えることは可能ですが、最近の言語は便利すぎてアルゴリズムを教えるためにわざわざ駄目な書き方をすることになります。

Cがアルゴリズムを考えるのに向いている理由のひとつとして、他の言語に比べて文字列操作が非常に不便なことが挙げられます。
文字列操作が不便なためアルゴリズムを組んで処理するのが普通で、それによりアルゴリズムを考える力が付きます。

以下は日付形式の文字列strから月だけを抜き出して出力するサンプルです。
色々な言語で同じことをやっています。

```python:Python
str = "2018/07/27"
print(str[5:7])
```

```ruby:Ruby
str = "2018/07/27"
puts str[5, 2]
```

```php:PHP
<?php
$str = '2018/07/27';
echo substr($str, 5, 2);
```

```javascript:JavaScript
var str = "2018/07/27";
console.log(str.slice(5, 7));
```

```swift:Swift4
let str = "2018/07/27"
let from = str.index(str.startIndex, offsetBy: 5)
let to = str.index(from, offsetBy: 2)
print(str[from..<to])
```

```go:Go
package main
import "fmt"
func main() {
	str := "2018/07/27"
	fmt.Println(str[5:7])
}
```

```scala:Scala
object Main extends App {
	val str:String = "2018/07/27"
	println(str.substring(5, 7))
}
```

```java:Java
public class Main {
	public static void main(String[] args) {
		String str = "2018/07/27";
		System.out.println(str.substring(5, 7));
	}
}
```

```c#:C#
using System;
public class Sample
{
	public static void Main()
	{
		string str = "2018/07/27";
		Console.WriteLine(str.Substring(5, 2));
	}
}
```

```C:C
#include <stdio.h>
int main() {
	char str[] = "2018/07/27";
	char month[3];
	int i, j = 0;

	for (i = 5; i < 7 && str[i] != '\0'; i++) {
		month[j++] = str[i];
	}
	month[j] = '\0';
	printf("%s", month);
	return 0;
}
```

Cはポインタを使えば、もっと簡単に書くこともできます。

```C:C
#include <stdio.h>
#include <string.h>
int main() {
	char str[] = "2018/07/27";
	char month[3];

	strncpy(month, str + 5, 2);
	month[2] = '\0';  /* この場合のstrncpyは終端にヌル文字が入らない */
	printf("%s", month);
	return 0;
}
```

Cでも工夫すると他の言語と同じくらい短くできます。

```C:C
#include <stdio.h>
int main() {
	char str[] = "2018/07/27";
	printf("%.2s", str + 5);
	return 0;
}
```

# PG0はアルゴリズム向き？
PG0は文字列が使えず、整数型と配列のみです。関数も使えません。
そのためPG0で作るプログラムは整数を変換するか配列の操作をするかになります。
配列の操作をするというのはCでの文字列操作と同じような考え方になるため、PG0はアルゴリズム向きの言語と言えます。
むしろ、PG0はアルゴリズムを組む以外にやれることがありません。

以下はPG0での月だけを抜き出して出力するサンプルです。

```php:PG0
var str[] = {2, 0, 1, 8, -1, 0, 7, -1, 2, 7}
var month[]
var i = 5, j = 0
while (i < 7) {
    month[j] = str[i]
    i = i + 1
    j = j + 1
}
exit month
```

```
実行結果: {0,7}
```

以下はPG0を拡張した**PG0.5**で月だけを抜き出して出力するサンプルです。

```php:PG0.5
#option("PG0.5")
var str = "2018/07/27"
var arr = array(str)
var month = ""
for (var i = 5; i < 7 && i < length(arr); i++) {
	month += arr[i]
}
print(month)
```

# PG0でプログラミング研修
プログラミング研修をCで実施するとアルゴリズムを考える力はつきますが、それ以前に覚えることや理解することが沢山あります。
その点PG0では覚えることや理解することが極端に少ないため、プログラミング研修でアルゴリズムを教えるのに向いていると考えています。

# リンク
- PG0
    - [https://www.nakka.com/soft/pg0/](https://www.nakka.com/soft/pg0/)
- PG0でプログラミング入門
    - [https://qiita.com/nakka_/items/e2a7640c6ecbb8d5cb52](https://qiita.com/nakka_/items/e2a7640c6ecbb8d5cb52)
- PG0でプログラミング研修をしてみた
    - [https://qiita.com/nakka_/items/782dd01af8ab7320a107](https://qiita.com/nakka_/items/782dd01af8ab7320a107)