参加
最後オンライン
最近の投稿
プログラミング言語に投稿されました 続きを読む

スコープ(scope)とは日本語にすると“有効範囲”を表します。つまり、変数のスコープは変数が使える有効範囲のことを指します。

スコープは、主に以下のように分類することができます。

  • グローバル・スコープ (global scope)
  • ファイル・スコープ (file scope)
  • ローカル・スコープ (local scope)
  • 静的なローカル・スコープ (static local scope)
  • インスタンス・スコープ (instance scope)
  • クラス・スコープ (class scope)
  • クロージャ・スコープ (closurel scope)
  • スレッドローカル・スコープ (threadlocal scope)

グローバル・スコープ

グローバル(global)は、日本語にすると”大域”を表し、グローバル・スコープ(global scope)は、プログラムの「全体」から見えるスコープのことです。このスコープに属する変数はグローバル変数といわれます。BASICのような単純な言語ではグローバル・スコープしか存在しない場合があります。Pythonのようなグローバル変数の書き換えが簡単には行えない言語も存在する。 

ファイル・フスコープ

ファイル・フスコープ(file scope)は、グローバル・スコープと似ていますが、プログラムを記述したファイルの内側でのみ参照できるスコープです。プログラムが複数のファイルから構成される場合は他のファイルから参照することはできません。

ローカル・スコープ

ローカル(local)は、日本語にすると”大域”を表し、ローカル・スコープ(local scope)は、ある関数やブロックの範囲内に限定されたスコープのことです。 
何を持って範囲を与えるかは言語により様々だが、一般に入れ子のローカル・スコープは外側を参照できるのが普通です。このとき兄弟関係にあるスコープは見えない。変数宣言が必要な言語の場合は宣言文以降にスコープが制限される場合が多い。

  • 関数の先頭で纏めて宣言しなければならない 
    例:Pascal、Delphi
  • 関数のどこでも宣言でき、関数全体で有効 
    例:Javascript
  • 関数のどこでも宣言でき、宣言以降の関数全体で有効  
    例:ABAP
  • 関数のどこでも宣言でき、宣言のブロックの中にのみ有効  
    例:C、C++

インスタンス・スコープ

インスタンス・スコープ (instance scope)は、クラスベースのオブジェクト指向言語で、各インスタンス毎に割り当てられた変数が所属メソッド(メンバ関数)からのみ参照されるスコープのことです。いわゆるカプセル化はこれを指します。。保護されない変数の場合は、クラス定義が見えていてオブジェクトにアクセスできる場合は直接参照できます。C言語の構造体参照なども一種のインスタンススコープです。

クラス・スコープ

クラス・スコープ (class scope)は、 クラスベースのオブジェクトト指向言語で、あるクラスの定義全体から参照できるスコープのことです。インスタンス・スコープと異なり変数が共有されますので、ある種の制限されたグローバル・スコープと考えることができます。クラス・スコープをもたない言語の場合でも、ファイル・スコープを用いることで同様の機構を実現できる場合があります。

クロージャ・スコープ

クロージャ・スコープ (closurel scope) 

スレッドローカル・スコープ

スレッドローカル・スコープ(threadlocal scope)は、同じスレッドしか参照できないスコープのことです。マルチスレッド・プログラミングではよく使われます。

以下の表で各主流言語のスコープ実装状況を示します。

言語グローバル・スコープファイル・スコープローカル・スコープ静的なローカル・スコープインスタンス・スコープクラス・スコープクロージャ・スコープスレッドローカル・スコープ
ABAP××××
Basic×××××××
C×××
Cobal×××××××
C++×
C#××××
Delphi×××
Fortran×××××
Java××××
JavaScript××××××
Pascal×××××
Perl×××
PHP××××
Python××
Ruby××
VB×××××××
VB.net××××××
VC++××××××
VC++.net××××××
プログラミング言語に投稿されました 続きを読む

プログラミング言語で記述されるプログラムは、区切り文字で区切られた一連のトークンから構成されます。 
トークンとは、基本的な構文要素としてプログラム内で意味を持つテキストの最小単位であり、字句ともいいます。  トークンを組み合わせて、式や宣言や文を組み立てます。 文とは、プログラム内で実行可能なアルゴリズム動作を記述するものです。

