ã¿ã¤ãã«ã«è¥å¹²å½ããããCè¨èªã»Common Lispï¼ECLã¨MKCLï¼ã»OCamlãå«ãã§ããã
ä¸å¿ãçµã¿è¾¼ã¿ã£ã½ãæ¥çã«ãã人ã¨ãã¦ãCè¨èªã®æ¬¡ã®ã·ã¹ãã ã»ããã°ã©ãã³ã°åãã®è¨èªã¯èå³ã®å¯¾è±¡ã ã
ãã¡ãããä»ããæ¥ã«å¥ã®è¨èªã«ç§»è¡ãããããªäºæ ã¯ãå¯è½æ§ã¨ãã¦ä½ãã ãããã¢ã»ã³ãã©å ¨çæããé·ãæéãããã¦Cè¨èªããCè¨èªã¨ã¤ã³ã©ã¤ã³ã»ã¢ã»ã³ãã©ã®æ··åãã«å¤åããããã«ãï¼ä»åãåãç¨åº¦ã®æéãçµããå¦ãå®ãã§ã¯ãªããã®ã®ï¼ãããªãã«æéããããã¨æã£ã¦ããã
ã¤ãã§ã«ãããªããä»ã§ãã¢ã»ã³ãã©ãç¨ããé¨åãæ®ã£ã¦ããã®ã¨åæ§ã«ã次ã®ã·ã¹ãã ã»ããã°ã©ãã³ã°è¨èªã主æµã«ãªã£ããCè¨èªãçµ¶æ» ããã¨ã¯æã£ã¦ããªããæããã«ãã¼ãã¦ã§ã¢ãOSã®ã·ã¹ãã ã³ã¼ã«ã«è¿ãé層ã§ã¯ãCè¨èªãçãæ®ãã ãããä¸æ¹ã§ãçµã¿è¾¼ã¿ã·ã¹ãã ã®ä¸ä½é層å´ã§ã¯ãç¾å¨ã§ãCè¨èªããC++ã¸ã®ç§»è¡ãè¦ãããããã«ã次ä¸ä»£ã®è¨èªã«ç§»è¡ãã¦ããã®ã§ã¯ãªããã¨æã£ã¦ããã
ã¨ããããPCããã¹ããï¼ã¿ãã¬ããã®ä¸çã®æµåãåºã¾ã£ã¦ããå½±é¿ã§è²ã ã¨ãªãããªã·ã¹ãã ãæ±ãããã¦ããå½±é¿ã§ãæ½è±¡åº¦ã®é«ãé åã§åé¡ãã¨ããã¦è§£ãæ¢ããªãã¦ã¯ãããªãã®ã«ãåæã«ãã®ãããå ·è±¡å¯ãã®åé¡ã¨ä»ãåããªãã¦ã¯ãªããªãCè¨èªç¸ãã ãªãã¦ãè²ã ã¨è¾ããããèªåãMãããªãã£ãããã
çµã¿è¾¼ã¿ã¨ãã£ã¦ãåéã¯åºãããã次ä¸ä»£ã®è¨èªã¸ã®ç§»è¡ãã¨ããç¹ã§ã¯ãã½ãããªã¢ã«ã¿ã¤ã ãã¤ã·ã¹ãã ãªã½ã¼ã¹ããããã潤沢ã§ãæ°ããè¨èªãçã¾ããããLinuxã®è¿ç¸ã§ããçµã¿è¾¼ã¿LinuxãBSDç³»ã®OSãæ¡ç¨ãã¦ããã·ã¹ãã ãããããæ¡ç¨ãå§ã¾ãå¯è½æ§ãé«ãã¨æã£ã¦ããã人å½ã«é¢ãããªãã¬ã¸ã§ããå¯ãã§ãåå寿å½ãçãã®ã³ã³ã·ã¥ã¼ãåãããã¨IoTã§ã¯ãªãããããã¯ã¼ã¯ã«ç¹ãã£ã¦ããã
ããªãããªã·ã¹ãã ã»ãããã¯ã¼ã¯å¯¾å¿ã»åå寿å½ãçããã®ä¸æåãæã£ãæç¹ã§ãç©æ¥µçã«ãµã¼ããã¼ãã£ã®ã½ããã¦ã§ã¢ãæ¡ç¨ããããããªããã§ãªãã¨éçºãéã«åããªããçºå£²å¾ã«ã»ãã¥ãªãã£ãã¼ã«ãããµã¼ããã¼ãã£ã®ã½ããã¦ã§ã¢ã®ãã°ããã«è¿ éã«å¯¾å¿ããå¿ è¦ãçããçµæãã½ãããã«ãªã«ãªã«ãã¥ã¼ãã³ã°ãã¦éåãªãã¼ãã¦ã§ã¢ã§åãããããªèª¿æ´ã¯ã§ããªããä¸æã«ãã¥ã¼ãã³ã°ã«æåãã¦ãã¾ãã¨ãä¸å ·å対å¿ã®ã¢ãããã¼ãã«ã¦ã調æ´æ¸ã¿ãã©ã³ã¹ãå´©ãã¦ãã¾ããããããã¯ããã¼ãã¦ã§ã¢å´ã«è¥å¹²ã®ä½è£ãæãããæ¹ãå®å ¨ã ã
ã¢ããã¥ã¢åãã§ãããªããArduinoã§ã¯ãªãRaspberry PiãBeagleBoard/BeagleBoneå¯ãã ãããã
次ä¸ä»£ã®è¨èªãè©ä¾¡ãããã¤ã³ãã¨ãã¦ã¯ãå®è¡é度以å¤ã«ãããããªã³ããæããããããã¤ããªãµã¤ãºã大ããã¨å¤é¨è¨æ¶ï¼ä¾ãã°å èµãã©ãã·ã¥ï¼ãå æããããã¡ã¢ãªãå æããããå®è¡æã®ãã¼ãæéãé·ããªãã
ãããããªã³ãã®é¢ã§ãã¹ã¯ãªããè¨èªãJavaï¼.NETã®ãããªè¨èªã¯ä¸å©ã ãå¦çç³»ãã©ã¤ãã©ãªã¯å¤é¨è¨æ¶ããããªãã«å æããããã®é¢ã§ã¯ããã¤ãã£ãã³ã¼ããåãåºãã³ã³ãã¤ã©åè¨èªã®æ¹ãããã
ãããªè¨³ã§ãCè¨èªãC++ã¨ãå人çã«æè¿æ°ã«ãªã£ã¦ããè¨èªã¨ã§ããã¤ããªãµã¤ãºãæ¯è¼ãã¦ã¿ããã¨ã«ããããããé¡ãç¡ãã£ãã®ã§ãããã¼ã¯ã¼ã«ãã ã
æ¤è¨¼å¯¾è±¡ã®ã½ã¼ã¹ã³ã¼ãã
Cè¨èª
#include <stdio.h> #include <stdlib.h> int main(void) { (void) puts("hello, world"); return EXIT_SUCCESS; }
C++
#include <iostream> int main() { std::cout << "hello, world" << std::endl; }
Dè¨èª
import std.stdio; void main() { writeln("hello, world"); }
Goè¨èª
package main import "fmt" func main() { fmt.Println("hello, world") }
Rust
fn main() { println!("hello, world"); }
OCaml
print_string "hello, world\n"
Common Lisp
(format t "hello, world~%") (quit)
æ¤è¨¼ç°å¢ã»ã³ã³ãã¤ã©
æ¬å½ã¯ARMã§æ¤è¨¼ãããã£ãã®ã ãã諸äºæ ã§x86ä¸ã®Ubuntu 12.04.5 LTS 32bitä¸ã§ç¢ºèªããã
使ç¨ããã³ã³ãã¤ã©ã¨ãã«ãæ¹æ³ã¯æ¬¡ã®éãã
# gcc (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3 # Install from Ubuntu default repository gcc -Wall -ansi -pedantic -o hello_bin/hello_c hello.c
# g++ (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3 # Install from Ubuntu default repository g++ -Wall -ansi -pedantic -o hello_bin/hello_cpp hello.cpp
# DMD32 D Compiler v2.067.1 # http://downloads.dlang.org/releases/2.x/2.067.1/dmd.2.067.1.linux.zip dmd -odhello_bin -ofhello_d hello.d
# go version go1.4.2 linux/386 # https://storage.googleapis.com/golang/go1.4.2.linux-386.tar.gz go build hello.go mv hello hello_bin/hello_go
# rustc 1.0.0 (a59de37e9 2015-05-13) (built 2015-05-14) # https://static.rust-lang.org/dist/rust-1.0.0-i686-unknown-linux-gnu.tar.gz rustc -o hello_bin/hello_rust hello.rs
# The Objective Caml native-code compiler, version 3.12.1 # Install from Ubuntu default repository ocamlopt hello.ml mv a.out hello_bin/hello_ocaml
# ECL 15.2.21 # http://sourceforge.net/projects/ecls/files/ecls/15.2/ecl-15.2.21.tgz/download ecl # (compile-file "hello.lisp" :system-p t) # (c:build-program "hello_ecl" :lisp-files '("hello.o")) # :exit mv hello_ecl hello_bin/
# MKCL 1.1.9 # http://common-lisp.net/project/mkcl/releases/mkcl-1.1.9.tar.gz mkcl # (compile-file #P"./hello.lisp" :output-file #P"./hello.o" :fasl-p nil) # (compiler::build-program "hello_mkcl" :lisp-object-files '(#P"./hello.o")) # :exit mv hello_mkcl hello_bin/
Cè¨èªã¨C++ã¯ãçµã¿è¾¼ã¿ã§ä½¿ããããã¨ããªãã¯ãªãGCCã使ç¨ãDè¨èªã»Goè¨èªã»Rustã¯åããã¸ã§ã¯ãã®å ¬å¼ã®ã³ã³ãã¤ã©ãé¸æãOCamlãããã¸ã§ã¯ãå ¬å¼ã®ã³ã³ãã¤ã©ã¨è¨ããªãããªãããUbuntuã®ãªãã¸ããªã®ãã®ã使ç¨ããã®ã§ããã¼ã¸ã§ã³ã¯å¤ãã ã¨æãã
Common Lispæ ããã¯ECLï¼Embeddable Common-Lispï¼ã¨MKCLï¼ManKai Common Lispï¼ãé¸æãçç±ã¯â¦â¦ä¸¡è ã¨ãKCLãGCLã®ç³»èã ããã£ã¦å®è¡ãã¡ã¤ã«ãä½ããããããã両è ã¨ããCommon Lispã®ã³ã¼ããç´æ¥ã³ã³ãã¤ã«ãã¦ããã®ã§ã¯ãªããCè¨èªã«å¤æãã¦ããã³ã³ãã¤ã«ãã¦ããï¼ã¯ãï¼ã
è¨æ¸¬çµæ
ãã«ãããå®è¡ãã¡ã¤ã«ã®å¤§ããã¯æ¬¡ã®éãã
è¨èª | ãã¡ã¤ã«å | 大ããï¼byteï¼ |
---|---|---|
Cè¨èª | hello_c | 7159 |
C++ | hello_cpp | 7754 |
Dè¨èª | hello_d | 562112 |
Goè¨èª | hello_go | 1564840 |
Rust | hello_rust | 553685 |
OCaml | hello_ocaml | 142862 |
Common Lisp (ECL) | hello_ecl | 36667 |
Common Lisp (MKCL) | hello_mkcl | 57330 |
CãC++ã¯ãã³ããã«å°ãããC++ã¯ãæ¨æºã©ã¤ãã©ãªã®æ©è½ããã£ã¨ä½¿ããããªããã°ã©ã ã§ã¯ãã¾ãçµæãå¤ãã£ã¦ããæ°ãããã
ç¶ãã¦ECL/MKCLãCè¨èªã«å¤æãã¦ããã³ã³ãã¤ã«ãã¦ããããããã®å¤§ããã ãããï¼
ãã®æ¬¡ã¯OCamlããã®æç¹ã§ãCè¨èªãC++ã®20åå¼±ã
Dè¨èªã¨Rustã¯ãå¥ãããã»ã¼åããããã®å¤§ããã¨ãªã£ãã
ããã¦æã大ããã£ãã®ã¯Goè¨èªã3.5ã¤ã³ã2HDã®ãããããã£ã¹ã¯ï¼1.44MBï¼ã«åã¾ããããªãããã¼ã¯ã¼ã«ãã¨ã¯ãéä¸ã®æãããã
ãã£ã¨ããGoè¨èªã®ãã¤ããªã®å¤§ããã®åå ã¯ã次ã®å®è¡çµæãè¦ãã°åããï¼ãããããªãï¼ã
$ file hello_* hello_c: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.24, BuildID[sha1]=0xf4b60d24e85b520638ccfb0f12c99375aa53a849, not stripped hello_cpp: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.24, BuildID[sha1]=0x8d8cd721cadc2c5fbf6a1dbf415af891cc9d6f40, not stripped hello_d: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.24, BuildID[sha1]=0x2335b3e557cf714c121bac13513c9264d3cf6d3c, not stripped hello_ecl: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.24, BuildID[sha1]=0x2f0ed7a2b925f68e9225b4848980b4df676612a1, not stripped hello_go: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), statically linked, not stripped hello_mkcl: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.24, BuildID[sha1]=0x9479becd387a27bf1e8fc65376b3a3ad60f32edb, not stripped hello_ocaml: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.24, BuildID[sha1]=0x093f42fd42a0b08156ad4868adfa2734f2b59bb6, not stripped hello_rust: ELF 32-bit LSB shared object, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.24, BuildID[sha1]=0xf87292aa16c1751b0933947847042322318900f8, not stripped $ _
Goè¨èªã¯ã©ã¤ãã©ãªãéçãªã³ã¯ãã¦ãããä¸æ¹ãä»ã®è¨èªã¯åçãªã³ã¯ãã¦ãããæéãã§ããããå¯è½ãªãGoè¨èªä»¥å¤ã§ãéçãªã³ã¯ã§ãã«ããã¦æ¯è¼ãããã¨ããã ã
ã¨ããã§ãä½ã§Rustã®ãã¤ããªã¯å®è¡ãã¡ã¤ã«ã§ã¯ãªãå ±æã©ã¤ãã©ãªãªã®ã ããï¼ãRustã®ã³ã³ãã¤ã©èªä½ãå ±æã©ã¤ãã©ãªã ã£ãã
ã¤ãã§ã«ãldd(1)ã®çµæãæ®ãã¦ããã
$ ldd hello_* hello_c: linux-gate.so.1 => (0xb77d0000) libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb7611000) /lib/ld-linux.so.2 (0xb77d1000) hello_cpp: linux-gate.so.1 => (0xb778e000) libstdc++.so.6 => /usr/lib/i386-linux-gnu/libstdc++.so.6 (0xb7693000) libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb74ea000) libm.so.6 => /lib/i386-linux-gnu/libm.so.6 (0xb74bd000) /lib/ld-linux.so.2 (0xb778f000) libgcc_s.so.1 => /lib/i386-linux-gnu/libgcc_s.so.1 (0xb749f000) hello_d: linux-gate.so.1 => (0xb7743000) libpthread.so.0 => /lib/i386-linux-gnu/libpthread.so.0 (0xb7712000) librt.so.1 => /lib/i386-linux-gnu/librt.so.1 (0xb7709000) libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb755f000) /lib/ld-linux.so.2 (0xb7744000) hello_ecl: linux-gate.so.1 => (0xb7769000) libecl.so.15.2 => not found libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb75aa000) /lib/ld-linux.so.2 (0xb776a000) hello_go: åçå®è¡ãã¡ã¤ã«ã§ã¯ããã¾ãã hello_mkcl: linux-gate.so.1 => (0xb76e6000) mkcl_1.1.9.so => /usr/local/mkcl/lib/mkcl_1.1.9.so (0xb72da000) libpthread.so.0 => /lib/i386-linux-gnu/libpthread.so.0 (0xb72ab000) libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb7101000) libgmp.so.10 => /usr/lib/i386-linux-gnu/libgmp.so.10 (0xb7082000) librt.so.1 => /lib/i386-linux-gnu/librt.so.1 (0xb7079000) libdl.so.2 => /lib/i386-linux-gnu/libdl.so.2 (0xb7074000) libm.so.6 => /lib/i386-linux-gnu/libm.so.6 (0xb7048000) /lib/ld-linux.so.2 (0xb76e7000) hello_ocaml: linux-gate.so.1 => (0xb771e000) libm.so.6 => /lib/i386-linux-gnu/libm.so.6 (0xb76dc000) libdl.so.2 => /lib/i386-linux-gnu/libdl.so.2 (0xb76d7000) libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb752d000) /lib/ld-linux.so.2 (0xb771f000) hello_rust: linux-gate.so.1 => (0xb7752000) libdl.so.2 => /lib/i386-linux-gnu/libdl.so.2 (0xb76e7000) libpthread.so.0 => /lib/i386-linux-gnu/libpthread.so.0 (0xb76cc000) librt.so.1 => /lib/i386-linux-gnu/librt.so.1 (0xb76c2000) libgcc_s.so.1 => /lib/i386-linux-gnu/libgcc_s.so.1 (0xb76a4000) libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb74fb000) /lib/ld-linux.so.2 (0xb7753000) libm.so.6 => /lib/i386-linux-gnu/libm.so.6 (0xb74cf000) $ _
ECL/MKCLãé¤ãã°ãããã¦ç¹å¥ãªã©ã¤ãã©ãªã¨ã¯ãªã³ã¯ãã¦ããªãããã«è¦ãããDè¨èªãRustã«ã¦ãããããªãlibpthreadãlibrtã¨ãªã³ã¯ãã¦ããç¹ãèå³æ·±ããæ¨æºã©ã¤ãã©ãªç¸å½ã®æ©è½ãå¤ã使ç¨ããå ´åã®çµæãã©ããªãã®ããæ°ã«ãªãã¨ããã ã
ã¾ã¨ãï¼ã¨ããåã®ææ³ï¼
Dè¨èªãGoè¨èªãRustã®ãã¤ããªã¯çµæ§å¤§ããã£ããã¾ãè¨èªã ãã§ãªãå¦çç³»ï¼ã³ã³ãã¤ã©ï¼ãã¾ã ã¾ã è¥ãããããä»å¾ã«æå¾ ãã¨ããã¨ããã ãããã
C++ã¯ãããå®åã«è¿ãã ãããæ¨æºã©ã¤ãã©ãªã®æ©è½ããã£ã¨ä½¿ã£ãå ´åãã«ã©ããªãã®ãæ°ã«ãªãã¨ããã ï¼ããã¼ã¯ã¼ã«ãã®ã¿ãã¨ããã®ã¯å°ã ãã§ã¢ã§ã¯ãªãï¼ã
OCamlãECL/MKCLã¯äºæ³ãããå°ããªãã¤ããªã ã£ããã¡ãã£ã¨é©ãã¦ããã
ECL/MKCLã¯ãã£ããCè¨èªã«å¤æãã¦ããã³ã³ãã¤ã«ãã¦ããããã®ç¹ããã¤ããªã®æå¤ãªå°ããã®åå ã§ãããªãã°ãGoè¨èªãæ¨æºã®ã³ã³ãã¤ã©ã§ã¯ãªãgccgoã§åäºåã«ä½¿ããããã«ãªã£ãã¨ã*1ããã¤ããªã®å¤§ããã®åé¡ã¯è§£æ±ºãããæ°ãããã
ï¼id:eel3:20150627:1435402293 ã«ç¶ãï¼
*1:gccgoã®å®è£ ã¯è¥å¹²é ãæ°å³ã§ãGCC 4.9ã®æç¹ã§Go 1.2ç¸å½ããã³ãã¯ã¼çã ã®åé¡ã ã¨ã¯ãããã¦ã¼ã¶ã¨ãã¦ããæ°ã«ãªãã¨ããã§ã¯ããã