2015-11-12 8 views
7

Javaでは、例えば、32ビットの値を表現するプリミティブデータ型 "int"があり、 "整数"プロパティ(およびいくつかの方法)を持つクラスだけの "整数"があります。つまり、Javaの「Integer」クラスでは、舞台裏でまだプリミティブが使用されています。そしてそれが、Javaが純粋なオブジェクト指向プログラミング言語ではない理由です。どのようにしてオブジェクトができますか?

プリミティブがない場合はどこに値を格納できますか?たとえば、私はこの擬似クラスを想像しています:

class Integer 
{ 
    private Integer i = 12; 

    public Integer getInteger 
    { 
     return this.Integer; 
    } 
} 

これは再帰的です。

プリミティブなしでプログラミング言語を実装するにはどうすればよいですか?

私の混乱を解決する助けに感謝します。

+13

それはプリミティブなし*実装*することはできませんが、あなたがそれらを見かけや言語のユーザーにアクセスできるようにする必要はありません... – assylias

+2

プログラミング言語がある時点でメモリにint型を格納する必要があります。例えばRAM。それはすべてのビットとバイトとすべての言語のフードの下に生のポインタです。 Scalaのような言語は、プリミティブをプログラマに公開しないことを決定する可能性があります。 –

+0

ドキュメントは何も作成しないことがあります。 –

答えて

1

をint型お気軽にコメントしてください。)

組み込みと継承に基づいた型システムは、組み込み型がない場合、どのような有用な型を定義できますか?言語インプリメンテーションが、少なくとも1つのイントリンシック型を知っていない限り、定義された型はいずれも再帰的または空のいずれかになります。これは必然ですか?

はい、私が知っているすべてのCファミリ言語で、これはかなり避けられないものです。

すべてのタイプは、その後、他の種類の構成が非常に少なくとも、あなたは上に構築するための固有のタイプ持っている必要がありますされている場合 - 例えば、ビットを表し固有のタイプを、バイトを構築するために、タイプから構成されており、次にワードタイプ、次にさまざまな整数タイプなどがあります。次に、内部表現を構成するビットを操作することによって、これらの型で実行できる操作を定義する必要があります。

ビルドするのに必要なのは組み込み型の1つですが、スペースやCPUサイクルを無駄にしたくない場合や、さまざまなストレージの場所と手順を利用したい場合は非常に非効率ですあなたのターゲットアーキテクチャーが提供するもの、FPレジスタなどがあります。したがって

、パフォーマンスおよび「純度」との間の良好な妥協点は、現代のCPUによって認識である可能性が高いいくつかの組み込み型の言語で提供することです(のようなINT32、int64型フロートダブルなど)、残りの型システムをそれらの上に構築します。 Javaでは、彼らはこれらの固有の型をプリミティブと呼び、それらをクラスから分離することに決めました。それはあなたがはるかに真剣 Javaはよりも設計原理「すべてのものがオブジェクトである」。取る言語における類似のコードを表示するために役立つかもしれない

+0

それはまさに私が意味していたものです。ありがとうございました!また、他の人にも大変感謝しています。あなたは私の混乱から私を助けました。 – user3585773

11

シーンの裏側は、メモリ内のビットなので、常にプリミティブになります。しかし、一部の言語では、オブジェクトのみで作業できるプリミティブが隠されています。 Javaでは、オブジェクトとプリミティブの両方で作業できます。

+0

私はOPが今それを取得すると確信しています。 –

+0

どのように?プロセッサはオブジェクトを処理できません。 – VDanyliuk

1

最終的にすべてがメモリ内のビットとコンピュータへの命令に戻ります。アセンブラ、コンパイル、プロシージャ、オブジェクト指向、そして他のすべてのものの違いは、あなたとビットの間の抽象度と、その抽象化からどのくらいの利益(またはコスト)が得られるかです。最終的には実際のデータにアクセスできずに

2

