Stringとarrayは似てるようで違うけ

どうも!超おひさしぶりかも気配が。えいだです!世間の要望に答えてえろえろくいこうと思います!いや無理です!色々とっ!


さて、なんか前回までのはなし忘れました。なんでしたかね、確か、文字列がどうとか?そう、セカンダリスタックの話なのでっあるっ!ここは、もはや、アレですな。セカンダリスタックのはなしはTODOスタックに詰まれたままでしたーとかそういう系のいやそれはないですなー。(そして、ここで、TODOスタックは変な優先度が付いてるんでスタックじゃないとかいう話になっていくところであるっ)


さて、あんまり横道に逸れてばかりなので、軌道修正するよ。でも、やっぱり、横道に逸れて、前回の(もう忘れてしもてるがー)ALLOC型ってただの配列型に見える気を感じる…
と、思って、↓こんなのを書いてみたところ、コンパイルエラーでたー

function Array_Test return array(0..2) of Integer is
   C : array(0 .. 2) of Integer;
begin
   return C;
end;

anonymous arrayは駄目…ぬぬぬ。名前を付けろってかーきさまー

package body Array_Test is
   type Nanika is array(0..2) of Integer;

   function Array_Test return Nanika is
      C : Nanika; 
   begin
      return C;
   end Array_Test;

end Array_Test;

Zはなんか空パッケージをadsに入れれないとかの適当な対策なのだという説ですよー


ふふっ。Adaめんどい意味がわけってきてよ。(←ここらへんがえろす)


って、ぬあー、これだとsecondary stack使ってぬぇー。意味なかったでありますつ。どうやら、配列のローカル変数のあちゅかい(←ここらへんがえろす…ってそれは違いますなー)はC言語のそれと似たような感じですなー。

配列がreturnできたら、Ada配列素晴らしい→範囲型とか便利。とゆー話に持っていくという戦略が全くの計画ミスでごわすよっ(←ここらへんが…いや、それは…)…


まあ、まあよいです。Stringはただの配列に見えて、それなりにゆーぐーされてるように見えまる。

  • 配列って&で結合できない?Stringはできる
  • Stringは return できる
  • 配列は適当な使いかたするとすぐanonymous arrayは使えぬとかゆってくる。(いや、確かに、配列の範囲定数直書きとかよくないであるが)


というわけで、配列の扱いは、C言語と似てるくらい?十分ではあるけんど。あーあと、

function Array_Test return Integer is
   C : array(0..2) of Integer; 
begin
   C := 3&4;
   C(0) := 0;
   return 3;
end Array_Test;

こういうことやると、結構ありえないコードを生成してくれますなー。なんか、GNATはAdaレベルでは全く最適化してない感じですなー。


今日のまとめ:

  • GCCをバックエンドとして使う場合は、言語レベルの最適化をフロントエンドでしてあげましょう。
  • Secondary Stackとか一回も触れてないです。
  • 時々でてくる type mismatch 系のコンパイルエラーが何がどうunmatchなのかわからぬ


珍しくAdaっぽくないすっか?びみょーなー。いや、specのほうのprivateって意味ないんじゃ感がしてきたのであるが…まあ、そのうち考えまする。