このトピックでは、汎用的な視点から、プログラミング言語を構成する要素を説明します。 
プログラミング言語の構成要素には下記のものがあります。

  • 字句構造
  • データ型、値及び変数
  • ブロック
  • 構造化
  • オブジェクト指向
  • 例外処理

字句構造(英:lexical structure)とは、プログラミング言語の字句解析が想定するトークンの構造のことです。  トークンには主に以下のような種類があります。

  • リテラル(英:literal)
  • 識別子(英:identifer)
  • キーワード(英:keyword)
  • 演算子(英:operator)
  • 区切(英:punctuator)
  • コメント(英:comment)

データ型(英:data type)とはデータの扱いに関する形式のことです。データ型は、プログラミングなどにおいて変数(英:variable)そのものや、その中に代入されるオブジェクトや値(英:value)が対象となります。データ型は単純型と複合型2種類に分類することができます。

  • 単純型 
    単純型とはプログラミング言語の仕様に元から存在する型であり、組み込み型、原始型、プリミティブ型、基本型などと呼ばれることもあります。単純型は、数値型、文字列型、論理型、ポイント型などの種類があります。
  • 複合型 
    複合型とは、プログラマがソースコードの記述などにより新たに作る型であり、複合データ型、ユーザ型、ユーザ定義型、参照型、リファレンス型などとも呼ばれることがあります。複合型は構造体、クラス、インタフェース、共用体、列挙型などの種類があります。 なお、プログラミング言語により、一部型がなかったり、単純型か複合型かの分類が違ったりすることがあります。

式(英:expression)とは、言語によって定められた優先順位や結びつきの規定に則って評価される値、変数、演算子、関数の組み合わせのものです。
数学における式と同様、式は評価された値を持っています。 

文(英:statement)とは、一つ以上の式や関数呼び出しで作られる、手続き構造の分割できない基本単位のものです。 
if文のように分岐構造を表すものや、代入文のように変数の値を変更するものなどがあります。 

ブロック(英:block)は複数の文から構成されます。ブロックには、単純な複数文が並べられた「順次構造」や、if-else-endifのような「選択構造」、for-nextのような「反復構造」があります。  

プログラムの基本構造は、「順次構造」、「選択構造」、「反復構造」の3つからなると考えられます。 基本的にはプログラムは先頭行から順に実行されていきます(順次構造)が、実際にはその流れを条件によって分岐させたり(選択構造)、同じ箇所を繰り返し実行させたりすること(反復構造)を頻繁に行います。 

殆どのプログラミンググ言語では、プログラム中で意味や内容がまとまっている作業をひとつの手続きとして定義できる仕組みが用意されていて、手続きの呼び出しによりプログラムが成り立ちます。  

プログラミング言語により、手続きそのものは、サブルーチンやプロシージャ、関数、メソッドなどさまざまの呼び方が存在します。 

オブジェクト指向(英:object-oriented)とは、オブジェクト同士の相互作用としてシステムの振る舞いをとらえる考え方です。  構造化がデータとそれを処理する手続きを分離する考えに対して、オブジェクト指向はデータとそれを処理する手続きを纏めて、オブジェクトとして表現します。  

オブジェクト指向は、JavasSriptのようなプロトタイプベースのものと、c++、javaなどのクラスベースのものがあります。  クラスベースで実現されるプログラミング言語では、クラスやインタフェースの作成、クラスの継承などの仕組みが提供されています。 

例外処理(英:exception)とは、プログラムがある処理を実行している途中で、なんらかの異常が発生した場合に、現在の処理を中断(中止)して、別の処理を行うことです。 

 例外処理がサポートされているプログラミング言語では、異常が発生可能な処理をtryブロックに入れて、例外が発生した時の処理をcatchブロックに入れるのが多く見られます。

プログラミング言語に投稿されました 続きを読む

以下の表にて言語の主な歴史を示します。

