github email
Ada

Ada

ada

被Ada的名字所吸引,来到了Ada Programming的世界。在wiki上描述,Ada是一种适合所有程序员使用的语言。但是,我查阅资料后,发现Ada最开始是美国军方为了整理在军队中使用太多的语言而创建的一种语言。知乎上对此提及的也很少,说在波音飞机中使用到该语言,而我从学习Python的过程中了解了次语言便开始一路逛奔过来。

要怪就得怪我太发散了,什么东西都喜欢弄个清楚,搞个明白。最终,才逐渐明白,很多语言都是基于C或者C++的。要想彻底的搞清楚,最终还是逃脱不了C和C++,宿命吧~~

话说Python中所说的:“人生苦短,我用Python。”可是,对与我来说就是想学习一些不一样的东西,我就喜欢在程序的世界里。所以,写代码的目的不是为了逃避,而是为了满足自己。

或许是年龄的问题,记忆的东西已经不如从前了,在此就记录一下自己跟进的进度,等再次要学习的时候而不是抓狂,再次从头开始。

我选择的是AdaCore,说SPARK可以和Rust一样编写可靠的代码,广告害人呢!到官网下载,只能选择GNAT Community,软件版本许可的问题。也可以想到为什么使用的人少了,毕竟选择的太多啦。苹果电脑只支持到2020,只能选择下载。下载之后,说好的IDE也没有包括,导致自己纠结好久要不要自己编译一下。可是想到自己的128G的硬盘,想算啦。命令行不是也可以吗?想不到后面也是坑加坑。

默认安装路径为:

/opt/GNAT/2020

安装之后需要手工加入路径:

export ADA_PATH=/Users/guoby/opt/GNAT/2020/bin

开始编写第一个ada程序:

with Ada.Text_IO;
use Ada.Text_IO;
procedure Greet is
begin
    -- Print "Hello, World!" to the screen
    Put_Line ("Hello, World!");
    Put_Line ("你好,世界!*2");
    Put_Line("ok?")
end Greet;

编译:

gnatmake greet.adb

运行:

./greet.adb

查看标准库,有一个文件的写入代码:

with Ada.Text_IO; use Ada.Text_IO;

procedure Show_Simple_Text_File_IO is
   F         : File_Type;
   File_Name : constant String := "simple.txt";
begin
   Create (F, Out_File, File_Name);
   Put_Line (F, "Hello World #1");
   Put_Line (F, "Hello World #2");
   Put_Line (F, "Hello World #3");
   Close (F);

   Open (F, In_File, File_Name);
   while not End_Of_File (F) loop
      Put_Line (Get_Line (F));
   end loop;
   Close (F);
end Show_Simple_Text_File_IO;

因为太像c代码的编译,所以直接写了个Makefile文件:

clean:
	@echo "clean build"
	@echo "delete file sample_file_io"
	@rm -rf sample_file_io
	@echo "delete file sample_file_io.ali"
	@rm -rf sample_file_io.ali
	@echo "delete file sample_file_io.o"
	@rm -rf sample_file_io.o
	@echo "delete simple.txt"
	@rm -rf simple.txt
build:
	@echo "run command gnatmake sample_file.adb"
	@gnatmake sample_file_io.adb
run:
	@echo "run command ./sample_file_io"
	@./sample_file_io

好啦,纠结的地方来啦,为什么还要这样折腾呢?难道有不一样的库或者代码?所以找到了aws这个框架。The Ada Web Server

看到一个例子,非常激动的拷贝下来,想写一下玩一玩,可惜掉坑了。

with AWS.Response;
with AWS.Server;
with AWS.Status;

procedure Hello_World is

  WS : AWS.Server.HTTP;

  function HW_CB (Request : in AWS.Status.Data)
    return AWS.Response.Data
  is
     URI : constant String := AWS.Status.URI (Request);
  begin
     if URI = "/hello" then
        return AWS.Response.Build ("text/html", "<p>Hello world !");
     else
        return AWS.Response.Build ("text/html", "<p>Hum...");
     end if;
  end HW_CB;

begin
   AWS.Server.Start
     (WS, "Hello World", Callback => HW_CB'Unrestricted_Access);
   delay 30.0;
end Hello_World;

根据套路,使用原来的编译,怎么都编译不过,即使看文档都没有搞定。最终在stackoverflow找到了答案。原来ada的项目是.gpr为后缀的文件,告诉编译器怎么编译它,如何找到项目的依赖项。所以,添加.gpr文件:

with "aws";
project Hello is
   for Main use ("hello_aws.adb");
end Hello;

编译:

gprbuild -P hello_aws.gpr

成功!

结论:如果想好了学习就应该一步一步来,一口想吃掉一个胖子是要吃亏的。但是,文档的确很详细,而且提供了很多书可以查阅,有时间还是可以深入的学习的,这个排到Delphi之后。😊

收获:

  1. 找到了斯坦福的一个课程.
  2. 找到了一个用Java编写的IDE jGRASP.
  3. AdaCore在github的官网.

为了给系统腾出空间,还是把opt下的GNAT挪到了项目中。

/Volumes/Transcend/Project/ada_code/GNAT/2020

测试通过,迁移成功!