プログラミング言語Ruby30周年記念イベント LT #ruby30th
ԘҪඒ࡙ [email protected]'FC ϓϩάϥϛϯάݴޠ3VCZपه೦Πϕϯτ3VCZ .3*ͷ͖ͳͱ͜Ζ
View Slide
aaॕ3VCZप
͓ॕ͍ͷؾ࣋ͪΛͿ͚ͭΔ͘ɺ3VCZ .3*ͷݸਓతʹ͖ͳͱ͜ΖΛपʹ͔͚ͭͯ͜ݸ͝հ͠ʹ͖·ͨ͠
͝ཡͷօ͞Μͥͻ͝Ұॹʹ3VCZͷ͖ͳͱ͜ΖΛݸߟ͑ͯΈ͍ͯͩ͘͞
3VCZ .3*ͷ͖ͳͱ͜Ζ
3VCZ .3*ͷ͖ͳͱ͜Ζ"QSPHSBNNFS`TCFTUGSJFOEɹɹɹ࣮ݱ͍ͨ͜͠ͱΛ্ख͍͜ͱදݱͰ͖ΔΑ͏ʹɹɹɹͳΔ·Ͱ͖߹ͬͯ͘ΕΔɹɹɹଞͷ༑ୡΛհͯ͘͠ΕͨΓ͢ΔIUUQTXXXSVCZMBOHPSHKB˞ΧϯϑΝϨϯεɺςοΫΠϕϯτɺίϛϡχςΟͷϛʔτΞοϓ
3VCZ .3*ͷ͖ͳͱ͜Ζ໊લɹɹɹʮ3VCZʯ͍ɺՄѪ͍ɺ͍֮͑͢ɹɹɹʜ͠ɺɹɹɹ3VCZࣗͷதͰ໊લ͕େࣄʹ͞Ε͍ͯΔͱ͜Ζɹɹɹ ػೳ໊ɺϝιου໊ɺจԽFUDʜ
3VCZ .3*ͷ͖ͳͱ͜Ζಉ͜͡ͱΛ͢ΔͨΊʹ͍ΖΜͳํ๏͕༻ҙ͞Ε͍ͯͯଟ༷ੑ͕େࣄʹ͞Ε͍ͯΔͱ͜Ζclass Foodef fooputs "#ruby30th"endendFoo.new.foo # => #ruby30thBar = Class.new dodefine_method(:bar) dostdout = IO.new(2)stdout.send(:write, “#ruby30th\n”)endendBar.new.bar # => #ruby30th
3VCZ .3*ͷ͖ͳͱ͜ΖͳΜͰΦϒδΣΫτɹɹɹԿʹͰϝοηʔδΛૹΔ͜ͱ͕Ͱ͖Δͱ͜ΖClass.new Module.newException.newErrno::ESHUTDOWN.newself.bindingself.method(:__method__)self.method(:__method__).unbindTracePoint.new(:call) { |tp| tp.event }ΫϥεϞδϡʔϧྫ֎γεςϜΤϥʔڥใϝιουϨγʔόͷͳ͍ϝιουτϨʔεϙΠϯτFUDʜ
3VCZ .3*ͷ͖ͳͱ͜ΖɹɹɹͷΑ͏ͳ༡ͼ৺Λ͙͘͢Δϝιου͕๛ͳͱ͜Ζɹɹɹ͕ͯ͢ఝʹݟ͑ΔΑ͏ʹͳΔBasicObject#method_missing FUDʜclass Foodef method_missing(name, *_args, &_block)puts "##{name}"endendFoo.new.ruby30th # => #ruby30th
3VCZ .3*ͷ͖ͳͱ͜ΖେମࣜɹɹɹͳͷͰ͜Μͳ͜ͱ͕Ͱ͖Δͱ͜Ζɹɹɹ͜Εͬͯ͘͢͝ͳ͍Ͱ͔͢ message = if ruby.birthday?“#ruby30th”else“Anyway I love Ruby everyday”endputs message # => #ruby30th
3VCZ .3*ͷ͖ͳͱ͜Ζ͋ΒΏΔߏจ͕ׅހͰғΉͱࣜɹɹɹͳͷͰ͜Μͳ͜ͱ͕Ͱ͖Δͱ͜Ζɹɹɹmessage = (() || (def foo = “#ruby30th”); foo)puts message # => #ruby30th
3VCZ .3*ͷ͖ͳͱ͜ΖҾ͕͘͢͝ॊೈɹɹɹͳͷͰ͜Μͳ͜ͱ͕Ͱ͖Δͱ͜Ζɹɹɹdef foo(arg = true ? “#ruby30th” : “Anyway I love Ruby everyday”)puts arg # => #ruby30thend def bar(arg: def m; “#ruby30th”; end)puts arg # => :mputs self.method(arg).call # => #ruby30thend
3VCZ .3*ͷ͖ͳͱ͜ΖϒϩοΫͷଘࡏ͔ܽͤͳ͍ɹɹɹϒϩοΫ͕ࣗͷߟ͑ํΛॊೈʹͯ͘͠ΕΔͱ͜Ζi, chars = 0, %(# r u b y 3 0 t h)def foo(chars, &block)yield charsfoo(&block)endfoo(chars) { |chars| print chars[i]; i += 1; break if i >= chars.length }puts “\n” # => #ruby30th
3VCZ .3*ͷ͖ͳͱ͜ΖɹɹɹϒϩοΫͷ͜͜ͷ͓͔͛ͰɹɹɹॲཧΛऴྃ͠ΕͣʹࡁΉͱ͜ΖɹɹɹFile.open { |f| … } Thread.open { |t| … } ͱ͔ͱ͔͜͜ ͜͜
3VCZ .3*ͷ͖ͳͱ͜Ζྫ֎ॲཧɹɹɹػೳἧ͍ͬͯΔ͠ײతͰ໎ࢠʹͳΒͳ͍ͱ͜Ζdef fooraise LightningTalkTimeout if Time.now > lightning_talk_started_at + 300rescueputs “OMG” elseputs “Yaaaaay”ensureputs “Anyway, #ruby30th”end
3VCZ .3*ͷ͖ͳͱ͜Ζɹɹɹศརɹɹɹ͜Μͳ͜ͱͰ͖Δ(“Perl”..“Smalltalk”).cover? “Ruby" # => true(“Perl”..“Python”).cover? “Ruby" # => false1..30 ൣғϦςϥϧ1…30
3VCZ .3*ͷ͖ͳͱ͜Ζʹ۠Γจࣈ͕ೖΕΒΕΔɹɹɹɹɹɹɹͷͰʹ༏͍͠“LTը໘Γସ͑ͷ࣌ؒࠐΈͰ #{5} Ͱ͢ʂ”“LTը໘Γସ͑ͷ࣌ؒࠐΈͰ #{300} ඵͰ͢ʂ”“LTը໘Γସ͑ͷ࣌ؒࠐΈͰ #{300_000} ϛϦඵͰ͢ʂ”“LTը໘Γସ͑ͷ࣌ؒࠐΈͰ #{300_000_000} ϚΠΫϩඵͰ͢ʂ”“LTը໘Γସ͑ͷ࣌ؒࠐΈͰ #{300_000_000_000} φϊඵͰ͢ʂ”IUUQTUXJUUFSDPNSVCZUITUBUVT T
3VCZ .3*ͷ͖ͳͱ͜Ζɹɹɹɹɹɹɹɹɹ͜ΕҰൃͰ5$1αʔόʔϓϩηε͕Ͱ͖ͯ͠·͏ɹɹɹ͜ͷϝιουʹݶΒ্ͣख͍͜ͱͬͯ͘ΕΔɹɹɹศརϝιου͕ͨ͘͞Μ༻ҙ͞Ε͍ͯΔͱ͜Ζrequire “socket”Socket.tcp_server_loop(12345) do |sock|sock.puts(“#ruby30th”)sock.closeendSocket.tcp_server_loop
3VCZ .3*ͷ͖ͳͱ͜ΖΈࠐΈϥΠϒϥϦ͚ͩͰͳ͘ඪ४ఴͷϥΠϒϥϦ܈͕͓ͦΖ͘͠ॆ࣮͍ͯ͠Δͱ͜ΖɹɹɹɹɹɹΔΓ·ͷϥΠϒϥϦҰཡϖʔδͷϑϧεΫϦʔϯγϣοτΛࡱΔશવεϥΠυʹऩ·Βͳ͔ͬͨͷͰԣʹฒͨͷਤˣ
3VCZ .3*ͷ͖ͳͱ͜ΖϥΠϒϥϦͱ͍͑3VCZ(FNTͱ#VOEMFSͷଘࡏҒେɹɹɹɹɹɹ๛ͳϥΠϒϥϦʹࠓ͙͢ΞΫηεͰ͖ͯɹɹɹґଘؔʹΉ͜ͱͳ͑͘Δͱ͜Ζɹɹɹ͍͓ͭੈʹͳ͍ͬͯ·͢
3VCZ .3*ͷ͖ͳͱ͜ΖΤίγεςϜʹݴٴ࢝͠ΊΔͱແݶʹ͕Γͦ͏ͳͷͰΈࠐΈϥΠϒϥϦʹΛ͢ͱɺ04ͷίϚϯυγεςϜίʔϧ͕3VCZϨϕϧͰѻ͑Δͱ͜Ζ͏Ε͍͠reader, writer = IO.pipepid = fork { writer.puts “#ruby30th" }Process.waitpid(pid)exec("echo", “-n", reader.gets) # => #ruby30th
3VCZ .3*ͷ͖ͳͱ͜Ζ͜͜·Ͱ3VCZ͕ίʔυΛॻͨ͘ΊͷαϙʔτΛͯ͘͠Ε͍ͯΔͱɺॻ͍͍ͯΔ͏ͪʹίʔυͷؾ͕࣋ͪΘ͔ͬͯ͘ΔΑ͏ͳࡨ֮ΛಘΒΕΔɹɹɹʮ͜ͷίʔυ͜͏͍͏෩ʹॻ͍ͯཉ͍͠ͷͰ ʯ
3VCZ .3*ͷ͖ͳͱ͜Ζ3VCZࣗզʑϓϩάϥϚʹରͯ͠Φʔϓϯɹ ෦ใͷ"1*͕ఏڙ͞Ε͍ͯΔɹɹɹ$ ruby -e "pp RubyVM::AbstractSyntaxTree.parse('puts 1 + 2')"([email protected]:0-1:10tbl: []args: nilbody: ([email protected]:0-1:10 :puts([email protected]:5-1:10 ([email protected]:5-1:10 ([email protected]:5-1:6 1) :+ ([email protected]:9-1:10 ([email protected]:9-1:10 2) nil)) nil)))$ ruby -e "puts RubyVM::InstructionSequence.compile('puts 1 + 2').disasm"== disasm: #@:1 (1,0)-(1,10)> (catch: false)0000 putself ( 1)[Li]0001 putobject_INT2FIX_1_0002 putobject 20004 opt_plus [CcCr]0006 opt_send_without_block 0008 leave
3VCZ .3*ͷ͖ͳͱ͜ΖHFNͷڍಈΛௐΔͨΊʹHFNͷιʔείʔυΛมߋͨ͠ޙɺ࠶ίϯύΠϧͤͣʹ࣮ߦͰ͖Δͱ͜Ζɹɹɹศར
3VCZ .3*ͷ͖ͳͱ͜ΖJSCɹɹɹଘࡏͦͷͷ͕ଚ͍ɹɹɹͦͷ্γϯλοΫεϋΠϥΠτʹิ·Ͱʜ
3VCZ .3*ͷ͖ͳͱ͜ΖίϚϯυʹΦϓγϣϯΛ͢ͱύʔαͷঢ়ଶมԽ͕֬ೝͰ͖͍͍ͯ֨ruby -yʜ
3VCZ .3*ͷ͖ͳͱ͜Ζॊೈͳจ๏Λ͑ΔͨΊʹߏจنଇ͕ݸɺύʔαͷঢ়ଶ͕ݸఆٛ͞Ε͍͍ͯͯ͢͝˞3VCZ͓͍࣌͠ௐ
3VCZ .3*ͷ͖ͳͱ͜ΖͦΕΛ࣮ݱ͢ΔQBSTFZਆ͕͔Γతॴۀ
3VCZ .3*ͷ͖ͳͱ͜ΖͦΕΛ۩ݱԽ͢ΔDPNQJMFDਆ͕͔Γతॴۀ
3VCZ .3*ͷ͖ͳͱ͜ΖJOTOTEFGʹʮੜ໋ɺӉɺͦͯ͠ສʹ͍ͭͯͷڀۃͷٙͷ͑ʯͰ͋ΔBOTXFS໋ྩ͕ఆٛ͞Ε͍ͯΔͷͰ3VCZԿͰ͍͍ͬͯͯ͢͝
3VCZ .3*ͷ͖ͳͱ͜ΖຖΫϦεϚεʹϦϦʔε͞ΕΔͱ͜ΖɹɹɹϓϨθϯτͬΆͯ͘ྑ͍ɹɹɹຖ͋Γ͕ͱ͏͍͟͝·͢IUUQTXXXSVCZMBOHPSHKB
3VCZ .3*ͷ͖ͳͱ͜ΖϑϦʔιϑτΣΞͳͱ͜Ζɹɹɹ.Z3VCZΛͭ͘Δ͜ͱ͕Ͱ͖ΔIUUQTXXXSVCZMBOHPSHFOBCPVUMJDFOTFUYU
3VCZ .3*ͷ͖ͳͱ͜Ζࠓ·Ͱ։ൃ͕ଓ͍͍ͯΔͱ͜Ζɹɹɹ৽͍͠ػೳ͕ͲΜͲΜ૿͍͑ͯΔɹɹɹݩʑ͋ͬͨػೳޙํޓੑʹྀͭͭ͠ɹɹɹͲΜͲΜվળ͞Ε͍ͯΔ
3VCZ .3*ͷ͖ͳͱ͜ΖBOENPSFʜ.BU[JTOJDFBOETPXFBSFOJDF3VCZ,BJHJ%BZ)BMM"@@%4$
͝ਗ਼ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠ɹɹ(JU)VC!TIJPJNNɹɹ[email protected]ɹɹגࣜձࣾΤεɾΤϜɾΤεɹɹ'VLVPLBSCग़"TBLVTBSCҭͪa͓͍͕͓͠ૹΓ͠·ͨ͠