キーワード年度言語開発者特徴&言語歴史への影響
機械語・アセンブラ言語-----
高級言語1957年FORTRANIBM社高級言語としては最初のものである、現在も科学技術計算など大規模な計算を必要とする分野で使用されている
1958年ALGOL58-構造化プログラミングの考え方を取り入れた最初の言語である、あまり普及しなかったが、後に登場するPascalやC言語など多くの言語に影響を与えた
1960年CobolJ.Sammet初期の高級言語の1つであり、事務処理言語として広く普及した。現在でも企業の事務処理系システムで利用されている
1960年LISPMITボーランド記法を使用した独特の文法を持つ言語であり、「純粋ではない」が最古の関数型言語でもある。現在でも人工知能やEmacsのマクロなどに使用されている
1964年Basicダートマス大学その後、1970年代にマイクロソフトがMS BASICを発表し、8bitマシン時代 (1970年代後半-1980年代前半)の中心的な言語となった
構造化言語1966年BCPLケンブリッジ大学現在のコンパイラ技術の基礎を確立し、後にB言語に影響を与え、C言語へと発展した
1967年Simulaノルウェー計算センタオブジェクトの概念をもつ言語としては最古の言語である
1969年Pascal-中期の代表的な構造化言語の1つ。その後、教育用言語として1980年代頃から広く普及した。1995年に登場するDelphiもPascalの血を引く言語である
1972年Cデニス・リッチープログラム開発の中心的な言語である
1979年Adaアメリカ国防総省ジェネリックプログラミング(総称、汎化)、例外処理など先進的な考え方が初めに取り入れられた
オブジェクト指向言語1980年Smalltalk-オブジェクト指向を導入した黎明期の言語の1つであり、「オブジェクト指向」という言葉を最初に定義した言語でもある。後のオブジェクト指向型言語に多大な影響を与えた
1983年C++-C言語にオブジェクト指向を導入した、C言語と同様に開発の中心的な言語になった
1987年Perlラリー・ウォール主にCGIなどの用途で広く普及している
1991年VBMicrosoft社Windows専用のGUIアプリケーション開発言語
1995年Delphiボーランド社Pascalの血をひくWindows専用のGUIアプリケーション開発言語
インタプリタ言語・仮想マシン1995年Javaサン・マイクロシステムズ社本格的なオブジェクト指向言語の1つ。構文はC言語とかなり類似しているが、内容はまったく新世代の言語である、JavaVMという仮想マシン環境で動作
1995年RubyまつもとゆきひろPerlのように使えるスクリプト言語を、純粋なオブジェクト指向言語として設計
1995年PHPラスマス・ラードフWebサーバ側スクリプト言語として現在までも広く使われている
1997年JavaScript-標準仕様としてECMAScriptが標準化された
2002年C#Microsoft社CLRという仮想マシン環境で動くオブジェクト指向言語。Javaの影響を強く受けており、C++とJavaの中間的な特徴をもつ
2009年GoGoogle社並列コンピューティングに配慮したコンパイラ言語。依存性の注入を言語仕様にとりこみ、例外処理やクラスの継承、アサーション、オーバーロードといった機能を排除している
2011DartGoogle社Webブラウザ組込みのスクリプト言語であるJavaScriptの代替となることを目的に作られた。 2014年ECMA-408と言う標準規格に登録
2014SwiftApple社Apple社のiOSおよびOS Xのためのプログラミング言語。従来から用いられていたObjective-CやObjective-C++、C言語と共存することが意図されている
プログラミング言語に投稿されました 続きを読む

プログラミング言語とは、コンピュータに対する一連の動作の指示を記述するための人工言語のことです。プログラミング言語で記述されたこの一連の指示はプログラムと呼ばれ、それを記述することはプログラミングと呼ばれます。

コンピュータは、機械語と呼ばれる中央処理装置が直接解釈できる命令を実行することによって動作するものですが、人間にとって機械語を扱うことは非常に難しいため、機械語の代わりにプログラミング言語を用いることによって、より人間にとって扱いやすい表現でコンピュータに指示を与えることができるようになります。

プログラミング言語は様々な視点から分類することができます。

実行形態による分類

プログラムがどのように実行されるかという観点(実行形態)から、プログラミング言語を以下のように分類することができます。

  • インタプリタ言語
  • コンパイル言語

インタプリタ言語

インタプリタ言語はプログラムの実行時にプログラムのソースコードを1行ずつ逐一翻訳しながら進めていきます。例としては、以下の言語があげられます。

  • Basic
  • Javascript
  • Perl
  • Phyton
  • Ruby

コンパイル言語

