Slide 1

Slide 1 text

How to build traditional Perl interpreters Takahiro Shimizu (id:AnaTofuZ) Perlcon 2019

Slide 2

Slide 2 text

my $self = shift; • Takahiro SHIMIZU (id:ANATOFUZ) • a.k.a “anagra” • I’m from Okinawa in Japan. • I belong to Okinawa.pm • A graduate student in Ryukyu-Univ. • My graduate study was MoarVM.

Slide 3

Slide 3 text

This photo in Japan • This mean “You don't touch the camel" • … I was heading to PerlCon ...

Slide 4

Slide 4 text

Sponsors + many people Thanks!!!

Slide 5

Slide 5 text

Perl

Slide 6

Slide 6 text

Perl5

Slide 7

Slide 7 text

Perl1 Perl2 Perl3 Perl4

Slide 8

Slide 8 text

This talk is… .PTU 1SPHSBNNFST 4PGUXBSFBSDI FDPMPHZ time perl versions

Slide 9

Slide 9 text

This talk is… • We usually use plenv, perlbrew, homebrew, apt and yum
 when install perl5. • These commands automatically execute shell scripts and execute make command.

Slide 10

Slide 10 text

This talk is… • What if you have to install Perl 
 without using package manager commands? • I think to get Perl Source Code, do compile and 
 execute install. (copy to contain PATH directory) • These processes are called “builds".

Slide 11

Slide 11 text

Install Perl “Install is also interesting when it comes to Perl” by Introduction Perl 
 (1994 Shinji Kono)

Slide 12

Slide 12 text

This talk is… • Let’s try to install historical Perl Versions!!!

Slide 13

Slide 13 text

No content

Slide 14

Slide 14 text

No content

Slide 15

Slide 15 text

No content

Slide 16

Slide 16 text

No content

Slide 17

Slide 17 text

Contents • How to build Perl • How to build and run Perl1.0 • Perl2.0 • Perl3.0 • Perl4.0 • Perl5.0 • How to build Perl6

Slide 18

Slide 18 text

This talk is Perl • I will deal with Perl written by Larry in this talk. • Perl is written by C language.

Slide 19

Slide 19 text

the historical Perl version is located • At the beginning of this talk, let’s think about
 where the source code of the
 historical Perl version is located.

Slide 20

Slide 20 text

the historical Perl version is located • At the beginning of this talk, let’s think about
 where the source code of the
 historical Perl version is located.

Slide 21

Slide 21 text

the historical Perl version is located • At the beginning of this talk, let’s think about
 where the source code of the
 historical Perl version is located.

Slide 22

Slide 22 text

the historical Perl version is located Old commits are also
 tightly tagged

Slide 23

Slide 23 text

$git tag if-0.0603 if-0.0604 if-0.0605 perl-1.0 perl-1.0.15 perl-1.0.16 perl-2.0 perl-2.001 perl-3.000 perl-3.044 perl-4.0.00 perl-4.0.36 perl-5.000 perl-5.000o

Slide 24

Slide 24 text

How to get a traditional Perl Source Code • Easy to download from GitHub.
 • If you want to get commit logs.
 • If you do not want to get commit logs.
 git clone -b perl-1.0 —single-branch git@github.com:Perl/perl5.git wget https://github.com/Perl/perl5/archive/perl-1.0.tar.gz

Slide 25

Slide 25 text

the tarball is feel the history. ~/w/p/o/p/t/perl5-perl-1.0 » ls -la total 816 drwxr-xr-x 44 anatofuz staff 1408 Dec 18 1987 ./ drwxr-xr-x 6 anatofuz staff 192 Jan 26 05:35 ../ -rwxr-xr-x 1 anatofuz staff 27329 Dec 18 1987 Configure* -rw-r--r-- 1 anatofuz staff 226 Dec 18 1987 EXTERN.h -rw-r--r-- 1 anatofuz staff 224 Dec 18 1987 INTERN.h -rw-r--r-- 1 anatofuz staff 5872 Dec 18 1987 MANIFEST -rw-r--r-- 1 anatofuz staff 3522 Dec 18 1987 Makefile.SH -rw-r--r-- 1 anatofuz staff 3386 Dec 18 1987 README -rw-r--r-- 1 anatofuz staff 84 Dec 18 1987 Wishlist -rw-r--r-- 1 anatofuz staff 47964 Dec 18 1987 arg.c -rw-r--r-- 1 anatofuz staff 5478 Dec 18 1987 arg.h -rw-r--r-- 1 anatofuz staff 3366 Dec 18 1987 array.c

