Basics of Computer Science
-
Upload
maxim-zaks -
Category
Education
-
view
342 -
download
4
Transcript of Basics of Computer Science
By#Value:Tuple,'Struct'or'Enum
By#Reference:Class,&Func+on
Things'I'learned'on'the'job,'a3er'my'CS'degree
typealias TPerson = (name:String, age:Int, male:Bool) +-----------------------------------------+--------------------------------------------------+struct SPerson{ | class CPerson{ let name : String | let name : String let age : Int | let age : Int let male : Bool | let male : Bool } | | init(name : String, age : Int, male : Bool){ +-----------------------------------------+ self.name = name enum EPerson { | self.age = age case Male(name: String, age : Int) | self.male = male case Female(name : String, age : Int) | } | } func name()->String{ | switch self { | case let Male(name, _): | return name | case let Female(name, _): | return name | } | } | } +
Things'I'learned'on'the'job,'a3er'my'CS'degree
Benchmark*in*ms• 000.00786781311035156*Tuple*10M
• 000.00405311584472656*Enum*10M
• 000.003814697265625*Struct*10M
• 813.668251037598*Class*10M
Things'I'learned'on'the'job,'a3er'my'CS'degree
Performance*Characteris0cs• Add$(Prepand$/$Append$/$Insert)
• Get$(First$/$Last$/$ByIndex$/$ByValue)
• Find$(Biggest$/$Smallest)$
• Delete$(ByIndex$/$ByValue)
• Concatenate
Things'I'learned'on'the'job,'a3er'my'CS'degree
Swi$%Data%StructuresArray,&Dic*onary,&Set,&String
All#defined#as#Struct
Things'I'learned'on'the'job,'a3er'my'CS'degree
Once%upon%a%*me,%(before%Swi4%2)
I"decided"to"implement"my"own"List
Things'I'learned'on'the'job,'a3er'my'CS'degree
+-----------------------------------+-------------------------------------------------------------+ | private protocol List{ | public struct ListNode<T> : List { var tail : List {get} | public let value : T } | private let _tail : List +-----------------------------------+ private var tail : List { | return _tail private struct EmptyList : List{ | } var tail : List { | return EmptyList() | private init(value: T, tail : List){ } | self.value = value } | self._tail = tail | } | | public subscript(var index : UInt) -> ListNode<T>?{ +-----------------------------------+ var result : List = self | while(index>0){ | result = result.tail | index-- infix operator => { | } associativity right | return result as? ListNode<T> precedence 150 | } } | | } +-----------------------------------+-------------------------------------------------------------+
public func => <T>(lhs: T, rhs: ListNode<T>?) -> ListNode<T> { if let node = rhs { return ListNode(value: lhs, tail: node) } return ListNode(value: lhs, tail: EmptyList()) }
Things'I'learned'on'the'job,'a3er'my'CS'degree
Benchmark*in*ms• 208.853006362915+List+1K
• 000.30207633972168+BoxEList+1K
• 000.0660419464111328+ClassList+1K
• 000.0400543212890625+EEList+1K
• 000.0429153442382812+Array+1K
Things'I'learned'on'the'job,'a3er'my'CS'degree
Purely'Func+onal'Data'Structure:No#Destruc+ve#updates
Persistent((not(ephemeral)
Things'I'learned'on'the'job,'a3er'my'CS'degree
An#expression#always#evaluates#to#the#same#result#in#any#context:
2"+"3
array.count
Things'I'learned'on'the'job,'a3er'my'CS'degree
Purely'Func+onal'Data'Structure:No#Destruc+ve#updates
Persistent((not(ephemeral)
Things'I'learned'on'the'job,'a3er'my'CS'degree
But$our$hardware$memory$is$destruc1ve$and$ephemeral
(Physics)
Things'I'learned'on'the'job,'a3er'my'CS'degree
Value&Type&are¬&sharable!
So#no#structural#sharing#is#posible
Things'I'learned'on'the'job,'a3er'my'CS'degree
Benchmark*in*ms• 208.853006362915+List+1K
• 000.30207633972168+BoxEList+1K
• 000.0660419464111328+ClassList+1K
• 000.0400543212890625+EEList+1K
• 000.0429153442382812+Array+1K
Things'I'learned'on'the'job,'a3er'my'CS'degree
enum EEList<Element> { case End indirect case Node(Element, next: EEList<Element>) var value: Element? { switch self { case let Node(x, _): return x case End: return nil } }}extension EEList { func cons(x: Element) -> EEList { return .Node(x, next: self) }}
Things'I'learned'on'the'job,'a3er'my'CS'degree
Swi$%data%structure%types%are%facades%which%supportNo#Destruc+ve#updates
Persistent((not(ephemeral)
Things'I'learned'on'the'job,'a3er'my'CS'degree
How$many$shared$instances$do$you$see$here?
private var fibRow = [0, 1, 2]public func fibM(number:Int)->Int{ if number >= fibRow.count { fibRow.append(fibM(number-2)+fibM(number-1)) } return fibRow[number]}
Things'I'learned'on'the'job,'a3er'my'CS'degree
Coupling)means• Tough'to'test
• And'tough'to'reuse
The$problem$with$object0oriented$languages$is$they've$got$all$this$implicit$environment$that$they$carry$around$with$them.$You$wanted$a$banana$but$what$you$got$was$a$gorilla$holding$the$banana$and$the$
en<re$jungle.
—"Joe"Armstrong
Things'I'learned'on'the'job,'a3er'my'CS'degree
We#can#solve#the#coupling#problem#by#abstract#type#defini7ons
Things'I'learned'on'the'job,'a3er'my'CS'degree
+----------------+ +----------------+ | | | | | SomethingA +-------> | AbstractB | | | | | +----------------+ +-------+--------+ ^ | | | +-------+--------+ | | | SomethingB | | | +----------------+
Things'I'learned'on'the'job,'a3er'my'CS'degree
What%about%shared%state?
Isn't&share¬hing
(self&sufficient).architecture.be3er?
Things'I'learned'on'the'job,'a3er'my'CS'degree
Apple%takes%cares%of%it:• default...
• shared...
• main...
Things'I'learned'on'the'job,'a3er'my'CS'degree
Be#aware#of#Amdahl's#law
The$speedup$of$a$program$using$mul2ple$processors$in$parallel$compu2ng$is$limited$by$the$2me$needed$for$the$sequen2al$frac2on$
of$the$program.
—"Wikipedia
Things'I'learned'on'the'job,'a3er'my'CS'degree
Links:• PerformanceTest
• Fibonacci
• Fork2Join2illustra6on
• Linked2List2implementa6on2with2Swi=22Enum
• Pure2Func6onal2Data2Structures
Things'I'learned'on'the'job,'a3er'my'CS'degree