インタプリタ言語とは逆に、実行する前にすべてのソースコードを機械語に翻訳してしまい実行ファイルと呼ばれる形式に変換します。例としては、以下の言語があげられます。

  • Cobol
  • Fortran
  • C++
  • Pascal
  • Java
  • C#
  • VB.net

判断基準について

JavaやC#、VB.netなどの.net系言語はプログラムが機械語にコンパイルされないが、JAVA仮想マシンの上に動作するバイト・コードや、.net frameworkランタイムの上に実行するILなどの中間コードを予め変換しておく必要があり、実行環境にはソースコードが配布されないため、コンパイル言語に分類することとします。 
一方、Javascriptなどのスクリプト言語は、パフォーマンス最適化を求めるため、殆どのインタプリタが内部的にも中間コードに変換しておいてから実行することになりますが、ソースコードが稼動環境に配布しないといけないことと、中間コードがjava バイトコードのように仕様を標準化されておらず、各インタプリタの内部実装に依存することから、コンパイル言語に分類されません。

パラダイムによる分類

プログラムをどのように構成するかという観点(パラダイム)から、プログラミング言語を以下のように分類することができます。

  • 手続き型言語
  • オブジェクト指向言語
  • 手続き+オブジェクト指向の言語
  • 関数型言語

手続き型言語

手続き型プログラミングは、プログラムをデータ構造とルーチンの集合に分割し、「手続き呼び出し」の概念に基づきプログラミングを行います。「手続き」は実行すべき一連の計算ステップを持つもの、プロシージャ、ルーチン、サブルーチン、メソッド、関数(数学の関数とは異なるが、関数型言語における関数とほぼ同義)など様々な呼称があります。手続きはプログラム実行中の任意の時点で呼び出すことができ、他の手続きからの呼び出しも、自分自身からの呼び出し(再帰呼び出し)も含まれます。  例としては、下以の言語があげられます。

  • basic
  • C
  • pascal

オブジェクト指向言語

オブジェクト指向プログラミングは、プログラムをオブジェクト(クラス)に分割し、オブジェクト間の「メソッド呼び出し」の概念に基づきプログラミングを行います。例としては、以下の言語があげられます。

  • Java
  • C#
  • Javascript…

手続き+オブジェクト指向の言語

手続きプログラミングとオブジェクト指向プログラミングと両方をサポートしている言語です。例としては、以下の言語があげられます。

  • c++
  • Delphi(Object Pascal)
  • VB

関数型言語

関数型言語とはすべての計算や処理などを関数の定義の組み合わせとして記述していくタイプのプログラミング言語です。主に科学計算や人工知能の領域に利用されており、業務アプリケーション開発に使われることはほとんどありません。  例としては、以下の言語があげられます。

  • LISP
  • F#

構文による分類

プログラムの構文という観点から、プログラミング言語を以下のように分類することができます。

  • COBOL構文式
  • ALGOL構文式

COBOL構文式

下記のように英語の文章のように記述できるのが特徴です。

代入文move value to variable.
算術式add value1 to value2 giving variable s
ubtract value2 from value1 giving variable
multiply value1 by value2 giving variable
divide value1 by value2 giving variable
サブルーチンの呼び出しcall subroutine
 using para1 param2
 returning result

ALGOL構文式

BNF記号を利用します。

代入文variable=value.
算術式variable = value1 + value2
variable = value1 - value2
variable = value1 * value2
variable = value1/ value2
サブルーチンの呼び出しresult = subroutine(para1,para2);

※COBOL等の言語の一部は新しいバージョンから+,-,*,/,=を含む構文もサポートされるようになりました。

用途による分類

用途という観点から、プログラミング言語を以下のように分類することもできますが、判断の基準は難しいところがあります。

  • 汎用化言語
  • ドメイン特化型言語
  • Add-on言語

汎用化言語

より汎用的に使われることを目的として設計された言語のことです。例としては、以下のの言語があげられます。

  • C
  • C++
  • Java

ドメイン特化型言語

特定の分野で使われることに目的を特化した言語のことです。例としては、以下のの言語があげられます。

  • Fortran 
    科学技術計算用
  • Cobol 
    事務処理用
  • Php 
    WEBサイト作成

Add-on言語

