プログラミング技術概要

人工知能技術 機械学習技術 オントロジー技術 デジタルトランスフォーメーション 自然言語処理技術 知識情報処理 Clojure Python PHP Prolog LISP R言語 C/C++ Javascript JavaとScalaとKoltlin CSS 本ブログのナビ

プログラミング技術概要について

ここではプログラミング言語の概要について述べる。内容としては(1)プログラミング言語とは何か?から始まり、機械言語から始まる様々な言語の概要と歴史について述べた後、プログラミング言語の歴史の中でも重要なパラダイムである「構造化言語」「オブジェクト言語」「関数型言語」の概要と歴史について述べ、さらに数学とアルゴリズムを結ぶジェネリックプログラミング、ウェブ技術の根幹にあるフロントエンド用プログラミング言語の概要について述べる。

概要/歴史

コンピューターは2つのこと(だけ)をする。一つは計算をすること、もう一つは計算結果を覚えていること(だけ)だ。ただし、コンピューターはこの2つのことを非常に上手にできる。一般的なコンピューターでさえ1秒間に10億回程度の計算を行う。また一般的なコンピューターが持つ数百ギガバイトの容量は、例えば1バイト1gでイメージすると数十万トン以上の重さで、アフリカ象が数万頭換算となる。

ここで問題を計算で解決するための「計算的な思考」について考える。すべての知識は宣言的(declaretive)もしくは命令的(imperative)かのいずれかに分類できる。宣言的知識とは、事実の記述で構成されたものとなり、命令的知識とは「ハウツー」の知識であり、情報を導き出すためのレシピとなる。

現在のコンピューターは、1.命令の言葉を受け取って記憶、2.命令を順番に実行(アルゴリズムを実施)、3.装置やコンピューターの記憶の状態を変化させる。というチューリングマシンであり、これらの機能の中で重要なのは、2の「命令を順番に実行する(アルゴリズムを実施する)」ことにある。プログラミングは、この「命令を順番に実行する」事をコンピューターに指示する為のインターフェースであると考える事ができる。

フロントエンドと呼ばれるウェブに関係するソフトウェアを組むのであれば、ブラウザが受けつけてくれる言語であるJavaScriptやCSS、HTMLは必須だ。altJSはあるが最終的にはJavaScriptにコンパイルされてブラウザに読み込まれる為、まずはJavaScriptの知識がなければ言語を使いこなす事ができない。Googleエンジニアの必須の言語であるのもそれを裏付ける。

ブラウザに関係のないバックエンド側では選択肢が大きく広がる。選択する観点としては、生産性(プログラミングのしやすさ)や、デバッグのやり易さ、ライブラリの豊富さや、集団で開発をするケースとしては自分の周りにその言語を使える人がどのくらいの割合でいるか等がある。

  • Code as Dataの概要とアルゴリズム及び実装例について

“Code as Data”は、プログラムのコード自体をデータとして扱う考え方やアプローチを指し、プログラムをデータ構造として操作し、分析、変換、処理することを可能にする方法となる。通常、プログラムはある入力を受け取り、それに対して特定の手順やアルゴリズムを実行し、結果を出力する。一方で、”Code as Data”では、プログラム自体がデータとして扱われ、他のプログラムによって操作される。これにより、プログラムをより柔軟に、動的に、抽象的に扱うことが可能となる。

バウハウスの合理主義的・機能主義的な芸術と(関数型)プログラミングの機能美の共通点について

プログラミング言語の歴史、機械語から構造化プログラミングまで

実装

プログラミングを行うためには、それぞれの言語に合わせた開発環境を作る必要がある。ここでは、本ブログに述べているPython、Clojure、C、Java、R、LISP、Prolog、Javascript、PHPそれぞのケースでの具体的な開発環境の立ち上げについて述べている。個々の言語では、開発を容易にするためのプラットフォームが準備されており、それらを用いると容易な環境設定が可能となるが、ここでは最もシンプルなケースでのものを中心に述べている。

プログラミングを行う際にファイルの入出力機能は最も基本的で必須なものとなる。またファイルの入出力機能は、手続き的な命令となるため、各言語ごとに実現の仕方も異なってくる。以下に様々な言語でのファイル入出力の具体的な実装について述べる。

プログラミング言語の中でも基本機能は、”プログラミング言語の歴史“でも述べた「構造化言語」の3つの機能である(1)順次進行、(2)条件分岐、(3)繰り返しの中の一つの要素となる。ここではこの内繰り返しと分岐に対して様々な言語での実装を示す。