Slide 26

Slide 26 text

the tarball is feel the history. ~/w/p/o/p/t/perl5-perl-1.0 » ls -la total 816 drwxr-xr-x 44 anatofuz staff 1408 Dec 18 1987 ./ drwxr-xr-x 6 anatofuz staff 192 Jan 26 05:35 ../ -rwxr-xr-x 1 anatofuz staff 27329 Dec 18 1987 Configure* -rw-r--r-- 1 anatofuz staff 226 Dec 18 1987 EXTERN.h -rw-r--r-- 1 anatofuz staff 224 Dec 18 1987 INTERN.h -rw-r--r-- 1 anatofuz staff 5872 Dec 18 1987 MANIFEST -rw-r--r-- 1 anatofuz staff 3522 Dec 18 1987 Makefile.SH -rw-r--r-- 1 anatofuz staff 3386 Dec 18 1987 README -rw-r--r-- 1 anatofuz staff 84 Dec 18 1987 Wishlist -rw-r--r-- 1 anatofuz staff 47964 Dec 18 1987 arg.c -rw-r--r-- 1 anatofuz staff 5478 Dec 18 1987 arg.h -rw-r--r-- 1 anatofuz staff 3366 Dec 18 1987 array.c

Slide 27

Slide 27 text

degree of difficulty 1FSM 1FSM 1FSM 1FSM 1FSM di cult easy

Slide 28

Slide 28 text

degree of difficulty 1FSM 1FSM 1FSM 1FSM 1FSM di cult easy easy di cult

Slide 29

Slide 29 text

How to build latest Perl • These manual methods may not be aware of so much because brew, apt, and perlbrew etc. are convenient and usable these days.

Slide 30

Slide 30 text

How to build latest Perl $POpHVSF

Slide 31

Slide 31 text

How to build latest Perl $POpHVSF $POpHVSFJT
 4IFMM4DSJQU *UDSFBUFT.BLFpMFJO FBDIFOWJSPONFOU

Slide 32

Slide 32 text

How to build latest Perl $POpHVSF NBLF

Slide 33

Slide 33 text

How to build latest Perl $POpHVSF NBLF &YFDVUFNBLFDPNNBOE CBTFEPO.BLFpMF

Slide 34

Slide 34 text

How to build latest Perl $POpHVSF NBLF NBLFJOTUBMM

Slide 35

Slide 35 text

How to build latest Perl $POpHVSF NBLF NBLFJOTUBMM 1VUUIFCVJMESFTVMUJOUIF BQQSPQSJBUFEJSFDUPSZ

Slide 36

Slide 36 text

How to build Historical Perl $POpHVSF NBLFEFQFOE NBLFJOTUBMM NBLF

Slide 37

Slide 37 text

How to build Historical Perl $POpHVSF NBLFEFQFOE NBLFJOTUBMM *OWFTUJHBUFXIFSFUIF JODMVEFIFBEFSpMFJTMPDBUFE NBLF

Slide 38

Slide 38 text

Traditional Perl build flow. • makedpened is actually executed at also perl5
 (it is executed automatically) • Basically it is almost the same as modern perl5!! • old perl (strictly around Perl3) depends manually on make

Slide 39

Slide 39 text

Confgiure $POpHVSF $POpHVSFJT
 4IFMM4DSJQU *UDSFBUFT.BLFpMFJO FBDIFOWJSPONFOU

Slide 40

Slide 40 text

Configure flow $POpHVSF

Slide 41

Slide 41 text

create config.sh $POpHVSF DPOpHTI

Slide 42

Slide 42 text

creates config.h and Makefile $POpHVSF DPOpHTI .BLFpMF4) DQI4) NBLFEFQFOE 4)

