Недавно, обозревая просторы Интернета, наткнулся на очень интересную статью, которую решил сохранить для себя на память.
Как написать программу «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; }
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
: 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
На мелкомягком быдлоподелии (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); }
.assembly HelloWorld { } .method static void Main() { .entrypoint ldstr "Hello World!" call void [mscorlib]System.Console::WriteLine(string) ret }
Трёхкратное ура!! Рекомендую всем хранить такое у себя дома, повесив в рамочку! =)