、(例えば、プリミティブまたは実際ビット)、(直接的または間接的に)マシン上で、それがInterface Description Languageで、もはやプログラミング言語ではありません。

4

あなたはprimitives値の種類によって意味場合は、[はいユーザーとしてそれらなしで生きることができるとintの代わりにIntegerを使用すると、ヒープの割り当てとGCのオーバーヘッドのために支払います。しかし、これは無料ではないので、コストを支払わなければなりません。 32ビット/ 64ビット整数やIEEE-754 floating pointsのようなプリミティブは、ハードウェアのサポートがあるため、常に高速になります。

コンパイラライターの観点からは、マシンがサポートするものを使用して動作させる必要があります。

3

LISPは非常に単純な関数言語です。基本的なLISPはありません本当に可換演算、連想のでオーバーフローなど、開いている整数が終了し、intプリミティブと整数への一つの解決策は、これは実際にいくつかの利点を持っていた3

ためsuccessor of successor of successor of zeroを持っていた持っていませんでした。可能な素晴らしい最適化。そして、もちろんsucc(succ(succ(zero)))はより多くのタプルのような方法でコード化することができます(おそらくLISPではなく)。

通常、LISP '3'はアトムになり、123はそのようなアトムになるでしょう。数学演算子を使用します。

次に、数値ストリング['4', '0'] * ['3']で数学を行うことができる記号操作言語(SNOBOL)があります。

だから、名前はあなたが、私はそれが間違っているんだと思うなら(私は。私はあなたが求めていると信じて何に質問を言い換えます「」文字のようなオブジェクト(原子)であるか、42

3

すなわち、Smalltalk。 Javaがintであって、Integer,ではなく、でなければ、を使用する必要があったものすべてがintであるとすれば、どうなるか想像してみてください。それはスモールトークです。

これはSqueak 5.0SmallIntegerクラスを定義するコードの抜粋です。

Integer immediateSubclass: #SmallInteger 
     instanceVariableNames: '' 
     classVariableNames: '' 
     poolDictionaries: '' 
     category: 'Kernel-Numbers'! 
!SmallInteger commentStamp: 'eem 11/20/2014 08:41' prior: 0! 
My instances are at least 31-bit numbers, stored in twos complement 
form. The allowable range in 32-bits is approximately +- 10^9 
(+- 1billion). In 64-bits my instances are 61-bit numbers, 
stored in twos complement form. The allowable range is 
approximately +- 10^18 (+- 1 quintillion). The actual 
values are computed at start-up. See SmallInteger class startUp:, 
minVal, maxVal.! 

!SmallInteger methodsFor: 'arithmetic' stamp: 'di 2/1/1999 21:31'! 
+ aNumber 
     "Primitive. Add the receiver to the argument and answer with the result 
     if it is a SmallInteger. Fail if the argument or the result is not a 
     SmallInteger. 
     Essential, No Lookup. See Object documentation whatIsAPrimitive." 

     <primitive: 1> 
     ^super + aNumber! ! 

!SmallInteger class methodsFor: 'instance creation' stamp: 'tk 4/20/1999 14:17'! 
basicNew 

     self error: 'SmallIntegers can only be created by performing arithmetic'! ! 

構文や意味論の細部汗をしないでください。あなたはこれから抜け出すべきです:SmallIntegerは、言語の他のすべてのものと同様にオブジェクトクラスとして定義され、算術演算は、言語の他のすべてのコードと同様のメソッドです。しかし、ちょっと奇妙です。それはインスタンス変数を持たず、算術演算を実行することによってのみインスタンスを作成することができ、ほとんどのメソッドは循環的に定義されているように見えます。

"Under the hood"では、インプリメンテーションは算術を適切なマシン命令にマップします(<primitive: 1>はこれに関する実装のヒントです)。SmallIntegerを整数そのものとして格納します。ハードウェアに比べて制限された範囲は、オブジェクトへのポインタ( "tagged pointers")ではなく、メモリワードを整数としてマークするために2ビットが予約されているためです。

関連する問題