特定のソフトウェアやプラットフォームの機能をカスタマイズや拡張するためのAdd-onを開発するための言語のことです。例としては、以下の言語があげられます。

  • PL-SQL 
    Oracle DBMS
  • Transact-SQL 
    Sybase/SQLServer DBMS
  • ABAP 
    SAP ERP
SAPに投稿されました 続きを読む

SAP Business Suiteとは、SAP ERPをはじめとするSAP社の業務アプリケーションのスイート製品です。

SAP Business Suiteは、NetWeaverというSAPのテクノロジプラットフォームに基づいています。

構成

SAP Business Suiteは、以下のアプリケーション製品から構成されます。

  • ERP(Enterprise Resource Planning)
  • CRM(Customer Relationship Management)
  • SCM(Supply Chain Management)
  • PLM(Product Lifecycle Management)
  • SRM(Supplier Relationship Management)

世代

SAP Business Suiteソリューションは、公式的にR/1、R/2、R/3、S/4の4世代に分けられるようになっています。
ここの「R」はリアルタイム、「S」はシンプルを意味しているそうです。

  1. R/1
    1973年  メインフレームで動作する会計システム
  2. R/2
    1979年   R/1の進化版
  3. R/3
    1992年 様々なプラットフォームで動作するクライアント・サーバ型の分散アプリケーションシステム
  4. S/4
    2015年   同社のインメモリデータベースHANAのみで動作する
JavaVMに投稿されました 続きを読む

Javaクラスファイルの構造は以下の構造体定義で示すことができます。

 ClassFile {
         u4 magic;
         u2 minor_version;
         u2 major_version;
         u2 constant_pool_count;
         cp_info constant_pool[constant_pool_count-1];
         u2 access_flags;
         u2 this_class;
         u2 super_class;
         u2 interfaces_count;
         u2 interfaces[interfaces_count];
         u2 fields_count;
         field_info fields[fields_count];
         u2 methods_count;
         method_info methods[methods_count];
         u2 attributes_count;
         attribute_info attributes[attributes_count];
     } 

マジックナンバー

ClassFile構造体の先頭はマジックナンバーです.その値は16進でCAFEBABE と決まっています.先頭がCAFE BABEでないファイルはベリファイをパスしません。

バージョン

次の項目はこのクラスファイルを作成したバイトコード・コンパイラのバージョンです.バージョン番号がJavaVMのサポートしていないものだった場合は,それを実行することは許されていません.

コンスタントプール

コンスタントプールは定数やクラス名などを保持するためのものです.
コンスタントプールは可変長の要素を持つ,0~ConstantPoolCount-1までの一種の配列ですが,クラスファイルには0番目の要素は含まれていません.0 番のエントリはJavaVM内部用に予約されており,クラスファイルで使用することはできません.同時に0番は無効なインデックスであり,これを使用するクラスファイルはベリファイをパスしません.
コンスタントプールは配列として表現されてはいますが,要素が可変長であるため,添字から各エントリへ単純にアクセスすることはできません.  

アクセスフラグ

このクラスの修飾子に対応するフラグです.access_flagsの各ビットが public,final,interface,abstractの各修飾子に対応しています.finalと abstract,finalとinterfaceのように,同時にセットすることが許されていないフラグもあり,もしそれらが同時にセットされているとベリファイをパスしません.
通常の修飾子とは異なるsuperというフラグもありますが,これは古いコンパイラとの互換性を保つためのものです.新しいコンパイラでは常にセットされていなければなりません.
現在のバージョンで使われていないビットもありますが,それらは将来に備えて予約されており,現在は常に0にしなければなりません.これはフィールド情報やメソッド情報にあるアクセスフラグでも同様です.

thisクラス

this_classはこのクラス自身を表しています.これはコンスタントプールへのインデックスになっており,コンスタントプール中の該当するエントリはこのクラスへの参照を表すCONSTANT_Class_infoになっています.

スーパークラス 
super_classは直接のスーパークラスを表しています.直接のスーパークラスを持たないクラス(即ちjava.lang.Object)やインターフェースの場合は,この数値は0になります.それ以外の場合はthis_classと同様です. 

スーパーインターフェース 
interfaces[]は直接のスーパーインターフェースを表します.スーパークラスとは異なり,直接のスーパーインターフェースは複数持つ可能性があるので配列になっています.直接のスーパーインターフェースを持たない場合は interface_countが0になり,配列そのものがなくなります.それ以外は this_classやsuper_classと同様です.
図4の例では,this_classが2,super_classが1になっています.これより順に辿ると,このクラスの名前はGalaxyで,そのスーパークラスの名前は Sovereignであることが分かります. 

