Pla$orm ¡independence ¡and ¡languages ¡ CSCI ¡136: ¡Fundamentals ¡of ¡Computer ¡Science ¡II ¡ ¡• ¡ ¡Keith ¡Vertanen ¡
Overview ¡ • Language ¡types: ¡ – Compiled ¡ • e.g. ¡C++ ¡ – Intermediate ¡/ ¡bytecode ¡ ¡ • e.g. ¡Java, ¡.NET ¡ – Interpreted ¡ • e.g. ¡PHP, ¡JavaScript ¡ • Performance ¡comparison ¡ 2 ¡
GeneraIng ¡primes ¡ • Problem: ¡Compute ¡all ¡the ¡primes ¡up ¡to ¡N ¡ – Prime ¡# ¡is ¡only ¡divisible ¡by ¡1 ¡and ¡itself ¡ • ANempt ¡1: ¡Brute ¡force ¡ – Loop ¡over ¡all ¡the ¡numbers ¡[2, ¡N] ¡ – For ¡each ¡#, ¡check ¡if ¡anything ¡evenly ¡divides ¡it ¡ ¡ ... ¡ for ¡( int ¡i ¡= ¡2; ¡i ¡<= ¡N; ¡i++) ¡ { ¡ ¡ ¡ ¡int ¡j ¡= ¡2; ¡ ¡ ¡ ¡while ¡((j ¡< ¡i) ¡&& ¡(i ¡% ¡j ¡!= ¡0)) ¡ ¡ ¡ ¡ ¡ ¡ ¡j++; ¡ ¡ ¡ ¡if ¡(j ¡== ¡i) ¡ ¡ ¡ ¡ ¡ ¡ ¡System. out .printf("%d ¡", ¡i); ¡ } ¡ ... ¡ PrimesNested.java ¡
GeneraIng ¡primes ¡ • ANempt ¡2: ¡Sieve ¡of ¡Eratosthenes ¡ ¡
public ¡ class ¡Primes ¡ ¡ { ¡ ¡ ¡ ¡ public ¡ static ¡ void ¡main(String ¡[] ¡args) ¡ ¡ ¡ ¡{ ¡ ¡ ¡ ¡ ¡ ¡ ¡final ¡ int ¡N ¡= ¡Integer. parseInt (args[0]); ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡boolean ¡[] ¡a ¡= ¡ new ¡ boolean [N ¡+ ¡1]; ¡ ¡ ¡ ¡ ¡ ¡ ¡for ¡( int ¡i ¡= ¡0; ¡i ¡<= ¡N; ¡i++) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡a[i] ¡= ¡ true ; ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡int ¡top ¡= ¡( int ) ¡Math. sqrt (( double ) ¡N); ¡ ¡ ¡ ¡ ¡ ¡ ¡for ¡( int ¡i ¡= ¡2; ¡i ¡<= ¡top; ¡i++) ¡ ¡ ¡ ¡ ¡ ¡ ¡{ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡int ¡j ¡= ¡2 ¡* ¡i; ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡while ¡(j ¡<= ¡N) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡{ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡a[j] ¡= ¡ false ; ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡j ¡+= ¡i; ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡} ¡ ¡ ¡ ¡ ¡ ¡ ¡} ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡for ¡( int ¡i ¡= ¡2; ¡i ¡<= ¡N; ¡i++) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡if ¡(a[i]) ¡System. out .printf("%d ¡", ¡i); ¡ ¡ ¡ ¡ ¡ ¡ ¡System. out .printf("\n"); ¡ ¡ ¡ ¡} ¡ } ¡ Primes.java ¡ 5 ¡
¡ #include ¡<stdio.h> ¡ public ¡ class ¡Primes ¡ ¡ #include ¡<stdlib.h> ¡ { ¡ #include ¡<math.h> ¡ ¡ ¡ ¡ ¡ public ¡ static ¡ void ¡main(String ¡[] ¡args) ¡ int ¡main(int ¡argc, ¡char** ¡argv) ¡ ¡ ¡ ¡{ ¡ { ¡ ¡ ¡ ¡ ¡ ¡ ¡final ¡ int ¡N ¡= ¡Integer. parseInt (args[0]); ¡ ¡ ¡ ¡const ¡int ¡N ¡= ¡atoi(argv[1]); ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡boolean ¡[] ¡a ¡= ¡ new ¡ boolean [N ¡+ ¡1]; ¡ ¡ ¡ ¡bool* ¡a ¡= ¡new ¡bool[N ¡+ ¡1]; ¡ ¡ ¡ ¡ ¡ ¡ ¡for ¡( int ¡i ¡= ¡0; ¡i ¡<= ¡N; ¡i++) ¡ ¡ ¡ ¡for ¡(int ¡i ¡= ¡0; ¡i ¡<= ¡N; ¡i++) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡a[i] ¡= ¡ true ; ¡ ¡ ¡ ¡ ¡ ¡ ¡a[i] ¡= ¡true; ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡int ¡top ¡= ¡( int ) ¡Math. sqrt (( double ) ¡N); ¡ ¡ ¡ ¡int ¡top ¡= ¡(int) ¡sqrt((double) ¡N); ¡ ¡ ¡ ¡ ¡ ¡ ¡for ¡( int ¡i ¡= ¡2; ¡i ¡<= ¡top; ¡i++) ¡ ¡ ¡ ¡for ¡(int ¡i ¡= ¡2; ¡i ¡<= ¡top; ¡i++) ¡ ¡ ¡ ¡ ¡ ¡ ¡{ ¡ ¡ ¡ ¡{ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡int ¡j ¡= ¡2 ¡* ¡i; ¡ ¡ ¡ ¡ ¡ ¡ ¡int ¡j ¡= ¡2 ¡* ¡i; ¡ Maybe ¡you've ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡while ¡(j ¡<= ¡N) ¡ ¡ ¡ ¡ ¡ ¡ ¡while ¡(j ¡<= ¡n) ¡ never ¡seen ¡C ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡{ ¡ ¡ ¡ ¡ ¡ ¡ ¡{ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡a[j] ¡= ¡ false ; ¡ before, ¡but ¡you ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡a[j] ¡= ¡false; ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡j ¡+= ¡i; ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡j ¡+= ¡i; ¡ can ¡read ¡it! ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡} ¡ ¡ ¡ ¡ ¡ ¡ ¡} ¡ ¡ ¡ ¡ ¡ ¡ ¡} ¡ ¡ ¡ ¡} ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡for ¡( int ¡i ¡= ¡2; ¡i ¡<= ¡N; ¡i++) ¡ ¡ ¡ ¡for ¡(int ¡i ¡= ¡2; ¡i ¡<= ¡N; ¡i++) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡if ¡(a[i]) ¡System. out .printf("%d ¡", ¡i); ¡ ¡ ¡ ¡ ¡ ¡ ¡if ¡(a[i]) ¡printf("%d ¡", ¡i); ¡ ¡ ¡ ¡ ¡ ¡ ¡System. out .printf("\n"); ¡ ¡ ¡ ¡printf("\n"); ¡ ¡ ¡ ¡} ¡ ¡ } ¡ ¡ ¡ ¡delete ¡[] ¡a; ¡ ¡ ¡ ¡return ¡0; ¡ Primes.java ¡ } ¡ Primes.cpp ¡ 6 ¡
NaIve ¡compilaIon ¡ • C/C++ ¡ – Write ¡the ¡code ¡ – Press ¡compile ¡buNon ¡ – Wait ¡ – Fix ¡compile ¡errors ¡ – Press ¡compile ¡buNon ¡ – … ¡ hNp://xkcd.com/303/ ¡ – Compiled ¡naIve ¡code ¡loaded ¡directly ¡on ¡CPU ¡ – Code ¡is ¡specific ¡to ¡targeted ¡architecture: ¡ • Compile ¡for ¡Windows ¡x86 ¡ • Compile ¡for ¡Mac ¡x86 ¡ • … ¡ 7 ¡
#include ¡<stdio.h> ¡ Source ¡code: ¡ #include ¡<stdlib.h> ¡ #include ¡<math.h> ¡ Plain ¡text ¡file ¡created ¡in ¡a ¡high-‑ ¡ int ¡main(int ¡argc, ¡char** ¡argv) ¡ level ¡programming ¡language ¡ { ¡ ¡ ¡ ¡int ¡n ¡= ¡atoi(argv[1]); ¡ ¡ ¡ ¡... ¡ Primes.cpp ¡ Compile ¡with ¡GNU ¡C++ ¡compiler: ¡ c:\source\c\Primes>g++ -O3 Primes.cpp -o Primes Machine ¡language: ¡ Actual ¡binary ¡run ¡by ¡a ¡ parIcular ¡processor, ¡not ¡ human ¡readable/writeable ¡ Primes.exe ¡ Specific ¡to ¡the ¡ c:\source\c\Primes>Primes ¡100 ¡ architecture ¡targeted ¡ 2 ¡3 ¡5 ¡7 ¡11 ¡13 ¡17 ¡19 ¡23 ¡29 ¡31 ¡37 ¡41 ¡43 ¡47 ¡ by ¡compiler ¡(e.g. ¡x86) ¡ 53 ¡59 ¡61 ¡67 ¡71 ¡73 ¡79 ¡83 ¡89 ¡97 ¡ 8 ¡
#include ¡<stdio.h> ¡ Source ¡code: ¡ #include ¡<stdlib.h> ¡ #include ¡<math.h> ¡ Plain ¡text ¡file ¡created ¡in ¡a ¡high-‑ ¡ int ¡main(int ¡argc, ¡char** ¡argv) ¡ level ¡programming ¡language ¡ { ¡ ¡ ¡ ¡int ¡n ¡= ¡atoi(argv[1]); ¡ ¡ ¡ ¡... ¡ Primes.cpp ¡ Compile ¡with ¡Visual ¡Studio: ¡ Primes.exe ¡ Somewhat ¡different ¡binary ¡ than ¡GNU's ¡output, ¡but ¡ should ¡work ¡on ¡same ¡ architecture. ¡ 9 ¡
Different ¡targets ¡in ¡Visual ¡Studio ¡ 10 ¡
Assembly ¡language ¡ C ¡ Keil ¡IDE ¡ Keil ¡IDE ¡ Primes.asm ¡ Primes.c ¡ Hex ¡file ¡ MRT: ¡ Loads ¡machine ¡code ¡ into ¡code ¡memory ¡of ¡ 8051 ¡board ¡ 8051 ¡educaFonal ¡board ¡ 11 ¡
8051 ¡assembly: ¡IniIalizing ¡an ¡array ¡ ; Parameters to our ArrayInit subroutine ArrayNum EQU 30h ; Where our array starts ArrayMemStart EQU 31h ; 1st memory location in the array ArrayInitVal EQU 32h ; What value to load into array Start: MOV ArrayNum, #10 MOV ArrayMemStart, #40h MOV ArrayInitVal, #0ABh CALL ArrayInit JMP Start ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; Init the memory in an array to a value, uses R0 and R1 ArrayInit: MOV R0, ArrayNum MOV R1, ArrayMemStart ArrayInitLoop: MOV @R1, ArrayInitVal INC R1 DJNZ R0, ArrayInitLoop RET 12 ¡
Recommend
More recommend