The document discusses functional programming languages for IoT applications. It describes ATS, a functional language without garbage collection that is compiled to C and supports theorem proving to safely use pointers. ATS has been used to program ESP8266 and Arduino devices. The document provides examples of errors that ATS can catch, like a variable needing to be freed or an unsolved constraint.
UiPath Test Automation using UiPath Test Suite series, part 2
Functional IoT: Programming Language and OS
1. Functional IoT: Programming
Language and OS
Functional IoT: Programming
Language and OS
Functional IoT: Programming
Language and OS
Functional IoT: Programming
Language and OS
Functional IoT: Programming
Language and OS
Kiwamu OkabeKiwamu OkabeKiwamu OkabeKiwamu OkabeKiwamu Okabe
2. We drown in MANY MANY languages!We drown in MANY MANY languages!We drown in MANY MANY languages!We drown in MANY MANY languages!We drown in MANY MANY languages!
☆ There are many many languages in the world.☆ There are many many languages in the world.☆ There are many many languages in the world.☆ There are many many languages in the world.☆ There are many many languages in the world.
☆ Nobody have the exhaustive catalog of them.☆ Nobody have the exhaustive catalog of them.☆ Nobody have the exhaustive catalog of them.☆ Nobody have the exhaustive catalog of them.☆ Nobody have the exhaustive catalog of them.
☆ However, let's try to get first overview today.☆ However, let's try to get first overview today.☆ However, let's try to get first overview today.☆ However, let's try to get first overview today.☆ However, let's try to get first overview today.
3. What the purpose of language?What the purpose of language?What the purpose of language?What the purpose of language?What the purpose of language?
I think that there are three major purpose of the
languages:
I think that there are three major purpose of the
languages:
I think that there are three major purpose of the
languages:
I think that there are three major purpose of the
languages:
I think that there are three major purpose of the
languages:
☆ Implementation☆ Implementation☆ Implementation☆ Implementation☆ Implementation
☆ Verification☆ Verification☆ Verification☆ Verification☆ Verification
☆ OS☆ OS☆ OS☆ OS☆ OS
5. ATSATSATSATSATS
☆ http://www.ats-lang.org/☆ http://www.ats-lang.org/☆ http://www.ats-lang.org/☆ http://www.ats-lang.org/☆ http://www.ats-lang.org/
☆ Without GC / Without runtime☆ Without GC / Without runtime☆ Without GC / Without runtime☆ Without GC / Without runtime☆ Without GC / Without runtime
☆ Theorem proving / Safely use pointer☆ Theorem proving / Safely use pointer☆ Theorem proving / Safely use pointer☆ Theorem proving / Safely use pointer☆ Theorem proving / Safely use pointer
☆ Syntax is similar to ML☆ Syntax is similar to ML☆ Syntax is similar to ML☆ Syntax is similar to ML☆ Syntax is similar to ML
☆ Compiled into C language code☆ Compiled into C language code☆ Compiled into C language code☆ Compiled into C language code☆ Compiled into C language code
☆ Able to import C define macro☆ Able to import C define macro☆ Able to import C define macro☆ Able to import C define macro☆ Able to import C define macro
6. ATS on ESP8266ATS on ESP8266ATS on ESP8266ATS on ESP8266ATS on ESP8266
☆ https://github.com/fpiot/esp8266-ats☆ https://github.com/fpiot/esp8266-ats☆ https://github.com/fpiot/esp8266-ats☆ https://github.com/fpiot/esp8266-ats☆ https://github.com/fpiot/esp8266-ats
7. What error can be captured by ATS?What error can be captured by ATS?What error can be captured by ATS?What error can be captured by ATS?What error can be captured by ATS?
$�vi�user/user_main.dats
�39�����val�json_open�=�string0_copy�"{"value1":�""
�40�����val�json_close�=�string0_copy�""�}"
�41�����val�temp�=�esp_tostrptr_int�rand
�42�����val�json_head�=�strptr_append�(json_open,�temp)
�43�����val�json_data�=�strptr_append�(json_head,�json_close)
�44�//��val�()�=�(free�json_open;�free�json_close;�free�temp;�free�json_head)
�45�����val�()�=�(free�json_open;�free�json_close;�free�temp)�//�Error!
$�make
ATS�user/user_main.dats
/home/kiwamu/src/esp8266-ats/ifttt_ats/user/user_main.dats:�985(line=32,�
offs=43)�--�2237(line=55,�offs=4):�error(3):�the�linear�dynamic�variable�
[json_head$3823(-1)]�nee
ds�to�be�consumed�but�it�is�preserved�with�the�type�[S2Eapp(S2Ecst
(strptr_addr_vtype);�S2EVar(4441))]�instead.
$�vi�user/user_main.dats
�39�����val�json_open�=�string0_copy�"{"value1":�""
�40�����val�json_close�=�string0_copy�""�}"
�41�����val�temp�=�esp_tostrptr_int�rand
�42�����val�json_head�=�strptr_append�(json_open,�temp)
�43�����val�json_data�=�strptr_append�(json_head,�json_close)
�44�//��val�()�=�(free�json_open;�free�json_close;�free�temp;�free�json_head)
�45�����val�()�=�(free�json_open;�free�json_close;�free�temp)�//�Error!
$�make
ATS�user/user_main.dats
/home/kiwamu/src/esp8266-ats/ifttt_ats/user/user_main.dats:�985(line=32,�
offs=43)�--�2237(line=55,�offs=4):�error(3):�the�linear�dynamic�variable�
[json_head$3823(-1)]�nee
ds�to�be�consumed�but�it�is�preserved�with�the�type�[S2Eapp(S2Ecst
(strptr_addr_vtype);�S2EVar(4441))]�instead.
$�vi�user/user_main.dats
�39�����val�json_open�=�string0_copy�"{"value1":�""
�40�����val�json_close�=�string0_copy�""�}"
�41�����val�temp�=�esp_tostrptr_int�rand
�42�����val�json_head�=�strptr_append�(json_open,�temp)
�43�����val�json_data�=�strptr_append�(json_head,�json_close)
�44�//��val�()�=�(free�json_open;�free�json_close;�free�temp;�free�json_head)
�45�����val�()�=�(free�json_open;�free�json_close;�free�temp)�//�Error!
$�make
ATS�user/user_main.dats
/home/kiwamu/src/esp8266-ats/ifttt_ats/user/user_main.dats:�985(line=32,�
offs=43)�--�2237(line=55,�offs=4):�error(3):�the�linear�dynamic�variable�
[json_head$3823(-1)]�nee
ds�to�be�consumed�but�it�is�preserved�with�the�type�[S2Eapp(S2Ecst
(strptr_addr_vtype);�S2EVar(4441))]�instead.
$�vi�user/user_main.dats
�39�����val�json_open�=�string0_copy�"{"value1":�""
�40�����val�json_close�=�string0_copy�""�}"
�41�����val�temp�=�esp_tostrptr_int�rand
�42�����val�json_head�=�strptr_append�(json_open,�temp)
�43�����val�json_data�=�strptr_append�(json_head,�json_close)
�44�//��val�()�=�(free�json_open;�free�json_close;�free�temp;�free�json_head)
�45�����val�()�=�(free�json_open;�free�json_close;�free�temp)�//�Error!
$�make
ATS�user/user_main.dats
/home/kiwamu/src/esp8266-ats/ifttt_ats/user/user_main.dats:�985(line=32,�
offs=43)�--�2237(line=55,�offs=4):�error(3):�the�linear�dynamic�variable�
[json_head$3823(-1)]�nee
ds�to�be�consumed�but�it�is�preserved�with�the�type�[S2Eapp(S2Ecst
(strptr_addr_vtype);�S2EVar(4441))]�instead.
$�vi�user/user_main.dats
�39�����val�json_open�=�string0_copy�"{"value1":�""
�40�����val�json_close�=�string0_copy�""�}"
�41�����val�temp�=�esp_tostrptr_int�rand
�42�����val�json_head�=�strptr_append�(json_open,�temp)
�43�����val�json_data�=�strptr_append�(json_head,�json_close)
�44�//��val�()�=�(free�json_open;�free�json_close;�free�temp;�free�json_head)
�45�����val�()�=�(free�json_open;�free�json_close;�free�temp)�//�Error!
$�make
ATS�user/user_main.dats
/home/kiwamu/src/esp8266-ats/ifttt_ats/user/user_main.dats:�985(line=32,�
offs=43)�--�2237(line=55,�offs=4):�error(3):�the�linear�dynamic�variable�
[json_head$3823(-1)]�nee
ds�to�be�consumed�but�it�is�preserved�with�the�type�[S2Eapp(S2Ecst
(strptr_addr_vtype);�S2EVar(4441))]�instead.
8. ATS on ArduinoATS on ArduinoATS on ArduinoATS on ArduinoATS on Arduino
☆ https://github.com/fpiot/arduino-ats☆ https://github.com/fpiot/arduino-ats☆ https://github.com/fpiot/arduino-ats☆ https://github.com/fpiot/arduino-ats☆ https://github.com/fpiot/arduino-ats
9. What error can be captured by ATS?What error can be captured by ATS?What error can be captured by ATS?What error can be captured by ATS?What error can be captured by ATS?
$�vi�../../SATS/lcd.sats
�11�fun�lcd_print�{n:int}{i:nat�│�i�<�n}{j:nat�│�i�+�j�<=�n}
�12�(lcd:�!lcd_t,�str:�string�(n),�start:�size_t�(i),�len:�size_t�(j)):�void
$�vi�DATS/main.dats
�14���fun�loop�{n:int}{i:nat�│�i�<�n}�.<n-i>.
�15������������(lcd:�!lcd_t,�str:�string�(n),�pos:�size_t�(i)):�void�=�{
�16�//��val�()�=�if�pos�+�i2sz�LCD_WIDTH�<=�length�str�then�{
�17�����val�()�=�if�pos�+�i2sz�LCD_WIDTH�<=�1�+�length�str�then�{�//�Error!
�--snip--
�19�������val�()�=�(lcd_setCursor�(lcd,�0,�1);
�20�����������������lcd_print�(lcd,�str,�pos,�i2sz�LCD_WIDTH))
�21�������val�()�=�loop�(lcd,�str,�pos�+�1)
$�patsopt�-o�DATS/main_dats.c.tmp�-d�DATS/main.dats�│&�pats-filter
DATS/main.dats:20:26:�unsolved�constraint:�[1]
[1]:�((S2EVar(1969�->�i)�+�S2EVar(1970�->�16))�<=�S2EVar(1968�->�n))
$�vi�../../SATS/lcd.sats
�11�fun�lcd_print�{n:int}{i:nat�│�i�<�n}{j:nat�│�i�+�j�<=�n}
�12�(lcd:�!lcd_t,�str:�string�(n),�start:�size_t�(i),�len:�size_t�(j)):�void
$�vi�DATS/main.dats
�14���fun�loop�{n:int}{i:nat�│�i�<�n}�.<n-i>.
�15������������(lcd:�!lcd_t,�str:�string�(n),�pos:�size_t�(i)):�void�=�{
�16�//��val�()�=�if�pos�+�i2sz�LCD_WIDTH�<=�length�str�then�{
�17�����val�()�=�if�pos�+�i2sz�LCD_WIDTH�<=�1�+�length�str�then�{�//�Error!
�--snip--
�19�������val�()�=�(lcd_setCursor�(lcd,�0,�1);
�20�����������������lcd_print�(lcd,�str,�pos,�i2sz�LCD_WIDTH))
�21�������val�()�=�loop�(lcd,�str,�pos�+�1)
$�patsopt�-o�DATS/main_dats.c.tmp�-d�DATS/main.dats�│&�pats-filter
DATS/main.dats:20:26:�unsolved�constraint:�[1]
[1]:�((S2EVar(1969�->�i)�+�S2EVar(1970�->�16))�<=�S2EVar(1968�->�n))
$�vi�../../SATS/lcd.sats
�11�fun�lcd_print�{n:int}{i:nat�│�i�<�n}{j:nat�│�i�+�j�<=�n}
�12�(lcd:�!lcd_t,�str:�string�(n),�start:�size_t�(i),�len:�size_t�(j)):�void
$�vi�DATS/main.dats
�14���fun�loop�{n:int}{i:nat�│�i�<�n}�.<n-i>.
�15������������(lcd:�!lcd_t,�str:�string�(n),�pos:�size_t�(i)):�void�=�{
�16�//��val�()�=�if�pos�+�i2sz�LCD_WIDTH�<=�length�str�then�{
�17�����val�()�=�if�pos�+�i2sz�LCD_WIDTH�<=�1�+�length�str�then�{�//�Error!
�--snip--
�19�������val�()�=�(lcd_setCursor�(lcd,�0,�1);
�20�����������������lcd_print�(lcd,�str,�pos,�i2sz�LCD_WIDTH))
�21�������val�()�=�loop�(lcd,�str,�pos�+�1)
$�patsopt�-o�DATS/main_dats.c.tmp�-d�DATS/main.dats�│&�pats-filter
DATS/main.dats:20:26:�unsolved�constraint:�[1]
[1]:�((S2EVar(1969�->�i)�+�S2EVar(1970�->�16))�<=�S2EVar(1968�->�n))
$�vi�../../SATS/lcd.sats
�11�fun�lcd_print�{n:int}{i:nat�│�i�<�n}{j:nat�│�i�+�j�<=�n}
�12�(lcd:�!lcd_t,�str:�string�(n),�start:�size_t�(i),�len:�size_t�(j)):�void
$�vi�DATS/main.dats
�14���fun�loop�{n:int}{i:nat�│�i�<�n}�.<n-i>.
�15������������(lcd:�!lcd_t,�str:�string�(n),�pos:�size_t�(i)):�void�=�{
�16�//��val�()�=�if�pos�+�i2sz�LCD_WIDTH�<=�length�str�then�{
�17�����val�()�=�if�pos�+�i2sz�LCD_WIDTH�<=�1�+�length�str�then�{�//�Error!
�--snip--
�19�������val�()�=�(lcd_setCursor�(lcd,�0,�1);
�20�����������������lcd_print�(lcd,�str,�pos,�i2sz�LCD_WIDTH))
�21�������val�()�=�loop�(lcd,�str,�pos�+�1)
$�patsopt�-o�DATS/main_dats.c.tmp�-d�DATS/main.dats�│&�pats-filter
DATS/main.dats:20:26:�unsolved�constraint:�[1]
[1]:�((S2EVar(1969�->�i)�+�S2EVar(1970�->�16))�<=�S2EVar(1968�->�n))
$�vi�../../SATS/lcd.sats
�11�fun�lcd_print�{n:int}{i:nat�│�i�<�n}{j:nat�│�i�+�j�<=�n}
�12�(lcd:�!lcd_t,�str:�string�(n),�start:�size_t�(i),�len:�size_t�(j)):�void
$�vi�DATS/main.dats
�14���fun�loop�{n:int}{i:nat�│�i�<�n}�.<n-i>.
�15������������(lcd:�!lcd_t,�str:�string�(n),�pos:�size_t�(i)):�void�=�{
�16�//��val�()�=�if�pos�+�i2sz�LCD_WIDTH�<=�length�str�then�{
�17�����val�()�=�if�pos�+�i2sz�LCD_WIDTH�<=�1�+�length�str�then�{�//�Error!
�--snip--
�19�������val�()�=�(lcd_setCursor�(lcd,�0,�1);
�20�����������������lcd_print�(lcd,�str,�pos,�i2sz�LCD_WIDTH))
�21�������val�()�=�loop�(lcd,�str,�pos�+�1)
$�patsopt�-o�DATS/main_dats.c.tmp�-d�DATS/main.dats�│&�pats-filter
DATS/main.dats:20:26:�unsolved�constraint:�[1]
[1]:�((S2EVar(1969�->�i)�+�S2EVar(1970�->�16))�<=�S2EVar(1968�->�n))
10. RustRustRustRustRust
☆ https://www.rust-lang.org/☆ https://www.rust-lang.org/☆ https://www.rust-lang.org/☆ https://www.rust-lang.org/☆ https://www.rust-lang.org/
☆ Without GC☆ Without GC☆ Without GC☆ Without GC☆ Without GC
☆ Syntax is similar to C☆ Syntax is similar to C☆ Syntax is similar to C☆ Syntax is similar to C☆ Syntax is similar to C
☆ Safely use pointer☆ Safely use pointer☆ Safely use pointer☆ Safely use pointer☆ Safely use pointer
☆ Depends on LLVM☆ Depends on LLVM☆ Depends on LLVM☆ Depends on LLVM☆ Depends on LLVM
11. Rust on mbedRust on mbedRust on mbedRust on mbedRust on mbed
☆ https://github.com/0xc0170/mbed-rust-frdm-
k64f-blinky
☆ https://github.com/0xc0170/mbed-rust-frdm-
k64f-blinky
☆ https://github.com/0xc0170/mbed-rust-frdm-
k64f-blinky
☆ https://github.com/0xc0170/mbed-rust-frdm-
k64f-blinky
☆ https://github.com/0xc0170/mbed-rust-frdm-
k64f-blinky
12. JhcJhcJhcJhcJhc
☆ http://repetae.net/computer/jhc/☆ http://repetae.net/computer/jhc/☆ http://repetae.net/computer/jhc/☆ http://repetae.net/computer/jhc/☆ http://repetae.net/computer/jhc/
☆ A Haskell compiler☆ A Haskell compiler☆ A Haskell compiler☆ A Haskell compiler☆ A Haskell compiler
☆ With GC☆ With GC☆ With GC☆ With GC☆ With GC
☆ Only for 32-bit CPU☆ Only for 32-bit CPU☆ Only for 32-bit CPU☆ Only for 32-bit CPU☆ Only for 32-bit CPU
☆ Can't use all of Haskell libraries☆ Can't use all of Haskell libraries☆ Can't use all of Haskell libraries☆ Can't use all of Haskell libraries☆ Can't use all of Haskell libraries
☆ Compiled into C language code☆ Compiled into C language code☆ Compiled into C language code☆ Compiled into C language code☆ Compiled into C language code
13. Jhc on mbedJhc on mbedJhc on mbedJhc on mbedJhc on mbed
☆ https://github.com/ajhc/demo-cortex-m3☆ https://github.com/ajhc/demo-cortex-m3☆ https://github.com/ajhc/demo-cortex-m3☆ https://github.com/ajhc/demo-cortex-m3☆ https://github.com/ajhc/demo-cortex-m3
14. IvoryIvoryIvoryIvoryIvory
☆ http://ivorylang.org/☆ http://ivorylang.org/☆ http://ivorylang.org/☆ http://ivorylang.org/☆ http://ivorylang.org/
☆ EDSL on Haskell☆ EDSL on Haskell☆ EDSL on Haskell☆ EDSL on Haskell☆ EDSL on Haskell
☆ Without GC☆ Without GC☆ Without GC☆ Without GC☆ Without GC
☆ No NULL pointer☆ No NULL pointer☆ No NULL pointer☆ No NULL pointer☆ No NULL pointer
☆ Compiled into C language code☆ Compiled into C language code☆ Compiled into C language code☆ Compiled into C language code☆ Compiled into C language code
15. Ivory on ArduinoIvory on ArduinoIvory on ArduinoIvory on ArduinoIvory on Arduino
☆ https://github.com/fpiot/arduino-ivory☆ https://github.com/fpiot/arduino-ivory☆ https://github.com/fpiot/arduino-ivory☆ https://github.com/fpiot/arduino-ivory☆ https://github.com/fpiot/arduino-ivory
16. IdrisIdrisIdrisIdrisIdris
☆ http://www.idris-lang.org/☆ http://www.idris-lang.org/☆ http://www.idris-lang.org/☆ http://www.idris-lang.org/☆ http://www.idris-lang.org/
☆ With GC☆ With GC☆ With GC☆ With GC☆ With GC
☆ Theorem proving☆ Theorem proving☆ Theorem proving☆ Theorem proving☆ Theorem proving
☆ Syntax is similar to Haskell☆ Syntax is similar to Haskell☆ Syntax is similar to Haskell☆ Syntax is similar to Haskell☆ Syntax is similar to Haskell
☆ Compiled into C language code☆ Compiled into C language code☆ Compiled into C language code☆ Compiled into C language code☆ Compiled into C language code
17. Idris on ArduinoIdris on ArduinoIdris on ArduinoIdris on ArduinoIdris on Arduino
☆ https://github.com/stepcut/idris-blink☆ https://github.com/stepcut/idris-blink☆ https://github.com/stepcut/idris-blink☆ https://github.com/stepcut/idris-blink☆ https://github.com/stepcut/idris-blink
☆ Eat much memory. Following crash.☆ Eat much memory. Following crash.☆ Eat much memory. Following crash.☆ Eat much memory. Following crash.☆ Eat much memory. Following crash.
main�=�do�pinMode�13�1
����������digitalWrite�13�1
����������delay�100
����������digitalWrite�13�0
����������delay�100
����������digitalWrite�13�1
����������delay�100
����������digitalWrite�13�0
����������delay�100
����������digitalWrite�13�1
����������delay�100
main�=�do�pinMode�13�1
����������digitalWrite�13�1
����������delay�100
����������digitalWrite�13�0
����������delay�100
����������digitalWrite�13�1
����������delay�100
����������digitalWrite�13�0
����������delay�100
����������digitalWrite�13�1
����������delay�100
main�=�do�pinMode�13�1
����������digitalWrite�13�1
����������delay�100
����������digitalWrite�13�0
����������delay�100
����������digitalWrite�13�1
����������delay�100
����������digitalWrite�13�0
����������delay�100
����������digitalWrite�13�1
����������delay�100
main�=�do�pinMode�13�1
����������digitalWrite�13�1
����������delay�100
����������digitalWrite�13�0
����������delay�100
����������digitalWrite�13�1
����������delay�100
����������digitalWrite�13�0
����������delay�100
����������digitalWrite�13�1
����������delay�100
main�=�do�pinMode�13�1
����������digitalWrite�13�1
����������delay�100
����������digitalWrite�13�0
����������delay�100
����������digitalWrite�13�1
����������delay�100
����������digitalWrite�13�0
����������delay�100
����������digitalWrite�13�1
����������delay�100
18. AdaAdaAdaAdaAda
☆ http://www.adacore.com/☆ http://www.adacore.com/☆ http://www.adacore.com/☆ http://www.adacore.com/☆ http://www.adacore.com/
☆ Without GC☆ Without GC☆ Without GC☆ Without GC☆ Without GC
☆ Verification with SPARK☆ Verification with SPARK☆ Verification with SPARK☆ Verification with SPARK☆ Verification with SPARK
☆ Ada on Arduino☆ Ada on Arduino☆ Ada on Arduino☆ Ada on Arduino☆ Ada on Arduino
☆ http://playground.arduino.cc/Code/AVR-Ada☆ http://playground.arduino.cc/Code/AVR-Ada☆ http://playground.arduino.cc/Code/AVR-Ada☆ http://playground.arduino.cc/Code/AVR-Ada☆ http://playground.arduino.cc/Code/AVR-Ada
19. HexeHexeHexeHexeHexe
☆ http://haxe.org/☆ http://haxe.org/☆ http://haxe.org/☆ http://haxe.org/☆ http://haxe.org/
☆ Can run on bare metal hardware?☆ Can run on bare metal hardware?☆ Can run on bare metal hardware?☆ Can run on bare metal hardware?☆ Can run on bare metal hardware?
21. VeriFastVeriFastVeriFastVeriFastVeriFast
☆ http://people.cs.kuleuven.be/~bart.jacobs/
verifast/
☆ http://people.cs.kuleuven.be/~bart.jacobs/
verifast/
☆ http://people.cs.kuleuven.be/~bart.jacobs/
verifast/
☆ http://people.cs.kuleuven.be/~bart.jacobs/
verifast/
☆ http://people.cs.kuleuven.be/~bart.jacobs/
verifast/
☆ Design by contract (DbC) in C language
comment
☆ Design by contract (DbC) in C language
comment
☆ Design by contract (DbC) in C language
comment
☆ Design by contract (DbC) in C language
comment
☆ Design by contract (DbC) in C language
comment
☆ preconditions, postconditions, invariants☆ preconditions, postconditions, invariants☆ preconditions, postconditions, invariants☆ preconditions, postconditions, invariants☆ preconditions, postconditions, invariants
☆ Can prove code with lemma function?☆ Can prove code with lemma function?☆ Can prove code with lemma function?☆ Can prove code with lemma function?☆ Can prove code with lemma function?
22. VeriFast on ArduinoVeriFast on ArduinoVeriFast on ArduinoVeriFast on ArduinoVeriFast on Arduino
☆ https://github.com/fpiot/arduino-verifast☆ https://github.com/fpiot/arduino-verifast☆ https://github.com/fpiot/arduino-verifast☆ https://github.com/fpiot/arduino-verifast☆ https://github.com/fpiot/arduino-verifast
23. CoqCoqCoqCoqCoq
☆ https://coq.inria.fr/☆ https://coq.inria.fr/☆ https://coq.inria.fr/☆ https://coq.inria.fr/☆ https://coq.inria.fr/
☆ Theorem prover☆ Theorem prover☆ Theorem prover☆ Theorem prover☆ Theorem prover
☆ Semi-automatic proving with tactics☆ Semi-automatic proving with tactics☆ Semi-automatic proving with tactics☆ Semi-automatic proving with tactics☆ Semi-automatic proving with tactics
☆ Extract code into implementation with GC☆ Extract code into implementation with GC☆ Extract code into implementation with GC☆ Extract code into implementation with GC☆ Extract code into implementation with GC
☆ Good document: http://proofcafe.org/sf-beta/☆ Good document: http://proofcafe.org/sf-beta/☆ Good document: http://proofcafe.org/sf-beta/☆ Good document: http://proofcafe.org/sf-beta/☆ Good document: http://proofcafe.org/sf-beta/
25. AlloyAlloyAlloyAlloyAlloy
☆ http://alloy.mit.edu/☆ http://alloy.mit.edu/☆ http://alloy.mit.edu/☆ http://alloy.mit.edu/☆ http://alloy.mit.edu/
☆ A tool to analyze specifications☆ A tool to analyze specifications☆ A tool to analyze specifications☆ A tool to analyze specifications☆ A tool to analyze specifications
☆ Write specification as first-order predicate logic☆ Write specification as first-order predicate logic☆ Write specification as first-order predicate logic☆ Write specification as first-order predicate logic☆ Write specification as first-order predicate logic
☆ Find example instance on specification☆ Find example instance on specification☆ Find example instance on specification☆ Find example instance on specification☆ Find example instance on specification
☆ Find counter-example on specification☆ Find counter-example on specification☆ Find counter-example on specification☆ Find counter-example on specification☆ Find counter-example on specification
☆ Support abductive reasoning☆ Support abductive reasoning☆ Support abductive reasoning☆ Support abductive reasoning☆ Support abductive reasoning
26. ACSL (Frama-C)ACSL (Frama-C)ACSL (Frama-C)ACSL (Frama-C)ACSL (Frama-C)
☆ http://frama-c.com/acsl.html☆ http://frama-c.com/acsl.html☆ http://frama-c.com/acsl.html☆ http://frama-c.com/acsl.html☆ http://frama-c.com/acsl.html
☆ Specification language for C programs☆ Specification language for C programs☆ Specification language for C programs☆ Specification language for C programs☆ Specification language for C programs
☆ Design by contract (DbC) in C language
comment
☆ Design by contract (DbC) in C language
comment
☆ Design by contract (DbC) in C language
comment
☆ Design by contract (DbC) in C language
comment
☆ Design by contract (DbC) in C language
comment
27. CBMCCBMCCBMCCBMCCBMC
☆ http://www.cprover.org/cbmc/☆ http://www.cprover.org/cbmc/☆ http://www.cprover.org/cbmc/☆ http://www.cprover.org/cbmc/☆ http://www.cprover.org/cbmc/
☆ Bounded Model Checker for C and C++☆ Bounded Model Checker for C and C++☆ Bounded Model Checker for C and C++☆ Bounded Model Checker for C and C++☆ Bounded Model Checker for C and C++
☆ Verify array bounds (buffer overflows), pointer
safety, exceptions and user-specified assertions
☆ Verify array bounds (buffer overflows), pointer
safety, exceptions and user-specified assertions
☆ Verify array bounds (buffer overflows), pointer
safety, exceptions and user-specified assertions
☆ Verify array bounds (buffer overflows), pointer
safety, exceptions and user-specified assertions
☆ Verify array bounds (buffer overflows), pointer
safety, exceptions and user-specified assertions
33. How to compile and run seL4? #1How to compile and run seL4? #1How to compile and run seL4? #1How to compile and run seL4? #1How to compile and run seL4? #1
#�Detail:�http://sel4.systems/Info/GettingStarted/
$�sudo�apt-get�install�git�python�build-essential�realpath�libxml2-utils�
python-tempita�gcc-multilib�ccache�ncurses-dev�cabal-install�ghc�libghc-
missingh-dev�libghc-split-dev�python-pip�python-jinja2�python-ply�python-
pyelftools�libghc-data-ordlist-dev�gcc-arm-none-eabi�qemu
$�mkdir�seL4_repo
$�cd�seL4_repo
$�repo�init�-u�https://github.com/seL4/sel4test-manifest.git
$�repo�sync
$�ls�-F
Kbuild@��Kconfig@��Makefile@��apps@��configs@��kernel/��libs/��projects/��
tools/
$�make�ia32_simulation_release_xml_defconfig
$�make
#�Detail:�http://sel4.systems/Info/GettingStarted/
$�sudo�apt-get�install�git�python�build-essential�realpath�libxml2-utils�
python-tempita�gcc-multilib�ccache�ncurses-dev�cabal-install�ghc�libghc-
missingh-dev�libghc-split-dev�python-pip�python-jinja2�python-ply�python-
pyelftools�libghc-data-ordlist-dev�gcc-arm-none-eabi�qemu
$�mkdir�seL4_repo
$�cd�seL4_repo
$�repo�init�-u�https://github.com/seL4/sel4test-manifest.git
$�repo�sync
$�ls�-F
Kbuild@��Kconfig@��Makefile@��apps@��configs@��kernel/��libs/��projects/��
tools/
$�make�ia32_simulation_release_xml_defconfig
$�make
#�Detail:�http://sel4.systems/Info/GettingStarted/
$�sudo�apt-get�install�git�python�build-essential�realpath�libxml2-utils�
python-tempita�gcc-multilib�ccache�ncurses-dev�cabal-install�ghc�libghc-
missingh-dev�libghc-split-dev�python-pip�python-jinja2�python-ply�python-
pyelftools�libghc-data-ordlist-dev�gcc-arm-none-eabi�qemu
$�mkdir�seL4_repo
$�cd�seL4_repo
$�repo�init�-u�https://github.com/seL4/sel4test-manifest.git
$�repo�sync
$�ls�-F
Kbuild@��Kconfig@��Makefile@��apps@��configs@��kernel/��libs/��projects/��
tools/
$�make�ia32_simulation_release_xml_defconfig
$�make
#�Detail:�http://sel4.systems/Info/GettingStarted/
$�sudo�apt-get�install�git�python�build-essential�realpath�libxml2-utils�
python-tempita�gcc-multilib�ccache�ncurses-dev�cabal-install�ghc�libghc-
missingh-dev�libghc-split-dev�python-pip�python-jinja2�python-ply�python-
pyelftools�libghc-data-ordlist-dev�gcc-arm-none-eabi�qemu
$�mkdir�seL4_repo
$�cd�seL4_repo
$�repo�init�-u�https://github.com/seL4/sel4test-manifest.git
$�repo�sync
$�ls�-F
Kbuild@��Kconfig@��Makefile@��apps@��configs@��kernel/��libs/��projects/��
tools/
$�make�ia32_simulation_release_xml_defconfig
$�make
#�Detail:�http://sel4.systems/Info/GettingStarted/
$�sudo�apt-get�install�git�python�build-essential�realpath�libxml2-utils�
python-tempita�gcc-multilib�ccache�ncurses-dev�cabal-install�ghc�libghc-
missingh-dev�libghc-split-dev�python-pip�python-jinja2�python-ply�python-
pyelftools�libghc-data-ordlist-dev�gcc-arm-none-eabi�qemu
$�mkdir�seL4_repo
$�cd�seL4_repo
$�repo�init�-u�https://github.com/seL4/sel4test-manifest.git
$�repo�sync
$�ls�-F
Kbuild@��Kconfig@��Makefile@��apps@��configs@��kernel/��libs/��projects/��
tools/
$�make�ia32_simulation_release_xml_defconfig
$�make
34. How to compile and run seL4? #2How to compile and run seL4? #2How to compile and run seL4? #2How to compile and run seL4? #2How to compile and run seL4? #2
$�ls�images
kernel-ia32-pc99*��sel4test-driver-image-ia32-pc99*
$�make�simulate-ia32
qemu-system-i386�-m�512�-nographic�-kernel�images/kernel-ia32-pc99�-initrd�
images/sel4test-driver-image-ia32-pc99
--snip--
136/136�tests�passed.
Ignoring�call�to�sys_exit_group
Ignoring�call�to�sys_rt_sigprocmask
Ignoring�call�to�sys_gettid
Ignoring�call�to�sys_getpid
sys_tgkill�assuming�self�kill
$�ls�images
kernel-ia32-pc99*��sel4test-driver-image-ia32-pc99*
$�make�simulate-ia32
qemu-system-i386�-m�512�-nographic�-kernel�images/kernel-ia32-pc99�-initrd�
images/sel4test-driver-image-ia32-pc99
--snip--
136/136�tests�passed.
Ignoring�call�to�sys_exit_group
Ignoring�call�to�sys_rt_sigprocmask
Ignoring�call�to�sys_gettid
Ignoring�call�to�sys_getpid
sys_tgkill�assuming�self�kill
$�ls�images
kernel-ia32-pc99*��sel4test-driver-image-ia32-pc99*
$�make�simulate-ia32
qemu-system-i386�-m�512�-nographic�-kernel�images/kernel-ia32-pc99�-initrd�
images/sel4test-driver-image-ia32-pc99
--snip--
136/136�tests�passed.
Ignoring�call�to�sys_exit_group
Ignoring�call�to�sys_rt_sigprocmask
Ignoring�call�to�sys_gettid
Ignoring�call�to�sys_getpid
sys_tgkill�assuming�self�kill
$�ls�images
kernel-ia32-pc99*��sel4test-driver-image-ia32-pc99*
$�make�simulate-ia32
qemu-system-i386�-m�512�-nographic�-kernel�images/kernel-ia32-pc99�-initrd�
images/sel4test-driver-image-ia32-pc99
--snip--
136/136�tests�passed.
Ignoring�call�to�sys_exit_group
Ignoring�call�to�sys_rt_sigprocmask
Ignoring�call�to�sys_gettid
Ignoring�call�to�sys_getpid
sys_tgkill�assuming�self�kill
$�ls�images
kernel-ia32-pc99*��sel4test-driver-image-ia32-pc99*
$�make�simulate-ia32
qemu-system-i386�-m�512�-nographic�-kernel�images/kernel-ia32-pc99�-initrd�
images/sel4test-driver-image-ia32-pc99
--snip--
136/136�tests�passed.
Ignoring�call�to�sys_exit_group
Ignoring�call�to�sys_rt_sigprocmask
Ignoring�call�to�sys_gettid
Ignoring�call�to�sys_getpid
sys_tgkill�assuming�self�kill
35. eChronos RTOSeChronos RTOSeChronos RTOSeChronos RTOSeChronos RTOS
☆ http://ssrg.nicta.com.au/projects/TS/echronos/☆ http://ssrg.nicta.com.au/projects/TS/echronos/☆ http://ssrg.nicta.com.au/projects/TS/echronos/☆ http://ssrg.nicta.com.au/projects/TS/echronos/☆ http://ssrg.nicta.com.au/projects/TS/echronos/
☆ Embedded version of seL4☆ Embedded version of seL4☆ Embedded version of seL4☆ Embedded version of seL4☆ Embedded version of seL4
☆ Run without MMU☆ Run without MMU☆ Run without MMU☆ Run without MMU☆ Run without MMU
☆ not yet publish verification☆ not yet publish verification☆ not yet publish verification☆ not yet publish verification☆ not yet publish verification
36. RedoxRedoxRedoxRedoxRedox
☆ http://www.redox-os.org/☆ http://www.redox-os.org/☆ http://www.redox-os.org/☆ http://www.redox-os.org/☆ http://www.redox-os.org/
☆ Desktop OS developed by Rust☆ Desktop OS developed by Rust☆ Desktop OS developed by Rust☆ Desktop OS developed by Rust☆ Desktop OS developed by Rust
☆ CPU: x86☆ CPU: x86☆ CPU: x86☆ CPU: x86☆ CPU: x86
☆ Support file system☆ Support file system☆ Support file system☆ Support file system☆ Support file system
☆ Support Ethernet (RTL8139)☆ Support Ethernet (RTL8139)☆ Support Ethernet (RTL8139)☆ Support Ethernet (RTL8139)☆ Support Ethernet (RTL8139)
☆ Support GUI and window system☆ Support GUI and window system☆ Support GUI and window system☆ Support GUI and window system☆ Support GUI and window system
37. Mirage OSMirage OSMirage OSMirage OSMirage OS
☆ http://www.xenproject.org/developers/teams/
mirage-os.html
☆ http://www.xenproject.org/developers/teams/
mirage-os.html
☆ http://www.xenproject.org/developers/teams/
mirage-os.html
☆ http://www.xenproject.org/developers/teams/
mirage-os.html
☆ http://www.xenproject.org/developers/teams/
mirage-os.html
☆ Cloud Operating System developed by OCaml☆ Cloud Operating System developed by OCaml☆ Cloud Operating System developed by OCaml☆ Cloud Operating System developed by OCaml☆ Cloud Operating System developed by OCaml
☆ Platform: Xen☆ Platform: Xen☆ Platform: Xen☆ Platform: Xen☆ Platform: Xen
38. AOSAOSAOSAOSAOS
☆ https://github.com/xlq/aos☆ https://github.com/xlq/aos☆ https://github.com/xlq/aos☆ https://github.com/xlq/aos☆ https://github.com/xlq/aos
☆ Tiny OS developed by ATS☆ Tiny OS developed by ATS☆ Tiny OS developed by ATS☆ Tiny OS developed by ATS☆ Tiny OS developed by ATS
☆ CPU: x86☆ CPU: x86☆ CPU: x86☆ CPU: x86☆ CPU: x86
☆ Using own stream library☆ Using own stream library☆ Using own stream library☆ Using own stream library☆ Using own stream library
39. What are you interested in?What are you interested in?What are you interested in?What are you interested in?What are you interested in?
I'm personally interested in following:I'm personally interested in following:I'm personally interested in following:I'm personally interested in following:I'm personally interested in following:
☆ ATS☆ ATS☆ ATS☆ ATS☆ ATS
☆ Rust☆ Rust☆ Rust☆ Rust☆ Rust
☆ Ada☆ Ada☆ Ada☆ Ada☆ Ada
☆ VeriFast☆ VeriFast☆ VeriFast☆ VeriFast☆ VeriFast
☆ ACSL☆ ACSL☆ ACSL☆ ACSL☆ ACSL
☆ seL4☆ seL4☆ seL4☆ seL4☆ seL4