フィールド情報

fields[]はfield_info構造体の配列で,このクラスで定義しているフィールドに関する情報を保持しています.

access_flagsの各ビットは,このフィールドの修飾子に対応しています. publicとprivate,finalとvolatileなどを同時にセットするとベリファイをパスしません.また,このクラスファイルがインターフェースを表していた場合, finalとstaticがセットされていないとベリファイをパスしません.
name_indexで指定されるCONSTANT_Utf8_infoはフィールド名として有効な文字の並びを保持していなくてはなりません.そうでなければベリファイをパスしません.descriptor_indexについても同様です.
コンスタントプール回りの例が図4にあります.もう見れば分かると思いますが,fields[0]がint型のNcc,fields[1]がint型のMiranda,fields[2]が iveLongAndProsper型のYouWillBeAssimilatedというフィールドを,それぞれ表しています.  

メソッド情報

methods[]はmethod_info構造体の配列になっており,このクラスで定義されているメソッドに関する情報を保持しています.method_info 構造体は形式だけならばfield_info構造体と同じですが,ディスクリプタやアクセスフラグの詳細などが異なっています.

access_flagsの各ビットは,このメソッドの修飾子に対応しています. publicとprotected,abstractとfinalなど,同時に使用できないフラグもあります.それらが同時にセットされていた場合は,ベリファイをパスしません.  

属性

属性とは,今まで紹介された以外の様々な情報を保持するものです. ClassFile構造体の他,field_info構造体,method_info構造体,そして属性であるCode_attribute構造体の中で使われます.属性には仕様書で定義されている定義済み属性と,新たにユーザーが定義する属性とに分けられます.
属性の基本フォーマットとなるattribute_info構造体を図8に示します.全ての属性はこのフォーマットに従わなければなりません.逆に言えばこのフォーマットに従っており,且つ定義済み属性で予約されていない有効な名前を持つ属性ならば,新たに定義することはユーザーの自由です.

当然のことながら,ユーザーによって新たに定義された属性の中には JavaVMが認識できないものも出てきます.このため,認識できない属性を単純に読み飛ばすことはJavaVMに必須の機能になっています. 

 
定義済み属性
JavaVM仕様書で定義されている定義済み属性の一覧を下記の表に示します.このうち,JavaVMが必ず認識しなければならない属性はCode属性,ConstantValue 属性,Exceptions属性,InnerClasses属性,Synthetic 属性の5つです.それ以外の属性については必ずしも認識する必要はありません.(もちろん認識した方がより良いのですが.)
表3:定義済み属性一覧

属性内容使用される場所
ConstantValue属性staticの定数フィールドの値field_info
Code属性 バイトコードなど,メソッドの実装に関する情報method_info
Exceptions属性メソッドがスローするチェック例外method_info
InnerClasses属性内部クラスに関する情報ClassFile
Synthetic属性このメンバーがソースコードに現れないものであることを示すClassFile
field_info
method_info
SourceFile属性 このクラスを定義しているソースファイル名ClassFile
LineNumberTable属性code配列への添字(即ちバイトコード)と,その元となるソースファイル中の対応する行番号Code_attribute
LocalVariableTable属性 各メソッドのローカル変数に関する情報 Code_attribute
Deprecated属性 クラス,インターフェース,メソッド,フィールドが,既に新しいものと置き換えられたことを示すClassFile
field_info
method_info

オープンソースに投稿されました 続きを読む

以下の表にて、カテゴリー別にdojoライブラリのモジュールをリストアップしてみました。

