1. Hello, Scala World!

    Posted on 1月 7th, 2012 by cx20

    Scala

    Scala はオブジェクト指向言語と関数型言語の特徴を組み合わせた比較的新しいプログラミング言語である。Java VM 上で動作する。Java の後継を担うものとしても注目を浴びている。
    並行プロセス処理が優れているということで Twitter のメッセージ基盤(API の実装)にも採用されている。
    なお、Java VM で動作するスクリプト言語としては、他にも、Groovy、JRuby、Jython、Clojure 等がある。

    ソースコード

    object Hello {
        def main(args: Array[String]) {
            println("Hello, Scala World!")
        }
    }

    実行方法(スクリプトファイルを指定して実行)

    $ scala Hello.scala

    コンパイル&実行方法(バイトコードにコンパイルして実行)

    $ scalac Hello.scala
    $ scala Hello

    コンパイル&実行方法(Java クラスとして実行)

    $ scalac Hello.scala
    $ java -cp $SCALA_HOME/lib/scala-library.jar:. Hello

    実行結果

    Hello, Scala World!
  2. Hello, Java VM Assembler World!

    Posted on 1月 6th, 2012 by cx20

    Java VM Assembler

    Java VM アセンブラは Java VM の中間コード(バイトコード)を生成するアセンブラである。
    主要な Java VM アセンブラとしては、Jasmin 等がある。

    ソースコード

    .class public Hello
    .super java/lang/Object
     
    .method public ()V
       aload_0
       invokespecial java/lang/Object/()V
       return
    .end method
     
    .method public static main([Ljava/lang/String;)V
       .limit stack 2
       getstatic java/lang/System/out Ljava/io/PrintStream;
       ldc "Hello, Java VM World!"
       invokevirtual java/io/PrintStream/println(Ljava/lang/String;)V
       return
    .end method

    上記コードは以下の Java のソースに対応する。
    クラスファイルを tinapoc と言った逆アセンブラや javap で逆アセンブル(javap -c Hello)することでアセンブリコードを得られる。

    public class Hello {
        public static void main( String[] args ) {
            System.out.println( "Hello, Java VM World!" );
        }
    }

    コンパイル&実行方法(Jasmin)

    $ java -jar jasmin.jar Hello.j
    $ java Hello

    実行結果

    Hello, Java VM World!
  3. Hello, CASL World!

    Posted on 1月 5th, 2012 by cx20

    CASL

    CASL は情報処理技術者試験の為に仕様策定されたアセンブリ言語である。仮想計算機 COMET 上で動作する。
    2001年より仕様改訂され現在は COMMET II / CASL II が利用されている。

    ソースコード

    MAIN    START
            OUT     MSG,LEN
            RET
    MSG     DC      'Hello, CASL World!'
    LEN     DC      18
            END

    コンパイル&実行方法(YACASL2)

    $ casl2 -Ohello.o hello.cas
    $ comet2 hello.o
    

    コンパイル&実行(JPA CASL II シミュレータ)

    $ java -jar casl2.jar hello.cas
    $ java -jar run.jar hello.obj
    

    実行結果

    Hello, CASL World!
    
  4. Hello, MASM World!

    Posted on 1月 4th, 2012 by cx20

    MASM

    MASM はマイクロソフト社製のアセンブリ言語である。正式名称は Microsoft Macro Assembler。Visual C++ に付属している。

    ソースコード(32bit版)

    .MODEL flat
    EXTRN   _printf:PROC
     
    _DATA   SEGMENT
    msg     DB      'Hello, MASM World!', 0aH, 00H
    _DATA   ENDS
     
    _TEXT   SEGMENT
    _main   PROC
            push    OFFSET msg
            call    _printf
            add     esp, 4
            xor     eax, eax
            ret     0
    _main   ENDP
    _TEXT   ENDS
    END

    ソースコード(64bit版)

    EXTRN   printf:PROC
     
    _DATA   SEGMENT
    msg     DB      'Hello, MASM World!', 0aH, 00H
    _DATA   ENDS
     
    _TEXT   SEGMENT
    main    PROC
            sub     rsp, 40
            lea     rcx, OFFSET msg
            call    printf
            xor     rax, rax
            add     rsp, 40
            ret     0
    main    ENDP
    _TEXT   ENDS
    END

    上記コードは以下のC言語のソースを VC++ でアセンブリコード出力(cl /FA hello.c)したものに相当する。

    #include <stdio.h>
     
    int main( int argc, char* argv[] )
    {
        printf( "Hello, MASM World!n" );
        return 0;
    }

    コンパイル&リンク方法(MASM 32bit版)

    C:¥> ml -c hello.asm
    C:¥> link hello.obj libcmt.lib

    コンパイル&リンク方法(MASM 64bit版)

    C:¥> ml64 -c hello64.asm
    C:¥> link hello64.obj libcmt.lib

    実行結果

    Hello, MASM World!
  5. Hello, NASM World!

    Posted on 1月 3rd, 2012 by cx20

    NASM

    NASM はフリーのアセンブリ言語である。名前の由来は Netwide Assembler より。
    構文の特徴としては AT&T 記法ではなく Intel 記法が使われているという特徴がある。

    ソースコード(64bit版)

    section .text
            global _main
            extern _puts
     
    _main:
            push    rbp
            mov     rbp, rsp
            push    rbx
            mov     rbx, rsp
            and     spl, 0xF0
            mov     rdi, msg
            call    _puts
            mov     rsp, rbx
            pop     rbx
            mov     rsp, rbp
            pop     rbp
            ret
     
    section .data
    msg     db      "Hello, NASM World!", 0

    コンパイル&リンク方法

    $ nasm -f macho64 hello.asm
    $ gcc -o hello hello.o

    実行結果

    Hello, NASM World!
  6. Hello, GAS World!

    Posted on 1月 2nd, 2012 by cx20

    GAS

    GAS は GNU プロジェクトで使用されるアセンブリ言語である。Linux カーネルの開発にも用いられている。
    構文の特徴としては Intel 記法ではなく、AT&T 記法が使われているという特徴がある。

    ソースコード(32bit版)

            .text
            .globl  _main
    _main:
            pushl   %ebp
            movl    %esp, %ebp
            andl    $-16, %esp
            subl    $16, %esp
            call    ___main
            movl    $_msg, (%esp)
            call    _puts
            movl    $0, %eax
            leave
            ret
     
            .data
    _msg:
            .asciz  "Hello, GAS World!"

    ソースコード(64bit版)

            .text
            .globl  _main
    _main:
            pushq   %rbp
            movq    %rsp, %rbp
            leaq    _msg(%rip), %rdi
            callq   _puts
            xorl    %eax, %eax
            popq    %rbp
            ret
     
            .data
    _msg:
            .asciz  "Hello, GAS World!"

    上記コードは以下のC言語のソースを GCC でアセンブリコード出力(gcc -S hello.c)したものに相当する。

    #include <stdio.h>
     
    int main( int argc, char* argv[] )
    {
        printf( "Hello, GAS World!n" );
        return 0;
    }

    コンパイル&リンク方法(32bit版)

    $ gcc -c hello.s -m32
    $ gcc -o hello hello.o

    コンパイル&リンク方法(64bit版)

    $ gcc -c hello.s -m64
    $ gcc -o hello hello.o

    実行結果

    Hello, GAS World!
  7. Hello, LLVM Assembler World!

    Posted on 1月 1st, 2012 by cx20

    LLVM

    LLVM Assembly Language は LLVM で使用されている中間言語である。LLVM は Low Level Virtual Machine の略で、言語に独立な仮想マシンである。
    位置づけとしては Java VM のクラスファイルや、.NET Framework に対する MSIL(中間言語)に相当する。

    ソースコード(Mac 版)

    target triple = "x86_64-apple-macosx10.7.2"
     
    @str = internal constant [19 x i8] c"Hello, LLVM World!0"
     
    define i32 @main(i32 %argc, i8** nocapture %argv) nounwind uwtable ssp {
        %puts = tail call i32 @puts(i8* getelementptr inbounds ([19 x i8]* @str, i64 0, i64 0))
        ret i32 0
    }
    declare i32 @puts(i8* nocapture) nounwind

    ソースコード(MinGW 版)

    ; ModuleID = 'hello.c'
    target datalayout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-f80:128:128-v64:64:64-v128:128:128-a0:0:64-f80:32:32-n8:16:32-S32"
    target triple = "i686-w64-mingw32"
     
    @str = private unnamed_addr constant [19 x i8] c"Hello, LLVM World!0"
     
    define i32 @main(i32 %argc, i8** nocapture %argv) nounwind {
      %puts = tail call i32 @puts(i8* getelementptr inbounds ([19 x i8]* @str, i32 0, i32 0))
      ret i32 0
    }
     
    declare i32 @puts(i8* nocapture) nounwind

    上記コードは以下のC言語のソースを Clang でアセンブリコード出力(clang -S -O4 hello.c)したものに相当する。

    #include <stdio.h>
     
    int main( int argc, char* argv[] )
    {
        printf( "Hello, LLVM World!¥n" );
        return 0;
    }

    コンパイル(LLVM Clang コンパイラ)

    $ clang -o hello hello.ll

    実行結果

    Hello, LLVM World!
  8. Hello, New Year!

    Posted on 1月 1st, 2012 by cx20

    あけましておめでとうございます。
    本年もよろしくお願いします。

  9. Hello, MSIL World!

    Posted on 12月 31st, 2011 by cx20

    MSIL

    MSIL は .NET Framework で使用されている中間言語(Intermediate Language)である。

    ソースコード

    .assembly extern mscorlib {}
    .assembly hello {}
     
    .method static void Main() cil managed {
        .entrypoint
        ldstr "Hello, MSIL World!"
        call void [mscorlib]System.Console::WriteLine(string)
        ret
    }

    上記コードは以下の C# のソースに対応する。
    アセンブリファイル(.NET でコンパイルしたモジュール)を ildasm で逆アセンブル(ildasdm hello.exe /out:hello.il)することで MSIL のコードを得られる。

    using System;
     
    class Hello 
    {
        static void Main( String[] args ) 
        {
            Console.WriteLine( "Hello, MSIL World!" );
        }
    }

    コンパイル&実行方法(Mono)

    $ ilasm hello.il
    $ mono hello.exe
    

    コンパイル&実行方法(.NET Framework)

    C:¥> ilasm hello.il
    C:¥> hello

    実行結果

    Hello, MSIL World!
  10. Hello, Ada World!

    Posted on 12月 30th, 2011 by cx20

    Ada

    Ada は米国国防総省の音頭で開発が進められたプログラミング言語である。名前の由来は世界初のプログラマと言われる Ada さんから。
    構文は Pascal に似ており、また、Oracle の PL/SQL は Ada の影響を受けていると言われている。

    ソースコード

    with Ada.Text_Io;
    use Ada.Text_Io;
    procedure Hello is
    begin
        Put_Line ("Hello, Ada World!");
    end Hello;

    コンパイル方法(GNAT)

    $ gnatmake hello.adb

    実行結果

    Hello, Ada World!