Hello World!

Опубликовано 21.03.2009 в 13:34 в разделе
Теги:

Недавно, обозревая просторы Интернета, наткнулся на очень интересную статью, которую решил сохранить для себя на память.

Как написать программу «Hello World!» на разных языках?

А вот и варианты решения этой задачки, взятые с Лурка.


Так решается эта задача в BASIC:


10 PRINT "Hello, World!"

Или даже вот так в Quick/Turbo BASIC:

? "Hello, World!"

Почти не отличается в Ruby:

puts 'Hello, World!'

Похожим образом в Python:

print "Hello, World!"

А вот в Python 3.0 (aka Py3k, Пузик) — немного по-другому:

print("Hello, World!")

Так — в Pascal:

begin
  WriteLn('Hello, World!');
end.

На Модуле-3

MODULE Main;
IMPORT IO;
BEGIN
  IO.Put ("Hello World\n")
END Main.

А вот так — в Visual Basic:

SUB Main()
   PRINT "Hello, World!"
END SUB

Так — в Lotus Script:

Messagebox "Hello, World!", MB_OK

Или так (не самый заметный вариант):

PRINT "Hello, World!"

Или рядом с LS:

@Prompt([OK];"";"Hello, World!");

Так — в C:

#include <stdio.h>

int main()
{
  printf("Hello, World!\n");
  return 0;
}

А так — в Objective-C для Яблочников

#import <Foundation/Foundation.h>

int main ()
{
  NSLog(@"Hello, World!");
  return 0;
}

Так — в C++:

#include <iostream>

int main(void)
{
  std::cout<<"Hello, World!"<<std::endl;
  return 0;
}

С++ ООП:

#include <iostream>

class World
{
    public:
        void Hello()
        {
     	    std::cout << "Hello, world!" << std::endl;
        }
};

int main(void)
{
    World().Hello();
    return 0;
}

С шаблонами:

class World{};

template <typename T>
void Hello(T hello)
{
    std::cout << "Hello, " << hello << std::endl;
}

template <class World>
void Hello()
{
    std::cout << "Hello, world!" << std::endl;
}

int main(void)
{
    Hello<World>();
    return 0;
}

Чудеса КЗ грамматики:

template <typename T>
class Hello
{
    public:
        Hello(T hello)
        {
            std::cout << "Hello, " << hello << std::endl;
        }
};

template <>
class Hello<class World>
{
    public:
        Hello()
        {
            std::cout << "Hello, world!" << std::endl;
        }
};

int main(void)
{
    Hello<World>();
    return 0;
}

C#

class Program
{
    static void Main()
    {
        System.Console.WriteLine("Hello, World!");
    }
}

А так будет в Perl:

#!/usr/bin/perl
print "Hello, World!\n";

Так — в весьма простом и довольно красивом, но малопопулярном языке Haskell (обратите внимание на прекрасную читаемость и простоту кода):

import qualified Data.ByteString as BS
import System.IO
message :: [[Char]]
message = [ 'H':'e':'l':'l':'o':',':[]
          , 'w':'o':'r':'l':'d':'!':[] ]
putHelloWorld :: [Char] -> IO()
putHelloWorld (x:xs) =
                  Prelude.putChar(x) >> putHelloWorld xs
putHelloWorld [] = Prelude.putChar('\n')
main :: IO ()
main =
  hSetBuffering stdout NoBuffering >> hSetBuffering stdin LineBuffering >> putHelloWorld(message')
  where
     message' = let f = (++) . (++ " ")
                    f' = foldl1 f
                in  f' message

Чуть менее полный матана вариант кода на Haskell:

main = print "Hello, world!"

На Лиспе вообще-то будет так:

(eval (cons (quote mapcar)
            (cons (cons (quote function)
                        (cons (quote princ) ()))
                  (cons (cons (quote quote)
                              (cons (cons #\H (cons #\e (cons #\l (cons #\l (cons #\o
                                     (cons #\, (cons #\Space
                                      (cons #\w (cons #\o (cons #\r (cons #\l (cons #\d (cons #\!
                                       ()))))))))))))) ())) ()))))

Но можно и так:

(mapcar #'princ '(#\H #\e #\l #\l #\o #\, #\Space #\w #\o #\r #\l #\d #\!))

Или так:

(princ "Hello, world!")

Или даже так (в REPL):

"Hello, world!"

Нечитаемый вариант на языке BrainFuck:

++++++++++[>+++++++>++++++++++>+++>+<<<<-]>++.>+.+++++++..+++.>++.<<+++++++++++++++.>.+++.------.--------.>+.>.

На самодостаточном FORTH:

: HELLO 72 EMIT 101 EMIT 2 0 DO 108 EMIT LOOP 111 EMIT ;
: WORLD 119 EMIT 111 EMIT 114 EMIT 108 EMIT 100 EMIT ;
: HELLO_WORLD HELLO 44 EMIT SPACE WORLD 33 EMIT ;
HELLO_WORLD

Тот же FORTH без выебоновЪ:

: HelloWorld ." Hello, world!" ;

Встроенный язык 1С:Предприятие:

Сообщить("Привет, Мир!");

Кофеиновый код на языке Java:

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

А вот так на Eiffel:

class HELLO_WORLD
feature
  print_hello is
      -- Print "Hello, World!"
    do
      print ("Hello, World!")
    end
end

На MIDlet Pascal:

Program Hello;
Begin
  DrawText('Hello, world!', 5, 5);
  Repaint; Delay(5000);
End.

ПэХэПэ:

echo "Hello, world!";

Или так (при вставке кода в HTML):

<?="Hello, world!"?>

Или с использованием ОО-паттернов программирования:

/********************************************************************
Model-View-Controller implementation according to POSA
(Pattern-Oriented Software Architecture
  http://www.hillside.net/patterns/books/Siemens/book.html)
********************************************************************/

class HelloWorldController {
    private $model;
    function __construct($model) {
        $this->model = $model;
    }

    function handleEvent($args) {
        $this->model->setStrategy($args[2]);
        $this->model->addText($args[1]);
    }
}

class HelloWorldModel {
    private $text;
    private $observers = array();
    private $strategy;

    function attach($observer) {
        $this->observers[] = $observer;
    }

    function getData() {
        $facade = new HelloWorldFacade($this->strategy);
        return $facade->getHelloWorld().$this->text."\n";
    }

    function addText($text='') {
        $this->text = $text;
        $this->notify();
    }

    function setStrategy($strategy) {
        $this->strategy = $strategy;
    }

    function notify() {
        foreach ($this->observers as $observer) {
            $observer->update();
        }
    }
}

class HelloWorldView {
    private $model;

    function initialize($model) {
        $this->model = $model;
        $model->attach($this);
        return $this->makeController();
    }

    function makeController() {
        return new HelloWorldController($this->model);
    }

    function update() {
        $this->display();
    }

    function display() {
        echo $this->model->getData();
    }
}

/*********************************************************************
"Business logic"
********************************************************************/

class HelloWorld {
   function execute() {
       return "Hello world";
   }
}

class HelloWorldDecorator {
   private $helloworld;
   function __construct($helloworld) {
       $this->helloworld = $helloworld;
   }

   function execute() {
       return $this->helloworld->execute();
   }
}

abstract class HelloWorldEmphasisStrategy {
    abstract function emphasize($string);
}

class HelloWorldBangEmphasisStrategy extends HelloWorldEmphasisStrategy {
    function emphasize($string) {
       return $string."!";
    }
}

class HelloWorldRepetitionEmphasisStrategy extends HelloWorldEmphasisStrategy {
    function emphasize($string) {
       return $string." and ".$string." again";
    }
}

class HelloWorldEmphasizer extends HelloWorldDecorator {
   private $strategy;
   function HelloWorldEmphasizer($helloworld,$strategy) {
       $this->strategy = $strategy;
       parent::__construct($helloworld);
   }

   function execute() {
       $string = parent::execute();
       return $this->strategy->emphasize($string);
   }
}

class HelloWorldStrategyFactory {
    static function make($type) {
        if ($type == 'repetition') return self::makeRepetitionStrategy();
        return self::makeBangStrategy();
    }

    static function makeBangStrategy() {
        return new HelloWorldBangEmphasisStrategy;
    }
    static function makeRepetitionStrategy() {
        return new HelloWorldRepetitionEmphasisStrategy;
    }
}

class HelloWorldFormatter extends HelloWorldDecorator {
   function execute() {
       $string = parent::execute();
       return $string."\n";
   }
}

class HelloWorldFacade {
    private $strategy;
    function __construct($strategyType) {
        $this->strategy = HelloWorldStrategyFactory::make($strategyType);
    }

    function getHelloWorld() {
        $formatter = new HelloWorldFormatter(
                new HelloWorldEmphasizer(
                    new HelloWorld,$this->strategy));
        return $formatter->execute();
    }
}

$model = new HelloWorldModel;
$view = new HelloWorldView;
$controller = $view->initialize($model);
$controller->handleEvent($_SERVER['argv']);

а на ЖабаСкрипт будет вот так:

document.write("Hello, world!");

Или вот так на Action script 3.0 (флэшовая реализация стандарта ECMAScript):

trace('Hello World!')

//Или, если непременно надо вывести прямо на экран, а не в консоль, так:
var tf:TextField = new TextField
tf.text = "Hello World!"
addChild(tf)

Delphi:

{$APPTYPE CONSOLE}
begin
  Writeln('Hello, world!');
end.

На баше:

echo 'Hello, world!'

На bash.org’e
http://bash.org.ru/?text=Hello+world

На Прологе:

goal :-
  write ("Hello, World!").

SQL-92:

SELECT 'Hello, World!'

Oracle SQL:

SELECT 'Hello, World!' FROM dual;

Oracle PL/SQL:

SET serveroutput ON

BEGIN
 dbms_output.put_line('Hello world!');
END;
/

Microsoft SQL Server:

PRINT 'Hello, world';

MySQL:

SELECT 'Hello, World!';

Обычно хеллоуворлдщика можно ввести в транс, добавив в какой-нибудь частоиспользуемый header-файл следующие строчки (ахтунг, C-specific!):

#ifndef DEFINE_ME
#error Fatal error! There must be some brain in your head!
#endif

Очевидно, что никакой сложности в решении такая задача из себя не представляет. Тем не менее, решив подобную задачу на каком-либо языке программирования, субъект чаще всего начинает oшибочно самоидентифицироваться с программистом.

Однако на языках ассемблера данная задача представляется более сложной:

Assembler i8086, MS-DOS, tasm:

.model tiny
.code
org 100h

Start:
mov ah, 9
mov dx, offset msg
int 21h

mov ax, 4C00H
int 21h

msg db 'Hello, world$'
end Start

Assembler i386, Linux, nasm

SECTION .data
msg: db "Hello, world",10
len: equ $-msg

SECTION .text
global main
main:
mov edx, len
mov ecx, msg
mov ebx, 1
mov eax, 4
int 0x80

mov ebx, 0
mov eax, 1
int 0x80

То же, только GAS:

.data
msg: .ascii "Hello,world!\n"
len = . - msg

.text
.globl _start
_start:
movl $4,%eax
movl $1,%ebx
movl $msg,%ecx
movl $len,%edx
int $0x80

xorl %ebx,%ebx
movl $1,%eax
int $0x80

Assembler i386, Windows, masm:

.386
.model flat, stdcall
option casemap:none
include \masm32\include\windows.inc
include \masm32\include\kernel32.inc
includelib \masm32\lib\kernel32.lib

.data
msg db "Hello, world!", 13, 10
len equ $-msg

.data?
written dd ?

.code
start:
push -11
call GetStdHandle

push 0
push offset written
push len
push offset msg
push eax
call WriteFile

push 0
call ExitProcess
end start

Или так:

.386
.model flat, STDCALL
includelib kernel32.lib
GetStdHandle PROTO:DWORD
WriteConsoleA PROTO:DWORD,:DWORD,:DWORD,:DWORD,:DWORD
ExitProcess PROTO:DWORD
.const
message db "Hello, world!"
.code
Main PROC
LOCAL hStdOut :DWORD
push -11
call GetStdHandle
mov hStdOut,EAX
push 0
push 0
push 16d
push offset message
push hStdOut
call WriteConsoleA
push 0
call ExitProcess
Main ENDP
End Main

Assembler микроконтроллер ATMega16, AVR Studio:

.include "m16def.inc"
.cseg
.org $0000
rjmp  start      ;Reset handler
.org $0030
start:
ldi   r24,  25  ; ~= 9600 @ 4Mhz clock
out   UBRRL,  r24
out   UBRRH,  r2
ldi   r24,  1 << TXEN
out   UCSRB,  r24
ldi   r24,  1 << URSEL | 1 << UCSZ0 | 1 << UCSZ1 ; 8-n-1
out   UCSRC,  r24

; send msg
ldi   ZL, msg << 1
loop:
lpm   r0, Z+ ; next char
tst   r0   ; terminated?
stop: breq  stop

while_busy:
sbis  UCSRA,  UDRE
rjmp  while_busy
out   UDR,  r0
rjmp  loop
msg:  .db  "Hello, world!", 13, 10, 0

На двух семи-сегментных индикаторах и FPGA VHDL, САПР Quartus:

LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.NUMERIC_STD.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;

ENTITY CTL IS
PORT(
	CLK:	IN STD_LOGIC;
	DOUT1:	OUT STD_LOGIC_VECTOR(0 TO 6);
	DOUT2:	OUT STD_LOGIC_VECTOR(0 TO 6)
);
END ENTITY;

ARCHITECTURE CTL_ARCH OF CTL IS
SIGNAL CNT:		STD_LOGIC_VECTOR(0 TO 3):="0000";

BEGIN
	PROCESS(CLK)
	BEGIN
		IF (CLK'EVENT AND CLK='1') THEN
				IF CNT = "1011" THEN CNT <= "0000";
				END IF;
				CASE CNT IS
				  WHEN "0000" => DOUT1 <= "1001000"; DOUT2 <="1111111";--H
				  WHEN "0001" => DOUT1 <= "0110001"; DOUT2 <="1111111";--E
				  WHEN "0010" => DOUT1 <= "1110001"; DOUT2 <="1111111";--L
				  WHEN "0011" => DOUT1 <= "1110001"; DOUT2 <="1111111";--L
				  WHEN "0100" => DOUT1 <= "0000001"; DOUT2 <="1111111";--O
				  WHEN "0101" => DOUT1 <= "1111111"; DOUT2 <="1111111";--
				  WHEN "0110" => DOUT1 <= "1100001"; DOUT2 <="1000001"; --W(1) W(2)
				  WHEN "0111" => DOUT1 <= "0000001"; DOUT2 <="1111111";--O
				  WHEN "1000" => DOUT1 <= "0011000"; DOUT2 <="1111111";--R
				  WHEN "1001" => DOUT1 <= "1110001"; DOUT2 <="1111111";--L
				  WHEN "1010" => DOUT1 <= "0000001"; DOUT2 <="1111111";--D
				  WHEN OTHERS => DOUT1 <= "1111111";  DOUT2 <="1111111";
				END CASE;
				CNT<= CNT+1;
		END IF;
	END PROCESS;
END CTL_ARCH;

На HQ9+

H

[1]

На мелкомягком быдлоподелии (C++ с использованием Component Object Model):

[
    uuid(2573F8F4-CFEE-101A-9A9F-00AA00342820)
]
library LHello
{
    importlib("actimp.tlb");
    importlib("actexp.tlb");
#include "pshlo.idl"
    [
        uuid(2573F8F5-CFEE-101A-9A9F-00AA00342820)
    ]
    cotype THello
    {
        interface IHello;
        interface IPersistFile;
    };
};
[
    exe,
    uuid(2573F890-CFEE-101A-9A9F-00AA00342820)
]
module CHelloLib
{
    importheader();
    importheader();
    importheader();
    importheader("pshlo.h");
    importheader("shlo.hxx");
    importheader("mycls.hxx");
    importlib("actimp.tlb");
    importlib("actexp.tlb");
    importlib("thlo.tlb");
    [
        uuid(2573F891-CFEE-101A-9A9F-00AA00342820),
        aggregatable
    ]
    coclass CHello
    {
        cotype THello;
    };
};
#include "ipfix.hxx"
extern HANDLE hEvent;
class CHello : public CHelloBase
{
public:
	IPFIX(CLSID_CHello);
	CHello(IUnknown *pUnk);
	~CHello();
	HRESULT __stdcall PrintSz(LPWSTR pwszString);
private:
	static int cObjRef;
};
#include "thlo.h"
#include "pshlo.h"
#include "shlo.hxx"
#include "mycls.hxx"
int CHello:cObjRef = 0;
CHello::CHello(IUnknown *pUnk) : CHelloBase(pUnk)
{
    cObjRef++;
    return;
}
HRESULT __stdcall CHello::PrintSz(LPWSTR pwszString)
{
    printf("%ws\n", pwszString);
    return(ResultFromScode(S_OK));
}
CHello::~CHello(void)
{
    cObjRef--;
    if( cObjRef == 0 )
        PulseEvent(hEvent);
    return;
}
#include "pshlo.h"
#include "shlo.hxx"
#include "mycls.hxx"
HANDLE hEvent;
int _cdecl main(int argc, char * argv[]) {
    ULONG ulRef;
    DWORD dwRegistration;
    CHelloCF *pCF = new CHelloCF();
    hEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
    CoInitiali, NULL);
    CoInitializeEx(NULL, COINIT_MULTITHREADED);
    CoRegisterClassObject(CLSID_CHello, pCF, CLSCTX_LOCAL_SERVER,
        REGCLS_MULTIPLEUSE, &dwRegistration);
    WaitForSingleObject(hEvent, INFINITE);
    CoRevokeClassObject(dwRegistration);
    ulRef = pCF->Release();
    CoUninitialize();
    return(0);
}
extern CLSID CLSID_CHello;
extern UUID LIBID_CHelloLib;
CLSID CLSID_CHello = { 0x2573F891, 0xCFEE, 0x101A, { 0x9A, 0x9F, 0x00, 0xAA, 0x00, 0x34, 0x28, 0x20 } };
UUID LIBID_CHelloLib = { 0x2573F890, 0xCFEE, 0x101A, { 0x9A, 0x9F, 0x00, 0xAA, 0x00, 0x34, 0x28, 0x20 } };
#include "pshlo.h"
#include "shlo.hxx"
#include "clsid.h"
int _cdecl main( int argc, char * argv[]) {
    HRESULT hRslt;
    IHello *pHello;
    ULONG ulCnt;
    IMoniker * pmk;
    WCHAR wcsT[_MAX_PATH];
    WCHAR wcsPath[2 * _MAX_PATH];
    wcsPath[0] = '\0';
    wcsT[0] = '\0';
    if( argc 1) {
        mbstowcs(wcsPath, argv[1], strlen(argv[1]) + 1);
        wcsupr(wcsPath);
    }
    else {
        fprintf(stderr, "Object path must be specified\n");
        return(1);
    }
    if(argc 2)
        mbstowcs(wcsT, argv[2], strlen(argv[2]) + 1);
    else
        wcscpy(wcsT, L"Hello World");
    printf("Linking to object %ws\n", wcsPath);
    printf("Text String %ws\n", wcsT);
    hRslt = CoInitializeEx(NULL, COINIT_MULTITHREADED);
    if(SUCCEEDED(hRslt)) {
        hRslt = CreateFileMoniker(wcsPath, &pmk);
        if(SUCCEEDED(hRslt))
            hRslt = BindMoniker(pmk, 0, IID_IHello, (void **)&pHello);
        if(SUCCEEDED(hRslt)) {
            pHello->PrintSz(wcsT);
            Sleep(2000);
            ulCnt = pHello->Release();
        }
        else
            printf("Failure to connect, status: %lx", hRslt);
        CoUninitialize();
    }
    return(0);
}

MSIL

.assembly HelloWorld
{
}

.method static void Main()
{
    .entrypoint
    ldstr "Hello World!"
    call  void [mscorlib]System.Console::WriteLine(string)
    ret
}

Трёхкратное ура!! Рекомендую всем хранить такое у себя дома, повесив в рамочку! =)