カテゴリモジュール名 概要
Dojo Kerneldojo/_base/kernelversionの表示や、deprecatedな関数を実行したときに警告を出すと言ったライブラリのごく基本的な機能を提供。
Dojo Configurationdojo/_base/configDojoの設定に関連。
Module Loadingdojo/_base/loader旧ローダー及びAMDローダー。
dojo/require
Loader Pluginsdojo/domReadyAMDローダーのプラグイン
dojo/i18n
dojo/has
dojo/node
dojo/text
Feature Detectiondojo/hasクロスプラットフォームの機能検出と管理
dojo/sniff
dojo/uacss
dojo/_base/sniff
Languagedojo/_base/lang基礎的な言語の拡張パッケージ
Classesdojo/_base/declare型システム
Deferreds and Promisesdojo/promise非同期処理関連
dojo/Deferred
dojo/when
dojo/_base/Deferred
dojo/DeferredList
Events, Connectionsdojo/onイベントハンドリング関連。dojo/_base/connectとdojo/_base/eventは実質的にdeprecated
dojo/_base/connect
dojo/_base/event
dojo/Evented
dojo/behavior
Aspect Oriented Programmingdojo/aspectAOP関連
Requestsdojo/requestAjaxのコアとなるリクエストのハンドリング関連
dojo/_base/xhr
dojo/io/iframe
dojo/io/script
Propertiesdojo/Statefulオブジェクトクラスのプロパティの管理。
Topics/Publish/Subscribedojo/topicpublish/subscribeパターン
Data and Storesdojo/storeクライアントサイドのデータハンドリング
dojo/data
Routerdojo/routerHashベースのコールバックの仕組み。dojo/hashを使っている。
Parserdojo/parserdata-dojo-typeが指定されたノードをDijitのウィジェットに変換する
DOM and HTMLdojo/domDOMとHTMLを操作する
dojo/dom
dojo/dom-attr
dojo/dom-class
dojo/dom-construct
dojo/dom-form
dojo/dom-geometry
dojo/dom-prop
dojo/dom-style
dojo/dom-html
dojo/_base/html
Query, NodeList and Selectorsdojo/queryDOMクエリとその結果に対する操作を拡張。
dojo/NodeList
dojo/NodeList-data
dojo/NodeList-dom
dojo/NodeList-fx
dojo/NodeList-html
dojo/NodeList-traverse
dojo/selector
dojo/_base/query
dojo/_base/NodeList
DOM Effectsdojo/_base/fxDOMのアニメーション関連
dojo/fx
Browser Windowdojo/windowクロスブラウザな表示領域関連の参照。
dojo/_base/window
Document Lifecycledojo/readyDocumentのライフサイクル関連
dojo/domReady
dojo/_base/unload
Browser Historydojo/backブラウザのヒストリの管理
dojo/hash
Cookiesdojo/cookieCookieの管理
Mouse, Touch and Keysdojo/mouseユーザインプットの正規化と管理
dojo/touch
dojo/keys
Drag and Dropdojo/dndDrag and Drop関連
Testingdojo/robotユーザ入力のエミュレーション
dojo/robotx
JS基本オブジェクト拡張dojo/_base/array配列関連の拡張
dojo/string文字列処理の拡張
dojo/jsonJSON関連
dojo/_base/json
dojo/_base/Color色関係のクラスと関数
dojo/colors
dojo/dateDateの拡張
URL and Query Stringsdojo/_base/urlURLとURLクエリストリングの管理
dojo/io-query
Internationalizationdojo/i18nアプリケーションの国際化関連モジュール
dojo/nls
dojo/cldr
dojo/number
dojo/currency
HTMLに投稿されました 続きを読む

iframe要素は、別の文書を埋め込むインライン・フレームを作る際に使用します。 

HTML5では、次の属性が廃止されました。

  • frameborder属性
  • marginheight属性
  • marginwidth属性
  • scrolling属性
  • longdesc属性

また、次の属性が新しく追加されました。

  • srcdoc属性
  • sandbox属性
  • seamless属性

srcdoc属性