ここでは”サーバー技術“で述べているサーバーを各種プログラミング言語で活用する事例について述べる。ここでのサーバー技術とは、ネットワーク上でクライアントからのリクエストを受け取り、要求された処理を実行してレスポンスを返すサーバーシステムの設計・構築・運用などに関する技術のことを指す。

サーバー技術は、WebアプリケーションやAPIサーバー、データベースサーバー、メールサーバーなど、さまざまなシステムやサービスで使用されており、プログラミング言語やフレームワークに応じて、サーバー技術の実装方法やベストプラクティスが異なる。

データベース技術とは、データを効率的に管理・保存・取得・処理するための技術のことを指し、情報システムやアプリケーションにおけるデータの永続化や操作を支援し、データの正確性、一貫性、可用性、安全性を確保することを目的としたものとなる。

以下にこれらのデータベースを実際に扱うための各種言語による実装について述べる。

    構造化言語

    構造化プログラミングの重要な要素の一つである繰り返し処理の各種言語による実装について

    オブジェクト指向型言語

    プログラミング言語の重要なパラダイムの一つであるオブジェクト指向言語の概要について、まずはクラスとメソッド。

    プログラミング言語の重要なパラダイムの一つであるオブジェクト指向言語の概要について、「共通メインルーチン」を作るための仕組みであるポリモーフィズム

    今回は継承(inheritance)と型について。継承は「似たもの同士のクラスの共通点と相違点を整理する仕組み」となる。別の表現だと「クラスの共通部分を別クラスにまとめるしくみ」とも表される。このしくみを使う事で、変数とメソッドをまとめた共通クラスを作り、別のクラスからその定義を拝借して利用する事ができる。

    プログラミングにおける通常の型は、単なる変数や数値がどんなデータかを示す使い方が一般的だが、OOPでは構造的ないし振る舞い的な暗黙情報をも内包したデータ構造の形式を定義した「型」が用いられている。この仕組みを用いることでより柔軟にエラーの検出が行われたり、コンパイル時のメモリ容量の最適化が行えるようになる。

    関数型言語

    プログラミングにおける関数の役割とOOPとの相違点について

    関数型言語(LISPとその派生言語)の歴史について

    データ型と型付け言語

    プログラミング言語には「データ型」がつきものとなる。データ型といえば読んで字の如く「データの型」のことだが、まずはそもそもコンピュータは「データ」をどのような形で保持するのかについて述べてみる。

    コンピュータは基本的には数値しか扱えない。例えば文字を扱うばあでも、文字に番号(文字コード)を振ってそれを扱うことになる。そして、その数値は2進数で表現する。2進数というのは、我々が普段扱う10進数が「0〜9の数字を使い9の次は10に繰り上がる」のに対して「0と1だけを使い1の次は10に繰り上がる」という表現方法となる。10進数ならすべての桁が9になると次の桁に繰り上がるが、2進数ではすべての桁が1になると次の桁に繰り上がる。よって2進数なら、0と1だけで、例えば8桁なら0〜255までの数を表現できる。

    静的型付け言語というのは、式の型がコンパイル時に決まっている言語となる。まず、静的型付け言語では、変数に型がある。Javaでa:と宣言したら、aはint型になる。そしてa+1というのは、int型の変数aにint型の1を加算したものなので、結果はint型となる。もしa+0.5なら、Javaではintはdouble型に拡張してから加算されるので、結果はdouble型となる。このように、静的型付け言語では、それぞれの式の型が部分式を含め、コンパイル時に決まっている。もちろん、メソッドの引数や戻り値の型も決まっている。そうでなければ式の形が決まらないからである。

    今回は、動的型付け言語のPythonにおける型ヒントについて、mypyという型チェッカーについて述べる。Pythonの型ヒントについて述べる前に、その理論的背景として「漸進的型付け(Gradual Typing)」について述べる。

    型システムの観点で見ると、Clojureは、静的な型システムと動的な型システムの両方を備えたLisp系のプログラミング言語であるということが言える。これはベースとなるJavaが持つ静的型付け言語という特性と、LISP言語体系が持つ動的な型システムでの、型宣言を行わない柔軟なコーディングに対応しているという特性を兼ね備えていることから、コードの信頼性を高め、同時にコードの柔軟性を維持することができるものとなっている。

    Clojure specは、Clojureに含まれるライブラリの一つで、関数の引数や戻り値、データ構造などの様々な要素に対して、仕様を定義することができ、更にデータの検証と変換も行うことができるツールとなる。

    ジェネリックプログラミング

    数学とアルゴリズムとジェネリックプログラミングについて

    フロントエンド言語概要

    ウェブシステム開発に用いられるプログラミング言語(Javascript、react等)について

    Javascriptのさまざまなコンパイラ言語について

    コメント

    タイトルとURLをコピーしました