Slide 43

Slide 43 text

create config.h and Makefile $POpHVSF DPOpHTI .BLFpMF4) DQI4) NBLFEFQFOE 4) DPOpH .BLFpMF

Slide 44

Slide 44 text

How to create Configure • Handwriting✍
 (we must follow update OS)
 • Not use Configure
 (using Cmake, using other build tools) • create Configure from Some tools.

Slide 45

Slide 45 text

How to create Configure • I think people often use so-called GNU tools such as autoconf and automake. • autoconf commands, create Configure using setting file called configure.in.
 • Created Configure create Makefile using makefile.in.
 (It is automake to automatically generate makefile.in)

Slide 46

Slide 46 text

Other Languages • Ruby and Python have configure.in
 (using autoconf)
 • C compiler LLVM / clang does not rely on Configure
 because it uses cmake.

Slide 47

Slide 47 text

Configure in Perl • Perl does not have a configure.in at from 1.0 • First of all, autoconf was not released in Perl 1.0 era. (Autoconf 1991 release, Perl 1987 release)
 • I wondered how Larry was creating the settings.

Slide 48

Slide 48 text

A.「He creates dist toolkit by himself」 • Larry creates dist toolkit by himself. • dist is create Configure using setting files. • —> create package from codes. • —> sent the package to email. • Also, the maintenance right was handed over to other people immediately after publication.

Slide 49

Slide 49 text

metaconfig • Perl script named metaconfig to generate configure.
 • Older brother of autoconf (also written in wikipedia) • Not metaconfig in the current GitHub Perl 5 repository.

Slide 50

Slide 50 text

metaconfig process NFUBDPOpH Run packinit to put together the information of the program to be distributed QBDLBHF QBDLJOJU

Slide 51

Slide 51 text

metaconfig process NFUBDPOpH Load MANIFEST (a list of source code Perl intend to use). Load .package QBDLBHF ."/*'&45 QBDLJOJU

Slide 52

Slide 52 text

metaconfig process NFUBDPOpH Generate a file that arranges programs such as cp required at build time, 
 called wanted. QBDLBHF ."/*'&45 QBDLJOJU 8BOUFE

Slide 53

Slide 53 text

metaconfig process NFUBDPOpH Create a file called Obsolete that summarizes the file changes QBDLBHF ."/*'&45 QBDLJOJU 8BOUFE 0CTPMFUF

Slide 54

Slide 54 text

metaconfig process NFUBDPOpH Generate Desired “Configure” QBDLBHF ."/*'&45 QBDLJOJU 8BOUFE 0CTPMFUF $POpHVSF

Slide 55

Slide 55 text

present day dist/metaconfig • The dist toolkit's metaconfig is plainly maintained. • But, Perl 4 flavored source code that can run on Perl 5. • Some dist toolkits are not maintained as Perl 5 
 (eg there is code left requiring getopts.pl)

Slide 56

Slide 56 text

present day dist/metaconfig • metaconfig ins in the dist toolkit. • They are continuously maintained. • metaconfig can execute by Perl5!
 But, It is Perl4 flavor source code.

Slide 57

Slide 57 text

a part of metaconfig source code sub main'profile { &auto_main'profile; } sub auto_main'profile { &main'dataload; } # Load the calling function from DATA segment and call it. This function is # called only once per routine to be loaded. sub main'dataload { local($__packname__) = (caller(1))[3]; $__packname__ =~ s/::/'/; local($__rpackname__) = $__packname__; local($__at__) = $@; $__rpackname__ =~ s/^auto_//; &perload'load_from_data($__rpackname__); local($__fun__) = "$__rpackname__"; $__fun__ =~ s/'/'load_/; eval "*$__packname__ = *$__fun__;"; # Change symbol table entry die $@ if $@; # Should not happen $@ = $__at__; # Restore value $@ had on entrance &$__fun__; # Call newly loaded function

Slide 58

Slide 58 text

present-day dist/metaconfig • For historical Perl, Perl's configuration file (* .SH) required to run metaconfig can be used at that time, which is convenient.
 • Perl5's Configure is not just using dist's metaconfig, but it is becoming more and more often direct rewriting itself.

