変数の型は2つの異なるレベルの概念が混在しているような気がする

と、少し前から思っているのですが、きれいに考えが整理できていないのです。でも、書いたら整理できることもあるかと思うので、ちょっと消化不良のまま書いてみようかと。

      • -

静的な型付けをもつプログラミング言語の変数の型には、2つの異なる概念を内在していると思うのです。

  1. 計算機の物理的な演算機能やデータ形式を、コード上で明示する
  2. 抽象的なデータの分類概念を、コード上で明示する

1つめに該当するのはchar, int, long, doubleなどで、2つめに該当するのはクラス型だと考えています。
ポインタ型は、2つめに近いと思います。というのは、int*とdouble*は、計算機上では同じ大きさの領域を占め、アドレスを保持するという点で全く変わらず、指している先のデータが違っているという概念的な違いを示しているように思うからです。
レコード型(構造体)は、1つ目に近いのか?

      • -

Lispスクリプト言語で一般的な、変数に型を持たないことによる柔軟性は、上にあげた1つめの概念を捨象することで得られるものではないかと思います。それに対し、2つめの概念は、導入することで、プログラマの負担を軽減してくれるものではないかと思います。
いわゆる、型チェックがプログラマの生産性を下げる、と言っているときの型が、1つめの概念に相当し、型チェックがプログラマの生産性を上げる、と言っているときの型が、2つめの概念に相当するのではないか?

      • -

で、1つめの型を持たず、2つめの型のみを持つような言語があれば、いいかもと思いました。
(ただ、もしかすると、1つめの概念は2つめの概念に内包されるのかも知れません。というのは、Javaと同じ型システムを持っていても、intが32bitではなく無限精度だったら、この議論に意味はないかもしれないとちょっと思うからです。)