プログラミング入門:文法比較

プログラミング文法一覧

このページは,馬場が意気揚々と学生にプログラムを書いて見せたところ,SwiftのプログラムだったのにPythonで書いてしまったことから,普段はインタラクティブプログラム(ProcessingやOpenframeworks)をやっているひとがpythonやswiftを記述する際の要点まとめやチートシートになればと思い,書きました.わかりやすくそれぞれの記法を並列に記述していくので,ブラウザの横幅を広げておくと使いやすいです.

下記を実際初めて学習する場合は,手元で実際に問題なく実行できるか確認できた方がよいので,事前に下記の環境を整えて,記述したプログラムを 実際に実行して動作を確認しましょう.

このページではあくまで基本的なことを抑えることに着眼しているので,それらの情報詳細には別途リンクを貼っておきます.読み足りなかったりもう少し 詳細を知りたい場合はそちらのリンクを参照して下さい.なおそれぞれの記法比較ではそれぞれ processing, of, python, swiftで同じ内容を実行する コードを記載しておきます.ただofはc++なので,記載に関してはc++の記載にて統一しています.

変数の宣言方法について.そもそもここからpythonやswiftは異なります.下記に対応表を示します.

型名\言語 Processing Openframeworks Python Swift
真偽値 boolean 変数名; bool 変数名; var/let 変数名: Bool
整数 int 変数名; int 変数名; var/let 変数名: Int
浮動小数 float/double 変数名; float/double 変数名; var/let 変数名: Flaot/Double
文字列 string 変数名; string 変数名; var/let 変数名: String

このように,pythonでは型を宣言せず,Swiftでは変数には var, 定数には letを利用して宣言を行います.Swiftでは明示的に型を指定することができ,varまたはletの後に変数名:型名 とします.ただし,var value = “Hello” とすれば自動で文字列型になりますが,この時は必ず初期値を与えなければコンパイルエラーになります.

Processing

int value = 0;

c++

int value = 0;

Python

value = 0

Swift

var value: int = 0

配列を扱う場合ではofとprocessingで異なることからよく間違うのですが,これもpythonやswiftがそれぞれ記法が異なるため注意が必要です. ただし,python,swiftともに,c++でいうところのVectorやlist型に近いものが配列になっているのに対し,ofやprocessingではメモリ空間に連続して 領域を確保する原始的な配列になります.言い換えればpythonやswiftではそのような原始的な配列宣言や操作はもはややめましょう.というとこです.

基本的なところで言えば,PythonやSwiftでは,最初に配列サイズを決める,ということは前提ではありません.一方でofやprocessingではlist, vector型を意図的に使わなければ配列サイズを決めずに配列を作っていく,ということができません.python, swiftは配列を扱う,これ即ちlist型になる.という捉え方がよいです.

print関数を使った値の表示に関しては,javaやc++では直接参照したい値を渡す必要がありますが,pythonやswiftでは変数名をそのまま渡してしまえば,後は勝手に適切な表示を行なってくれます.もちろん直接表示したい時は同じように参照して表示することもできます(その部分はそれぞれpython, swiftのコード上でコメントアウトしているので参照してください).

Processing

int array[];
// int[] array; もOK
array = new int[3];
array[0] = 0;
array[1] = 1;
array[2] = 2;

print(array[0]+","+array[1]+","+array[2]);

c++

#include <stdio.h>
int array[3];
int main()
{
  array[0] = 0;
  array[1] = 1;
  array[2] = 2;
  printf("%d,%d,%d\n",array[0],array[1],array[2]);
}

Python

array = []
array.append(0)
array.append(1)
array.append(2)
print(array)
#print(array[0],array[1],array[2])

Swift

var array:[Int] = []
array.append(0)
array.append(1)
array.append(2)
print(array)
// print(array[0], ",", array[1], ",",array[2])

基本的にはそんなに大きな違いはありません.if とその条件を示すものでOKです.processing, c++, swiftは理解しやすいと思いますが,pythonだけ すこし書式が異なります.

  1. {}(波括弧)が省略される
  2. 条件文の後に:(コロン)がつく
  3. 条件の分岐先は必ず字下げ(インデント:タブ等で行頭をあける )を行い,処理をまとめる

特に3つ目のインデントについては独特なのでしっかり抑えておきましょう.一般的な言語では処理の単位を{}(波括弧)でまとめることをやったり しますが,pythonでは{}(波括弧)は使わずにインデントのみで行います.

Processing

int value = 10;
if( value > 5 ){
  print("bigger than 5");
}

Openframeworks

int value = 10;
if( value > 5 ){
  print("bigger than 5");
}

Python

value = 10
if value > 5 :
  print("bigger than 5")

Swift

var value:Int = 10
if value > 5 {
  print("bigger than 5")
}

for文もループ回数の指定について,python, swift共に少し異なります.三つの配列の値をforループで表示するプログラムを下記に示します. ポイントとしては,ループする回数指定が少しスマートになっているところです.もちろんc++でも同じようなことはできます.c++の例2で紹介するように vector型を利用することで,配列サイズに動的に調整したループを実行することができます.pythonやswiftではあまり手打ちでforのループ回数を設定 せず,対象となる変数や配列のサイズに応じてループをさせるのが基本として考えてください.

Processing

int array[];
array = new int[]{0,1,2};
 for( int i = 0; i < 3; i++ ){
   println(array[i]);
}

C++例1

#include <iostream>
int array[] = {0,1,2};
int main()
{
  for( int i = 0; i < 3; i++){
      std::cout << array[i] << std::endl;
  }
}

C++例2

#include <iostream>
#include <vector>
std::vector<int> array{0,1,2};
int main()
{
  for( int i = 0; i < array.size() ; i++){
      std::cout << array.at(i) << std::endl;
  }
}

Python例1

array = [0,1,2]
for a in array:
    print(a)

Python例1

array = [0,1,2]
for a in range(0,3):
    print(a)

Swift例1

var array:[Int] = [0,1,2]
for i in array{
    print(i)
}

Swift例2

var array:[Int] = [0,1,2]
for i in 0..<3{
    print(i)
}

二つの引数を掛け算したものを返す関数を例にそれぞの記述を比較してみます.pythonの記法が型に関わる部分が省かれているのでだいぶスッキリして みえます.pythonでも型を明示することは可能ですが,このように無駄な記載を省き,可読性を向上させる工夫がなされています.swiftのように型の 明示を死守することは,ハードコーダーにはうれしかったりします.それぞれ一長一短なわけですが,

Processing

int calculate(int x, int y) {
  return x*y;
}
void setup() {
  print(calculate(2, 5));
}

Openframeworks

#include <iostream>
int calculate(int x, int y){
  return x*y;
}
int main()
{
  std::cout << calculate(2,5) << std::endl;
}

Python

def calculate(x,y):
  return x*y
print(calculate(2,5))

Swift

func calculate(x:Int, y:Int) -> Int{
  return x*y
}
print(calculate(x:2, y:5))

以上、簡単ではありますが、それぞれの代表的な言語を題材に文法比較を行いました。基本的には自分の頭の整理と忘備録のために作成しています。みなさんのお口に合うでしょうか?

  • /home/users/2/lolipop.jp-4404d470cd64c603/web/ws/data/pages/プログラミング入門/文法比較.txt
  • 最終更新: 2021/03/09 09:12
  • by baba