srcdoc属性はiframe要素で埋め込むHTML文書の内容を指定します。つまり、表示したいHTMLを属性値として直接入力します。
srcdoc 属性値に入る 「“」 及び 「&」 は実体参照文字(それぞれ 「"」「&」)でエスケープする必要があります。

sandbox属性

sandbox属性を指定すれば、そのインラインフレーム内のコンテンツは次のような制限がかけられます。

  • 同じドメイン内の文書であったとしても別ドメインの文書として扱われます
  • ほかのウィンドウやフレームを操作できなくなります、子孫フレームは操作可能
  • 最上位のウィンドウを操作できなくなります
  • フォームの送信を無効化します
  • スクリプトの実行を無効化します

一部の制限は、以下のキーワードの指定によって解除することが可能です。

  • allow-same-origin
    親文書と同じドメインを持つものとする
  • allow-top-navigation
    最上位のウィンドウの操作を許可する
  • allow-scripts
    スクリプトの実行を許可する

seamless属性

seamless属性が指定されると、そのiframe要素で読み込まれたコンテンツは、親ドキュメントの一部としてレンダリングされるようになります。 

JavaScriptに投稿されました 続きを読む

概説

クロージャとは、「関数の外側で定義された変数を持つ関数の実行時オブジェクト」です。

 JavaScriptでは、関数もオブジェクトであり、生成から廃棄されるまでのライフルサイクルを持ちます。関数が外側の関数で定義されたローカル変数を参照していれば、関数オブジェクト生成時の実行環境も関数オブジェクトの属性の一部(クロージャスコープ属性)として維持し続けられます。

サンプル

下記のコードを例として説明します 。

var x = 1; 
function Counter() { 
  var n = 0; 
  return function () { 
     n = n + x;     
     return n;   
  }; 
} 

関数Counter()は、内部でローカル変数nを定義して、それを参照するクロージャを返します。

実行1  

var a = Counter(); 
console.log("a()=" + a()); 
console.log("a()=" + a()); 
console.log("a()=" + a()); 
console.log("a()=" + a()); 

上記コードの実行結果は次の通りになります。 

a()=1 
a()=2 
a()=3 
a()=4 

変数nの値が保持されていることは分かります。

Counter()実行後の環境の状態

┌────────┐     
     グローバル環境       ┌───────┐       
       x => 1         ←─  Counterの環境       
       a => function           n => 0      ←─ クロージャa   
└────────┘               └───────┘ 

実行2  

var a = Counter(); 
var b = Counter(); 
console.log("a()=" + a()); 
console.log("a()=" + a()); 
console.log("b()=" + b()); 
console.log("a()=" + a()); 
console.log("b()=" + b()); 

実行結果は次の通りです 。

a()=1 
a()=2 
b()=1 
a()=3 
b()=2 

関数Counter()が実行されるごとに異なる環境が生成されることはわかります。  

Counter()2回実行後の環境の状態 

┌────────┐                ┌──────────┐    
   グローバル環境    ←─  1回目のCounterの環境       
     x => 1                      n => 0          ←─ クロージャa       
     a => function        └──────────┘       
     b => function        ┌──────────┐   
└────────┘          ←─ 2回目のCounterの環境  
                                 n => 0          ←─ クロージャb 
                          └──────────┘ 
JavaScriptに投稿されました 続きを読む

構文構造を利用

例1:

var o = {
  a: 1
}; 

上記のoは Object.prototype をプロトタイプとして生成され、 o.hasOwnProperty('a') がtrueを戻します。

例2:

var a = ["yo", "whadup", "?"]; 

上記のaは Array.prototype をプロトタイプとして生成され、三つの要素を持ちます。

コンストラクタ関数を利用

JavaScriptに於ける「コンストラクタ」は、関数を new 演算子を使って呼び出す事で実現可能です。 

下記のコードを例とします。

function Graph() {
  this.vertexes = [];
  this.edges = [];
} 
Graph.prototype = {
  addVertex: function(v){
     this.vertexes.push(v);
  }
}; 
var g = new Graph(); 

上記のコードで生成されるg は「vertexes」と「edges」の自身のプロパティを持つオブジェクトであり、 g.[[Prototype]] はインスタンス化する時点の Graph.prototype の値になります。

Object.Create メソッドを利用

ECMAScript 5 は Object.create という新しいメソッドを紹介しています。このメソッドを呼び出すと、新しいオブジェクトが生成されます。
関数の最初の引数が、このオブジェクトのプロトタイプになります。 

var o1 = { // o1 ---> Object.prototype ---> null
  a: 1
};  
var o2 = Object.create(o1); // o2 ---> o1 ---> Object.prototype ---> null 
console.log(o2.a); // 1 (継承された) 
var o3 = Object.create(o2); // o3 ---> o2 ---> o1 ---> Object.prototype ---> null 
var o4 = Object.create(null); // o4 ---> null 
console.log(o4.hasOwnProperty); // undefined、なぜなら o4 は Object.prototype から継承していないからです。