Slide 59

Slide 59 text

Historical Perl rough structure • Written in C and yacc, there is no big difference between Perl 5 and other Perls. • perly.c have main function. • perl.c is a parsing phase generated by perl.y (YACC) • The names of perl.c and perly.c are replaced from Perl 5.

Slide 60

Slide 60 text

Perl1.0

Slide 61

Slide 61 text

Perl1.0 • 1987 release. The oldest existing Perl. • Older than IRC at historical. • Published at comp.sources.misc newsgroups. • Grammar definitions are done by yacc, 
 others are written in C

Slide 62

Slide 62 text

the features of Perl1.0 • Perl1.0 has about two and a half data types • strings ( not scalar!) • arrays of strings • associative arrays [experimental]

Slide 63

Slide 63 text

Perl1.0 has not… • range operator (..) • foreach • modules • use • my, our , local

Slide 64

Slide 64 text

Perl1.0 has … • Replace • Basic regular expression • List operations (shift, unsift, pop, push) • @_ • String operators • chop • each • subroutine

Slide 65

Slide 65 text

In Perl man page • Perl is a interpreted language optimized for scanning arbitrary text files, extracting information from those text files, and printing reports based on that information. It's also a good language for many system management tasks. •It combines (in the author's opinion, anyway) some of the best features of C, sed, awk, and sh, so people familiar with those languages should have little difficulty with it. — by Perl1 man page

Slide 66

Slide 66 text

example Perl1 Scripts • can for loop!!! #!/usr/bin/env perl @array = (1,2,3,4,5,6,7,8,9,10); for ( $i = 0; $i < $#array; $i++){ print $array[$i] ."\n"; }

Slide 67

Slide 67 text

example Perl1 Scripts (subroutine) sub MAX { $max = pop(@_); while ($foo = pop(@_)) { $max = $foo if $max < $foo; } $max; } ... $bestday = do MAX($mon,$tue,$wed,$thu,$fri);

Slide 68

Slide 68 text

in Perl1 subrotuine call do hello(); hello();

Slide 69

Slide 69 text

measure the processing time with fizzbuzz example for ($i = 0; $i < 10000_000; $i++){ if ($i % 3 == 0 ){ print "Fizz"; if ($i % 5 == 0){ print "Buzz"; } print "\n"; next; } if ($i % 5 == 0){ print "Buzz\n"; } print "$i\n"; }

Slide 70

Slide 70 text

100 order fizzbuzz • Perl1 is faster with calculate fizzbuzz for 0 to 100 than Perl5 1FSM 1FSM

Slide 71

Slide 71 text

10 million order fizzbuzz • But, Perl5 is faster with 10 million fizzbuzz than Perl1!!! 1FSM 1FSM

Slide 72

Slide 72 text

today Perl1.0 • PerlMonger has the habit of writing Perl 1.0 patches regularly (100% test passing version exists) • I was implementation Perl1.0 Docker Images. • You can easy execute Perl1.0 when using Docker.

Slide 73

Slide 73 text

Perl1.0 structure characteristics. • SV type advance, STR type is a simple configuration that only has char * • Naturally depends on the machine environment because it depends on the char type

Slide 74

Slide 74 text

Perl1.0 structure Source Code • Written in C before published K&R C second edition
 (Perl1.0 is written in C before ANSI-C) • Since C at that time did not have a standard, the return type of the library function was different depending on the processing system. • These are controlled by the macro.

Slide 75

Slide 75 text

Perl1.0 main function in C main(argc,argv,env) register int argc; register char **argv; register char **env; { register STR *str; register char *s; char *index(); linestr = str_new(80); str = str_make("-I/usr/lib/perl "); /* first

Slide 76

Slide 76 text

Perl1.0 main function in C main(argc,argv,env) register int argc; register char **argv; register char **env; { register STR *str; register char *s; char *index(); linestr = str_new(80); str = str_make("-I/usr/lib/perl "); /* first There is no type in the main function. Receive environment in env. The keyword register hints to compiler that a given variable can be put in a register.

Slide 77

Slide 77 text

Perl1.0 main function in C main(argc,argv,env) register int argc; register char **argv; register char **env; { register STR *str; register char *s; char *index(); linestr = str_new(80); str = str_make("-I/usr/lib/perl "); /* first In the first place, the declaration of arguments is so-called K & R style

Slide 78

Slide 78 text

K&R style in Perl • It is rewritten in 1997 by Nick Ing-Simmons, focusing on the miniperl part. • He corrected by protoize and handwriting.

Slide 79

Slide 79 text

today Perl5 #ifdef NO_ENV_ARRAY_IN_MAIN extern char **environ; int main(int argc, char **argv) #else int main(int argc, char **argv, char **env) #endif { int exitstatus, i; #ifdef PERL_GLOBAL_STRUCT struct perl_vars *my_vars = init_global_struct(); # ifdef PERL_GLOBAL_STRUCT_PRIVATE int veto; main function is int type, written in perlmain.c

Slide 80

Slide 80 text

No content

Slide 81

Slide 81 text

No content

Slide 82

Slide 82 text

Perl 1.0 process flow • First of all analyze the option • Load one file at a time with the files entered • YACC parsing while lexical analysis • I will just continue to run !!

Slide 83

Slide 83 text

Structure in Perl1 TUSJOH 453 1FSM *OTUSVDUJPO "3( 6TFXIFOJO USPVCMF 45"#

Slide 84

Slide 84 text

Structure in Perl1 TUS@QUS TUSJOH 453 TUS@MJOL SFNPWFTUSJOH TUS@MFO TUSJOHMFOHUI TUS@QPL qBHHFEQPJOUFSUP TUSJOH

Slide 85

Slide 85 text

Perl2.0

Slide 86

Slide 86 text

Perl2.0 is difficult… • The included Configure can be used as it is • but when make depend it is destroyed in relation to the header file of mac os ./config.h:172:19: warning: '/*' within block comment [-Wcomment] #/*undef TMINSYS /**/ ^ /usr/include/AvailabilityInternal.h:38846:2: error: #else after #else #else ^ /usr/include/AvailabilityInternal.h:38203:10: error: unterminated conditional directive #if __MAC_OS_X_VERSION_MIN_REQUIRED >= __MAC_10_13 ^ /usr/include/AvailabilityInternal.h:38116:10: error: unterminated conditional

Slide 87

Slide 87 text

VS Configure<1> • Remake Configure itself using metaconfig that is maintained. • The newly created Configure will export files according to your environment, which will allow you to make. • You can execute make.

Slide 88

Slide 88 text

In mac os I am

Slide 89

Slide 89 text

In mac os I am NBD\HDD^OFHDD

Slide 90

Slide 90 text

In mac os I am NBD\HDD^OFHDD NBD\HDD^FRDMBOH
 JONBDPT

Slide 91

Slide 91 text

VS Configure<2> • We try install gcc or llvm/clang. • If you try to build gcc from source code, 
 I think you need to use llvm / clang installed with brew. brew install gcc brew install llvm #should include PATH (at /usr/libexec/bin)

Slide 92

Slide 92 text

fix Makefile • The Makefile was successfully generated, but it is in a situation where it can not be built subtly.

Slide 93

Slide 93 text

fix Makefile • and suddenly appear in Makefile • It can not be built because it does not exist as a header file…. arg.o: /usr/include/time.h arg.o: arg.o:

Slide 94

Slide 94 text

How to fix Makefile • The header file to be used is written to the Makefile after makedpend • So We want to change do not generate command-line etc. in makedepend's configuration file makedepend.SH

Slide 95

Slide 95 text

makedepend.SH $egrep '^#include ' `cat .clist` `cat .hlist` >.deptmp $echo "Updating Makefile..." <.clist $sed -n \ -e '/\//{' \ -e 's|^\(.*\)/\(.*\)\.c|\2.o: \1/\2.c; '"$defrule \1/\2.c|p" \ -e d \ -e '}' \ -e 's|^\(.*\)\.c|\1.o: \1.c|p' >> Makefile.new <.hlist $sed -n 's|\(.*/\)\(.*\)|s= \2= \1\2=|p' >.hsed <.deptmp $sed -n 's|c:#include "\(.*\)".*$|o: \1|p' | \ $sed 's|^[^;]*/||' | \ $sed -f .hsed >> Makefile.new <.deptmp $sed -n 's|c:#include <\(.*\)>.*$|o: /usr/include/\1|p' \ >> Makefile.new <.deptmp $sed -n 's|h:#include "\(.*\)".*$|h: \1|p' | \ $sed -f .hsed >> Makefile.new

Slide 96

Slide 96 text

makedepend.SH $egrep '^#include ' `cat .clist` `cat .hlist` >.deptmp $echo "Updating Makefile..." <.clist $sed -n \ -e '/\//{' \ -e 's|^\(.*\)/\(.*\)\.c|\2.o: \1/\2.c; '"$defrule \1/\2.c|p" \ -e d \ -e '}' \ -e 's|^\(.*\)\.c|\1.o: \1.c|p' >> Makefile.new <.hlist $sed -n 's|\(.*/\)\(.*\)|s= \2= \1\2=|p' >.hsed <.deptmp $sed -n 's|c:#include "\(.*\)".*$|o: \1|p' | \ $sed 's|^[^;]*/||' | \ $sed -f .hsed >> Makefile.new <.deptmp $sed -n 's|c:#include <\(.*\)>.*$|o: /usr/include/\1|p' \ >> Makefile.new <.deptmp $sed -n 's|h:#include "\(.*\)".*$|h: \1|p' | \ $sed -f .hsed >> Makefile.new I’m give up fixing it here?

Slide 97

Slide 97 text

makedepend.SH $egrep '^#include ' `cat .clist` `cat .hlist` >.deptmp $echo "Updating Makefile..." <.clist $sed -n \ -e '/\//{' \ -e 's|^\(.*\)/\(.*\)\.c|\2.o: \1/\2.c; '"$defrule \1/\2.c|p" \ -e d \ -e '}' \ -e 's|^\(.*\)\.c|\1.o: \1.c|p' >> Makefile.new <.hlist $sed -n 's|\(.*/\)\(.*\)|s= \2= \1\2=|p' >.hsed <.deptmp $sed -n 's|c:#include "\(.*\)".*$|o: \1|p' | \ $sed 's|^[^;]*/||' | \ $sed -f .hsed >> Makefile.new <.deptmp $sed -n 's|c:#include <\(.*\)>.*$|o: /usr/include/\1|p' \ >> Makefile.new <.deptmp $sed -n 's|h:#include "\(.*\)".*$|h: \1|p' | \ $sed -f .hsed >> Makefile.new This code is sed…

Slide 98

Slide 98 text

I remember •It combines (in the author's opinion, anyway) some of the best features of C, sed, awk, and sh, so people familiar with those languages should have little difficulty with it. — by Perl1 man page

Slide 99

Slide 99 text

I remember •It combines (in the author's opinion, anyway) some of the best features of C, sed, awk, and sh, so people familiar with those languages should have little difficulty with it. — by Perl1 man page

Slide 100

Slide 100 text

makedepend.SH $egrep '^#include ' `cat .clist` `cat .hlist` >.deptmp $echo "Updating Makefile..." <.clist $sed -n \ -e '/\//{' \ -e 's|^\(.*\)/\(.*\)\.c|\2.o: \1/\2.c; '"$defrule \1/\2.c|p" \ -e d \ -e '}' \ -e 's|^\(.*\)\.c|\1.o: \1.c|p' >> Makefile.new <.hlist $sed -n 's|\(.*/\)\(.*\)|s= \2= \1\2=|p' >.hsed <.deptmp $sed -n 's|c:#include "\(.*\)".*$|o: \1|p' | \ $sed 's|^[^;]*/||' | \ $sed -f .hsed >> Makefile.new <.deptmp $sed -n 's|c:#include <\(.*\)>.*$|o: /usr/include/\1|p' \ >> Makefile.new <.deptmp $sed -n 's|h:#include "\(.*\)".*$|h: \1|p' | \ $sed -f .hsed >> Makefile.new !!!!!!!!!!!!!!!!!!!!!!!!!!!

Slide 101

Slide 101 text

makedepend.SH $egrep '^#include ' `cat .clist` `cat .hlist` >.deptmp $echo "Updating Makefile..." <.clist $sed -n \ -e '/\//{' \ -e 's|^\(.*\)/\(.*\)\.c|\2.o: \1/\2.c; '"$defrule \1/\2.c|p" \ -e d \ -e '}' \ -e 's|^\(.*\)\.c|\1.o: \1.c|p' >> Makefile.new <.hlist $sed -n 's|\(.*/\)\(.*\)|s= \2= \1\2=|p' >.hsed <.deptmp $sed -n 's|c:#include "\(.*\)".*$|o: \1|p' | \ $sed 's|^[^;]*/||' | \ $sed -f .hsed >> Makefile.new <.deptmp $sed -n 's|c:#include <\(.*\)>.*$|o: /usr/include/\1|p' \ >> Makefile.new <.deptmp $sed -n 's|h:#include "\(.*\)".*$|h: \1|p' | \ $sed -f .hsed >> Makefile.new We have a Perl1!!!!!!!!

Slide 102

Slide 102 text

Forced resolution • But, We have a Per1!!!! • I use Perl1 “one liner”!!! • Of course you can do it with Perl5 !!! $./perl -ni -e 'print unless /(built-in)|(command line)/;’ Makefile

Slide 103

Slide 103 text

Forced resolution • But, We have a Per1!!!! • I use Perl1 “one liner”!!! • Of course you can do it with Perl5 !!! $./perl -ni -e 'print unless /(built-in)|(command line)/;’ Makefile

Slide 104

Slide 104 text

fix YACC • An error is generated by stabval for which nothing is described in YACC %type prog decl format %type %type block lineseq line loop cond sideff nexpr else

Slide 105

Slide 105 text

fix YACC • Comment out!!!!!!! %type prog decl format /*%type */ %type block lineseq line loop cond sideff nexpr else

Slide 106

Slide 106 text

fix YACC • sprintf separates char pointer or int ... • Currently int type • It is not necessary because sprintf includes header files in the first place #ifdef CHARSPRINTF char *sprintf(); #else int sprintf(); #endif

Slide 107

Slide 107 text

fix YACC • remove !!!!!!!! undef;

Slide 108

Slide 108 text

correct C language Source • unkown type name UIDTYPE…!? Really…!? ./perl.h:235:1: error: unknown type name 'UIDTYPE' UIDTYPE getuid(); ^ ./perl.h:236:1: error: unknown type name 'UIDTYPE' UIDTYPE geteuid(); ^ ./perl.h:237:1: error: unknown type name 'GIDTYPE' GIDTYPE getgid(); ^ ./perl.h:238:1: error: unknown type name 'GIDTYPE' GIDTYPE getegid();

Slide 109

Slide 109 text

correct C language Source • Modified typed!!!!!!!! NAME geteuid, getuid -- get user identification SYNOPSIS #include uid_t geteuid(void); uid_t getuid(void);

Slide 110

Slide 110 text

correct C language Source • modify all typed to uid_t uid_t getuid(); uid_t geteuid(); uid_t getgid(); uid_t getegid();

Slide 111

Slide 111 text

correct C language Source • conflicting types …!!! In file included from arg.c:10: ./perl.h:275:14: error: conflicting types for 'times' long time(), times(); ^

Slide 112

Slide 112 text

correct C language Source • modify only times function to long type long times();

Slide 113

Slide 113 text

correct C language Source • It is heartbreaking that errors increase.... arg.c:934:43: error: incomplete definition of type 'struct tms' apush(ary,str_nmake(((double)timesbuf.tms_utime)/HZ)); ~~~~~~~~^ ./perl.h:226:12: note: forward declaration of 'struct tms' EXT struct tms timesbuf; ^ arg.c:935:43: error: incomplete definition of type 'struct tms' apush(ary,str_nmake(((double)timesbuf.tms_stime)/HZ)); ~~~~~~~~^ ./perl.h:226:12: note: forward declaration of 'struct tms' EXT struct tms timesbuf; ^ arg.c:936:43: error: incomplete definition of type 'struct tms' apush(ary,str_nmake(((double)timesbuf.tms_cutime)/HZ));

Slide 114

Slide 114 text

correct C language Source • morecoer is not defined as static, etc… malloc.c:155:1: error: static declaration of 'morecore' follows non-static declaration malloc.c:126:5: note: previous implicit declaration is here morecore(bucket); ^ malloc.c:164:5: error: non-void function 'morecore' should return a value [- Wreturn-type] return; ^ malloc.c:181:5: error: non-void function 'morecore' should return a value [- Wreturn-type] return; ^

Slide 115

Slide 115 text

correct C language Source • I will put a word of magic! • If you do something with Gcc, it will automatically enter but not clang static morecore(register); static findbucket(union overhead*, int);

Slide 116

Slide 116 text

Summary up to here In gcc, it is possible to build with the correction point introduced just now! (Let’s try!!)

Slide 117

Slide 117 text

Perl4.0 • There is a problem of conflict with C library that function name includes • We have Perl 5 so replace to other function's name with using one-liner.

Slide 118

Slide 118 text

Perl5.0 • Perl5.0 is most difficult build to historical Perl versions. • Even if Configure is recreated with metaconfig, 
 Makefile cannot be created.

Slide 119

Slide 119 text

about Perl6 • The current Perl 6 is mainstream Rakudo • Rakudo is a three-stage configuration of VM + NQP (NotQuitPerl) + Perl 6 (made by NQP) • Traditional Perl 6 is probably like Pugs and Parrot

Slide 120

Slide 120 text

How to build Perl6 $POpHVSFQM NBLF NBLFJOTUBMM MoarVM/
 NQP/
 Rakudo

Slide 121

Slide 121 text

dependency Perl2 Perl5
 (git clone) Perl6

Slide 122

Slide 122 text

dependency Perl2 Perl5
 (git clone) Perl6

Slide 123

Slide 123 text

dependency Perl2 Perl5
 (git clone) Perl6

Slide 124

Slide 124 text

dependency Perl2 Perl5
 (git clone) Perl6

Slide 125

Slide 125 text

So, I think… Perl2 Perl5
 (git clone) Perl6 8FOFFEB1FSM CJOBSZUPCVJME1FSM

Slide 126

Slide 126 text

Next • I have 3 projects related to traditional Perl. • rewrite Perl1 sourcecode C to Rust. • Implementing Inline::Perl1 as Perl5 CPAN. • Implementing scripts to run all Perl versions with one liner
 (PERL-ALL?)

Slide 127

Slide 127 text

Conclusion • Perl5 is greatness. • We can build all Perl versions. • Let’s try build old Perl versions!

Slide 128

Slide 128 text

Thank you for Listening!

Slide 129

Slide 129 text

How to build Perl6 $POpHVSFQM NPBS NQP +7. Set which VM to use as an option

Slide 130

Slide 130 text

How to build Perl6 .PBS#ZUF$PEF /21 NQP NBLF NPBS Pass the pre- bytecoded NQP interpreter to the MoarVM binary

Slide 131

Slide 131 text

How to build Perl6 .PBS#ZUF$PEF /21 NQP NBLF NPBS aORQ Provide as input NQP source code describing the NQP interpreter

Slide 132

Slide 132 text

How to build Perl6 .PBS#ZUF$PEF /21 NQP NBLF NPBS aORQ ORQ
 TUBHF

Slide 133

Slide 133 text

How to build Perl6 NQP NBLF NPBS aORQ ORQ
 TUBHF ORQ
 TUBHF This is often called nqp

Slide 134

Slide 134 text

How to build Perl6 Rakudo $POpHVSFQM ORQ
 TUBHF NPBS

Slide 135

Slide 135 text

How to build Perl6 Rakudo ORQ
 TUBHF NPBS aORQ aQN

Slide 136

Slide 136 text

How to build Perl6 Rakudo ORQ
 TUBHF NPBS aORQ aQN QFSM